1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker@in = global float 0x400921FA00000000, align 4 4*9880d681SAndroid Build Coastguard Worker@iin = global i32 -1023, align 4 5*9880d681SAndroid Build Coastguard Worker@uin = global i32 1023, align 4 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdeclare void @foo_int32x4_t(<4 x i32>) 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; Test signed conversion. 10*9880d681SAndroid Build Coastguard Worker; CHECK: t1 11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{vdiv|vmul}} 12*9880d681SAndroid Build Coastguard Workerdefine void @t1() nounwind { 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* @iin, align 4 15*9880d681SAndroid Build Coastguard Worker %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0 16*9880d681SAndroid Build Coastguard Worker %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1 17*9880d681SAndroid Build Coastguard Worker %vcvt.i = sitofp <2 x i32> %vecinit2.i to <2 x float> 18*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <2 x float> %vcvt.i, <float 8.000000e+00, float 8.000000e+00> 19*9880d681SAndroid Build Coastguard Worker tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind 20*9880d681SAndroid Build Coastguard Worker ret void 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdeclare void @foo_float32x2_t(<2 x float>) 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; Test unsigned conversion. 26*9880d681SAndroid Build Coastguard Worker; CHECK: t2 27*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{vdiv|vmul}} 28*9880d681SAndroid Build Coastguard Workerdefine void @t2() nounwind { 29*9880d681SAndroid Build Coastguard Workerentry: 30*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* @uin, align 4 31*9880d681SAndroid Build Coastguard Worker %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0 32*9880d681SAndroid Build Coastguard Worker %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1 33*9880d681SAndroid Build Coastguard Worker %vcvt.i = uitofp <2 x i32> %vecinit2.i to <2 x float> 34*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <2 x float> %vcvt.i, <float 8.000000e+00, float 8.000000e+00> 35*9880d681SAndroid Build Coastguard Worker tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind 36*9880d681SAndroid Build Coastguard Worker ret void 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; Test which should not fold due to non-power of 2. 40*9880d681SAndroid Build Coastguard Worker; CHECK: t3 41*9880d681SAndroid Build Coastguard Worker; CHECK: {{vdiv|vmul}} 42*9880d681SAndroid Build Coastguard Workerdefine void @t3() nounwind { 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* @iin, align 4 45*9880d681SAndroid Build Coastguard Worker %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0 46*9880d681SAndroid Build Coastguard Worker %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1 47*9880d681SAndroid Build Coastguard Worker %vcvt.i = sitofp <2 x i32> %vecinit2.i to <2 x float> 48*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <2 x float> %vcvt.i, <float 0x401B333340000000, float 0x401B333340000000> 49*9880d681SAndroid Build Coastguard Worker tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind 50*9880d681SAndroid Build Coastguard Worker ret void 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; Test which should not fold due to power of 2 out of range. 54*9880d681SAndroid Build Coastguard Worker; CHECK: t4 55*9880d681SAndroid Build Coastguard Worker; CHECK: {{vdiv|vmul}} 56*9880d681SAndroid Build Coastguard Workerdefine void @t4() nounwind { 57*9880d681SAndroid Build Coastguard Workerentry: 58*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* @iin, align 4 59*9880d681SAndroid Build Coastguard Worker %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0 60*9880d681SAndroid Build Coastguard Worker %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1 61*9880d681SAndroid Build Coastguard Worker %vcvt.i = sitofp <2 x i32> %vecinit2.i to <2 x float> 62*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <2 x float> %vcvt.i, <float 0x4200000000000000, float 0x4200000000000000> 63*9880d681SAndroid Build Coastguard Worker tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind 64*9880d681SAndroid Build Coastguard Worker ret void 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker; Test case where const is max power of 2 (i.e., 2^32). 68*9880d681SAndroid Build Coastguard Worker; CHECK: t5 69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{vdiv|vmul}} 70*9880d681SAndroid Build Coastguard Workerdefine void @t5() nounwind { 71*9880d681SAndroid Build Coastguard Workerentry: 72*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* @iin, align 4 73*9880d681SAndroid Build Coastguard Worker %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0 74*9880d681SAndroid Build Coastguard Worker %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1 75*9880d681SAndroid Build Coastguard Worker %vcvt.i = sitofp <2 x i32> %vecinit2.i to <2 x float> 76*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <2 x float> %vcvt.i, <float 0x41F0000000000000, float 0x41F0000000000000> 77*9880d681SAndroid Build Coastguard Worker tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind 78*9880d681SAndroid Build Coastguard Worker ret void 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; Test quadword. 82*9880d681SAndroid Build Coastguard Worker; CHECK: t6 83*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{vdiv|vmul}} 84*9880d681SAndroid Build Coastguard Workerdefine void @t6() nounwind { 85*9880d681SAndroid Build Coastguard Workerentry: 86*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* @iin, align 4 87*9880d681SAndroid Build Coastguard Worker %vecinit.i = insertelement <4 x i32> undef, i32 %tmp, i32 0 88*9880d681SAndroid Build Coastguard Worker %vecinit2.i = insertelement <4 x i32> %vecinit.i, i32 %tmp, i32 1 89*9880d681SAndroid Build Coastguard Worker %vecinit4.i = insertelement <4 x i32> %vecinit2.i, i32 %tmp, i32 2 90*9880d681SAndroid Build Coastguard Worker %vecinit6.i = insertelement <4 x i32> %vecinit4.i, i32 %tmp, i32 3 91*9880d681SAndroid Build Coastguard Worker %vcvt.i = sitofp <4 x i32> %vecinit6.i to <4 x float> 92*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <4 x float> %vcvt.i, <float 8.000000e+00, float 8.000000e+00, float 8.000000e+00, float 8.000000e+00> 93*9880d681SAndroid Build Coastguard Worker tail call void @foo_float32x4_t(<4 x float> %div.i) nounwind 94*9880d681SAndroid Build Coastguard Worker ret void 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdeclare void @foo_float32x4_t(<4 x float>) 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @fix_unsigned_i16_to_float(<4 x i16> %in) { 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fix_unsigned_i16_to_float: 101*9880d681SAndroid Build Coastguard Worker; CHECK: vmovl.u16 [[TMP:q[0-9]+]], {{d[0-9]+}} 102*9880d681SAndroid Build Coastguard Worker; CHECK: vcvt.f32.u32 {{q[0-9]+}}, [[TMP]], #1 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker %conv = uitofp <4 x i16> %in to <4 x float> 105*9880d681SAndroid Build Coastguard Worker %shift = fdiv <4 x float> %conv, <float 2.0, float 2.0, float 2.0, float 2.0> 106*9880d681SAndroid Build Coastguard Worker ret <4 x float> %shift 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @fix_signed_i16_to_float(<4 x i16> %in) { 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fix_signed_i16_to_float: 111*9880d681SAndroid Build Coastguard Worker; CHECK: vmovl.s16 [[TMP:q[0-9]+]], {{d[0-9]+}} 112*9880d681SAndroid Build Coastguard Worker; CHECK: vcvt.f32.s32 {{q[0-9]+}}, [[TMP]], #1 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker %conv = sitofp <4 x i16> %in to <4 x float> 115*9880d681SAndroid Build Coastguard Worker %shift = fdiv <4 x float> %conv, <float 2.0, float 2.0, float 2.0, float 2.0> 116*9880d681SAndroid Build Coastguard Worker ret <4 x float> %shift 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @fix_i64_to_float(<2 x i64> %in) { 120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fix_i64_to_float: 121*9880d681SAndroid Build Coastguard Worker; CHECK: bl 122*9880d681SAndroid Build Coastguard Worker; CHECK: bl 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker %conv = uitofp <2 x i64> %in to <2 x float> 125*9880d681SAndroid Build Coastguard Worker %shift = fdiv <2 x float> %conv, <float 2.0, float 2.0> 126*9880d681SAndroid Build Coastguard Worker ret <2 x float> %shift 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @fix_i64_to_double(<2 x i64> %in) { 130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fix_i64_to_double: 131*9880d681SAndroid Build Coastguard Worker; CHECK: bl 132*9880d681SAndroid Build Coastguard Worker; CHECK: bl 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker %conv = uitofp <2 x i64> %in to <2 x double> 135*9880d681SAndroid Build Coastguard Worker %shift = fdiv <2 x double> %conv, <double 2.0, double 2.0> 136*9880d681SAndroid Build Coastguard Worker ret <2 x double> %shift 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker; Don't combine with 8 lanes. Just make sure things don't crash. 140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7 141*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @test7(<8 x i32> %in) nounwind { 142*9880d681SAndroid Build Coastguard Workerentry: 143*9880d681SAndroid Build Coastguard Worker %vcvt.i = sitofp <8 x i32> %in to <8 x float> 144*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <8 x float> %vcvt.i, <float 8.0, float 8.0, float 8.0, float 8.0, float 8.0, float 8.0, float 8.0, float 8.0> 145*9880d681SAndroid Build Coastguard Worker ret <8 x float> %div.i 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; Can combine splat with an undef. 149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8 150*9880d681SAndroid Build Coastguard Worker; CHECK: vcvt.f32.s32 q{{[0-9]+}}, q{{[0-9]+}}, #1 151*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test8(<4 x i32> %in) { 152*9880d681SAndroid Build Coastguard Worker %vcvt.i = sitofp <4 x i32> %in to <4 x float> 153*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <4 x float> %vcvt.i, <float 2.0, float 2.0, float 2.0, float undef> 154*9880d681SAndroid Build Coastguard Worker ret <4 x float> %div.i 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_illegal_int_to_fp: 158*9880d681SAndroid Build Coastguard Worker; CHECK: vcvt.f32.s32 159*9880d681SAndroid Build Coastguard Workerdefine <3 x float> @test_illegal_int_to_fp(<3 x i32> %in) { 160*9880d681SAndroid Build Coastguard Worker %conv = sitofp <3 x i32> %in to <3 x float> 161*9880d681SAndroid Build Coastguard Worker %res = fdiv <3 x float> %conv, <float 4.0, float 4.0, float 4.0> 162*9880d681SAndroid Build Coastguard Worker ret <3 x float> %res 163*9880d681SAndroid Build Coastguard Worker}