aboutsummaryrefslogtreecommitdiff
path: root/src/liblink
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josharian@gmail.com>2014-12-22 15:12:28 -0800
committerJosh Bleecher Snyder <josharian@gmail.com>2015-01-07 22:26:55 +0000
commit43c87aa481f4e10777b05bf05edd15403853348f (patch)
tree0c9597c937977318d1be79cfd3cb2f9ce5f73969 /src/liblink
parentd5e4c4061b019a36ed3ac954c98f6535b7e78189 (diff)
downloadgo-43c87aa481f4e10777b05bf05edd15403853348f.tar.xz
cmd/6g, cmd/8g, liblink: improve handling of float constants
* Enable basic constant propagation for floats. The constant propagation is still not as aggressive as it could be. * Implement MOVSS $(0), Xx and MOVSD $(0), Xx as XORPS Xx, Xx. Sample code: func f32() float32 { var f float32 return f } func f64() float64 { var f float64 return f } Before: "".f32 t=1 size=32 value=0 args=0x8 locals=0x0 0x0000 00000 (demo.go:3) TEXT "".f32+0(SB),4,$0-8 0x0000 00000 (demo.go:3) FUNCDATA $0,gclocals·a7a3692b8e27e823add69ec4239ba55f+0(SB) 0x0000 00000 (demo.go:3) FUNCDATA $1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB) 0x0000 00000 (demo.go:3) MOVSS $f32.00000000+0(SB),X0 0x0008 00008 (demo.go:4) MOVSS $f32.00000000+0(SB),X0 0x0010 00016 (demo.go:5) MOVSS X0,"".~r0+8(FP) 0x0016 00022 (demo.go:5) RET , "".f64 t=1 size=32 value=0 args=0x8 locals=0x0 0x0000 00000 (demo.go:8) TEXT "".f64+0(SB),4,$0-8 0x0000 00000 (demo.go:8) FUNCDATA $0,gclocals·a7a3692b8e27e823add69ec4239ba55f+0(SB) 0x0000 00000 (demo.go:8) FUNCDATA $1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB) 0x0000 00000 (demo.go:8) MOVSD $f64.0000000000000000+0(SB),X0 0x0008 00008 (demo.go:9) MOVSD $f64.0000000000000000+0(SB),X0 0x0010 00016 (demo.go:10) MOVSD X0,"".~r0+8(FP) 0x0016 00022 (demo.go:10) RET , After: "".f32 t=1 size=16 value=0 args=0x8 locals=0x0 0x0000 00000 (demo.go:3) TEXT "".f32+0(SB),4,$0-8 0x0000 00000 (demo.go:3) FUNCDATA $0,gclocals·a7a3692b8e27e823add69ec4239ba55f+0(SB) 0x0000 00000 (demo.go:3) FUNCDATA $1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB) 0x0000 00000 (demo.go:3) XORPS X0,X0 0x0003 00003 (demo.go:5) MOVSS X0,"".~r0+8(FP) 0x0009 00009 (demo.go:5) RET , "".f64 t=1 size=16 value=0 args=0x8 locals=0x0 0x0000 00000 (demo.go:8) TEXT "".f64+0(SB),4,$0-8 0x0000 00000 (demo.go:8) FUNCDATA $0,gclocals·a7a3692b8e27e823add69ec4239ba55f+0(SB) 0x0000 00000 (demo.go:8) FUNCDATA $1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB) 0x0000 00000 (demo.go:8) XORPS X0,X0 0x0003 00003 (demo.go:10) MOVSD X0,"".~r0+8(FP) 0x0009 00009 (demo.go:10) RET , Change-Id: Ie9eb65e324af4f664153d0a7cd22bb16b0fba16d Reviewed-on: https://go-review.googlesource.com/2053 Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/liblink')
-rw-r--r--src/liblink/obj6.c28
-rw-r--r--src/liblink/obj8.c28
2 files changed, 52 insertions, 4 deletions
diff --git a/src/liblink/obj6.c b/src/liblink/obj6.c
index 2acfd2f70d..a8a84f72ce 100644
--- a/src/liblink/obj6.c
+++ b/src/liblink/obj6.c
@@ -241,6 +241,19 @@ progedit(Link *ctxt, Prog *p)
// Rewrite float constants to values stored in memory.
switch(p->as) {
+ case AMOVSS:
+ // Convert AMOVSS $(0), Xx to AXORPS Xx, Xx
+ if(p->from.type == D_FCONST)
+ if(p->from.u.dval == 0)
+ if(p->to.type >= D_X0)
+ if(p->to.type <= D_X15) {
+ p->as = AXORPS;
+ p->from.type = p->to.type;
+ p->from.index = p->to.index;
+ break;
+ }
+ // fallthrough
+
case AFMOVF:
case AFADDF:
case AFSUBF:
@@ -250,7 +263,6 @@ progedit(Link *ctxt, Prog *p)
case AFDIVRF:
case AFCOMF:
case AFCOMFP:
- case AMOVSS:
case AADDSS:
case ASUBSS:
case AMULSS:
@@ -274,6 +286,19 @@ progedit(Link *ctxt, Prog *p)
p->from.offset = 0;
}
break;
+
+ case AMOVSD:
+ // Convert AMOVSD $(0), Xx to AXORPS Xx, Xx
+ if(p->from.type == D_FCONST)
+ if(p->from.u.dval == 0)
+ if(p->to.type >= D_X0)
+ if(p->to.type <= D_X15) {
+ p->as = AXORPS;
+ p->from.type = p->to.type;
+ p->from.index = p->to.index;
+ break;
+ }
+ // fallthrough
case AFMOVD:
case AFADDD:
@@ -284,7 +309,6 @@ progedit(Link *ctxt, Prog *p)
case AFDIVRD:
case AFCOMD:
case AFCOMDP:
- case AMOVSD:
case AADDSD:
case ASUBSD:
case AMULSD:
diff --git a/src/liblink/obj8.c b/src/liblink/obj8.c
index f54153ae9b..02ef72753f 100644
--- a/src/liblink/obj8.c
+++ b/src/liblink/obj8.c
@@ -177,6 +177,19 @@ progedit(Link *ctxt, Prog *p)
// Rewrite float constants to values stored in memory.
switch(p->as) {
+ case AMOVSS:
+ // Convert AMOVSS $(0), Xx to AXORPS Xx, Xx
+ if(p->from.type == D_FCONST)
+ if(p->from.u.dval == 0)
+ if(p->to.type >= D_X0)
+ if(p->to.type <= D_X7) {
+ p->as = AXORPS;
+ p->from.type = p->to.type;
+ p->from.index = p->to.index;
+ break;
+ }
+ // fallthrough
+
case AFMOVF:
case AFADDF:
case AFSUBF:
@@ -186,7 +199,6 @@ progedit(Link *ctxt, Prog *p)
case AFDIVRF:
case AFCOMF:
case AFCOMFP:
- case AMOVSS:
case AADDSS:
case ASUBSS:
case AMULSS:
@@ -211,6 +223,19 @@ progedit(Link *ctxt, Prog *p)
}
break;
+ case AMOVSD:
+ // Convert AMOVSD $(0), Xx to AXORPS Xx, Xx
+ if(p->from.type == D_FCONST)
+ if(p->from.u.dval == 0)
+ if(p->to.type >= D_X0)
+ if(p->to.type <= D_X7) {
+ p->as = AXORPS;
+ p->from.type = p->to.type;
+ p->from.index = p->to.index;
+ break;
+ }
+ // fallthrough
+
case AFMOVD:
case AFADDD:
case AFSUBD:
@@ -220,7 +245,6 @@ progedit(Link *ctxt, Prog *p)
case AFDIVRD:
case AFCOMD:
case AFCOMDP:
- case AMOVSD:
case AADDSD:
case ASUBSD:
case AMULSD: