/* This file contains the time crucial parts of the code, written out in an 'assembler-like' i.e. unreadable style */ /* This limit is a tuning parameter, telling when router is faster than xnet */ #define xnetRouterLimit 32 #define bitswapXx(dist) { \ if (ixproc & dist) { \ tmp = xnetW[dist].q1r; /* 1..0 -> tmp */ \ xnetW[dist].q1r = q0r; /* 0..1 -> 1..0 */ \ q0r = tmp; /* tmp -> 0..1 */ \ tmp = xnetW[dist].q1i; \ xnetW[dist].q1i = q0i; \ q0i = tmp; \ } \ } #define bitswapXy(dist) { \ if (iyproc & dist) { \ tmp = xnetN[dist].q1r; /* 1..0 -> tmp */ \ xnetN[dist].q1r = q0r; /* 0..1 -> 1..0 */ \ q0r = tmp; /* tmp -> 0..1 */ \ tmp = xnetN[dist].q1i; \ xnetN[dist].q1i = q0i; \ q0i = tmp; \ } \ } #if (float_type == 1) #define bitswDef \ register plural int src; \ plural long long lltmp; \ plural float *ltmp; \ ltmp = (plural float *) &lltmp; #define bitswapRx(dist) { \ if (ixproc & dist) { \ ltmp[0] = q0r; ltmp[1] = q0i; \ } \ else { \ ltmp[0] = q1r; ltmp[1] = q1i; \ } \ src = iproc ^ dist; \ router[src].lltmp = lltmp; \ if (ixproc & dist) { \ q0r = ltmp[0]; q0i = ltmp[1]; \ } \ else { \ q1r = ltmp[0]; q1i = ltmp[1]; \ } \ } #define bitswapRy(dist) { \ if (iyproc & dist) { \ ltmp[0] = q0r; ltmp[1] = q0i; \ } \ else { \ ltmp[0] = q1r; ltmp[1] = q1i; \ } \ src = iproc ^ (dist<>=1;dentw>>=1;} \ /* search twiddle lists for these numbers */ \ twfnd = twlsln; \ for(ip=0;ip