xref: /llvm-project/llvm/test/CodeGen/LoongArch/lasx/ir-instruction/mul.ll (revision a5c90e48b6f11bc6db7344503589648f76b16d80)
1dbbc7c31Sleecheechen; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2dbbc7c31Sleecheechen; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s
3dbbc7c31Sleecheechen
4dbbc7c31Sleecheechendefine void @mul_v32i8(ptr %res, ptr %a0, ptr %a1) nounwind {
5dbbc7c31Sleecheechen; CHECK-LABEL: mul_v32i8:
6dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
7*a5c90e48Swanglei; CHECK-NEXT:    xvld $xr0, $a1, 0
8*a5c90e48Swanglei; CHECK-NEXT:    xvld $xr1, $a2, 0
9*a5c90e48Swanglei; CHECK-NEXT:    xvmul.b $xr0, $xr0, $xr1
10dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
11dbbc7c31Sleecheechen; CHECK-NEXT:    ret
12dbbc7c31Sleecheechenentry:
13dbbc7c31Sleecheechen  %v0 = load <32 x i8>, ptr %a0
14dbbc7c31Sleecheechen  %v1 = load <32 x i8>, ptr %a1
15dbbc7c31Sleecheechen  %v2 = mul <32 x i8> %v0, %v1
16dbbc7c31Sleecheechen  store <32 x i8> %v2, ptr %res
17dbbc7c31Sleecheechen  ret void
18dbbc7c31Sleecheechen}
19dbbc7c31Sleecheechen
20dbbc7c31Sleecheechendefine void @mul_v16i16(ptr %res, ptr %a0, ptr %a1)  nounwind {
21dbbc7c31Sleecheechen; CHECK-LABEL: mul_v16i16:
22dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
23*a5c90e48Swanglei; CHECK-NEXT:    xvld $xr0, $a1, 0
24*a5c90e48Swanglei; CHECK-NEXT:    xvld $xr1, $a2, 0
25*a5c90e48Swanglei; CHECK-NEXT:    xvmul.h $xr0, $xr0, $xr1
26dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
27dbbc7c31Sleecheechen; CHECK-NEXT:    ret
28dbbc7c31Sleecheechenentry:
29dbbc7c31Sleecheechen  %v0 = load <16 x i16>, ptr %a0
30dbbc7c31Sleecheechen  %v1 = load <16 x i16>, ptr %a1
31dbbc7c31Sleecheechen  %v2 = mul <16 x i16> %v0, %v1
32dbbc7c31Sleecheechen  store <16 x i16> %v2, ptr %res
33dbbc7c31Sleecheechen  ret void
34dbbc7c31Sleecheechen}
35dbbc7c31Sleecheechen
36dbbc7c31Sleecheechendefine void @mul_v8i32(ptr %res, ptr %a0, ptr %a1) nounwind {
37dbbc7c31Sleecheechen; CHECK-LABEL: mul_v8i32:
38dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
39*a5c90e48Swanglei; CHECK-NEXT:    xvld $xr0, $a1, 0
40*a5c90e48Swanglei; CHECK-NEXT:    xvld $xr1, $a2, 0
41*a5c90e48Swanglei; CHECK-NEXT:    xvmul.w $xr0, $xr0, $xr1
42dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
43dbbc7c31Sleecheechen; CHECK-NEXT:    ret
44dbbc7c31Sleecheechenentry:
45dbbc7c31Sleecheechen  %v0 = load <8 x i32>, ptr %a0
46dbbc7c31Sleecheechen  %v1 = load <8 x i32>, ptr %a1
47dbbc7c31Sleecheechen  %v2 = mul <8 x i32> %v0, %v1
48dbbc7c31Sleecheechen  store <8 x i32> %v2, ptr %res
49dbbc7c31Sleecheechen  ret void
50dbbc7c31Sleecheechen}
51dbbc7c31Sleecheechen
52dbbc7c31Sleecheechendefine void @mul_v4i64(ptr %res, ptr %a0, ptr %a1) nounwind {
53dbbc7c31Sleecheechen; CHECK-LABEL: mul_v4i64:
54dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
55*a5c90e48Swanglei; CHECK-NEXT:    xvld $xr0, $a1, 0
56*a5c90e48Swanglei; CHECK-NEXT:    xvld $xr1, $a2, 0
57*a5c90e48Swanglei; CHECK-NEXT:    xvmul.d $xr0, $xr0, $xr1
58dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
59dbbc7c31Sleecheechen; CHECK-NEXT:    ret
60dbbc7c31Sleecheechenentry:
61dbbc7c31Sleecheechen  %v0 = load <4 x i64>, ptr %a0
62dbbc7c31Sleecheechen  %v1 = load <4 x i64>, ptr %a1
63dbbc7c31Sleecheechen  %v2 = mul <4 x i64> %v0, %v1
64dbbc7c31Sleecheechen  store <4 x i64> %v2, ptr %res
65dbbc7c31Sleecheechen  ret void
66dbbc7c31Sleecheechen}
67dbbc7c31Sleecheechen
68dbbc7c31Sleecheechendefine void @mul_square_v32i8(ptr %res, ptr %a0) nounwind {
69dbbc7c31Sleecheechen; CHECK-LABEL: mul_square_v32i8:
70dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
71dbbc7c31Sleecheechen; CHECK-NEXT:    xvld $xr0, $a1, 0
72dbbc7c31Sleecheechen; CHECK-NEXT:    xvmul.b $xr0, $xr0, $xr0
73dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
74dbbc7c31Sleecheechen; CHECK-NEXT:    ret
75dbbc7c31Sleecheechenentry:
76dbbc7c31Sleecheechen  %v0 = load <32 x i8>, ptr %a0
77dbbc7c31Sleecheechen  %v1 = mul <32 x i8> %v0, %v0
78dbbc7c31Sleecheechen  store <32 x i8> %v1, ptr %res
79dbbc7c31Sleecheechen  ret void
80dbbc7c31Sleecheechen}
81dbbc7c31Sleecheechen
82dbbc7c31Sleecheechendefine void @mul_square_v16i16(ptr %res, ptr %a0)  nounwind {
83dbbc7c31Sleecheechen; CHECK-LABEL: mul_square_v16i16:
84dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
85dbbc7c31Sleecheechen; CHECK-NEXT:    xvld $xr0, $a1, 0
86dbbc7c31Sleecheechen; CHECK-NEXT:    xvmul.h $xr0, $xr0, $xr0
87dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
88dbbc7c31Sleecheechen; CHECK-NEXT:    ret
89dbbc7c31Sleecheechenentry:
90dbbc7c31Sleecheechen  %v0 = load <16 x i16>, ptr %a0
91dbbc7c31Sleecheechen  %v1 = mul <16 x i16> %v0, %v0
92dbbc7c31Sleecheechen  store <16 x i16> %v1, ptr %res
93dbbc7c31Sleecheechen  ret void
94dbbc7c31Sleecheechen}
95dbbc7c31Sleecheechen
96dbbc7c31Sleecheechendefine void @mul_square_v8i32(ptr %res, ptr %a0) nounwind {
97dbbc7c31Sleecheechen; CHECK-LABEL: mul_square_v8i32:
98dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
99dbbc7c31Sleecheechen; CHECK-NEXT:    xvld $xr0, $a1, 0
100dbbc7c31Sleecheechen; CHECK-NEXT:    xvmul.w $xr0, $xr0, $xr0
101dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
102dbbc7c31Sleecheechen; CHECK-NEXT:    ret
103dbbc7c31Sleecheechenentry:
104dbbc7c31Sleecheechen  %v0 = load <8 x i32>, ptr %a0
105dbbc7c31Sleecheechen  %v1 = mul <8 x i32> %v0, %v0
106dbbc7c31Sleecheechen  store <8 x i32> %v1, ptr %res
107dbbc7c31Sleecheechen  ret void
108dbbc7c31Sleecheechen}
109dbbc7c31Sleecheechen
110dbbc7c31Sleecheechendefine void @mul_square_v4i64(ptr %res, ptr %a0) nounwind {
111dbbc7c31Sleecheechen; CHECK-LABEL: mul_square_v4i64:
112dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
113dbbc7c31Sleecheechen; CHECK-NEXT:    xvld $xr0, $a1, 0
114dbbc7c31Sleecheechen; CHECK-NEXT:    xvmul.d $xr0, $xr0, $xr0
115dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
116dbbc7c31Sleecheechen; CHECK-NEXT:    ret
117dbbc7c31Sleecheechenentry:
118dbbc7c31Sleecheechen  %v0 = load <4 x i64>, ptr %a0
119dbbc7c31Sleecheechen  %v1 = mul <4 x i64> %v0, %v0
120dbbc7c31Sleecheechen  store <4 x i64> %v1, ptr %res
121dbbc7c31Sleecheechen  ret void
122dbbc7c31Sleecheechen}
123dbbc7c31Sleecheechen
124dbbc7c31Sleecheechendefine void @mul_v32i8_8(ptr %res, ptr %a0) nounwind {
125dbbc7c31Sleecheechen; CHECK-LABEL: mul_v32i8_8:
126dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
127dbbc7c31Sleecheechen; CHECK-NEXT:    xvld $xr0, $a1, 0
128dbbc7c31Sleecheechen; CHECK-NEXT:    xvslli.b $xr0, $xr0, 3
129dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
130dbbc7c31Sleecheechen; CHECK-NEXT:    ret
131dbbc7c31Sleecheechenentry:
132dbbc7c31Sleecheechen  %v0 = load <32 x i8>, ptr %a0
133dbbc7c31Sleecheechen  %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>
134dbbc7c31Sleecheechen  store <32 x i8> %v1, ptr %res
135dbbc7c31Sleecheechen  ret void
136dbbc7c31Sleecheechen}
137dbbc7c31Sleecheechen
138dbbc7c31Sleecheechendefine void @mul_v16i16_8(ptr %res, ptr %a0)  nounwind {
139dbbc7c31Sleecheechen; CHECK-LABEL: mul_v16i16_8:
140dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
141dbbc7c31Sleecheechen; CHECK-NEXT:    xvld $xr0, $a1, 0
142dbbc7c31Sleecheechen; CHECK-NEXT:    xvslli.h $xr0, $xr0, 3
143dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
144dbbc7c31Sleecheechen; CHECK-NEXT:    ret
145dbbc7c31Sleecheechenentry:
146dbbc7c31Sleecheechen  %v0 = load <16 x i16>, ptr %a0
147dbbc7c31Sleecheechen  %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>
148dbbc7c31Sleecheechen  store <16 x i16> %v1, ptr %res
149dbbc7c31Sleecheechen  ret void
150dbbc7c31Sleecheechen}
151dbbc7c31Sleecheechen
152dbbc7c31Sleecheechendefine void @mul_v8i32_8(ptr %res, ptr %a0) nounwind {
153dbbc7c31Sleecheechen; CHECK-LABEL: mul_v8i32_8:
154dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
155dbbc7c31Sleecheechen; CHECK-NEXT:    xvld $xr0, $a1, 0
156dbbc7c31Sleecheechen; CHECK-NEXT:    xvslli.w $xr0, $xr0, 3
157dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
158dbbc7c31Sleecheechen; CHECK-NEXT:    ret
159dbbc7c31Sleecheechenentry:
160dbbc7c31Sleecheechen  %v0 = load <8 x i32>, ptr %a0
161dbbc7c31Sleecheechen  %v1 = mul <8 x i32> %v0, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
162dbbc7c31Sleecheechen  store <8 x i32> %v1, ptr %res
163dbbc7c31Sleecheechen  ret void
164dbbc7c31Sleecheechen}
165dbbc7c31Sleecheechen
166dbbc7c31Sleecheechendefine void @mul_v4i64_8(ptr %res, ptr %a0) nounwind {
167dbbc7c31Sleecheechen; CHECK-LABEL: mul_v4i64_8:
168dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
169dbbc7c31Sleecheechen; CHECK-NEXT:    xvld $xr0, $a1, 0
170dbbc7c31Sleecheechen; CHECK-NEXT:    xvslli.d $xr0, $xr0, 3
171dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
172dbbc7c31Sleecheechen; CHECK-NEXT:    ret
173dbbc7c31Sleecheechenentry:
174dbbc7c31Sleecheechen  %v0 = load <4 x i64>, ptr %a0
175dbbc7c31Sleecheechen  %v1 = mul <4 x i64> %v0, <i64 8, i64 8, i64 8, i64 8>
176dbbc7c31Sleecheechen  store <4 x i64> %v1, ptr %res
177dbbc7c31Sleecheechen  ret void
178dbbc7c31Sleecheechen}
179dbbc7c31Sleecheechen
180dbbc7c31Sleecheechendefine void @mul_v32i8_17(ptr %res, ptr %a0) nounwind {
181dbbc7c31Sleecheechen; CHECK-LABEL: mul_v32i8_17:
182dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
183dbbc7c31Sleecheechen; CHECK-NEXT:    xvld $xr0, $a1, 0
184dbbc7c31Sleecheechen; CHECK-NEXT:    xvrepli.b $xr1, 17
185dbbc7c31Sleecheechen; CHECK-NEXT:    xvmul.b $xr0, $xr0, $xr1
186dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
187dbbc7c31Sleecheechen; CHECK-NEXT:    ret
188dbbc7c31Sleecheechenentry:
189dbbc7c31Sleecheechen  %v0 = load <32 x i8>, ptr %a0
190dbbc7c31Sleecheechen  %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>
191dbbc7c31Sleecheechen  store <32 x i8> %v1, ptr %res
192dbbc7c31Sleecheechen  ret void
193dbbc7c31Sleecheechen}
194dbbc7c31Sleecheechen
195dbbc7c31Sleecheechendefine void @mul_v16i16_17(ptr %res, ptr %a0) nounwind {
196dbbc7c31Sleecheechen; CHECK-LABEL: mul_v16i16_17:
197dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
198dbbc7c31Sleecheechen; CHECK-NEXT:    xvld $xr0, $a1, 0
199dbbc7c31Sleecheechen; CHECK-NEXT:    xvrepli.h $xr1, 17
200dbbc7c31Sleecheechen; CHECK-NEXT:    xvmul.h $xr0, $xr0, $xr1
201dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
202dbbc7c31Sleecheechen; CHECK-NEXT:    ret
203dbbc7c31Sleecheechenentry:
204dbbc7c31Sleecheechen  %v0 = load <16 x i16>, ptr %a0
205dbbc7c31Sleecheechen  %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>
206dbbc7c31Sleecheechen  store <16 x i16> %v1, ptr %res
207dbbc7c31Sleecheechen  ret void
208dbbc7c31Sleecheechen}
209dbbc7c31Sleecheechen
210dbbc7c31Sleecheechendefine void @mul_v8i32_17(ptr %res, ptr %a0) nounwind {
211dbbc7c31Sleecheechen; CHECK-LABEL: mul_v8i32_17:
212dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
213dbbc7c31Sleecheechen; CHECK-NEXT:    xvld $xr0, $a1, 0
214dbbc7c31Sleecheechen; CHECK-NEXT:    xvrepli.w $xr1, 17
215dbbc7c31Sleecheechen; CHECK-NEXT:    xvmul.w $xr0, $xr0, $xr1
216dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
217dbbc7c31Sleecheechen; CHECK-NEXT:    ret
218dbbc7c31Sleecheechenentry:
219dbbc7c31Sleecheechen  %v0 = load <8 x i32>, ptr %a0
220dbbc7c31Sleecheechen  %v1 = mul <8 x i32> %v0, <i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17>
221dbbc7c31Sleecheechen  store <8 x i32> %v1, ptr %res
222dbbc7c31Sleecheechen  ret void
223dbbc7c31Sleecheechen}
224dbbc7c31Sleecheechen
225dbbc7c31Sleecheechendefine void @mul_v4i64_17(ptr %res, ptr %a0) nounwind {
226dbbc7c31Sleecheechen; CHECK-LABEL: mul_v4i64_17:
227dbbc7c31Sleecheechen; CHECK:       # %bb.0: # %entry
228dbbc7c31Sleecheechen; CHECK-NEXT:    xvld $xr0, $a1, 0
229dbbc7c31Sleecheechen; CHECK-NEXT:    xvrepli.d $xr1, 17
230dbbc7c31Sleecheechen; CHECK-NEXT:    xvmul.d $xr0, $xr0, $xr1
231dbbc7c31Sleecheechen; CHECK-NEXT:    xvst $xr0, $a0, 0
232dbbc7c31Sleecheechen; CHECK-NEXT:    ret
233dbbc7c31Sleecheechenentry:
234dbbc7c31Sleecheechen  %v0 = load <4 x i64>, ptr %a0
235dbbc7c31Sleecheechen  %v1 = mul <4 x i64> %v0, <i64 17, i64 17, i64 17, i64 17>
236dbbc7c31Sleecheechen  store <4 x i64> %v1, ptr %res
237dbbc7c31Sleecheechen  ret void
238dbbc7c31Sleecheechen}
239