Commit 8a3132dd authored by Michael Hudson-Doyle's avatar Michael Hudson-Doyle Committed by Ian Lance Taylor

cmd/6g: let the compiler use R15 when it is not needed for GOT indirection

Thanks to Russ for the hints.

Change-Id: Ie35a71d432b9d68bd30c7a364b4dce1bd3db806e
Reviewed-on: https://go-review.googlesource.com/9102Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 88c08b06
...@@ -293,4 +293,16 @@ func proginfo(p *obj.Prog) { ...@@ -293,4 +293,16 @@ func proginfo(p *obj.Prog) {
if p.To.Index != x86.REG_NONE { if p.To.Index != x86.REG_NONE {
info.Regindex |= RtoB(int(p.To.Index)) info.Regindex |= RtoB(int(p.To.Index))
} }
if gc.Ctxt.Flag_dynlink {
// When -dynlink is passed, many operations on external names (and
// also calling duffzero/duffcopy) use R15 as a scratch register.
if p.As == x86.ALEAQ || info.Flags == gc.Pseudo || p.As == obj.ACALL || p.As == obj.ARET || p.As == obj.AJMP {
return
}
if p.As == obj.ADUFFZERO || p.As == obj.ADUFFCOPY || p.From.Name == obj.NAME_EXTERN || p.To.Name == obj.NAME_EXTERN {
info.Reguse |= R15
info.Regset |= R15
return
}
}
} }
...@@ -108,6 +108,7 @@ const ( ...@@ -108,6 +108,7 @@ const (
DX = 1 << (x86.REG_DX - x86.REG_AX) DX = 1 << (x86.REG_DX - x86.REG_AX)
DI = 1 << (x86.REG_DI - x86.REG_AX) DI = 1 << (x86.REG_DI - x86.REG_AX)
SI = 1 << (x86.REG_SI - x86.REG_AX) SI = 1 << (x86.REG_SI - x86.REG_AX)
R15 = 1 << (x86.REG_R15 - x86.REG_AX)
) )
func RtoB(r int) uint64 { func RtoB(r int) uint64 {
...@@ -125,9 +126,6 @@ func BtoR(b uint64) int { ...@@ -125,9 +126,6 @@ func BtoR(b uint64) int {
// BP is part of the calling convention if framepointer_enabled. // BP is part of the calling convention if framepointer_enabled.
b &^= (1 << (x86.REG_BP - x86.REG_AX)) b &^= (1 << (x86.REG_BP - x86.REG_AX))
} }
if gc.Ctxt.Flag_dynlink {
b &^= (1 << (x86.REG_R15 - x86.REG_AX))
}
if b == 0 { if b == 0 {
return 0 return 0
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment