Skip to content

Commit cba5f1b

Browse files
toppercrealqhc
andauthored
[RISCV] Add MC support for P extensions with scalar second operands. (#153502)
These are the instructions from page 8 and the second half of page 9 here in https://jhauser.us/RISCV/ext-P/RVP-instrEncodings-015.pdf Co-authored-by: realqhc <[email protected]>
1 parent 7bda763 commit cba5f1b

File tree

5 files changed

+184
-0
lines changed

5 files changed

+184
-0
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoP.td

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,16 @@ class RVPUnary_ri<bits<2> w, bits<5> uf, string opcodestr>
139139
let Inst{24-20} = uf;
140140
}
141141

142+
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
143+
class RVPBinaryScalar_rr<bits<3> f, bits<2> w, bits<3> funct3, string opcodestr>
144+
: RVInstRBase<funct3, OPC_OP_IMM_32, (outs GPR:$rd),
145+
(ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2"> {
146+
let Inst{31} = 0b1;
147+
let Inst{30-28} = f;
148+
let Inst{27} = 0b1;
149+
let Inst{26-25} = w;
150+
}
151+
142152
//===----------------------------------------------------------------------===//
143153
// Instructions
144154
//===----------------------------------------------------------------------===//
@@ -198,6 +208,34 @@ def PLUI_H : PLUI_i<0b1111000, "plui.h">;
198208
let Predicates = [HasStdExtP, IsRV64] in
199209
def PLUI_W : PLUI_i<0b1111001, "plui.w">;
200210

211+
let Predicates = [HasStdExtP] in {
212+
def PSLL_HS : RVPBinaryScalar_rr<0b000, 0b00, 0b010, "psll.hs">;
213+
def PSLL_BS : RVPBinaryScalar_rr<0b000, 0b10, 0b010, "psll.bs">;
214+
215+
def PADD_HS : RVPBinaryScalar_rr<0b001, 0b00, 0b010, "padd.hs">;
216+
def PADD_BS : RVPBinaryScalar_rr<0b001, 0b10, 0b010, "padd.bs">;
217+
218+
def PSSHA_HS : RVPBinaryScalar_rr<0b110, 0b00, 0b010, "pssha.hs">;
219+
220+
def PSSHAR_HS : RVPBinaryScalar_rr<0b111, 0b00, 0b010, "psshar.hs">;
221+
} // Predicates = [HasStdExtP]
222+
let Predicates = [HasStdExtP, IsRV32], DecoderNamespace = "RV32Only" in {
223+
def SSHA : RVPBinaryScalar_rr<0b110, 0b01, 0b010, "ssha">;
224+
225+
def SSHAR : RVPBinaryScalar_rr<0b111, 0b01, 0b010, "sshar">;
226+
} // Predicates = [HasStdExtP, IsRV32]
227+
let Predicates = [HasStdExtP, IsRV64] in {
228+
def PSLL_WS : RVPBinaryScalar_rr<0b000, 0b01, 0b010, "psll.ws">;
229+
230+
def PADD_WS : RVPBinaryScalar_rr<0b001, 0b01, 0b010, "padd.ws">;
231+
232+
def PSSHA_WS : RVPBinaryScalar_rr<0b110, 0b01, 0b010, "pssha.ws">;
233+
def SHA : RVPBinaryScalar_rr<0b110, 0b11, 0b010, "sha">;
234+
235+
def PSSHAR_WS : RVPBinaryScalar_rr<0b111, 0b01, 0b010, "psshar.ws">;
236+
def SHAR : RVPBinaryScalar_rr<0b111, 0b11, 0b010, "shar">;
237+
} // Predicates = [HasStdExtP, IsRV64]
238+
201239
let Predicates = [HasStdExtP] in {
202240
def PSRLI_B : RVPShiftB_ri<0b000, 0b100, "psrli.b">;
203241
def PSRLI_H : RVPShiftH_ri<0b000, 0b100, "psrli.h">;
@@ -231,3 +269,26 @@ let Predicates = [HasStdExtP, IsRV64] in {
231269
def PSATI_W : RVPShiftW_ri<0b110, 0b100, "psati.w">;
232270
def SATI_RV64 : RVPShiftD_ri<0b110, 0b100, "sati">;
233271
} // Predicates = [HasStdExtP, IsRV64]
272+
273+
let Predicates = [HasStdExtP] in {
274+
def PSRL_HS : RVPBinaryScalar_rr<0b000, 0b00, 0b100, "psrl.hs">;
275+
def PSRL_BS : RVPBinaryScalar_rr<0b000, 0b10, 0b100, "psrl.bs">;
276+
277+
def PREDSUM_HS : RVPBinaryScalar_rr<0b001, 0b00, 0b100, "predsum.hs">;
278+
def PREDSUM_BS : RVPBinaryScalar_rr<0b001, 0b10, 0b100, "predsum.bs">;
279+
280+
def PREDSUMU_HS : RVPBinaryScalar_rr<0b011, 0b00, 0b100, "predsumu.hs">;
281+
def PREDSUMU_BS : RVPBinaryScalar_rr<0b011, 0b10, 0b100, "predsumu.bs">;
282+
283+
def PSRA_HS : RVPBinaryScalar_rr<0b100, 0b00, 0b100, "psra.hs">;
284+
def PSRA_BS : RVPBinaryScalar_rr<0b100, 0b10, 0b100, "psra.bs">;
285+
} // Predicates = [HasStdExtP]
286+
let Predicates = [HasStdExtP, IsRV64] in {
287+
def PSRL_WS : RVPBinaryScalar_rr<0b000, 0b01, 0b100, "psrl.ws">;
288+
289+
def PREDSUM_WS : RVPBinaryScalar_rr<0b001, 0b01, 0b100, "predsum.ws">;
290+
291+
def PREDSUMU_WS : RVPBinaryScalar_rr<0b011, 0b01, 0b100, "predsumu.ws">;
292+
293+
def PSRA_WS : RVPBinaryScalar_rr<0b100, 0b01, 0b100, "psra.ws">;
294+
} // Predicates = [HasStdExtP, IsRV64]

llvm/test/MC/RISCV/rv32p-invalid.s

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ psslai.h t0, t1, 100 # CHECK: :[[@LINE]]:18: error: immediate must be an integer
1414
psslai.w t0, t1, 27 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set
1515
sslai a4, a5, -1 # CHECK: :[[@LINE]]:15: error: immediate must be an integer in the range [0, 31]
1616

17+
psll.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set
18+
padd.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set
19+
pssha.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set
20+
psshar.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set
21+
sha a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set
22+
shar a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set
23+
1724
psrli.b a6, a7, 100 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 7]
1825
psrli.h ra, sp, 100 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 15]
1926
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
3340
psati.h ra, sp, 100 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 15]
3441
psati.w ra, sp, 24 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set
3542
sati ra, sp, 100 # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [0, 31]
43+
44+
psrl.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set
45+
predsum.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set
46+
predsumu.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set
47+
psra.ws a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV64I Base Instruction Set

llvm/test/MC/RISCV/rv32p-valid.s

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,30 @@ plui.h gp, 32
7676
# CHECK-ASM-AND-OBJ: plui.h gp, -412
7777
# CHECK-ASM: encoding: [0x9b,0x21,0x99,0xf0]
7878
plui.h gp, 612
79+
# CHECK-ASM-AND-OBJ: psll.hs a0, a1, a2
80+
# CHECK-ASM: encoding: [0x1b,0xa5,0xc5,0x88]
81+
psll.hs a0, a1, a2
82+
# CHECK-ASM-AND-OBJ: psll.bs a3, a4, a5
83+
# CHECK-ASM: encoding: [0x9b,0x26,0xf7,0x8c]
84+
psll.bs a3, a4, a5
85+
# CHECK-ASM-AND-OBJ: padd.hs t0, t1, t2
86+
# CHECK-ASM: encoding: [0x9b,0x22,0x73,0x98]
87+
padd.hs t0, t1, t2
88+
# CHECK-ASM-AND-OBJ: padd.bs ra, a1, a2
89+
# CHECK-ASM: encoding: [0x9b,0xa0,0xc5,0x9c]
90+
padd.bs ra, a1, a2
91+
# CHECK-ASM-AND-OBJ: pssha.hs a3, a4, a5
92+
# CHECK-ASM: encoding: [0x9b,0x26,0xf7,0xe8]
93+
pssha.hs a3, a4, a5
94+
# CHECK-ASM-AND-OBJ: ssha gp, a4, a5
95+
# CHECK-ASM: encoding: [0x9b,0x21,0xf7,0xea]
96+
ssha gp, a4, a5
97+
# CHECK-ASM-AND-OBJ: psshar.hs a6, a7, a0
98+
# CHECK-ASM: encoding: [0x1b,0xa8,0xa8,0xf8]
99+
psshar.hs a6, a7, a0
100+
# CHECK-ASM-AND-OBJ: sshar t1, a7, a0
101+
# CHECK-ASM: encoding: [0x1b,0xa3,0xa8,0xfa]
102+
sshar t1, a7, a0
79103
# CHECK-ASM-AND-OBJ: psrli.b a6, a7, 0
80104
# CHECK-ASM: encoding: [0x1b,0xc8,0x88,0x80]
81105
psrli.b a6, a7, 0
@@ -106,3 +130,27 @@ psati.h t6, s11, 8
106130
# CHECK-ASM-AND-OBJ: sati s11, s10, 9
107131
# CHECK-ASM: encoding: [0x9b,0x4d,0x9d,0xe2]
108132
sati s11, s10, 9
133+
# CHECK-ASM-AND-OBJ: psrl.hs a6, a7, a1
134+
# CHECK-ASM: encoding: [0x1b,0xc8,0xb8,0x88]
135+
psrl.hs a6, a7, a1
136+
# CHECK-ASM-AND-OBJ: psrl.bs a1, a2, a3
137+
# CHECK-ASM: encoding: [0x9b,0x45,0xd6,0x8c]
138+
psrl.bs a1, a2, a3
139+
# CHECK-ASM-AND-OBJ: predsum.hs a4, a5, a6
140+
# CHECK-ASM: encoding: [0x1b,0xc7,0x07,0x99]
141+
predsum.hs a4, a5, a6
142+
# CHECK-ASM-AND-OBJ: predsum.bs a7, a1, a1
143+
# CHECK-ASM: encoding: [0x9b,0xc8,0xb5,0x9c]
144+
predsum.bs a7, a1, a1
145+
# CHECK-ASM-AND-OBJ: predsumu.hs t0, t1, t2
146+
# CHECK-ASM: encoding: [0x9b,0x42,0x73,0xb8]
147+
predsumu.hs t0, t1, t2
148+
# CHECK-ASM-AND-OBJ: predsumu.bs t3, t4, t5
149+
# CHECK-ASM: encoding: [0x1b,0xce,0xee,0xbd]
150+
predsumu.bs t3, t4, t5
151+
# CHECK-ASM-AND-OBJ: psra.hs ra, a1, a2
152+
# CHECK-ASM: encoding: [0x9b,0xc0,0xc5,0xc8]
153+
psra.hs ra, a1, a2
154+
# CHECK-ASM-AND-OBJ: psra.bs sp, a2, a3
155+
# CHECK-ASM: encoding: [0x1b,0x41,0xd6,0xcc]
156+
psra.bs sp, a2, a3

