]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/5g: avoid temporary in slice bounds check
authorDave Cheney <dave@cheney.net>
Sun, 7 Oct 2012 00:37:14 +0000 (11:37 +1100)
committerDave Cheney <dave@cheney.net>
Sun, 7 Oct 2012 00:37:14 +0000 (11:37 +1100)
before

func addr(s[]int) *int {
        return &s[2]
   10c1c:       e28d0008        add     r0, sp, #8
   10c20:       e5901004        ldr     r1, [r0, #4]
   10c24:       e3a02002        mov     r2, #2
   10c28:       e1510002        cmp     r1, r2
   10c2c:       8a000000        bhi     10c34 <main.addr+0x34>
   10c30:       eb0035e6        bl      1e3d0 <runtime.panicindex>
   10c34:       e5900000        ldr     r0, [r0]
   10c38:       e2800008        add     r0, r0, #8
   10c3c:       e58d0014        str     r0, [sp, #20]
   10c40:       e49df004        pop     {pc}            ; (ldr pc, [sp], #4)

after

func addr(s[]int) *int {
return &s[2]
   10c1c:       e28d0008        add     r0, sp, #8
   10c20:       e5901004        ldr     r1, [r0, #4]
   10c24:       e3510002        cmp     r1, #2
   10c28:       8a000000        bhi     10c30 <main.addr+0x30>
   10c2c:       eb0035e6        bl      1e3cc <runtime.panicindex>
   10c30:       e5900000        ldr     r0, [r0]
   10c34:       e2800008        add     r0, r0, #8
   10c38:       e58d0014        str     r0, [sp, #20]
   10c3c:       e49df004        pop     {pc}            ; (ldr pc, [sp], #4)

Also, relax gcmp restriction that 2nd operand must be a register. A followup
CL will address the remaining TODO items.

R=rsc, remyoudompheng, minux.ma
CC=golang-dev
https://golang.org/cl/6620064

src/cmd/5g/cgen.c
src/cmd/5g/gsubr.c

index 5065e0cd9b966cf5938f55a6c1c947895f6daeca..7a2f5e5ab9e6f8450f64ff5dd13ef3562a908d5d 100644 (file)
@@ -573,7 +573,7 @@ void
 agen(Node *n, Node *res)
 {
        Node *nl, *nr;
-       Node n1, n2, n3, n4, n5, tmp;
+       Node n1, n2, n3, n4, tmp;
        Prog *p1, *p2;
        uint32 w;
        uint64 v;
@@ -715,11 +715,8 @@ agen(Node *n, Node *res)
                                        regalloc(&n4, n1.type, N);
                                        cgen(&n1, &n4);
                                        nodconst(&n2, types[TUINT32], v);
-                                       regalloc(&n5, n2.type, N);
-                                       gmove(&n2, &n5);
-                                       gcmp(optoas(OCMP, types[TUINT32]), &n4, &n5);
+                                       gcmp(optoas(OCMP, types[TUINT32]), &n4, &n2);
                                        regfree(&n4);
-                                       regfree(&n5);
                                        p1 = gbranch(optoas(OGT, types[TUINT32]), T, +1);
                                        ginscall(panicindex, 0);
                                        patch(p1, pc);
index 8ad610a76ffffe1ea03e942f2a0f99a4fe85c61c..f9a6feb9f5e5c0f83f57eff401168b7eb93e02ed 100644 (file)
@@ -1103,7 +1103,7 @@ gcmp(int as, Node *lhs, Node *rhs)
 {
        Prog *p;
 
-       if(lhs->op != OREGISTER || rhs->op != OREGISTER)
+       if(lhs->op != OREGISTER)
                fatal("bad operands to gcmp: %O %O", lhs->op, rhs->op);
 
        p = gins(as, rhs, N);