1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-neon-syntax=apple -verify-machineinstrs -o - %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Test signed conversion. 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1 5*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.2s v0, v0, #4 6*9880d681SAndroid Build Coastguard Worker; CHECK: ret 7*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test1(<2 x i32> %in) { 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker %vcvt.i = sitofp <2 x i32> %in to <2 x float> 10*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <2 x float> %vcvt.i, <float 16.0, float 16.0> 11*9880d681SAndroid Build Coastguard Worker ret <2 x float> %div.i 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; Test unsigned conversion. 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2 16*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.2s v0, v0, #3 17*9880d681SAndroid Build Coastguard Worker; CHECK: ret 18*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test2(<2 x i32> %in) { 19*9880d681SAndroid Build Coastguard Workerentry: 20*9880d681SAndroid Build Coastguard Worker %vcvt.i = uitofp <2 x i32> %in to <2 x float> 21*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <2 x float> %vcvt.i, <float 8.0, float 8.0> 22*9880d681SAndroid Build Coastguard Worker ret <2 x float> %div.i 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; Test which should not fold due to non-power of 2. 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3 27*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.2s v0, v0 28*9880d681SAndroid Build Coastguard Worker; CHECK: fmov.2s v1, #9.00000000 29*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv.2s v0, v0, v1 30*9880d681SAndroid Build Coastguard Worker; CHECK: ret 31*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test3(<2 x i32> %in) { 32*9880d681SAndroid Build Coastguard Workerentry: 33*9880d681SAndroid Build Coastguard Worker %vcvt.i = sitofp <2 x i32> %in to <2 x float> 34*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <2 x float> %vcvt.i, <float 9.0, float 9.0> 35*9880d681SAndroid Build Coastguard Worker ret <2 x float> %div.i 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; Test which should not fold due to power of 2 out of range. 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4 40*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.2s v0, v0 41*9880d681SAndroid Build Coastguard Worker; CHECK: movi.2s v1, #80, lsl #24 42*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv.2s v0, v0, v1 43*9880d681SAndroid Build Coastguard Worker; CHECK: ret 44*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test4(<2 x i32> %in) { 45*9880d681SAndroid Build Coastguard Workerentry: 46*9880d681SAndroid Build Coastguard Worker %vcvt.i = sitofp <2 x i32> %in to <2 x float> 47*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <2 x float> %vcvt.i, <float 0x4200000000000000, float 0x4200000000000000> 48*9880d681SAndroid Build Coastguard Worker ret <2 x float> %div.i 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; Test case where const is max power of 2 (i.e., 2^32). 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5 53*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.2s v0, v0, #32 54*9880d681SAndroid Build Coastguard Worker; CHECK: ret 55*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test5(<2 x i32> %in) { 56*9880d681SAndroid Build Coastguard Workerentry: 57*9880d681SAndroid Build Coastguard Worker %vcvt.i = sitofp <2 x i32> %in to <2 x float> 58*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <2 x float> %vcvt.i, <float 0x41F0000000000000, float 0x41F0000000000000> 59*9880d681SAndroid Build Coastguard Worker ret <2 x float> %div.i 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; Test quadword. 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6 64*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.4s v0, v0, #2 65*9880d681SAndroid Build Coastguard Worker; CHECK: ret 66*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test6(<4 x i32> %in) { 67*9880d681SAndroid Build Coastguard Workerentry: 68*9880d681SAndroid Build Coastguard Worker %vcvt.i = sitofp <4 x i32> %in to <4 x float> 69*9880d681SAndroid Build Coastguard Worker %div.i = fdiv <4 x float> %vcvt.i, <float 4.0, float 4.0, float 4.0, float 4.0> 70*9880d681SAndroid Build Coastguard Worker ret <4 x float> %div.i 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; Test unsigned i16 to float 74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7 75*9880d681SAndroid Build Coastguard Worker; CHECK: ushll.4s v0, v0, #0 76*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.4s v0, v0, #1 77*9880d681SAndroid Build Coastguard Worker; CHECK: ret 78*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test7(<4 x i16> %in) { 79*9880d681SAndroid Build Coastguard Worker %conv = uitofp <4 x i16> %in to <4 x float> 80*9880d681SAndroid Build Coastguard Worker %shift = fdiv <4 x float> %conv, <float 2.0, float 2.0, float 2.0, float 2.0> 81*9880d681SAndroid Build Coastguard Worker ret <4 x float> %shift 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; Test signed i16 to float 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8 86*9880d681SAndroid Build Coastguard Worker; CHECK: sshll.4s v0, v0, #0 87*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.4s v0, v0, #2 88*9880d681SAndroid Build Coastguard Worker; CHECK: ret 89*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test8(<4 x i16> %in) { 90*9880d681SAndroid Build Coastguard Worker %conv = sitofp <4 x i16> %in to <4 x float> 91*9880d681SAndroid Build Coastguard Worker %shift = fdiv <4 x float> %conv, <float 4.0, float 4.0, float 4.0, float 4.0> 92*9880d681SAndroid Build Coastguard Worker ret <4 x float> %shift 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; Can't convert i64 to float. 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9 97*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.2d v0, v0 98*9880d681SAndroid Build Coastguard Worker; CHECK: fcvtn v0.2s, v0.2d 99*9880d681SAndroid Build Coastguard Worker; CHECK: movi.2s v1, #64, lsl #24 100*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv.2s v0, v0, v1 101*9880d681SAndroid Build Coastguard Worker; CHECK: ret 102*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test9(<2 x i64> %in) { 103*9880d681SAndroid Build Coastguard Worker %conv = uitofp <2 x i64> %in to <2 x float> 104*9880d681SAndroid Build Coastguard Worker %shift = fdiv <2 x float> %conv, <float 2.0, float 2.0> 105*9880d681SAndroid Build Coastguard Worker ret <2 x float> %shift 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10 109*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.2d v0, v0, #1 110*9880d681SAndroid Build Coastguard Worker; CHECK: ret 111*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test10(<2 x i64> %in) { 112*9880d681SAndroid Build Coastguard Worker %conv = uitofp <2 x i64> %in to <2 x double> 113*9880d681SAndroid Build Coastguard Worker %shift = fdiv <2 x double> %conv, <double 2.0, double 2.0> 114*9880d681SAndroid Build Coastguard Worker ret <2 x double> %shift 115*9880d681SAndroid Build Coastguard Worker} 116