1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2 ; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s
4 define void @mul_v32i8(ptr %res, ptr %a0, ptr %a1) nounwind {
5 ; CHECK-LABEL: mul_v32i8:
6 ; CHECK: # %bb.0: # %entry
7 ; CHECK-NEXT: xvld $xr0, $a1, 0
8 ; CHECK-NEXT: xvld $xr1, $a2, 0
9 ; CHECK-NEXT: xvmul.b $xr0, $xr0, $xr1
10 ; CHECK-NEXT: xvst $xr0, $a0, 0
13 %v0 = load <32 x i8>, ptr %a0
14 %v1 = load <32 x i8>, ptr %a1
15 %v2 = mul <32 x i8> %v0, %v1
16 store <32 x i8> %v2, ptr %res
20 define void @mul_v16i16(ptr %res, ptr %a0, ptr %a1) nounwind {
21 ; CHECK-LABEL: mul_v16i16:
22 ; CHECK: # %bb.0: # %entry
23 ; CHECK-NEXT: xvld $xr0, $a1, 0
24 ; CHECK-NEXT: xvld $xr1, $a2, 0
25 ; CHECK-NEXT: xvmul.h $xr0, $xr0, $xr1
26 ; CHECK-NEXT: xvst $xr0, $a0, 0
29 %v0 = load <16 x i16>, ptr %a0
30 %v1 = load <16 x i16>, ptr %a1
31 %v2 = mul <16 x i16> %v0, %v1
32 store <16 x i16> %v2, ptr %res
36 define void @mul_v8i32(ptr %res, ptr %a0, ptr %a1) nounwind {
37 ; CHECK-LABEL: mul_v8i32:
38 ; CHECK: # %bb.0: # %entry
39 ; CHECK-NEXT: xvld $xr0, $a1, 0
40 ; CHECK-NEXT: xvld $xr1, $a2, 0
41 ; CHECK-NEXT: xvmul.w $xr0, $xr0, $xr1
42 ; CHECK-NEXT: xvst $xr0, $a0, 0
45 %v0 = load <8 x i32>, ptr %a0
46 %v1 = load <8 x i32>, ptr %a1
47 %v2 = mul <8 x i32> %v0, %v1
48 store <8 x i32> %v2, ptr %res
52 define void @mul_v4i64(ptr %res, ptr %a0, ptr %a1) nounwind {
53 ; CHECK-LABEL: mul_v4i64:
54 ; CHECK: # %bb.0: # %entry
55 ; CHECK-NEXT: xvld $xr0, $a1, 0
56 ; CHECK-NEXT: xvld $xr1, $a2, 0
57 ; CHECK-NEXT: xvmul.d $xr0, $xr0, $xr1
58 ; CHECK-NEXT: xvst $xr0, $a0, 0
61 %v0 = load <4 x i64>, ptr %a0
62 %v1 = load <4 x i64>, ptr %a1
63 %v2 = mul <4 x i64> %v0, %v1
64 store <4 x i64> %v2, ptr %res
68 define void @mul_square_v32i8(ptr %res, ptr %a0) nounwind {
69 ; CHECK-LABEL: mul_square_v32i8:
70 ; CHECK: # %bb.0: # %entry
71 ; CHECK-NEXT: xvld $xr0, $a1, 0
72 ; CHECK-NEXT: xvmul.b $xr0, $xr0, $xr0
73 ; CHECK-NEXT: xvst $xr0, $a0, 0
76 %v0 = load <32 x i8>, ptr %a0
77 %v1 = mul <32 x i8> %v0, %v0
78 store <32 x i8> %v1, ptr %res
82 define void @mul_square_v16i16(ptr %res, ptr %a0) nounwind {
83 ; CHECK-LABEL: mul_square_v16i16:
84 ; CHECK: # %bb.0: # %entry
85 ; CHECK-NEXT: xvld $xr0, $a1, 0
86 ; CHECK-NEXT: xvmul.h $xr0, $xr0, $xr0
87 ; CHECK-NEXT: xvst $xr0, $a0, 0
90 %v0 = load <16 x i16>, ptr %a0
91 %v1 = mul <16 x i16> %v0, %v0
92 store <16 x i16> %v1, ptr %res
96 define void @mul_square_v8i32(ptr %res, ptr %a0) nounwind {
97 ; CHECK-LABEL: mul_square_v8i32:
98 ; CHECK: # %bb.0: # %entry
99 ; CHECK-NEXT: xvld $xr0, $a1, 0
100 ; CHECK-NEXT: xvmul.w $xr0, $xr0, $xr0
101 ; CHECK-NEXT: xvst $xr0, $a0, 0
104 %v0 = load <8 x i32>, ptr %a0
105 %v1 = mul <8 x i32> %v0, %v0
106 store <8 x i32> %v1, ptr %res
110 define void @mul_square_v4i64(ptr %res, ptr %a0) nounwind {
111 ; CHECK-LABEL: mul_square_v4i64:
112 ; CHECK: # %bb.0: # %entry
113 ; CHECK-NEXT: xvld $xr0, $a1, 0
114 ; CHECK-NEXT: xvmul.d $xr0, $xr0, $xr0
115 ; CHECK-NEXT: xvst $xr0, $a0, 0
118 %v0 = load <4 x i64>, ptr %a0
119 %v1 = mul <4 x i64> %v0, %v0
120 store <4 x i64> %v1, ptr %res
124 define void @mul_v32i8_8(ptr %res, ptr %a0) nounwind {
125 ; CHECK-LABEL: mul_v32i8_8:
126 ; CHECK: # %bb.0: # %entry
127 ; CHECK-NEXT: xvld $xr0, $a1, 0
128 ; CHECK-NEXT: xvslli.b $xr0, $xr0, 3
129 ; CHECK-NEXT: xvst $xr0, $a0, 0
132 %v0 = load <32 x i8>, ptr %a0
133 %v1 = mul <32 x i8> %v0, <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8>
134 store <32 x i8> %v1, ptr %res
138 define void @mul_v16i16_8(ptr %res, ptr %a0) nounwind {
139 ; CHECK-LABEL: mul_v16i16_8:
140 ; CHECK: # %bb.0: # %entry
141 ; CHECK-NEXT: xvld $xr0, $a1, 0
142 ; CHECK-NEXT: xvslli.h $xr0, $xr0, 3
143 ; CHECK-NEXT: xvst $xr0, $a0, 0
146 %v0 = load <16 x i16>, ptr %a0
147 %v1 = mul <16 x i16> %v0, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
148 store <16 x i16> %v1, ptr %res
152 define void @mul_v8i32_8(ptr %res, ptr %a0) nounwind {
153 ; CHECK-LABEL: mul_v8i32_8:
154 ; CHECK: # %bb.0: # %entry
155 ; CHECK-NEXT: xvld $xr0, $a1, 0
156 ; CHECK-NEXT: xvslli.w $xr0, $xr0, 3
157 ; CHECK-NEXT: xvst $xr0, $a0, 0
160 %v0 = load <8 x i32>, ptr %a0
161 %v1 = mul <8 x i32> %v0, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
162 store <8 x i32> %v1, ptr %res
166 define void @mul_v4i64_8(ptr %res, ptr %a0) nounwind {
167 ; CHECK-LABEL: mul_v4i64_8:
168 ; CHECK: # %bb.0: # %entry
169 ; CHECK-NEXT: xvld $xr0, $a1, 0
170 ; CHECK-NEXT: xvslli.d $xr0, $xr0, 3
171 ; CHECK-NEXT: xvst $xr0, $a0, 0
174 %v0 = load <4 x i64>, ptr %a0
175 %v1 = mul <4 x i64> %v0, <i64 8, i64 8, i64 8, i64 8>
176 store <4 x i64> %v1, ptr %res
180 define void @mul_v32i8_17(ptr %res, ptr %a0) nounwind {
181 ; CHECK-LABEL: mul_v32i8_17:
182 ; CHECK: # %bb.0: # %entry
183 ; CHECK-NEXT: xvld $xr0, $a1, 0
184 ; CHECK-NEXT: xvrepli.b $xr1, 17
185 ; CHECK-NEXT: xvmul.b $xr0, $xr0, $xr1
186 ; CHECK-NEXT: xvst $xr0, $a0, 0
189 %v0 = load <32 x i8>, ptr %a0
190 %v1 = mul <32 x i8> %v0, <i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17>
191 store <32 x i8> %v1, ptr %res
195 define void @mul_v16i16_17(ptr %res, ptr %a0) nounwind {
196 ; CHECK-LABEL: mul_v16i16_17:
197 ; CHECK: # %bb.0: # %entry
198 ; CHECK-NEXT: xvld $xr0, $a1, 0
199 ; CHECK-NEXT: xvrepli.h $xr1, 17
200 ; CHECK-NEXT: xvmul.h $xr0, $xr0, $xr1
201 ; CHECK-NEXT: xvst $xr0, $a0, 0
204 %v0 = load <16 x i16>, ptr %a0
205 %v1 = mul <16 x i16> %v0, <i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17>
206 store <16 x i16> %v1, ptr %res
210 define void @mul_v8i32_17(ptr %res, ptr %a0) nounwind {
211 ; CHECK-LABEL: mul_v8i32_17:
212 ; CHECK: # %bb.0: # %entry
213 ; CHECK-NEXT: xvld $xr0, $a1, 0
214 ; CHECK-NEXT: xvrepli.w $xr1, 17
215 ; CHECK-NEXT: xvmul.w $xr0, $xr0, $xr1
216 ; CHECK-NEXT: xvst $xr0, $a0, 0
219 %v0 = load <8 x i32>, ptr %a0
220 %v1 = mul <8 x i32> %v0, <i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17>
221 store <8 x i32> %v1, ptr %res
225 define void @mul_v4i64_17(ptr %res, ptr %a0) nounwind {
226 ; CHECK-LABEL: mul_v4i64_17:
227 ; CHECK: # %bb.0: # %entry
228 ; CHECK-NEXT: xvld $xr0, $a1, 0
229 ; CHECK-NEXT: xvrepli.d $xr1, 17
230 ; CHECK-NEXT: xvmul.d $xr0, $xr0, $xr1
231 ; CHECK-NEXT: xvst $xr0, $a0, 0
234 %v0 = load <4 x i64>, ptr %a0
235 %v1 = mul <4 x i64> %v0, <i64 17, i64 17, i64 17, i64 17>
236 store <4 x i64> %v1, ptr %res