1 ; RUN: llc -mtriple=x86_64-apple-macosx10.10.0 < %s | FileCheck %s 2 3 target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" 4 5 ; The assertions are *enhanced* from update_test_checks.ll to include 6 ; the constant load values because those are important. 7 8 ; CHECK: [[SIGNMASK1:L.+]]: 9 ; CHECK-NEXT: .quad -9223372036854775808 ## double -0 10 ; CHECK-NEXT: .quad -9223372036854775808 ## double -0 11 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 17 ; 18 %y = call double @copysign(double 0.0, double %x) 19 ret double %y 20 } 21 22 ; CHECK: [[SIGNMASK2:L.+]]: 23 ; CHECK-NEXT: .quad -9223372036854775808 ## double -0 24 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 32 ; 33 %y = call double @copysign(double -0.0, double %x) 34 ret double %y 35 } 36 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 42 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 51 ; 52 %y = call double @copysign(double 1.0, double %x) 53 ret double %y 54 } 55 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 62 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 69 ; 70 %y = call double @copysign(double -1.0, double %x) 71 ret double %y 72 } 73 74 ; CHECK: [[SIGNMASK5:L.+]]: 75 ; CHECK-NEXT: .long 2147483648 ## float -0 76 ; CHECK-NEXT: .long 2147483648 ## float -0 77 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 83 ; 84 %y = call float @copysignf(float 0.0, float %x) 85 ret float %y 86 } 87 88 ; CHECK: [[SIGNMASK6:L.+]]: 89 ; CHECK-NEXT: .long 2147483648 ## float -0 90 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 98 ; 99 %y = call float @copysignf(float -0.0, float %x) 100 ret float %y 101 } 102 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 108 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 117 ; 118 %y = call float @copysignf(float 1.0, float %x) 119 ret float %y 120 } 121 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 130 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 137 ; 138 %y = call float @copysignf(float -1.0, float %x) 139 ret float %y 140 } 141 142 declare double @copysign(double, double) nounwind readnone 143 declare float @copysignf(float, float) nounwind readnone 144 145