1*9880d681SAndroid Build Coastguard Worker; Check that scalar FP conversions to signed and unsigned int64 are using 2*9880d681SAndroid Build Coastguard Worker; reasonable sequences, across platforms and target switches. 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; The signed case is straight forward, and the tests here basically 5*9880d681SAndroid Build Coastguard Worker; ensure successful compilation (f80 with avx512 was broken at one point). 6*9880d681SAndroid Build Coastguard Worker; 7*9880d681SAndroid Build Coastguard Worker; For the unsigned case there are many possible sequences, so to avoid 8*9880d681SAndroid Build Coastguard Worker; a fragile test we just check for the presence of a few key instructions. 9*9880d681SAndroid Build Coastguard Worker; AVX512 on Intel64 can use vcvtts[ds]2usi directly for float and double. 10*9880d681SAndroid Build Coastguard Worker; Otherwise the sequence will involve an FP subtract (fsub, subss or subsd), 11*9880d681SAndroid Build Coastguard Worker; and a truncating conversion (cvtts[ds]2si, fisttp, or fnstcw+fist). When 12*9880d681SAndroid Build Coastguard Worker; both a subtract and fnstcw are needed, they can occur in either order. 13*9880d681SAndroid Build Coastguard Worker; 14*9880d681SAndroid Build Coastguard Worker; The interesting subtargets are AVX512F (vcvtts[ds]2usi), SSE3 (fisttp), 15*9880d681SAndroid Build Coastguard Worker; SSE2 (cvtts[ds]2si) and vanilla X87 (fnstcw+fist, 32-bit only). 16*9880d681SAndroid Build Coastguard Worker; 17*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_32 18*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_32 19*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_64 20*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_64 21*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+sse3 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE3_32 22*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+sse3 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE3_32 23*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+sse3 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE3_64 24*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse3 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE3_64 25*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_32 26*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_32 27*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_64 28*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_64 29*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=-sse | FileCheck %s --check-prefix=CHECK --check-prefix=X87 30*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=-sse | FileCheck %s --check-prefix=CHECK --check-prefix=X87 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f_to_u64 33*9880d681SAndroid Build Coastguard Worker; X87-DAG: fsub 34*9880d681SAndroid Build Coastguard Worker; X87-DAG: fnstcw 35*9880d681SAndroid Build Coastguard Worker; X87: fist 36*9880d681SAndroid Build Coastguard Worker; SSE2_32-DAG: {{subss|fsub}} 37*9880d681SAndroid Build Coastguard Worker; SSE2_32-DAG: fnstcw 38*9880d681SAndroid Build Coastguard Worker; SSE2_32: fist 39*9880d681SAndroid Build Coastguard Worker; SSE2_64: subss 40*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvttss2si 41*9880d681SAndroid Build Coastguard Worker; SSE3_32: {{subss|fsub}} 42*9880d681SAndroid Build Coastguard Worker; SSE3_32: fistt 43*9880d681SAndroid Build Coastguard Worker; SSE3_64: subss 44*9880d681SAndroid Build Coastguard Worker; SSE3_64: cvttss2si 45*9880d681SAndroid Build Coastguard Worker; AVX512_32: {{subss|fsub}} 46*9880d681SAndroid Build Coastguard Worker; AVX512_32: fistt 47*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvttss2usi 48*9880d681SAndroid Build Coastguard Worker; CHECK: ret 49*9880d681SAndroid Build Coastguard Workerdefine i64 @f_to_u64(float %a) nounwind { 50*9880d681SAndroid Build Coastguard Worker %r = fptoui float %a to i64 51*9880d681SAndroid Build Coastguard Worker ret i64 %r 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f_to_s64 55*9880d681SAndroid Build Coastguard Worker; X87: fnstcw 56*9880d681SAndroid Build Coastguard Worker; X87: fist 57*9880d681SAndroid Build Coastguard Worker; SSE2_32: fnstcw 58*9880d681SAndroid Build Coastguard Worker; SSE2_32: fist 59*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvttss2si 60*9880d681SAndroid Build Coastguard Worker; SSE3_32: fistt 61*9880d681SAndroid Build Coastguard Worker; SSE3_64: cvttss2si 62*9880d681SAndroid Build Coastguard Worker; AVX512_32: fistt 63*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvttss2si 64*9880d681SAndroid Build Coastguard Worker; CHECK: ret 65*9880d681SAndroid Build Coastguard Workerdefine i64 @f_to_s64(float %a) nounwind { 66*9880d681SAndroid Build Coastguard Worker %r = fptosi float %a to i64 67*9880d681SAndroid Build Coastguard Worker ret i64 %r 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: d_to_u64 71*9880d681SAndroid Build Coastguard Worker; X87-DAG: fsub 72*9880d681SAndroid Build Coastguard Worker; X87-DAG: fnstcw 73*9880d681SAndroid Build Coastguard Worker; X87: fist 74*9880d681SAndroid Build Coastguard Worker; SSE2_32-DAG: {{subsd|fsub}} 75*9880d681SAndroid Build Coastguard Worker; SSE2_32-DAG: fnstcw 76*9880d681SAndroid Build Coastguard Worker; SSE2_32: fist 77*9880d681SAndroid Build Coastguard Worker; SSE2_64: subsd 78*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvttsd2si 79*9880d681SAndroid Build Coastguard Worker; SSE3_32: {{subsd|fsub}} 80*9880d681SAndroid Build Coastguard Worker; SSE3_32: fistt 81*9880d681SAndroid Build Coastguard Worker; SSE3_64: subsd 82*9880d681SAndroid Build Coastguard Worker; SSE3_64: cvttsd2si 83*9880d681SAndroid Build Coastguard Worker; AVX512_32: {{subsd|fsub}} 84*9880d681SAndroid Build Coastguard Worker; AVX512_32: fistt 85*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvttsd2usi 86*9880d681SAndroid Build Coastguard Worker; CHECK: ret 87*9880d681SAndroid Build Coastguard Workerdefine i64 @d_to_u64(double %a) nounwind { 88*9880d681SAndroid Build Coastguard Worker %r = fptoui double %a to i64 89*9880d681SAndroid Build Coastguard Worker ret i64 %r 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: d_to_s64 93*9880d681SAndroid Build Coastguard Worker; X87: fnstcw 94*9880d681SAndroid Build Coastguard Worker; X87: fist 95*9880d681SAndroid Build Coastguard Worker; SSE2_32: fnstcw 96*9880d681SAndroid Build Coastguard Worker; SSE2_32: fist 97*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvttsd2si 98*9880d681SAndroid Build Coastguard Worker; SSE3_32: fistt 99*9880d681SAndroid Build Coastguard Worker; SSE3_64: cvttsd2si 100*9880d681SAndroid Build Coastguard Worker; AVX512_32: fistt 101*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvttsd2si 102*9880d681SAndroid Build Coastguard Worker; CHECK: ret 103*9880d681SAndroid Build Coastguard Workerdefine i64 @d_to_s64(double %a) nounwind { 104*9880d681SAndroid Build Coastguard Worker %r = fptosi double %a to i64 105*9880d681SAndroid Build Coastguard Worker ret i64 %r 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: x_to_u64 109*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fsub 110*9880d681SAndroid Build Coastguard Worker; X87-DAG: fnstcw 111*9880d681SAndroid Build Coastguard Worker; SSE2_32-DAG: fnstcw 112*9880d681SAndroid Build Coastguard Worker; SSE2_64-DAG: fnstcw 113*9880d681SAndroid Build Coastguard Worker; CHECK: fist 114*9880d681SAndroid Build Coastguard Worker; CHECK: ret 115*9880d681SAndroid Build Coastguard Workerdefine i64 @x_to_u64(x86_fp80 %a) nounwind { 116*9880d681SAndroid Build Coastguard Worker %r = fptoui x86_fp80 %a to i64 117*9880d681SAndroid Build Coastguard Worker ret i64 %r 118*9880d681SAndroid Build Coastguard Worker} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: x_to_s64 121*9880d681SAndroid Build Coastguard Worker; X87: fnstcw 122*9880d681SAndroid Build Coastguard Worker; X87: fist 123*9880d681SAndroid Build Coastguard Worker; SSE2_32: fnstcw 124*9880d681SAndroid Build Coastguard Worker; SSE2_32: fist 125*9880d681SAndroid Build Coastguard Worker; SSE2_64: fnstcw 126*9880d681SAndroid Build Coastguard Worker; SSE2_64: fist 127*9880d681SAndroid Build Coastguard Worker; SSE3_32: fistt 128*9880d681SAndroid Build Coastguard Worker; SSE3_64: fistt 129*9880d681SAndroid Build Coastguard Worker; AVX512_32: fistt 130*9880d681SAndroid Build Coastguard Worker; AVX512_64: fistt 131*9880d681SAndroid Build Coastguard Worker; CHECK: ret 132*9880d681SAndroid Build Coastguard Workerdefine i64 @x_to_s64(x86_fp80 %a) nounwind { 133*9880d681SAndroid Build Coastguard Worker %r = fptosi x86_fp80 %a to i64 134*9880d681SAndroid Build Coastguard Worker ret i64 %r 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t_to_u64 138*9880d681SAndroid Build Coastguard Worker; CHECK: __fixunstfdi 139*9880d681SAndroid Build Coastguard Worker; CHECK: ret 140*9880d681SAndroid Build Coastguard Workerdefine i64 @t_to_u64(fp128 %a) nounwind { 141*9880d681SAndroid Build Coastguard Worker %r = fptoui fp128 %a to i64 142*9880d681SAndroid Build Coastguard Worker ret i64 %r 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t_to_s64 146*9880d681SAndroid Build Coastguard Worker; CHECK: __fixtfdi 147*9880d681SAndroid Build Coastguard Worker; CHECK: ret 148*9880d681SAndroid Build Coastguard Workerdefine i64 @t_to_s64(fp128 %a) nounwind { 149*9880d681SAndroid Build Coastguard Worker %r = fptosi fp128 %a to i64 150*9880d681SAndroid Build Coastguard Worker ret i64 %r 151*9880d681SAndroid Build Coastguard Worker} 152