1*9880d681SAndroid Build Coastguard Worker; Test copysign operations. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare float @copysignf(float, float) readnone 6*9880d681SAndroid Build Coastguard Workerdeclare double @copysign(double, double) readnone 7*9880d681SAndroid Build Coastguard Worker; FIXME: not really the correct prototype for SystemZ. 8*9880d681SAndroid Build Coastguard Workerdeclare fp128 @copysignl(fp128, fp128) readnone 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; Test f32 copies in which the sign comes from an f32. 11*9880d681SAndroid Build Coastguard Workerdefine float @f1(float %a, float %b) { 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 13*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %f2 14*9880d681SAndroid Build Coastguard Worker; CHECK: cpsdr %f0, %f2, %f0 15*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 16*9880d681SAndroid Build Coastguard Worker %res = call float @copysignf(float %a, float %b) readnone 17*9880d681SAndroid Build Coastguard Worker ret float %res 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; Test f32 copies in which the sign comes from an f64. 21*9880d681SAndroid Build Coastguard Workerdefine float @f2(float %a, double %bd) { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 23*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %f2 24*9880d681SAndroid Build Coastguard Worker; CHECK: cpsdr %f0, %f2, %f0 25*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 26*9880d681SAndroid Build Coastguard Worker %b = fptrunc double %bd to float 27*9880d681SAndroid Build Coastguard Worker %res = call float @copysignf(float %a, float %b) readnone 28*9880d681SAndroid Build Coastguard Worker ret float %res 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; Test f32 copies in which the sign comes from an f128. 32*9880d681SAndroid Build Coastguard Workerdefine float @f3(float %a, fp128 *%bptr) { 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 34*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[BHIGH:%f[0-7]]], 0(%r2) 35*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[BLOW:%f[0-7]]], 8(%r2) 36*9880d681SAndroid Build Coastguard Worker; CHECK: cpsdr %f0, [[BHIGH]], %f0 37*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 38*9880d681SAndroid Build Coastguard Worker %bl = load volatile fp128 , fp128 *%bptr 39*9880d681SAndroid Build Coastguard Worker %b = fptrunc fp128 %bl to float 40*9880d681SAndroid Build Coastguard Worker %res = call float @copysignf(float %a, float %b) readnone 41*9880d681SAndroid Build Coastguard Worker ret float %res 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; Test f64 copies in which the sign comes from an f32. 45*9880d681SAndroid Build Coastguard Workerdefine double @f4(double %a, float %bf) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 47*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %f2 48*9880d681SAndroid Build Coastguard Worker; CHECK: cpsdr %f0, %f2, %f0 49*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 50*9880d681SAndroid Build Coastguard Worker %b = fpext float %bf to double 51*9880d681SAndroid Build Coastguard Worker %res = call double @copysign(double %a, double %b) readnone 52*9880d681SAndroid Build Coastguard Worker ret double %res 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; Test f64 copies in which the sign comes from an f64. 56*9880d681SAndroid Build Coastguard Workerdefine double @f5(double %a, double %b) { 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 58*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %f2 59*9880d681SAndroid Build Coastguard Worker; CHECK: cpsdr %f0, %f2, %f0 60*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 61*9880d681SAndroid Build Coastguard Worker %res = call double @copysign(double %a, double %b) readnone 62*9880d681SAndroid Build Coastguard Worker ret double %res 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; Test f64 copies in which the sign comes from an f128. 66*9880d681SAndroid Build Coastguard Workerdefine double @f6(double %a, fp128 *%bptr) { 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 68*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[BHIGH:%f[0-7]]], 0(%r2) 69*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[BLOW:%f[0-7]]], 8(%r2) 70*9880d681SAndroid Build Coastguard Worker; CHECK: cpsdr %f0, [[BHIGH]], %f0 71*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 72*9880d681SAndroid Build Coastguard Worker %bl = load volatile fp128 , fp128 *%bptr 73*9880d681SAndroid Build Coastguard Worker %b = fptrunc fp128 %bl to double 74*9880d681SAndroid Build Coastguard Worker %res = call double @copysign(double %a, double %b) readnone 75*9880d681SAndroid Build Coastguard Worker ret double %res 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; Test f128 copies in which the sign comes from an f32. We shouldn't 79*9880d681SAndroid Build Coastguard Worker; need any register shuffling here; %a should be tied to %c, with CPSDR 80*9880d681SAndroid Build Coastguard Worker; just changing the high register. 81*9880d681SAndroid Build Coastguard Workerdefine void @f7(fp128 *%cptr, fp128 *%aptr, float %bf) { 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 83*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[AHIGH:%f[0-7]]], 0(%r3) 84*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[ALOW:%f[0-7]]], 8(%r3) 85*9880d681SAndroid Build Coastguard Worker; CHECK: cpsdr [[AHIGH]], %f0, [[AHIGH]] 86*9880d681SAndroid Build Coastguard Worker; CHECK: std [[AHIGH]], 0(%r2) 87*9880d681SAndroid Build Coastguard Worker; CHECK: std [[ALOW]], 8(%r2) 88*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 89*9880d681SAndroid Build Coastguard Worker %a = load volatile fp128 , fp128 *%aptr 90*9880d681SAndroid Build Coastguard Worker %b = fpext float %bf to fp128 91*9880d681SAndroid Build Coastguard Worker %c = call fp128 @copysignl(fp128 %a, fp128 %b) readnone 92*9880d681SAndroid Build Coastguard Worker store fp128 %c, fp128 *%cptr 93*9880d681SAndroid Build Coastguard Worker ret void 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker; As above, but the sign comes from an f64. 97*9880d681SAndroid Build Coastguard Workerdefine void @f8(fp128 *%cptr, fp128 *%aptr, double %bd) { 98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 99*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[AHIGH:%f[0-7]]], 0(%r3) 100*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[ALOW:%f[0-7]]], 8(%r3) 101*9880d681SAndroid Build Coastguard Worker; CHECK: cpsdr [[AHIGH]], %f0, [[AHIGH]] 102*9880d681SAndroid Build Coastguard Worker; CHECK: std [[AHIGH]], 0(%r2) 103*9880d681SAndroid Build Coastguard Worker; CHECK: std [[ALOW]], 8(%r2) 104*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 105*9880d681SAndroid Build Coastguard Worker %a = load volatile fp128 , fp128 *%aptr 106*9880d681SAndroid Build Coastguard Worker %b = fpext double %bd to fp128 107*9880d681SAndroid Build Coastguard Worker %c = call fp128 @copysignl(fp128 %a, fp128 %b) readnone 108*9880d681SAndroid Build Coastguard Worker store fp128 %c, fp128 *%cptr 109*9880d681SAndroid Build Coastguard Worker ret void 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker; As above, but the sign comes from an f128. Don't require the low part 113*9880d681SAndroid Build Coastguard Worker; of %b to be loaded, since it isn't used. 114*9880d681SAndroid Build Coastguard Workerdefine void @f9(fp128 *%cptr, fp128 *%aptr, fp128 *%bptr) { 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 116*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[AHIGH:%f[0-7]]], 0(%r3) 117*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[ALOW:%f[0-7]]], 8(%r3) 118*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[BHIGH:%f[0-7]]], 0(%r4) 119*9880d681SAndroid Build Coastguard Worker; CHECK: cpsdr [[AHIGH]], [[BHIGH]], [[AHIGH]] 120*9880d681SAndroid Build Coastguard Worker; CHECK: std [[AHIGH]], 0(%r2) 121*9880d681SAndroid Build Coastguard Worker; CHECK: std [[ALOW]], 8(%r2) 122*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 123*9880d681SAndroid Build Coastguard Worker %a = load volatile fp128 , fp128 *%aptr 124*9880d681SAndroid Build Coastguard Worker %b = load volatile fp128 , fp128 *%bptr 125*9880d681SAndroid Build Coastguard Worker %c = call fp128 @copysignl(fp128 %a, fp128 %b) readnone 126*9880d681SAndroid Build Coastguard Worker store fp128 %c, fp128 *%cptr 127*9880d681SAndroid Build Coastguard Worker ret void 128*9880d681SAndroid Build Coastguard Worker} 129