Skip to content

Commit 19e2e3c

Browse files
committed
cmd/internal/obj/arm64: avoid unnecessary pool literal usage for load/store pairs
Implement better classification for load and store pair operations. This in turn allows us to avoid using pool literals when the offset fits in a 24 bit unsigned immediate. In this case, the offset can be calculated using two add immediate instructions, rather than loading the offset from the pool literal and then adding the offset to the base register. This requires the same number of instructions, however avoids a load from memory and does not require the offset to be stored in the literal pool. Updates #59615 Change-Id: I316ec3d54f1d06ae9d930e98d0c32471775fcb26 Reviewed-on: https://go-review.googlesource.com/c/go/+/515615 Run-TryBot: Joel Sing <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Joedian Reid <[email protected]> Reviewed-by: Cherry Mui <[email protected]>
1 parent b2e809b commit 19e2e3c

File tree

1 file changed

+130
-15
lines changed

1 file changed

+130
-15
lines changed

src/cmd/internal/obj/arm64/asm7.go

+130-15
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,8 @@ var optab = []Optab{
710710
{AFLDPQ, C_PQAUTO_16, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, REGSP, 0, 0},
711711
{AFLDPQ, C_UAUTO4K, C_NONE, C_NONE, C_PAIR, C_NONE, 74, 8, REGSP, 0, 0},
712712
{AFLDPQ, C_NAUTO4K, C_NONE, C_NONE, C_PAIR, C_NONE, 74, 8, REGSP, 0, 0},
713-
{AFLDPQ, C_LAUTO, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, REGSP, LFROM, 0},
713+
{AFLDPQ, C_LAUTO, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, REGSP, 0, 0},
714+
{AFLDPQ, C_LAUTOPOOL, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, REGSP, LFROM, 0},
714715
{AFLDPQ, C_NQOREG_16, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, 0, 0, 0},
715716
{AFLDPQ, C_NQOREG_16, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, 0, 0, C_XPRE},
716717
{AFLDPQ, C_NQOREG_16, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, 0, 0, C_XPOST},
@@ -719,14 +720,16 @@ var optab = []Optab{
719720
{AFLDPQ, C_PQOREG_16, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, 0, 0, C_XPOST},
720721
{AFLDPQ, C_UOREG4K, C_NONE, C_NONE, C_PAIR, C_NONE, 74, 8, 0, 0, 0},
721722
{AFLDPQ, C_NOREG4K, C_NONE, C_NONE, C_PAIR, C_NONE, 74, 8, 0, 0, 0},
722-
{AFLDPQ, C_LOREG, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, 0, LFROM, 0},
723+
{AFLDPQ, C_LOREG, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, 0, 0, 0},
724+
{AFLDPQ, C_LOREGPOOL, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, 0, LFROM, 0},
723725
{AFLDPQ, C_ADDR, C_NONE, C_NONE, C_PAIR, C_NONE, 88, 12, 0, 0, 0},
724726

725727
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_NQAUTO_16, C_NONE, 67, 4, REGSP, 0, 0},
726728
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_PQAUTO_16, C_NONE, 67, 4, REGSP, 0, 0},
727729
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_UAUTO4K, C_NONE, 76, 8, REGSP, 0, 0},
728730
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_NAUTO4K, C_NONE, 76, 8, REGSP, 0, 0},
729-
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_LAUTO, C_NONE, 77, 12, REGSP, LTO, 0},
731+
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_LAUTO, C_NONE, 77, 12, REGSP, 0, 0},
732+
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_LAUTOPOOL, C_NONE, 77, 12, REGSP, LTO, 0},
730733
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_NQOREG_16, C_NONE, 67, 4, 0, 0, 0},
731734
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_NQOREG_16, C_NONE, 67, 4, 0, 0, C_XPRE},
732735
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_NQOREG_16, C_NONE, 67, 4, 0, 0, C_XPOST},
@@ -735,14 +738,16 @@ var optab = []Optab{
735738
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_PQOREG_16, C_NONE, 67, 4, 0, 0, C_XPOST},
736739
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_UOREG4K, C_NONE, 76, 8, 0, 0, 0},
737740
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_NOREG4K, C_NONE, 76, 8, 0, 0, 0},
738-
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_LOREG, C_NONE, 77, 12, 0, LTO, 0},
741+
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_LOREG, C_NONE, 77, 12, 0, 0, 0},
742+
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_LOREGPOOL, C_NONE, 77, 12, 0, LTO, 0},
739743
{AFSTPQ, C_PAIR, C_NONE, C_NONE, C_ADDR, C_NONE, 87, 12, 0, 0, 0},
740744

