1*9880d681SAndroid Build Coastguard Worker; Test that vectors are scalarized/lowered correctly. 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=ppc32 -mcpu=g3 | \ 3*9880d681SAndroid Build Coastguard Worker; RUN: grep stfs | count 4 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=ppc32 -mcpu=g5 -o %t 5*9880d681SAndroid Build Coastguard Worker; RUN: grep vspltw %t | count 2 6*9880d681SAndroid Build Coastguard Worker; RUN: grep vsplti %t | count 3 7*9880d681SAndroid Build Coastguard Worker; RUN: grep vsplth %t | count 1 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker %f4 = type <4 x float> 10*9880d681SAndroid Build Coastguard Worker %i4 = type <4 x i32> 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine void @splat(%f4* %P, %f4* %Q, float %X) nounwind { 13*9880d681SAndroid Build Coastguard Worker %tmp = insertelement %f4 undef, float %X, i32 0 ; <%f4> [#uses=1] 14*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement %f4 %tmp, float %X, i32 1 ; <%f4> [#uses=1] 15*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement %f4 %tmp2, float %X, i32 2 ; <%f4> [#uses=1] 16*9880d681SAndroid Build Coastguard Worker %tmp6 = insertelement %f4 %tmp4, float %X, i32 3 ; <%f4> [#uses=1] 17*9880d681SAndroid Build Coastguard Worker %q = load %f4, %f4* %Q ; <%f4> [#uses=1] 18*9880d681SAndroid Build Coastguard Worker %R = fadd %f4 %q, %tmp6 ; <%f4> [#uses=1] 19*9880d681SAndroid Build Coastguard Worker store %f4 %R, %f4* %P 20*9880d681SAndroid Build Coastguard Worker ret void 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine void @splat_i4(%i4* %P, %i4* %Q, i32 %X) nounwind { 24*9880d681SAndroid Build Coastguard Worker %tmp = insertelement %i4 undef, i32 %X, i32 0 ; <%i4> [#uses=1] 25*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement %i4 %tmp, i32 %X, i32 1 ; <%i4> [#uses=1] 26*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement %i4 %tmp2, i32 %X, i32 2 ; <%i4> [#uses=1] 27*9880d681SAndroid Build Coastguard Worker %tmp6 = insertelement %i4 %tmp4, i32 %X, i32 3 ; <%i4> [#uses=1] 28*9880d681SAndroid Build Coastguard Worker %q = load %i4, %i4* %Q ; <%i4> [#uses=1] 29*9880d681SAndroid Build Coastguard Worker %R = add %i4 %q, %tmp6 ; <%i4> [#uses=1] 30*9880d681SAndroid Build Coastguard Worker store %i4 %R, %i4* %P 31*9880d681SAndroid Build Coastguard Worker ret void 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdefine void @splat_imm_i32(%i4* %P, %i4* %Q, i32 %X) nounwind { 35*9880d681SAndroid Build Coastguard Worker %q = load %i4, %i4* %Q ; <%i4> [#uses=1] 36*9880d681SAndroid Build Coastguard Worker %R = add %i4 %q, < i32 -1, i32 -1, i32 -1, i32 -1 > ; <%i4> [#uses=1] 37*9880d681SAndroid Build Coastguard Worker store %i4 %R, %i4* %P 38*9880d681SAndroid Build Coastguard Worker ret void 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine void @splat_imm_i16(%i4* %P, %i4* %Q, i32 %X) nounwind { 42*9880d681SAndroid Build Coastguard Worker %q = load %i4, %i4* %Q ; <%i4> [#uses=1] 43*9880d681SAndroid Build Coastguard Worker %R = add %i4 %q, < i32 65537, i32 65537, i32 65537, i32 65537 > ; <%i4> [#uses=1] 44*9880d681SAndroid Build Coastguard Worker store %i4 %R, %i4* %P 45*9880d681SAndroid Build Coastguard Worker ret void 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine void @splat_h(i16 %tmp, <16 x i8>* %dst) nounwind { 49*9880d681SAndroid Build Coastguard Worker %tmp.upgrd.1 = insertelement <8 x i16> undef, i16 %tmp, i32 0 50*9880d681SAndroid Build Coastguard Worker %tmp72 = insertelement <8 x i16> %tmp.upgrd.1, i16 %tmp, i32 1 51*9880d681SAndroid Build Coastguard Worker %tmp73 = insertelement <8 x i16> %tmp72, i16 %tmp, i32 2 52*9880d681SAndroid Build Coastguard Worker %tmp74 = insertelement <8 x i16> %tmp73, i16 %tmp, i32 3 53*9880d681SAndroid Build Coastguard Worker %tmp75 = insertelement <8 x i16> %tmp74, i16 %tmp, i32 4 54*9880d681SAndroid Build Coastguard Worker %tmp76 = insertelement <8 x i16> %tmp75, i16 %tmp, i32 5 55*9880d681SAndroid Build Coastguard Worker %tmp77 = insertelement <8 x i16> %tmp76, i16 %tmp, i32 6 56*9880d681SAndroid Build Coastguard Worker %tmp78 = insertelement <8 x i16> %tmp77, i16 %tmp, i32 7 57*9880d681SAndroid Build Coastguard Worker %tmp78.upgrd.2 = bitcast <8 x i16> %tmp78 to <16 x i8> 58*9880d681SAndroid Build Coastguard Worker store <16 x i8> %tmp78.upgrd.2, <16 x i8>* %dst 59*9880d681SAndroid Build Coastguard Worker ret void 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine void @spltish(<16 x i8>* %A, <16 x i8>* %B) nounwind { 63*9880d681SAndroid Build Coastguard Worker %tmp = load <16 x i8>, <16 x i8>* %B ; <<16 x i8>> [#uses=1] 64*9880d681SAndroid Build Coastguard Worker %tmp.s = bitcast <16 x i8> %tmp to <16 x i8> ; <<16 x i8>> [#uses=1] 65*9880d681SAndroid Build Coastguard Worker %tmp4 = sub <16 x i8> %tmp.s, bitcast (<8 x i16> < i16 15, i16 15, i16 15, i16 15, i16 15, i16 66*9880d681SAndroid Build Coastguard Worker 15, i16 15, i16 15 > to <16 x i8>) ; <<16 x i8>> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker %tmp4.u = bitcast <16 x i8> %tmp4 to <16 x i8> ; <<16 x i8>> [#uses=1] 68*9880d681SAndroid Build Coastguard Worker store <16 x i8> %tmp4.u, <16 x i8>* %A 69*9880d681SAndroid Build Coastguard Worker ret void 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72