xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/sse-fcopysign.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=X32
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=X64
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker;
5*9880d681SAndroid Build Coastguard Worker; Library Functions
6*9880d681SAndroid Build Coastguard Worker;
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine float @tst1(float %a, float %b) {
9*9880d681SAndroid Build Coastguard Worker; X32-LABEL: @tst1
10*9880d681SAndroid Build Coastguard Worker; X32:       movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
11*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
12*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  movss %xmm1, 4(%esp)
13*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  movss %xmm0, (%esp)
14*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  calll copysignf
15*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  addl $8, %esp
16*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  retl
17*9880d681SAndroid Build Coastguard Worker;
18*9880d681SAndroid Build Coastguard Worker; X64-LABEL: @tst1
19*9880d681SAndroid Build Coastguard Worker; X64:       movaps  %xmm0, %xmm2
20*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  movaps  %xmm1, %xmm0
21*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  movaps  %xmm2, %xmm1
22*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  jmp copysignf
23*9880d681SAndroid Build Coastguard Worker  %tmp = tail call float @copysignf( float %b, float %a )
24*9880d681SAndroid Build Coastguard Worker  ret float %tmp
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdefine double @tst2(double %a, float %b, float %c) {
28*9880d681SAndroid Build Coastguard Worker; X32-LABEL: @tst2
29*9880d681SAndroid Build Coastguard Worker; X32:       movsd {{.*#+}} xmm0 = mem[0],zero
30*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
31*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  addss 32(%esp), %xmm1
32*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  cvtss2sd %xmm1, %xmm1
33*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  movsd %xmm0, (%esp)
34*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  movsd %xmm1, 8(%esp)
35*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  calll copysign
36*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  addl $16, %esp
37*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  retl
38*9880d681SAndroid Build Coastguard Worker;
39*9880d681SAndroid Build Coastguard Worker; X64-LABEL: @tst2
40*9880d681SAndroid Build Coastguard Worker; X64:       addss   %xmm2, %xmm1
41*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  cvtss2sd        %xmm1, %xmm1
42*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  jmp copysign
43*9880d681SAndroid Build Coastguard Worker  %tmp1 = fadd float %b, %c
44*9880d681SAndroid Build Coastguard Worker  %tmp2 = fpext float %tmp1 to double
45*9880d681SAndroid Build Coastguard Worker  %tmp = tail call double @copysign( double %a, double %tmp2 )
46*9880d681SAndroid Build Coastguard Worker  ret double %tmp
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdeclare float @copysignf(float, float)
50*9880d681SAndroid Build Coastguard Workerdeclare double @copysign(double, double)
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker;
53*9880d681SAndroid Build Coastguard Worker; LLVM Intrinsic
54*9880d681SAndroid Build Coastguard Worker;
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine float @int1(float %a, float %b) {
57*9880d681SAndroid Build Coastguard Worker; X32-LABEL: @int1
58*9880d681SAndroid Build Coastguard Worker; X32:       movss  8(%esp), %xmm0 {{.*#+}} xmm0 = mem[0],zero,zero,zero
59*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  andps .LCPI2_0, %xmm0
60*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  movss 12(%esp), %xmm1 {{.*#+}} xmm1 = mem[0],zero,zero,zero
61*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  andps .LCPI2_1, %xmm1
62*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  orps  %xmm0, %xmm1
63*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  movss %xmm1, (%esp)
64*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  flds  (%esp)
65*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  popl %eax
66*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  retl
67*9880d681SAndroid Build Coastguard Worker;
68*9880d681SAndroid Build Coastguard Worker; X64-LABEL: @int1
69*9880d681SAndroid Build Coastguard Worker; X64:       andps .LCPI2_0(%rip), %xmm0
70*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  andps .LCPI2_1(%rip), %xmm1
71*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  orps  %xmm1, %xmm0
72*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  retq
73*9880d681SAndroid Build Coastguard Worker  %tmp = tail call float @llvm.copysign.f32( float %b, float %a )
74*9880d681SAndroid Build Coastguard Worker  ret float %tmp
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdefine double @int2(double %a, float %b, float %c) {
78*9880d681SAndroid Build Coastguard Worker; X32-LABEL: @int2
79*9880d681SAndroid Build Coastguard Worker; X32:       movss 16(%ebp), %xmm0 {{.*#+}} xmm0 = mem[0],zero,zero,zero
80*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  addss 20(%ebp), %xmm0
81*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  movsd  8(%ebp), %xmm1 {{.*#+}} xmm1 = mem[0],zero
82*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  andpd .LCPI3_0, %xmm1
83*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  cvtss2sd %xmm0, %xmm0
84*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  andpd .LCPI3_1, %xmm0
85*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  orpd  %xmm1, %xmm0
86*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  movlpd %xmm0, (%esp)
87*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  fldl  (%esp)
88*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  movl %ebp, %esp
89*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  popl %ebp
90*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  retl
91*9880d681SAndroid Build Coastguard Worker;
92*9880d681SAndroid Build Coastguard Worker; X64-LABEL: @int2
93*9880d681SAndroid Build Coastguard Worker; X64:       addss %xmm2, %xmm1
94*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  cvtss2sd %xmm1, %xmm1
95*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  andpd .LCPI3_0(%rip), %xmm1
96*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  andpd .LCPI3_1(%rip), %xmm0
97*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  orpd %xmm1, %xmm0
98*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  retq
99*9880d681SAndroid Build Coastguard Worker  %tmp1 = fadd float %b, %c
100*9880d681SAndroid Build Coastguard Worker  %tmp2 = fpext float %tmp1 to double
101*9880d681SAndroid Build Coastguard Worker  %tmp = tail call double @llvm.copysign.f64( double %a, double %tmp2 )
102*9880d681SAndroid Build Coastguard Worker  ret double %tmp
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine float @cst1() {
106*9880d681SAndroid Build Coastguard Worker; X32-LABEL: @cst1
107*9880d681SAndroid Build Coastguard Worker; X32:       fld1
108*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  fchs
109*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  retl
110*9880d681SAndroid Build Coastguard Worker;
111*9880d681SAndroid Build Coastguard Worker; X64-LABEL: @cst1
112*9880d681SAndroid Build Coastguard Worker; X64:       movss .LCPI4_0(%rip), %xmm0 {{.*#+}} xmm0 = mem[0],zero,zero,zero
113*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  retq
114*9880d681SAndroid Build Coastguard Worker  %tmp = tail call float @llvm.copysign.f32( float 1.0, float -2.0 )
115*9880d681SAndroid Build Coastguard Worker  ret float %tmp
116*9880d681SAndroid Build Coastguard Worker}
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerdefine double @cst2() {
119*9880d681SAndroid Build Coastguard Worker; X32-LABEL: @cst2
120*9880d681SAndroid Build Coastguard Worker; X32:       fldz
121*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  fchs
122*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  retl
123*9880d681SAndroid Build Coastguard Worker;
124*9880d681SAndroid Build Coastguard Worker; X64-LABEL: @cst2
125*9880d681SAndroid Build Coastguard Worker; X64:       movsd .LCPI5_0(%rip), %xmm0 {{.*#+}} xmm0 = mem[0],zero
126*9880d681SAndroid Build Coastguard Worker; X64-NEXT:  retq
127*9880d681SAndroid Build Coastguard Worker  %tmp1 = fadd float -1.0, -1.0
128*9880d681SAndroid Build Coastguard Worker  %tmp2 = fpext float %tmp1 to double
129*9880d681SAndroid Build Coastguard Worker  %tmp = tail call double @llvm.copysign.f64( double 0.0, double %tmp2 )
130*9880d681SAndroid Build Coastguard Worker  ret double %tmp
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerdeclare float     @llvm.copysign.f32(float  %Mag, float  %Sgn)
134*9880d681SAndroid Build Coastguard Workerdeclare double    @llvm.copysign.f64(double %Mag, double %Sgn)
135