summaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj/x86/obj6.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/internal/obj/x86/obj6.go')
-rw-r--r--src/cmd/internal/obj/x86/obj6.go13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go
index eb6f867ca7..f3dfd32979 100644
--- a/src/cmd/internal/obj/x86/obj6.go
+++ b/src/cmd/internal/obj/x86/obj6.go
@@ -322,15 +322,13 @@ func progedit(ctxt *obj.Link, p *obj.Prog) {
// Rewrite p, if necessary, to access global data via the global offset table.
func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog) {
- var add, lea, mov obj.As
+ var lea, mov obj.As
var reg int16
if p.Mode == 64 {
- add = AADDQ
lea = ALEAQ
mov = AMOVQ
reg = REG_R15
} else {
- add = AADDL
lea = ALEAL
mov = AMOVL
reg = REG_CX
@@ -347,8 +345,10 @@ func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog) {
// ADUFFxxx $offset
// becomes
// $MOV runtime.duffxxx@GOT, $reg
- // $ADD $offset, $reg
+ // $LEA $offset($reg), $reg
// CALL $reg
+ // (we use LEAx rather than ADDx because ADDx clobbers
+ // flags and duffzero on 386 does not otherwise do so)
var sym *obj.LSym
if p.As == obj.ADUFFZERO {
sym = obj.Linklookup(ctxt, "runtime.duffzero", 0)
@@ -365,9 +365,10 @@ func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog) {
p.To.Offset = 0
p.To.Sym = nil
p1 := obj.Appendp(ctxt, p)
- p1.As = add
- p1.From.Type = obj.TYPE_CONST
+ p1.As = lea
+ p1.From.Type = obj.TYPE_MEM
p1.From.Offset = offset
+ p1.From.Reg = reg
p1.To.Type = obj.TYPE_REG
p1.To.Reg = reg
p2 := obj.Appendp(ctxt, p1)