From: Joel Sing Date: Sun, 8 Jan 2023 18:14:13 +0000 (+1100) Subject: cmd/internal/obj/arm64: pass obj.As to oaddi rather than an instruction X-Git-Tag: go1.21rc1~745 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8b67cf0bc6ad657fddcbaaa10729d0086f08f9a9;p=gostls13.git 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 Run-TryBot: Joel Sing Reviewed-by: Dmitri Shuralyov TryBot-Result: Gopher Robot --- diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index 60add054ce..1a10c48bd8 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -3359,20 +3359,18 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { } o1 = c.opirr(p, p.As) - rt := int(p.To.Reg) + rt, r := p.To.Reg, p.Reg if p.To.Type == obj.TYPE_NONE { if (o1 & Sbit) == 0 { c.ctxt.Diag("ineffective ZR destination\n%v", p) } rt = REGZERO } - - r := int(p.Reg) if r == obj.REG_NONE { r = rt } v := c.regoff(&p.From) - o1 = c.oaddi(p, int32(o1), v, r, rt) + o1 = c.oaddi(p, p.As, v, rt, r) case 3: /* op R<>uint(s))&0xFFF, REGTMP, p.From.Reg) break @@ -3919,7 +3913,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { c.ctxt.Diag("REGTMP used in large offset store: %v", p) } o1 = c.omovlit(AMOVD, p, &p.To, REGTMP) - o2 = c.olsxrr(p, int32(c.opstrr(p, p.As, false)), int(p.From.Reg), r, REGTMP) + o2 = c.olsxrr(p, int32(c.opstrr(p, p.As, false)), int(p.From.Reg), int(r), REGTMP) case 31: /* movT L(R), R -> ldrT */ // 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) { c.ctxt.Diag("unexpected long move, op %v tab %v\n%v", p.As, o.as, p) } - r := int(p.From.Reg) + r := p.From.Reg if r == obj.REG_NONE { - r = int(o.param) + r = o.param } v := c.regoff(&p.From) @@ -3954,7 +3948,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { goto loadusepool } - o1 = c.oaddi(p, int32(c.opirr(p, AADD)), hi, r, REGTMP) + o1 = c.oaddi(p, AADD, hi, REGTMP, r) o2 = c.olsr12u(p, c.opldr(p, p.As), ((v-hi)>>uint(s))&0xFFF, REGTMP, p.To.Reg) break @@ -3963,7 +3957,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { c.ctxt.Diag("REGTMP used in large offset load: %v", p) } o1 = c.omovlit(AMOVD, p, &p.From, REGTMP) - o2 = c.olsxrr(p, int32(c.opldrr(p, p.As, false)), int(p.To.Reg), r, REGTMP) + o2 = c.olsxrr(p, int32(c.opldrr(p, p.As, false)), int(p.To.Reg), int(r), REGTMP) case 32: /* mov $con, R -> movz/movn */ 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) { if op&Sbit != 0 { c.ctxt.Diag("can not break addition/subtraction when S bit is set", p) } - rt := int(p.To.Reg) - r := int(p.Reg) + rt, r := p.To.Reg, p.Reg if r == obj.REG_NONE { r = rt } - o1 = c.oaddi(p, int32(op), c.regoff(&p.From)&0x000fff, r, rt) - o2 = c.oaddi(p, int32(op), c.regoff(&p.From)&0xfff000, rt, rt) + o1 = c.oaddi(p, p.As, c.regoff(&p.From)&0x000fff, rt, r) + o2 = c.oaddi(p, p.As, c.regoff(&p.From)&0xfff000, rt, rt) case 50: /* sys/sysl */ o1 = c.opirr(p, p.As) @@ -7097,17 +7090,20 @@ func (c *ctxt7) opstrr(p *obj.Prog, a obj.As, extension bool) uint32 { return 0 } -func (c *ctxt7) oaddi(p *obj.Prog, o1 int32, v int32, r int, rt int) uint32 { +func (c *ctxt7) oaddi(p *obj.Prog, a obj.As, v int32, rd, rn int16) uint32 { + op := c.opirr(p, a) + if (v & 0xFFF000) != 0 { if v&0xFFF != 0 { c.ctxt.Diag("%v misuses oaddi", p) } v >>= 12 - o1 |= 1 << 22 + op |= 1 << 22 } - o1 |= ((v & 0xFFF) << 10) | (int32(r&31) << 5) | int32(rt&31) - return uint32(o1) + op |= (uint32(v&0xFFF) << 10) | (uint32(rn&31) << 5) | uint32(rd&31) + + return op } 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 { a = ASUB v = -v } - return c.oaddi(p, int32(c.opirr(p, a)), v, int(rn), int(rd)) + return c.oaddi(p, a, v, rd, rn) } /*