mirror of
https://github.com/golang/go
synced 2024-11-22 14:34:45 -07:00
cmd/5g: avoid temporary during constant binary op
This CL is an attempt to backport the abop code generation from 6g. This improves the generation of the range offset if the increment can be encoded directly via Operand2 shift encoding. 0023 (/home/dfc/src/range.go:7) BGE ,29(APC) 0024 (/home/dfc/src/range.go:7) MOVW 0(R3),R5 0025 (/home/dfc/src/range.go:7) MOVW $4,R1 0026 (/home/dfc/src/range.go:7) ADD R1,R3,R3 0027 (/home/dfc/src/range.go:8) ADD R5,R4,R4 0028 (/home/dfc/src/range.go:7) B ,17(APC) becomes 0023 (/home/dfc/src/range.go:7) BGE ,28(APC) 0024 (/home/dfc/src/range.go:7) MOVW 0(R3),R0 0025 (/home/dfc/src/range.go:7) ADD $4,R3,R3 0026 (/home/dfc/src/range.go:8) ADD R0,R4,R4 0027 (/home/dfc/src/range.go:7) B ,17(APC) Benchmarks are unimpressive dfc@qnap:~/go/test/bench/go1$ ~/go/misc/benchcmp {old,new}.txt benchmark old ns/op new ns/op delta BenchmarkBinaryTree17 2147483647 2147483647 +0.93% BenchmarkFannkuch11 2147483647 2147483647 -2.52% BenchmarkGobDecode 196135200 195842000 -0.15% BenchmarkGobEncode 78581650 76734450 -2.35% BenchmarkGzip 2147483647 2147483647 -0.47% BenchmarkGunzip 1087243000 1070254000 -1.56% BenchmarkJSONEncode 1107558000 1146077000 +3.48% BenchmarkJSONDecode 2147483647 2147483647 -0.07% BenchmarkMandelbrot200 2147483647 2147483647 -0.77% BenchmarkParse 74328550 71653400 -3.60% BenchmarkRevcomp 111123900 109325950 -1.62% BenchmarkTemplate 2147483647 2147483647 -0.82% benchmark old MB/s new MB/s speedup BenchmarkGobDecode 3.91 3.92 1.00x BenchmarkGobEncode 9.77 10.00 1.02x BenchmarkGzip 3.65 3.66 1.00x BenchmarkGunzip 17.85 18.13 1.02x BenchmarkJSONEncode 1.75 1.69 0.97x BenchmarkJSONDecode 0.83 0.83 1.00x BenchmarkParse 0.78 0.81 1.04x BenchmarkRevcomp 22.87 23.25 1.02x BenchmarkTemplate 0.84 0.85 1.01x R=remyoudompheng, minux.ma, rsc CC=golang-dev https://golang.org/cl/6564067
This commit is contained in:
parent
b9e423eff3
commit
7b36acc4ac
@ -439,18 +439,43 @@ abop: // asymmetric binary
|
||||
if(nl->ullman >= nr->ullman) {
|
||||
regalloc(&n1, nl->type, res);
|
||||
cgen(nl, &n1);
|
||||
regalloc(&n2, nr->type, N);
|
||||
cgen(nr, &n2);
|
||||
switch(n->op) {
|
||||
case OADD:
|
||||
case OSUB:
|
||||
case OAND:
|
||||
case OOR:
|
||||
case OXOR:
|
||||
if(smallintconst(nr)) {
|
||||
n2 = *nr;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
regalloc(&n2, nr->type, N);
|
||||
cgen(nr, &n2);
|
||||
}
|
||||
} else {
|
||||
regalloc(&n2, nr->type, res);
|
||||
cgen(nr, &n2);
|
||||
switch(n->op) {
|
||||
case OADD:
|
||||
case OSUB:
|
||||
case OAND:
|
||||
case OOR:
|
||||
case OXOR:
|
||||
if(smallintconst(nr)) {
|
||||
n2 = *nr;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
regalloc(&n2, nr->type, res);
|
||||
cgen(nr, &n2);
|
||||
}
|
||||
regalloc(&n1, nl->type, N);
|
||||
cgen(nl, &n1);
|
||||
}
|
||||
gins(a, &n2, &n1);
|
||||
gmove(&n1, res);
|
||||
regfree(&n1);
|
||||
regfree(&n2);
|
||||
if(n2.op != OLITERAL)
|
||||
regfree(&n2);
|
||||
goto ret;
|
||||
|
||||
flt: // floating-point.
|
||||
|
Loading…
Reference in New Issue
Block a user