1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 -fast-isel -fast-isel-abort=1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx -fast-isel -fast-isel-abort=1 | FileCheck %s --check-prefix=ALL --check-prefix=AVX 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; Verify that fast-isel doesn't select legacy SSE instructions on targets that 5*9880d681SAndroid Build Coastguard Worker; feature AVX. 6*9880d681SAndroid Build Coastguard Worker; 7*9880d681SAndroid Build Coastguard Worker; Test cases are obtained from the following code snippet: 8*9880d681SAndroid Build Coastguard Worker; /// 9*9880d681SAndroid Build Coastguard Worker; double single_to_double_rr(float x) { 10*9880d681SAndroid Build Coastguard Worker; return (double)x; 11*9880d681SAndroid Build Coastguard Worker; } 12*9880d681SAndroid Build Coastguard Worker; float double_to_single_rr(double x) { 13*9880d681SAndroid Build Coastguard Worker; return (float)x; 14*9880d681SAndroid Build Coastguard Worker; } 15*9880d681SAndroid Build Coastguard Worker; double single_to_double_rm(float *x) { 16*9880d681SAndroid Build Coastguard Worker; return (double)*x; 17*9880d681SAndroid Build Coastguard Worker; } 18*9880d681SAndroid Build Coastguard Worker; float double_to_single_rm(double *x) { 19*9880d681SAndroid Build Coastguard Worker; return (float)*x; 20*9880d681SAndroid Build Coastguard Worker; } 21*9880d681SAndroid Build Coastguard Worker; /// 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine double @single_to_double_rr(float %x) { 24*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: single_to_double_rr: 25*9880d681SAndroid Build Coastguard Worker; SSE-NOT: vcvtss2sd 26*9880d681SAndroid Build Coastguard Worker; AVX: vcvtss2sd %xmm0, %xmm0, %xmm0 27*9880d681SAndroid Build Coastguard Worker; ALL: ret 28*9880d681SAndroid Build Coastguard Workerentry: 29*9880d681SAndroid Build Coastguard Worker %conv = fpext float %x to double 30*9880d681SAndroid Build Coastguard Worker ret double %conv 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine float @double_to_single_rr(double %x) { 34*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: double_to_single_rr: 35*9880d681SAndroid Build Coastguard Worker; SSE-NOT: vcvtsd2ss 36*9880d681SAndroid Build Coastguard Worker; AVX: vcvtsd2ss %xmm0, %xmm0, %xmm0 37*9880d681SAndroid Build Coastguard Worker; ALL: ret 38*9880d681SAndroid Build Coastguard Workerentry: 39*9880d681SAndroid Build Coastguard Worker %conv = fptrunc double %x to float 40*9880d681SAndroid Build Coastguard Worker ret float %conv 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerdefine double @single_to_double_rm(float* %x) { 44*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: single_to_double_rm: 45*9880d681SAndroid Build Coastguard Worker; SSE: cvtss2sd (%rdi), %xmm0 46*9880d681SAndroid Build Coastguard Worker; AVX: vmovss (%rdi), %xmm0 47*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0 48*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: ret 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker %0 = load float, float* %x, align 4 51*9880d681SAndroid Build Coastguard Worker %conv = fpext float %0 to double 52*9880d681SAndroid Build Coastguard Worker ret double %conv 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdefine float @double_to_single_rm(double* %x) { 56*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: double_to_single_rm: 57*9880d681SAndroid Build Coastguard Worker; SSE: cvtsd2ss (%rdi), %xmm0 58*9880d681SAndroid Build Coastguard Worker; AVX: vmovsd (%rdi), %xmm0 59*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vcvtsd2ss %xmm0, %xmm0, %xmm0 60*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: ret 61*9880d681SAndroid Build Coastguard Workerentry: 62*9880d681SAndroid Build Coastguard Worker %0 = load double, double* %x, align 8 63*9880d681SAndroid Build Coastguard Worker %conv = fptrunc double %0 to float 64*9880d681SAndroid Build Coastguard Worker ret float %conv 65*9880d681SAndroid Build Coastguard Worker} 66