1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=+mmx | FileCheck %s --check-prefix=X64 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=+mmx | FileCheck %s --check-prefix=X64 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O2 -mtriple=i686-linux-gnu -mattr=+mmx | FileCheck %s --check-prefix=X32 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Check soft floating point conversion function calls. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker@vi32 = common global i32 0, align 4 8*9880d681SAndroid Build Coastguard Worker@vi64 = common global i64 0, align 8 9*9880d681SAndroid Build Coastguard Worker@vu32 = common global i32 0, align 4 10*9880d681SAndroid Build Coastguard Worker@vu64 = common global i64 0, align 8 11*9880d681SAndroid Build Coastguard Worker@vf32 = common global float 0.000000e+00, align 4 12*9880d681SAndroid Build Coastguard Worker@vf64 = common global double 0.000000e+00, align 8 13*9880d681SAndroid Build Coastguard Worker@vf128 = common global fp128 0xL00000000000000000000000000000000, align 16 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine void @TestFPExtF32_F128() { 16*9880d681SAndroid Build Coastguard Workerentry: 17*9880d681SAndroid Build Coastguard Worker %0 = load float, float* @vf32, align 4 18*9880d681SAndroid Build Coastguard Worker %conv = fpext float %0 to fp128 19*9880d681SAndroid Build Coastguard Worker store fp128 %conv, fp128* @vf128, align 16 20*9880d681SAndroid Build Coastguard Worker ret void 21*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestFPExtF32_F128: 22*9880d681SAndroid Build Coastguard Worker; X32: flds vf32 23*9880d681SAndroid Build Coastguard Worker; X32: fstps 24*9880d681SAndroid Build Coastguard Worker; X32: calll __extendsftf2 25*9880d681SAndroid Build Coastguard Worker; X32: retl 26*9880d681SAndroid Build Coastguard Worker; 27*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestFPExtF32_F128: 28*9880d681SAndroid Build Coastguard Worker; X64: movss vf32(%rip), %xmm0 29*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __extendsftf2 30*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps %xmm0, vf128(%rip) 31*9880d681SAndroid Build Coastguard Worker; X64: retq 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdefine void @TestFPExtF64_F128() { 35*9880d681SAndroid Build Coastguard Workerentry: 36*9880d681SAndroid Build Coastguard Worker %0 = load double, double* @vf64, align 8 37*9880d681SAndroid Build Coastguard Worker %conv = fpext double %0 to fp128 38*9880d681SAndroid Build Coastguard Worker store fp128 %conv, fp128* @vf128, align 16 39*9880d681SAndroid Build Coastguard Worker ret void 40*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestFPExtF64_F128: 41*9880d681SAndroid Build Coastguard Worker; X32: fldl vf64 42*9880d681SAndroid Build Coastguard Worker; X32: fstpl 43*9880d681SAndroid Build Coastguard Worker; X32: calll __extenddftf2 44*9880d681SAndroid Build Coastguard Worker; X32: retl 45*9880d681SAndroid Build Coastguard Worker; 46*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestFPExtF64_F128: 47*9880d681SAndroid Build Coastguard Worker; X64: movsd vf64(%rip), %xmm0 48*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __extenddftf2 49*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movapd %xmm0, vf128(%rip) 50*9880d681SAndroid Build Coastguard Worker; X64: ret 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine void @TestFPToSIF128_I32() { 54*9880d681SAndroid Build Coastguard Workerentry: 55*9880d681SAndroid Build Coastguard Worker %0 = load fp128, fp128* @vf128, align 16 56*9880d681SAndroid Build Coastguard Worker %conv = fptosi fp128 %0 to i32 57*9880d681SAndroid Build Coastguard Worker store i32 %conv, i32* @vi32, align 4 58*9880d681SAndroid Build Coastguard Worker ret void 59*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestFPToSIF128_I32: 60*9880d681SAndroid Build Coastguard Worker; X32: calll __fixtfsi 61*9880d681SAndroid Build Coastguard Worker; X32: retl 62*9880d681SAndroid Build Coastguard Worker; 63*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestFPToSIF128_I32: 64*9880d681SAndroid Build Coastguard Worker; X64: movaps vf128(%rip), %xmm0 65*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __fixtfsi 66*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %eax, vi32(%rip) 67*9880d681SAndroid Build Coastguard Worker; X64: retq 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdefine void @TestFPToUIF128_U32() { 71*9880d681SAndroid Build Coastguard Workerentry: 72*9880d681SAndroid Build Coastguard Worker %0 = load fp128, fp128* @vf128, align 16 73*9880d681SAndroid Build Coastguard Worker %conv = fptoui fp128 %0 to i32 74*9880d681SAndroid Build Coastguard Worker store i32 %conv, i32* @vu32, align 4 75*9880d681SAndroid Build Coastguard Worker ret void 76*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestFPToUIF128_U32: 77*9880d681SAndroid Build Coastguard Worker; X32: calll __fixunstfsi 78*9880d681SAndroid Build Coastguard Worker; X32: retl 79*9880d681SAndroid Build Coastguard Worker; 80*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestFPToUIF128_U32: 81*9880d681SAndroid Build Coastguard Worker; X64: movaps vf128(%rip), %xmm0 82*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __fixunstfsi 83*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %eax, vu32(%rip) 84*9880d681SAndroid Build Coastguard Worker; X64: retq 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine void @TestFPToSIF128_I64() { 88*9880d681SAndroid Build Coastguard Workerentry: 89*9880d681SAndroid Build Coastguard Worker %0 = load fp128, fp128* @vf128, align 16 90*9880d681SAndroid Build Coastguard Worker %conv = fptosi fp128 %0 to i32 91*9880d681SAndroid Build Coastguard Worker %conv1 = sext i32 %conv to i64 92*9880d681SAndroid Build Coastguard Worker store i64 %conv1, i64* @vi64, align 8 93*9880d681SAndroid Build Coastguard Worker ret void 94*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestFPToSIF128_I64: 95*9880d681SAndroid Build Coastguard Worker; X32: calll __fixtfsi 96*9880d681SAndroid Build Coastguard Worker; X32: retl 97*9880d681SAndroid Build Coastguard Worker; 98*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestFPToSIF128_I64: 99*9880d681SAndroid Build Coastguard Worker; X64: movaps vf128(%rip), %xmm0 100*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __fixtfsi 101*9880d681SAndroid Build Coastguard Worker; X64-NEXT: cltq 102*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movq %rax, vi64(%rip) 103*9880d681SAndroid Build Coastguard Worker; X64: retq 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefine void @TestFPToUIF128_U64() { 107*9880d681SAndroid Build Coastguard Workerentry: 108*9880d681SAndroid Build Coastguard Worker %0 = load fp128, fp128* @vf128, align 16 109*9880d681SAndroid Build Coastguard Worker %conv = fptoui fp128 %0 to i32 110*9880d681SAndroid Build Coastguard Worker %conv1 = zext i32 %conv to i64 111*9880d681SAndroid Build Coastguard Worker store i64 %conv1, i64* @vu64, align 8 112*9880d681SAndroid Build Coastguard Worker ret void 113*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestFPToUIF128_U64: 114*9880d681SAndroid Build Coastguard Worker; X32: calll __fixunstfsi 115*9880d681SAndroid Build Coastguard Worker; X32: retl 116*9880d681SAndroid Build Coastguard Worker; 117*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestFPToUIF128_U64: 118*9880d681SAndroid Build Coastguard Worker; X64: movaps vf128(%rip), %xmm0 119*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __fixunstfsi 120*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %eax, %eax 121*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movq %rax, vu64(%rip) 122*9880d681SAndroid Build Coastguard Worker; X64: retq 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdefine void @TestFPTruncF128_F32() { 126*9880d681SAndroid Build Coastguard Workerentry: 127*9880d681SAndroid Build Coastguard Worker %0 = load fp128, fp128* @vf128, align 16 128*9880d681SAndroid Build Coastguard Worker %conv = fptrunc fp128 %0 to float 129*9880d681SAndroid Build Coastguard Worker store float %conv, float* @vf32, align 4 130*9880d681SAndroid Build Coastguard Worker ret void 131*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestFPTruncF128_F32: 132*9880d681SAndroid Build Coastguard Worker; X32: calll __trunctfsf2 133*9880d681SAndroid Build Coastguard Worker; X32: fstps vf32 134*9880d681SAndroid Build Coastguard Worker; X32: retl 135*9880d681SAndroid Build Coastguard Worker; 136*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestFPTruncF128_F32: 137*9880d681SAndroid Build Coastguard Worker; X64: movaps vf128(%rip), %xmm0 138*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __trunctfsf2 139*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movss %xmm0, vf32(%rip) 140*9880d681SAndroid Build Coastguard Worker; X64: retq 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Workerdefine void @TestFPTruncF128_F64() { 144*9880d681SAndroid Build Coastguard Workerentry: 145*9880d681SAndroid Build Coastguard Worker %0 = load fp128, fp128* @vf128, align 16 146*9880d681SAndroid Build Coastguard Worker %conv = fptrunc fp128 %0 to double 147*9880d681SAndroid Build Coastguard Worker store double %conv, double* @vf64, align 8 148*9880d681SAndroid Build Coastguard Worker ret void 149*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestFPTruncF128_F64: 150*9880d681SAndroid Build Coastguard Worker; X32: calll __trunctfdf2 151*9880d681SAndroid Build Coastguard Worker; X32: fstpl vf64 152*9880d681SAndroid Build Coastguard Worker; X32: retl 153*9880d681SAndroid Build Coastguard Worker; 154*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestFPTruncF128_F64: 155*9880d681SAndroid Build Coastguard Worker; X64: movapd vf128(%rip), %xmm0 156*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __trunctfdf2 157*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movsd %xmm0, vf64(%rip) 158*9880d681SAndroid Build Coastguard Worker; X64: retq 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdefine void @TestSIToFPI32_F128() { 162*9880d681SAndroid Build Coastguard Workerentry: 163*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @vi32, align 4 164*9880d681SAndroid Build Coastguard Worker %conv = sitofp i32 %0 to fp128 165*9880d681SAndroid Build Coastguard Worker store fp128 %conv, fp128* @vf128, align 16 166*9880d681SAndroid Build Coastguard Worker ret void 167*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestSIToFPI32_F128: 168*9880d681SAndroid Build Coastguard Worker; X32: calll __floatsitf 169*9880d681SAndroid Build Coastguard Worker; X32: retl 170*9880d681SAndroid Build Coastguard Worker; 171*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestSIToFPI32_F128: 172*9880d681SAndroid Build Coastguard Worker; X64: movl vi32(%rip), %edi 173*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __floatsitf 174*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps %xmm0, vf128(%rip) 175*9880d681SAndroid Build Coastguard Worker; X64: retq 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Workerdefine void @TestUIToFPU32_F128() #2 { 179*9880d681SAndroid Build Coastguard Workerentry: 180*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @vu32, align 4 181*9880d681SAndroid Build Coastguard Worker %conv = uitofp i32 %0 to fp128 182*9880d681SAndroid Build Coastguard Worker store fp128 %conv, fp128* @vf128, align 16 183*9880d681SAndroid Build Coastguard Worker ret void 184*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestUIToFPU32_F128: 185*9880d681SAndroid Build Coastguard Worker; X32: calll __floatunsitf 186*9880d681SAndroid Build Coastguard Worker; X32: retl 187*9880d681SAndroid Build Coastguard Worker; 188*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestUIToFPU32_F128: 189*9880d681SAndroid Build Coastguard Worker; X64: movl vu32(%rip), %edi 190*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __floatunsitf 191*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps %xmm0, vf128(%rip) 192*9880d681SAndroid Build Coastguard Worker; X64: retq 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerdefine void @TestSIToFPI64_F128(){ 196*9880d681SAndroid Build Coastguard Workerentry: 197*9880d681SAndroid Build Coastguard Worker %0 = load i64, i64* @vi64, align 8 198*9880d681SAndroid Build Coastguard Worker %conv = sitofp i64 %0 to fp128 199*9880d681SAndroid Build Coastguard Worker store fp128 %conv, fp128* @vf128, align 16 200*9880d681SAndroid Build Coastguard Worker ret void 201*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestSIToFPI64_F128: 202*9880d681SAndroid Build Coastguard Worker; X32: calll __floatditf 203*9880d681SAndroid Build Coastguard Worker; X32: retl 204*9880d681SAndroid Build Coastguard Worker; 205*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestSIToFPI64_F128: 206*9880d681SAndroid Build Coastguard Worker; X64: movq vi64(%rip), %rdi 207*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __floatditf 208*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps %xmm0, vf128(%rip) 209*9880d681SAndroid Build Coastguard Worker; X64: retq 210*9880d681SAndroid Build Coastguard Worker} 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Workerdefine void @TestUIToFPU64_F128() #2 { 213*9880d681SAndroid Build Coastguard Workerentry: 214*9880d681SAndroid Build Coastguard Worker %0 = load i64, i64* @vu64, align 8 215*9880d681SAndroid Build Coastguard Worker %conv = uitofp i64 %0 to fp128 216*9880d681SAndroid Build Coastguard Worker store fp128 %conv, fp128* @vf128, align 16 217*9880d681SAndroid Build Coastguard Worker ret void 218*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestUIToFPU64_F128: 219*9880d681SAndroid Build Coastguard Worker; X32: calll __floatunditf 220*9880d681SAndroid Build Coastguard Worker; X32: retl 221*9880d681SAndroid Build Coastguard Worker; 222*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestUIToFPU64_F128: 223*9880d681SAndroid Build Coastguard Worker; X64: movq vu64(%rip), %rdi 224*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __floatunditf 225*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps %xmm0, vf128(%rip) 226*9880d681SAndroid Build Coastguard Worker; X64: retq 227*9880d681SAndroid Build Coastguard Worker} 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workerdefine i32 @TestConst128(fp128 %v) { 230*9880d681SAndroid Build Coastguard Workerentry: 231*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ogt fp128 %v, 0xL00000000000000003FFF000000000000 232*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 233*9880d681SAndroid Build Coastguard Worker ret i32 %conv 234*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestConst128: 235*9880d681SAndroid Build Coastguard Worker; X32: calll __gttf2 236*9880d681SAndroid Build Coastguard Worker; X32: retl 237*9880d681SAndroid Build Coastguard Worker; 238*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestConst128: 239*9880d681SAndroid Build Coastguard Worker; X64: movaps {{.*}}, %xmm1 240*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __gttf2 241*9880d681SAndroid Build Coastguard Worker; X64-NEXT: xorl 242*9880d681SAndroid Build Coastguard Worker; X64-NEXT: test 243*9880d681SAndroid Build Coastguard Worker; X64: retq 244*9880d681SAndroid Build Coastguard Worker} 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker; C code: 247*9880d681SAndroid Build Coastguard Worker; struct TestBits_ieee_ext { 248*9880d681SAndroid Build Coastguard Worker; unsigned v1; 249*9880d681SAndroid Build Coastguard Worker; unsigned v2; 250*9880d681SAndroid Build Coastguard Worker; }; 251*9880d681SAndroid Build Coastguard Worker; union TestBits_LDU { 252*9880d681SAndroid Build Coastguard Worker; FP128 ld; 253*9880d681SAndroid Build Coastguard Worker; struct TestBits_ieee_ext bits; 254*9880d681SAndroid Build Coastguard Worker; }; 255*9880d681SAndroid Build Coastguard Worker; int TestBits128(FP128 ld) { 256*9880d681SAndroid Build Coastguard Worker; union TestBits_LDU u; 257*9880d681SAndroid Build Coastguard Worker; u.ld = ld * ld; 258*9880d681SAndroid Build Coastguard Worker; return ((u.bits.v1 | u.bits.v2) == 0); 259*9880d681SAndroid Build Coastguard Worker; } 260*9880d681SAndroid Build Coastguard Workerdefine i32 @TestBits128(fp128 %ld) { 261*9880d681SAndroid Build Coastguard Workerentry: 262*9880d681SAndroid Build Coastguard Worker %mul = fmul fp128 %ld, %ld 263*9880d681SAndroid Build Coastguard Worker %0 = bitcast fp128 %mul to i128 264*9880d681SAndroid Build Coastguard Worker %shift = lshr i128 %0, 32 265*9880d681SAndroid Build Coastguard Worker %or5 = or i128 %shift, %0 266*9880d681SAndroid Build Coastguard Worker %or = trunc i128 %or5 to i32 267*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %or, 0 268*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 269*9880d681SAndroid Build Coastguard Worker ret i32 %conv 270*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestBits128: 271*9880d681SAndroid Build Coastguard Worker; X32: calll __multf3 272*9880d681SAndroid Build Coastguard Worker; X32: retl 273*9880d681SAndroid Build Coastguard Worker; 274*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestBits128: 275*9880d681SAndroid Build Coastguard Worker; X64: movaps %xmm0, %xmm1 276*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __multf3 277*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps %xmm0, (%rsp) 278*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movq (%rsp), 279*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movq % 280*9880d681SAndroid Build Coastguard Worker; X64-NEXT: shrq $32, 281*9880d681SAndroid Build Coastguard Worker; X64: xorl %eax, %eax 282*9880d681SAndroid Build Coastguard Worker; X64-NEXT: orl 283*9880d681SAndroid Build Coastguard Worker; X64-NEXT: sete %al 284*9880d681SAndroid Build Coastguard Worker; X64: retq 285*9880d681SAndroid Build Coastguard Worker; 286*9880d681SAndroid Build Coastguard Worker; If TestBits128 fails due to any llvm or clang change, 287*9880d681SAndroid Build Coastguard Worker; please make sure the original simplified C code will 288*9880d681SAndroid Build Coastguard Worker; be compiled into correct IL and assembly code, not 289*9880d681SAndroid Build Coastguard Worker; just this TestBits128 test case. Better yet, try to 290*9880d681SAndroid Build Coastguard Worker; test the whole libm and its test cases. 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker; C code: (compiled with -target x86_64-linux-android) 294*9880d681SAndroid Build Coastguard Worker; typedef long double __float128; 295*9880d681SAndroid Build Coastguard Worker; __float128 TestPair128(unsigned long a, unsigned long b) { 296*9880d681SAndroid Build Coastguard Worker; unsigned __int128 n; 297*9880d681SAndroid Build Coastguard Worker; unsigned __int128 v1 = ((unsigned __int128)a << 64); 298*9880d681SAndroid Build Coastguard Worker; unsigned __int128 v2 = (unsigned __int128)b; 299*9880d681SAndroid Build Coastguard Worker; n = (v1 | v2) + 3; 300*9880d681SAndroid Build Coastguard Worker; return *(__float128*)&n; 301*9880d681SAndroid Build Coastguard Worker; } 302*9880d681SAndroid Build Coastguard Workerdefine fp128 @TestPair128(i64 %a, i64 %b) { 303*9880d681SAndroid Build Coastguard Workerentry: 304*9880d681SAndroid Build Coastguard Worker %conv = zext i64 %a to i128 305*9880d681SAndroid Build Coastguard Worker %shl = shl nuw i128 %conv, 64 306*9880d681SAndroid Build Coastguard Worker %conv1 = zext i64 %b to i128 307*9880d681SAndroid Build Coastguard Worker %or = or i128 %shl, %conv1 308*9880d681SAndroid Build Coastguard Worker %add = add i128 %or, 3 309*9880d681SAndroid Build Coastguard Worker %0 = bitcast i128 %add to fp128 310*9880d681SAndroid Build Coastguard Worker ret fp128 %0 311*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestPair128: 312*9880d681SAndroid Build Coastguard Worker; X32: addl 313*9880d681SAndroid Build Coastguard Worker; X32-NEXT: adcl 314*9880d681SAndroid Build Coastguard Worker; X32-NEXT: adcl 315*9880d681SAndroid Build Coastguard Worker; X32-NEXT: adcl 316*9880d681SAndroid Build Coastguard Worker; X32: retl 317*9880d681SAndroid Build Coastguard Worker; 318*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestPair128: 319*9880d681SAndroid Build Coastguard Worker; X64: addq $3, %rsi 320*9880d681SAndroid Build Coastguard Worker; X64: movq %rsi, -24(%rsp) 321*9880d681SAndroid Build Coastguard Worker; X64: movq %rdi, -16(%rsp) 322*9880d681SAndroid Build Coastguard Worker; X64: movaps -24(%rsp), %xmm0 323*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 324*9880d681SAndroid Build Coastguard Worker} 325*9880d681SAndroid Build Coastguard Worker 326*9880d681SAndroid Build Coastguard Workerdefine fp128 @TestTruncCopysign(fp128 %x, i32 %n) { 327*9880d681SAndroid Build Coastguard Workerentry: 328*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %n, 50000 329*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %cleanup 330*9880d681SAndroid Build Coastguard Worker 331*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 332*9880d681SAndroid Build Coastguard Worker %conv = fptrunc fp128 %x to double 333*9880d681SAndroid Build Coastguard Worker %call = tail call double @copysign(double 0x7FF0000000000000, double %conv) #2 334*9880d681SAndroid Build Coastguard Worker %conv1 = fpext double %call to fp128 335*9880d681SAndroid Build Coastguard Worker br label %cleanup 336*9880d681SAndroid Build Coastguard Worker 337*9880d681SAndroid Build Coastguard Workercleanup: ; preds = %entry, %if.then 338*9880d681SAndroid Build Coastguard Worker %retval.0 = phi fp128 [ %conv1, %if.then ], [ %x, %entry ] 339*9880d681SAndroid Build Coastguard Worker ret fp128 %retval.0 340*9880d681SAndroid Build Coastguard Worker; X32-LABEL: TestTruncCopysign: 341*9880d681SAndroid Build Coastguard Worker; X32: calll __trunctfdf2 342*9880d681SAndroid Build Coastguard Worker; X32: fstpl 343*9880d681SAndroid Build Coastguard Worker; X32: flds 344*9880d681SAndroid Build Coastguard Worker; X32: flds 345*9880d681SAndroid Build Coastguard Worker; X32: fstp 346*9880d681SAndroid Build Coastguard Worker; X32: fldz 347*9880d681SAndroid Build Coastguard Worker; X32: fstp 348*9880d681SAndroid Build Coastguard Worker; X32: fstpl 349*9880d681SAndroid Build Coastguard Worker; X32: calll __extenddftf2 350*9880d681SAndroid Build Coastguard Worker; X32: retl 351*9880d681SAndroid Build Coastguard Worker; 352*9880d681SAndroid Build Coastguard Worker; X64-LABEL: TestTruncCopysign: 353*9880d681SAndroid Build Coastguard Worker; X64: callq __trunctfdf2 354*9880d681SAndroid Build Coastguard Worker; X64-NEXT: andpd {{.*}}, %xmm0 355*9880d681SAndroid Build Coastguard Worker; X64-NEXT: orpd {{.*}}, %xmm0 356*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __extenddftf2 357*9880d681SAndroid Build Coastguard Worker; X64: retq 358*9880d681SAndroid Build Coastguard Worker} 359*9880d681SAndroid Build Coastguard Worker 360*9880d681SAndroid Build Coastguard Workerdeclare double @copysign(double, double) #1 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Workerattributes #2 = { nounwind readnone } 363