Skip to content

Commit bfb7843

Browse files
committed
[RISCV] Add packw/packh patterns for -riscv-experimental-rv64-legal-i32
1 parent 6b9752c commit bfb7843

File tree

3 files changed

+21
-20
lines changed

3 files changed

+21
-20
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,7 +1208,9 @@ def assertzexti32 : PatFrag<(ops node:$src), (assertzext node:$src), [{
12081208
}]>;
12091209
def zexti32 : ComplexPattern<i64, 1, "selectZExtBits<32>">;
12101210
def zexti16 : ComplexPattern<XLenVT, 1, "selectZExtBits<16>">;
1211+
def zexti16i32 : ComplexPattern<i32, 1, "selectZExtBits<16>">;
12111212
def zexti8 : ComplexPattern<XLenVT, 1, "selectZExtBits<8>">;
1213+
def zexti8i32 : ComplexPattern<i32, 1, "selectZExtBits<8>">;
12121214

12131215
def ext : PatFrags<(ops node:$A), [(sext node:$A), (zext node:$A)]>;
12141216

llvm/lib/Target/RISCV/RISCVInstrInfoZb.td

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,18 @@ def : Pat<(i32 (rotl GPR:$rs1, uimm5:$rs2)),
846846
(RORIW GPR:$rs1, (ImmSubFrom32 uimm5:$rs2))>;
847847
} // Predicates = [HasStdExtZbbOrZbkb, IsRV64]
848848

849+
let Predicates = [HasStdExtZbkb, IsRV64] in {
850+
def : Pat<(or (and (shl GPR:$rs2, (i64 8)), 0xFFFF),
851+
(zexti8i32 (i32 GPR:$rs1))),
852+
(PACKH GPR:$rs1, GPR:$rs2)>;
853+
def : Pat<(or (shl (zexti8i32 (i32 GPR:$rs2)), (i64 8)),
854+
(zexti8i32 (i32 GPR:$rs1))),
855+
(PACKH GPR:$rs1, GPR:$rs2)>;
856+
857+
def : Pat<(i32 (or (shl GPR:$rs2, (i64 16)), (zexti16i32 (i32 GPR:$rs1)))),
858+
(PACKW GPR:$rs1, GPR:$rs2)>;
859+
} // Predicates = [HasStdExtZbkb, IsRV64]
860+
849861
let Predicates = [HasStdExtZba, IsRV64] in {
850862
def : Pat<(shl (i64 (zext i32:$rs1)), uimm5:$shamt),
851863
(SLLI_UW GPR:$rs1, uimm5:$shamt)>;

llvm/test/CodeGen/RISCV/rv64-legal-i32/rv64zbkb.ll

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@ define signext i32 @pack_i32(i32 signext %a, i32 signext %b) nounwind {
1515
;
1616
; RV64ZBKB-LABEL: pack_i32:
1717
; RV64ZBKB: # %bb.0:
18-
; RV64ZBKB-NEXT: slli a0, a0, 48
19-
; RV64ZBKB-NEXT: srli a0, a0, 48
20-
; RV64ZBKB-NEXT: slliw a1, a1, 16
21-
; RV64ZBKB-NEXT: or a0, a1, a0
18+
; RV64ZBKB-NEXT: packw a0, a0, a1
2219
; RV64ZBKB-NEXT: ret
2320
%shl = and i32 %a, 65535
2421
%shl1 = shl i32 %b, 16
@@ -35,8 +32,7 @@ define signext i32 @pack_i32_2(i16 zeroext %a, i16 zeroext %b) nounwind {
3532
;
3633
; RV64ZBKB-LABEL: pack_i32_2:
3734
; RV64ZBKB: # %bb.0:
38-
; RV64ZBKB-NEXT: slliw a1, a1, 16
39-
; RV64ZBKB-NEXT: or a0, a1, a0
35+
; RV64ZBKB-NEXT: packw a0, a0, a1
4036
; RV64ZBKB-NEXT: ret
4137
%zexta = zext i16 %a to i32
4238
%zextb = zext i16 %b to i32
@@ -56,8 +52,7 @@ define signext i32 @pack_i32_3(i16 zeroext %0, i16 zeroext %1, i32 signext %2) {
5652
;
5753
; RV64ZBKB-LABEL: pack_i32_3:
5854
; RV64ZBKB: # %bb.0:
59-
; RV64ZBKB-NEXT: slli a0, a0, 16
60-
; RV64ZBKB-NEXT: or a0, a0, a1
55+
; RV64ZBKB-NEXT: packw a0, a1, a0
6156
; RV64ZBKB-NEXT: addw a0, a0, a2
6257
; RV64ZBKB-NEXT: ret
6358
%4 = zext i16 %0 to i32
@@ -142,10 +137,7 @@ define signext i32 @packh_i32(i32 signext %a, i32 signext %b) nounwind {
142137
;
143138
; RV64ZBKB-LABEL: packh_i32:
144139
; RV64ZBKB: # %bb.0:
145-
; RV64ZBKB-NEXT: andi a0, a0, 255
146-
; RV64ZBKB-NEXT: slli a1, a1, 56
147-
; RV64ZBKB-NEXT: srli a1, a1, 48
148-
; RV64ZBKB-NEXT: or a0, a1, a0
140+
; RV64ZBKB-NEXT: packh a0, a0, a1
149141
; RV64ZBKB-NEXT: ret
150142
%and = and i32 %a, 255
151143
%and1 = shl i32 %b, 8
@@ -165,10 +157,7 @@ define i32 @packh_i32_2(i32 %a, i32 %b) nounwind {
165157
;
166158
; RV64ZBKB-LABEL: packh_i32_2:
167159
; RV64ZBKB: # %bb.0:
168-
; RV64ZBKB-NEXT: andi a0, a0, 255
169-
; RV64ZBKB-NEXT: andi a1, a1, 255
170-
; RV64ZBKB-NEXT: slliw a1, a1, 8
171-
; RV64ZBKB-NEXT: or a0, a1, a0
160+
; RV64ZBKB-NEXT: packh a0, a0, a1
172161
; RV64ZBKB-NEXT: ret
173162
%and = and i32 %a, 255
174163
%and1 = and i32 %b, 255
@@ -228,8 +217,7 @@ define zeroext i16 @packh_i16(i8 zeroext %a, i8 zeroext %b) nounwind {
228217
;
229218
; RV64ZBKB-LABEL: packh_i16:
230219
; RV64ZBKB: # %bb.0:
231-
; RV64ZBKB-NEXT: slli a1, a1, 8
232-
; RV64ZBKB-NEXT: or a0, a1, a0
220+
; RV64ZBKB-NEXT: packh a0, a0, a1
233221
; RV64ZBKB-NEXT: slli a0, a0, 32
234222
; RV64ZBKB-NEXT: srli a0, a0, 32
235223
; RV64ZBKB-NEXT: ret
@@ -300,8 +288,7 @@ define signext i32 @pack_i32_allWUsers(i16 zeroext %0, i16 zeroext %1, i16 zeroe
300288
; RV64ZBKB-LABEL: pack_i32_allWUsers:
301289
; RV64ZBKB: # %bb.0:
302290
; RV64ZBKB-NEXT: add a0, a1, a0
303-
; RV64ZBKB-NEXT: slliw a0, a0, 16
304-
; RV64ZBKB-NEXT: or a0, a0, a2
291+
; RV64ZBKB-NEXT: packw a0, a2, a0
305292
; RV64ZBKB-NEXT: ret
306293
%4 = add i16 %1, %0
307294
%5 = zext i16 %4 to i32

0 commit comments

Comments
 (0)