]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/asm: fix rlwnm reg,reg,const,reg encoding on ppc64
authorPaul E. Murphy <murp@ibm.com>
Tue, 3 Nov 2020 22:59:25 +0000 (16:59 -0600)
committerLynn Boger <laboger@linux.vnet.ibm.com>
Wed, 4 Nov 2020 21:26:23 +0000 (21:26 +0000)
The wrong value for the first reg parameter was selected.
Likewise the wrong opcode was selected.  This should match
rlwnm (rrr type), not rlwinm (irr type).

Similarly, fix the optab matching rules so clrlslwi does
not match reg,reg,const,reg arguments.  This is not a valid
operand combination for clrlslwi.

Fixes #42368

Change-Id: I4eb16d45a760b9fd3f497ef9863f82465351d39f
Reviewed-on: https://go-review.googlesource.com/c/go/+/267421
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Trust: Lynn Boger <laboger@linux.vnet.ibm.com>

src/cmd/asm/internal/asm/testdata/ppc64.s
src/cmd/internal/obj/ppc64/asm9.go

index 2b1191c44b3313f3344b65e346cf6f1f0bed5ad4..8f6eb14f73cba702053fd4394948ce9fa6485d71 100644 (file)
@@ -282,7 +282,9 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$0
        RLWMI $7, R3, $65535, R6        // 50663c3e
        RLWMICC $7, R3, $65535, R6      // 50663c3f
        RLWNM $3, R4, $7, R6            // 54861f7e
+       RLWNM R3, R4, $7, R6            // 5c861f7e
        RLWNMCC $3, R4, $7, R6          // 54861f7f
+       RLWNMCC R3, R4, $7, R6          // 5c861f7f
        RLDMI $0, R4, $7, R6            // 7886076c
        RLDMICC $0, R4, $7, R6          // 7886076d
        RLDIMI $0, R4, $7, R6           // 788601cc
index 090fefb4d8b8e42425f46242e32ff6fa51de89a0..775d27d8e80d3c0d1b73965a41dca8b0dc584661 100644 (file)
@@ -174,6 +174,7 @@ var optab = []Optab{
        {ASRAD, C_SCON, C_NONE, C_NONE, C_REG, 56, 4, 0},
        {ARLWMI, C_SCON, C_REG, C_LCON, C_REG, 62, 4, 0},
        {ARLWMI, C_REG, C_REG, C_LCON, C_REG, 63, 4, 0},
+       {ACLRLSLWI, C_SCON, C_REG, C_LCON, C_REG, 62, 4, 0},
        {ARLDMI, C_SCON, C_REG, C_LCON, C_REG, 30, 4, 0},
        {ARLDC, C_SCON, C_REG, C_LCON, C_REG, 29, 4, 0},
        {ARLDCL, C_SCON, C_REG, C_LCON, C_REG, 29, 4, 0},
@@ -1911,7 +1912,6 @@ func buildop(ctxt *obj.Link) {
                        opset(ARLWMICC, r0)
                        opset(ARLWNM, r0)
                        opset(ARLWNMCC, r0)
-                       opset(ACLRLSLWI, r0)
 
                case ARLDMI:
                        opset(ARLDMICC, r0)
@@ -2010,6 +2010,7 @@ func buildop(ctxt *obj.Link) {
                        AADDEX,
                        ACMPEQB,
                        AECIWX,
+                       ACLRLSLWI,
                        obj.ANOP,
                        obj.ATEXT,
                        obj.AUNDEF,
@@ -3413,25 +3414,10 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) {
                }
 
        case 63: /* rlwmi b,s,$mask,a */
-               v := c.regoff(&p.From)
-               switch p.As {
-               case ACLRLSLWI:
-                       n := c.regoff(p.GetFrom3())
-                       if n > v || v >= 32 {
-                               // Message will match operands from the ISA even though in the
-                               // code it uses 'v'
-                               c.ctxt.Diag("Invalid n or b for CLRLSLWI: %x %x\n%v", v, n, p)
-                       }
-                       // This is an extended mnemonic described in the ISA C.8.2
-                       // clrlslwi ra,rs,b,n -> rlwinm ra,rs,n,b-n,31-n
-                       // It generates the rlwinm directly here.
-                       o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.Reg), uint32(n), uint32(v-n), uint32(31-n))
-               default:
-                       var mask [2]uint8
-                       c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3())))
-                       o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(v))
-                       o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1
-               }
+               var mask [2]uint8
+               c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3())))
+               o1 = AOP_RRR(c.oprrr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(p.From.Reg))
+               o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1
 
        case 64: /* mtfsf fr[, $m] {,fpcsr} */
                var v int32