diff --git a/lisc/tools/pmov.c b/lisc/tools/pmov.c new file mode 100644 index 0000000..246f4f0 --- /dev/null +++ b/lisc/tools/pmov.c @@ -0,0 +1,145 @@ +/*% cc -std=c99 -Wall -DTEST_PMOV -g -o # % + */ +#include +#include +#include + +#include "../rega.c" + +int +main() +{ + Blk dummyb; + Ins ins[NReg], *ip, *i1; + unsigned long long tm, rm; + RMap mbeg, mend; + int reg[NReg]; + int t, i, r, nr; + + tmp = (Tmp[Tmp0+NReg]){{0}}; + for (t=0; t> (2*t)) & 3) { + case 0: + /* not in copy, not in use */ + break; + case 1: + /* not in copy, in use */ + radd(&mbeg, Tmp0+t, t+1); + break; + case 2: + /* in copy, not in reg */ + *ip++ = (Ins){OCopy, TMP(Tmp0+t), {R, R}}; + break; + case 3: + /* in copy, in reg */ + *ip++ = (Ins){OCopy, TMP(Tmp0+t), {R, R}}; + radd(&mbeg, Tmp0+t, t+1); + break; + } + + if (ip == ins) + /* cancel is the parallel move + * is empty + */ + goto Nxt; + + /* find registers for temporaries + * in mbeg + */ + nr = ip - ins; + dummyb.nins = nr; + rm = (1ull << (nr+1)) - 1; + for (i=0; iarg[0] = TMP(reg[i]); +#if 0 + for (i=0; i