From: Michael Hudson-Doyle Date: Fri, 17 Apr 2015 06:36:11 +0000 (+0200) Subject: cmd/6g: let the compiler use R15 when it is not needed for GOT indirection X-Git-Tag: go1.5beta1~1003 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8a3132dd5ec1e1ffcad1dfdb33d98ea9b134cd1d;p=gostls13.git 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/9102 Reviewed-by: Ian Lance Taylor Run-TryBot: Michael Hudson-Doyle TryBot-Result: Gobot Gobot --- diff --git a/src/cmd/6g/prog.go b/src/cmd/6g/prog.go index 4c41d87ccb..5aeaeaa4ed 100644 --- a/src/cmd/6g/prog.go +++ b/src/cmd/6g/prog.go @@ -293,4 +293,16 @@ func proginfo(p *obj.Prog) { if p.To.Index != x86.REG_NONE { 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 + } + } } diff --git a/src/cmd/6g/reg.go b/src/cmd/6g/reg.go index ebca28262e..cab07b5b4e 100644 --- a/src/cmd/6g/reg.go +++ b/src/cmd/6g/reg.go @@ -102,12 +102,13 @@ func doregbits(r int) uint64 { // For ProgInfo. const ( - AX = 1 << (x86.REG_AX - x86.REG_AX) - BX = 1 << (x86.REG_BX - x86.REG_AX) - CX = 1 << (x86.REG_CX - x86.REG_AX) - DX = 1 << (x86.REG_DX - x86.REG_AX) - DI = 1 << (x86.REG_DI - x86.REG_AX) - SI = 1 << (x86.REG_SI - x86.REG_AX) + AX = 1 << (x86.REG_AX - x86.REG_AX) + BX = 1 << (x86.REG_BX - x86.REG_AX) + CX = 1 << (x86.REG_CX - x86.REG_AX) + DX = 1 << (x86.REG_DX - x86.REG_AX) + DI = 1 << (x86.REG_DI - x86.REG_AX) + SI = 1 << (x86.REG_SI - x86.REG_AX) + R15 = 1 << (x86.REG_R15 - x86.REG_AX) ) func RtoB(r int) uint64 { @@ -125,9 +126,6 @@ func BtoR(b uint64) int { // BP is part of the calling convention if framepointer_enabled. b &^= (1 << (x86.REG_BP - x86.REG_AX)) } - if gc.Ctxt.Flag_dynlink { - b &^= (1 << (x86.REG_R15 - x86.REG_AX)) - } if b == 0 { return 0 }