|
|
1.1 ! root 1: #include "apl.h" ! 2: ! 3: ex_red0() ! 4: { ! 5: ! 6: fetch1(); ! 7: red0(0); ! 8: } ! 9: ! 10: ex_red() ! 11: { ! 12: register struct item *p; ! 13: ! 14: p = fetch1(); ! 15: red0(p->rank-1); ! 16: } ! 17: ! 18: ex_redk() ! 19: { ! 20: register i; ! 21: ! 22: i = topfix() - thread.iorg; ! 23: fetch1(); ! 24: red0(i); ! 25: } ! 26: ! 27: red0(k) ! 28: { ! 29: register struct item *p, *q; ! 30: int param[3], red1(); ! 31: ! 32: p = fetch1(); ! 33: if(p->type != DA) ! 34: error("red T"); ! 35: bidx(p); ! 36: colapse(k); ! 37: if(idx.dimk == 0) { ! 38: /* ! 39: * reduction identities - ets/jrl 5/76 ! 40: */ ! 41: q = newdat(DA,0,1); ! 42: q->dim[0] = 1; ! 43: switch(*pcp++) { ! 44: case ADD: ! 45: case SUB: ! 46: case OR: ! 47: q->datap[0] = 0; ! 48: break; ! 49: case AND: ! 50: case MUL: ! 51: case DIV: ! 52: q->datap[0] = 1; ! 53: break; ! 54: case MIN: ! 55: q->datap[0] = 1.0e38; ! 56: break; ! 57: case MAX: ! 58: q->datap[0] = -1.0e38; ! 59: break; ! 60: default: ! 61: error("reduce identity"); ! 62: } ! 63: pop(); ! 64: push(q); ! 65: return; ! 66: } ! 67: q = newdat(idx.type, idx.rank, idx.size); ! 68: copy(IN, idx.dim, q->dim, idx.rank); ! 69: param[0] = p->datap; ! 70: param[1] = q; ! 71: param[2] = exop[*pcp++]; ! 72: forloop(red1, param); ! 73: pop(); ! 74: push(q); ! 75: } ! 76: ! 77: red1(param) ! 78: int param[]; ! 79: { ! 80: register i; ! 81: register data *dp; ! 82: data d, (*f)(); ! 83: ! 84: dp = param[0]; ! 85: dp =+ access() + (idx.dimk-1) * idx.delk; ! 86: f = param[2]; ! 87: d = *dp; ! 88: for(i=1; i<idx.dimk; i++) { ! 89: dp =- idx.delk; ! 90: d = (*f)(*dp, d); ! 91: } ! 92: putdat(param[1], d); ! 93: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.