1
0
mirror of https://github.com/golang/go synced 2024-11-23 07:40:04 -07:00

cmd/internal/obj/mips: use more appropriate register types for OP_RRR

Rather than passing registers as uint32, use int16 and cast to uint32 in
the OP_RRR implementation. This allows a large number of casts to be removed
and code simplified at call sites.

Change-Id: I2194ea07a6f89861530cd88c4b60c993bb0fa0c1
Reviewed-on: https://go-review.googlesource.com/c/go/+/514097
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Rong Zhang <rongrong@oss.cipunited.com>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Run-TryBot: Joel Sing <joel@sing.id.au>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
Joel Sing 2023-07-28 19:59:36 +10:00 committed by Gopher Robot
parent 24af43fa66
commit f6966577a2

View File

@ -1137,8 +1137,8 @@ func FPV(x uint32, y uint32) uint32 {
return SP(2, 1) | 21<<21 | x<<3 | y<<0
}
func OP_RRR(op uint32, r1 uint32, r2 uint32, r3 uint32) uint32 {
return op | (r1&31)<<16 | (r2&31)<<21 | (r3&31)<<11
func OP_RRR(op uint32, r1 int16, r2 int16, r3 int16) uint32 {
return op | uint32(r1&31)<<16 | uint32(r2&31)<<21 | uint32(r3&31)<<11
}
func OP_IRR(op uint32, i uint32, r2 uint32, r3 uint32) uint32 {
@ -1191,17 +1191,17 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
// but SLL is special that the result is always sign-extended to 64-bit.
a = ASLL
}
o1 = OP_RRR(c.oprrr(a), uint32(p.From.Reg), uint32(REGZERO), uint32(p.To.Reg))
o1 = OP_RRR(c.oprrr(a), p.From.Reg, REGZERO, p.To.Reg)
case 2: /* add/sub r1,[r2],r3 */
r := int(p.Reg)
r := p.Reg
if p.As == ANEGW || p.As == ANEGV {
r = REGZERO
}
if r == obj.REG_NONE {
r = int(p.To.Reg)
r = p.To.Reg
}
o1 = OP_RRR(c.oprrr(p.As), uint32(p.From.Reg), uint32(r), uint32(p.To.Reg))
o1 = OP_RRR(c.oprrr(p.As), p.From.Reg, r, p.To.Reg)
case 3: /* mov $soreg, r ==> or/add $i,o,r */
v := c.regoff(&p.From)
@ -1262,12 +1262,11 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
o1 = OP_IRR(c.opirr(-p.As), uint32(v), uint32(r), uint32(p.To.Reg))
case 9: /* sll r1,[r2],r3 */
r := int(p.Reg)
r := p.Reg
if r == obj.REG_NONE {
r = int(p.To.Reg)
r = p.To.Reg
}
o1 = OP_RRR(c.oprrr(p.As), uint32(r), uint32(p.From.Reg), uint32(p.To.Reg))
o1 = OP_RRR(c.oprrr(p.As), r, p.From.Reg, p.To.Reg)
case 10: /* add $con,[r1],r2 ==> mov $con, t; add t,[r1],r2 */
v := c.regoff(&p.From)
@ -1276,11 +1275,11 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
a = AADDU
}
o1 = OP_IRR(c.opirr(a), uint32(v), uint32(obj.REG_NONE), uint32(REGTMP))
r := int(p.Reg)
r := p.Reg
if r == obj.REG_NONE {
r = int(p.To.Reg)
r = p.To.Reg
}
o2 = OP_RRR(c.oprrr(p.As), uint32(REGTMP), uint32(r), uint32(p.To.Reg))
o2 = OP_RRR(c.oprrr(p.As), REGTMP, r, p.To.Reg)
case 11: /* jmp lbra */
v := int32(0)
@ -1365,14 +1364,14 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
}
case 17:
o1 = OP_RRR(c.oprrr(p.As), uint32(REGZERO), uint32(p.From.Reg), uint32(p.To.Reg))
o1 = OP_RRR(c.oprrr(p.As), REGZERO, p.From.Reg, p.To.Reg)
case 18: /* jmp [r1],0(r2) */
r := int(p.Reg)
r := p.Reg
if r == obj.REG_NONE {
r = int(o.param)
r = o.param
}
o1 = OP_RRR(c.oprrr(p.As), uint32(obj.REG_NONE), uint32(p.To.Reg), uint32(r))
o1 = OP_RRR(c.oprrr(p.As), obj.REG_NONE, p.To.Reg, r)
if p.As == obj.ACALL {
rel := obj.Addrel(c.cursym)
rel.Off = int32(c.pc)
@ -1392,36 +1391,36 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
if p.From.Reg == REG_LO {
a = OP(2, 2) /* mflo */
}
o1 = OP_RRR(a, uint32(REGZERO), uint32(REGZERO), uint32(p.To.Reg))
o1 = OP_RRR(a, REGZERO, REGZERO, p.To.Reg)
case 21: /* mov r,lo/hi */
a := OP(2, 1) /* mthi */
if p.To.Reg == REG_LO {
a = OP(2, 3) /* mtlo */
}
o1 = OP_RRR(a, uint32(REGZERO), uint32(p.From.Reg), uint32(REGZERO))
o1 = OP_RRR(a, REGZERO, p.From.Reg, REGZERO)
case 22: /* mul r1,r2 [r3]*/
if p.To.Reg != obj.REG_NONE {
r := int(p.Reg)
r := p.Reg
if r == obj.REG_NONE {
r = int(p.To.Reg)
r = p.To.Reg
}
a := SP(3, 4) | 2 /* mul */
o1 = OP_RRR(a, uint32(p.From.Reg), uint32(r), uint32(p.To.Reg))
o1 = OP_RRR(a, p.From.Reg, r, p.To.Reg)
} else {
o1 = OP_RRR(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.Reg), uint32(REGZERO))
o1 = OP_RRR(c.oprrr(p.As), p.From.Reg, p.Reg, REGZERO)
}
case 23: /* add $lcon,r1,r2 ==> lu+or+add */
v := c.regoff(&p.From)
o1 = OP_IRR(c.opirr(ALUI), uint32(v>>16), uint32(REGZERO), uint32(REGTMP))
o2 = OP_IRR(c.opirr(AOR), uint32(v), uint32(REGTMP), uint32(REGTMP))
r := int(p.Reg)
r := p.Reg
if r == obj.REG_NONE {
r = int(p.To.Reg)
r = p.To.Reg
}
o3 = OP_RRR(c.oprrr(p.As), uint32(REGTMP), uint32(r), uint32(p.To.Reg))
o3 = OP_RRR(c.oprrr(p.As), REGTMP, r, p.To.Reg)
case 24: /* mov $ucon,r ==> lu r */
v := c.regoff(&p.From)
@ -1430,27 +1429,27 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
case 25: /* add/and $ucon,[r1],r2 ==> lu $con,t; add t,[r1],r2 */
v := c.regoff(&p.From)
o1 = OP_IRR(c.opirr(ALUI), uint32(v>>16), uint32(REGZERO), uint32(REGTMP))
r := int(p.Reg)
r := p.Reg
if r == obj.REG_NONE {
r = int(p.To.Reg)
r = p.To.Reg
}
o2 = OP_RRR(c.oprrr(p.As), uint32(REGTMP), uint32(r), uint32(p.To.Reg))
o2 = OP_RRR(c.oprrr(p.As), REGTMP, r, p.To.Reg)
case 26: /* mov $lsext/auto/oreg,r ==> lu+or+add */
v := c.regoff(&p.From)
o1 = OP_IRR(c.opirr(ALUI), uint32(v>>16), uint32(REGZERO), uint32(REGTMP))
o2 = OP_IRR(c.opirr(AOR), uint32(v), uint32(REGTMP), uint32(REGTMP))
r := int(p.From.Reg)
r := p.From.Reg
if r == obj.REG_NONE {
r = int(o.param)
r = o.param
}
o3 = OP_RRR(c.oprrr(add), uint32(REGTMP), uint32(r), uint32(p.To.Reg))
o3 = OP_RRR(c.oprrr(add), REGTMP, r, p.To.Reg)
case 27: /* mov [sl]ext/auto/oreg,fr ==> lwc1 o(r) */
v := c.regoff(&p.From)
r := int(p.From.Reg)
r := p.From.Reg
if r == obj.REG_NONE {
r = int(o.param)
r = o.param
}
a := -AMOVF
if p.As == AMOVD {
@ -1459,7 +1458,7 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
switch o.size {
case 12:
o1 = OP_IRR(c.opirr(ALUI), uint32((v+1<<15)>>16), uint32(REGZERO), uint32(REGTMP))
o2 = OP_RRR(c.oprrr(add), uint32(r), uint32(REGTMP), uint32(REGTMP))
o2 = OP_RRR(c.oprrr(add), r, REGTMP, REGTMP)
o3 = OP_IRR(c.opirr(a), uint32(v), uint32(REGTMP), uint32(p.To.Reg))
case 4:
@ -1468,9 +1467,9 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
case 28: /* mov fr,[sl]ext/auto/oreg ==> swc1 o(r) */
v := c.regoff(&p.To)
r := int(p.To.Reg)
r := p.To.Reg
if r == obj.REG_NONE {
r = int(o.param)
r = o.param
}
a := AMOVF
if p.As == AMOVD {
@ -1479,7 +1478,7 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
switch o.size {
case 12:
o1 = OP_IRR(c.opirr(ALUI), uint32((v+1<<15)>>16), uint32(REGZERO), uint32(REGTMP))
o2 = OP_RRR(c.oprrr(add), uint32(r), uint32(REGTMP), uint32(REGTMP))
o2 = OP_RRR(c.oprrr(add), r, REGTMP, REGTMP)
o3 = OP_IRR(c.opirr(a), uint32(v), uint32(REGTMP), uint32(p.From.Reg))
case 4:
@ -1488,11 +1487,11 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
case 30: /* movw r,fr */
a := SP(2, 1) | (4 << 21) /* mtc1 */
o1 = OP_RRR(a, uint32(p.From.Reg), uint32(obj.REG_NONE), uint32(p.To.Reg))
o1 = OP_RRR(a, p.From.Reg, obj.REG_NONE, p.To.Reg)
case 31: /* movw fr,r */
a := SP(2, 1) | (0 << 21) /* mtc1 */
o1 = OP_RRR(a, uint32(p.To.Reg), uint32(obj.REG_NONE), uint32(p.From.Reg))
o1 = OP_RRR(a, p.To.Reg, obj.REG_NONE, p.From.Reg)
case 32: /* fadd fr1,[fr2],fr3 */
r := int(p.Reg)
@ -1511,26 +1510,26 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
a = AOR
}
o1 = OP_IRR(c.opirr(a), uint32(v), uint32(obj.REG_NONE), uint32(REGTMP))
o2 = OP_RRR(SP(2, 1)|(4<<21), uint32(REGTMP), uint32(obj.REG_NONE), uint32(p.To.Reg)) /* mtc1 */
o2 = OP_RRR(SP(2, 1)|(4<<21), REGTMP, obj.REG_NONE, p.To.Reg) /* mtc1 */
case 35: /* mov r,lext/auto/oreg ==> sw o(REGTMP) */
v := c.regoff(&p.To)
r := int(p.To.Reg)
r := p.To.Reg
if r == obj.REG_NONE {
r = int(o.param)
r = o.param
}
o1 = OP_IRR(c.opirr(ALUI), uint32((v+1<<15)>>16), uint32(REGZERO), uint32(REGTMP))
o2 = OP_RRR(c.oprrr(add), uint32(r), uint32(REGTMP), uint32(REGTMP))
o2 = OP_RRR(c.oprrr(add), r, REGTMP, REGTMP)
o3 = OP_IRR(c.opirr(p.As), uint32(v), uint32(REGTMP), uint32(p.From.Reg))
case 36: /* mov lext/auto/oreg,r ==> lw o(REGTMP) */
v := c.regoff(&p.From)
r := int(p.From.Reg)
r := p.From.Reg
if r == obj.REG_NONE {
r = int(o.param)
r = o.param
}
o1 = OP_IRR(c.opirr(ALUI), uint32((v+1<<15)>>16), uint32(REGZERO), uint32(REGTMP))
o2 = OP_RRR(c.oprrr(add), uint32(r), uint32(REGTMP), uint32(REGTMP))
o2 = OP_RRR(c.oprrr(add), r, REGTMP, REGTMP)
o3 = OP_IRR(c.opirr(-p.As), uint32(v), uint32(REGTMP), uint32(p.To.Reg))
case 37: /* movw r,mr */
@ -1538,31 +1537,31 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
if p.As == AMOVV {
a = SP(2, 0) | (5 << 21) /* dmtc0 */
}
o1 = OP_RRR(a, uint32(p.From.Reg), uint32(obj.REG_NONE), uint32(p.To.Reg))
o1 = OP_RRR(a, p.From.Reg, obj.REG_NONE, p.To.Reg)
case 38: /* movw mr,r */
a := SP(2, 0) | (0 << 21) /* mfc0 */
if p.As == AMOVV {
a = SP(2, 0) | (1 << 21) /* dmfc0 */
}
o1 = OP_RRR(a, uint32(p.To.Reg), uint32(obj.REG_NONE), uint32(p.From.Reg))
o1 = OP_RRR(a, p.To.Reg, obj.REG_NONE, p.From.Reg)
case 40: /* word */
o1 = uint32(c.regoff(&p.From))
case 41: /* movw f,fcr */
o1 = OP_RRR(SP(2, 1)|(6<<21), uint32(p.From.Reg), uint32(obj.REG_NONE), uint32(p.To.Reg)) /* mtcc1 */
o1 = OP_RRR(SP(2, 1)|(6<<21), p.From.Reg, obj.REG_NONE, p.To.Reg) /* mtcc1 */
case 42: /* movw fcr,r */
o1 = OP_RRR(SP(2, 1)|(2<<21), uint32(p.To.Reg), uint32(obj.REG_NONE), uint32(p.From.Reg)) /* mfcc1 */
o1 = OP_RRR(SP(2, 1)|(2<<21), p.To.Reg, obj.REG_NONE, p.From.Reg) /* mfcc1 */
case 47: /* movv r,fr */
a := SP(2, 1) | (5 << 21) /* dmtc1 */
o1 = OP_RRR(a, uint32(p.From.Reg), uint32(obj.REG_NONE), uint32(p.To.Reg))
o1 = OP_RRR(a, p.From.Reg, obj.REG_NONE, p.To.Reg)
case 48: /* movv fr,r */
a := SP(2, 1) | (1 << 21) /* dmtc1 */
o1 = OP_RRR(a, uint32(p.To.Reg), uint32(obj.REG_NONE), uint32(p.From.Reg))
o1 = OP_RRR(a, p.To.Reg, obj.REG_NONE, p.From.Reg)
case 49: /* undef */
o1 = 52 /* trap -- teq r0, r0 */
@ -1586,7 +1585,7 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
if o.size == 12 {
o3 = o2
o2 = OP_RRR(c.oprrr(AADDVU), uint32(REGSB), uint32(REGTMP), uint32(REGTMP))
o2 = OP_RRR(c.oprrr(AADDVU), REGSB, REGTMP, REGTMP)
rel2.Off += 4
}
@ -1608,7 +1607,7 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
if o.size == 12 {
o3 = o2
o2 = OP_RRR(c.oprrr(AADDVU), uint32(REGSB), uint32(REGTMP), uint32(REGTMP))
o2 = OP_RRR(c.oprrr(AADDVU), REGSB, REGTMP, REGTMP)
rel2.Off += 4
}
@ -1632,7 +1631,7 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
if o.size == 12 {
o3 = o2
o2 = OP_RRR(c.oprrr(AADDVU), uint32(REGSB), uint32(p.To.Reg), uint32(p.To.Reg))
o2 = OP_RRR(c.oprrr(AADDVU), REGSB, p.To.Reg, p.To.Reg)
rel2.Off += 4
}