Index: llvm/lib/Target/ARM/ARMInstrMVE.td =================================================================== --- llvm/lib/Target/ARM/ARMInstrMVE.td +++ llvm/lib/Target/ARM/ARMInstrMVE.td @@ -3192,19 +3192,18 @@ defm MVE_VRSHL_by_vec : mve_shift_by_vec_multi<"vrshl", 0b0, 0b1>; let Predicates = [HasMVEInt] in { - def : Pat<(v4i32 (ARMvshlu (v4i32 MQPR:$Qm), (v4i32 MQPR:$Qn))), - (v4i32 (MVE_VSHL_by_vecu32 (v4i32 MQPR:$Qm), (v4i32 MQPR:$Qn)))>; - def : Pat<(v8i16 (ARMvshlu (v8i16 MQPR:$Qm), (v8i16 MQPR:$Qn))), - (v8i16 (MVE_VSHL_by_vecu16 (v8i16 MQPR:$Qm), (v8i16 MQPR:$Qn)))>; - def : Pat<(v16i8 (ARMvshlu (v16i8 MQPR:$Qm), (v16i8 MQPR:$Qn))), - (v16i8 (MVE_VSHL_by_vecu8 (v16i8 MQPR:$Qm), (v16i8 MQPR:$Qn)))>; - - def : Pat<(v4i32 (ARMvshls (v4i32 MQPR:$Qm), (v4i32 MQPR:$Qn))), - (v4i32 (MVE_VSHL_by_vecs32 (v4i32 MQPR:$Qm), (v4i32 MQPR:$Qn)))>; - def : Pat<(v8i16 (ARMvshls (v8i16 MQPR:$Qm), (v8i16 MQPR:$Qn))), - (v8i16 (MVE_VSHL_by_vecs16 (v8i16 MQPR:$Qm), (v8i16 MQPR:$Qn)))>; - def : Pat<(v16i8 (ARMvshls (v16i8 MQPR:$Qm), (v16i8 MQPR:$Qn))), - (v16i8 (MVE_VSHL_by_vecs8 (v16i8 MQPR:$Qm), (v16i8 MQPR:$Qn)))>; + defm : MVE_TwoOpPattern; + defm : MVE_TwoOpPattern; + defm : MVE_TwoOpPattern; + defm : MVE_TwoOpPattern; + defm : MVE_TwoOpPattern; + defm : MVE_TwoOpPattern; } class MVE_shift_with_imm @shl_v4i32(<4 x i32> %z, <4 x i32> %x, <4 x i32> %y) { ; CHECK-LABEL: shl_v4i32: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u32 q1, q1, q2 -; CHECK-NEXT: vcmp.i32 eq, q0, zr -; CHECK-NEXT: vpsel q0, q1, q0 +; CHECK-NEXT: vpt.i32 eq, q0, zr +; CHECK-NEXT: vshlt.u32 q0, q1, q2 ; CHECK-NEXT: bx lr entry: %c = icmp eq <4 x i32> %z, zeroinitializer @@ -252,9 +251,8 @@ define arm_aapcs_vfpcc <8 x i16> @shl_v8i16(<8 x i16> %z, <8 x i16> %x, <8 x i16> %y) { ; CHECK-LABEL: shl_v8i16: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u16 q1, q1, q2 -; CHECK-NEXT: vcmp.i16 eq, q0, zr -; CHECK-NEXT: vpsel q0, q1, q0 +; CHECK-NEXT: vpt.i16 eq, q0, zr +; CHECK-NEXT: vshlt.u16 q0, q1, q2 ; CHECK-NEXT: bx lr entry: %c = icmp eq <8 x i16> %z, zeroinitializer @@ -266,9 +264,8 @@ define arm_aapcs_vfpcc <16 x i8> @shl_v16i8(<16 x i8> %z, <16 x i8> %x, <16 x i8> %y) { ; CHECK-LABEL: shl_v16i8: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u8 q1, q1, q2 -; CHECK-NEXT: vcmp.i8 eq, q0, zr -; CHECK-NEXT: vpsel q0, q1, q0 +; CHECK-NEXT: vpt.i8 eq, q0, zr +; CHECK-NEXT: vshlt.u8 q0, q1, q2 ; CHECK-NEXT: bx lr entry: %c = icmp eq <16 x i8> %z, zeroinitializer @@ -281,9 +278,8 @@ ; CHECK-LABEL: ashr_v4i32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s32 q2, q2 -; CHECK-NEXT: vcmp.i32 eq, q0, zr -; CHECK-NEXT: vshl.s32 q1, q1, q2 -; CHECK-NEXT: vpsel q0, q1, q0 +; CHECK-NEXT: vpt.i32 eq, q0, zr +; CHECK-NEXT: vshlt.s32 q0, q1, q2 ; CHECK-NEXT: bx lr entry: %c = icmp eq <4 x i32> %z, zeroinitializer @@ -296,9 +292,8 @@ ; CHECK-LABEL: ashr_v8i16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s16 q2, q2 -; CHECK-NEXT: vcmp.i16 eq, q0, zr -; CHECK-NEXT: vshl.s16 q1, q1, q2 -; CHECK-NEXT: vpsel q0, q1, q0 +; CHECK-NEXT: vpt.i16 eq, q0, zr +; CHECK-NEXT: vshlt.s16 q0, q1, q2 ; CHECK-NEXT: bx lr entry: %c = icmp eq <8 x i16> %z, zeroinitializer @@ -311,9 +306,8 @@ ; CHECK-LABEL: ashr_v16i8: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s8 q2, q2 -; CHECK-NEXT: vcmp.i8 eq, q0, zr -; CHECK-NEXT: vshl.s8 q1, q1, q2 -; CHECK-NEXT: vpsel q0, q1, q0 +; CHECK-NEXT: vpt.i8 eq, q0, zr +; CHECK-NEXT: vshlt.s8 q0, q1, q2 ; CHECK-NEXT: bx lr entry: %c = icmp eq <16 x i8> %z, zeroinitializer @@ -326,9 +320,8 @@ ; CHECK-LABEL: lshr_v4i32: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s32 q2, q2 -; CHECK-NEXT: vcmp.i32 eq, q0, zr -; CHECK-NEXT: vshl.u32 q1, q1, q2 -; CHECK-NEXT: vpsel q0, q1, q0 +; CHECK-NEXT: vpt.i32 eq, q0, zr +; CHECK-NEXT: vshlt.u32 q0, q1, q2 ; CHECK-NEXT: bx lr entry: %c = icmp eq <4 x i32> %z, zeroinitializer @@ -341,9 +334,8 @@ ; CHECK-LABEL: lshr_v8i16: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s16 q2, q2 -; CHECK-NEXT: vcmp.i16 eq, q0, zr -; CHECK-NEXT: vshl.u16 q1, q1, q2 -; CHECK-NEXT: vpsel q0, q1, q0 +; CHECK-NEXT: vpt.i16 eq, q0, zr +; CHECK-NEXT: vshlt.u16 q0, q1, q2 ; CHECK-NEXT: bx lr entry: %c = icmp eq <8 x i16> %z, zeroinitializer @@ -356,9 +348,8 @@ ; CHECK-LABEL: lshr_v16i8: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s8 q2, q2 -; CHECK-NEXT: vcmp.i8 eq, q0, zr -; CHECK-NEXT: vshl.u8 q1, q1, q2 -; CHECK-NEXT: vpsel q0, q1, q0 +; CHECK-NEXT: vpt.i8 eq, q0, zr +; CHECK-NEXT: vshlt.u8 q0, q1, q2 ; CHECK-NEXT: bx lr entry: %c = icmp eq <16 x i8> %z, zeroinitializer Index: llvm/test/CodeGen/Thumb2/mve-pred-selectop2.ll =================================================================== --- llvm/test/CodeGen/Thumb2/mve-pred-selectop2.ll +++ llvm/test/CodeGen/Thumb2/mve-pred-selectop2.ll @@ -256,10 +256,9 @@ define arm_aapcs_vfpcc <4 x i32> @shl_v4i32_x(<4 x i32> %x, <4 x i32> %y, i32 %n) { ; CHECK-LABEL: shl_v4i32_x: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u32 q1, q0, q1 ; CHECK-NEXT: vctp.32 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.u32 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <4 x i1> @llvm.arm.mve.vctp32(i32 %n) @@ -271,10 +270,9 @@ define arm_aapcs_vfpcc <8 x i16> @shl_v8i16_x(<8 x i16> %x, <8 x i16> %y, i32 %n) { ; CHECK-LABEL: shl_v8i16_x: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u16 q1, q0, q1 ; CHECK-NEXT: vctp.16 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.u16 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <8 x i1> @llvm.arm.mve.vctp16(i32 %n) @@ -286,10 +284,9 @@ define arm_aapcs_vfpcc <16 x i8> @shl_v16i8_x(<16 x i8> %x, <16 x i8> %y, i32 %n) { ; CHECK-LABEL: shl_v16i8_x: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u8 q1, q0, q1 ; CHECK-NEXT: vctp.8 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.u8 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <16 x i1> @llvm.arm.mve.vctp8(i32 %n) @@ -303,9 +300,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s32 q1, q1 ; CHECK-NEXT: vctp.32 r0 -; CHECK-NEXT: vshl.s32 q1, q0, q1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.s32 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <4 x i1> @llvm.arm.mve.vctp32(i32 %n) @@ -319,9 +315,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s16 q1, q1 ; CHECK-NEXT: vctp.16 r0 -; CHECK-NEXT: vshl.s16 q1, q0, q1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.s16 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <8 x i1> @llvm.arm.mve.vctp16(i32 %n) @@ -335,9 +330,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s8 q1, q1 ; CHECK-NEXT: vctp.8 r0 -; CHECK-NEXT: vshl.s8 q1, q0, q1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.s8 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <16 x i1> @llvm.arm.mve.vctp8(i32 %n) @@ -351,9 +345,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s32 q1, q1 ; CHECK-NEXT: vctp.32 r0 -; CHECK-NEXT: vshl.u32 q1, q0, q1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.u32 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <4 x i1> @llvm.arm.mve.vctp32(i32 %n) @@ -367,9 +360,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s16 q1, q1 ; CHECK-NEXT: vctp.16 r0 -; CHECK-NEXT: vshl.u16 q1, q0, q1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.u16 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <8 x i1> @llvm.arm.mve.vctp16(i32 %n) @@ -383,9 +375,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s8 q1, q1 ; CHECK-NEXT: vctp.8 r0 -; CHECK-NEXT: vshl.u8 q1, q0, q1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.u8 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <16 x i1> @llvm.arm.mve.vctp8(i32 %n) @@ -1797,10 +1788,9 @@ define arm_aapcs_vfpcc <4 x i32> @shl_v4i32_y(<4 x i32> %x, <4 x i32> %y, i32 %n) { ; CHECK-LABEL: shl_v4i32_y: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u32 q0, q0, q1 ; CHECK-NEXT: vctp.32 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.u32 q1, q0, q1 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1813,10 +1803,9 @@ define arm_aapcs_vfpcc <8 x i16> @shl_v8i16_y(<8 x i16> %x, <8 x i16> %y, i32 %n) { ; CHECK-LABEL: shl_v8i16_y: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u16 q0, q0, q1 ; CHECK-NEXT: vctp.16 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.u16 q1, q0, q1 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1829,10 +1818,9 @@ define arm_aapcs_vfpcc <16 x i8> @shl_v16i8_y(<16 x i8> %x, <16 x i8> %y, i32 %n) { ; CHECK-LABEL: shl_v16i8_y: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u8 q0, q0, q1 ; CHECK-NEXT: vctp.8 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.u8 q1, q0, q1 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1847,9 +1835,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s32 q2, q1 ; CHECK-NEXT: vctp.32 r0 -; CHECK-NEXT: vshl.s32 q0, q0, q2 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.s32 q1, q0, q2 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1864,9 +1851,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s16 q2, q1 ; CHECK-NEXT: vctp.16 r0 -; CHECK-NEXT: vshl.s16 q0, q0, q2 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.s16 q1, q0, q2 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1881,9 +1867,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s8 q2, q1 ; CHECK-NEXT: vctp.8 r0 -; CHECK-NEXT: vshl.s8 q0, q0, q2 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.s8 q1, q0, q2 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1898,9 +1883,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s32 q2, q1 ; CHECK-NEXT: vctp.32 r0 -; CHECK-NEXT: vshl.u32 q0, q0, q2 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.u32 q1, q0, q2 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1915,9 +1899,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s16 q2, q1 ; CHECK-NEXT: vctp.16 r0 -; CHECK-NEXT: vshl.u16 q0, q0, q2 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.u16 q1, q0, q2 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1932,9 +1915,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s8 q2, q1 ; CHECK-NEXT: vctp.8 r0 -; CHECK-NEXT: vshl.u8 q0, q0, q2 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.u8 q1, q0, q2 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: Index: llvm/test/CodeGen/Thumb2/mve-pred-selectop3.ll =================================================================== --- llvm/test/CodeGen/Thumb2/mve-pred-selectop3.ll +++ llvm/test/CodeGen/Thumb2/mve-pred-selectop3.ll @@ -256,10 +256,9 @@ define arm_aapcs_vfpcc <4 x i32> @shl_v4i32_x(<4 x i32> %x, <4 x i32> %y, i32 %n) { ; CHECK-LABEL: shl_v4i32_x: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u32 q1, q0, q1 ; CHECK-NEXT: vctp.32 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.u32 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <4 x i1> @llvm.arm.mve.vctp32(i32 %n) @@ -271,10 +270,9 @@ define arm_aapcs_vfpcc <8 x i16> @shl_v8i16_x(<8 x i16> %x, <8 x i16> %y, i32 %n) { ; CHECK-LABEL: shl_v8i16_x: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u16 q1, q0, q1 ; CHECK-NEXT: vctp.16 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.u16 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <8 x i1> @llvm.arm.mve.vctp16(i32 %n) @@ -286,10 +284,9 @@ define arm_aapcs_vfpcc <16 x i8> @shl_v16i8_x(<16 x i8> %x, <16 x i8> %y, i32 %n) { ; CHECK-LABEL: shl_v16i8_x: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u8 q1, q0, q1 ; CHECK-NEXT: vctp.8 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.u8 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <16 x i1> @llvm.arm.mve.vctp8(i32 %n) @@ -303,9 +300,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s32 q1, q1 ; CHECK-NEXT: vctp.32 r0 -; CHECK-NEXT: vshl.s32 q1, q0, q1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.s32 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <4 x i1> @llvm.arm.mve.vctp32(i32 %n) @@ -319,9 +315,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s16 q1, q1 ; CHECK-NEXT: vctp.16 r0 -; CHECK-NEXT: vshl.s16 q1, q0, q1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.s16 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <8 x i1> @llvm.arm.mve.vctp16(i32 %n) @@ -335,9 +330,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s8 q1, q1 ; CHECK-NEXT: vctp.8 r0 -; CHECK-NEXT: vshl.s8 q1, q0, q1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.s8 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <16 x i1> @llvm.arm.mve.vctp8(i32 %n) @@ -351,9 +345,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s32 q1, q1 ; CHECK-NEXT: vctp.32 r0 -; CHECK-NEXT: vshl.u32 q1, q0, q1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.u32 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <4 x i1> @llvm.arm.mve.vctp32(i32 %n) @@ -367,9 +360,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s16 q1, q1 ; CHECK-NEXT: vctp.16 r0 -; CHECK-NEXT: vshl.u16 q1, q0, q1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.u16 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <8 x i1> @llvm.arm.mve.vctp16(i32 %n) @@ -383,9 +375,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s8 q1, q1 ; CHECK-NEXT: vctp.8 r0 -; CHECK-NEXT: vshl.u8 q1, q0, q1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q0, q1 +; CHECK-NEXT: vshlt.u8 q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <16 x i1> @llvm.arm.mve.vctp8(i32 %n) @@ -1851,10 +1842,9 @@ define arm_aapcs_vfpcc <4 x i32> @shl_v4i32_y(<4 x i32> %x, <4 x i32> %y, i32 %n) { ; CHECK-LABEL: shl_v4i32_y: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u32 q0, q0, q1 ; CHECK-NEXT: vctp.32 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.u32 q1, q0, q1 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1867,10 +1857,9 @@ define arm_aapcs_vfpcc <8 x i16> @shl_v8i16_y(<8 x i16> %x, <8 x i16> %y, i32 %n) { ; CHECK-LABEL: shl_v8i16_y: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u16 q0, q0, q1 ; CHECK-NEXT: vctp.16 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.u16 q1, q0, q1 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1883,10 +1872,9 @@ define arm_aapcs_vfpcc <16 x i8> @shl_v16i8_y(<16 x i8> %x, <16 x i8> %y, i32 %n) { ; CHECK-LABEL: shl_v16i8_y: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vshl.u8 q0, q0, q1 ; CHECK-NEXT: vctp.8 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.u8 q1, q0, q1 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1901,9 +1889,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s32 q2, q1 ; CHECK-NEXT: vctp.32 r0 -; CHECK-NEXT: vshl.s32 q0, q0, q2 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.s32 q1, q0, q2 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1918,9 +1905,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s16 q2, q1 ; CHECK-NEXT: vctp.16 r0 -; CHECK-NEXT: vshl.s16 q0, q0, q2 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.s16 q1, q0, q2 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1935,9 +1921,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s8 q2, q1 ; CHECK-NEXT: vctp.8 r0 -; CHECK-NEXT: vshl.s8 q0, q0, q2 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.s8 q1, q0, q2 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1952,9 +1937,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s32 q2, q1 ; CHECK-NEXT: vctp.32 r0 -; CHECK-NEXT: vshl.u32 q0, q0, q2 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.u32 q1, q0, q2 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1969,9 +1953,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s16 q2, q1 ; CHECK-NEXT: vctp.16 r0 -; CHECK-NEXT: vshl.u16 q0, q0, q2 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.u16 q1, q0, q2 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -1986,9 +1969,8 @@ ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: vneg.s8 q2, q1 ; CHECK-NEXT: vctp.8 r0 -; CHECK-NEXT: vshl.u8 q0, q0, q2 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmovt q1, q0 +; CHECK-NEXT: vshlt.u8 q1, q0, q2 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: