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
9 define i32 @pick_i32_1(i32 %a, i32 %b) {
10 ; LA32-LABEL: pick_i32_1:
12 ; LA32-NEXT: bytepick.w $a0, $a1, $a0, 1
15 ; LA64-LABEL: pick_i32_1:
17 ; LA64-NEXT: bstrpick.d $a1, $a1, 31, 24
18 ; LA64-NEXT: slli.d $a0, $a0, 8
19 ; LA64-NEXT: or $a0, $a1, $a0
27 ;; a=00112233 b=44556677
29 define signext i32 @pick_i32_1_sext(i32 %a, i32 %b) {
30 ; LA32-LABEL: pick_i32_1_sext:
32 ; LA32-NEXT: bytepick.w $a0, $a1, $a0, 1
35 ; LA64-LABEL: pick_i32_1_sext:
37 ; LA64-NEXT: bytepick.w $a0, $a1, $a0, 1
45 ;; a=00112233 b=44556677
47 define i32 @pick_i32_2(i32 %a, i32 %b) {
48 ; LA32-LABEL: pick_i32_2:
50 ; LA32-NEXT: bytepick.w $a0, $a1, $a0, 2
53 ; LA64-LABEL: pick_i32_2:
55 ; LA64-NEXT: bstrpick.d $a1, $a1, 31, 16
56 ; LA64-NEXT: slli.d $a0, $a0, 16
57 ; LA64-NEXT: or $a0, $a1, $a0
65 ;; a=00112233 b=44556677
67 define signext i32 @pick_i32_2_sext(i32 %a, i32 %b) {
68 ; LA32-LABEL: pick_i32_2_sext:
70 ; LA32-NEXT: bytepick.w $a0, $a1, $a0, 2
73 ; LA64-LABEL: pick_i32_2_sext:
75 ; LA64-NEXT: bytepick.w $a0, $a1, $a0, 2
83 ;; a=00112233 b=44556677
85 define i32 @pick_i32_3(i32 %a, i32 %b) {
86 ; LA32-LABEL: pick_i32_3:
88 ; LA32-NEXT: bytepick.w $a0, $a1, $a0, 3
91 ; LA64-LABEL: pick_i32_3:
93 ; LA64-NEXT: bstrpick.d $a1, $a1, 31, 8
94 ; LA64-NEXT: slli.d $a0, $a0, 24
95 ; LA64-NEXT: or $a0, $a1, $a0
103 ;; a=00112233 b=44556677
105 define signext i32 @pick_i32_3_sext(i32 %a, i32 %b) {
106 ; LA32-LABEL: pick_i32_3_sext:
108 ; LA32-NEXT: bytepick.w $a0, $a1, $a0, 3
111 ; LA64-LABEL: pick_i32_3_sext:
113 ; LA64-NEXT: bytepick.w $a0, $a1, $a0, 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:
126 ; LA32-NEXT: bytepick.w $a1, $a0, $a1, 1
127 ; LA32-NEXT: bytepick.w $a0, $a3, $a0, 1
130 ; LA64-LABEL: pick_i64_1:
132 ; LA64-NEXT: bytepick.d $a0, $a1, $a0, 1
140 ;; a=0011223344556677 b=8899aabbccddeeff
141 ;; expected 2233445566778899
142 define i64 @pick_i64_2(i64 %a, i64 %b) {
143 ; LA32-LABEL: pick_i64_2:
145 ; LA32-NEXT: bytepick.w $a1, $a0, $a1, 2
146 ; LA32-NEXT: bytepick.w $a0, $a3, $a0, 2
149 ; LA64-LABEL: pick_i64_2:
151 ; LA64-NEXT: bytepick.d $a0, $a1, $a0, 2
159 ;; a=0011223344556677 b=8899aabbccddeeff
160 ;; expected 33445566778899aa
161 define i64 @pick_i64_3(i64 %a, i64 %b) {
162 ; LA32-LABEL: pick_i64_3:
164 ; LA32-NEXT: bytepick.w $a1, $a0, $a1, 3
165 ; LA32-NEXT: bytepick.w $a0, $a3, $a0, 3
168 ; LA64-LABEL: pick_i64_3:
170 ; LA64-NEXT: bytepick.d $a0, $a1, $a0, 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:
183 ; LA32-NEXT: move $a1, $a0
184 ; LA32-NEXT: move $a0, $a3
187 ; LA64-LABEL: pick_i64_4:
189 ; LA64-NEXT: bytepick.d $a0, $a1, $a0, 4
197 ;; a=0011223344556677 b=8899aabbccddeeff
198 ;; expected 5566778899aabbcc
199 define i64 @pick_i64_5(i64 %a, i64 %b) {
200 ; LA32-LABEL: pick_i64_5:
202 ; LA32-NEXT: bytepick.w $a2, $a2, $a3, 1
203 ; LA32-NEXT: bytepick.w $a1, $a3, $a0, 1
204 ; LA32-NEXT: move $a0, $a2
207 ; LA64-LABEL: pick_i64_5:
209 ; LA64-NEXT: bytepick.d $a0, $a1, $a0, 5
217 ;; a=0011223344556677 b=8899aabbccddeeff
218 ;; expected 66778899aabbccdd
219 define i64 @pick_i64_6(i64 %a, i64 %b) {
220 ; LA32-LABEL: pick_i64_6:
222 ; LA32-NEXT: bytepick.w $a2, $a2, $a3, 2
223 ; LA32-NEXT: bytepick.w $a1, $a3, $a0, 2
224 ; LA32-NEXT: move $a0, $a2
227 ; LA64-LABEL: pick_i64_6:
229 ; LA64-NEXT: bytepick.d $a0, $a1, $a0, 6
237 ;; a=0011223344556677 b=8899aabbccddeeff
238 ;; expected 778899aabbccddee
239 define i64 @pick_i64_7(i64 %a, i64 %b) {
240 ; LA32-LABEL: pick_i64_7:
242 ; LA32-NEXT: bytepick.w $a2, $a2, $a3, 3
243 ; LA32-NEXT: bytepick.w $a1, $a3, $a0, 3
244 ; LA32-NEXT: move $a0, $a2
247 ; LA64-LABEL: pick_i64_7:
249 ; LA64-NEXT: bytepick.d $a0, $a1, $a0, 7