diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoP.td b/llvm/lib/Target/RISCV/RISCVInstrInfoP.td index d17330f9da9f1..db3942b3ac7e7 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoP.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoP.td @@ -139,6 +139,16 @@ class RVPUnary_ri w, bits<5> uf, string opcodestr> let Inst{24-20} = uf; } +let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in +class RVPBinaryScalar_rr f, bits<2> w, bits<3> funct3, string opcodestr> + : RVInstRBase { + let Inst{31} = 0b1; + let Inst{30-28} = f; + let Inst{27} = 0b1; + let Inst{26-25} = w; +} + //===----------------------------------------------------------------------===// // Instructions //===----------------------------------------------------------------------===// @@ -198,6 +208,34 @@ def PLUI_H : PLUI_i<0b1111000, "plui.h">; let Predicates = [HasStdExtP, IsRV64] in def PLUI_W : PLUI_i<0b1111001, "plui.w">; +let Predicates = [HasStdExtP] in { + def PSLL_HS : RVPBinaryScalar_rr<0b000, 0b00, 0b010, "psll.hs">; + def PSLL_BS : RVPBinaryScalar_rr<0b000, 0b10, 0b010, "psll.bs">; + + def PADD_HS : RVPBinaryScalar_rr<0b001, 0b00, 0b010, "padd.hs">; + def PADD_BS : RVPBinaryScalar_rr<0b001, 0b10, 0b010, "padd.bs">; + + def PSSHA_HS : RVPBinaryScalar_rr<0b110, 0b00, 0b010, "pssha.hs">; + + def PSSHAR_HS : RVPBinaryScalar_rr<0b111, 0b00, 0b010, "psshar.hs">; +} // Predicates = [HasStdExtP] +let Predicates = [HasStdExtP, IsRV32], DecoderNamespace = "RV32Only" in { + def SSHA : RVPBinaryScalar_rr<0b110, 0b01, 0b010, "ssha">; + + def SSHAR : RVPBinaryScalar_rr<0b111, 0b01, 0b010, "sshar">; +} // Predicates = [HasStdExtP, IsRV32] +let Predicates = [HasStdExtP, IsRV64] in { + def PSLL_WS : RVPBinaryScalar_rr<0b000, 0b01, 0b010, "psll.ws">; + + def PADD_WS : RVPBinaryScalar_rr<0b001, 0b01, 0b010, "padd.ws">; + + def PSSHA_WS : RVPBinaryScalar_rr<0b110, 0b01, 0b010, "pssha.ws">; + def SHA : RVPBinaryScalar_rr<0b110, 0b11, 0b010, "sha">; + + def PSSHAR_WS : RVPBinaryScalar_rr<0b111, 0b01, 0b010, "psshar.ws">; + def SHAR : RVPBinaryScalar_rr<0b111, 0b11, 0b010, "shar">; +} // Predicates = [HasStdExtP, IsRV64] + let Predicates = [HasStdExtP] in { def PSRLI_B : RVPShiftB_ri<0b000, 0b100, "psrli.b">; def PSRLI_H : RVPShiftH_ri<0b000, 0b100, "psrli.h">; @@ -231,3 +269,26 @@ let Predicates = [HasStdExtP, IsRV64] in { def PSATI_W : RVPShiftW_ri<0b110, 0b100, "psati.w">; def SATI_RV64 : RVPShiftD_ri<0b110, 0b100, "sati">; } // Predicates = [HasStdExtP, IsRV64] + +let Predicates = [HasStdExtP] in { + def PSRL_HS : RVPBinaryScalar_rr<0b000, 0b00, 0b100, "psrl.hs">; + def PSRL_BS : RVPBinaryScalar_rr<0b000, 0b10, 0b100, "psrl.bs">; + + def PREDSUM_HS : RVPBinaryScalar_rr<0b001, 0b00, 0b100, "predsum.hs">; + def PREDSUM_BS : RVPBinaryScalar_rr<0b001, 0b10, 0b100, "predsum.bs">; + + def PREDSUMU_HS : RVPBinaryScalar_rr<0b011, 0b00, 0b100, "predsumu.hs">; + def PREDSUMU_BS : RVPBinaryScalar_rr<0b011, 0b10, 0b100, "predsumu.bs">; + + def PSRA_HS : RVPBinaryScalar_rr<0b100, 0b00, 0b100, "psra.hs">; + def PSRA_BS : RVPBinaryScalar_rr<0b100, 0b10, 0b100, "psra.bs">; +} // Predicates = [HasStdExtP] +let Predicates = [HasStdExtP, IsRV64] in { + def PSRL_WS : RVPBinaryScalar_rr<0b000, 0b01, 0b100, "psrl.ws">; + + def PREDSUM_WS : RVPBinaryScalar_rr<0b001, 0b01, 0b100, "predsum.ws">; + + def PREDSUMU_WS : RVPBinaryScalar_rr<0b011, 0b01, 0b100, "predsumu.ws">; + + def PSRA_WS : RVPBinaryScalar_rr<0b100, 0b01, 0b100, "psra.ws">; +} // Predicates = [HasStdExtP, IsRV64] diff --git a/llvm/test/MC/RISCV/rv32p-invalid.s b/llvm/test/MC/RISCV/rv32p-invalid.s index 2ecce5fec84cf..ebd2d21b7fcf4 100644 --- a/llvm/test/MC/RISCV/rv32p-invalid.s +++ b/llvm/test/MC/RISCV/rv32p-invalid.s @@ -14,6 +14,13 @@ psslai.h t0, t1, 100 # CHECK: :[[@LINE]]:18: error: immediate must be an integer psslai.w t0, t1, 27 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set sslai a4, a5, -1 # CHECK: :[[@LINE]]:15: error: immediate must be an integer in the range [0, 31] +psll.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set +padd.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set +pssha.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set +psshar.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set +sha a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set +shar a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set + psrli.b a6, a7, 100 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 7] psrli.h ra, sp, 100 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 15] psrli.w ra, sp, 31 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set @@ -33,3 +40,8 @@ srari ra, sp, 100 # CHECK: :[[@LINE]]:15: error: immediate must be an integer in psati.h ra, sp, 100 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 15] psati.w ra, sp, 24 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set sati ra, sp, 100 # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [0, 31] + +psrl.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set +predsum.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set +predsumu.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set +psra.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set diff --git a/llvm/test/MC/RISCV/rv32p-valid.s b/llvm/test/MC/RISCV/rv32p-valid.s index 1d0fb6d95781b..3e65fef1524f4 100644 --- a/llvm/test/MC/RISCV/rv32p-valid.s +++ b/llvm/test/MC/RISCV/rv32p-valid.s @@ -76,6 +76,30 @@ plui.h gp, 32 # CHECK-ASM-AND-OBJ: plui.h gp, -412 # CHECK-ASM: encoding: [0x9b,0x21,0x99,0xf0] plui.h gp, 612 +# CHECK-ASM-AND-OBJ: psll.hs a0, a1, a2 +# CHECK-ASM: encoding: [0x1b,0xa5,0xc5,0x88] +psll.hs a0, a1, a2 +# CHECK-ASM-AND-OBJ: psll.bs a3, a4, a5 +# CHECK-ASM: encoding: [0x9b,0x26,0xf7,0x8c] +psll.bs a3, a4, a5 +# CHECK-ASM-AND-OBJ: padd.hs t0, t1, t2 +# CHECK-ASM: encoding: [0x9b,0x22,0x73,0x98] +padd.hs t0, t1, t2 +# CHECK-ASM-AND-OBJ: padd.bs ra, a1, a2 +# CHECK-ASM: encoding: [0x9b,0xa0,0xc5,0x9c] +padd.bs ra, a1, a2 +# CHECK-ASM-AND-OBJ: pssha.hs a3, a4, a5 +# CHECK-ASM: encoding: [0x9b,0x26,0xf7,0xe8] +pssha.hs a3, a4, a5 +# CHECK-ASM-AND-OBJ: ssha gp, a4, a5 +# CHECK-ASM: encoding: [0x9b,0x21,0xf7,0xea] +ssha gp, a4, a5 +# CHECK-ASM-AND-OBJ: psshar.hs a6, a7, a0 +# CHECK-ASM: encoding: [0x1b,0xa8,0xa8,0xf8] +psshar.hs a6, a7, a0 +# CHECK-ASM-AND-OBJ: sshar t1, a7, a0 +# CHECK-ASM: encoding: [0x1b,0xa3,0xa8,0xfa] +sshar t1, a7, a0 # CHECK-ASM-AND-OBJ: psrli.b a6, a7, 0 # CHECK-ASM: encoding: [0x1b,0xc8,0x88,0x80] psrli.b a6, a7, 0 @@ -106,3 +130,27 @@ psati.h t6, s11, 8 # CHECK-ASM-AND-OBJ: sati s11, s10, 9 # CHECK-ASM: encoding: [0x9b,0x4d,0x9d,0xe2] sati s11, s10, 9 +# CHECK-ASM-AND-OBJ: psrl.hs a6, a7, a1 +# CHECK-ASM: encoding: [0x1b,0xc8,0xb8,0x88] +psrl.hs a6, a7, a1 +# CHECK-ASM-AND-OBJ: psrl.bs a1, a2, a3 +# CHECK-ASM: encoding: [0x9b,0x45,0xd6,0x8c] +psrl.bs a1, a2, a3 +# CHECK-ASM-AND-OBJ: predsum.hs a4, a5, a6 +# CHECK-ASM: encoding: [0x1b,0xc7,0x07,0x99] +predsum.hs a4, a5, a6 +# CHECK-ASM-AND-OBJ: predsum.bs a7, a1, a1 +# CHECK-ASM: encoding: [0x9b,0xc8,0xb5,0x9c] +predsum.bs a7, a1, a1 +# CHECK-ASM-AND-OBJ: predsumu.hs t0, t1, t2 +# CHECK-ASM: encoding: [0x9b,0x42,0x73,0xb8] +predsumu.hs t0, t1, t2 +# CHECK-ASM-AND-OBJ: predsumu.bs t3, t4, t5 +# CHECK-ASM: encoding: [0x1b,0xce,0xee,0xbd] +predsumu.bs t3, t4, t5 +# CHECK-ASM-AND-OBJ: psra.hs ra, a1, a2 +# CHECK-ASM: encoding: [0x9b,0xc0,0xc5,0xc8] +psra.hs ra, a1, a2 +# CHECK-ASM-AND-OBJ: psra.bs sp, a2, a3 +# CHECK-ASM: encoding: [0x1b,0x41,0xd6,0xcc] +psra.bs sp, a2, a3 diff --git a/llvm/test/MC/RISCV/rv64p-invalid.s b/llvm/test/MC/RISCV/rv64p-invalid.s index ccccba2e9e544..0d7b12e3ad6ef 100644 --- a/llvm/test/MC/RISCV/rv64p-invalid.s +++ b/llvm/test/MC/RISCV/rv64p-invalid.s @@ -10,6 +10,9 @@ pslli.b a6, a7, 100 # CHECK: :[[@LINE]]:17: error: immediate must be an integer pslli.h ra, sp, 100 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 15] pslli.w ra, sp, 100 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 31] +ssha a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV32I Base Instruction Set +sshar a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV32I Base Instruction Set + psslai.h t0, t1, 100 # CHECK: :[[@LINE]]:18: error: immediate must be an integer in the range [0, 15] psslai.w a4, a5, -1 # CHECK: :[[@LINE]]:18: error: immediate must be an integer in the range [0, 31] sslai ra, sp, 10 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV32I Base Instruction Set diff --git a/llvm/test/MC/RISCV/rv64p-valid.s b/llvm/test/MC/RISCV/rv64p-valid.s index 13cfd5e8023b0..95dd16bed627b 100644 --- a/llvm/test/MC/RISCV/rv64p-valid.s +++ b/llvm/test/MC/RISCV/rv64p-valid.s @@ -106,6 +106,42 @@ plui.w a2, 1 # CHECK-ASM-AND-OBJ: plui.w a2, -1 # CHECK-ASM: encoding: [0x1b,0xa6,0xff,0xf3] plui.w a2, 1023 +# CHECK-ASM-AND-OBJ: psll.hs s0, a2, s2 +# CHECK-ASM: encoding: [0x1b,0x24,0x26,0x89] +psll.hs s0, a2, s2 +# CHECK-ASM-AND-OBJ: psll.bs a0, t3, t5 +# CHECK-ASM: encoding: [0x1b,0x25,0xee,0x8d] +psll.bs a0, t3, t5 +# CHECK-ASM-AND-OBJ: padd.hs t1, a2, s0 +# CHECK-ASM: encoding: [0x1b,0x23,0x86,0x98] +padd.hs t1, a2, s0 +# CHECK-ASM-AND-OBJ: padd.bs t3, t1, t3 +# CHECK-ASM: encoding: [0x1b,0x2e,0xc3,0x9d] +padd.bs t3, t1, t3 +# CHECK-ASM-AND-OBJ: pssha.hs s0, t1, a2 +# CHECK-ASM: encoding: [0x1b,0x24,0xc3,0xe8] +pssha.hs s0, t1, a2 +# CHECK-ASM-AND-OBJ: psshar.hs s2, t5, t3 +# CHECK-ASM: encoding: [0x1b,0x29,0xcf,0xf9] +psshar.hs s2, t5, t3 +# CHECK-ASM-AND-OBJ: psll.ws s0, t1, a0 +# CHECK-ASM: encoding: [0x1b,0x24,0xa3,0x8a] +psll.ws s0, t1, a0 +# CHECK-ASM-AND-OBJ: padd.ws s2, a2, a0 +# CHECK-ASM: encoding: [0x1b,0x29,0xa6,0x9a] +padd.ws s2, a2, a0 +# CHECK-ASM-AND-OBJ: pssha.ws a4, a2, t1 +# CHECK-ASM: encoding: [0x1b,0x27,0x66,0xea] +pssha.ws a4, a2, t1 +# CHECK-ASM-AND-OBJ: psshar.ws a2, a0, a4 +# CHECK-ASM: encoding: [0x1b,0x26,0xe5,0xfa] +psshar.ws a2, a0, a4 +# CHECK-ASM-AND-OBJ: sha a0, t5, t5 +# CHECK-ASM: encoding: [0x1b,0x25,0xef,0xef] +sha a0, t5, t5 +# CHECK-ASM-AND-OBJ: shar t5, t5, t3 +# CHECK-ASM: encoding: [0x1b,0x2f,0xcf,0xff] +shar t5, t5, t3 # CHECK-ASM-AND-OBJ: psrli.b a6, a7 # CHECK-ASM: encoding: [0x1b,0xc8,0x88,0x80] psrli.b a6, a7, 0 @@ -151,3 +187,27 @@ psati.w s10, s9, 10 # CHECK-ASM-AND-OBJ: sati s9, s8, 32 # CHECK-ASM: encoding: [0x9b,0x4c,0x0c,0xe6] sati s9, s8, 32 +# CHECK-ASM-AND-OBJ: psrl.hs a6, a7, a1 +# CHECK-ASM: encoding: [0x1b,0xc8,0xb8,0x88] +psrl.hs a6, a7, a1 +# CHECK-ASM-AND-OBJ: psrl.bs a1, a2, a3 +# CHECK-ASM: encoding: [0x9b,0x45,0xd6,0x8c] +psrl.bs a1, a2, a3 +# CHECK-ASM-AND-OBJ: predsum.hs a4, a5, a6 +# CHECK-ASM: encoding: [0x1b,0xc7,0x07,0x99] +predsum.hs a4, a5, a6 +# CHECK-ASM-AND-OBJ: predsum.bs a7, a1, a1 +# CHECK-ASM: encoding: [0x9b,0xc8,0xb5,0x9c] +predsum.bs a7, a1, a1 +# CHECK-ASM-AND-OBJ: predsumu.hs t0, t1, t2 +# CHECK-ASM: encoding: [0x9b,0x42,0x73,0xb8] +predsumu.hs t0, t1, t2 +# CHECK-ASM-AND-OBJ: predsumu.bs t3, t4, t5 +# CHECK-ASM: encoding: [0x1b,0xce,0xee,0xbd] +predsumu.bs t3, t4, t5 +# CHECK-ASM-AND-OBJ: psra.hs ra, a1, a2 +# CHECK-ASM: encoding: [0x9b,0xc0,0xc5,0xc8] +psra.hs ra, a1, a2 +# CHECK-ASM-AND-OBJ: psra.bs sp, a2, a3 +# CHECK-ASM: encoding: [0x1b,0x41,0xd6,0xcc] +psra.bs sp, a2, a3