From c37347a4630fda601b4c40585ca25fff42f756c6 Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Tue, 12 Mar 2019 17:44:14 +0100 Subject: emit valid code for mem->mem copies --- amd64/emit.c | 14 ++++++++--- test/_phispill.ssa | 68 ------------------------------------------------------ test/spill1.ssa | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 71 deletions(-) delete mode 100644 test/_phispill.ssa create mode 100644 test/spill1.ssa diff --git a/amd64/emit.c b/amd64/emit.c index 653c548..ac7a1f3 100644 --- a/amd64/emit.c +++ b/amd64/emit.c @@ -360,7 +360,7 @@ emitins(Ins i, Fn *fn, FILE *f) { Ref r; int64_t val; - int o; + int o, t0; switch (i.op) { default: @@ -434,19 +434,27 @@ emitins(Ins i, Fn *fn, FILE *f) * also, we can use a trick to load 64-bits * registers, it's detailed in my note below * http://c9x.me/art/notes.html?09/19/2015 */ + t0 = rtype(i.arg[0]); if (req(i.to, R) || req(i.arg[0], R)) break; if (isreg(i.to) - && rtype(i.arg[0]) == RCon + && t0 == RCon && i.cls == Kl && fn->con[i.arg[0].val].type == CBits && (val = fn->con[i.arg[0].val].bits.i) >= 0 && val <= UINT32_MAX) { emitf("movl %W0, %W=", &i, fn, f); } else if (isreg(i.to) - && rtype(i.arg[0]) == RCon + && t0 == RCon && fn->con[i.arg[0].val].type == CAddr) { emitf("lea%k %M0, %=", &i, fn, f); + } else if (rtype(i.to) == RSlot + && (t0 == RSlot || t0 == RMem)) { + i.cls = KWIDE(i.cls) ? Kd : Ks; + i.arg[1] = TMP(XMM0+15); + emitf("mov%k %0, %1", &i, fn, f); + emitf("mov%k %1, %=", &i, fn, f); + } else if (!req(i.arg[0], i.to)) emitf("mov%k %0, %=", &i, fn, f); break; diff --git a/test/_phispill.ssa b/test/_phispill.ssa deleted file mode 100644 index 21e98c2..0000000 --- a/test/_phispill.ssa +++ /dev/null @@ -1,68 +0,0 @@ -export -function w $f(w %n0) { -@start -@loop - %n1 =w phi @start %n0, @loop %n2 - - %p0 =w phi @start 0, @loop %p01 - %p1 =w phi @start 0, @loop %p11 - %p2 =w phi @start 0, @loop %p21 - %p3 =w phi @start 0, @loop %p31 - %p4 =w phi @start 0, @loop %p41 - %p5 =w phi @start 0, @loop %p51 - %p6 =w phi @start 0, @loop %p61 - %p7 =w phi @start 0, @loop %p71 - %p8 =w phi @start 0, @loop %p81 - %p9 =w phi @start 0, @loop %p91 - %pa =w phi @start 0, @loop %pa1 - %pb =w phi @start 0, @loop %pb1 - %pc =w phi @start 0, @loop %pc1 - %pd =w phi @start 0, @loop %pd1 - %pe =w phi @start 0, @loop %pe1 - %pf =w phi @start 0, @loop %pf1 - - %p01 =w add 1, %p0 - %p11 =w add 2, %p1 - %p21 =w add 3, %p2 - %p31 =w add 4, %p3 - %p41 =w add 5, %p4 - %p51 =w add 6, %p5 - %p61 =w add 7, %p6 - %p71 =w add 8, %p7 - %p81 =w add 9, %p8 - %p91 =w add 10, %p9 - %pa1 =w add 11, %pa - %pb1 =w add 12, %pb - %pc1 =w add 13, %pc - %pd1 =w add 14, %pd - %pe1 =w add 15, %pe - %pf1 =w add 16, %pf - - %n2 =w sub %n1, 1 - jnz %n2, @loop, @end - -@end - %a =w sub 0, 0 - %a =w add %p01, %a - %a =w add %p11, %a - %a =w add %p21, %a - %a =w add %p31, %a - %a =w add %p41, %a - %a =w add %p51, %a - %a =w add %p61, %a - %a =w add %p71, %a - %a =w add %p81, %a - %a =w add %p91, %a - %a =w add %pa1, %a - %a =w add %pb1, %a - %a =w add %pc1, %a - %a =w add %pd1, %a - %a =w add %pe1, %a - %a =w add %pf1, %a - ret %a -} - -# >>> driver -# extern int f(int); -# int main() { return !(f(1) == 136); } -# <<< diff --git a/test/spill1.ssa b/test/spill1.ssa new file mode 100644 index 0000000..21e98c2 --- /dev/null +++ b/test/spill1.ssa @@ -0,0 +1,68 @@ +export +function w $f(w %n0) { +@start +@loop + %n1 =w phi @start %n0, @loop %n2 + + %p0 =w phi @start 0, @loop %p01 + %p1 =w phi @start 0, @loop %p11 + %p2 =w phi @start 0, @loop %p21 + %p3 =w phi @start 0, @loop %p31 + %p4 =w phi @start 0, @loop %p41 + %p5 =w phi @start 0, @loop %p51 + %p6 =w phi @start 0, @loop %p61 + %p7 =w phi @start 0, @loop %p71 + %p8 =w phi @start 0, @loop %p81 + %p9 =w phi @start 0, @loop %p91 + %pa =w phi @start 0, @loop %pa1 + %pb =w phi @start 0, @loop %pb1 + %pc =w phi @start 0, @loop %pc1 + %pd =w phi @start 0, @loop %pd1 + %pe =w phi @start 0, @loop %pe1 + %pf =w phi @start 0, @loop %pf1 + + %p01 =w add 1, %p0 + %p11 =w add 2, %p1 + %p21 =w add 3, %p2 + %p31 =w add 4, %p3 + %p41 =w add 5, %p4 + %p51 =w add 6, %p5 + %p61 =w add 7, %p6 + %p71 =w add 8, %p7 + %p81 =w add 9, %p8 + %p91 =w add 10, %p9 + %pa1 =w add 11, %pa + %pb1 =w add 12, %pb + %pc1 =w add 13, %pc + %pd1 =w add 14, %pd + %pe1 =w add 15, %pe + %pf1 =w add 16, %pf + + %n2 =w sub %n1, 1 + jnz %n2, @loop, @end + +@end + %a =w sub 0, 0 + %a =w add %p01, %a + %a =w add %p11, %a + %a =w add %p21, %a + %a =w add %p31, %a + %a =w add %p41, %a + %a =w add %p51, %a + %a =w add %p61, %a + %a =w add %p71, %a + %a =w add %p81, %a + %a =w add %p91, %a + %a =w add %pa1, %a + %a =w add %pb1, %a + %a =w add %pc1, %a + %a =w add %pd1, %a + %a =w add %pe1, %a + %a =w add %pf1, %a + ret %a +} + +# >>> driver +# extern int f(int); +# int main() { return !(f(1) == 136); } +# <<< -- cgit 1.4.1