Skip to content

Commit e7c7f33

Browse files
committed
cmd/internal/obj/arm64: factor out code generation for addition of 12 bit immediates
Factor out and simplify code that generates the addition of a 12 bit immediate (the addition of a negative value is still handled via subtraction). This also fixes the mishandling of the case where v is 0. Change-Id: I6040f33d2fec87b772272531b3bf02390ae7f200 Reviewed-on: https://go-review.googlesource.com/c/go/+/461141 TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Eric Fang <[email protected]> Reviewed-by: Than McIntosh <[email protected]> Run-TryBot: Joel Sing <[email protected]> Reviewed-by: Cherry Mui <[email protected]>
1 parent f76fc28 commit e7c7f33

File tree

1 file changed

+23
-33
lines changed

1 file changed

+23
-33
lines changed

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

+23-33
Original file line numberDiff line numberDiff line change
@@ -4678,27 +4678,15 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
46784678
case 74:
46794679
// add $O, R, Rtmp or sub $O, R, Rtmp
46804680
// ldp (Rtmp), (R1, R2)
4681-
r := int(p.From.Reg)
4682-
if r == obj.REG_NONE {
4683-
r = int(o.param)
4681+
rf := p.From.Reg
4682+
if rf == obj.REG_NONE {
4683+
rf = o.param
46844684
}
4685-
if r == obj.REG_NONE {
4685+
if rf == obj.REG_NONE {
46864686
c.ctxt.Diag("invalid ldp source: %v", p)
46874687
}
46884688
v := int32(c.regoff(&p.From))
4689-
4690-
if v > 0 {
4691-
if v > 4095 {
4692-
c.ctxt.Diag("offset out of range: %v", p)
4693-
}
4694-
o1 = c.oaddi(p, int32(c.opirr(p, AADD)), v, r, REGTMP)
4695-
}
4696-
if v < 0 {
4697-
if v < -4095 {
4698-
c.ctxt.Diag("offset out of range: %v", p)
4699-
}
4700-
o1 = c.oaddi(p, int32(c.opirr(p, ASUB)), -v, r, REGTMP)
4701-
}
4689+
o1 = c.oaddi12(p, v, REGTMP, rf)
47024690
o2 = c.opldpstp(p, o, 0, uint32(REGTMP), uint32(p.To.Reg), uint32(p.To.Offset), 1)
47034691

47044692
case 75:
@@ -4728,26 +4716,15 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
47284716
if p.From.Reg == REGTMP || p.From.Offset == REGTMP {
47294717
c.ctxt.Diag("cannot use REGTMP as source: %v", p)
47304718
}
4731-
r := int(p.To.Reg)
4732-
if r == obj.REG_NONE {
4733-
r = int(o.param)
4719+
rt := p.To.Reg
4720+
if rt == obj.REG_NONE {
4721+
rt = o.param
47344722
}
4735-
if r == obj.REG_NONE {
4723+
if rt == obj.REG_NONE {
47364724
c.ctxt.Diag("invalid stp destination: %v", p)
47374725
}
47384726
v := int32(c.regoff(&p.To))
4739-
if v > 0 {
4740-
if v > 4095 {
4741-
c.ctxt.Diag("offset out of range: %v", p)
4742-
}
4743-
o1 = c.oaddi(p, int32(c.opirr(p, AADD)), v, r, REGTMP)
4744-
}
4745-
if v < 0 {
4746-
if v < -4095 {
4747-
c.ctxt.Diag("offset out of range: %v", p)
4748-
}
4749-
o1 = c.oaddi(p, int32(c.opirr(p, ASUB)), -v, r, REGTMP)
4750-
}
4727+
o1 = c.oaddi12(p, v, REGTMP, rt)
47514728
o2 = c.opldpstp(p, o, 0, uint32(REGTMP), uint32(p.From.Reg), uint32(p.From.Offset), 0)
47524729

47534730
case 77:
@@ -7146,6 +7123,19 @@ func (c *ctxt7) oaddi(p *obj.Prog, o1 int32, v int32, r int, rt int) uint32 {
71467123
return uint32(o1)
71477124
}
71487125

7126+
func (c *ctxt7) oaddi12(p *obj.Prog, v int32, rd, rn int16) uint32 {
7127+
if v < -4095 || v > 4095 {
7128+
c.ctxt.Diag("%v is not a 12 bit immediate: %v", v, p)
7129+
return 0
7130+
}
7131+
a := AADD
7132+
if v < 0 {
7133+
a = ASUB
7134+
v = -v
7135+
}
7136+
return c.oaddi(p, int32(c.opirr(p, a)), v, int(rn), int(rd))
7137+
}
7138+
71497139
/*
71507140
* load a literal value into dr
71517141
*/

0 commit comments

Comments
 (0)