llvm/test/MC/RISCV/rv64p-invalid.s

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ pslli.b a6, a7, 100 # CHECK: :[[@LINE]]:17: error: immediate must be an integer
1010
pslli.h ra, sp, 100 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 15]
1111
pslli.w ra, sp, 100 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 31]
1212

13+
ssha a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV32I Base Instruction Set
14+
sshar a0, a1, a2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV32I Base Instruction Set
15+
1316
psslai.h t0, t1, 100 # CHECK: :[[@LINE]]:18: error: immediate must be an integer in the range [0, 15]
1417
psslai.w a4, a5, -1 # CHECK: :[[@LINE]]:18: error: immediate must be an integer in the range [0, 31]
1518
sslai ra, sp, 10 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RV32I Base Instruction Set

llvm/test/MC/RISCV/rv64p-valid.s

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,42 @@ plui.w a2, 1
106106
# CHECK-ASM-AND-OBJ: plui.w a2, -1
107107
# CHECK-ASM: encoding: [0x1b,0xa6,0xff,0xf3]
108108
plui.w a2, 1023
109+
# CHECK-ASM-AND-OBJ: psll.hs s0, a2, s2
110+
# CHECK-ASM: encoding: [0x1b,0x24,0x26,0x89]
111+
psll.hs s0, a2, s2
112+
# CHECK-ASM-AND-OBJ: psll.bs a0, t3, t5
113+
# CHECK-ASM: encoding: [0x1b,0x25,0xee,0x8d]
114+
psll.bs a0, t3, t5
115+
# CHECK-ASM-AND-OBJ: padd.hs t1, a2, s0
116+
# CHECK-ASM: encoding: [0x1b,0x23,0x86,0x98]
117+
padd.hs t1, a2, s0
118+
# CHECK-ASM-AND-OBJ: padd.bs t3, t1, t3
119+
# CHECK-ASM: encoding: [0x1b,0x2e,0xc3,0x9d]
120+
padd.bs t3, t1, t3
121+
# CHECK-ASM-AND-OBJ: pssha.hs s0, t1, a2
122+
# CHECK-ASM: encoding: [0x1b,0x24,0xc3,0xe8]
123+
pssha.hs s0, t1, a2
124+
# CHECK-ASM-AND-OBJ: psshar.hs s2, t5, t3
125+
# CHECK-ASM: encoding: [0x1b,0x29,0xcf,0xf9]
126+
psshar.hs s2, t5, t3
127+
# CHECK-ASM-AND-OBJ: psll.ws s0, t1, a0
128+
# CHECK-ASM: encoding: [0x1b,0x24,0xa3,0x8a]
129+
psll.ws s0, t1, a0
130+
# CHECK-ASM-AND-OBJ: padd.ws s2, a2, a0
131+
# CHECK-ASM: encoding: [0x1b,0x29,0xa6,0x9a]
132+
padd.ws s2, a2, a0
133+
# CHECK-ASM-AND-OBJ: pssha.ws a4, a2, t1
134+
# CHECK-ASM: encoding: [0x1b,0x27,0x66,0xea]
135+
pssha.ws a4, a2, t1
136+
# CHECK-ASM-AND-OBJ: psshar.ws a2, a0, a4
137+
# CHECK-ASM: encoding: [0x1b,0x26,0xe5,0xfa]
138+
psshar.ws a2, a0, a4
139+
# CHECK-ASM-AND-OBJ: sha a0, t5, t5
140+
# CHECK-ASM: encoding: [0x1b,0x25,0xef,0xef]
141+
sha a0, t5, t5
142+
# CHECK-ASM-AND-OBJ: shar t5, t5, t3
143+
# CHECK-ASM: encoding: [0x1b,0x2f,0xcf,0xff]
144+
shar t5, t5, t3
109145
# CHECK-ASM-AND-OBJ: psrli.b a6, a7
110146
# CHECK-ASM: encoding: [0x1b,0xc8,0x88,0x80]
111147
psrli.b a6, a7, 0
@@ -151,3 +187,27 @@ psati.w s10, s9, 10
151187
# CHECK-ASM-AND-OBJ: sati s9, s8, 32
152188
# CHECK-ASM: encoding: [0x9b,0x4c,0x0c,0xe6]
153189
sati s9, s8, 32
190+
# CHECK-ASM-AND-OBJ: psrl.hs a6, a7, a1
191+
# CHECK-ASM: encoding: [0x1b,0xc8,0xb8,0x88]
192+
psrl.hs a6, a7, a1
193+
# CHECK-ASM-AND-OBJ: psrl.bs a1, a2, a3
194+
# CHECK-ASM: encoding: [0x9b,0x45,0xd6,0x8c]
195+
psrl.bs a1, a2, a3
196+
# CHECK-ASM-AND-OBJ: predsum.hs a4, a5, a6
197+
# CHECK-ASM: encoding: [0x1b,0xc7,0x07,0x99]
198+
predsum.hs a4, a5, a6
199+
# CHECK-ASM-AND-OBJ: predsum.bs a7, a1, a1
200+
# CHECK-ASM: encoding: [0x9b,0xc8,0xb5,0x9c]
201+
predsum.bs a7, a1, a1
202+
# CHECK-ASM-AND-OBJ: predsumu.hs t0, t1, t2
203+
# CHECK-ASM: encoding: [0x9b,0x42,0x73,0xb8]
204+
predsumu.hs t0, t1, t2
205+
# CHECK-ASM-AND-OBJ: predsumu.bs t3, t4, t5
206+
# CHECK-ASM: encoding: [0x1b,0xce,0xee,0xbd]
207+
predsumu.bs t3, t4, t5
208+
# CHECK-ASM-AND-OBJ: psra.hs ra, a1, a2
209+
# CHECK-ASM: encoding: [0x9b,0xc0,0xc5,0xc8]
210+
psra.hs ra, a1, a2
211+
# CHECK-ASM-AND-OBJ: psra.bs sp, a2, a3
212+
# CHECK-ASM: encoding: [0x1b,0x41,0xd6,0xcc]
213+
psra.bs sp, a2, a3

0 commit comments

Comments
 (0)