diff --git a/src/cmd/5g/peep.c b/src/cmd/5g/peep.c index b7c6918cf2..0c95abe302 100644 --- a/src/cmd/5g/peep.c +++ b/src/cmd/5g/peep.c @@ -1242,35 +1242,79 @@ copyau(Adr *a, Adr *v) return 0; } +static int +a2type(Prog *p) +{ + if(p->reg == NREG) + return D_NONE; + + switch(p->as) { + default: + fatal("a2type: unhandled %P", p); + + case AAND: + case AEOR: + case ASUB: + case ARSB: + case AADD: + case AADC: + case ASBC: + case ARSC: + case ATST: + case ATEQ: + case ACMP: + case ACMN: + case AORR: + case ABIC: + case AMVN: + case ASRL: + case ASRA: + case ASLL: + case AMULU: + case ADIVU: + case AMUL: + case ADIV: + case AMOD: + case AMODU: + case AMULA: + case AMULL: + case AMULAL: + case AMULLU: + case AMULALU: + case AMULWT: + case AMULWB: + case AMULAWT: + case AMULAWB: + return D_REG; + + case ACMPF: + case ACMPD: + case AADDF: + case AADDD: + case ASUBF: + case ASUBD: + case AMULF: + case AMULD: + case ADIVF: + case ADIVD: + case ASQRTF: + case ASQRTD: + case AABSF: + case AABSD: + return D_FREG; + } +} + /* * compare v to the center * register in p (p->reg) - * the trick is that this - * register might be D_REG - * D_FREG. there are basically - * two cases, - * ADD r,r,r - * CMP r,r, */ static int copyau1(Prog *p, Adr *v) { - - if(regtyp(v)) - if(p->reg == v->reg) { - if(p->to.type != D_NONE) { - if(v->type == p->to.type) - return 1; - return 0; - } - if(p->from.type != D_NONE) { - if(v->type == p->from.type) - return 1; - return 0; - } - print("copyau1: can't tell %P\n", p); - } - return 0; + if(v->type == D_REG && v->reg == NREG) + return 0; + return p->reg == v->reg && a2type(p) == v->type; } /* diff --git a/src/cmd/5g/reg.c b/src/cmd/5g/reg.c index b73722e6a1..0f5edb9efa 100644 --- a/src/cmd/5g/reg.c +++ b/src/cmd/5g/reg.c @@ -1291,9 +1291,9 @@ dumpit(char *str, Flow *r0, int isreg) if(r1 != nil) { print(" pred:"); for(; r1 != nil; r1 = r1->p2link) - print(" %.4ud", r1->prog->pc); + print(" %.4ud", (int)r1->prog->pc); if(r->p1 != nil) - print(" (and %.4ud)", r->p1->prog->pc); + print(" (and %.4ud)", (int)r->p1->prog->pc); else print(" (only)"); print("\n"); @@ -1302,7 +1302,7 @@ dumpit(char *str, Flow *r0, int isreg) // if(r1 != nil) { // print(" succ:"); // for(; r1 != R; r1 = r1->s1) -// print(" %.4ud", r1->prog->pc); +// print(" %.4ud", (int)r1->prog->pc); // print("\n"); // } } diff --git a/src/cmd/6g/reg.c b/src/cmd/6g/reg.c index 4b2656cdf0..2d8fe81b8c 100644 --- a/src/cmd/6g/reg.c +++ b/src/cmd/6g/reg.c @@ -1174,14 +1174,14 @@ dumpit(char *str, Flow *r0, int isreg) if(r1 != nil) { print(" pred:"); for(; r1 != nil; r1 = r1->p2link) - print(" %.4ud", r1->prog->pc); + print(" %.4ud", (int)r1->prog->pc); print("\n"); } // r1 = r->s1; // if(r1 != R) { // print(" succ:"); // for(; r1 != R; r1 = r1->s1) -// print(" %.4ud", r1->prog->pc); +// print(" %.4ud", (int)r1->prog->pc); // print("\n"); // } } diff --git a/src/cmd/8g/reg.c b/src/cmd/8g/reg.c index 271fbd8019..38c255e2e8 100644 --- a/src/cmd/8g/reg.c +++ b/src/cmd/8g/reg.c @@ -1139,14 +1139,14 @@ dumpit(char *str, Flow *r0, int isreg) if(r1 != nil) { print(" pred:"); for(; r1 != nil; r1 = r->p2link) - print(" %.4ud", r1->prog->pc); + print(" %.4ud", (int)r1->prog->pc); print("\n"); } // r1 = r->s1; // if(r1 != nil) { // print(" succ:"); // for(; r1 != R; r1 = r1->s1) -// print(" %.4ud", r1->prog->pc); +// print(" %.4ud", (int)r1->prog->pc); // print("\n"); // } }