741745
{ALDP, C_NPAUTO, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, REGSP, 0, 0},
742746
{ALDP, C_PPAUTO, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, REGSP, 0, 0},
743747
{ALDP, C_UAUTO4K, C_NONE, C_NONE, C_PAIR, C_NONE, 74, 8, REGSP, 0, 0},
744748
{ALDP, C_NAUTO4K, C_NONE, C_NONE, C_PAIR, C_NONE, 74, 8, REGSP, 0, 0},
745-
{ALDP, C_LAUTO, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, REGSP, LFROM, 0},
749+
{ALDP, C_LAUTO, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, REGSP, 0, 0},
750+
{ALDP, C_LAUTOPOOL, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, REGSP, LFROM, 0},
746751
{ALDP, C_NPOREG, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, 0, 0, 0},
747752
{ALDP, C_NPOREG, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, 0, 0, C_XPRE},
748753
{ALDP, C_NPOREG, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, 0, 0, C_XPOST},
@@ -751,14 +756,16 @@ var optab = []Optab{
751756
{ALDP, C_PPOREG, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, 0, 0, C_XPOST},
752757
{ALDP, C_UOREG4K, C_NONE, C_NONE, C_PAIR, C_NONE, 74, 8, 0, 0, 0},
753758
{ALDP, C_NOREG4K, C_NONE, C_NONE, C_PAIR, C_NONE, 74, 8, 0, 0, 0},
754-
{ALDP, C_LOREG, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, 0, LFROM, 0},
759+
{ALDP, C_LOREG, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, 0, 0, 0},
760+
{ALDP, C_LOREGPOOL, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, 0, LFROM, 0},
755761
{ALDP, C_ADDR, C_NONE, C_NONE, C_PAIR, C_NONE, 88, 12, 0, 0, 0},
756762

757763
{ASTP, C_PAIR, C_NONE, C_NONE, C_NPAUTO, C_NONE, 67, 4, REGSP, 0, 0},
758764
{ASTP, C_PAIR, C_NONE, C_NONE, C_PPAUTO, C_NONE, 67, 4, REGSP, 0, 0},
759765
{ASTP, C_PAIR, C_NONE, C_NONE, C_UAUTO4K, C_NONE, 76, 8, REGSP, 0, 0},
760766
{ASTP, C_PAIR, C_NONE, C_NONE, C_NAUTO4K, C_NONE, 76, 8, REGSP, 0, 0},
761-
{ASTP, C_PAIR, C_NONE, C_NONE, C_LAUTO, C_NONE, 77, 12, REGSP, LTO, 0},
767+
{ASTP, C_PAIR, C_NONE, C_NONE, C_LAUTO, C_NONE, 77, 12, REGSP, 0, 0},
768+
{ASTP, C_PAIR, C_NONE, C_NONE, C_LAUTOPOOL, C_NONE, 77, 12, REGSP, LTO, 0},
762769
{ASTP, C_PAIR, C_NONE, C_NONE, C_NPOREG, C_NONE, 67, 4, 0, 0, 0},
763770
{ASTP, C_PAIR, C_NONE, C_NONE, C_NPOREG, C_NONE, 67, 4, 0, 0, C_XPRE},
764771
{ASTP, C_PAIR, C_NONE, C_NONE, C_NPOREG, C_NONE, 67, 4, 0, 0, C_XPOST},
@@ -767,15 +774,17 @@ var optab = []Optab{
767774
{ASTP, C_PAIR, C_NONE, C_NONE, C_PPOREG, C_NONE, 67, 4, 0, 0, C_XPOST},
768775
{ASTP, C_PAIR, C_NONE, C_NONE, C_UOREG4K, C_NONE, 76, 8, 0, 0, 0},
769776
{ASTP, C_PAIR, C_NONE, C_NONE, C_NOREG4K, C_NONE, 76, 8, 0, 0, 0},
770-
{ASTP, C_PAIR, C_NONE, C_NONE, C_LOREG, C_NONE, 77, 12, 0, LTO, 0},
777+
{ASTP, C_PAIR, C_NONE, C_NONE, C_LOREG, C_NONE, 77, 12, 0, 0, 0},
778+
{ASTP, C_PAIR, C_NONE, C_NONE, C_LOREGPOOL, C_NONE, 77, 12, 0, LTO, 0},
771779
{ASTP, C_PAIR, C_NONE, C_NONE, C_ADDR, C_NONE, 87, 12, 0, 0, 0},
772780

773781
// differ from LDP/STP for C_NSAUTO_4/C_PSAUTO_4/C_NSOREG_4/C_PSOREG_4
774782
{ALDPW, C_NSAUTO_4, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, REGSP, 0, 0},
775783
{ALDPW, C_PSAUTO_4, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, REGSP, 0, 0},
776784
{ALDPW, C_UAUTO4K, C_NONE, C_NONE, C_PAIR, C_NONE, 74, 8, REGSP, 0, 0},
777785
{ALDPW, C_NAUTO4K, C_NONE, C_NONE, C_PAIR, C_NONE, 74, 8, REGSP, 0, 0},
778-
{ALDPW, C_LAUTO, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, REGSP, LFROM, 0},
786+
{ALDPW, C_LAUTO, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, REGSP, 0, 0},
787+
{ALDPW, C_LAUTOPOOL, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, REGSP, LFROM, 0},
779788
{ALDPW, C_NSOREG_4, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, 0, 0, 0},
780789
{ALDPW, C_NSOREG_4, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, 0, 0, C_XPRE},
781790
{ALDPW, C_NSOREG_4, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, 0, 0, C_XPOST},
@@ -784,14 +793,16 @@ var optab = []Optab{
784793
{ALDPW, C_PSOREG_4, C_NONE, C_NONE, C_PAIR, C_NONE, 66, 4, 0, 0, C_XPOST},
785794
{ALDPW, C_UOREG4K, C_NONE, C_NONE, C_PAIR, C_NONE, 74, 8, 0, 0, 0},
786795
{ALDPW, C_NOREG4K, C_NONE, C_NONE, C_PAIR, C_NONE, 74, 8, 0, 0, 0},
787-
{ALDPW, C_LOREG, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, 0, LFROM, 0},
796+
{ALDPW, C_LOREG, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, 0, 0, 0},
797+
{ALDPW, C_LOREGPOOL, C_NONE, C_NONE, C_PAIR, C_NONE, 75, 12, 0, LFROM, 0},
788798
{ALDPW, C_ADDR, C_NONE, C_NONE, C_PAIR, C_NONE, 88, 12, 0, 0, 0},
789799

790800
{ASTPW, C_PAIR, C_NONE, C_NONE, C_NSAUTO_4, C_NONE, 67, 4, REGSP, 0, 0},
791801
{ASTPW, C_PAIR, C_NONE, C_NONE, C_PSAUTO_4, C_NONE, 67, 4, REGSP, 0, 0},
792802
{ASTPW, C_PAIR, C_NONE, C_NONE, C_UAUTO4K, C_NONE, 76, 8, REGSP, 0, 0},
793803
{ASTPW, C_PAIR, C_NONE, C_NONE, C_NAUTO4K, C_NONE, 76, 8, REGSP, 0, 0},
794-
{ASTPW, C_PAIR, C_NONE, C_NONE, C_LAUTO, C_NONE, 77, 12, REGSP, LTO, 0},
804+
{ASTPW, C_PAIR, C_NONE, C_NONE, C_LAUTO, C_NONE, 77, 12, REGSP, 0, 0},
805+
{ASTPW, C_PAIR, C_NONE, C_NONE, C_LAUTOPOOL, C_NONE, 77, 12, REGSP, LTO, 0},
795806
{ASTPW, C_PAIR, C_NONE, C_NONE, C_NSOREG_4, C_NONE, 67, 4, 0, 0, 0},
796807
{ASTPW, C_PAIR, C_NONE, C_NONE, C_NSOREG_4, C_NONE, 67, 4, 0, 0, C_XPRE},
797808
{ASTPW, C_PAIR, C_NONE, C_NONE, C_NSOREG_4, C_NONE, 67, 4, 0, 0, C_XPOST},
@@ -800,7 +811,8 @@ var optab = []Optab{
800811
{ASTPW, C_PAIR, C_NONE, C_NONE, C_PSOREG_4, C_NONE, 67, 4, 0, 0, C_XPOST},
801812
{ASTPW, C_PAIR, C_NONE, C_NONE, C_UOREG4K, C_NONE, 76, 8, 0, 0, 0},
802813
{ASTPW, C_PAIR, C_NONE, C_NONE, C_NOREG4K, C_NONE, 76, 8, 0, 0, 0},
803-
{ASTPW, C_PAIR, C_NONE, C_NONE, C_LOREG, C_NONE, 77, 12, 0, LTO, 0},
814+
{ASTPW, C_PAIR, C_NONE, C_NONE, C_LOREG, C_NONE, 77, 12, 0, 0, 0},
815+
{ASTPW, C_PAIR, C_NONE, C_NONE, C_LOREGPOOL, C_NONE, 77, 12, 0, LTO, 0},
804816
{ASTPW, C_PAIR, C_NONE, C_NONE, C_ADDR, C_NONE, 87, 12, 0, 0, 0},
805817

806818
{ASWPD, C_ZREG, C_NONE, C_NONE, C_ZOREG, C_ZREG, 47, 4, 0, 0, 0},
@@ -1479,6 +1491,14 @@ func isNEGop(op obj.As) bool {
14791491
return false
14801492
}
14811493

1494+
func isLoadStorePairOp(op obj.As) bool {
1495+
switch op {
1496+
case AFLDPQ, AFSTPQ, ALDP, ASTP, ALDPW, ASTPW:
1497+
return true
1498+
}
1499+
return false
1500+
}
1501+
14821502
func isMOVop(op obj.As) bool {
14831503
switch op {
14841504
case AMOVB, AMOVBU, AMOVH, AMOVHU, AMOVW, AMOVWU, AMOVD, AFMOVS, AFMOVD, AFMOVQ:
@@ -1984,6 +2004,33 @@ func (c *ctxt7) loadStoreClass(p *obj.Prog, lsc int, v int64) int {
19842004
return lsc
19852005
}
19862006

2007+
// loadStorePairClass reclassifies a load or store pair operation based on its offset.
2008+
func (c *ctxt7) loadStorePairClass(p *obj.Prog, lsc int, v int64) int {
2009+
// Avoid reclassification of pre/post-indexed loads and stores.
2010+
if p.Scond == C_XPRE || p.Scond == C_XPOST {
2011+
return lsc
2012+
}
2013+
2014+
if cmp(C_NAUTO4K, lsc) || cmp(C_NOREG4K, lsc) {
2015+
return lsc
2016+
}
2017+
if cmp(C_UAUTO4K, lsc) || cmp(C_UOREG4K, lsc) {
2018+
return lsc
2019+
}
2020+
2021+
needsPool := true
2022+
if v >= 0 && v <= 0xffffff {
2023+
needsPool = false
2024+
}
2025+
if needsPool && cmp(C_LAUTO, lsc) {
2026+
return C_LAUTOPOOL
2027+
}
2028+
if needsPool && cmp(C_LOREG, lsc) {
2029+
return C_LOREGPOOL
2030+
}
2031+
return lsc
2032+
}
2033+
19872034
func (c *ctxt7) aclass(a *obj.Addr) int {
19882035
switch a.Type {
19892036
case obj.TYPE_NONE:
@@ -2212,6 +2259,10 @@ func (c *ctxt7) oplook(p *obj.Prog) *Optab {
22122259
// More specific classification of large offset loads and stores.
22132260
a1 = c.loadStoreClass(p, a1, c.instoffset)
22142261
}
2262+
if isLoadStorePairOp(p.As) && (cmp(C_LAUTO, a1) || cmp(C_LOREG, a1)) {
2263+
// More specific classification of large offset loads and stores.
2264+
a1 = c.loadStorePairClass(p, a1, c.instoffset)
2265+
}
22152266
}
22162267
p.From.Class = int8(a1)
22172268
}
@@ -2238,6 +2289,10 @@ func (c *ctxt7) oplook(p *obj.Prog) *Optab {
22382289
// More specific classification of large offset loads and stores.
22392290
a4 = c.loadStoreClass(p, a4, c.instoffset)
22402291
}
2292+
if isLoadStorePairOp(p.As) && (cmp(C_LAUTO, a4) || cmp(C_LOREG, a4)) {
2293+
// More specific classification of large offset loads and stores.
2294+
a4 = c.loadStorePairClass(p, a4, c.instoffset)
2295+
}
22412296
}
22422297
p.To.Class = int8(a4)
22432298
}
@@ -4035,12 +4090,12 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
40354090
break
40364091

40374092
storeusepool:
4038-
if r == REGTMP || p.From.Reg == REGTMP {
4039-
c.ctxt.Diag("REGTMP used in large offset store: %v", p)
4040-
}
40414093
if p.Pool == nil {
40424094
c.ctxt.Diag("%v: constant is not in pool", p)
40434095
}
4096+
if r == REGTMP || p.From.Reg == REGTMP {
4097+
c.ctxt.Diag("REGTMP used in large offset store: %v", p)
4098+
}
40444099
o1 = c.omovlit(AMOVD, p, &p.To, REGTMP)
40454100
o2 = c.olsxrr(p, int32(c.opstrr(p, p.As, false)), int(p.From.Reg), int(r), REGTMP)
40464101

@@ -4831,6 +4886,11 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
48314886
o2 = c.opldpstp(p, o, 0, REGTMP, rt1, rt2, 1)
48324887

48334888
case 75:
4889+
// If offset L fits in a 24 bit unsigned immediate:
4890+
// add $lo, R, Rtmp
4891+
// add $hi, Rtmp, Rtmp
4892+
// ldr (Rtmp), R
4893+
// Otherwise, use constant pool:
48344894
// mov $L, Rtmp (from constant pool)
48354895
// add Rtmp, R, Rtmp
48364896
// ldp (Rtmp), (R1, R2)
@@ -4844,6 +4904,31 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
48444904
if rf == obj.REG_NONE {
48454905
c.ctxt.Diag("invalid ldp source: %v", p)
48464906
}
4907+
4908+
v := c.regoff(&p.From)
4909+
if v >= -4095 && v <= 4095 {
4910+
c.ctxt.Diag("%v: bad type for offset %d (should be add/sub+ldp)", p, v)
4911+
}
4912+
4913+
hi, lo, err := splitImm24uScaled(v, 0)
4914+
if err != nil {
4915+
goto loadpairusepool
4916+
}
4917+
if p.Pool != nil {
4918+
c.ctxt.Diag("%v: unused constant in pool (%v)\n", p, v)
4919+
}
4920+
o1 = c.oaddi(p, AADD, lo, REGTMP, int16(rf))
4921+
o2 = c.oaddi(p, AADD, hi, REGTMP, REGTMP)
4922+
o3 = c.opldpstp(p, o, 0, REGTMP, rt1, rt2, 1)
4923+
break
4924+
4925+
loadpairusepool:
4926+
if p.Pool == nil {
4927+
c.ctxt.Diag("%v: constant is not in pool", p)
4928+
}
4929+
if rf == REGTMP || p.From.Reg == REGTMP {
4930+
c.ctxt.Diag("REGTMP used in large offset load: %v", p)
4931+
}
48474932
o1 = c.omovlit(AMOVD, p, &p.From, REGTMP)
48484933
o2 = c.opxrrr(p, AADD, REGTMP, rf, REGTMP, false)
48494934
o3 = c.opldpstp(p, o, 0, REGTMP, rt1, rt2, 1)
@@ -4866,6 +4951,11 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
48664951
o2 = c.opldpstp(p, o, 0, REGTMP, rf1, rf2, 0)
48674952

48684953
case 77:
4954+
// If offset L fits in a 24 bit unsigned immediate:
4955+
// add $lo, R, Rtmp
4956+
// add $hi, Rtmp, Rtmp
4957+
// stp (R1, R2), (Rtmp)
4958+
// Otherwise, use constant pool:
48694959
// mov $L, Rtmp (from constant pool)
48704960
// add Rtmp, R, Rtmp
48714961
// stp (R1, R2), (Rtmp)
@@ -4879,6 +4969,31 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
48794969
if rt == obj.REG_NONE {
48804970
c.ctxt.Diag("invalid stp destination: %v", p)
48814971
}
4972+
4973+
v := c.regoff(&p.To)
4974+
if v >= -4095 && v <= 4095 {
4975+
c.ctxt.Diag("%v: bad type for offset %d (should be add/sub+stp)", p, v)
4976+
}
4977+
4978+
hi, lo, err := splitImm24uScaled(v, 0)
4979+
if err != nil {
4980+
goto storepairusepool
4981+
}
4982+
if p.Pool != nil {
4983+
c.ctxt.Diag("%v: unused constant in pool (%v)\n", p, v)
4984+
}
4985+
o1 = c.oaddi(p, AADD, lo, REGTMP, int16(rt))
4986+
o2 = c.oaddi(p, AADD, hi, REGTMP, REGTMP)
4987+
o3 = c.opldpstp(p, o, 0, REGTMP, rf1, rf2, 0)
4988+
break
4989+
4990+
storepairusepool:
4991+
if p.Pool == nil {
4992+
c.ctxt.Diag("%v: constant is not in pool", p)
4993+
}
4994+
if rt == REGTMP || p.From.Reg == REGTMP {
4995+
c.ctxt.Diag("REGTMP used in large offset store: %v", p)
4996+
}
48824997
o1 = c.omovlit(AMOVD, p, &p.To, REGTMP)
48834998
o2 = c.opxrrr(p, AADD, REGTMP, rt, REGTMP, false)
48844999
o3 = c.opldpstp(p, o, 0, REGTMP, rf1, rf2, 0)

0 commit comments

Comments
 (0)