1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple armv7 %s -o - | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f: 4*9880d681SAndroid Build Coastguard Workerdefine float @f(<4 x i16>* nocapture %in) { 5*9880d681SAndroid Build Coastguard Worker ; CHECK: vld1 6*9880d681SAndroid Build Coastguard Worker ; CHECK: vmovl.u16 7*9880d681SAndroid Build Coastguard Worker %1 = load <4 x i16>, <4 x i16>* %in 8*9880d681SAndroid Build Coastguard Worker ; CHECK: vcvt.f32.u32 9*9880d681SAndroid Build Coastguard Worker %2 = uitofp <4 x i16> %1 to <4 x float> 10*9880d681SAndroid Build Coastguard Worker %3 = extractelement <4 x float> %2, i32 0 11*9880d681SAndroid Build Coastguard Worker %4 = extractelement <4 x float> %2, i32 1 12*9880d681SAndroid Build Coastguard Worker %5 = extractelement <4 x float> %2, i32 2 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker ; CHECK: vadd.f32 15*9880d681SAndroid Build Coastguard Worker %6 = fadd float %3, %4 16*9880d681SAndroid Build Coastguard Worker %7 = fadd float %6, %5 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker ret float %7 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: g: 22*9880d681SAndroid Build Coastguard Workerdefine float @g(<4 x i8>* nocapture %in) { 23*9880d681SAndroid Build Coastguard Worker; Note: vld1 here is reasonably important. Mixing VFP and NEON 24*9880d681SAndroid Build Coastguard Worker; instructions is bad on some cores 25*9880d681SAndroid Build Coastguard Worker ; CHECK: vld1 26*9880d681SAndroid Build Coastguard Worker ; CHECK: vmovl.u8 27*9880d681SAndroid Build Coastguard Worker ; CHECK: vmovl.u16 28*9880d681SAndroid Build Coastguard Worker %1 = load <4 x i8>, <4 x i8>* %in 29*9880d681SAndroid Build Coastguard Worker ; CHECK: vcvt.f32.u32 30*9880d681SAndroid Build Coastguard Worker %2 = uitofp <4 x i8> %1 to <4 x float> 31*9880d681SAndroid Build Coastguard Worker %3 = extractelement <4 x float> %2, i32 0 32*9880d681SAndroid Build Coastguard Worker %4 = extractelement <4 x float> %2, i32 1 33*9880d681SAndroid Build Coastguard Worker %5 = extractelement <4 x float> %2, i32 2 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker ; CHECK: vadd.f32 36*9880d681SAndroid Build Coastguard Worker %6 = fadd float %3, %4 37*9880d681SAndroid Build Coastguard Worker %7 = fadd float %6, %5 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker ret float %7 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: h: 43*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @h(<4 x float> %v) { 44*9880d681SAndroid Build Coastguard Worker ; CHECK: vcvt.{{[us]}}32.f32 45*9880d681SAndroid Build Coastguard Worker ; CHECK: vmovn.i32 46*9880d681SAndroid Build Coastguard Worker %1 = fptoui <4 x float> %v to <4 x i8> 47*9880d681SAndroid Build Coastguard Worker ret <4 x i8> %1 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i: 51*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @i(<4 x i8>* %x) { 52*9880d681SAndroid Build Coastguard Worker; Note: vld1 here is reasonably important. Mixing VFP and NEON 53*9880d681SAndroid Build Coastguard Worker; instructions is bad on some cores 54*9880d681SAndroid Build Coastguard Worker ; CHECK: vld1 55*9880d681SAndroid Build Coastguard Worker ; CHECK: vmovl.s8 56*9880d681SAndroid Build Coastguard Worker ; CHECK: vmovl.s16 57*9880d681SAndroid Build Coastguard Worker ; CHECK: vrecpe 58*9880d681SAndroid Build Coastguard Worker ; CHECK: vrecps 59*9880d681SAndroid Build Coastguard Worker ; CHECK: vmul 60*9880d681SAndroid Build Coastguard Worker ; CHECK: vmovn 61*9880d681SAndroid Build Coastguard Worker %1 = load <4 x i8>, <4 x i8>* %x, align 4 62*9880d681SAndroid Build Coastguard Worker %2 = sdiv <4 x i8> zeroinitializer, %1 63*9880d681SAndroid Build Coastguard Worker ret <4 x i8> %2 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: j: 66*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @j(<4 x i8>* %in) nounwind { 67*9880d681SAndroid Build Coastguard Worker ; CHECK: vld1 68*9880d681SAndroid Build Coastguard Worker ; CHECK: vmovl.u8 69*9880d681SAndroid Build Coastguard Worker ; CHECK: vmovl.u16 70*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: vand 71*9880d681SAndroid Build Coastguard Worker %1 = load <4 x i8>, <4 x i8>* %in, align 4 72*9880d681SAndroid Build Coastguard Worker %2 = zext <4 x i8> %1 to <4 x i32> 73*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76