1. Don't generate CMN instruction for comparing with constant 0x80000000 (found by cinap_lenrek@gmx.de). 2. For AMOVWD from unsigned to double, don't assume single and double float registers are aliased (it happens to work for old emulated 7500 but won't work for VFP). Reference: /n/sources/patch/applied/5c-maxint Date: Mon Jan 7 15:21:06 CET 2013 Signed-off-by: miller@hamnavoe.com --- /sys/src/cmd/5c/txt.c Mon Jan 7 15:18:06 2013 +++ /sys/src/cmd/5c/txt.c Mon Jan 7 15:18:03 2013 @@ -721,8 +721,13 @@ regfree(&nod1); p1 = p; regalloc(&nod, t, Z); - gins(AMOVF, nodfconst(2147483648.), &nod); - gins(AADDF, &nod, t); + if(tt == TFLOAT) { + gins(AMOVF, nodfconst(2147483648.), &nod); + gins(AADDF, &nod, t); + } else { + gins(AMOVD, nodfconst(2147483648.), &nod); + gins(AADDD, &nod, t); + } regfree(&nod); patch(p1, pc); return; @@ -1056,7 +1061,8 @@ nextpc(); p->as = a; naddr(f1, &p->from); - if(a == ACMP && f1->op == OCONST && p->from.offset < 0) { + if(a == ACMP && f1->op == OCONST && p->from.offset < 0) + if(p->from.offset != 0x80000000) { p->as = ACMN; p->from.offset = -p->from.offset; }