[PowerPC] Recommit r314244 with refactoring and off by default
[llvm-core.git] / test / CodeGen / X86 / copysign-constant-magnitude.ll
blob8af045914cf97a161aea9fcd287a3099efd1dd49
1 ; RUN: llc -mtriple=x86_64-apple-macosx10.10.0 < %s | FileCheck %s
3 target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
5 ; The assertions are *enhanced* from update_test_checks.ll to include
6 ; the constant load values because those are important.
8 ; CHECK:        [[SIGNMASK1:L.+]]:
9 ; CHECK-NEXT:   .quad -9223372036854775808    ## double -0
10 ; CHECK-NEXT:   .quad -9223372036854775808    ## double -0
12 define double @mag_pos0_double(double %x) nounwind {
13 ; CHECK-LABEL: mag_pos0_double:
14 ; CHECK:       ## BB#0:
15 ; CHECK-NEXT:    andps [[SIGNMASK1]](%rip), %xmm0
16 ; CHECK-NEXT:    retq
18   %y = call double @copysign(double 0.0, double %x)
19   ret double %y
22 ; CHECK:        [[SIGNMASK2:L.+]]:
23 ; CHECK-NEXT:   .quad -9223372036854775808    ## double -0
25 define double @mag_neg0_double(double %x) nounwind {
26 ; CHECK-LABEL: mag_neg0_double:
27 ; CHECK:       ## BB#0:
28 ; CHECK-NEXT:    movsd [[SIGNMASK2]](%rip), %xmm1
29 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0,0]
30 ; CHECK-NEXT:    andps %xmm1, %xmm0
31 ; CHECK-NEXT:    retq
33   %y = call double @copysign(double -0.0, double %x)
34   ret double %y
37 ; CHECK:        [[SIGNMASK3:L.+]]:
38 ; CHECK-NEXT:   .quad -9223372036854775808    ## double -0
39 ; CHECK-NEXT:   .quad -9223372036854775808    ## double -0
40 ; CHECK:        [[ONE3:L.+]]:
41 ; CHECK-NEXT:   .quad 4607182418800017408     ## double 1
43 define double @mag_pos1_double(double %x) nounwind {
44 ; CHECK-LABEL: mag_pos1_double:
45 ; CHECK:       ## BB#0:
46 ; CHECK-NEXT:    andps [[SIGNMASK3]](%rip), %xmm0
47 ; CHECK-NEXT:    movsd [[ONE3]](%rip), %xmm1
48 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0,0]
49 ; CHECK-NEXT:    orps %xmm1, %xmm0
50 ; CHECK-NEXT:    retq
52   %y = call double @copysign(double 1.0, double %x)
53   ret double %y
56 ; CHECK:        [[SIGNMASK4:L.+]]:
57 ; CHECK-NEXT:   .quad -9223372036854775808    ## double -0
58 ; CHECK-NEXT:   .quad -9223372036854775808    ## double -0
59 ; CHECK:        [[ONE4:L.+]]:
60 ; CHECK-NEXT:   .quad 4607182418800017408     ## double 1
61 ; CHECK-NEXT:   .quad 4607182418800017408     ## double 1
63 define double @mag_neg1_double(double %x) nounwind {
64 ; CHECK-LABEL: mag_neg1_double:
65 ; CHECK:       ## BB#0:
66 ; CHECK-NEXT:    andps [[SIGNMASK4]](%rip), %xmm0
67 ; CHECK-NEXT:    orps [[ONE4]](%rip), %xmm0
68 ; CHECK-NEXT:    retq
70   %y = call double @copysign(double -1.0, double %x)
71   ret double %y
74 ; CHECK:       [[SIGNMASK5:L.+]]:
75 ; CHECK-NEXT:  .long 2147483648              ## float -0
76 ; CHECK-NEXT:  .long 2147483648              ## float -0
78 define float @mag_pos0_float(float %x) nounwind {
79 ; CHECK-LABEL: mag_pos0_float:
80 ; CHECK:       ## BB#0:
81 ; CHECK-NEXT:    andps [[SIGNMASK5]](%rip), %xmm0
82 ; CHECK-NEXT:    retq
84   %y = call float @copysignf(float 0.0, float %x)
85   ret float %y
88 ; CHECK:       [[SIGNMASK6:L.+]]:
89 ; CHECK-NEXT:  .long 2147483648              ## float -0
91 define float @mag_neg0_float(float %x) nounwind {
92 ; CHECK-LABEL: mag_neg0_float:
93 ; CHECK:       ## BB#0:
94 ; CHECK-NEXT:    movss [[SIGNMASK6]](%rip), %xmm1
95 ; CHECK-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0,0,0]
96 ; CHECK-NEXT:    andps %xmm1, %xmm0
97 ; CHECK-NEXT:    retq
99   %y = call float @copysignf(float -0.0, float %x)
100   ret float %y
103 ; CHECK:       [[SIGNMASK7:L.+]]:
104 ; CHECK-NEXT:  .long 2147483648              ## float -0
105 ; CHECK-NEXT:  .long 2147483648              ## float -0
106 ; CHECK:        [[ONE7:L.+]]:
107 ; CHECK-NEXT:  .long 1065353216              ## float 1
109 define float @mag_pos1_float(float %x) nounwind {
110 ; CHECK-LABEL: mag_pos1_float:
111 ; CHECK:       ## BB#0:
112 ; CHECK-NEXT:    andps [[SIGNMASK7]](%rip), %xmm0
113 ; CHECK-NEXT:    movss [[ONE7]](%rip), %xmm1
114 ; CHECK-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0,0,0]
115 ; CHECK-NEXT:    orps %xmm1, %xmm0
116 ; CHECK-NEXT:    retq
118   %y = call float @copysignf(float 1.0, float %x)
119   ret float %y
122 ; CHECK:       [[SIGNMASK8:L.+]]:
123 ; CHECK-NEXT:  .long 2147483648              ## float -0
124 ; CHECK-NEXT:  .long 2147483648              ## float -0
125 ; CHECK:        [[ONE8:L.+]]:
126 ; CHECK-NEXT:  .long 1065353216              ## float 1
127 ; CHECK-NEXT:  .long 1065353216              ## float 1
128 ; CHECK-NEXT:  .long 1065353216              ## float 1
129 ; CHECK-NEXT:  .long 1065353216              ## float 1
131 define float @mag_neg1_float(float %x) nounwind {
132 ; CHECK-LABEL: mag_neg1_float:
133 ; CHECK:       ## BB#0:
134 ; CHECK-NEXT:    andps [[SIGNMASK8]](%rip), %xmm0
135 ; CHECK-NEXT:    orps [[ONE8]](%rip), %xmm0
136 ; CHECK-NEXT:    retq
138   %y = call float @copysignf(float -1.0, float %x)
139   ret float %y
142 declare double @copysign(double, double) nounwind readnone
143 declare float @copysignf(float, float) nounwind readnone