@@ -154,3 +154,170 @@ define i128 @neg_abs_i128(i128 %x) nounwind {
154
154
%neg = sub nsw i128 0 , %abs
155
155
ret i128 %neg
156
156
}
157
+
158
+ define i8 @sub_abs_i8 (i8 %x , i8 %y ) nounwind {
159
+ ; X86-LABEL: sub_abs_i8:
160
+ ; X86: # %bb.0:
161
+ ; X86-NEXT: movb {{[0-9]+}}(%esp), %al
162
+ ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl
163
+ ; X86-NEXT: movl %ecx, %edx
164
+ ; X86-NEXT: sarb $7, %dl
165
+ ; X86-NEXT: addb %dl, %cl
166
+ ; X86-NEXT: xorb %dl, %cl
167
+ ; X86-NEXT: subb %cl, %al
168
+ ; X86-NEXT: retl
169
+ ;
170
+ ; X64-LABEL: sub_abs_i8:
171
+ ; X64: # %bb.0:
172
+ ; X64-NEXT: movl %esi, %eax
173
+ ; X64-NEXT: movl %edi, %ecx
174
+ ; X64-NEXT: sarb $7, %cl
175
+ ; X64-NEXT: addb %cl, %dil
176
+ ; X64-NEXT: xorb %cl, %dil
177
+ ; X64-NEXT: subb %dil, %al
178
+ ; X64-NEXT: # kill: def $al killed $al killed $eax
179
+ ; X64-NEXT: retq
180
+ %abs = tail call i8 @llvm.abs.i8 (i8 %x , i1 false )
181
+ %neg = sub nsw i8 %y , %abs
182
+ ret i8 %neg
183
+ }
184
+
185
+ define i16 @sub_abs_i16 (i16 %x , i16 %y ) nounwind {
186
+ ; X86-LABEL: sub_abs_i16:
187
+ ; X86: # %bb.0:
188
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
189
+ ; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx
190
+ ; X86-NEXT: movl %ecx, %edx
191
+ ; X86-NEXT: sarl $15, %edx
192
+ ; X86-NEXT: addl %edx, %ecx
193
+ ; X86-NEXT: xorl %edx, %ecx
194
+ ; X86-NEXT: subl %ecx, %eax
195
+ ; X86-NEXT: # kill: def $ax killed $ax killed $eax
196
+ ; X86-NEXT: retl
197
+ ;
198
+ ; X64-LABEL: sub_abs_i16:
199
+ ; X64: # %bb.0:
200
+ ; X64-NEXT: movl %esi, %eax
201
+ ; X64-NEXT: movl %edi, %ecx
202
+ ; X64-NEXT: negw %cx
203
+ ; X64-NEXT: cmovsw %di, %cx
204
+ ; X64-NEXT: subl %ecx, %eax
205
+ ; X64-NEXT: # kill: def $ax killed $ax killed $eax
206
+ ; X64-NEXT: retq
207
+ %abs = tail call i16 @llvm.abs.i16 (i16 %x , i1 false )
208
+ %neg = sub i16 %y , %abs
209
+ ret i16 %neg
210
+ }
211
+
212
+ define i32 @sub_abs_i32 (i32 %x , i32 %y ) nounwind {
213
+ ; X86-LABEL: sub_abs_i32:
214
+ ; X86: # %bb.0:
215
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
216
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
217
+ ; X86-NEXT: movl %ecx, %edx
218
+ ; X86-NEXT: sarl $31, %edx
219
+ ; X86-NEXT: addl %edx, %ecx
220
+ ; X86-NEXT: xorl %edx, %ecx
221
+ ; X86-NEXT: subl %ecx, %eax
222
+ ; X86-NEXT: retl
223
+ ;
224
+ ; X64-LABEL: sub_abs_i32:
225
+ ; X64: # %bb.0:
226
+ ; X64-NEXT: movl %esi, %eax
227
+ ; X64-NEXT: movl %edi, %ecx
228
+ ; X64-NEXT: negl %ecx
229
+ ; X64-NEXT: cmovsl %edi, %ecx
230
+ ; X64-NEXT: subl %ecx, %eax
231
+ ; X64-NEXT: retq
232
+ %abs = tail call i32 @llvm.abs.i32 (i32 %x , i1 false )
233
+ %neg = sub i32 %y , %abs
234
+ ret i32 %neg
235
+ }
236
+
237
+ define i64 @sub_abs_i64 (i64 %x , i64 %y ) nounwind {
238
+ ; X86-LABEL: sub_abs_i64:
239
+ ; X86: # %bb.0:
240
+ ; X86-NEXT: pushl %edi
241
+ ; X86-NEXT: pushl %esi
242
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
243
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
244
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
245
+ ; X86-NEXT: movl %ecx, %esi
246
+ ; X86-NEXT: sarl $31, %esi
247
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
248
+ ; X86-NEXT: addl %esi, %edi
249
+ ; X86-NEXT: adcl %esi, %ecx
250
+ ; X86-NEXT: xorl %esi, %ecx
251
+ ; X86-NEXT: xorl %esi, %edi
252
+ ; X86-NEXT: subl %edi, %eax
253
+ ; X86-NEXT: sbbl %ecx, %edx
254
+ ; X86-NEXT: popl %esi
255
+ ; X86-NEXT: popl %edi
256
+ ; X86-NEXT: retl
257
+ ;
258
+ ; X64-LABEL: sub_abs_i64:
259
+ ; X64: # %bb.0:
260
+ ; X64-NEXT: movq %rsi, %rax
261
+ ; X64-NEXT: movq %rdi, %rcx
262
+ ; X64-NEXT: negq %rcx
263
+ ; X64-NEXT: cmovsq %rdi, %rcx
264
+ ; X64-NEXT: subq %rcx, %rax
265
+ ; X64-NEXT: retq
266
+ %abs = tail call i64 @llvm.abs.i64 (i64 %x , i1 false )
267
+ %neg = sub i64 %y , %abs
268
+ ret i64 %neg
269
+ }
270
+
271
+ define i128 @sub_abs_i128 (i128 %x , i128 %y ) nounwind {
272
+ ; X86-LABEL: sub_abs_i128:
273
+ ; X86: # %bb.0:
274
+ ; X86-NEXT: pushl %edi
275
+ ; X86-NEXT: pushl %esi
276
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
277
+ ; X86-NEXT: movl %eax, %ecx
278
+ ; X86-NEXT: sarl $31, %ecx
279
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
280
+ ; X86-NEXT: addl %ecx, %edx
281
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
282
+ ; X86-NEXT: adcl %ecx, %esi
283
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
284
+ ; X86-NEXT: adcl %ecx, %edi
285
+ ; X86-NEXT: adcl %ecx, %eax
286
+ ; X86-NEXT: xorl %ecx, %eax
287
+ ; X86-NEXT: xorl %ecx, %edi
288
+ ; X86-NEXT: xorl %ecx, %esi
289
+ ; X86-NEXT: xorl %ecx, %edx
290
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
291
+ ; X86-NEXT: subl %edx, %ecx
292
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
293
+ ; X86-NEXT: sbbl %esi, %edx
294
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
295
+ ; X86-NEXT: sbbl %edi, %esi
296
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
297
+ ; X86-NEXT: sbbl %eax, %edi
298
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
299
+ ; X86-NEXT: movl %ecx, (%eax)
300
+ ; X86-NEXT: movl %edx, 4(%eax)
301
+ ; X86-NEXT: movl %esi, 8(%eax)
302
+ ; X86-NEXT: movl %edi, 12(%eax)
303
+ ; X86-NEXT: popl %esi
304
+ ; X86-NEXT: popl %edi
305
+ ; X86-NEXT: retl $4
306
+ ;
307
+ ; X64-LABEL: sub_abs_i128:
308
+ ; X64: # %bb.0:
309
+ ; X64-NEXT: movq %rdx, %rax
310
+ ; X64-NEXT: movq %rsi, %rdx
311
+ ; X64-NEXT: sarq $63, %rdx
312
+ ; X64-NEXT: addq %rdx, %rdi
313
+ ; X64-NEXT: adcq %rdx, %rsi
314
+ ; X64-NEXT: xorq %rdx, %rsi
315
+ ; X64-NEXT: xorq %rdx, %rdi
316
+ ; X64-NEXT: subq %rdi, %rax
317
+ ; X64-NEXT: sbbq %rsi, %rcx
318
+ ; X64-NEXT: movq %rcx, %rdx
319
+ ; X64-NEXT: retq
320
+ %abs = tail call i128 @llvm.abs.i128 (i128 %x , i1 false )
321
+ %neg = sub i128 %y , %abs
322
+ ret i128 %neg
323
+ }
0 commit comments