xref: /llvm-project/llvm/test/CodeGen/X86/copysign-constant-magnitude.ll (revision 0aef747b846586c29ed3285bbed20a3d607576fa)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=x86_64-apple-macosx10.10.0 < %s | FileCheck %s
3
4target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
5
6; The assertions are *enhanced* from update_test_checks.ll to include
7; the constant load values because those are important.
8
9; CHECK:        [[SIGNMASK1:L.+]]:
10; CHECK-NEXT:   .quad 0x8000000000000000    ## double -0
11; CHECK-NEXT:   .quad 0x8000000000000000    ## double -0
12
13define double @mag_pos0_double(double %x) nounwind {
14; CHECK-LABEL: mag_pos0_double:
15; CHECK:       ## %bb.0:
16; CHECK-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
17; CHECK-NEXT:    retq
18  %y = call double @copysign(double 0.0, double %x)
19  ret double %y
20}
21
22; CHECK:        [[SIGNMASK2:L.+]]:
23; CHECK-NEXT:   .quad 0x8000000000000000    ## double -0
24
25define double @mag_neg0_double(double %x) nounwind {
26; CHECK-LABEL: mag_neg0_double:
27; CHECK:       ## %bb.0:
28; CHECK-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
29; CHECK-NEXT:    retq
30  %y = call double @copysign(double -0.0, double %x)
31  ret double %y
32}
33
34; CHECK:        [[SIGNMASK3:L.+]]:
35; CHECK-NEXT:   .quad 0x8000000000000000    ## double -0
36; CHECK-NEXT:   .quad 0x8000000000000000    ## double -0
37; CHECK:        [[ONE3:L.+]]:
38; CHECK-NEXT:   .quad 0x3ff0000000000000     ## double 1
39
40define double @mag_pos1_double(double %x) nounwind {
41; CHECK-LABEL: mag_pos1_double:
42; CHECK:       ## %bb.0:
43; CHECK-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
44; CHECK-NEXT:    orps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
45; CHECK-NEXT:    retq
46  %y = call double @copysign(double 1.0, double %x)
47  ret double %y
48}
49
50; CHECK:        [[SIGNMASK4:L.+]]:
51; CHECK-NEXT:   .quad 0x8000000000000000    ## double -0
52; CHECK-NEXT:   .quad 0x8000000000000000    ## double -0
53; CHECK:        [[ONE4:L.+]]:
54; CHECK-NEXT:   .quad 0x3ff0000000000000     ## double 1
55; CHECK-NEXT:   .quad 0x3ff0000000000000     ## double 1
56
57define double @mag_neg1_double(double %x) nounwind {
58; CHECK-LABEL: mag_neg1_double:
59; CHECK:       ## %bb.0:
60; CHECK-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
61; CHECK-NEXT:    orps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
62; CHECK-NEXT:    retq
63  %y = call double @copysign(double -1.0, double %x)
64  ret double %y
65}
66
67; CHECK:       [[SIGNMASK5:L.+]]:
68; CHECK-NEXT:  .long 0x80000000              ## float -0
69; CHECK-NEXT:  .long 0x80000000              ## float -0
70; CHECK-NEXT:  .long 0x80000000              ## float -0
71; CHECK-NEXT:  .long 0x80000000              ## float -0
72
73define float @mag_pos0_float(float %x) nounwind {
74; CHECK-LABEL: mag_pos0_float:
75; CHECK:       ## %bb.0:
76; CHECK-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
77; CHECK-NEXT:    retq
78  %y = call float @copysignf(float 0.0, float %x)
79  ret float %y
80}
81
82; CHECK:       [[SIGNMASK6:L.+]]:
83; CHECK-NEXT:  .long 0x80000000              ## float -0
84
85define float @mag_neg0_float(float %x) nounwind {
86; CHECK-LABEL: mag_neg0_float:
87; CHECK:       ## %bb.0:
88; CHECK-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
89; CHECK-NEXT:    retq
90  %y = call float @copysignf(float -0.0, float %x)
91  ret float %y
92}
93
94; CHECK:       [[SIGNMASK7:L.+]]:
95; CHECK-NEXT:  .long 0x80000000              ## float -0
96; CHECK-NEXT:  .long 0x80000000              ## float -0
97; CHECK-NEXT:  .long 0x80000000              ## float -0
98; CHECK-NEXT:  .long 0x80000000              ## float -0
99; CHECK:        [[ONE7:L.+]]:
100; CHECK-NEXT:  .long 0x3f800000              ## float 1
101
102define float @mag_pos1_float(float %x) nounwind {
103; CHECK-LABEL: mag_pos1_float:
104; CHECK:       ## %bb.0:
105; CHECK-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
106; CHECK-NEXT:    orps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
107; CHECK-NEXT:    retq
108  %y = call float @copysignf(float 1.0, float %x)
109  ret float %y
110}
111
112; CHECK:       [[SIGNMASK8:L.+]]:
113; CHECK-NEXT:  .long 0x80000000              ## float -0
114; CHECK-NEXT:  .long 0x80000000              ## float -0
115; CHECK-NEXT:  .long 0x80000000              ## float -0
116; CHECK-NEXT:  .long 0x80000000              ## float -0
117; CHECK:        [[ONE8:L.+]]:
118; CHECK-NEXT:  .long 0x3f800000              ## float 1
119; CHECK-NEXT:  .long 0x3f800000              ## float 1
120; CHECK-NEXT:  .long 0x3f800000              ## float 1
121; CHECK-NEXT:  .long 0x3f800000              ## float 1
122
123define float @mag_neg1_float(float %x) nounwind {
124; CHECK-LABEL: mag_neg1_float:
125; CHECK:       ## %bb.0:
126; CHECK-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
127; CHECK-NEXT:    orps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
128; CHECK-NEXT:    retq
129  %y = call float @copysignf(float -1.0, float %x)
130  ret float %y
131}
132
133declare double @copysign(double, double) nounwind readnone
134declare float @copysignf(float, float) nounwind readnone
135
136