mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/internal/obj,cmd/link: access global data via GOT in -dynlink mode on loong64
Updates #58784 Change-Id: Ic98d10a512fea0c3ca321ab52693d9f6775126a6 Reviewed-on: https://go-review.googlesource.com/c/go/+/480875 Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Meidan Li <limeidan@loongson.cn> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: WANG Xuerui <git@xen0n.name> Reviewed-by: WANG Xuerui <git@xen0n.name>
This commit is contained in:
parent
f43581131e
commit
346e06c46d
9 changed files with 310 additions and 145 deletions
|
|
@ -455,66 +455,31 @@
|
||||||
(ADDVconst [off1] (MOVVaddr [off2] {sym} ptr)) && is32Bit(off1+int64(off2)) => (MOVVaddr [int32(off1)+int32(off2)] {sym} ptr)
|
(ADDVconst [off1] (MOVVaddr [off2] {sym} ptr)) && is32Bit(off1+int64(off2)) => (MOVVaddr [int32(off1)+int32(off2)] {sym} ptr)
|
||||||
|
|
||||||
// fold address into load/store
|
// fold address into load/store
|
||||||
(MOVBload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVBload [off1+int32(off2)] {sym} ptr mem)
|
// Do not fold global variable access in -dynlink mode, where it will be rewritten
|
||||||
(MOVBUload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVBUload [off1+int32(off2)] {sym} ptr mem)
|
// to use the GOT via REGTMP, which currently cannot handle large offset.
|
||||||
(MOVHload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVHload [off1+int32(off2)] {sym} ptr mem)
|
(MOV(B|BU|H|HU|W|WU|V|F|D)load [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
|
||||||
(MOVHUload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVHUload [off1+int32(off2)] {sym} ptr mem)
|
&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
|
||||||
(MOVWload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVWload [off1+int32(off2)] {sym} ptr mem)
|
(MOV(B|BU|H|HU|W|WU|V|F|D)load [off1+int32(off2)] {sym} ptr mem)
|
||||||
(MOVWUload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVWUload [off1+int32(off2)] {sym} ptr mem)
|
|
||||||
(MOVVload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVVload [off1+int32(off2)] {sym} ptr mem)
|
|
||||||
(MOVFload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVFload [off1+int32(off2)] {sym} ptr mem)
|
|
||||||
(MOVDload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVDload [off1+int32(off2)] {sym} ptr mem)
|
|
||||||
|
|
||||||
(MOVBstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) => (MOVBstore [off1+int32(off2)] {sym} ptr val mem)
|
(MOV(B|H|W|V|F|D)store [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2)
|
||||||
(MOVHstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) => (MOVHstore [off1+int32(off2)] {sym} ptr val mem)
|
&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
|
||||||
(MOVWstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) => (MOVWstore [off1+int32(off2)] {sym} ptr val mem)
|
(MOV(B|H|W|V|F|D)store [off1+int32(off2)] {sym} ptr val mem)
|
||||||
(MOVVstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) => (MOVVstore [off1+int32(off2)] {sym} ptr val mem)
|
|
||||||
(MOVFstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) => (MOVFstore [off1+int32(off2)] {sym} ptr val mem)
|
|
||||||
(MOVDstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) => (MOVDstore [off1+int32(off2)] {sym} ptr val mem)
|
|
||||||
(MOVBstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVBstorezero [off1+int32(off2)] {sym} ptr mem)
|
|
||||||
(MOVHstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVHstorezero [off1+int32(off2)] {sym} ptr mem)
|
|
||||||
(MOVWstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVWstorezero [off1+int32(off2)] {sym} ptr mem)
|
|
||||||
(MOVVstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVVstorezero [off1+int32(off2)] {sym} ptr mem)
|
|
||||||
|
|
||||||
(MOVBload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
(MOV(B|H|W|V)storezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
|
||||||
(MOVBload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
|
||||||
(MOVBUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
(MOV(B|H|W|V)storezero [off1+int32(off2)] {sym} ptr mem)
|
||||||
(MOVBUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
|
||||||
(MOVHload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
|
||||||
(MOVHload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
|
||||||
(MOVHUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
|
||||||
(MOVHUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
|
||||||
(MOVWload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
|
||||||
(MOVWload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
|
||||||
(MOVWUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
|
||||||
(MOVWUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
|
||||||
(MOVVload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
|
||||||
(MOVVload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
|
||||||
(MOVFload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
|
||||||
(MOVFload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
|
||||||
(MOVDload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
|
||||||
(MOVDload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
|
||||||
|
|
||||||
(MOVBstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
(MOV(B|BU|H|HU|W|WU|V|F|D)load [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2)
|
||||||
(MOVBstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
&& is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
|
||||||
(MOVHstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
(MOV(B|BU|H|HU|W|WU|V|F|D)load [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
(MOVHstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
|
||||||
(MOVWstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
(MOV(B|H|W|V|F|D)store [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2)
|
||||||
(MOVWstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
&& is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
|
||||||
(MOVVstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
(MOV(B|H|W|V|F|D)store [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
||||||
(MOVVstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
|
||||||
(MOVFstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
(MOV(B|H|W|V)storezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2)
|
||||||
(MOVFstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
&& is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
|
||||||
(MOVDstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
(MOV(B|H|W|V)storezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
(MOVDstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
|
||||||
(MOVBstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
|
||||||
(MOVBstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
|
||||||
(MOVHstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
|
||||||
(MOVHstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
|
||||||
(MOVWstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
|
||||||
(MOVWstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
|
||||||
(MOVVstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
|
|
||||||
(MOVVstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
|
||||||
|
|
||||||
(LoweredAtomicStore(32|64) ptr (MOVVconst [0]) mem) => (LoweredAtomicStorezero(32|64) ptr mem)
|
(LoweredAtomicStore(32|64) ptr (MOVVconst [0]) mem) => (LoweredAtomicStorezero(32|64) ptr mem)
|
||||||
(LoweredAtomicAdd32 ptr (MOVVconst [c]) mem) && is32Bit(c) => (LoweredAtomicAddconst32 [int32(c)] ptr mem)
|
(LoweredAtomicAdd32 ptr (MOVVconst [c]) mem) && is32Bit(c) => (LoweredAtomicAddconst32 [int32(c)] ptr mem)
|
||||||
|
|
|
||||||
|
|
@ -1724,8 +1724,10 @@ func rewriteValueLOONG64_OpLOONG64MASKNEZ(v *Value) bool {
|
||||||
func rewriteValueLOONG64_OpLOONG64MOVBUload(v *Value) bool {
|
func rewriteValueLOONG64_OpLOONG64MOVBUload(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVBUload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
// match: (MOVBUload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVBUload [off1+int32(off2)] {sym} ptr mem)
|
// result: (MOVBUload [off1+int32(off2)] {sym} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -1736,7 +1738,7 @@ func rewriteValueLOONG64_OpLOONG64MOVBUload(v *Value) bool {
|
||||||
off2 := auxIntToInt64(v_0.AuxInt)
|
off2 := auxIntToInt64(v_0.AuxInt)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVBUload)
|
v.reset(OpLOONG64MOVBUload)
|
||||||
|
|
@ -1746,7 +1748,7 @@ func rewriteValueLOONG64_OpLOONG64MOVBUload(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVBUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
// match: (MOVBUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVBUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
// result: (MOVBUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -1758,7 +1760,7 @@ func rewriteValueLOONG64_OpLOONG64MOVBUload(v *Value) bool {
|
||||||
sym2 := auxToSym(v_0.Aux)
|
sym2 := auxToSym(v_0.Aux)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVBUload)
|
v.reset(OpLOONG64MOVBUload)
|
||||||
|
|
@ -1809,8 +1811,10 @@ func rewriteValueLOONG64_OpLOONG64MOVBUreg(v *Value) bool {
|
||||||
func rewriteValueLOONG64_OpLOONG64MOVBload(v *Value) bool {
|
func rewriteValueLOONG64_OpLOONG64MOVBload(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVBload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
// match: (MOVBload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVBload [off1+int32(off2)] {sym} ptr mem)
|
// result: (MOVBload [off1+int32(off2)] {sym} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -1821,7 +1825,7 @@ func rewriteValueLOONG64_OpLOONG64MOVBload(v *Value) bool {
|
||||||
off2 := auxIntToInt64(v_0.AuxInt)
|
off2 := auxIntToInt64(v_0.AuxInt)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVBload)
|
v.reset(OpLOONG64MOVBload)
|
||||||
|
|
@ -1831,7 +1835,7 @@ func rewriteValueLOONG64_OpLOONG64MOVBload(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVBload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
// match: (MOVBload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVBload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
// result: (MOVBload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -1843,7 +1847,7 @@ func rewriteValueLOONG64_OpLOONG64MOVBload(v *Value) bool {
|
||||||
sym2 := auxToSym(v_0.Aux)
|
sym2 := auxToSym(v_0.Aux)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVBload)
|
v.reset(OpLOONG64MOVBload)
|
||||||
|
|
@ -1895,8 +1899,10 @@ func rewriteValueLOONG64_OpLOONG64MOVBstore(v *Value) bool {
|
||||||
v_2 := v.Args[2]
|
v_2 := v.Args[2]
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVBstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
|
// match: (MOVBstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVBstore [off1+int32(off2)] {sym} ptr val mem)
|
// result: (MOVBstore [off1+int32(off2)] {sym} ptr val mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -1908,7 +1914,7 @@ func rewriteValueLOONG64_OpLOONG64MOVBstore(v *Value) bool {
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
val := v_1
|
val := v_1
|
||||||
mem := v_2
|
mem := v_2
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVBstore)
|
v.reset(OpLOONG64MOVBstore)
|
||||||
|
|
@ -1918,7 +1924,7 @@ func rewriteValueLOONG64_OpLOONG64MOVBstore(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVBstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
|
// match: (MOVBstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVBstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
// result: (MOVBstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -1931,7 +1937,7 @@ func rewriteValueLOONG64_OpLOONG64MOVBstore(v *Value) bool {
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
val := v_1
|
val := v_1
|
||||||
mem := v_2
|
mem := v_2
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVBstore)
|
v.reset(OpLOONG64MOVBstore)
|
||||||
|
|
@ -2047,8 +2053,10 @@ func rewriteValueLOONG64_OpLOONG64MOVBstore(v *Value) bool {
|
||||||
func rewriteValueLOONG64_OpLOONG64MOVBstorezero(v *Value) bool {
|
func rewriteValueLOONG64_OpLOONG64MOVBstorezero(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVBstorezero [off1] {sym} (ADDVconst [off2] ptr) mem)
|
// match: (MOVBstorezero [off1] {sym} (ADDVconst [off2] ptr) mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVBstorezero [off1+int32(off2)] {sym} ptr mem)
|
// result: (MOVBstorezero [off1+int32(off2)] {sym} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2059,7 +2067,7 @@ func rewriteValueLOONG64_OpLOONG64MOVBstorezero(v *Value) bool {
|
||||||
off2 := auxIntToInt64(v_0.AuxInt)
|
off2 := auxIntToInt64(v_0.AuxInt)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVBstorezero)
|
v.reset(OpLOONG64MOVBstorezero)
|
||||||
|
|
@ -2069,7 +2077,7 @@ func rewriteValueLOONG64_OpLOONG64MOVBstorezero(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVBstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
// match: (MOVBstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVBstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
// result: (MOVBstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2081,7 +2089,7 @@ func rewriteValueLOONG64_OpLOONG64MOVBstorezero(v *Value) bool {
|
||||||
sym2 := auxToSym(v_0.Aux)
|
sym2 := auxToSym(v_0.Aux)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVBstorezero)
|
v.reset(OpLOONG64MOVBstorezero)
|
||||||
|
|
@ -2095,8 +2103,10 @@ func rewriteValueLOONG64_OpLOONG64MOVBstorezero(v *Value) bool {
|
||||||
func rewriteValueLOONG64_OpLOONG64MOVDload(v *Value) bool {
|
func rewriteValueLOONG64_OpLOONG64MOVDload(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVDload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
// match: (MOVDload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVDload [off1+int32(off2)] {sym} ptr mem)
|
// result: (MOVDload [off1+int32(off2)] {sym} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2107,7 +2117,7 @@ func rewriteValueLOONG64_OpLOONG64MOVDload(v *Value) bool {
|
||||||
off2 := auxIntToInt64(v_0.AuxInt)
|
off2 := auxIntToInt64(v_0.AuxInt)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVDload)
|
v.reset(OpLOONG64MOVDload)
|
||||||
|
|
@ -2117,7 +2127,7 @@ func rewriteValueLOONG64_OpLOONG64MOVDload(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVDload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
// match: (MOVDload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVDload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
// result: (MOVDload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2129,7 +2139,7 @@ func rewriteValueLOONG64_OpLOONG64MOVDload(v *Value) bool {
|
||||||
sym2 := auxToSym(v_0.Aux)
|
sym2 := auxToSym(v_0.Aux)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVDload)
|
v.reset(OpLOONG64MOVDload)
|
||||||
|
|
@ -2144,8 +2154,10 @@ func rewriteValueLOONG64_OpLOONG64MOVDstore(v *Value) bool {
|
||||||
v_2 := v.Args[2]
|
v_2 := v.Args[2]
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVDstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
|
// match: (MOVDstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVDstore [off1+int32(off2)] {sym} ptr val mem)
|
// result: (MOVDstore [off1+int32(off2)] {sym} ptr val mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2157,7 +2169,7 @@ func rewriteValueLOONG64_OpLOONG64MOVDstore(v *Value) bool {
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
val := v_1
|
val := v_1
|
||||||
mem := v_2
|
mem := v_2
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVDstore)
|
v.reset(OpLOONG64MOVDstore)
|
||||||
|
|
@ -2167,7 +2179,7 @@ func rewriteValueLOONG64_OpLOONG64MOVDstore(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVDstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
|
// match: (MOVDstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVDstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
// result: (MOVDstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2180,7 +2192,7 @@ func rewriteValueLOONG64_OpLOONG64MOVDstore(v *Value) bool {
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
val := v_1
|
val := v_1
|
||||||
mem := v_2
|
mem := v_2
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVDstore)
|
v.reset(OpLOONG64MOVDstore)
|
||||||
|
|
@ -2194,8 +2206,10 @@ func rewriteValueLOONG64_OpLOONG64MOVDstore(v *Value) bool {
|
||||||
func rewriteValueLOONG64_OpLOONG64MOVFload(v *Value) bool {
|
func rewriteValueLOONG64_OpLOONG64MOVFload(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVFload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
// match: (MOVFload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVFload [off1+int32(off2)] {sym} ptr mem)
|
// result: (MOVFload [off1+int32(off2)] {sym} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2206,7 +2220,7 @@ func rewriteValueLOONG64_OpLOONG64MOVFload(v *Value) bool {
|
||||||
off2 := auxIntToInt64(v_0.AuxInt)
|
off2 := auxIntToInt64(v_0.AuxInt)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVFload)
|
v.reset(OpLOONG64MOVFload)
|
||||||
|
|
@ -2216,7 +2230,7 @@ func rewriteValueLOONG64_OpLOONG64MOVFload(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVFload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
// match: (MOVFload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVFload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
// result: (MOVFload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2228,7 +2242,7 @@ func rewriteValueLOONG64_OpLOONG64MOVFload(v *Value) bool {
|
||||||
sym2 := auxToSym(v_0.Aux)
|
sym2 := auxToSym(v_0.Aux)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVFload)
|
v.reset(OpLOONG64MOVFload)
|
||||||
|
|
@ -2243,8 +2257,10 @@ func rewriteValueLOONG64_OpLOONG64MOVFstore(v *Value) bool {
|
||||||
v_2 := v.Args[2]
|
v_2 := v.Args[2]
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVFstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
|
// match: (MOVFstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVFstore [off1+int32(off2)] {sym} ptr val mem)
|
// result: (MOVFstore [off1+int32(off2)] {sym} ptr val mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2256,7 +2272,7 @@ func rewriteValueLOONG64_OpLOONG64MOVFstore(v *Value) bool {
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
val := v_1
|
val := v_1
|
||||||
mem := v_2
|
mem := v_2
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVFstore)
|
v.reset(OpLOONG64MOVFstore)
|
||||||
|
|
@ -2266,7 +2282,7 @@ func rewriteValueLOONG64_OpLOONG64MOVFstore(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVFstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
|
// match: (MOVFstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVFstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
// result: (MOVFstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2279,7 +2295,7 @@ func rewriteValueLOONG64_OpLOONG64MOVFstore(v *Value) bool {
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
val := v_1
|
val := v_1
|
||||||
mem := v_2
|
mem := v_2
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVFstore)
|
v.reset(OpLOONG64MOVFstore)
|
||||||
|
|
@ -2293,8 +2309,10 @@ func rewriteValueLOONG64_OpLOONG64MOVFstore(v *Value) bool {
|
||||||
func rewriteValueLOONG64_OpLOONG64MOVHUload(v *Value) bool {
|
func rewriteValueLOONG64_OpLOONG64MOVHUload(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVHUload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
// match: (MOVHUload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVHUload [off1+int32(off2)] {sym} ptr mem)
|
// result: (MOVHUload [off1+int32(off2)] {sym} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2305,7 +2323,7 @@ func rewriteValueLOONG64_OpLOONG64MOVHUload(v *Value) bool {
|
||||||
off2 := auxIntToInt64(v_0.AuxInt)
|
off2 := auxIntToInt64(v_0.AuxInt)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVHUload)
|
v.reset(OpLOONG64MOVHUload)
|
||||||
|
|
@ -2315,7 +2333,7 @@ func rewriteValueLOONG64_OpLOONG64MOVHUload(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVHUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
// match: (MOVHUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVHUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
// result: (MOVHUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2327,7 +2345,7 @@ func rewriteValueLOONG64_OpLOONG64MOVHUload(v *Value) bool {
|
||||||
sym2 := auxToSym(v_0.Aux)
|
sym2 := auxToSym(v_0.Aux)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVHUload)
|
v.reset(OpLOONG64MOVHUload)
|
||||||
|
|
@ -2400,8 +2418,10 @@ func rewriteValueLOONG64_OpLOONG64MOVHUreg(v *Value) bool {
|
||||||
func rewriteValueLOONG64_OpLOONG64MOVHload(v *Value) bool {
|
func rewriteValueLOONG64_OpLOONG64MOVHload(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVHload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
// match: (MOVHload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVHload [off1+int32(off2)] {sym} ptr mem)
|
// result: (MOVHload [off1+int32(off2)] {sym} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2412,7 +2432,7 @@ func rewriteValueLOONG64_OpLOONG64MOVHload(v *Value) bool {
|
||||||
off2 := auxIntToInt64(v_0.AuxInt)
|
off2 := auxIntToInt64(v_0.AuxInt)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVHload)
|
v.reset(OpLOONG64MOVHload)
|
||||||
|
|
@ -2422,7 +2442,7 @@ func rewriteValueLOONG64_OpLOONG64MOVHload(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVHload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
// match: (MOVHload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVHload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
// result: (MOVHload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2434,7 +2454,7 @@ func rewriteValueLOONG64_OpLOONG64MOVHload(v *Value) bool {
|
||||||
sym2 := auxToSym(v_0.Aux)
|
sym2 := auxToSym(v_0.Aux)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVHload)
|
v.reset(OpLOONG64MOVHload)
|
||||||
|
|
@ -2530,8 +2550,10 @@ func rewriteValueLOONG64_OpLOONG64MOVHstore(v *Value) bool {
|
||||||
v_2 := v.Args[2]
|
v_2 := v.Args[2]
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVHstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
|
// match: (MOVHstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVHstore [off1+int32(off2)] {sym} ptr val mem)
|
// result: (MOVHstore [off1+int32(off2)] {sym} ptr val mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2543,7 +2565,7 @@ func rewriteValueLOONG64_OpLOONG64MOVHstore(v *Value) bool {
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
val := v_1
|
val := v_1
|
||||||
mem := v_2
|
mem := v_2
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVHstore)
|
v.reset(OpLOONG64MOVHstore)
|
||||||
|
|
@ -2553,7 +2575,7 @@ func rewriteValueLOONG64_OpLOONG64MOVHstore(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVHstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
|
// match: (MOVHstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVHstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
// result: (MOVHstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2566,7 +2588,7 @@ func rewriteValueLOONG64_OpLOONG64MOVHstore(v *Value) bool {
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
val := v_1
|
val := v_1
|
||||||
mem := v_2
|
mem := v_2
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVHstore)
|
v.reset(OpLOONG64MOVHstore)
|
||||||
|
|
@ -2648,8 +2670,10 @@ func rewriteValueLOONG64_OpLOONG64MOVHstore(v *Value) bool {
|
||||||
func rewriteValueLOONG64_OpLOONG64MOVHstorezero(v *Value) bool {
|
func rewriteValueLOONG64_OpLOONG64MOVHstorezero(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVHstorezero [off1] {sym} (ADDVconst [off2] ptr) mem)
|
// match: (MOVHstorezero [off1] {sym} (ADDVconst [off2] ptr) mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVHstorezero [off1+int32(off2)] {sym} ptr mem)
|
// result: (MOVHstorezero [off1+int32(off2)] {sym} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2660,7 +2684,7 @@ func rewriteValueLOONG64_OpLOONG64MOVHstorezero(v *Value) bool {
|
||||||
off2 := auxIntToInt64(v_0.AuxInt)
|
off2 := auxIntToInt64(v_0.AuxInt)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVHstorezero)
|
v.reset(OpLOONG64MOVHstorezero)
|
||||||
|
|
@ -2670,7 +2694,7 @@ func rewriteValueLOONG64_OpLOONG64MOVHstorezero(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVHstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
// match: (MOVHstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVHstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
// result: (MOVHstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2682,7 +2706,7 @@ func rewriteValueLOONG64_OpLOONG64MOVHstorezero(v *Value) bool {
|
||||||
sym2 := auxToSym(v_0.Aux)
|
sym2 := auxToSym(v_0.Aux)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVHstorezero)
|
v.reset(OpLOONG64MOVHstorezero)
|
||||||
|
|
@ -2696,8 +2720,10 @@ func rewriteValueLOONG64_OpLOONG64MOVHstorezero(v *Value) bool {
|
||||||
func rewriteValueLOONG64_OpLOONG64MOVVload(v *Value) bool {
|
func rewriteValueLOONG64_OpLOONG64MOVVload(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVVload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
// match: (MOVVload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVVload [off1+int32(off2)] {sym} ptr mem)
|
// result: (MOVVload [off1+int32(off2)] {sym} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2708,7 +2734,7 @@ func rewriteValueLOONG64_OpLOONG64MOVVload(v *Value) bool {
|
||||||
off2 := auxIntToInt64(v_0.AuxInt)
|
off2 := auxIntToInt64(v_0.AuxInt)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVVload)
|
v.reset(OpLOONG64MOVVload)
|
||||||
|
|
@ -2718,7 +2744,7 @@ func rewriteValueLOONG64_OpLOONG64MOVVload(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVVload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
// match: (MOVVload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVVload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
// result: (MOVVload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2730,7 +2756,7 @@ func rewriteValueLOONG64_OpLOONG64MOVVload(v *Value) bool {
|
||||||
sym2 := auxToSym(v_0.Aux)
|
sym2 := auxToSym(v_0.Aux)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVVload)
|
v.reset(OpLOONG64MOVVload)
|
||||||
|
|
@ -2772,8 +2798,10 @@ func rewriteValueLOONG64_OpLOONG64MOVVstore(v *Value) bool {
|
||||||
v_2 := v.Args[2]
|
v_2 := v.Args[2]
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVVstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
|
// match: (MOVVstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVVstore [off1+int32(off2)] {sym} ptr val mem)
|
// result: (MOVVstore [off1+int32(off2)] {sym} ptr val mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2785,7 +2813,7 @@ func rewriteValueLOONG64_OpLOONG64MOVVstore(v *Value) bool {
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
val := v_1
|
val := v_1
|
||||||
mem := v_2
|
mem := v_2
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVVstore)
|
v.reset(OpLOONG64MOVVstore)
|
||||||
|
|
@ -2795,7 +2823,7 @@ func rewriteValueLOONG64_OpLOONG64MOVVstore(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVVstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
|
// match: (MOVVstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVVstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
// result: (MOVVstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2808,7 +2836,7 @@ func rewriteValueLOONG64_OpLOONG64MOVVstore(v *Value) bool {
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
val := v_1
|
val := v_1
|
||||||
mem := v_2
|
mem := v_2
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVVstore)
|
v.reset(OpLOONG64MOVVstore)
|
||||||
|
|
@ -2822,8 +2850,10 @@ func rewriteValueLOONG64_OpLOONG64MOVVstore(v *Value) bool {
|
||||||
func rewriteValueLOONG64_OpLOONG64MOVVstorezero(v *Value) bool {
|
func rewriteValueLOONG64_OpLOONG64MOVVstorezero(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVVstorezero [off1] {sym} (ADDVconst [off2] ptr) mem)
|
// match: (MOVVstorezero [off1] {sym} (ADDVconst [off2] ptr) mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVVstorezero [off1+int32(off2)] {sym} ptr mem)
|
// result: (MOVVstorezero [off1+int32(off2)] {sym} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2834,7 +2864,7 @@ func rewriteValueLOONG64_OpLOONG64MOVVstorezero(v *Value) bool {
|
||||||
off2 := auxIntToInt64(v_0.AuxInt)
|
off2 := auxIntToInt64(v_0.AuxInt)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVVstorezero)
|
v.reset(OpLOONG64MOVVstorezero)
|
||||||
|
|
@ -2844,7 +2874,7 @@ func rewriteValueLOONG64_OpLOONG64MOVVstorezero(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVVstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
// match: (MOVVstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVVstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
// result: (MOVVstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2856,7 +2886,7 @@ func rewriteValueLOONG64_OpLOONG64MOVVstorezero(v *Value) bool {
|
||||||
sym2 := auxToSym(v_0.Aux)
|
sym2 := auxToSym(v_0.Aux)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVVstorezero)
|
v.reset(OpLOONG64MOVVstorezero)
|
||||||
|
|
@ -2870,8 +2900,10 @@ func rewriteValueLOONG64_OpLOONG64MOVVstorezero(v *Value) bool {
|
||||||
func rewriteValueLOONG64_OpLOONG64MOVWUload(v *Value) bool {
|
func rewriteValueLOONG64_OpLOONG64MOVWUload(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVWUload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
// match: (MOVWUload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVWUload [off1+int32(off2)] {sym} ptr mem)
|
// result: (MOVWUload [off1+int32(off2)] {sym} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2882,7 +2914,7 @@ func rewriteValueLOONG64_OpLOONG64MOVWUload(v *Value) bool {
|
||||||
off2 := auxIntToInt64(v_0.AuxInt)
|
off2 := auxIntToInt64(v_0.AuxInt)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVWUload)
|
v.reset(OpLOONG64MOVWUload)
|
||||||
|
|
@ -2892,7 +2924,7 @@ func rewriteValueLOONG64_OpLOONG64MOVWUload(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVWUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
// match: (MOVWUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVWUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
// result: (MOVWUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -2904,7 +2936,7 @@ func rewriteValueLOONG64_OpLOONG64MOVWUload(v *Value) bool {
|
||||||
sym2 := auxToSym(v_0.Aux)
|
sym2 := auxToSym(v_0.Aux)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVWUload)
|
v.reset(OpLOONG64MOVWUload)
|
||||||
|
|
@ -2999,8 +3031,10 @@ func rewriteValueLOONG64_OpLOONG64MOVWUreg(v *Value) bool {
|
||||||
func rewriteValueLOONG64_OpLOONG64MOVWload(v *Value) bool {
|
func rewriteValueLOONG64_OpLOONG64MOVWload(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVWload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
// match: (MOVWload [off1] {sym} (ADDVconst [off2] ptr) mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVWload [off1+int32(off2)] {sym} ptr mem)
|
// result: (MOVWload [off1+int32(off2)] {sym} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -3011,7 +3045,7 @@ func rewriteValueLOONG64_OpLOONG64MOVWload(v *Value) bool {
|
||||||
off2 := auxIntToInt64(v_0.AuxInt)
|
off2 := auxIntToInt64(v_0.AuxInt)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVWload)
|
v.reset(OpLOONG64MOVWload)
|
||||||
|
|
@ -3021,7 +3055,7 @@ func rewriteValueLOONG64_OpLOONG64MOVWload(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVWload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
// match: (MOVWload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVWload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
// result: (MOVWload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -3033,7 +3067,7 @@ func rewriteValueLOONG64_OpLOONG64MOVWload(v *Value) bool {
|
||||||
sym2 := auxToSym(v_0.Aux)
|
sym2 := auxToSym(v_0.Aux)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVWload)
|
v.reset(OpLOONG64MOVWload)
|
||||||
|
|
@ -3162,8 +3196,10 @@ func rewriteValueLOONG64_OpLOONG64MOVWstore(v *Value) bool {
|
||||||
v_2 := v.Args[2]
|
v_2 := v.Args[2]
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVWstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
|
// match: (MOVWstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVWstore [off1+int32(off2)] {sym} ptr val mem)
|
// result: (MOVWstore [off1+int32(off2)] {sym} ptr val mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -3175,7 +3211,7 @@ func rewriteValueLOONG64_OpLOONG64MOVWstore(v *Value) bool {
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
val := v_1
|
val := v_1
|
||||||
mem := v_2
|
mem := v_2
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVWstore)
|
v.reset(OpLOONG64MOVWstore)
|
||||||
|
|
@ -3185,7 +3221,7 @@ func rewriteValueLOONG64_OpLOONG64MOVWstore(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVWstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
|
// match: (MOVWstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVWstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
// result: (MOVWstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -3198,7 +3234,7 @@ func rewriteValueLOONG64_OpLOONG64MOVWstore(v *Value) bool {
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
val := v_1
|
val := v_1
|
||||||
mem := v_2
|
mem := v_2
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVWstore)
|
v.reset(OpLOONG64MOVWstore)
|
||||||
|
|
@ -3246,8 +3282,10 @@ func rewriteValueLOONG64_OpLOONG64MOVWstore(v *Value) bool {
|
||||||
func rewriteValueLOONG64_OpLOONG64MOVWstorezero(v *Value) bool {
|
func rewriteValueLOONG64_OpLOONG64MOVWstorezero(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
b := v.Block
|
||||||
|
config := b.Func.Config
|
||||||
// match: (MOVWstorezero [off1] {sym} (ADDVconst [off2] ptr) mem)
|
// match: (MOVWstorezero [off1] {sym} (ADDVconst [off2] ptr) mem)
|
||||||
// cond: is32Bit(int64(off1)+off2)
|
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVWstorezero [off1+int32(off2)] {sym} ptr mem)
|
// result: (MOVWstorezero [off1+int32(off2)] {sym} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -3258,7 +3296,7 @@ func rewriteValueLOONG64_OpLOONG64MOVWstorezero(v *Value) bool {
|
||||||
off2 := auxIntToInt64(v_0.AuxInt)
|
off2 := auxIntToInt64(v_0.AuxInt)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(is32Bit(int64(off1) + off2)) {
|
if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVWstorezero)
|
v.reset(OpLOONG64MOVWstorezero)
|
||||||
|
|
@ -3268,7 +3306,7 @@ func rewriteValueLOONG64_OpLOONG64MOVWstorezero(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (MOVWstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
// match: (MOVWstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
|
||||||
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
|
// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
|
||||||
// result: (MOVWstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
// result: (MOVWstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
|
||||||
for {
|
for {
|
||||||
off1 := auxIntToInt32(v.AuxInt)
|
off1 := auxIntToInt32(v.AuxInt)
|
||||||
|
|
@ -3280,7 +3318,7 @@ func rewriteValueLOONG64_OpLOONG64MOVWstorezero(v *Value) bool {
|
||||||
sym2 := auxToSym(v_0.Aux)
|
sym2 := auxToSym(v_0.Aux)
|
||||||
ptr := v_0.Args[0]
|
ptr := v_0.Args[0]
|
||||||
mem := v_1
|
mem := v_1
|
||||||
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
|
if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpLOONG64MOVWstorezero)
|
v.reset(OpLOONG64MOVWstorezero)
|
||||||
|
|
|
||||||
|
|
@ -227,6 +227,7 @@ const (
|
||||||
C_ADDR
|
C_ADDR
|
||||||
C_TLS_LE
|
C_TLS_LE
|
||||||
C_TLS_IE
|
C_TLS_IE
|
||||||
|
C_GOTADDR
|
||||||
C_TEXTSIZE
|
C_TEXTSIZE
|
||||||
|
|
||||||
C_NCLASS // must be the last
|
C_NCLASS // must be the last
|
||||||
|
|
|
||||||
|
|
@ -349,6 +349,8 @@ var optab = []Optab{
|
||||||
{AWORD, C_LCON, C_NONE, C_NONE, C_NONE, C_NONE, 40, 4, 0, 0},
|
{AWORD, C_LCON, C_NONE, C_NONE, C_NONE, C_NONE, 40, 4, 0, 0},
|
||||||
{AWORD, C_DCON, C_NONE, C_NONE, C_NONE, C_NONE, 61, 4, 0, 0},
|
{AWORD, C_DCON, C_NONE, C_NONE, C_NONE, C_NONE, 61, 4, 0, 0},
|
||||||
|
|
||||||
|
{AMOVV, C_GOTADDR, C_NONE, C_NONE, C_REG, C_NONE, 65, 8, 0, 0},
|
||||||
|
|
||||||
{ATEQ, C_SCON, C_REG, C_NONE, C_REG, C_NONE, 15, 8, 0, 0},
|
{ATEQ, C_SCON, C_REG, C_NONE, C_REG, C_NONE, 15, 8, 0, 0},
|
||||||
{ATEQ, C_SCON, C_NONE, C_NONE, C_REG, C_NONE, 15, 8, 0, 0},
|
{ATEQ, C_SCON, C_NONE, C_NONE, C_REG, C_NONE, 15, 8, 0, 0},
|
||||||
|
|
||||||
|
|
@ -676,6 +678,9 @@ func (c *ctxt0) aclass(a *obj.Addr) int {
|
||||||
return C_SOREG
|
return C_SOREG
|
||||||
}
|
}
|
||||||
return C_LOREG
|
return C_LOREG
|
||||||
|
|
||||||
|
case obj.NAME_GOTREF:
|
||||||
|
return C_GOTADDR
|
||||||
}
|
}
|
||||||
|
|
||||||
return C_GOK
|
return C_GOK
|
||||||
|
|
@ -1776,6 +1781,22 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
|
||||||
case 64: // movv c_reg, c_fcc0 ==> movgr2cf cd, rj
|
case 64: // movv c_reg, c_fcc0 ==> movgr2cf cd, rj
|
||||||
a := OP_TEN(8, 1334)
|
a := OP_TEN(8, 1334)
|
||||||
o1 = OP_RR(a, uint32(p.From.Reg), uint32(p.To.Reg))
|
o1 = OP_RR(a, uint32(p.From.Reg), uint32(p.To.Reg))
|
||||||
|
|
||||||
|
case 65: // mov sym@GOT, r ==> pcalau12i + ld.d
|
||||||
|
o1 = OP_IR(c.opir(APCALAU12I), uint32(0), uint32(p.To.Reg))
|
||||||
|
rel := obj.Addrel(c.cursym)
|
||||||
|
rel.Off = int32(c.pc)
|
||||||
|
rel.Siz = 4
|
||||||
|
rel.Sym = p.From.Sym
|
||||||
|
rel.Type = objabi.R_LOONG64_GOT_HI
|
||||||
|
rel.Add = 0x0
|
||||||
|
o2 = OP_12IRR(c.opirr(-p.As), uint32(0), uint32(p.To.Reg), uint32(p.To.Reg))
|
||||||
|
rel2 := obj.Addrel(c.cursym)
|
||||||
|
rel2.Off = int32(c.pc + 4)
|
||||||
|
rel2.Siz = 4
|
||||||
|
rel2.Sym = p.From.Sym
|
||||||
|
rel2.Type = objabi.R_LOONG64_GOT_LO
|
||||||
|
rel2.Add = 0x0
|
||||||
}
|
}
|
||||||
|
|
||||||
out[0] = o1
|
out[0] = o1
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ var cnames0 = []string{
|
||||||
"ADDR",
|
"ADDR",
|
||||||
"TLS_LE",
|
"TLS_LE",
|
||||||
"TLS_IE",
|
"TLS_IE",
|
||||||
|
"GOTADDR",
|
||||||
"TEXTSIZE",
|
"TEXTSIZE",
|
||||||
"NCLASS",
|
"NCLASS",
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ package loong64
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"cmd/internal/obj"
|
"cmd/internal/obj"
|
||||||
|
"cmd/internal/objabi"
|
||||||
"cmd/internal/sys"
|
"cmd/internal/sys"
|
||||||
"internal/abi"
|
"internal/abi"
|
||||||
"log"
|
"log"
|
||||||
|
|
@ -84,6 +85,122 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
|
||||||
p.As = AADDVU
|
p.As = AADDVU
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ctxt.Flag_dynlink {
|
||||||
|
rewriteToUseGot(ctxt, p, newprog)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
|
||||||
|
// ADUFFxxx $offset
|
||||||
|
// becomes
|
||||||
|
// MOVV runtime.duffxxx@GOT, REGTMP
|
||||||
|
// ADD $offset, REGTMP
|
||||||
|
// JAL REGTMP
|
||||||
|
if p.As == obj.ADUFFCOPY || p.As == obj.ADUFFZERO {
|
||||||
|
var sym *obj.LSym
|
||||||
|
if p.As == obj.ADUFFZERO {
|
||||||
|
sym = ctxt.Lookup("runtime.duffzero")
|
||||||
|
} else {
|
||||||
|
sym = ctxt.Lookup("runtime.duffcopy")
|
||||||
|
}
|
||||||
|
offset := p.To.Offset
|
||||||
|
p.As = AMOVV
|
||||||
|
p.From.Type = obj.TYPE_MEM
|
||||||
|
p.From.Sym = sym
|
||||||
|
p.From.Name = obj.NAME_GOTREF
|
||||||
|
p.To.Type = obj.TYPE_REG
|
||||||
|
p.To.Reg = REGTMP
|
||||||
|
p.To.Name = obj.NAME_NONE
|
||||||
|
p.To.Offset = 0
|
||||||
|
p.To.Sym = nil
|
||||||
|
p1 := obj.Appendp(p, newprog)
|
||||||
|
p1.As = AADDV
|
||||||
|
p1.From.Type = obj.TYPE_CONST
|
||||||
|
p1.From.Offset = offset
|
||||||
|
p1.To.Type = obj.TYPE_REG
|
||||||
|
p1.To.Reg = REGTMP
|
||||||
|
p2 := obj.Appendp(p1, newprog)
|
||||||
|
p2.As = AJAL
|
||||||
|
p2.To.Type = obj.TYPE_MEM
|
||||||
|
p2.To.Reg = REGTMP
|
||||||
|
}
|
||||||
|
|
||||||
|
// We only care about global data: NAME_EXTERN means a global
|
||||||
|
// symbol in the Go sense, and p.Sym.Local is true for a few
|
||||||
|
// internally defined symbols.
|
||||||
|
if p.From.Type == obj.TYPE_ADDR && p.From.Name == obj.NAME_EXTERN && !p.From.Sym.Local() {
|
||||||
|
// MOVV $sym, Rx becomes MOVV sym@GOT, Rx
|
||||||
|
// MOVV $sym+<off>, Rx becomes MOVV sym@GOT, Rx; ADD <off>, Rx
|
||||||
|
if p.As != AMOVV {
|
||||||
|
ctxt.Diag("do not know how to handle TYPE_ADDR in %v with -shared", p)
|
||||||
|
}
|
||||||
|
if p.To.Type != obj.TYPE_REG {
|
||||||
|
ctxt.Diag("do not know how to handle LEAQ-type insn to non-register in %v with -shared", p)
|
||||||
|
}
|
||||||
|
p.From.Type = obj.TYPE_MEM
|
||||||
|
p.From.Name = obj.NAME_GOTREF
|
||||||
|
if p.From.Offset != 0 {
|
||||||
|
q := obj.Appendp(p, newprog)
|
||||||
|
q.As = AADDV
|
||||||
|
q.From.Type = obj.TYPE_CONST
|
||||||
|
q.From.Offset = p.From.Offset
|
||||||
|
q.To = p.To
|
||||||
|
p.From.Offset = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if p.GetFrom3() != nil && p.GetFrom3().Name == obj.NAME_EXTERN {
|
||||||
|
ctxt.Diag("don't know how to handle %v with -shared", p)
|
||||||
|
}
|
||||||
|
|
||||||
|
var source *obj.Addr
|
||||||
|
// MOVx sym, Ry becomes MOVV sym@GOT, REGTMP; MOVx (REGTMP), Ry
|
||||||
|
// MOVx Ry, sym becomes MOVV sym@GOT, REGTMP; MOVx Ry, (REGTMP)
|
||||||
|
// An addition may be inserted between the two MOVs if there is an offset.
|
||||||
|
if p.From.Name == obj.NAME_EXTERN && !p.From.Sym.Local() {
|
||||||
|
if p.To.Name == obj.NAME_EXTERN && !p.To.Sym.Local() {
|
||||||
|
ctxt.Diag("cannot handle NAME_EXTERN on both sides in %v with -shared", p)
|
||||||
|
}
|
||||||
|
source = &p.From
|
||||||
|
} else if p.To.Name == obj.NAME_EXTERN && !p.To.Sym.Local() {
|
||||||
|
source = &p.To
|
||||||
|
} else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if p.As == obj.ATEXT || p.As == obj.AFUNCDATA || p.As == obj.ACALL || p.As == obj.ARET || p.As == obj.AJMP {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if source.Sym.Type == objabi.STLSBSS {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if source.Type != obj.TYPE_MEM {
|
||||||
|
ctxt.Diag("don't know how to handle %v with -shared", p)
|
||||||
|
}
|
||||||
|
p1 := obj.Appendp(p, newprog)
|
||||||
|
p2 := obj.Appendp(p1, newprog)
|
||||||
|
p1.As = AMOVV
|
||||||
|
p1.From.Type = obj.TYPE_MEM
|
||||||
|
p1.From.Sym = source.Sym
|
||||||
|
p1.From.Name = obj.NAME_GOTREF
|
||||||
|
p1.To.Type = obj.TYPE_REG
|
||||||
|
p1.To.Reg = REGTMP
|
||||||
|
|
||||||
|
p2.As = p.As
|
||||||
|
p2.From = p.From
|
||||||
|
p2.To = p.To
|
||||||
|
if p.From.Name == obj.NAME_EXTERN {
|
||||||
|
p2.From.Reg = REGTMP
|
||||||
|
p2.From.Name = obj.NAME_NONE
|
||||||
|
p2.From.Sym = nil
|
||||||
|
} else if p.To.Name == obj.NAME_EXTERN {
|
||||||
|
p2.To.Reg = REGTMP
|
||||||
|
p2.To.Name = obj.NAME_NONE
|
||||||
|
p2.To.Sym = nil
|
||||||
|
} else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
obj.Nopout(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
||||||
|
|
|
||||||
|
|
@ -345,6 +345,11 @@ const (
|
||||||
R_LOONG64_TLS_IE_PCREL_HI
|
R_LOONG64_TLS_IE_PCREL_HI
|
||||||
R_LOONG64_TLS_IE_LO
|
R_LOONG64_TLS_IE_LO
|
||||||
|
|
||||||
|
// R_LOONG64_GOT_HI and R_LOONG64_GOT_LO resolves a GOT-relative instruction sequence,
|
||||||
|
// usually an pcalau12i followed by another ld or addi instruction.
|
||||||
|
R_LOONG64_GOT_HI
|
||||||
|
R_LOONG64_GOT_LO
|
||||||
|
|
||||||
// R_JMPLOONG64 resolves to non-PC-relative target address of a JMP instruction,
|
// R_JMPLOONG64 resolves to non-PC-relative target address of a JMP instruction,
|
||||||
// by encoding the address into the instruction.
|
// by encoding the address into the instruction.
|
||||||
R_JMPLOONG64
|
R_JMPLOONG64
|
||||||
|
|
|
||||||
|
|
@ -89,19 +89,21 @@ func _() {
|
||||||
_ = x[R_CALLLOONG64-79]
|
_ = x[R_CALLLOONG64-79]
|
||||||
_ = x[R_LOONG64_TLS_IE_PCREL_HI-80]
|
_ = x[R_LOONG64_TLS_IE_PCREL_HI-80]
|
||||||
_ = x[R_LOONG64_TLS_IE_LO-81]
|
_ = x[R_LOONG64_TLS_IE_LO-81]
|
||||||
_ = x[R_JMPLOONG64-82]
|
_ = x[R_LOONG64_GOT_HI-82]
|
||||||
_ = x[R_ADDRMIPSU-83]
|
_ = x[R_LOONG64_GOT_LO-83]
|
||||||
_ = x[R_ADDRMIPSTLS-84]
|
_ = x[R_JMPLOONG64-84]
|
||||||
_ = x[R_ADDRCUOFF-85]
|
_ = x[R_ADDRMIPSU-85]
|
||||||
_ = x[R_WASMIMPORT-86]
|
_ = x[R_ADDRMIPSTLS-86]
|
||||||
_ = x[R_XCOFFREF-87]
|
_ = x[R_ADDRCUOFF-87]
|
||||||
_ = x[R_PEIMAGEOFF-88]
|
_ = x[R_WASMIMPORT-88]
|
||||||
_ = x[R_INITORDER-89]
|
_ = x[R_XCOFFREF-89]
|
||||||
|
_ = x[R_PEIMAGEOFF-90]
|
||||||
|
_ = x[R_INITORDER-91]
|
||||||
}
|
}
|
||||||
|
|
||||||
const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_USEIFACER_USEIFACEMETHODR_USENAMEDMETHODR_METHODOFFR_KEEPR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_DWARFFILEREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_ARM64_GOTR_ARM64_PCRELR_ARM64_PCREL_LDST8R_ARM64_PCREL_LDST16R_ARM64_PCREL_LDST32R_ARM64_PCREL_LDST64R_ARM64_LDST8R_ARM64_LDST16R_ARM64_LDST32R_ARM64_LDST64R_ARM64_LDST128R_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_POWER_TLS_IE_PCREL34R_POWER_TLS_LE_TPREL34R_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_GOT_PCREL34R_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_ADDRPOWER_D34R_ADDRPOWER_PCREL34R_RISCV_JALR_RISCV_JAL_TRAMPR_RISCV_CALLR_RISCV_PCREL_ITYPER_RISCV_PCREL_STYPER_RISCV_TLS_IER_RISCV_TLS_LER_RISCV_GOT_HI20R_RISCV_PCREL_HI20R_RISCV_PCREL_LO12_IR_RISCV_PCREL_LO12_SR_RISCV_BRANCHR_RISCV_RVC_BRANCHR_RISCV_RVC_JUMPR_PCRELDBLR_ADDRLOONG64R_ADDRLOONG64UR_ADDRLOONG64TLSR_ADDRLOONG64TLSUR_CALLLOONG64R_LOONG64_TLS_IE_PCREL_HIR_LOONG64_TLS_IE_LOR_JMPLOONG64R_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORTR_XCOFFREFR_PEIMAGEOFFR_INITORDER"
|
const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_USEIFACER_USEIFACEMETHODR_USENAMEDMETHODR_METHODOFFR_KEEPR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_DWARFFILEREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_ARM64_GOTR_ARM64_PCRELR_ARM64_PCREL_LDST8R_ARM64_PCREL_LDST16R_ARM64_PCREL_LDST32R_ARM64_PCREL_LDST64R_ARM64_LDST8R_ARM64_LDST16R_ARM64_LDST32R_ARM64_LDST64R_ARM64_LDST128R_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_POWER_TLS_IE_PCREL34R_POWER_TLS_LE_TPREL34R_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_GOT_PCREL34R_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_ADDRPOWER_D34R_ADDRPOWER_PCREL34R_RISCV_JALR_RISCV_JAL_TRAMPR_RISCV_CALLR_RISCV_PCREL_ITYPER_RISCV_PCREL_STYPER_RISCV_TLS_IER_RISCV_TLS_LER_RISCV_GOT_HI20R_RISCV_PCREL_HI20R_RISCV_PCREL_LO12_IR_RISCV_PCREL_LO12_SR_RISCV_BRANCHR_RISCV_RVC_BRANCHR_RISCV_RVC_JUMPR_PCRELDBLR_ADDRLOONG64R_ADDRLOONG64UR_ADDRLOONG64TLSR_ADDRLOONG64TLSUR_CALLLOONG64R_LOONG64_TLS_IE_PCREL_HIR_LOONG64_TLS_IE_LOR_LOONG64_GOT_HIR_LOONG64_GOT_LOR_JMPLOONG64R_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORTR_XCOFFREFR_PEIMAGEOFFR_INITORDER"
|
||||||
|
|
||||||
var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 53, 59, 68, 79, 88, 99, 109, 116, 123, 131, 139, 147, 153, 159, 165, 175, 184, 194, 210, 226, 237, 243, 254, 264, 273, 286, 300, 314, 328, 344, 355, 368, 387, 407, 427, 447, 460, 474, 488, 502, 517, 531, 545, 556, 578, 600, 614, 629, 652, 669, 687, 708, 723, 742, 753, 770, 782, 801, 820, 834, 848, 864, 882, 902, 922, 936, 954, 970, 980, 993, 1007, 1023, 1040, 1053, 1078, 1097, 1109, 1120, 1133, 1144, 1156, 1166, 1178, 1189}
|
var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 53, 59, 68, 79, 88, 99, 109, 116, 123, 131, 139, 147, 153, 159, 165, 175, 184, 194, 210, 226, 237, 243, 254, 264, 273, 286, 300, 314, 328, 344, 355, 368, 387, 407, 427, 447, 460, 474, 488, 502, 517, 531, 545, 556, 578, 600, 614, 629, 652, 669, 687, 708, 723, 742, 753, 770, 782, 801, 820, 834, 848, 864, 882, 902, 922, 936, 954, 970, 980, 993, 1007, 1023, 1040, 1053, 1078, 1097, 1113, 1129, 1141, 1152, 1165, 1176, 1188, 1198, 1210, 1221}
|
||||||
|
|
||||||
func (i RelocType) String() string {
|
func (i RelocType) String() string {
|
||||||
i -= 1
|
i -= 1
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,16 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
|
||||||
out.Write64(uint64(sectoff))
|
out.Write64(uint64(sectoff))
|
||||||
out.Write64(uint64(elf.R_LARCH_PCALA_HI20) | uint64(elfsym)<<32)
|
out.Write64(uint64(elf.R_LARCH_PCALA_HI20) | uint64(elfsym)<<32)
|
||||||
out.Write64(uint64(r.Xadd))
|
out.Write64(uint64(r.Xadd))
|
||||||
|
|
||||||
|
case objabi.R_LOONG64_GOT_HI:
|
||||||
|
out.Write64(uint64(sectoff))
|
||||||
|
out.Write64(uint64(elf.R_LARCH_GOT_PC_HI20) | uint64(elfsym)<<32)
|
||||||
|
out.Write64(uint64(0x0))
|
||||||
|
|
||||||
|
case objabi.R_LOONG64_GOT_LO:
|
||||||
|
out.Write64(uint64(sectoff))
|
||||||
|
out.Write64(uint64(elf.R_LARCH_GOT_PC_LO12) | uint64(elfsym)<<32)
|
||||||
|
out.Write64(uint64(0x0))
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|
@ -111,7 +121,9 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
|
||||||
objabi.R_CALLLOONG64,
|
objabi.R_CALLLOONG64,
|
||||||
objabi.R_JMPLOONG64,
|
objabi.R_JMPLOONG64,
|
||||||
objabi.R_LOONG64_TLS_IE_PCREL_HI,
|
objabi.R_LOONG64_TLS_IE_PCREL_HI,
|
||||||
objabi.R_LOONG64_TLS_IE_LO:
|
objabi.R_LOONG64_TLS_IE_LO,
|
||||||
|
objabi.R_LOONG64_GOT_HI,
|
||||||
|
objabi.R_LOONG64_GOT_LO:
|
||||||
return val, 1, true
|
return val, 1, true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -156,7 +168,10 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant
|
||||||
func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc, s loader.Sym) (loader.ExtReloc, bool) {
|
func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc, s loader.Sym) (loader.ExtReloc, bool) {
|
||||||
switch r.Type() {
|
switch r.Type() {
|
||||||
case objabi.R_ADDRLOONG64,
|
case objabi.R_ADDRLOONG64,
|
||||||
objabi.R_ADDRLOONG64U:
|
objabi.R_ADDRLOONG64U,
|
||||||
|
objabi.R_LOONG64_GOT_HI,
|
||||||
|
objabi.R_LOONG64_GOT_LO:
|
||||||
|
|
||||||
return ld.ExtrelocViaOuterSym(ldr, r, s), true
|
return ld.ExtrelocViaOuterSym(ldr, r, s), true
|
||||||
|
|
||||||
case objabi.R_ADDRLOONG64TLS,
|
case objabi.R_ADDRLOONG64TLS,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue