1 ; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
3 define signext i8 @func8s(i8 signext %a, i8 signext %b) {
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)
14 define signext i16 @func16s(i16 signext %a, i16 signext %b) {
15 ; CHECK-LABEL: func16s:
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)
25 define signext i32 @func32s(i32 signext %a, i32 signext %b) {
26 ; CHECK-LABEL: func32s:
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
35 define i64 @func64(i64 %a, i64 %b) {
36 ; CHECK-LABEL: func64:
38 ; CHECK-NEXT: muls.l %s0, %s1, %s0
39 ; CHECK-NEXT: b.l.t (, %s10)
40 %r = mul nsw i64 %b, %a
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
62 define zeroext i8 @func8z(i8 zeroext %a, i8 zeroext %b) {
63 ; CHECK-LABEL: func8z:
65 ; CHECK-NEXT: muls.w.sx %s0, %s1, %s0
66 ; CHECK-NEXT: and %s0, %s0, (56)0
67 ; CHECK-NEXT: b.l.t (, %s10)
72 define zeroext i16 @func16z(i16 zeroext %a, i16 zeroext %b) {
73 ; CHECK-LABEL: func16z:
75 ; CHECK-NEXT: muls.w.sx %s0, %s1, %s0
76 ; CHECK-NEXT: and %s0, %s0, (48)0
77 ; CHECK-NEXT: b.l.t (, %s10)
82 define zeroext i32 @func32z(i32 zeroext %a, i32 zeroext %b) {
83 ; CHECK-LABEL: func32z:
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)
92 define i64 @func64z(i64 %a, i64 %b) {
93 ; CHECK-LABEL: func64z:
95 ; CHECK-NEXT: muls.l %s0, %s1, %s0
96 ; CHECK-NEXT: b.l.t (, %s10)
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
119 define signext i8 @funci8s(i8 signext %a) {
120 ; CHECK-LABEL: funci8s:
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)
130 define signext i16 @funci16s(i16 signext %a) {
131 ; CHECK-LABEL: funci16s:
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)
141 define signext i32 @funci32s(i32 signext %a) {
142 ; CHECK-LABEL: funci32s:
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
151 define i64 @funci64(i64 %a) {
152 ; CHECK-LABEL: funci64:
154 ; CHECK-NEXT: muls.l %s0, 5, %s0
155 ; CHECK-NEXT: b.l.t (, %s10)
156 %r = mul nsw i64 %a, 5
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
174 define zeroext i8 @funci8z(i8 zeroext %a) {
175 ; CHECK-LABEL: funci8z:
177 ; CHECK-NEXT: muls.w.sx %s0, 5, %s0
178 ; CHECK-NEXT: and %s0, %s0, (56)0
179 ; CHECK-NEXT: b.l.t (, %s10)
184 define zeroext i16 @funci16z(i16 zeroext %a) {
185 ; CHECK-LABEL: funci16z:
187 ; CHECK-NEXT: muls.w.sx %s0, 5, %s0
188 ; CHECK-NEXT: and %s0, %s0, (48)0
189 ; CHECK-NEXT: b.l.t (, %s10)
194 define zeroext i32 @funci32z(i32 zeroext %a) {
195 ; CHECK-LABEL: funci32z:
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)
204 define i64 @funci64z(i64 %a) {
205 ; CHECK-LABEL: funci64z:
207 ; CHECK-NEXT: muls.l %s0, 5, %s0
208 ; CHECK-NEXT: b.l.t (, %s10)
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
227 define zeroext i32 @funci32z_2(i32 zeroext %a) {
228 ; CHECK-LABEL: funci32z_2:
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)
237 define i64 @funci64_2(i64 %a) {
238 ; CHECK-LABEL: funci64_2:
240 ; CHECK-NEXT: sll %s0, %s0, 31
241 ; CHECK-NEXT: b.l.t (, %s10)
242 %r = shl nsw i64 %a, 31
246 define i128 @funci128_2(i128 %a) {
247 ; CHECK-LABEL: funci128_2:
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