]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/mips: add WSBH/DSBH/DSHD instructions
authorJunxian Zhu <zhujunxian@oss.cipunited.com>
Tue, 9 May 2023 11:11:20 +0000 (19:11 +0800)
committerJoel Sing <joel@sing.id.au>
Thu, 3 Aug 2023 05:31:56 +0000 (05:31 +0000)
Add support for WSBH/DSBH/DSHD instructions, which are introduced in mips{32,64}r2.

WSBH reverse bytes within halfwords for 32-bit word, DSBH reverse bytes within halfwords for 64-bit doubleword, and DSHD reverse halfwords within doublewords. These instructions can be used to optimize byte swaps.

Ref: The MIPS64 Instruction Set, Revision 5.04: https://s3-eu-west-1.amazonaws.com/downloads-mips/documents/MD00087-2B-MIPS64BIS-AFP-05.04.pdf

Updates #60072

Change-Id: I31c043150fe8ac03027f413ef4cb2f3e435775e1
Reviewed-on: https://go-review.googlesource.com/c/go/+/493816
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Joel Sing <joel@sing.id.au>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Run-TryBot: Joel Sing <joel@sing.id.au>

src/cmd/asm/internal/asm/testdata/mips.s
src/cmd/asm/internal/asm/testdata/mips64.s
src/cmd/internal/obj/mips/a.out.go
src/cmd/internal/obj/mips/anames.go
src/cmd/internal/obj/mips/asm0.go

index 7136d686d758a5bc849099f78a1d08c78440b6ea..1ded0b072d4c2d61a9a817827b97e88327ea5e8d 100644 (file)
@@ -428,6 +428,7 @@ label4:
        NEGW    R1, R2 // 00011023
        CLZ     R1, R2 // 70221020
        CLO     R1, R2 // 70221021
+       WSBH    R1, R2 // 7c0110a0
 
        // to (Hi, Lo)
        MADD    R2, R1 // 70220000
index 8f628e26c9a563c8c3e8886544da6120c17af6c4..573e3d31a6b3f2f4cdff321b5204e7e0cbcd0fab 100644 (file)
@@ -587,8 +587,13 @@ label4:
        CALL    foo(SB)
        RET     foo(SB)
 
+       // unary operation
        NEGW    R1, R2 // 00011023
        NEGV    R1, R2 // 0001102f
+       WSBH    R1, R2 // 7c0110a0
+       DSBH    R1, R2 // 7c0110a4
+       DSHD    R1, R2 // 7c011164
+
        RET
 
 // MSA VMOVI
index c6ce53a8da142aadbf9432c74d1af321a799603d..c7884a3a3ef20ebc5a9f8ebc9749736a986f2371 100644 (file)
@@ -415,6 +415,7 @@ const (
        ATLBWR
        ATNE
        AWORD
+       AWSBH
        AXOR
 
        /* 64-bit */
@@ -434,6 +435,8 @@ const (
        AADDVU
        ASUBV
        ASUBVU
+       ADSBH
+       ADSHD
 
        /* 64-bit FP */
        ATRUNCFV
index ca2ad5ae26783109c6addceb90f237f0aa8c2597..90972cff71c61f4d9a6802e640390ae71baeff03 100644 (file)
@@ -103,6 +103,7 @@ var Anames = []string{
        "TLBWR",
        "TNE",
        "WORD",
+       "WSBH",
        "XOR",
        "MOVV",
        "MOVVL",
@@ -120,6 +121,8 @@ var Anames = []string{
        "ADDVU",
        "SUBV",
        "SUBVU",
+       "DSBH",
+       "DSHD",
        "TRUNCFV",
        "TRUNCDV",
        "TRUNCFW",
index f71363ac7eb97cf093494abe6376ada53098bebe..3a4dc5d185e9f541e81c2fb7bd933df598a2aa63 100644 (file)
@@ -382,6 +382,9 @@ var optab = []Optab{
        {AVMOVB, C_SOREG, C_NONE, C_WREG, 57, 4, 0, sys.MIPS64, 0},
        {AVMOVB, C_WREG, C_NONE, C_SOREG, 58, 4, 0, sys.MIPS64, 0},
 
+       {AWSBH, C_REG, C_NONE, C_REG, 59, 4, 0, 0, 0},
+       {ADSBH, C_REG, C_NONE, C_REG, 59, 4, 0, sys.MIPS64, 0},
+
        {ABREAK, C_REG, C_NONE, C_SEXT, 7, 4, REGSB, sys.MIPS64, 0}, /* really CACHE instruction */
        {ABREAK, C_REG, C_NONE, C_SAUTO, 7, 4, REGSP, sys.MIPS64, 0},
        {ABREAK, C_REG, C_NONE, C_SOREG, 7, 4, REGZERO, sys.MIPS64, 0},
@@ -1081,6 +1084,7 @@ func buildop(ctxt *obj.Link) {
                        ANEGW,
                        ANEGV,
                        AWORD,
+                       AWSBH,
                        obj.ANOP,
                        obj.ATEXT,
                        obj.AUNDEF,
@@ -1101,6 +1105,9 @@ func buildop(ctxt *obj.Link) {
 
                case ATEQ:
                        opset(ATNE, r0)
+
+               case ADSBH:
+                       opset(ADSHD, r0)
                }
        }
 }
@@ -1683,6 +1690,9 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
        case 58: /* vst wr, $soreg */
                v := c.lsoffset(p.As, c.regoff(&p.To))
                o1 = OP_VMI10(v, uint32(p.To.Reg), uint32(p.From.Reg), 9, c.twobitdf(p.As))
+
+       case 59:
+               o1 = OP_RRR(c.oprrr(p.As), p.From.Reg, REGZERO, p.To.Reg)
        }
 
        out[0] = o1
@@ -1883,6 +1893,12 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
                return SP(3, 4) | OP(0, 0)
        case AMSUB:
                return SP(3, 4) | OP(0, 4)
+       case AWSBH:
+               return SP(3, 7) | OP(20, 0)
+       case ADSBH:
+               return SP(3, 7) | OP(20, 4)
+       case ADSHD:
+               return SP(3, 7) | OP(44, 4)
        }
 
        if a < 0 {