xref: /llvm-project/llvm/test/CodeGen/RISCV/bitreverse-shift.ll (revision 522b4bfe5b140068a7f9b3d899740a460aa0e715)
1780eb9f5SChenbing Zheng; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2780eb9f5SChenbing Zheng; RUN: llc -mtriple=riscv32 -mattr=+zbkb -verify-machineinstrs < %s \
3*522b4bfeSSimon Pilgrim; RUN:   | FileCheck %s -check-prefixes=CHECK,RV32ZBKB
4780eb9f5SChenbing Zheng; RUN: llc -mtriple=riscv64 -mattr=+zbkb -verify-machineinstrs < %s \
5*522b4bfeSSimon Pilgrim; RUN:   | FileCheck %s -check-prefixes=CHECK,RV64ZBKB
6780eb9f5SChenbing Zheng
7*522b4bfeSSimon Pilgrim; These tests can be optimised
8780eb9f5SChenbing Zheng;       fold (bitreverse(srl (bitreverse c), x)) -> (shl c, x)
9780eb9f5SChenbing Zheng;       fold (bitreverse(shl (bitreverse c), x)) -> (srl c, x)
10780eb9f5SChenbing Zheng
11780eb9f5SChenbing Zhengdeclare i8 @llvm.bitreverse.i8(i8)
12780eb9f5SChenbing Zhengdeclare i16 @llvm.bitreverse.i16(i16)
13780eb9f5SChenbing Zhengdeclare i32 @llvm.bitreverse.i32(i32)
14780eb9f5SChenbing Zhengdeclare i64 @llvm.bitreverse.i64(i64)
15780eb9f5SChenbing Zheng
16780eb9f5SChenbing Zhengdefine i8 @test_bitreverse_srli_bitreverse_i8(i8 %a) nounwind {
17*522b4bfeSSimon Pilgrim; CHECK-LABEL: test_bitreverse_srli_bitreverse_i8:
18*522b4bfeSSimon Pilgrim; CHECK:       # %bb.0:
19*522b4bfeSSimon Pilgrim; CHECK-NEXT:    slli a0, a0, 3
20*522b4bfeSSimon Pilgrim; CHECK-NEXT:    ret
21780eb9f5SChenbing Zheng    %1 = call i8 @llvm.bitreverse.i8(i8 %a)
22780eb9f5SChenbing Zheng    %2 = lshr i8 %1, 3
23780eb9f5SChenbing Zheng    %3 = call i8 @llvm.bitreverse.i8(i8 %2)
24780eb9f5SChenbing Zheng    ret i8 %3
25780eb9f5SChenbing Zheng}
26780eb9f5SChenbing Zheng
27780eb9f5SChenbing Zhengdefine i16 @test_bitreverse_srli_bitreverse_i16(i16 %a) nounwind {
28*522b4bfeSSimon Pilgrim; CHECK-LABEL: test_bitreverse_srli_bitreverse_i16:
29*522b4bfeSSimon Pilgrim; CHECK:       # %bb.0:
30*522b4bfeSSimon Pilgrim; CHECK-NEXT:    slli a0, a0, 7
31*522b4bfeSSimon Pilgrim; CHECK-NEXT:    ret
32780eb9f5SChenbing Zheng    %1 = call i16 @llvm.bitreverse.i16(i16 %a)
33780eb9f5SChenbing Zheng    %2 = lshr i16 %1, 7
34780eb9f5SChenbing Zheng    %3 = call i16 @llvm.bitreverse.i16(i16 %2)
35780eb9f5SChenbing Zheng    ret i16 %3
36780eb9f5SChenbing Zheng}
37780eb9f5SChenbing Zheng
38780eb9f5SChenbing Zhengdefine i32 @test_bitreverse_srli_bitreverse_i32(i32 %a) nounwind {
39780eb9f5SChenbing Zheng; RV32ZBKB-LABEL: test_bitreverse_srli_bitreverse_i32:
40780eb9f5SChenbing Zheng; RV32ZBKB:       # %bb.0:
41*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT:    slli a0, a0, 15
42780eb9f5SChenbing Zheng; RV32ZBKB-NEXT:    ret
43780eb9f5SChenbing Zheng;
44780eb9f5SChenbing Zheng; RV64ZBKB-LABEL: test_bitreverse_srli_bitreverse_i32:
45780eb9f5SChenbing Zheng; RV64ZBKB:       # %bb.0:
46*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT:    slliw a0, a0, 15
47780eb9f5SChenbing Zheng; RV64ZBKB-NEXT:    ret
48780eb9f5SChenbing Zheng    %1 = call i32 @llvm.bitreverse.i32(i32 %a)
49780eb9f5SChenbing Zheng    %2 = lshr i32 %1, 15
50780eb9f5SChenbing Zheng    %3 = call i32 @llvm.bitreverse.i32(i32 %2)
51780eb9f5SChenbing Zheng    ret i32 %3
52780eb9f5SChenbing Zheng}
53780eb9f5SChenbing Zheng
54780eb9f5SChenbing Zhengdefine i64 @test_bitreverse_srli_bitreverse_i64(i64 %a) nounwind {
55780eb9f5SChenbing Zheng; RV32ZBKB-LABEL: test_bitreverse_srli_bitreverse_i64:
56780eb9f5SChenbing Zheng; RV32ZBKB:       # %bb.0:
57*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT:    slli a1, a0, 1
58780eb9f5SChenbing Zheng; RV32ZBKB-NEXT:    li a0, 0
59780eb9f5SChenbing Zheng; RV32ZBKB-NEXT:    ret
60780eb9f5SChenbing Zheng;
61780eb9f5SChenbing Zheng; RV64ZBKB-LABEL: test_bitreverse_srli_bitreverse_i64:
62780eb9f5SChenbing Zheng; RV64ZBKB:       # %bb.0:
63*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT:    slli a0, a0, 33
64780eb9f5SChenbing Zheng; RV64ZBKB-NEXT:    ret
65780eb9f5SChenbing Zheng    %1 = call i64 @llvm.bitreverse.i64(i64 %a)
66780eb9f5SChenbing Zheng    %2 = lshr i64 %1, 33
67780eb9f5SChenbing Zheng    %3 = call i64 @llvm.bitreverse.i64(i64 %2)
68780eb9f5SChenbing Zheng    ret i64 %3
69780eb9f5SChenbing Zheng}
70780eb9f5SChenbing Zheng
71780eb9f5SChenbing Zhengdefine i8 @test_bitreverse_shli_bitreverse_i8(i8 %a) nounwind {
72780eb9f5SChenbing Zheng; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i8:
73780eb9f5SChenbing Zheng; RV32ZBKB:       # %bb.0:
74*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT:    slli a0, a0, 24
75*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT:    srli a0, a0, 27
76780eb9f5SChenbing Zheng; RV32ZBKB-NEXT:    ret
77780eb9f5SChenbing Zheng;
78780eb9f5SChenbing Zheng; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i8:
79780eb9f5SChenbing Zheng; RV64ZBKB:       # %bb.0:
80*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT:    slli a0, a0, 56
81*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT:    srli a0, a0, 59
82780eb9f5SChenbing Zheng; RV64ZBKB-NEXT:    ret
83780eb9f5SChenbing Zheng    %1 = call i8 @llvm.bitreverse.i8(i8 %a)
84780eb9f5SChenbing Zheng    %2 = shl i8 %1, 3
85780eb9f5SChenbing Zheng    %3 = call i8 @llvm.bitreverse.i8(i8 %2)
86780eb9f5SChenbing Zheng    ret i8 %3
87780eb9f5SChenbing Zheng}
88780eb9f5SChenbing Zheng
89780eb9f5SChenbing Zhengdefine i16 @test_bitreverse_shli_bitreverse_i16(i16 %a) nounwind {
90780eb9f5SChenbing Zheng; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i16:
91780eb9f5SChenbing Zheng; RV32ZBKB:       # %bb.0:
92*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT:    slli a0, a0, 16
93*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT:    srli a0, a0, 23
94780eb9f5SChenbing Zheng; RV32ZBKB-NEXT:    ret
95780eb9f5SChenbing Zheng;
96780eb9f5SChenbing Zheng; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i16:
97780eb9f5SChenbing Zheng; RV64ZBKB:       # %bb.0:
98*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT:    slli a0, a0, 48
99*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT:    srli a0, a0, 55
100780eb9f5SChenbing Zheng; RV64ZBKB-NEXT:    ret
101780eb9f5SChenbing Zheng    %1 = call i16 @llvm.bitreverse.i16(i16 %a)
102780eb9f5SChenbing Zheng    %2 = shl i16 %1, 7
103780eb9f5SChenbing Zheng    %3 = call i16 @llvm.bitreverse.i16(i16 %2)
104780eb9f5SChenbing Zheng    ret i16 %3
105780eb9f5SChenbing Zheng}
106780eb9f5SChenbing Zheng
107780eb9f5SChenbing Zhengdefine i32 @test_bitreverse_shli_bitreverse_i32(i32 %a) nounwind {
108780eb9f5SChenbing Zheng; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i32:
109780eb9f5SChenbing Zheng; RV32ZBKB:       # %bb.0:
110*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT:    srli a0, a0, 15
111780eb9f5SChenbing Zheng; RV32ZBKB-NEXT:    ret
112780eb9f5SChenbing Zheng;
113780eb9f5SChenbing Zheng; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i32:
114780eb9f5SChenbing Zheng; RV64ZBKB:       # %bb.0:
115*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT:    srliw a0, a0, 15
116780eb9f5SChenbing Zheng; RV64ZBKB-NEXT:    ret
117780eb9f5SChenbing Zheng    %1 = call i32 @llvm.bitreverse.i32(i32 %a)
118780eb9f5SChenbing Zheng    %2 = shl i32 %1, 15
119780eb9f5SChenbing Zheng    %3 = call i32 @llvm.bitreverse.i32(i32 %2)
120780eb9f5SChenbing Zheng    ret i32 %3
121780eb9f5SChenbing Zheng}
122780eb9f5SChenbing Zheng
123780eb9f5SChenbing Zhengdefine i64 @test_bitreverse_shli_bitreverse_i64(i64 %a) nounwind {
124780eb9f5SChenbing Zheng; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i64:
125780eb9f5SChenbing Zheng; RV32ZBKB:       # %bb.0:
126*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT:    srli a0, a1, 1
127780eb9f5SChenbing Zheng; RV32ZBKB-NEXT:    li a1, 0
128780eb9f5SChenbing Zheng; RV32ZBKB-NEXT:    ret
129780eb9f5SChenbing Zheng;
130780eb9f5SChenbing Zheng; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i64:
131780eb9f5SChenbing Zheng; RV64ZBKB:       # %bb.0:
132*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT:    srli a0, a0, 33
133780eb9f5SChenbing Zheng; RV64ZBKB-NEXT:    ret
134780eb9f5SChenbing Zheng    %1 = call i64 @llvm.bitreverse.i64(i64 %a)
135780eb9f5SChenbing Zheng    %2 = shl i64 %1, 33
136780eb9f5SChenbing Zheng    %3 = call i64 @llvm.bitreverse.i64(i64 %2)
137780eb9f5SChenbing Zheng    ret i64 %3
138780eb9f5SChenbing Zheng}
139