Skip to content

Commit 8b67cf0

Browse files
committed
cmd/internal/obj/arm64: pass obj.As to oaddi rather than an instruction
This simplifies callers, as they do not need to call opirr before calling oaddi. Additionally, use appropriate types (int16) for registers, which avoids the need to continually cast. Change-Id: I8ca3807a97867ac49d63792f6922a18f35824448 Reviewed-on: https://go-review.googlesource.com/c/go/+/471520 Reviewed-by: Cherry Mui <[email protected]> Run-TryBot: Joel Sing <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]> TryBot-Result: Gopher Robot <[email protected]>
1 parent 19fd965 commit 8b67cf0

File tree

1 file changed

+29
-33
lines changed

1 file changed

+29
-33
lines changed

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

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3359,20 +3359,18 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
33593359
}
33603360
o1 = c.opirr(p, p.As)
33613361

3362-
rt := int(p.To.Reg)
3362+
rt, r := p.To.Reg, p.Reg
33633363
if p.To.Type == obj.TYPE_NONE {
33643364
if (o1 & Sbit) == 0 {
33653365
c.ctxt.Diag("ineffective ZR destination\n%v", p)
33663366
}
33673367
rt = REGZERO
33683368
}
3369-
3370-
r := int(p.Reg)
33713369
if r == obj.REG_NONE {
33723370
r = rt
33733371
}
33743372
v := c.regoff(&p.From)
3375-
o1 = c.oaddi(p, int32(o1), v, r, rt)
3373+
o1 = c.oaddi(p, p.As, v, rt, r)
33763374

33773375
case 3: /* op R<<n[,R],R (shifted register) */
33783376
o1 = c.oprrr(p, p.As)
@@ -3400,36 +3398,32 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
34003398
o1 |= (uint32(r&31) << 5) | uint32(rt&31)
34013399

34023400
case 4: /* mov $addcon, R; mov $recon, R; mov $racon, R; mov $addcon2, R */
3403-
rt := int(p.To.Reg)
3404-
r := int(o.param)
3405-
3401+
rt, r := p.To.Reg, o.param
34063402
if r == obj.REG_NONE {
34073403
r = REGZERO
34083404
} else if r == REGFROM {
3409-
r = int(p.From.Reg)
3405+
r = p.From.Reg
34103406
}
34113407
if r == obj.REG_NONE {
34123408
r = REGSP
34133409
}
34143410

34153411
v := c.regoff(&p.From)
3416-
var op int32
3412+
a := AADD
34173413
if v < 0 {
3414+
a = ASUB
34183415
v = -v
3419-
op = int32(c.opirr(p, ASUB))
3420-
} else {
3421-
op = int32(c.opirr(p, AADD))
34223416
}
34233417

3424-
if int(o.size(c.ctxt, p)) == 8 {
3418+
if o.size(c.ctxt, p) == 8 {
34253419
// NOTE: this case does not use REGTMP. If it ever does,
34263420
// remove the NOTUSETMP flag in optab.
3427-
o1 = c.oaddi(p, op, v&0xfff000, r, rt)
3428-
o2 = c.oaddi(p, op, v&0x000fff, rt, rt)
3421+
o1 = c.oaddi(p, a, v&0xfff000, rt, r)
3422+
o2 = c.oaddi(p, a, v&0x000fff, rt, rt)
34293423
break
34303424
}
34313425

3432-
o1 = c.oaddi(p, op, v, r, rt)
3426+
o1 = c.oaddi(p, a, v, rt, r)
34333427

34343428
case 5: /* b s; bl s */
34353429
o1 = c.opbra(p, p.As)
@@ -3889,9 +3883,9 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
38893883
c.ctxt.Diag("unexpected long move, op %v tab %v\n%v", p.As, o.as, p)
38903884
}
38913885

3892-
r := int(p.To.Reg)
3886+
r := p.To.Reg
38933887
if r == obj.REG_NONE {
3894-
r = int(o.param)
3888+
r = o.param
38953889
}
38963890

38973891
v := c.regoff(&p.To)
@@ -3910,7 +3904,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
39103904
goto storeusepool
39113905
}
39123906

3913-
o1 = c.oaddi(p, int32(c.opirr(p, AADD)), hi, r, REGTMP)
3907+
o1 = c.oaddi(p, AADD, hi, REGTMP, r)
39143908
o2 = c.olsr12u(p, c.opstr(p, p.As), ((v-hi)>>uint(s))&0xFFF, REGTMP, p.From.Reg)
39153909
break
39163910

