xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/copysign-constant-magnitude.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
4*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-macosx10.10.0"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine void @test_copysign_const_magnitude_d(double %X) {
7*9880d681SAndroid Build Coastguard Worker; CHECK: [[SIGNMASK:L.+]]:
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .quad -9223372036854775808    ## double -0
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .quad 0                       ## double 0
10*9880d681SAndroid Build Coastguard Worker; CHECK: [[ZERO:L.+]]:
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .space 16
12*9880d681SAndroid Build Coastguard Worker; CHECK: [[ONE:L.+]]:
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .quad 4607182418800017408     ## double 1
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .quad 0                       ## double 0
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_const_magnitude_d:
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; CHECK: id
18*9880d681SAndroid Build Coastguard Worker  %iX = call double @id_d(double %X)
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd [[SIGNMASK]](%rip), %xmm0
21*9880d681SAndroid Build Coastguard Worker  %d0 = call double @copysign(double 0.000000e+00, double %iX)
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: id
24*9880d681SAndroid Build Coastguard Worker  %id0 = call double @id_d(double %d0)
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd [[SIGNMASK]](%rip), %xmm0
27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd [[ZERO]](%rip), %xmm0
28*9880d681SAndroid Build Coastguard Worker  %dn0 = call double @copysign(double -0.000000e+00, double %id0)
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: id
31*9880d681SAndroid Build Coastguard Worker  %idn0 = call double @id_d(double %dn0)
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd [[SIGNMASK]](%rip), %xmm0
34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd [[ONE]](%rip), %xmm0
35*9880d681SAndroid Build Coastguard Worker  %d1 = call double @copysign(double 1.000000e+00, double %idn0)
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: id
38*9880d681SAndroid Build Coastguard Worker  %id1 = call double @id_d(double %d1)
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd [[SIGNMASK]](%rip), %xmm0
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd [[ONE]](%rip), %xmm0
42*9880d681SAndroid Build Coastguard Worker  %dn1 = call double @copysign(double -1.000000e+00, double %id1)
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: id
45*9880d681SAndroid Build Coastguard Worker  %idn1 = call double @id_d(double %dn1)
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; CHECK: retq
48*9880d681SAndroid Build Coastguard Worker  ret void
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdefine void @test_copysign_const_magnitude_f(float %X) {
52*9880d681SAndroid Build Coastguard Worker; CHECK: [[SIGNMASK:L.+]]:
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .long	2147483648              ## float -0
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .long	0                       ## float 0
55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .long	0                       ## float 0
56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .long	0                       ## float 0
57*9880d681SAndroid Build Coastguard Worker; CHECK: [[ZERO:L.+]]:
58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .space 16
59*9880d681SAndroid Build Coastguard Worker; CHECK: [[ONE:L.+]]:
60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .long	1065353216              ## float 1
61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .long	0                       ## float 0
62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .long	0                       ## float 0
63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   .long	0                       ## float 0
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_const_magnitude_f:
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; CHECK: id
67*9880d681SAndroid Build Coastguard Worker  %iX = call float @id_f(float %X)
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps [[SIGNMASK]](%rip), %xmm0
70*9880d681SAndroid Build Coastguard Worker  %d0 = call float @copysignf(float 0.000000e+00, float %iX)
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: id
73*9880d681SAndroid Build Coastguard Worker  %id0 = call float @id_f(float %d0)
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps [[SIGNMASK]](%rip), %xmm0
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps [[ZERO]](%rip), %xmm0
77*9880d681SAndroid Build Coastguard Worker  %dn0 = call float @copysignf(float -0.000000e+00, float %id0)
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: id
80*9880d681SAndroid Build Coastguard Worker  %idn0 = call float @id_f(float %dn0)
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps [[SIGNMASK]](%rip), %xmm0
83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps [[ONE]](%rip), %xmm0
84*9880d681SAndroid Build Coastguard Worker  %d1 = call float @copysignf(float 1.000000e+00, float %idn0)
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: id
87*9880d681SAndroid Build Coastguard Worker  %id1 = call float @id_f(float %d1)
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps [[SIGNMASK]](%rip), %xmm0
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps [[ONE]](%rip), %xmm0
91*9880d681SAndroid Build Coastguard Worker  %dn1 = call float @copysignf(float -1.000000e+00, float %id1)
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: id
94*9880d681SAndroid Build Coastguard Worker  %idn1 = call float @id_f(float %dn1)
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; CHECK: retq
97*9880d681SAndroid Build Coastguard Worker  ret void
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerdeclare double @copysign(double, double) nounwind readnone
101*9880d681SAndroid Build Coastguard Workerdeclare float @copysignf(float, float) nounwind readnone
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker; Dummy identity functions, so we always have xmm0, and prevent optimizations.
104*9880d681SAndroid Build Coastguard Workerdeclare double @id_d(double)
105*9880d681SAndroid Build Coastguard Workerdeclare float @id_f(float)
106