Skip to content

Commit 6e35c30

Browse files
authored
[RISCV] Use pli.b and pli.h in RISCVMatInt with P extension on RV32. (#172803)
On RV32, we don't need to check that the upper and lower 32 bits match.
1 parent 1a87e39 commit 6e35c30

File tree

3 files changed

+60
-3
lines changed

3 files changed

+60
-3
lines changed

llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ static void generateInstSeqImpl(int64_t Val, const MCSubtargetInfo &STI,
8787
int16_t Bit15To0 = Bit31To0;
8888
int8_t Bit15To8 = Bit15To0 >> 8;
8989
int8_t Bit7To0 = Bit15To0;
90-
if (Bit63To32 == Bit31To0) {
90+
if (!IsRV64 || Bit63To32 == Bit31To0) {
9191
if (IsRV64 && isInt<10>(Bit63To32)) {
9292
Res.emplace_back(RISCV::PLI_W, Bit63To32);
9393
return;

llvm/test/CodeGen/RISCV/rv32p.ll

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,26 @@ define i32 @li_imm() {
3535
ret i32 -1
3636
}
3737

38+
define i32 @pli_b_i32(ptr %p) {
39+
; CHECK-LABEL: pli_b_i32:
40+
; CHECK: # %bb.0:
41+
; CHECK-NEXT: pli.b a0, 5
42+
; CHECK-NEXT: ret
43+
ret i32 u0x05050505
44+
}
45+
46+
define i32 @pli_h_i32(ptr %p) {
47+
; CHECK-LABEL: pli_h_i32:
48+
; CHECK: # %bb.0:
49+
; CHECK-NEXT: pli.h a0, -64
50+
; CHECK-NEXT: ret
51+
ret i32 u0xffc0ffc0
52+
}
53+
3854
define void @pli_b_store_i32(ptr %p) {
3955
; CHECK-LABEL: pli_b_store_i32:
4056
; CHECK: # %bb.0:
41-
; CHECK-NEXT: lui a1, 267284
42-
; CHECK-NEXT: addi a1, a1, 321
57+
; CHECK-NEXT: pli.b a1, 65
4358
; CHECK-NEXT: sw a1, 0(a0)
4459
; CHECK-NEXT: ret
4560
store i32 u0x41414141, ptr %p

llvm/test/CodeGen/RISCV/rv64p.ll

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,48 @@ define i64 @li_imm() {
4848
ret i64 -1
4949
}
5050

51+
define i32 @pli_b_i32() {
52+
; CHECK-LABEL: pli_b_i32:
53+
; CHECK: # %bb.0:
54+
; CHECK-NEXT: lui a0, 20560
55+
; CHECK-NEXT: addi a0, a0, 1285
56+
; CHECK-NEXT: ret
57+
ret i32 u0x05050505
58+
}
59+
60+
define i64 @pli_b_i64() {
61+
; CHECK-LABEL: pli_b_i64:
62+
; CHECK: # %bb.0:
63+
; CHECK-NEXT: pli.b a0, -128
64+
; CHECK-NEXT: ret
65+
ret i64 u0x8080808080808080
66+
}
67+
68+
define i32 @pli_h_i32() {
69+
; CHECK-LABEL: pli_h_i32:
70+
; CHECK: # %bb.0:
71+
; CHECK-NEXT: lui a0, 1047840
72+
; CHECK-NEXT: addi a0, a0, -47
73+
; CHECK-NEXT: ret
74+
ret i32 u0xffd1ffd1
75+
}
76+
77+
define i64 @pli_h_i64() {
78+
; CHECK-LABEL: pli_h_i64:
79+
; CHECK: # %bb.0:
80+
; CHECK-NEXT: pli.h a0, 291
81+
; CHECK-NEXT: ret
82+
ret i64 u0x0123012301230123
83+
}
84+
85+
define i64 @pli_w_i64() {
86+
; CHECK-LABEL: pli_w_i64:
87+
; CHECK: # %bb.0:
88+
; CHECK-NEXT: pli.w a0, -292
89+
; CHECK-NEXT: ret
90+
ret i64 u0xfffffedcfffffedc
91+
}
92+
5193
define void @pli_b_store_i32(ptr %p) {
5294
; CHECK-LABEL: pli_b_store_i32:
5395
; CHECK: # %bb.0:

0 commit comments

Comments
 (0)