[LoongArch] Eliminate the redundant sign extension of division (#107971)
[llvm-project.git] / llvm / test / CodeGen / LoongArch / bytepick.ll
blob22a78bcd561199320c0bfdad631f368bb928b37d
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 -mattr=+d --verify-machineinstrs < %s \
3 ; RUN:   | FileCheck %s --check-prefix=LA32
4 ; RUN: llc --mtriple=loongarch64 -mattr=+d --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:    bstrpick.d $a1, $a1, 31, 24
18 ; LA64-NEXT:    slli.d $a0, $a0, 8
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:    bstrpick.d $a1, $a1, 31, 16
56 ; LA64-NEXT:    slli.d $a0, $a0, 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:    bstrpick.d $a1, $a1, 31, 8
94 ; LA64-NEXT:    slli.d $a0, $a0, 24
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 $a1, $a0, $a1, 1
127 ; LA32-NEXT:    bytepick.w $a0, $a3, $a0, 1
128 ; LA32-NEXT:    ret
130 ; LA64-LABEL: pick_i64_1:
131 ; LA64:       # %bb.0:
132 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 1
133 ; LA64-NEXT:    ret
134   %1 = lshr i64 %b, 56
135   %2 = shl i64 %a, 8
136   %3 = or i64 %1, %2
137   ret i64 %3
140 ;; a=0011223344556677 b=8899aabbccddeeff
141 ;; expected 2233445566778899
142 define i64 @pick_i64_2(i64 %a, i64 %b) {
143 ; LA32-LABEL: pick_i64_2:
144 ; LA32:       # %bb.0:
145 ; LA32-NEXT:    bytepick.w $a1, $a0, $a1, 2
146 ; LA32-NEXT:    bytepick.w $a0, $a3, $a0, 2
147 ; LA32-NEXT:    ret
149 ; LA64-LABEL: pick_i64_2:
150 ; LA64:       # %bb.0:
151 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 2
152 ; LA64-NEXT:    ret
153   %1 = lshr i64 %b, 48
154   %2 = shl i64 %a, 16
155   %3 = or i64 %1, %2
156   ret i64 %3
159 ;; a=0011223344556677 b=8899aabbccddeeff
160 ;; expected 33445566778899aa
161 define i64 @pick_i64_3(i64 %a, i64 %b) {
162 ; LA32-LABEL: pick_i64_3:
163 ; LA32:       # %bb.0:
164 ; LA32-NEXT:    bytepick.w $a1, $a0, $a1, 3
165 ; LA32-NEXT:    bytepick.w $a0, $a3, $a0, 3
166 ; LA32-NEXT:    ret
168 ; LA64-LABEL: pick_i64_3:
169 ; LA64:       # %bb.0:
170 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 3
171 ; LA64-NEXT:    ret
172   %1 = lshr i64 %b, 40
173   %2 = shl i64 %a, 24
174   %3 = or i64 %1, %2
175   ret i64 %3
178 ;; a=0011223344556677 b=8899aabbccddeeff
179 ;; expected 445566778899aabb
180 define i64 @pick_i64_4(i64 %a, i64 %b) {
181 ; LA32-LABEL: pick_i64_4:
182 ; LA32:       # %bb.0:
183 ; LA32-NEXT:    move $a1, $a0
184 ; LA32-NEXT:    move $a0, $a3
185 ; LA32-NEXT:    ret
187 ; LA64-LABEL: pick_i64_4:
188 ; LA64:       # %bb.0:
189 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 4
190 ; LA64-NEXT:    ret
191   %1 = lshr i64 %b, 32
192   %2 = shl i64 %a, 32
193   %3 = or i64 %1, %2
194   ret i64 %3
197 ;; a=0011223344556677 b=8899aabbccddeeff
198 ;; expected 5566778899aabbcc
199 define i64 @pick_i64_5(i64 %a, i64 %b) {
200 ; LA32-LABEL: pick_i64_5:
201 ; LA32:       # %bb.0:
202 ; LA32-NEXT:    bytepick.w $a2, $a2, $a3, 1
203 ; LA32-NEXT:    bytepick.w $a1, $a3, $a0, 1
204 ; LA32-NEXT:    move $a0, $a2
205 ; LA32-NEXT:    ret
207 ; LA64-LABEL: pick_i64_5:
208 ; LA64:       # %bb.0:
209 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 5
210 ; LA64-NEXT:    ret
211   %1 = lshr i64 %b, 24
212   %2 = shl i64 %a,40
213   %3 = or i64 %1, %2
214   ret i64 %3
217 ;; a=0011223344556677 b=8899aabbccddeeff
218 ;; expected 66778899aabbccdd
219 define i64 @pick_i64_6(i64 %a, i64 %b) {
220 ; LA32-LABEL: pick_i64_6:
221 ; LA32:       # %bb.0:
222 ; LA32-NEXT:    bytepick.w $a2, $a2, $a3, 2
223 ; LA32-NEXT:    bytepick.w $a1, $a3, $a0, 2
224 ; LA32-NEXT:    move $a0, $a2
225 ; LA32-NEXT:    ret
227 ; LA64-LABEL: pick_i64_6:
228 ; LA64:       # %bb.0:
229 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 6
230 ; LA64-NEXT:    ret
231   %1 = lshr i64 %b, 16
232   %2 = shl i64 %a, 48
233   %3 = or i64 %1, %2
234   ret i64 %3
237 ;; a=0011223344556677 b=8899aabbccddeeff
238 ;; expected 778899aabbccddee
239 define i64 @pick_i64_7(i64 %a, i64 %b) {
240 ; LA32-LABEL: pick_i64_7:
241 ; LA32:       # %bb.0:
242 ; LA32-NEXT:    bytepick.w $a2, $a2, $a3, 3
243 ; LA32-NEXT:    bytepick.w $a1, $a3, $a0, 3
244 ; LA32-NEXT:    move $a0, $a2
245 ; LA32-NEXT:    ret
247 ; LA64-LABEL: pick_i64_7:
248 ; LA64:       # %bb.0:
249 ; LA64-NEXT:    bytepick.d $a0, $a1, $a0, 7
250 ; LA64-NEXT:    ret
251   %1 = lshr i64 %b, 8
252   %2 = shl i64 %a, 56
253   %3 = or i64 %1, %2
254   ret i64 %3