Before:
(erf.go:188) TEXT Erf+0(SB),$220
(erf.go:265) TEXT Erfc+0(SB),$204
(lgamma.go:174) TEXT Lgamma+0(SB),$948
After:
(erf.go:188) TEXT Erf+0(SB),$84
(erf.go:265) TEXT Erfc+0(SB),$84
(lgamma.go:174) TEXT Lgamma+0(SB),$44
SSE before vs. SSE after:
benchmark old ns/op new ns/op delta
BenchmarkAcosh 81 49 -39.14%
BenchmarkAsinh 109 109 +0.00%
BenchmarkAtanh 73 74 +0.68%
BenchmarkLgamma 138 42 -69.20%
BenchmarkModf 24 15 -36.95%
BenchmarkSqrtGo 565 556 -1.59%
R=rsc
CC=golang-dev
https://golang.org/cl/
7028048
for(p=firstp; p!=P; p=p->link) {
if(debug['R'] && debug['v'])
print("%P\n", p);
- if(p->link == P
- || !RtoB(p->from.type)
- || p->to.type != D_AUTO
- || isfloat[p->to.etype])
+ if(p->link == P || p->to.type != D_AUTO)
continue;
- switch(p->as) {
- case AMOVB:
- if(p->to.width == 1)
- break;
- case AMOVW:
- if(p->to.width == 2)
+ if(isfloat[p->to.etype] && FtoB(p->from.type)) {
+ switch(p->as) {
+ case AMOVSS:
+ case AMOVSD:
break;
- case AMOVL:
- if(p->to.width == 4)
- break;
- default:
+ default:
+ continue;
+ }
+ } else if(!isfloat[p->to.etype] && RtoB(p->from.type)) {
+ switch(p->as) {
+ case AMOVB:
+ if(p->to.width == 1)
+ break;
+ case AMOVW:
+ if(p->to.width == 2)
+ break;
+ case AMOVL:
+ if(p->to.width == 4)
+ break;
+ default:
+ continue;
+ }
+ } else
continue;
- }
// p is a MOV reg, mem.
- // and it is not a float.
p2 = p->link;
h = hash32to16(fnv1(p->to.sym));
if(counts[h] != 2) {
}
switch(p2->as) {
case ALEAL:
- case AFMOVL:
+ case AFMOVD:
+ case AFMOVF:
+ case AFMOVL:
case AFMOVW:
case AFMOVV:
// funny