[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)
[llvm-project.git] / llvm / test / CodeGen / VE / Scalar / subtraction.ll
blob7897bf1e58d9e32455505fe05bde9903bafc824e
1 ; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
3 define signext i8 @func8s(i8 signext %0, i8 signext %1) {
4 ; CHECK-LABEL: func8s:
5 ; CHECK:       # %bb.0:
6 ; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
7 ; CHECK-NEXT:    sll %s0, %s0, 56
8 ; CHECK-NEXT:    sra.l %s0, %s0, 56
9 ; CHECK-NEXT:    b.l.t (, %s10)
10   %3 = sub i8 %0, %1
11   ret i8 %3
14 define signext i16 @func16s(i16 signext %0, i16 signext %1) {
15 ; CHECK-LABEL: func16s:
16 ; CHECK:       # %bb.0:
17 ; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
18 ; CHECK-NEXT:    sll %s0, %s0, 48
19 ; CHECK-NEXT:    sra.l %s0, %s0, 48
20 ; CHECK-NEXT:    b.l.t (, %s10)
21   %3 = sub i16 %0, %1
22   ret i16 %3
25 define signext i32 @func32s(i32 signext %0, i32 signext %1) {
26 ; CHECK-LABEL: func32s:
27 ; CHECK:       # %bb.0:
28 ; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
29 ; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
30 ; CHECK-NEXT:    b.l.t (, %s10)
31   %3 = sub nsw i32 %0, %1
32   ret i32 %3
35 define i64 @func64s(i64 %0, i64 %1) {
36 ; CHECK-LABEL: func64s:
37 ; CHECK:       # %bb.0:
38 ; CHECK-NEXT:    subs.l %s0, %s0, %s1
39 ; CHECK-NEXT:    b.l.t (, %s10)
40   %3 = sub nsw i64 %0, %1
41   ret i64 %3
44 define i128 @func128s(i128 %0, i128 %1) {
45 ; CHECK-LABEL: func128s:
46 ; CHECK:       # %bb.0:
47 ; CHECK-NEXT:    subs.l %s1, %s1, %s3
48 ; CHECK-NEXT:    cmpu.l %s3, %s0, %s2
49 ; CHECK-NEXT:    or %s4, 0, (0)1
50 ; CHECK-NEXT:    cmov.l.lt %s4, (63)0, %s3
51 ; CHECK-NEXT:    adds.w.zx %s3, %s4, (0)1
52 ; CHECK-NEXT:    subs.l %s1, %s1, %s3
53 ; CHECK-NEXT:    subs.l %s0, %s0, %s2
54 ; CHECK-NEXT:    b.l.t (, %s10)
55   %3 = sub nsw i128 %0, %1
56   ret i128 %3
59 define zeroext i8 @func8z(i8 zeroext %0, i8 zeroext %1) {
60 ; CHECK-LABEL: func8z:
61 ; CHECK:       # %bb.0:
62 ; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
63 ; CHECK-NEXT:    and %s0, %s0, (56)0
64 ; CHECK-NEXT:    b.l.t (, %s10)
65   %3 = sub i8 %0, %1
66   ret i8 %3
69 define zeroext i16 @func16z(i16 zeroext %0, i16 zeroext %1) {
70 ; CHECK-LABEL: func16z:
71 ; CHECK:       # %bb.0:
72 ; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
73 ; CHECK-NEXT:    and %s0, %s0, (48)0
74 ; CHECK-NEXT:    b.l.t (, %s10)
75   %3 = sub i16 %0, %1
76   ret i16 %3
79 define zeroext i32 @func32z(i32 zeroext %0, i32 zeroext %1) {
80 ; CHECK-LABEL: func32z:
81 ; CHECK:       # %bb.0:
82 ; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
83 ; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
84 ; CHECK-NEXT:    b.l.t (, %s10)
85   %3 = sub i32 %0, %1
86   ret i32 %3
89 define i64 @func64z(i64 %0, i64 %1) {
90 ; CHECK-LABEL: func64z:
91 ; CHECK:       # %bb.0:
92 ; CHECK-NEXT:    subs.l %s0, %s0, %s1
93 ; CHECK-NEXT:    b.l.t (, %s10)
94   %3 = sub i64 %0, %1
95   ret i64 %3
98 define i128 @func128z(i128 %0, i128 %1) {
99 ; CHECK-LABEL: func128z:
100 ; CHECK:       # %bb.0:
101 ; CHECK-NEXT:    subs.l %s1, %s1, %s3
102 ; CHECK-NEXT:    cmpu.l %s3, %s0, %s2
103 ; CHECK-NEXT:    or %s4, 0, (0)1
104 ; CHECK-NEXT:    cmov.l.lt %s4, (63)0, %s3
105 ; CHECK-NEXT:    adds.w.zx %s3, %s4, (0)1
106 ; CHECK-NEXT:    subs.l %s1, %s1, %s3
107 ; CHECK-NEXT:    subs.l %s0, %s0, %s2
108 ; CHECK-NEXT:    b.l.t (, %s10)
109   %3 = sub i128 %0, %1
110   ret i128 %3
113 define signext i8 @funci8s(i8 signext %a) {
114 ; CHECK-LABEL: funci8s:
115 ; CHECK:       # %bb.0:
116 ; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
117 ; CHECK-NEXT:    sll %s0, %s0, 56
118 ; CHECK-NEXT:    sra.l %s0, %s0, 56
119 ; CHECK-NEXT:    b.l.t (, %s10)
120   %ret = add i8 %a, -5
121   ret i8 %ret
124 define signext i16 @funci16s(i16 signext %a) {
125 ; CHECK-LABEL: funci16s:
126 ; CHECK:       # %bb.0:
127 ; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
128 ; CHECK-NEXT:    sll %s0, %s0, 48
129 ; CHECK-NEXT:    sra.l %s0, %s0, 48
130 ; CHECK-NEXT:    b.l.t (, %s10)
131   %ret = add i16 %a, -5
132   ret i16 %ret
135 define signext i32 @funci32s(i32 signext %a) {
136 ; CHECK-LABEL: funci32s:
137 ; CHECK:       # %bb.0:
138 ; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
139 ; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
140 ; CHECK-NEXT:    b.l.t (, %s10)
141   %ret = add i32 %a, -5
142   ret i32 %ret
145 define i64 @funci64s(i64 %a) {
146 ; CHECK-LABEL: funci64s:
147 ; CHECK:       # %bb.0:
148 ; CHECK-NEXT:    lea %s0, -5(, %s0)
149 ; CHECK-NEXT:    b.l.t (, %s10)
150   %ret = add nsw i64 %a, -5
151   ret i64 %ret
154 define i128 @funci128s(i128 %0) {
155 ; CHECK-LABEL: funci128s:
156 ; CHECK:       # %bb.0:
157 ; CHECK-NEXT:    lea %s2, -5(, %s0)
158 ; CHECK-NEXT:    cmpu.l %s0, %s2, %s0
159 ; CHECK-NEXT:    or %s3, 0, (0)1
160 ; CHECK-NEXT:    cmov.l.lt %s3, (63)0, %s0
161 ; CHECK-NEXT:    adds.w.zx %s0, %s3, (0)1
162 ; CHECK-NEXT:    lea %s1, -1(%s0, %s1)
163 ; CHECK-NEXT:    or %s0, 0, %s2
164 ; CHECK-NEXT:    b.l.t (, %s10)
165   %2 = add nsw i128 %0, -5
166   ret i128 %2
169 define zeroext i8 @funci8z(i8 zeroext %a) {
170 ; CHECK-LABEL: funci8z:
171 ; CHECK:       # %bb.0:
172 ; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
173 ; CHECK-NEXT:    and %s0, %s0, (56)0
174 ; CHECK-NEXT:    b.l.t (, %s10)
175   %ret = add i8 %a, -5
176   ret i8 %ret
179 define zeroext i16 @funci16z(i16 zeroext %a) {
180 ; CHECK-LABEL: funci16z:
181 ; CHECK:       # %bb.0:
182 ; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
183 ; CHECK-NEXT:    and %s0, %s0, (48)0
184 ; CHECK-NEXT:    b.l.t (, %s10)
185   %ret = add i16 %a, -5
186   ret i16 %ret
189 define zeroext i32 @funci32z(i32 zeroext %a) {
190 ; CHECK-LABEL: funci32z:
191 ; CHECK:       # %bb.0:
192 ; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
193 ; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
194 ; CHECK-NEXT:    b.l.t (, %s10)
195   %ret = add i32 %a, -5
196   ret i32 %ret
199 define i64 @funci64z(i64 %a) {
200 ; CHECK-LABEL: funci64z:
201 ; CHECK:       # %bb.0:
202 ; CHECK-NEXT:    lea %s0, -5(, %s0)
203 ; CHECK-NEXT:    b.l.t (, %s10)
204   %ret = add i64 %a, -5
205   ret i64 %ret
208 define i128 @funci128z(i128 %0) {
209 ; CHECK-LABEL: funci128z:
210 ; CHECK:       # %bb.0:
211 ; CHECK-NEXT:    lea %s2, -5(, %s0)
212 ; CHECK-NEXT:    cmpu.l %s0, %s2, %s0
213 ; CHECK-NEXT:    or %s3, 0, (0)1
214 ; CHECK-NEXT:    cmov.l.lt %s3, (63)0, %s0
215 ; CHECK-NEXT:    adds.w.zx %s0, %s3, (0)1
216 ; CHECK-NEXT:    lea %s1, -1(%s0, %s1)
217 ; CHECK-NEXT:    or %s0, 0, %s2
218 ; CHECK-NEXT:    b.l.t (, %s10)
219   %2 = add i128 %0, -5
220   ret i128 %2
223 define i64 @funci64_2(i64 %a) {
224 ; CHECK-LABEL: funci64_2:
225 ; CHECK:       # %bb.0:
226 ; CHECK-NEXT:    lea %s0, -2147483648(, %s0)
227 ; CHECK-NEXT:    b.l.t (, %s10)
228   %ret = add nsw i64 %a, -2147483648
229   ret i64 %ret
232 define i128 @funci128_2(i128 %0) {
233 ; CHECK-LABEL: funci128_2:
234 ; CHECK:       # %bb.0:
235 ; CHECK-NEXT:    lea %s2, -2147483648(, %s0)
236 ; CHECK-NEXT:    cmpu.l %s0, %s2, %s0
237 ; CHECK-NEXT:    or %s3, 0, (0)1
238 ; CHECK-NEXT:    cmov.l.lt %s3, (63)0, %s0
239 ; CHECK-NEXT:    adds.w.zx %s0, %s3, (0)1
240 ; CHECK-NEXT:    lea %s1, -1(%s0, %s1)
241 ; CHECK-NEXT:    or %s0, 0, %s2
242 ; CHECK-NEXT:    b.l.t (, %s10)
243   %2 = add nsw i128 %0, -2147483648
244   ret i128 %2