Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / X86 / xaluo128.ll
blob977df0f16bb28d770b87322176b64c73b95ec1e7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-darwin-unknown < %s | FileCheck %s --check-prefix=X64
3 ; RUN: llc -mtriple=i686-darwin-unknown < %s | FileCheck %s --check-prefix=X86
5 define zeroext i1 @saddoi128(i128 %v1, i128 %v2, ptr %res) nounwind {
6 ; X64-LABEL: saddoi128:
7 ; X64:       ## %bb.0:
8 ; X64-NEXT:    addq %rdx, %rdi
9 ; X64-NEXT:    adcq %rcx, %rsi
10 ; X64-NEXT:    seto %al
11 ; X64-NEXT:    movq %rdi, (%r8)
12 ; X64-NEXT:    movq %rsi, 8(%r8)
13 ; X64-NEXT:    retq
15 ; X86-LABEL: saddoi128:
16 ; X86:       ## %bb.0:
17 ; X86-NEXT:    pushl %ebx
18 ; X86-NEXT:    pushl %edi
19 ; X86-NEXT:    pushl %esi
20 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
21 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
22 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
23 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
24 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
25 ; X86-NEXT:    addl {{[0-9]+}}(%esp), %edi
26 ; X86-NEXT:    adcl {{[0-9]+}}(%esp), %ebx
27 ; X86-NEXT:    adcl {{[0-9]+}}(%esp), %esi
28 ; X86-NEXT:    adcl {{[0-9]+}}(%esp), %edx
29 ; X86-NEXT:    seto %al
30 ; X86-NEXT:    movl %edi, (%ecx)
31 ; X86-NEXT:    movl %ebx, 4(%ecx)
32 ; X86-NEXT:    movl %esi, 8(%ecx)
33 ; X86-NEXT:    movl %edx, 12(%ecx)
34 ; X86-NEXT:    popl %esi
35 ; X86-NEXT:    popl %edi
36 ; X86-NEXT:    popl %ebx
37 ; X86-NEXT:    retl
38   %t = call {i128, i1} @llvm.sadd.with.overflow.i128(i128 %v1, i128 %v2)
39   %val = extractvalue {i128, i1} %t, 0
40   %obit = extractvalue {i128, i1} %t, 1
41   store i128 %val, ptr %res
42   ret i1 %obit
45 define zeroext i1 @uaddoi128(i128 %v1, i128 %v2, ptr %res) nounwind {
46 ; X64-LABEL: uaddoi128:
47 ; X64:       ## %bb.0:
48 ; X64-NEXT:    addq %rdx, %rdi
49 ; X64-NEXT:    adcq %rcx, %rsi
50 ; X64-NEXT:    setb %al
51 ; X64-NEXT:    movq %rdi, (%r8)
52 ; X64-NEXT:    movq %rsi, 8(%r8)
53 ; X64-NEXT:    retq
55 ; X86-LABEL: uaddoi128:
56 ; X86:       ## %bb.0:
57 ; X86-NEXT:    pushl %ebx
58 ; X86-NEXT:    pushl %edi
59 ; X86-NEXT:    pushl %esi
60 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
61 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
62 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
63 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
64 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
65 ; X86-NEXT:    addl {{[0-9]+}}(%esp), %edi
66 ; X86-NEXT:    adcl {{[0-9]+}}(%esp), %ebx
67 ; X86-NEXT:    adcl {{[0-9]+}}(%esp), %esi
68 ; X86-NEXT:    adcl {{[0-9]+}}(%esp), %edx
69 ; X86-NEXT:    setb %al
70 ; X86-NEXT:    movl %edi, (%ecx)
71 ; X86-NEXT:    movl %ebx, 4(%ecx)
72 ; X86-NEXT:    movl %esi, 8(%ecx)
73 ; X86-NEXT:    movl %edx, 12(%ecx)
74 ; X86-NEXT:    popl %esi
75 ; X86-NEXT:    popl %edi
76 ; X86-NEXT:    popl %ebx
77 ; X86-NEXT:    retl
78   %t = call {i128, i1} @llvm.uadd.with.overflow.i128(i128 %v1, i128 %v2)
79   %val = extractvalue {i128, i1} %t, 0
80   %obit = extractvalue {i128, i1} %t, 1
81   store i128 %val, ptr %res
82   ret i1 %obit
86 define zeroext i1 @ssuboi128(i128 %v1, i128 %v2, ptr %res) nounwind {
87 ; X64-LABEL: ssuboi128:
88 ; X64:       ## %bb.0:
89 ; X64-NEXT:    subq %rdx, %rdi
90 ; X64-NEXT:    sbbq %rcx, %rsi
91 ; X64-NEXT:    seto %al
92 ; X64-NEXT:    movq %rdi, (%r8)
93 ; X64-NEXT:    movq %rsi, 8(%r8)
94 ; X64-NEXT:    retq
96 ; X86-LABEL: ssuboi128:
97 ; X86:       ## %bb.0:
98 ; X86-NEXT:    pushl %ebx
99 ; X86-NEXT:    pushl %edi
100 ; X86-NEXT:    pushl %esi
101 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
102 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
103 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
104 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
105 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
106 ; X86-NEXT:    subl {{[0-9]+}}(%esp), %edi
107 ; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %ebx
108 ; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %esi
109 ; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %edx
110 ; X86-NEXT:    seto %al
111 ; X86-NEXT:    movl %edi, (%ecx)
112 ; X86-NEXT:    movl %ebx, 4(%ecx)
113 ; X86-NEXT:    movl %esi, 8(%ecx)
114 ; X86-NEXT:    movl %edx, 12(%ecx)
115 ; X86-NEXT:    popl %esi
116 ; X86-NEXT:    popl %edi
117 ; X86-NEXT:    popl %ebx
118 ; X86-NEXT:    retl
119   %t = call {i128, i1} @llvm.ssub.with.overflow.i128(i128 %v1, i128 %v2)
120   %val = extractvalue {i128, i1} %t, 0
121   %obit = extractvalue {i128, i1} %t, 1
122   store i128 %val, ptr %res
123   ret i1 %obit
126 define zeroext i1 @usuboi128(i128 %v1, i128 %v2, ptr %res) nounwind {
127 ; X64-LABEL: usuboi128:
128 ; X64:       ## %bb.0:
129 ; X64-NEXT:    subq %rdx, %rdi
130 ; X64-NEXT:    sbbq %rcx, %rsi
131 ; X64-NEXT:    setb %al
132 ; X64-NEXT:    movq %rdi, (%r8)
133 ; X64-NEXT:    movq %rsi, 8(%r8)
134 ; X64-NEXT:    retq
136 ; X86-LABEL: usuboi128:
137 ; X86:       ## %bb.0:
138 ; X86-NEXT:    pushl %ebx
139 ; X86-NEXT:    pushl %edi
140 ; X86-NEXT:    pushl %esi
141 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
142 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
143 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
144 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
145 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
146 ; X86-NEXT:    subl {{[0-9]+}}(%esp), %edi
147 ; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %ebx
148 ; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %esi
149 ; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %edx
150 ; X86-NEXT:    setb %al
151 ; X86-NEXT:    movl %edi, (%ecx)
152 ; X86-NEXT:    movl %ebx, 4(%ecx)
153 ; X86-NEXT:    movl %esi, 8(%ecx)
154 ; X86-NEXT:    movl %edx, 12(%ecx)
155 ; X86-NEXT:    popl %esi
156 ; X86-NEXT:    popl %edi
157 ; X86-NEXT:    popl %ebx
158 ; X86-NEXT:    retl
159   %t = call {i128, i1} @llvm.usub.with.overflow.i128(i128 %v1, i128 %v2)
160   %val = extractvalue {i128, i1} %t, 0
161   %obit = extractvalue {i128, i1} %t, 1
162   store i128 %val, ptr %res
163   ret i1 %obit
166 declare {i128, i1} @llvm.sadd.with.overflow.i128(i128, i128) nounwind readnone
167 declare {i128, i1} @llvm.uadd.with.overflow.i128(i128, i128) nounwind readnone
168 declare {i128, i1} @llvm.ssub.with.overflow.i128(i128, i128) nounwind readnone
169 declare {i128, i1} @llvm.usub.with.overflow.i128(i128, i128) nounwind readnone