xref: /llvm-project/llvm/test/CodeGen/X86/isel-x87.ll (revision a77d3ea310c61cf59c1146895b2d51fe014eb0a9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc < %s -mtriple=i686-- -mattr=+x87,-sse,-sse2 -global-isel | FileCheck %s --check-prefixes=CHECK-32,GISEL_X86
3; RUN: llc < %s -mtriple=i686-- -mattr=+x87,-sse,-sse2 | FileCheck %s --check-prefixes=CHECK-32,SDAG_X86
4; RUN: llc < %s -mtriple=i686-- -mattr=+x87,-sse,-sse2 -fast-isel=true | FileCheck %s --check-prefixes=CHECK-32,SDAG_X86,FAST_X86
5; RUN: llc < %s -mtriple=x86_64-- -mattr=+x87,-sse,-sse2 -global-isel | FileCheck %s --check-prefixes=CHECK-64,GISEL_X64
6; RUN: llc < %s -mtriple=x86_64-- -mattr=+x87,-sse,-sse2 | FileCheck %s --check-prefixes=CHECK-64,SDAG_X64
7; RUN: llc < %s -mtriple=x86_64-- -mattr=+x87,-sse,-sse2 -fast-isel=true | FileCheck %s --check-prefixes=CHECK-64,SDAG_X64,FAST_X64
8
9define x86_fp80 @f0(x86_fp80 noundef %a) nounwind {
10; GISEL_X86-LABEL: f0:
11; GISEL_X86:       # %bb.0:
12; GISEL_X86-NEXT:    pushl %ebp
13; GISEL_X86-NEXT:    movl %esp, %ebp
14; GISEL_X86-NEXT:    andl $-16, %esp
15; GISEL_X86-NEXT:    subl $48, %esp
16; GISEL_X86-NEXT:    fldt 8(%ebp)
17; GISEL_X86-NEXT:    fldt {{\.?LCPI[0-9]+_[0-9]+}}
18; GISEL_X86-NEXT:    fxch %st(1)
19; GISEL_X86-NEXT:    fstpt {{[0-9]+}}(%esp)
20; GISEL_X86-NEXT:    fstpt (%esp)
21; GISEL_X86-NEXT:    fldt {{[0-9]+}}(%esp)
22; GISEL_X86-NEXT:    fldt (%esp)
23; GISEL_X86-NEXT:    faddp %st, %st(1)
24; GISEL_X86-NEXT:    movl %ebp, %esp
25; GISEL_X86-NEXT:    popl %ebp
26; GISEL_X86-NEXT:    retl
27;
28; SDAG_X86-LABEL: f0:
29; SDAG_X86:       # %bb.0:
30; SDAG_X86-NEXT:    pushl %ebp
31; SDAG_X86-NEXT:    movl %esp, %ebp
32; SDAG_X86-NEXT:    andl $-16, %esp
33; SDAG_X86-NEXT:    subl $48, %esp
34; SDAG_X86-NEXT:    fldt 8(%ebp)
35; SDAG_X86-NEXT:    fld %st(0)
36; SDAG_X86-NEXT:    fstpt {{[0-9]+}}(%esp)
37; SDAG_X86-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
38; SDAG_X86-NEXT:    fld %st(0)
39; SDAG_X86-NEXT:    fstpt (%esp)
40; SDAG_X86-NEXT:    faddp %st, %st(1)
41; SDAG_X86-NEXT:    movl %ebp, %esp
42; SDAG_X86-NEXT:    popl %ebp
43; SDAG_X86-NEXT:    retl
44;
45; GISEL_X64-LABEL: f0:
46; GISEL_X64:       # %bb.0:
47; GISEL_X64-NEXT:    fldt {{[0-9]+}}(%rsp)
48; GISEL_X64-NEXT:    fldt {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
49; GISEL_X64-NEXT:    fxch %st(1)
50; GISEL_X64-NEXT:    fstpt -{{[0-9]+}}(%rsp)
51; GISEL_X64-NEXT:    fstpt -{{[0-9]+}}(%rsp)
52; GISEL_X64-NEXT:    fldt -{{[0-9]+}}(%rsp)
53; GISEL_X64-NEXT:    fldt -{{[0-9]+}}(%rsp)
54; GISEL_X64-NEXT:    faddp %st, %st(1)
55; GISEL_X64-NEXT:    retq
56;
57; SDAG_X64-LABEL: f0:
58; SDAG_X64:       # %bb.0:
59; SDAG_X64-NEXT:    fldt {{[0-9]+}}(%rsp)
60; SDAG_X64-NEXT:    fld %st(0)
61; SDAG_X64-NEXT:    fstpt -{{[0-9]+}}(%rsp)
62; SDAG_X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
63; SDAG_X64-NEXT:    fld %st(0)
64; SDAG_X64-NEXT:    fstpt -{{[0-9]+}}(%rsp)
65; SDAG_X64-NEXT:    faddp %st, %st(1)
66; SDAG_X64-NEXT:    retq
67  %a.addr = alloca x86_fp80, align 16
68  %x = alloca x86_fp80, align 16
69  store x86_fp80 %a, ptr %a.addr, align 16
70  store x86_fp80 0xK400A8000000000000000, ptr %x, align 16
71  %load1 = load x86_fp80, ptr %a.addr, align 16
72  %load2 = load x86_fp80, ptr %x, align 16
73  %add = fadd x86_fp80 %load1, %load2
74  ret x86_fp80 %add
75}
76
77
78define void @f1(ptr %a, ptr %b) nounwind {
79; GISEL_X86-LABEL: f1:
80; GISEL_X86:       # %bb.0:
81; GISEL_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
82; GISEL_X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
83; GISEL_X86-NEXT:    fldt (%eax)
84; GISEL_X86-NEXT:    fldt (%ecx)
85; GISEL_X86-NEXT:    fsubrp %st, %st(1)
86; GISEL_X86-NEXT:    fstpt (%eax)
87; GISEL_X86-NEXT:    retl
88;
89; SDAG_X86-LABEL: f1:
90; SDAG_X86:       # %bb.0:
91; SDAG_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
92; SDAG_X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
93; SDAG_X86-NEXT:    fldt (%ecx)
94; SDAG_X86-NEXT:    fldt (%eax)
95; SDAG_X86-NEXT:    fsubrp %st, %st(1)
96; SDAG_X86-NEXT:    fstpt (%ecx)
97; SDAG_X86-NEXT:    retl
98;
99; CHECK-64-LABEL: f1:
100; CHECK-64:       # %bb.0:
101; CHECK-64-NEXT:    fldt (%rdi)
102; CHECK-64-NEXT:    fldt (%rsi)
103; CHECK-64-NEXT:    fsubrp %st, %st(1)
104; CHECK-64-NEXT:    fstpt (%rdi)
105; CHECK-64-NEXT:    retq
106  %load1 = load x86_fp80, ptr %a, align 4
107  %load2 = load x86_fp80, ptr %b, align 4
108  %sub = fsub x86_fp80 %load1, %load2
109  store x86_fp80 %sub, ptr %a, align 4
110  ret void
111}
112
113define void @f2(ptr %a, ptr %b) nounwind {
114; GISEL_X86-LABEL: f2:
115; GISEL_X86:       # %bb.0:
116; GISEL_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
117; GISEL_X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
118; GISEL_X86-NEXT:    fldt (%eax)
119; GISEL_X86-NEXT:    fldt (%ecx)
120; GISEL_X86-NEXT:    fmulp %st, %st(1)
121; GISEL_X86-NEXT:    fstpt (%eax)
122; GISEL_X86-NEXT:    retl
123;
124; SDAG_X86-LABEL: f2:
125; SDAG_X86:       # %bb.0:
126; SDAG_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
127; SDAG_X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
128; SDAG_X86-NEXT:    fldt (%ecx)
129; SDAG_X86-NEXT:    fldt (%eax)
130; SDAG_X86-NEXT:    fmulp %st, %st(1)
131; SDAG_X86-NEXT:    fstpt (%ecx)
132; SDAG_X86-NEXT:    retl
133;
134; CHECK-64-LABEL: f2:
135; CHECK-64:       # %bb.0:
136; CHECK-64-NEXT:    fldt (%rdi)
137; CHECK-64-NEXT:    fldt (%rsi)
138; CHECK-64-NEXT:    fmulp %st, %st(1)
139; CHECK-64-NEXT:    fstpt (%rdi)
140; CHECK-64-NEXT:    retq
141  %load1 = load x86_fp80, ptr %a, align 16
142  %load2 = load x86_fp80, ptr %b, align 16
143  %mul = fmul x86_fp80 %load1, %load2
144  store x86_fp80 %mul, ptr %a, align 16
145  ret void
146}
147
148define void @f3(ptr %a, ptr %b) nounwind {
149; GISEL_X86-LABEL: f3:
150; GISEL_X86:       # %bb.0:
151; GISEL_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
152; GISEL_X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
153; GISEL_X86-NEXT:    fldt (%eax)
154; GISEL_X86-NEXT:    fldt (%ecx)
155; GISEL_X86-NEXT:    fdivrp %st, %st(1)
156; GISEL_X86-NEXT:    fstpt (%eax)
157; GISEL_X86-NEXT:    retl
158;
159; SDAG_X86-LABEL: f3:
160; SDAG_X86:       # %bb.0:
161; SDAG_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
162; SDAG_X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
163; SDAG_X86-NEXT:    fldt (%ecx)
164; SDAG_X86-NEXT:    fldt (%eax)
165; SDAG_X86-NEXT:    fdivrp %st, %st(1)
166; SDAG_X86-NEXT:    fstpt (%ecx)
167; SDAG_X86-NEXT:    retl
168;
169; CHECK-64-LABEL: f3:
170; CHECK-64:       # %bb.0:
171; CHECK-64-NEXT:    fldt (%rdi)
172; CHECK-64-NEXT:    fldt (%rsi)
173; CHECK-64-NEXT:    fdivrp %st, %st(1)
174; CHECK-64-NEXT:    fstpt (%rdi)
175; CHECK-64-NEXT:    retq
176  %load1 = load x86_fp80, ptr %a, align 4
177  %load2 = load x86_fp80, ptr %b, align 4
178  %div = fdiv x86_fp80 %load1, %load2
179  store x86_fp80 %div, ptr %a, align 4
180  ret void
181}
182
183define void @f6(ptr %a, ptr %b) nounwind {
184; GISEL_X86-LABEL: f6:
185; GISEL_X86:       # %bb.0:
186; GISEL_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
187; GISEL_X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
188; GISEL_X86-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
189; GISEL_X86-NEXT:    flds (%eax)
190; GISEL_X86-NEXT:    faddp %st, %st(1)
191; GISEL_X86-NEXT:    fstps (%ecx)
192; GISEL_X86-NEXT:    retl
193;
194; SDAG_X86-LABEL: f6:
195; SDAG_X86:       # %bb.0:
196; SDAG_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
197; SDAG_X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
198; SDAG_X86-NEXT:    flds (%ecx)
199; SDAG_X86-NEXT:    fadds {{\.?LCPI[0-9]+_[0-9]+}}
200; SDAG_X86-NEXT:    fstps (%eax)
201; SDAG_X86-NEXT:    retl
202;
203; GISEL_X64-LABEL: f6:
204; GISEL_X64:       # %bb.0:
205; GISEL_X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
206; GISEL_X64-NEXT:    flds (%rdi)
207; GISEL_X64-NEXT:    faddp %st, %st(1)
208; GISEL_X64-NEXT:    fstps (%rsi)
209; GISEL_X64-NEXT:    retq
210;
211; SDAG_X64-LABEL: f6:
212; SDAG_X64:       # %bb.0:
213; SDAG_X64-NEXT:    flds (%rdi)
214; SDAG_X64-NEXT:    fadds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
215; SDAG_X64-NEXT:    fstps (%rsi)
216; SDAG_X64-NEXT:    retq
217  %load1 = load float, ptr %a
218  %add = fadd float %load1, 20.0
219  store float %add, ptr %b
220  ret void
221}
222;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
223; CHECK-32: {{.*}}
224; FAST_X64: {{.*}}
225; FAST_X86: {{.*}}
226