1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 --verify-machineinstrs < %s \
3 ; RUN: | FileCheck %s --check-prefix=LA32
4 ; RUN: llc --mtriple=loongarch64 --verify-machineinstrs < %s \
5 ; RUN: | FileCheck %s --check-prefix=LA64
7 declare i7 @llvm.bitreverse.i7(i7)
8 declare i8 @llvm.bitreverse.i8(i8)
9 declare i16 @llvm.bitreverse.i16(i16)
10 declare i24 @llvm.bitreverse.i24(i24)
11 declare i32 @llvm.bitreverse.i32(i32)
12 declare i48 @llvm.bitreverse.i48(i48)
13 declare i64 @llvm.bitreverse.i64(i64)
14 declare i77 @llvm.bitreverse.i77(i77)
15 declare i128 @llvm.bitreverse.i128(i128)
17 define i8 @test_bitreverse_i8(i8 %a) nounwind {
18 ; LA32-LABEL: test_bitreverse_i8:
20 ; LA32-NEXT: bitrev.4b $a0, $a0
23 ; LA64-LABEL: test_bitreverse_i8:
25 ; LA64-NEXT: bitrev.4b $a0, $a0
27 %tmp = call i8 @llvm.bitreverse.i8(i8 %a)
31 define i16 @test_bitreverse_i16(i16 %a) nounwind {
32 ; LA32-LABEL: test_bitreverse_i16:
34 ; LA32-NEXT: bitrev.w $a0, $a0
35 ; LA32-NEXT: srli.w $a0, $a0, 16
38 ; LA64-LABEL: test_bitreverse_i16:
40 ; LA64-NEXT: bitrev.d $a0, $a0
41 ; LA64-NEXT: srli.d $a0, $a0, 48
43 %tmp = call i16 @llvm.bitreverse.i16(i16 %a)
47 define i32 @test_bitreverse_i32(i32 %a) nounwind {
48 ; LA32-LABEL: test_bitreverse_i32:
50 ; LA32-NEXT: bitrev.w $a0, $a0
53 ; LA64-LABEL: test_bitreverse_i32:
55 ; LA64-NEXT: bitrev.w $a0, $a0
57 %tmp = call i32 @llvm.bitreverse.i32(i32 %a)
61 define i64 @test_bitreverse_i64(i64 %a) nounwind {
62 ; LA32-LABEL: test_bitreverse_i64:
64 ; LA32-NEXT: bitrev.w $a2, $a1
65 ; LA32-NEXT: bitrev.w $a1, $a0
66 ; LA32-NEXT: move $a0, $a2
69 ; LA64-LABEL: test_bitreverse_i64:
71 ; LA64-NEXT: bitrev.d $a0, $a0
73 %tmp = call i64 @llvm.bitreverse.i64(i64 %a)
77 ;; Bitreverse on non-native integer widths.
79 define i7 @test_bitreverse_i7(i7 %a) nounwind {
80 ; LA32-LABEL: test_bitreverse_i7:
82 ; LA32-NEXT: bitrev.w $a0, $a0
83 ; LA32-NEXT: srli.w $a0, $a0, 25
86 ; LA64-LABEL: test_bitreverse_i7:
88 ; LA64-NEXT: bitrev.d $a0, $a0
89 ; LA64-NEXT: srli.d $a0, $a0, 57
91 %tmp = call i7 @llvm.bitreverse.i7(i7 %a)
95 define i24 @test_bitreverse_i24(i24 %a) nounwind {
96 ; LA32-LABEL: test_bitreverse_i24:
98 ; LA32-NEXT: bitrev.w $a0, $a0
99 ; LA32-NEXT: srli.w $a0, $a0, 8
102 ; LA64-LABEL: test_bitreverse_i24:
104 ; LA64-NEXT: bitrev.d $a0, $a0
105 ; LA64-NEXT: srli.d $a0, $a0, 40
107 %tmp = call i24 @llvm.bitreverse.i24(i24 %a)
111 define i48 @test_bitreverse_i48(i48 %a) nounwind {
112 ; LA32-LABEL: test_bitreverse_i48:
114 ; LA32-NEXT: bitrev.w $a2, $a0
115 ; LA32-NEXT: bitrev.w $a0, $a1
116 ; LA32-NEXT: bytepick.w $a0, $a0, $a2, 2
117 ; LA32-NEXT: srli.w $a1, $a2, 16
120 ; LA64-LABEL: test_bitreverse_i48:
122 ; LA64-NEXT: bitrev.d $a0, $a0
123 ; LA64-NEXT: srli.d $a0, $a0, 16
125 %tmp = call i48 @llvm.bitreverse.i48(i48 %a)
129 define i77 @test_bitreverse_i77(i77 %a) nounwind {
130 ; LA32-LABEL: test_bitreverse_i77:
132 ; LA32-NEXT: ld.w $a2, $a1, 0
133 ; LA32-NEXT: bitrev.w $a2, $a2
134 ; LA32-NEXT: ld.w $a3, $a1, 4
135 ; LA32-NEXT: bitrev.w $a3, $a3
136 ; LA32-NEXT: srli.w $a4, $a3, 19
137 ; LA32-NEXT: slli.w $a5, $a2, 13
138 ; LA32-NEXT: or $a4, $a5, $a4
139 ; LA32-NEXT: srli.w $a2, $a2, 19
140 ; LA32-NEXT: st.h $a2, $a0, 8
141 ; LA32-NEXT: st.w $a4, $a0, 4
142 ; LA32-NEXT: slli.w $a2, $a3, 13
143 ; LA32-NEXT: ld.w $a1, $a1, 8
144 ; LA32-NEXT: bitrev.w $a1, $a1
145 ; LA32-NEXT: srli.w $a1, $a1, 19
146 ; LA32-NEXT: or $a1, $a1, $a2
147 ; LA32-NEXT: st.w $a1, $a0, 0
150 ; LA64-LABEL: test_bitreverse_i77:
152 ; LA64-NEXT: bitrev.d $a1, $a1
153 ; LA64-NEXT: srli.d $a1, $a1, 51
154 ; LA64-NEXT: bitrev.d $a2, $a0
155 ; LA64-NEXT: slli.d $a0, $a2, 13
156 ; LA64-NEXT: or $a0, $a1, $a0
157 ; LA64-NEXT: srli.d $a1, $a2, 51
159 %tmp = call i77 @llvm.bitreverse.i77(i77 %a)
163 define i128 @test_bitreverse_i128(i128 %a) nounwind {
164 ; LA32-LABEL: test_bitreverse_i128:
166 ; LA32-NEXT: ld.w $a2, $a1, 0
167 ; LA32-NEXT: bitrev.w $a2, $a2
168 ; LA32-NEXT: st.w $a2, $a0, 12
169 ; LA32-NEXT: ld.w $a2, $a1, 4
170 ; LA32-NEXT: bitrev.w $a2, $a2
171 ; LA32-NEXT: st.w $a2, $a0, 8
172 ; LA32-NEXT: ld.w $a2, $a1, 8
173 ; LA32-NEXT: bitrev.w $a2, $a2
174 ; LA32-NEXT: st.w $a2, $a0, 4
175 ; LA32-NEXT: ld.w $a1, $a1, 12
176 ; LA32-NEXT: bitrev.w $a1, $a1
177 ; LA32-NEXT: st.w $a1, $a0, 0
180 ; LA64-LABEL: test_bitreverse_i128:
182 ; LA64-NEXT: bitrev.d $a2, $a1
183 ; LA64-NEXT: bitrev.d $a1, $a0
184 ; LA64-NEXT: move $a0, $a2
186 %tmp = call i128 @llvm.bitreverse.i128(i128 %a)