// 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
// 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)
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)