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