Skip to content

Commit 289b8e0

Browse files
committed
[X86] Add fp80 copysign test coverage
Add PR41749 test coverage
1 parent afd54e1 commit 289b8e0

File tree

1 file changed

+180
-63
lines changed

1 file changed

+180
-63
lines changed
Lines changed: 180 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2-
; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X32
2+
; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X86
33
; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X64
44

55
;
66
; Library Functions
77
;
88

99
define float @tst1(float %a, float %b) nounwind {
10-
; X32-LABEL: tst1:
11-
; X32: # %bb.0:
12-
; X32-NEXT: subl $8, %esp
13-
; X32-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
14-
; X32-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
15-
; X32-NEXT: movss %xmm1, {{[0-9]+}}(%esp)
16-
; X32-NEXT: movss %xmm0, (%esp)
17-
; X32-NEXT: calll copysignf
18-
; X32-NEXT: addl $8, %esp
19-
; X32-NEXT: retl
10+
; X86-LABEL: tst1:
11+
; X86: # %bb.0:
12+
; X86-NEXT: subl $8, %esp
13+
; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
14+
; X86-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
15+
; X86-NEXT: movss %xmm1, {{[0-9]+}}(%esp)
16+
; X86-NEXT: movss %xmm0, (%esp)
17+
; X86-NEXT: calll copysignf
18+
; X86-NEXT: addl $8, %esp
19+
; X86-NEXT: retl
2020
;
2121
; X64-LABEL: tst1:
2222
; X64: # %bb.0:
@@ -29,18 +29,18 @@ define float @tst1(float %a, float %b) nounwind {
2929
}
3030

3131
define double @tst2(double %a, float %b, float %c) nounwind {
32-
; X32-LABEL: tst2:
33-
; X32: # %bb.0:
34-
; X32-NEXT: subl $16, %esp
35-
; X32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
36-
; X32-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
37-
; X32-NEXT: addss {{[0-9]+}}(%esp), %xmm1
38-
; X32-NEXT: cvtss2sd %xmm1, %xmm1
39-
; X32-NEXT: movsd %xmm0, (%esp)
40-
; X32-NEXT: movsd %xmm1, {{[0-9]+}}(%esp)
41-
; X32-NEXT: calll copysign
42-
; X32-NEXT: addl $16, %esp
43-
; X32-NEXT: retl
32+
; X86-LABEL: tst2:
33+
; X86: # %bb.0:
34+
; X86-NEXT: subl $16, %esp
35+
; X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
36+
; X86-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
37+
; X86-NEXT: addss {{[0-9]+}}(%esp), %xmm1
38+
; X86-NEXT: cvtss2sd %xmm1, %xmm1
39+
; X86-NEXT: movsd %xmm0, (%esp)
40+
; X86-NEXT: movsd %xmm1, {{[0-9]+}}(%esp)
41+
; X86-NEXT: calll copysign
42+
; X86-NEXT: addl $16, %esp
43+
; X86-NEXT: retl
4444
;
4545
; X64-LABEL: tst2:
4646
; X64: # %bb.0:
@@ -53,26 +53,53 @@ define double @tst2(double %a, float %b, float %c) nounwind {
5353
ret double %tmp
5454
}
5555

56+
define x86_fp80 @tst3(x86_fp80 %a, x86_fp80 %b) nounwind {
57+
; X86-LABEL: tst3:
58+
; X86: # %bb.0:
59+
; X86-NEXT: subl $24, %esp
60+
; X86-NEXT: fldt {{[0-9]+}}(%esp)
61+
; X86-NEXT: fldt {{[0-9]+}}(%esp)
62+
; X86-NEXT: fstpt {{[0-9]+}}(%esp)
63+
; X86-NEXT: fstpt (%esp)
64+
; X86-NEXT: calll copysignl
65+
; X86-NEXT: addl $24, %esp
66+
; X86-NEXT: retl
67+
;
68+
; X64-LABEL: tst3:
69+
; X64: # %bb.0:
70+
; X64-NEXT: subq $40, %rsp
71+
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
72+
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
73+
; X64-NEXT: fstpt {{[0-9]+}}(%rsp)
74+
; X64-NEXT: fstpt (%rsp)
75+
; X64-NEXT: callq copysignl
76+
; X64-NEXT: addq $40, %rsp
77+
; X64-NEXT: retq
78+
%tmp = tail call x86_fp80 @copysignl( x86_fp80 %b, x86_fp80 %a )
79+
ret x86_fp80 %tmp
80+
}
81+
5682
declare dso_local float @copysignf(float, float)
5783
declare dso_local double @copysign(double, double)
84+
declare dso_local x86_fp80 @copysignl(x86_fp80, x86_fp80)
5885

5986
;
6087
; LLVM Intrinsic
6188
;
6289

6390
define float @int1(float %a, float %b) nounwind {
64-
; X32-LABEL: int1:
65-
; X32: # %bb.0:
66-
; X32-NEXT: pushl %eax
67-
; X32-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
68-
; X32-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
69-
; X32-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
70-
; X32-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
71-
; X32-NEXT: orps %xmm0, %xmm1
72-
; X32-NEXT: movss %xmm1, (%esp)
73-
; X32-NEXT: flds (%esp)
74-
; X32-NEXT: popl %eax
75-
; X32-NEXT: retl
91+
; X86-LABEL: int1:
92+
; X86: # %bb.0:
93+
; X86-NEXT: pushl %eax
94+
; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
95+
; X86-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
96+
; X86-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
97+
; X86-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
98+
; X86-NEXT: orps %xmm0, %xmm1
99+
; X86-NEXT: movss %xmm1, (%esp)
100+
; X86-NEXT: flds (%esp)
101+
; X86-NEXT: popl %eax
102+
; X86-NEXT: retl
76103
;
77104
; X64-LABEL: int1:
78105
; X64: # %bb.0:
@@ -85,24 +112,24 @@ define float @int1(float %a, float %b) nounwind {
85112
}
86113

87114
define double @int2(double %a, float %b, float %c) nounwind {
88-
; X32-LABEL: int2:
89-
; X32: # %bb.0:
90-
; X32-NEXT: pushl %ebp
91-
; X32-NEXT: movl %esp, %ebp
92-
; X32-NEXT: andl $-8, %esp
93-
; X32-NEXT: subl $8, %esp
94-
; X32-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
95-
; X32-NEXT: addss 20(%ebp), %xmm0
96-
; X32-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
97-
; X32-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
98-
; X32-NEXT: cvtss2sd %xmm0, %xmm0
99-
; X32-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
100-
; X32-NEXT: orps %xmm1, %xmm0
101-
; X32-NEXT: movlps %xmm0, (%esp)
102-
; X32-NEXT: fldl (%esp)
103-
; X32-NEXT: movl %ebp, %esp
104-
; X32-NEXT: popl %ebp
105-
; X32-NEXT: retl
115+
; X86-LABEL: int2:
116+
; X86: # %bb.0:
117+
; X86-NEXT: pushl %ebp
118+
; X86-NEXT: movl %esp, %ebp
119+
; X86-NEXT: andl $-8, %esp
120+
; X86-NEXT: subl $8, %esp
121+
; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
122+
; X86-NEXT: addss 20(%ebp), %xmm0
123+
; X86-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
124+
; X86-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
125+
; X86-NEXT: cvtss2sd %xmm0, %xmm0
126+
; X86-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
127+
; X86-NEXT: orps %xmm1, %xmm0
128+
; X86-NEXT: movlps %xmm0, (%esp)
129+
; X86-NEXT: fldl (%esp)
130+
; X86-NEXT: movl %ebp, %esp
131+
; X86-NEXT: popl %ebp
132+
; X86-NEXT: retl
106133
;
107134
; X64-LABEL: int2:
108135
; X64: # %bb.0:
@@ -118,12 +145,46 @@ define double @int2(double %a, float %b, float %c) nounwind {
118145
ret double %tmp
119146
}
120147

148+
define x86_fp80 @int3(x86_fp80 %a, x86_fp80 %b) nounwind {
149+
; X86-LABEL: int3:
150+
; X86: # %bb.0:
151+
; X86-NEXT: subl $12, %esp
152+
; X86-NEXT: fldt {{[0-9]+}}(%esp)
153+
; X86-NEXT: fldt {{[0-9]+}}(%esp)
154+
; X86-NEXT: fstpt (%esp)
155+
; X86-NEXT: fabs
156+
; X86-NEXT: fld %st(0)
157+
; X86-NEXT: fchs
158+
; X86-NEXT: testb $-128, {{[0-9]+}}(%esp)
159+
; X86-NEXT: fxch %st(1)
160+
; X86-NEXT: fcmovne %st(1), %st
161+
; X86-NEXT: fstp %st(1)
162+
; X86-NEXT: addl $12, %esp
163+
; X86-NEXT: retl
164+
;
165+
; X64-LABEL: int3:
166+
; X64: # %bb.0:
167+
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
168+
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
169+
; X64-NEXT: fstpt -{{[0-9]+}}(%rsp)
170+
; X64-NEXT: fabs
171+
; X64-NEXT: fld %st(0)
172+
; X64-NEXT: fchs
173+
; X64-NEXT: testb $-128, -{{[0-9]+}}(%rsp)
174+
; X64-NEXT: fxch %st(1)
175+
; X64-NEXT: fcmovne %st(1), %st
176+
; X64-NEXT: fstp %st(1)
177+
; X64-NEXT: retq
178+
%tmp = tail call x86_fp80 @llvm.copysign.f80( x86_fp80 %b, x86_fp80 %a )
179+
ret x86_fp80 %tmp
180+
}
181+
121182
define float @cst1() nounwind {
122-
; X32-LABEL: cst1:
123-
; X32: # %bb.0:
124-
; X32-NEXT: fld1
125-
; X32-NEXT: fchs
126-
; X32-NEXT: retl
183+
; X86-LABEL: cst1:
184+
; X86: # %bb.0:
185+
; X86-NEXT: fld1
186+
; X86-NEXT: fchs
187+
; X86-NEXT: retl
127188
;
128189
; X64-LABEL: cst1:
129190
; X64: # %bb.0:
@@ -134,11 +195,11 @@ define float @cst1() nounwind {
134195
}
135196

136197
define double @cst2() nounwind {
137-
; X32-LABEL: cst2:
138-
; X32: # %bb.0:
139-
; X32-NEXT: fldz
140-
; X32-NEXT: fchs
141-
; X32-NEXT: retl
198+
; X86-LABEL: cst2:
199+
; X86: # %bb.0:
200+
; X86-NEXT: fldz
201+
; X86-NEXT: fchs
202+
; X86-NEXT: retl
142203
;
143204
; X64-LABEL: cst2:
144205
; X64: # %bb.0:
@@ -150,5 +211,61 @@ define double @cst2() nounwind {
150211
ret double %tmp
151212
}
152213

214+
define x86_fp80 @cst3() nounwind {
215+
; X86-LABEL: cst3:
216+
; X86: # %bb.0:
217+
; X86-NEXT: fldz
218+
; X86-NEXT: fchs
219+
; X86-NEXT: retl
220+
;
221+
; X64-LABEL: cst3:
222+
; X64: # %bb.0:
223+
; X64-NEXT: fldz
224+
; X64-NEXT: fchs
225+
; X64-NEXT: retq
226+
%tmp1 = fadd float -1.0, -1.0
227+
%tmp2 = fpext float %tmp1 to x86_fp80
228+
%tmp = tail call x86_fp80 @llvm.copysign.f80( x86_fp80 zeroinitializer, x86_fp80 %tmp2 )
229+
ret x86_fp80 %tmp
230+
}
231+
232+
define void @PR41749() {
233+
; X86-LABEL: PR41749:
234+
; X86: # %bb.0:
235+
; X86-NEXT: subl $12, %esp
236+
; X86-NEXT: .cfi_def_cfa_offset 16
237+
; X86-NEXT: fldz
238+
; X86-NEXT: fld %st(0)
239+
; X86-NEXT: fstpt (%esp)
240+
; X86-NEXT: testb $-128, {{[0-9]+}}(%esp)
241+
; X86-NEXT: fld %st(0)
242+
; X86-NEXT: fchs
243+
; X86-NEXT: fxch %st(1)
244+
; X86-NEXT: fcmovne %st(1), %st
245+
; X86-NEXT: fstp %st(1)
246+
; X86-NEXT: fstpt (%eax)
247+
; X86-NEXT: addl $12, %esp
248+
; X86-NEXT: .cfi_def_cfa_offset 4
249+
; X86-NEXT: retl
250+
;
251+
; X64-LABEL: PR41749:
252+
; X64: # %bb.0:
253+
; X64-NEXT: fldz
254+
; X64-NEXT: fld %st(0)
255+
; X64-NEXT: fstpt -{{[0-9]+}}(%rsp)
256+
; X64-NEXT: testb $-128, -{{[0-9]+}}(%rsp)
257+
; X64-NEXT: fld %st(0)
258+
; X64-NEXT: fchs
259+
; X64-NEXT: fxch %st(1)
260+
; X64-NEXT: fcmovne %st(1), %st
261+
; X64-NEXT: fstp %st(1)
262+
; X64-NEXT: fstpt (%rax)
263+
; X64-NEXT: retq
264+
%1 = call x86_fp80 @llvm.copysign.f80(x86_fp80 0xK00000000000000000000, x86_fp80 undef)
265+
store x86_fp80 %1, x86_fp80* undef, align 16
266+
ret void
267+
}
268+
153269
declare dso_local float @llvm.copysign.f32(float %Mag, float %Sgn)
154270
declare dso_local double @llvm.copysign.f64(double %Mag, double %Sgn)
271+
declare dso_local x86_fp80 @llvm.copysign.f80(x86_fp80 %Mag, x86_fp80 %Sgn)

0 commit comments

Comments
 (0)