1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; CHECK: autogen_SD19655 4*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf 5*9880d681SAndroid Build Coastguard Worker; CHECK: ret 6*9880d681SAndroid Build Coastguard Workerdefine void @autogen_SD19655(<2 x i64>* %addr, <2 x float>* %addrfloat) { 7*9880d681SAndroid Build Coastguard Worker %T = load <2 x i64>, <2 x i64>* %addr 8*9880d681SAndroid Build Coastguard Worker %F = sitofp <2 x i64> %T to <2 x float> 9*9880d681SAndroid Build Coastguard Worker store <2 x float> %F, <2 x float>* %addrfloat 10*9880d681SAndroid Build Coastguard Worker ret void 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_signed_v2i32_to_v2f64(<2 x i32> %v) nounwind readnone { 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_signed_v2i32_to_v2f64: 15*9880d681SAndroid Build Coastguard Worker; CHECK: sshll.2d [[VAL64:v[0-9]+]], v0, #0 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf.2d v0, [[VAL64]] 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 18*9880d681SAndroid Build Coastguard Worker %conv = sitofp <2 x i32> %v to <2 x double> 19*9880d681SAndroid Build Coastguard Worker ret <2 x double> %conv 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_unsigned_v2i32_to_v2f64(<2 x i32> %v) nounwind readnone { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_unsigned_v2i32_to_v2f64 24*9880d681SAndroid Build Coastguard Worker; CHECK: ushll.2d [[VAL64:v[0-9]+]], v0, #0 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf.2d v0, [[VAL64]] 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 27*9880d681SAndroid Build Coastguard Worker %conv = uitofp <2 x i32> %v to <2 x double> 28*9880d681SAndroid Build Coastguard Worker ret <2 x double> %conv 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_signed_v2i16_to_v2f64(<2 x i16> %v) nounwind readnone { 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_signed_v2i16_to_v2f64: 33*9880d681SAndroid Build Coastguard Worker; CHECK: shl.2s [[TMP:v[0-9]+]], v0, #16 34*9880d681SAndroid Build Coastguard Worker; CHECK: sshr.2s [[VAL32:v[0-9]+]], [[TMP]], #16 35*9880d681SAndroid Build Coastguard Worker; CHECK: sshll.2d [[VAL64:v[0-9]+]], [[VAL32]], #0 36*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.2d v0, [[VAL64]] 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker %conv = sitofp <2 x i16> %v to <2 x double> 39*9880d681SAndroid Build Coastguard Worker ret <2 x double> %conv 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_unsigned_v2i16_to_v2f64(<2 x i16> %v) nounwind readnone { 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_unsigned_v2i16_to_v2f64 43*9880d681SAndroid Build Coastguard Worker; CHECK: movi d[[MASK:[0-9]+]], #0x00ffff0000ffff 44*9880d681SAndroid Build Coastguard Worker; CHECK: and.8b [[VAL32:v[0-9]+]], v0, v[[MASK]] 45*9880d681SAndroid Build Coastguard Worker; CHECK: ushll.2d [[VAL64:v[0-9]+]], [[VAL32]], #0 46*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.2d v0, [[VAL64]] 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker %conv = uitofp <2 x i16> %v to <2 x double> 49*9880d681SAndroid Build Coastguard Worker ret <2 x double> %conv 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_signed_v2i8_to_v2f64(<2 x i8> %v) nounwind readnone { 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_signed_v2i8_to_v2f64: 54*9880d681SAndroid Build Coastguard Worker; CHECK: shl.2s [[TMP:v[0-9]+]], v0, #24 55*9880d681SAndroid Build Coastguard Worker; CHECK: sshr.2s [[VAL32:v[0-9]+]], [[TMP]], #24 56*9880d681SAndroid Build Coastguard Worker; CHECK: sshll.2d [[VAL64:v[0-9]+]], [[VAL32]], #0 57*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.2d v0, [[VAL64]] 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker %conv = sitofp <2 x i8> %v to <2 x double> 60*9880d681SAndroid Build Coastguard Worker ret <2 x double> %conv 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_unsigned_v2i8_to_v2f64(<2 x i8> %v) nounwind readnone { 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_unsigned_v2i8_to_v2f64 64*9880d681SAndroid Build Coastguard Worker; CHECK: movi d[[MASK:[0-9]+]], #0x0000ff000000ff 65*9880d681SAndroid Build Coastguard Worker; CHECK: and.8b [[VAL32:v[0-9]+]], v0, v[[MASK]] 66*9880d681SAndroid Build Coastguard Worker; CHECK: ushll.2d [[VAL64:v[0-9]+]], [[VAL32]], #0 67*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.2d v0, [[VAL64]] 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker %conv = uitofp <2 x i8> %v to <2 x double> 70*9880d681SAndroid Build Coastguard Worker ret <2 x double> %conv 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_signed_v2i64_to_v2f32(<2 x i64> %v) nounwind readnone { 74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_signed_v2i64_to_v2f32: 75*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.2d [[VAL64:v[0-9]+]], v0 76*9880d681SAndroid Build Coastguard Worker; CHECK: fcvtn v0.2s, [[VAL64]].2d 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker %conv = sitofp <2 x i64> %v to <2 x float> 79*9880d681SAndroid Build Coastguard Worker ret <2 x float> %conv 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_unsigned_v2i64_to_v2f32(<2 x i64> %v) nounwind readnone { 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_unsigned_v2i64_to_v2f32 83*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.2d [[VAL64:v[0-9]+]], v0 84*9880d681SAndroid Build Coastguard Worker; CHECK: fcvtn v0.2s, [[VAL64]].2d 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker %conv = uitofp <2 x i64> %v to <2 x float> 87*9880d681SAndroid Build Coastguard Worker ret <2 x float> %conv 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_signed_v2i16_to_v2f32(<2 x i16> %v) nounwind readnone { 91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_signed_v2i16_to_v2f32: 92*9880d681SAndroid Build Coastguard Worker; CHECK: shl.2s [[TMP:v[0-9]+]], v0, #16 93*9880d681SAndroid Build Coastguard Worker; CHECK: sshr.2s [[VAL32:v[0-9]+]], [[TMP]], #16 94*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.2s v0, [[VAL32]] 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker %conv = sitofp <2 x i16> %v to <2 x float> 97*9880d681SAndroid Build Coastguard Worker ret <2 x float> %conv 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_unsigned_v2i16_to_v2f32(<2 x i16> %v) nounwind readnone { 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_unsigned_v2i16_to_v2f32 101*9880d681SAndroid Build Coastguard Worker; CHECK: movi d[[MASK:[0-9]+]], #0x00ffff0000ffff 102*9880d681SAndroid Build Coastguard Worker; CHECK: and.8b [[VAL32:v[0-9]+]], v0, v[[MASK]] 103*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.2s v0, [[VAL32]] 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker %conv = uitofp <2 x i16> %v to <2 x float> 106*9880d681SAndroid Build Coastguard Worker ret <2 x float> %conv 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_signed_v2i8_to_v2f32(<2 x i8> %v) nounwind readnone { 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_signed_v2i8_to_v2f32: 111*9880d681SAndroid Build Coastguard Worker; CHECK: shl.2s [[TMP:v[0-9]+]], v0, #24 112*9880d681SAndroid Build Coastguard Worker; CHECK: sshr.2s [[VAL32:v[0-9]+]], [[TMP]], #24 113*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.2s v0, [[VAL32]] 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker %conv = sitofp <2 x i8> %v to <2 x float> 116*9880d681SAndroid Build Coastguard Worker ret <2 x float> %conv 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_unsigned_v2i8_to_v2f32(<2 x i8> %v) nounwind readnone { 119*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_unsigned_v2i8_to_v2f32 120*9880d681SAndroid Build Coastguard Worker; CHECK: movi d[[MASK:[0-9]+]], #0x0000ff000000ff 121*9880d681SAndroid Build Coastguard Worker; CHECK: and.8b [[VAL32:v[0-9]+]], v0, v[[MASK]] 122*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.2s v0, [[VAL32]] 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker %conv = uitofp <2 x i8> %v to <2 x float> 125*9880d681SAndroid Build Coastguard Worker ret <2 x float> %conv 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_signed_v4i16_to_v4f32(<4 x i16> %v) nounwind readnone { 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_signed_v4i16_to_v4f32: 130*9880d681SAndroid Build Coastguard Worker; CHECK: sshll.4s [[VAL32:v[0-9]+]], v0, #0 131*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.4s v0, [[VAL32]] 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker %conv = sitofp <4 x i16> %v to <4 x float> 134*9880d681SAndroid Build Coastguard Worker ret <4 x float> %conv 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_unsigned_v4i16_to_v4f32(<4 x i16> %v) nounwind readnone { 138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_unsigned_v4i16_to_v4f32 139*9880d681SAndroid Build Coastguard Worker; CHECK: ushll.4s [[VAL32:v[0-9]+]], v0, #0 140*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.4s v0, [[VAL32]] 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker %conv = uitofp <4 x i16> %v to <4 x float> 143*9880d681SAndroid Build Coastguard Worker ret <4 x float> %conv 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_signed_v4i8_to_v4f32(<4 x i8> %v) nounwind readnone { 147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_signed_v4i8_to_v4f32: 148*9880d681SAndroid Build Coastguard Worker; CHECK: shl.4h [[TMP:v[0-9]+]], v0, #8 149*9880d681SAndroid Build Coastguard Worker; CHECK: sshr.4h [[VAL16:v[0-9]+]], [[TMP]], #8 150*9880d681SAndroid Build Coastguard Worker; CHECK: sshll.4s [[VAL32:v[0-9]+]], [[VAL16]], #0 151*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.4s v0, [[VAL32]] 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker %conv = sitofp <4 x i8> %v to <4 x float> 154*9880d681SAndroid Build Coastguard Worker ret <4 x float> %conv 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_unsigned_v4i8_to_v4f32(<4 x i8> %v) nounwind readnone { 157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_unsigned_v4i8_to_v4f32 158*9880d681SAndroid Build Coastguard Worker; CHECK: bic.4h v0, #255, lsl #8 159*9880d681SAndroid Build Coastguard Worker; CHECK: ushll.4s [[VAL32:v[0-9]+]], v0, #0 160*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.4s v0, [[VAL32]] 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker %conv = uitofp <4 x i8> %v to <4 x float> 163*9880d681SAndroid Build Coastguard Worker ret <4 x float> %conv 164*9880d681SAndroid Build Coastguard Worker} 165