From: Dave Cheney Date: Fri, 26 Oct 2012 07:19:10 +0000 (+1100) Subject: cmd/5g: peep.c: reactivate some optimisations X-Git-Tag: go1.1rc2~2056 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=542dd8b9fba40e03ccdf1fac0a805b5b23ea3b8c;p=gostls13.git cmd/5g: peep.c: reactivate some optimisations Thanks to Minux and Remy for their advice. The EOR optimisation is applied to a few places in the stdlib. // hash/crc32/crc32.go func update(crc uint32, tab *Table, p []byte) uint32 { crc = ^crc for _, v := range p { crc = tab[byte(crc)^v] ^ (crc >> 8) } return ^crc } before: --- prog list "update" --- 0164 (/home/dfc/go/src/pkg/hash/crc32/crc32.go:101) TEXT update+0(SB),$12-24 0165 (/home/dfc/go/src/pkg/hash/crc32/crc32.go:101) MOVW tab+4(FP),R8 0166 (/home/dfc/go/src/pkg/hash/crc32/crc32.go:102) MOVW crc+0(FP),R0 0167 (/home/dfc/go/src/pkg/hash/crc32/crc32.go:102) EOR $-1,R0,R5 0168 (/home/dfc/go/src/pkg/hash/crc32/crc32.go:103) MOVW p+8(FP),R0 0169 (/home/dfc/go/src/pkg/hash/crc32/crc32.go:103) MOVW R0,autotmp_0019+-12(SP) after: --- prog list "update" --- 0164 (/home/dfc/go/src/pkg/hash/crc32/crc32.go:101) TEXT update+0(SB),$12-24 0165 (/home/dfc/go/src/pkg/hash/crc32/crc32.go:101) MOVW tab+4(FP),R8 0166 (/home/dfc/go/src/pkg/hash/crc32/crc32.go:102) MOVW crc+0(FP),R0 0167 (/home/dfc/go/src/pkg/hash/crc32/crc32.go:102) MVN R0,R5 0168 (/home/dfc/go/src/pkg/hash/crc32/crc32.go:103) MOVW p+8(FP),R0 0169 (/home/dfc/go/src/pkg/hash/crc32/crc32.go:103) MOVW R0,autotmp_0019+-12(SP) After 5l has done its work, crc = ^crc 3d710: e59d0014 ldr r0, [sp, #20] 3d714: e3e0b000 mvn fp, #0 3d718: e020500b eor r5, r0, fp becomes crc = ^crc 3d710: e59d0014 ldr r0, [sp, #20] 3d714: e1e05000 mvn r5, r0 The MOVB optimisation has a small impact on the stdlib, in strconv and gzip. // GZIP (RFC 1952) is little-endian, unlike ZLIB (RFC 1950). func put2(p []byte, v uint16) { p[0] = uint8(v >> 0) p[1] = uint8(v >> 8) } before: --- prog list "put2" --- 1369 (/home/dfc/go/src/pkg/compress/gzip/gzip.go:76) TEXT put2+0(SB),$0-16 1370 (/home/dfc/go/src/pkg/compress/gzip/gzip.go:76) MOVHU v+12(FP),R4 1371 (/home/dfc/go/src/pkg/compress/gzip/gzip.go:77) MOVHU R4,R0 1372 (/home/dfc/go/src/pkg/compress/gzip/gzip.go:77) MOVHU R0,R0 1373 (/home/dfc/go/src/pkg/compress/gzip/gzip.go:77) MOVBU R0,R1 1374 (/home/dfc/go/src/pkg/compress/gzip/gzip.go:77) MOVBU R1,R3 1375 (/home/dfc/go/src/pkg/compress/gzip/gzip.go:77) MOVW $p+0(FP),R1 after: --- prog list "put2" --- 1369 (/home/dfc/go/src/pkg/compress/gzip/gzip.go:76) TEXT put2+0(SB),$0-16 1370 (/home/dfc/go/src/pkg/compress/gzip/gzip.go:76) MOVHU v+12(FP),R4 1371 (/home/dfc/go/src/pkg/compress/gzip/gzip.go:77) MOVHU R4,R0 1372 (/home/dfc/go/src/pkg/compress/gzip/gzip.go:77) MOVBU R0,R1 1373 (/home/dfc/go/src/pkg/compress/gzip/gzip.go:77) MOVBU R1,R3 1374 (/home/dfc/go/src/pkg/compress/gzip/gzip.go:77) MOVW $p+0(FP),R1 R=remyoudompheng, rsc, minux.ma CC=golang-dev https://golang.org/cl/6674048 --- diff --git a/src/cmd/5g/peep.c b/src/cmd/5g/peep.c index 75c691c150..f9d3dcd348 100644 --- a/src/cmd/5g/peep.c +++ b/src/cmd/5g/peep.c @@ -133,26 +133,24 @@ loop1: if(t) goto loop1; -return; -#ifdef NOTDEF for(r=firstr; r!=R; r=r->link) { p = r->prog; switch(p->as) { -// case AEOR: -// /* -// * EOR -1,x,y => MVN x,y -// */ -// if(isdconst(&p->from) && p->from.offset == -1) { -// p->as = AMVN; -// p->from.type = D_REG; -// if(p->reg != NREG) -// p->from.reg = p->reg; -// else -// p->from.reg = p->to.reg; -// p->reg = NREG; -// } -// break; + case AEOR: + /* + * EOR -1,x,y => MVN x,y + */ + if(isdconst(&p->from) && p->from.offset == -1) { + p->as = AMVN; + p->from.type = D_REG; + if(p->reg != NREG) + p->from.reg = p->reg; + else + p->from.reg = p->to.reg; + p->reg = NREG; + } + break; case AMOVH: case AMOVHU: @@ -161,6 +159,7 @@ return; /* * look for MOVB x,R; MOVB R,R */ + r1 = r->link; if(p->to.type != D_REG) break; if(r1 == R) @@ -175,8 +174,8 @@ return; excise(r1); break; } - r1 = r->link; } +#ifdef NOTDEF // for(r=firstr; r!=R; r=r->link) { // p = r->prog;