1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mattr=+neon %s -o - | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; PR12540: ARM backend lowering of FP_ROUND v2f64 to v2f32. 4*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @vtrunc(<2 x double> %a) { 5*9880d681SAndroid Build Coastguard Worker; CHECK: vcvt.f32.f64 [[S0:s[0-9]+]], [[D0:d[0-9]+]] 6*9880d681SAndroid Build Coastguard Worker; CHECK: vcvt.f32.f64 [[S1:s[0-9]+]], [[D1:d[0-9]+]] 7*9880d681SAndroid Build Coastguard Worker %vt = fptrunc <2 x double> %a to <2 x float> 8*9880d681SAndroid Build Coastguard Worker ret <2 x float> %vt 9*9880d681SAndroid Build Coastguard Worker} 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @vextend(<2 x float> %a) { 12*9880d681SAndroid Build Coastguard Worker; CHECK: vcvt.f64.f32 [[D0:d[0-9]+]], [[S0:s[0-9]+]] 13*9880d681SAndroid Build Coastguard Worker; CHECK: vcvt.f64.f32 [[D1:d[0-9]+]], [[S1:s[0-9]+]] 14*9880d681SAndroid Build Coastguard Worker %ve = fpext <2 x float> %a to <2 x double> 15*9880d681SAndroid Build Coastguard Worker ret <2 x double> %ve 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; We used to generate vmovs between scalar and vfp/neon registers. 19*9880d681SAndroid Build Coastguard Worker; CHECK: vsitofp_double 20*9880d681SAndroid Build Coastguard Workerdefine void @vsitofp_double(<2 x i32>* %loadaddr, 21*9880d681SAndroid Build Coastguard Worker <2 x double>* %storeaddr) { 22*9880d681SAndroid Build Coastguard Worker %v0 = load <2 x i32>, <2 x i32>* %loadaddr 23*9880d681SAndroid Build Coastguard Worker; CHECK: vldr 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vcvt.f64.s32 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vcvt.f64.s32 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vst 27*9880d681SAndroid Build Coastguard Worker %r = sitofp <2 x i32> %v0 to <2 x double> 28*9880d681SAndroid Build Coastguard Worker store <2 x double> %r, <2 x double>* %storeaddr 29*9880d681SAndroid Build Coastguard Worker ret void 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker; CHECK: vuitofp_double 32*9880d681SAndroid Build Coastguard Workerdefine void @vuitofp_double(<2 x i32>* %loadaddr, 33*9880d681SAndroid Build Coastguard Worker <2 x double>* %storeaddr) { 34*9880d681SAndroid Build Coastguard Worker %v0 = load <2 x i32>, <2 x i32>* %loadaddr 35*9880d681SAndroid Build Coastguard Worker; CHECK: vldr 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vcvt.f64.u32 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vcvt.f64.u32 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vst 39*9880d681SAndroid Build Coastguard Worker %r = uitofp <2 x i32> %v0 to <2 x double> 40*9880d681SAndroid Build Coastguard Worker store <2 x double> %r, <2 x double>* %storeaddr 41*9880d681SAndroid Build Coastguard Worker ret void 42*9880d681SAndroid Build Coastguard Worker} 43