@@ -3919,7 +3913,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
39193913
c.ctxt.Diag("REGTMP used in large offset store: %v", p)
39203914
}
39213915
o1 = c.omovlit(AMOVD, p, &p.To, REGTMP)
3922-
o2 = c.olsxrr(p, int32(c.opstrr(p, p.As, false)), int(p.From.Reg), r, REGTMP)
3916+
o2 = c.olsxrr(p, int32(c.opstrr(p, p.As, false)), int(p.From.Reg), int(r), REGTMP)
39233917

39243918
case 31: /* movT L(R), R -> ldrT */
39253919
// if offset L can be split into hi+lo, and both fit into instructions, do
@@ -3933,9 +3927,9 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
39333927
c.ctxt.Diag("unexpected long move, op %v tab %v\n%v", p.As, o.as, p)
39343928
}
39353929

3936-
r := int(p.From.Reg)
3930+
r := p.From.Reg
39373931
if r == obj.REG_NONE {
3938-
r = int(o.param)
3932+
r = o.param
39393933
}
39403934

39413935
v := c.regoff(&p.From)
@@ -3954,7 +3948,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
39543948
goto loadusepool
39553949
}
39563950

3957-
o1 = c.oaddi(p, int32(c.opirr(p, AADD)), hi, r, REGTMP)
3951+
o1 = c.oaddi(p, AADD, hi, REGTMP, r)
39583952
o2 = c.olsr12u(p, c.opldr(p, p.As), ((v-hi)>>uint(s))&0xFFF, REGTMP, p.To.Reg)
39593953
break
39603954

@@ -3963,7 +3957,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
39633957
c.ctxt.Diag("REGTMP used in large offset load: %v", p)
39643958
}
39653959
o1 = c.omovlit(AMOVD, p, &p.From, REGTMP)
3966-
o2 = c.olsxrr(p, int32(c.opldrr(p, p.As, false)), int(p.To.Reg), r, REGTMP)
3960+
o2 = c.olsxrr(p, int32(c.opldrr(p, p.As, false)), int(p.To.Reg), int(r), REGTMP)
39673961

39683962
case 32: /* mov $con, R -> movz/movn */
39693963
o1 = c.omovconst(p.As, p, &p.From, int(p.To.Reg))
@@ -4234,13 +4228,12 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
42344228
if op&Sbit != 0 {
42354229
c.ctxt.Diag("can not break addition/subtraction when S bit is set", p)
42364230
}
4237-
rt := int(p.To.Reg)
4238-
r := int(p.Reg)
4231+
rt, r := p.To.Reg, p.Reg
42394232
if r == obj.REG_NONE {
42404233
r = rt
42414234
}
4242-
o1 = c.oaddi(p, int32(op), c.regoff(&p.From)&0x000fff, r, rt)
4243-
o2 = c.oaddi(p, int32(op), c.regoff(&p.From)&0xfff000, rt, rt)
4235+
o1 = c.oaddi(p, p.As, c.regoff(&p.From)&0x000fff, rt, r)
4236+
o2 = c.oaddi(p, p.As, c.regoff(&p.From)&0xfff000, rt, rt)
42444237

42454238
case 50: /* sys/sysl */
42464239
o1 = c.opirr(p, p.As)
@@ -7097,17 +7090,20 @@ func (c *ctxt7) opstrr(p *obj.Prog, a obj.As, extension bool) uint32 {
70977090
return 0
70987091
}
70997092

7100-
func (c *ctxt7) oaddi(p *obj.Prog, o1 int32, v int32, r int, rt int) uint32 {
7093+
func (c *ctxt7) oaddi(p *obj.Prog, a obj.As, v int32, rd, rn int16) uint32 {
7094+
op := c.opirr(p, a)
7095+
71017096
if (v & 0xFFF000) != 0 {
71027097
if v&0xFFF != 0 {
71037098
c.ctxt.Diag("%v misuses oaddi", p)
71047099
}
71057100
v >>= 12
7106-
o1 |= 1 << 22
7101+
op |= 1 << 22
71077102
}
71087103

7109-
o1 |= ((v & 0xFFF) << 10) | (int32(r&31) << 5) | int32(rt&31)
7110-
return uint32(o1)
7104+
op |= (uint32(v&0xFFF) << 10) | (uint32(rn&31) << 5) | uint32(rd&31)
7105+
7106+
return op
71117107
}
71127108

71137109
func (c *ctxt7) oaddi12(p *obj.Prog, v int32, rd, rn int16) uint32 {
@@ -7120,7 +7116,7 @@ func (c *ctxt7) oaddi12(p *obj.Prog, v int32, rd, rn int16) uint32 {
71207116
a = ASUB
71217117
v = -v
71227118
}
7123-
return c.oaddi(p, int32(c.opirr(p, a)), v, int(rn), int(rd))
7119+
return c.oaddi(p, a, v, rd, rn)
71247120
}
71257121

71267122
/*

0 commit comments

Comments
 (0)