Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / LoongArch / bytepick.ll
blob86148b374e70d846e76c5ba25795602616dc5581
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 ;; a=00112233 b=44556677
8 ;; expected 11223344
9 define i32 @pick_i32_1(i32 %a, i32 %b) {
10 ; LA32-LABEL: pick_i32_1:
11 ; LA32:       # %bb.0:
12 ; LA32-NEXT:    bytepick.w $a0, $a1, $a0, 1
13 ; LA32-NEXT:    ret
15 ; LA64-LABEL: pick_i32_1:
16 ; LA64:       # %bb.0:
17 ; LA64-NEXT:    slli.d $a0, $a0, 8
18 ; LA64-NEXT:    bstrpick.d $a1, $a1, 31, 24
19 ; LA64-NEXT:    or $a0, $a1, $a0
20 ; LA64-NEXT:    ret
21   %1 = lshr i32 %b, 24
22   %2 = shl i32 %a, 8
23   %3 = or i32 %1, %2
24   ret i32 %3
27 ;; a=00112233 b=44556677
28 ;; expected 11223344
29 define signext i32 @pick_i32_1_sext(i32 %a, i32 %b) {
30 ; LA32-LABEL: pick_i32_1_sext:
31 ; LA32:       # %bb.0:
32 ; LA32-NEXT:    bytepick.w $a0, $a1, $a0, 1
33 ; LA32-NEXT:    ret
35 ; LA64-LABEL: pick_i32_1_sext:
36 ; LA64:       # %bb.0:
37 ; LA64-NEXT:    bytepick.w $a0, $a1, $a0, 1
38 ; LA64-NEXT:    ret
39   %1 = lshr i32 %b, 24
40   %2 = shl i32 %a, 8
41   %3 = or i32 %1, %2
42   ret i32 %3
45 ;; a=00112233 b=44556677
46 ;; expected 22334455
47 define i32 @pick_i32_2(i32 %a, i32 %b) {
48 ; LA32-LABEL: pick_i32_2:
49 ; LA32:       # %bb.0:
50 ; LA32-NEXT:    bytepick.w $a0, $a1, $a0, 2
51 ; LA32-NEXT:    ret
53 ; LA64-LABEL: pick_i32_2:
54 ; LA64:       # %bb.0:
55 ; LA64-NEXT:    slli.d $a0, $a0, 16
56 ; LA64-NEXT:    bstrpick.d $a1, $a1, 31, 16
57 ; LA64-NEXT:    or $a0, $a1, $a0
58 ; LA64-NEXT:    ret
59   %1 = lshr i32 %b, 16
60   %2 = shl i32 %a, 16
61   %3 = or i32 %1, %2
62   ret i32 %3
65 ;; a=00112233 b=44556677
66 ;; expected 22334455
67 define signext i32 @pick_i32_2_sext(i32 %a, i32 %b) {
68 ; LA32-LABEL: pick_i32_2_sext:
69 ; LA32:       # %bb.0:
70 ; LA32-NEXT:    bytepick.w $a0, $a1, $a0, 2
71 ; LA32-NEXT:    ret
73 ; LA64-LABEL: pick_i32_2_sext:
74 ; LA64:       # %bb.0:
75 ; LA64-NEXT:    bytepick.w $a0, $a1, $a0, 2
76 ; LA64-NEXT:    ret
77   %1 = lshr i32 %b, 16
78   %2 = shl i32 %a, 16
79   %3 = or i32 %1, %2
80   ret i32 %3
83 ;; a=00112233 b=44556677
84 ;; expected 33445566
85 define i32 @pick_i32_3(i32 %a, i32 %b) {
86 ; LA32-LABEL: pick_i32_3:
87 ; LA32:       # %bb.0:
88 ; LA32-NEXT:    bytepick.w $a0, $a1, $a0, 3
89 ; LA32-NEXT:    ret
91 ; LA64-LABEL: pick_i32_3:
92 ; LA64:       # %bb.0:
93 ; LA64-NEXT:    slli.d $a0, $a0, 24
94 ; LA64-NEXT:    bstrpick.d $a1, $a1, 31, 8
95 ; LA64-NEXT:    or $a0, $a1, $a0
96 ; LA64-NEXT:    ret
97   %1 = lshr i32 %b, 8
98   %2 = shl i32 %a, 24
99   %3 = or i32 %1, %2
100   ret i32 %3
103 ;; a=00112233 b=44556677
104 ;; expected 33445566
105 define signext i32 @pick_i32_3_sext(i32 %a, i32 %b) {
106 ; LA32-LABEL: pick_i32_3_sext:
107 ; LA32:       # %bb.0:
108 ; LA32-NEXT:    bytepick.w $a0, $a1, $a0, 3
109 ; LA32-NEXT:    ret
111 ; LA64-LABEL: pick_i32_3_sext:
112 ; LA64:       # %bb.0:
113 ; LA64-NEXT:    bytepick.w $a0, $a1, $a0, 3
114 ; LA64-NEXT:    ret
115   %1 = lshr i32 %b, 8
116   %2 = shl i32 %a, 24
117   %3 = or i32 %1, %2
118   ret i32 %3
121 ;; a=0011223344556677 b=8899aabbccddeeff
122 ;; expected 1122334455667788
123 define i64 @pick_i64_1(i64 %a, i64 %b) {
124 ; LA32-LABEL: pick_i64_1:
125 ; LA32:       # %bb.0:
126 ; LA32-NEXT:    bytepick.w $a2, $a3, $a0, 1
127 ; LA32-NEXT:    bytepick.w $a1, $a0, $a1, 1
128 ; LA32-NEXT:    move $a0, $a2
129 ; LA32-NEXT:    ret
131 ; LA64-LABEL: pick_i64_1:
132 ; LA64:       # %bb.0:
133 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 1
134 ; LA64-NEXT:    ret
135   %1 = lshr i64 %b, 56
136   %2 = shl i64 %a, 8
137   %3 = or i64 %1, %2
138   ret i64 %3
141 ;; a=0011223344556677 b=8899aabbccddeeff
142 ;; expected 2233445566778899
143 define i64 @pick_i64_2(i64 %a, i64 %b) {
144 ; LA32-LABEL: pick_i64_2:
145 ; LA32:       # %bb.0:
146 ; LA32-NEXT:    bytepick.w $a2, $a3, $a0, 2
147 ; LA32-NEXT:    bytepick.w $a1, $a0, $a1, 2
148 ; LA32-NEXT:    move $a0, $a2
149 ; LA32-NEXT:    ret
151 ; LA64-LABEL: pick_i64_2:
152 ; LA64:       # %bb.0:
153 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 2
154 ; LA64-NEXT:    ret
155   %1 = lshr i64 %b, 48
156   %2 = shl i64 %a, 16
157   %3 = or i64 %1, %2
158   ret i64 %3
161 ;; a=0011223344556677 b=8899aabbccddeeff
162 ;; expected 33445566778899aa
163 define i64 @pick_i64_3(i64 %a, i64 %b) {
164 ; LA32-LABEL: pick_i64_3:
165 ; LA32:       # %bb.0:
166 ; LA32-NEXT:    bytepick.w $a2, $a3, $a0, 3
167 ; LA32-NEXT:    bytepick.w $a1, $a0, $a1, 3
168 ; LA32-NEXT:    move $a0, $a2
169 ; LA32-NEXT:    ret
171 ; LA64-LABEL: pick_i64_3:
172 ; LA64:       # %bb.0:
173 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 3
174 ; LA64-NEXT:    ret
175   %1 = lshr i64 %b, 40
176   %2 = shl i64 %a, 24
177   %3 = or i64 %1, %2
178   ret i64 %3
181 ;; a=0011223344556677 b=8899aabbccddeeff
182 ;; expected 445566778899aabb
183 define i64 @pick_i64_4(i64 %a, i64 %b) {
184 ; LA32-LABEL: pick_i64_4:
185 ; LA32:       # %bb.0:
186 ; LA32-NEXT:    move $a1, $a0
187 ; LA32-NEXT:    move $a0, $a3
188 ; LA32-NEXT:    ret
190 ; LA64-LABEL: pick_i64_4:
191 ; LA64:       # %bb.0:
192 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 4
193 ; LA64-NEXT:    ret
194   %1 = lshr i64 %b, 32
195   %2 = shl i64 %a, 32
196   %3 = or i64 %1, %2
197   ret i64 %3
200 ;; a=0011223344556677 b=8899aabbccddeeff
201 ;; expected 5566778899aabbcc
202 define i64 @pick_i64_5(i64 %a, i64 %b) {
203 ; LA32-LABEL: pick_i64_5:
204 ; LA32:       # %bb.0:
205 ; LA32-NEXT:    bytepick.w $a2, $a2, $a3, 1
206 ; LA32-NEXT:    bytepick.w $a1, $a3, $a0, 1
207 ; LA32-NEXT:    move $a0, $a2
208 ; LA32-NEXT:    ret
210 ; LA64-LABEL: pick_i64_5:
211 ; LA64:       # %bb.0:
212 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 5
213 ; LA64-NEXT:    ret
214   %1 = lshr i64 %b, 24
215   %2 = shl i64 %a,40
216   %3 = or i64 %1, %2
217   ret i64 %3
220 ;; a=0011223344556677 b=8899aabbccddeeff
221 ;; expected 66778899aabbccdd
222 define i64 @pick_i64_6(i64 %a, i64 %b) {
223 ; LA32-LABEL: pick_i64_6:
224 ; LA32:       # %bb.0:
225 ; LA32-NEXT:    bytepick.w $a2, $a2, $a3, 2
226 ; LA32-NEXT:    bytepick.w $a1, $a3, $a0, 2
227 ; LA32-NEXT:    move $a0, $a2
228 ; LA32-NEXT:    ret
230 ; LA64-LABEL: pick_i64_6:
231 ; LA64:       # %bb.0:
232 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 6
233 ; LA64-NEXT:    ret
234   %1 = lshr i64 %b, 16
235   %2 = shl i64 %a, 48
236   %3 = or i64 %1, %2
237   ret i64 %3
240 ;; a=0011223344556677 b=8899aabbccddeeff
241 ;; expected 778899aabbccddee
242 define i64 @pick_i64_7(i64 %a, i64 %b) {
243 ; LA32-LABEL: pick_i64_7:
244 ; LA32:       # %bb.0:
245 ; LA32-NEXT:    bytepick.w $a2, $a2, $a3, 3
246 ; LA32-NEXT:    bytepick.w $a1, $a3, $a0, 3
247 ; LA32-NEXT:    move $a0, $a2
248 ; LA32-NEXT:    ret
250 ; LA64-LABEL: pick_i64_7:
251 ; LA64:       # %bb.0:
252 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 7
253 ; LA64-NEXT:    ret
254   %1 = lshr i64 %b, 8
255   %2 = shl i64 %a, 56
256   %3 = or i64 %1, %2
257   ret i64 %3