[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)
[llvm-project.git] / llvm / test / CodeGen / VE / Scalar / multiply.ll
blob0446e35ee5f634aca2f728221f40e08c47492237
1 ; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
3 define signext i8 @func8s(i8 signext %a, i8 signext %b) {
4 ; CHECK-LABEL: func8s:
5 ; CHECK:       # %bb.0:
6 ; CHECK-NEXT:    muls.w.sx %s0, %s1, %s0
7 ; CHECK-NEXT:    sll %s0, %s0, 56
8 ; CHECK-NEXT:    sra.l %s0, %s0, 56
9 ; CHECK-NEXT:    b.l.t (, %s10)
10   %r = mul i8 %b, %a
11   ret i8 %r
14 define signext i16 @func16s(i16 signext %a, i16 signext %b) {
15 ; CHECK-LABEL: func16s:
16 ; CHECK:       # %bb.0:
17 ; CHECK-NEXT:    muls.w.sx %s0, %s1, %s0
18 ; CHECK-NEXT:    sll %s0, %s0, 48
19 ; CHECK-NEXT:    sra.l %s0, %s0, 48
20 ; CHECK-NEXT:    b.l.t (, %s10)
21   %r = mul i16 %b, %a
22   ret i16 %r
25 define signext i32 @func32s(i32 signext %a, i32 signext %b) {
26 ; CHECK-LABEL: func32s:
27 ; CHECK:       # %bb.0:
28 ; CHECK-NEXT:    muls.w.sx %s0, %s1, %s0
29 ; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
30 ; CHECK-NEXT:    b.l.t (, %s10)
31   %r = mul nsw i32 %b, %a
32   ret i32 %r
35 define i64 @func64(i64 %a, i64 %b) {
36 ; CHECK-LABEL: func64:
37 ; CHECK:       # %bb.0:
38 ; CHECK-NEXT:    muls.l %s0, %s1, %s0
39 ; CHECK-NEXT:    b.l.t (, %s10)
40   %r = mul nsw i64 %b, %a
41   ret i64 %r
44 define i128 @func128(i128 %a, i128 %b) {
45 ; CHECK-LABEL: func128:
46 ; CHECK:       .LBB{{[0-9]+}}_2:
47 ; CHECK-NEXT:    or %s4, 0, %s1
48 ; CHECK-NEXT:    or %s5, 0, %s0
49 ; CHECK-NEXT:    lea %s0, __multi3@lo
50 ; CHECK-NEXT:    and %s0, %s0, (32)0
51 ; CHECK-NEXT:    lea.sl %s12, __multi3@hi(, %s0)
52 ; CHECK-NEXT:    or %s0, 0, %s2
53 ; CHECK-NEXT:    or %s1, 0, %s3
54 ; CHECK-NEXT:    or %s2, 0, %s5
55 ; CHECK-NEXT:    or %s3, 0, %s4
56 ; CHECK-NEXT:    bsic %s10, (, %s12)
57 ; CHECK-NEXT:    or %s11, 0, %s9
58   %r = mul nsw i128 %b, %a
59   ret i128 %r
62 define zeroext i8 @func8z(i8 zeroext %a, i8 zeroext %b) {
63 ; CHECK-LABEL: func8z:
64 ; CHECK:       # %bb.0:
65 ; CHECK-NEXT:    muls.w.sx %s0, %s1, %s0
66 ; CHECK-NEXT:    and %s0, %s0, (56)0
67 ; CHECK-NEXT:    b.l.t (, %s10)
68   %r = mul i8 %b, %a
69   ret i8 %r
72 define zeroext i16 @func16z(i16 zeroext %a, i16 zeroext %b) {
73 ; CHECK-LABEL: func16z:
74 ; CHECK:       # %bb.0:
75 ; CHECK-NEXT:    muls.w.sx %s0, %s1, %s0
76 ; CHECK-NEXT:    and %s0, %s0, (48)0
77 ; CHECK-NEXT:    b.l.t (, %s10)
78   %r = mul i16 %b, %a
79   ret i16 %r
82 define zeroext i32 @func32z(i32 zeroext %a, i32 zeroext %b) {
83 ; CHECK-LABEL: func32z:
84 ; CHECK:       # %bb.0:
85 ; CHECK-NEXT:    muls.w.sx %s0, %s1, %s0
86 ; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
87 ; CHECK-NEXT:    b.l.t (, %s10)
88   %r = mul i32 %b, %a
89   ret i32 %r
92 define i64 @func64z(i64 %a, i64 %b) {
93 ; CHECK-LABEL: func64z:
94 ; CHECK:       # %bb.0:
95 ; CHECK-NEXT:    muls.l %s0, %s1, %s0
96 ; CHECK-NEXT:    b.l.t (, %s10)
97   %r = mul i64 %b, %a
98   ret i64 %r
101 define i128 @func128z(i128 %a, i128 %b) {
102 ; CHECK-LABEL: func128z:
103 ; CHECK:       .LBB{{[0-9]+}}_2:
104 ; CHECK-NEXT:    or %s4, 0, %s1
105 ; CHECK-NEXT:    or %s5, 0, %s0
106 ; CHECK-NEXT:    lea %s0, __multi3@lo
107 ; CHECK-NEXT:    and %s0, %s0, (32)0
108 ; CHECK-NEXT:    lea.sl %s12, __multi3@hi(, %s0)
109 ; CHECK-NEXT:    or %s0, 0, %s2
110 ; CHECK-NEXT:    or %s1, 0, %s3
111 ; CHECK-NEXT:    or %s2, 0, %s5
112 ; CHECK-NEXT:    or %s3, 0, %s4
113 ; CHECK-NEXT:    bsic %s10, (, %s12)
114 ; CHECK-NEXT:    or %s11, 0, %s9
115   %r = mul i128 %b, %a
116   ret i128 %r
119 define signext i8 @funci8s(i8 signext %a) {
120 ; CHECK-LABEL: funci8s:
121 ; CHECK:       # %bb.0:
122 ; CHECK-NEXT:    muls.w.sx %s0, 5, %s0
123 ; CHECK-NEXT:    sll %s0, %s0, 56
124 ; CHECK-NEXT:    sra.l %s0, %s0, 56
125 ; CHECK-NEXT:    b.l.t (, %s10)
126   %r = mul i8 %a, 5
127   ret i8 %r
130 define signext i16 @funci16s(i16 signext %a) {
131 ; CHECK-LABEL: funci16s:
132 ; CHECK:       # %bb.0:
133 ; CHECK-NEXT:    muls.w.sx %s0, 5, %s0
134 ; CHECK-NEXT:    sll %s0, %s0, 48
135 ; CHECK-NEXT:    sra.l %s0, %s0, 48
136 ; CHECK-NEXT:    b.l.t (, %s10)
137   %r = mul i16 %a, 5
138   ret i16 %r
141 define signext i32 @funci32s(i32 signext %a) {
142 ; CHECK-LABEL: funci32s:
143 ; CHECK:       # %bb.0:
144 ; CHECK-NEXT:    muls.w.sx %s0, 5, %s0
145 ; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
146 ; CHECK-NEXT:    b.l.t (, %s10)
147   %r = mul nsw i32 %a, 5
148   ret i32 %r
151 define i64 @funci64(i64 %a) {
152 ; CHECK-LABEL: funci64:
153 ; CHECK:       # %bb.0:
154 ; CHECK-NEXT:    muls.l %s0, 5, %s0
155 ; CHECK-NEXT:    b.l.t (, %s10)
156   %r = mul nsw i64 %a, 5
157   ret i64 %r
160 define i128 @funci128(i128 %a) {
161 ; CHECK-LABEL: funci128:
162 ; CHECK:       .LBB{{[0-9]+}}_2:
163 ; CHECK-NEXT:    lea %s2, __multi3@lo
164 ; CHECK-NEXT:    and %s2, %s2, (32)0
165 ; CHECK-NEXT:    lea.sl %s12, __multi3@hi(, %s2)
166 ; CHECK-NEXT:    or %s2, 5, (0)1
167 ; CHECK-NEXT:    or %s3, 0, (0)1
168 ; CHECK-NEXT:    bsic %s10, (, %s12)
169 ; CHECK-NEXT:    or %s11, 0, %s9
170   %r = mul nsw i128 %a, 5
171   ret i128 %r
174 define zeroext i8 @funci8z(i8 zeroext %a) {
175 ; CHECK-LABEL: funci8z:
176 ; CHECK:       # %bb.0:
177 ; CHECK-NEXT:    muls.w.sx %s0, 5, %s0
178 ; CHECK-NEXT:    and %s0, %s0, (56)0
179 ; CHECK-NEXT:    b.l.t (, %s10)
180   %r = mul i8 %a, 5
181   ret i8 %r
184 define zeroext i16 @funci16z(i16 zeroext %a) {
185 ; CHECK-LABEL: funci16z:
186 ; CHECK:       # %bb.0:
187 ; CHECK-NEXT:    muls.w.sx %s0, 5, %s0
188 ; CHECK-NEXT:    and %s0, %s0, (48)0
189 ; CHECK-NEXT:    b.l.t (, %s10)
190   %r = mul i16 %a, 5
191   ret i16 %r
194 define zeroext i32 @funci32z(i32 zeroext %a) {
195 ; CHECK-LABEL: funci32z:
196 ; CHECK:       # %bb.0:
197 ; CHECK-NEXT:    muls.w.sx %s0, 5, %s0
198 ; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
199 ; CHECK-NEXT:    b.l.t (, %s10)
200   %r = mul i32 %a, 5
201   ret i32 %r
204 define i64 @funci64z(i64 %a) {
205 ; CHECK-LABEL: funci64z:
206 ; CHECK:       # %bb.0:
207 ; CHECK-NEXT:    muls.l %s0, 5, %s0
208 ; CHECK-NEXT:    b.l.t (, %s10)
209   %r = mul i64 %a, 5
210   ret i64 %r
213 define i128 @funci128z(i128 %a) {
214 ; CHECK-LABEL: funci128z:
215 ; CHECK:       .LBB{{[0-9]+}}_2:
216 ; CHECK-NEXT:    lea %s2, __multi3@lo
217 ; CHECK-NEXT:    and %s2, %s2, (32)0
218 ; CHECK-NEXT:    lea.sl %s12, __multi3@hi(, %s2)
219 ; CHECK-NEXT:    or %s2, 5, (0)1
220 ; CHECK-NEXT:    or %s3, 0, (0)1
221 ; CHECK-NEXT:    bsic %s10, (, %s12)
222 ; CHECK-NEXT:    or %s11, 0, %s9
223   %r = mul i128 %a, 5
224   ret i128 %r
227 define zeroext i32 @funci32z_2(i32 zeroext %a) {
228 ; CHECK-LABEL: funci32z_2:
229 ; CHECK:       # %bb.0:
230 ; CHECK-NEXT:    sla.w.sx %s0, %s0, 31
231 ; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
232 ; CHECK-NEXT:    b.l.t (, %s10)
233   %r = shl i32 %a, 31
234   ret i32 %r
237 define i64 @funci64_2(i64 %a) {
238 ; CHECK-LABEL: funci64_2:
239 ; CHECK:       # %bb.0:
240 ; CHECK-NEXT:    sll %s0, %s0, 31
241 ; CHECK-NEXT:    b.l.t (, %s10)
242   %r = shl nsw i64 %a, 31
243   ret i64 %r
246 define i128 @funci128_2(i128 %a) {
247 ; CHECK-LABEL: funci128_2:
248 ; CHECK:       # %bb.0:
249 ; CHECK-NEXT:    srl %s2, %s0, 33
250 ; CHECK-NEXT:    sll %s1, %s1, 31
251 ; CHECK-NEXT:    or %s1, %s1, %s2
252 ; CHECK-NEXT:    sll %s0, %s0, 31
253 ; CHECK-NEXT:    b.l.t (, %s10)
254   %r = shl nsw i128 %a, 31
255   ret i128 %r