From: Dave Cheney Date: Sun, 7 Oct 2012 00:37:14 +0000 (+1100) Subject: cmd/5g: avoid temporary in slice bounds check X-Git-Tag: go1.1rc2~2231 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=01ddc8bd9ae903aea203dfe927bb072fe6bce24a;p=gostls13.git cmd/5g: avoid temporary in slice bounds check 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 10c30: eb0035e6 bl 1e3d0 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 10c2c: eb0035e6 bl 1e3cc 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 --- diff --git a/src/cmd/5g/cgen.c b/src/cmd/5g/cgen.c index 5065e0cd9b..7a2f5e5ab9 100644 --- a/src/cmd/5g/cgen.c +++ b/src/cmd/5g/cgen.c @@ -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); diff --git a/src/cmd/5g/gsubr.c b/src/cmd/5g/gsubr.c index 8ad610a76f..f9a6feb9f5 100644 --- a/src/cmd/5g/gsubr.c +++ b/src/cmd/5g/gsubr.c @@ -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);