Index: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.h =================================================================== --- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.h +++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.h @@ -478,18 +478,18 @@ } static inline bool isVPTOpcode(int Opc) { - return Opc == ARM::t2VPTv16i8 || Opc == ARM::t2VPTv16u8 || - Opc == ARM::t2VPTv16s8 || Opc == ARM::t2VPTv8i16 || - Opc == ARM::t2VPTv8u16 || Opc == ARM::t2VPTv8s16 || - Opc == ARM::t2VPTv4i32 || Opc == ARM::t2VPTv4u32 || - Opc == ARM::t2VPTv4s32 || Opc == ARM::t2VPTv4f32 || - Opc == ARM::t2VPTv8f16 || Opc == ARM::t2VPTv16i8r || - Opc == ARM::t2VPTv16u8r || Opc == ARM::t2VPTv16s8r || - Opc == ARM::t2VPTv8i16r || Opc == ARM::t2VPTv8u16r || - Opc == ARM::t2VPTv8s16r || Opc == ARM::t2VPTv4i32r || - Opc == ARM::t2VPTv4u32r || Opc == ARM::t2VPTv4s32r || - Opc == ARM::t2VPTv4f32r || Opc == ARM::t2VPTv8f16r || - Opc == ARM::t2VPST; + return Opc == ARM::MVE_VPTv16i8 || Opc == ARM::MVE_VPTv16u8 || + Opc == ARM::MVE_VPTv16s8 || Opc == ARM::MVE_VPTv8i16 || + Opc == ARM::MVE_VPTv8u16 || Opc == ARM::MVE_VPTv8s16 || + Opc == ARM::MVE_VPTv4i32 || Opc == ARM::MVE_VPTv4u32 || + Opc == ARM::MVE_VPTv4s32 || Opc == ARM::MVE_VPTv4f32 || + Opc == ARM::MVE_VPTv8f16 || Opc == ARM::MVE_VPTv16i8r || + Opc == ARM::MVE_VPTv16u8r || Opc == ARM::MVE_VPTv16s8r || + Opc == ARM::MVE_VPTv8i16r || Opc == ARM::MVE_VPTv8u16r || + Opc == ARM::MVE_VPTv8s16r || Opc == ARM::MVE_VPTv4i32r || + Opc == ARM::MVE_VPTv4u32r || Opc == ARM::MVE_VPTv4s32r || + Opc == ARM::MVE_VPTv4f32r || Opc == ARM::MVE_VPTv8f16r || + Opc == ARM::MVE_VPST; } static inline Index: llvm/trunk/lib/Target/ARM/ARMInstrMVE.td =================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrMVE.td +++ llvm/trunk/lib/Target/ARM/ARMInstrMVE.td @@ -113,7 +113,7 @@ let DecoderNamespace = "MVE"; } -class t2MVEShift pattern=[]> : MVE_MI_with_pred { let Inst{31-20} = 0b111010100101; @@ -121,16 +121,16 @@ } -class t2MVEShiftSingleReg pattern=[]> - : t2MVEShift { + : MVE_ScalarShift { bits<4> RdaDest; let Inst{19-16} = RdaDest{3-0}; } -class t2MVEShiftSRegImm op5_4, list pattern=[]> - : t2MVEShiftSingleReg op5_4, list pattern=[]> + : MVE_ScalarShiftSingleReg { bits<5> imm; @@ -142,13 +142,13 @@ let Inst{3-0} = 0b1111; } -def t2SQSHL : t2MVEShiftSRegImm<"sqshl", 0b11>; -def t2SRSHR : t2MVEShiftSRegImm<"srshr", 0b10>; -def t2UQSHL : t2MVEShiftSRegImm<"uqshl", 0b00>; -def t2URSHR : t2MVEShiftSRegImm<"urshr", 0b01>; +def MVE_SQSHL : MVE_ScalarShiftSRegImm<"sqshl", 0b11>; +def MVE_SRSHR : MVE_ScalarShiftSRegImm<"srshr", 0b10>; +def MVE_UQSHL : MVE_ScalarShiftSRegImm<"uqshl", 0b00>; +def MVE_URSHR : MVE_ScalarShiftSRegImm<"urshr", 0b01>; -class t2MVEShiftSRegReg op5_4, list pattern=[]> - : t2MVEShiftSingleReg op5_4, list pattern=[]> + : MVE_ScalarShiftSingleReg { bits<4> Rm; @@ -159,13 +159,13 @@ let Inst{3-0} = 0b1101; } -def t2SQRSHR : t2MVEShiftSRegReg<"sqrshr", 0b10>; -def t2UQRSHL : t2MVEShiftSRegReg<"uqrshl", 0b00>; +def MVE_SQRSHR : MVE_ScalarShiftSRegReg<"sqrshr", 0b10>; +def MVE_UQRSHL : MVE_ScalarShiftSRegReg<"uqrshl", 0b00>; -class t2MVEShiftDoubleReg pattern=[]> - : t2MVEShift { +class MVE_ScalarShiftDoubleReg pattern=[]> + : MVE_ScalarShift { bits<4> RdaLo; bits<4> RdaHi; @@ -173,10 +173,12 @@ let Inst{11-9} = RdaHi{3-1}; } -class t2MVEShiftDRegImm op5_4, bit op16, list pattern=[]> - : t2MVEShiftDoubleReg { +class MVE_ScalarShiftDRegImm op5_4, bit op16, + list pattern=[]> + : MVE_ScalarShiftDoubleReg< + iname, (ins tGPREven:$RdaLo_src, tGPROdd:$RdaHi_src, long_shift:$imm), + "$RdaLo, $RdaHi, $imm", "$RdaLo = $RdaLo_src,$RdaHi = $RdaHi_src", + pattern> { bits<5> imm; let Inst{16} = op16; @@ -187,11 +189,13 @@ let Inst{3-0} = 0b1111; } -class t2MVEShiftDRegReg pattern=[]> - : t2MVEShiftDoubleReg { +class MVE_ScalarShiftDRegReg pattern=[]> + : MVE_ScalarShiftDoubleReg< + iname, (ins tGPREven:$RdaLo_src, tGPROdd:$RdaHi_src, rGPR:$Rm), + "$RdaLo, $RdaHi, $Rm", "@earlyclobber $RdaHi,@earlyclobber $RdaLo," + "$RdaLo = $RdaLo_src,$RdaHi = $RdaHi_src", + pattern> { bits<4> Rm; let Inst{16} = op16; @@ -209,23 +213,24 @@ let DecoderMethod = "DecodeMVEOverlappingLongShift"; } -def t2ASRLr : t2MVEShiftDRegReg<"asrl", 0b1, 0b0>; -def t2ASRLi : t2MVEShiftDRegImm<"asrl", 0b10, ?>; -def t2LSLLr : t2MVEShiftDRegReg<"lsll", 0b0, 0b0>; -def t2LSLLi : t2MVEShiftDRegImm<"lsll", 0b00, ?>; -def t2LSRL : t2MVEShiftDRegImm<"lsrl", 0b01, ?>; - -def t2SQRSHRL : t2MVEShiftDRegReg<"sqrshrl", 0b1, 0b1>; -def t2SQSHLL : t2MVEShiftDRegImm<"sqshll", 0b11, 0b1>; -def t2SRSHRL : t2MVEShiftDRegImm<"srshrl", 0b10, 0b1>; - -def t2UQRSHLL : t2MVEShiftDRegReg<"uqrshll", 0b0, 0b1>; -def t2UQSHLL : t2MVEShiftDRegImm<"uqshll", 0b00, 0b1>; -def t2URSHRL : t2MVEShiftDRegImm<"urshrl", 0b01, 0b1>; +def MVE_ASRLr : MVE_ScalarShiftDRegReg<"asrl", 0b1, 0b0>; +def MVE_ASRLi : MVE_ScalarShiftDRegImm<"asrl", 0b10, ?>; +def MVE_LSLLr : MVE_ScalarShiftDRegReg<"lsll", 0b0, 0b0>; +def MVE_LSLLi : MVE_ScalarShiftDRegImm<"lsll", 0b00, ?>; +def MVE_LSRL : MVE_ScalarShiftDRegImm<"lsrl", 0b01, ?>; + +def MVE_SQRSHRL : MVE_ScalarShiftDRegReg<"sqrshrl", 0b1, 0b1>; +def MVE_SQSHLL : MVE_ScalarShiftDRegImm<"sqshll", 0b11, 0b1>; +def MVE_SRSHRL : MVE_ScalarShiftDRegImm<"srshrl", 0b10, 0b1>; + +def MVE_UQRSHLL : MVE_ScalarShiftDRegReg<"uqrshll", 0b0, 0b1>; +def MVE_UQSHLL : MVE_ScalarShiftDRegImm<"uqshll", 0b00, 0b1>; +def MVE_URSHRL : MVE_ScalarShiftDRegImm<"urshrl", 0b01, 0b1>; // start of mve_rDest instructions -class MVE_rDest pattern=[]> // Always use vpred_n and not vpred_r: with the output register being // a GPR and not a vector register, there can't be any question of @@ -237,7 +242,7 @@ let Inst{4} = 0b0; } -class t2VABAV size, list pattern=[]> +class MVE_VABAV size, list pattern=[]> : MVE_rDest<(outs rGPR:$Rda), (ins rGPR:$Rda_src, MQPR:$Qn, MQPR:$Qm), NoItinerary, "vabav", suffix, "$Rda, $Qn, $Qm", "$Rda = $Rda_src", pattern> { @@ -259,14 +264,14 @@ let Inst{0} = 0b1; } -def VABAVs8 : t2VABAV<"s8", 0b0, 0b00>; -def VABAVs16 : t2VABAV<"s16", 0b0, 0b01>; -def VABAVs32 : t2VABAV<"s32", 0b0, 0b10>; -def VABAVu8 : t2VABAV<"u8", 0b1, 0b00>; -def VABAVu16 : t2VABAV<"u16", 0b1, 0b01>; -def VABAVu32 : t2VABAV<"u32", 0b1, 0b10>; +def MVE_VABAVs8 : MVE_VABAV<"s8", 0b0, 0b00>; +def MVE_VABAVs16 : MVE_VABAV<"s16", 0b0, 0b01>; +def MVE_VABAVs32 : MVE_VABAV<"s32", 0b0, 0b10>; +def MVE_VABAVu8 : MVE_VABAV<"u8", 0b1, 0b00>; +def MVE_VABAVu16 : MVE_VABAV<"u16", 0b1, 0b01>; +def MVE_VABAVu32 : MVE_VABAV<"u32", 0b1, 0b10>; -class t2VADDV size, list pattern=[]> : MVE_rDest<(outs tGPREven:$Rda), iops, NoItinerary, iname, suffix, "$Rda, $Qm", cstr, pattern> { @@ -285,23 +290,24 @@ let Inst{0} = 0b0; } -multiclass t2VADDV_A size, list pattern=[]> { - def acc : t2VADDV<"vaddva", suffix, - (ins tGPREven:$Rda_src, MQPR:$Qm), "$Rda = $Rda_src", - 0b1, U, size, pattern>; - def no_acc : t2VADDV<"vaddv", suffix, - (ins MQPR:$Qm), "", - 0b0, U, size, pattern>; -} - -defm VADDVs8 : t2VADDV_A<"s8", 0b0, 0b00>; -defm VADDVs16 : t2VADDV_A<"s16", 0b0, 0b01>; -defm VADDVs32 : t2VADDV_A<"s32", 0b0, 0b10>; -defm VADDVu8 : t2VADDV_A<"u8", 0b1, 0b00>; -defm VADDVu16 : t2VADDV_A<"u16", 0b1, 0b01>; -defm VADDVu32 : t2VADDV_A<"u32", 0b1, 0b10>; +multiclass MVE_VADDV_A size, + list pattern=[]> { + def acc : MVE_VADDV<"vaddva", suffix, + (ins tGPREven:$Rda_src, MQPR:$Qm), "$Rda = $Rda_src", + 0b1, U, size, pattern>; + def no_acc : MVE_VADDV<"vaddv", suffix, + (ins MQPR:$Qm), "", + 0b0, U, size, pattern>; +} + +defm MVE_VADDVs8 : MVE_VADDV_A<"s8", 0b0, 0b00>; +defm MVE_VADDVs16 : MVE_VADDV_A<"s16", 0b0, 0b01>; +defm MVE_VADDVs32 : MVE_VADDV_A<"s32", 0b0, 0b10>; +defm MVE_VADDVu8 : MVE_VADDV_A<"u8", 0b1, 0b00>; +defm MVE_VADDVu16 : MVE_VADDV_A<"u16", 0b1, 0b01>; +defm MVE_VADDVu32 : MVE_VADDV_A<"u32", 0b1, 0b10>; -class t2VADDLV pattern=[]> : MVE_rDest<(outs tGPREven:$RdaLo, tGPROdd:$RdaHi), iops, NoItinerary, iname, suffix, "$RdaLo, $RdaHi, $Qm", cstr, pattern> { @@ -321,22 +327,22 @@ let Inst{0} = 0b0; } -multiclass t2VADDLV_A pattern=[]> { - def acc : t2VADDLV<"vaddlva", suffix, +multiclass MVE_VADDLV_A pattern=[]> { + def acc : MVE_VADDLV<"vaddlva", suffix, (ins tGPREven:$RdaLo_src, tGPROdd:$RdaHi_src, MQPR:$Qm), "$RdaLo = $RdaLo_src,$RdaHi = $RdaHi_src", 0b1, U, pattern>; - def no_acc : t2VADDLV<"vaddlv", suffix, + def no_acc : MVE_VADDLV<"vaddlv", suffix, (ins MQPR:$Qm), "", 0b0, U, pattern>; } -defm VADDLVs32 : t2VADDLV_A<"s32", 0b0>; -defm VADDLVu32 : t2VADDLV_A<"u32", 0b1>; +defm MVE_VADDLVs32 : MVE_VADDLV_A<"s32", 0b0>; +defm MVE_VADDLVu32 : MVE_VADDLV_A<"u32", 0b1>; -class t2VMINMAXNMV pattern=[]> +class MVE_VMINMAXNMV pattern=[]> : MVE_rDest<(outs rGPR:$RdaDest), (ins rGPR:$RdaSrc, MQPR:$Qm), NoItinerary, iname, suffix, "$RdaSrc, $Qm", "$RdaDest = $RdaSrc", pattern> { @@ -358,23 +364,23 @@ let Predicates = [HasMVEFloat]; } -multiclass t2VMINMAXNMV_fty pattern=[]> { - def f32 : t2VMINMAXNMV; - def f16 : t2VMINMAXNMV; +multiclass MVE_VMINMAXNMV_fty pattern=[]> { + def f32 : MVE_VMINMAXNMV; + def f16 : MVE_VMINMAXNMV; } -defm VMINNMV : t2VMINMAXNMV_fty<"vminnmv", 0b1>; -defm VMAXNMV : t2VMINMAXNMV_fty<"vmaxnmv", 0b0>; +defm MVE_VMINNMV : MVE_VMINMAXNMV_fty<"vminnmv", 0b1>; +defm MVE_VMAXNMV : MVE_VMINMAXNMV_fty<"vmaxnmv", 0b0>; -multiclass t2VMINMAXNMAV_fty pattern=[]> { - def f32 : t2VMINMAXNMV; - def f16 : t2VMINMAXNMV; +multiclass MVE_VMINMAXNMAV_fty pattern=[]> { + def f32 : MVE_VMINMAXNMV; + def f16 : MVE_VMINMAXNMV; } -defm VMINNMAV : t2VMINMAXNMAV_fty<"vminnmav", 0b1>; -defm VMAXNMAV : t2VMINMAXNMAV_fty<"vmaxnmav", 0b0>; +defm MVE_VMINNMAV : MVE_VMINMAXNMAV_fty<"vminnmav", 0b1>; +defm MVE_VMAXNMAV : MVE_VMINMAXNMAV_fty<"vmaxnmav", 0b0>; -class t2VMINMAXV size, +class MVE_VMINMAXV size, bit bit_17, bit bit_7, list pattern=[]> : MVE_rDest<(outs rGPR:$RdaDest), (ins rGPR:$RdaSrc, MQPR:$Qm), NoItinerary, iname, suffix, "$RdaSrc, $Qm", "$RdaDest = $RdaSrc", pattern> { @@ -394,29 +400,28 @@ let Inst{0} = 0b0; } -multiclass t2VMINMAXV_ty pattern=[]> { - def s8 : t2VMINMAXV; - def s16 : t2VMINMAXV; - def s32 : t2VMINMAXV; - def u8 : t2VMINMAXV; - def u16 : t2VMINMAXV; - def u32 : t2VMINMAXV; +multiclass MVE_VMINMAXV_ty pattern=[]> { + def s8 : MVE_VMINMAXV; + def s16 : MVE_VMINMAXV; + def s32 : MVE_VMINMAXV; + def u8 : MVE_VMINMAXV; + def u16 : MVE_VMINMAXV; + def u32 : MVE_VMINMAXV; } -// Prefixed with MVE to prevent conflict with A57 scheduler. -defm MVE_VMINV : t2VMINMAXV_ty<"vminv", 0b1>; -defm MVE_VMAXV : t2VMINMAXV_ty<"vmaxv", 0b0>; +defm MVE_VMINV : MVE_VMINMAXV_ty<"vminv", 0b1>; +defm MVE_VMAXV : MVE_VMINMAXV_ty<"vmaxv", 0b0>; -multiclass t2VMINMAXAV_ty pattern=[]> { - def s8 : t2VMINMAXV; - def s16 : t2VMINMAXV; - def s32 : t2VMINMAXV; +multiclass MVE_VMINMAXAV_ty pattern=[]> { + def s8 : MVE_VMINMAXV; + def s16 : MVE_VMINMAXV; + def s32 : MVE_VMINMAXV; } -defm MVE_VMINAV : t2VMINMAXAV_ty<"vminav", 0b1>; -defm MVE_VMAXAV : t2VMINMAXAV_ty<"vmaxav", 0b0>; +defm MVE_VMINAV : MVE_VMINMAXAV_ty<"vminav", 0b1>; +defm MVE_VMAXAV : MVE_VMINMAXAV_ty<"vmaxav", 0b0>; -class t2VMLAMLSDAV pattern=[]> : MVE_rDest<(outs tGPREven:$RdaDest), iops, NoItinerary, iname, suffix, @@ -438,60 +443,61 @@ let Inst{0} = bit_0; } -multiclass t2VMLAMLSDAV_X pattern=[]> { - def _noexch : t2VMLAMLSDAV; - def _exch : t2VMLAMLSDAV; } -multiclass t2VMLAMLSDAV_XA pattern=[]> { - defm _noacc : t2VMLAMLSDAV_X; - defm _acc : t2VMLAMLSDAV_X; } -multiclass t2VMLADAV_multi pattern=[]> { - defm "" : t2VMLAMLSDAV_XA<"vmladav", suffix, sz, U, bit_8, 0b0, pattern>; + defm "" : MVE_VMLAMLSDAV_XA<"vmladav", suffix, sz, U, bit_8, 0b0, pattern>; } -defm VMLADAVs16 : t2VMLADAV_multi<"s16", 0b0, 0b0, 0b0>; -defm VMLADAVs32 : t2VMLADAV_multi<"s32", 0b1, 0b0, 0b0>; -defm VMLADAVu16 : t2VMLADAV_multi<"u16", 0b0, 0b1, 0b0>; -defm VMLADAVu32 : t2VMLADAV_multi<"u32", 0b1, 0b1, 0b0>; +defm MVE_VMLADAVs16 : MVE_VMLADAV_multi<"s16", 0b0, 0b0, 0b0>; +defm MVE_VMLADAVs32 : MVE_VMLADAV_multi<"s32", 0b1, 0b0, 0b0>; +defm MVE_VMLADAVu16 : MVE_VMLADAV_multi<"u16", 0b0, 0b1, 0b0>; +defm MVE_VMLADAVu32 : MVE_VMLADAV_multi<"u32", 0b1, 0b1, 0b0>; -defm VMLADAVs8 : t2VMLADAV_multi<"s8", 0b0, 0b0, 0b1>; -defm VMLADAVu8 : t2VMLADAV_multi<"u8", 0b0, 0b1, 0b1>; +defm MVE_VMLADAVs8 : MVE_VMLADAV_multi<"s8", 0b0, 0b0, 0b1>; +defm MVE_VMLADAVu8 : MVE_VMLADAV_multi<"u8", 0b0, 0b1, 0b1>; // vmlav aliases vmladav foreach acc = ["_acc", "_noacc"] in { foreach suffix = ["s8", "s16", "s32", "u8", "u16", "u32"] in { def : MVEInstAlias(!strconcat("VMLADAV", suffix, acc, "_noexch")) tGPREven:$RdaDest, MQPR:$Qn, MQPR:$Qm, vpred_n:$vp)>; + (!cast("MVE_VMLADAV"#suffix#acc#"_noexch") + tGPREven:$RdaDest, MQPR:$Qn, MQPR:$Qm, vpred_n:$vp)>; } } -multiclass t2VMLSDAV_multi pattern=[]> { - defm "" : t2VMLAMLSDAV_XA<"vmlsdav", suffix, sz, bit_28, 0b0, 0b1, pattern>; + defm "" : MVE_VMLAMLSDAV_XA<"vmlsdav", suffix, sz, bit_28, 0b0, 0b1, pattern>; } -defm t2VMLSDAVs8 : t2VMLSDAV_multi<"s8", 0, 0b1>; -defm t2VMLSDAVs16 : t2VMLSDAV_multi<"s16", 0, 0b0>; -defm t2VMLSDAVs32 : t2VMLSDAV_multi<"s32", 1, 0b0>; +defm MVE_VMLSDAVs8 : MVE_VMLSDAV_multi<"s8", 0, 0b1>; +defm MVE_VMLSDAVs16 : MVE_VMLSDAV_multi<"s16", 0, 0b0>; +defm MVE_VMLSDAVs32 : MVE_VMLSDAV_multi<"s32", 1, 0b0>; // Base class for VMLALDAV and VMLSLDAV, VRMLALDAVH, VRMLSLDAVH -class t2VMLALDAVBase pattern=[]> +class MVE_VMLALDAVBase pattern=[]> : MVE_rDest<(outs tGPREven:$RdaLoDest, tGPROdd:$RdaHiDest), iops, NoItinerary, iname, suffix, "$RdaLoDest, $RdaHiDest, $Qn, $Qm", cstr, pattern> { bits<4> RdaLoDest; @@ -512,75 +518,82 @@ let Inst{0} = bit_0; } -multiclass t2VMLALDAVBase_X pattern=[]> { - def _noexch : t2VMLALDAVBase pattern=[]> { + def _noexch : MVE_VMLALDAVBase; - def _exch : t2VMLALDAVBase; } -multiclass t2VMLALDAVBase_XA pattern=[]> { - defm _noacc : t2VMLALDAVBase_X; - defm _acc : t2VMLALDAVBase_X; -} - -multiclass t2VRMLALDAVH_multi pattern=[]> { - defm "" : t2VMLALDAVBase_XA<"vrmlaldavh", suffix, 0b0, U, 0b1, 0b0, pattern>; + defm _noacc : MVE_VMLALDAVBase_X< + iname, suffix, (ins MQPR:$Qn, MQPR:$Qm), "", + sz, bit_28, 0b0, bit_8, bit_0, pattern>; + defm _acc : MVE_VMLALDAVBase_X< + iname # "a", suffix, (ins tGPREven:$RdaLoSrc, tGPROdd:$RdaHiSrc, + MQPR:$Qn, MQPR:$Qm), + "$RdaLoDest = $RdaLoSrc,$RdaHiDest = $RdaHiSrc", + sz, bit_28, 0b1, bit_8, bit_0, pattern>; +} + +multiclass MVE_VRMLALDAVH_multi pattern=[]> { + defm "" : MVE_VMLALDAVBase_XA< + "vrmlaldavh", suffix, 0b0, U, 0b1, 0b0, pattern>; } -defm t2VRMLALDAVHs32 : t2VRMLALDAVH_multi<"s32", 0>; -defm t2VRMLALDAVHu32 : t2VRMLALDAVH_multi<"u32", 1>; +defm MVE_VRMLALDAVHs32 : MVE_VRMLALDAVH_multi<"s32", 0>; +defm MVE_VRMLALDAVHu32 : MVE_VRMLALDAVH_multi<"u32", 1>; // vrmlalvh aliases for vrmlaldavh def : MVEInstAlias<"vrmlalvh${vp}.s32\t$RdaLo, $RdaHi, $Qn, $Qm", - (t2VRMLALDAVHs32_noacc_noexch tGPREven:$RdaLo, tGPROdd:$RdaHi, + (MVE_VRMLALDAVHs32_noacc_noexch + tGPREven:$RdaLo, tGPROdd:$RdaHi, MQPR:$Qn, MQPR:$Qm, vpred_n:$vp)>; def : MVEInstAlias<"vrmlalvha${vp}.s32\t$RdaLo, $RdaHi, $Qn, $Qm", - (t2VRMLALDAVHs32_acc_noexch tGPREven:$RdaLo, tGPROdd:$RdaHi, + (MVE_VRMLALDAVHs32_acc_noexch + tGPREven:$RdaLo, tGPROdd:$RdaHi, MQPR:$Qn, MQPR:$Qm, vpred_n:$vp)>; def : MVEInstAlias<"vrmlalvh${vp}.u32\t$RdaLo, $RdaHi, $Qn, $Qm", - (t2VRMLALDAVHu32_noacc_noexch tGPREven:$RdaLo, tGPROdd:$RdaHi, + (MVE_VRMLALDAVHu32_noacc_noexch + tGPREven:$RdaLo, tGPROdd:$RdaHi, MQPR:$Qn, MQPR:$Qm, vpred_n:$vp)>; def : MVEInstAlias<"vrmlalvha${vp}.u32\t$RdaLo, $RdaHi, $Qn, $Qm", - (t2VRMLALDAVHu32_acc_noexch tGPREven:$RdaLo, tGPROdd:$RdaHi, + (MVE_VRMLALDAVHu32_acc_noexch + tGPREven:$RdaLo, tGPROdd:$RdaHi, MQPR:$Qn, MQPR:$Qm, vpred_n:$vp)>; -multiclass t2VMLALDAV_multi pattern=[]> { - defm "" : t2VMLALDAVBase_XA<"vmlaldav", suffix, sz, U, 0b0, 0b0, pattern>; +multiclass MVE_VMLALDAV_multi pattern=[]> { + defm "" : MVE_VMLALDAVBase_XA<"vmlaldav", suffix, sz, U, 0b0, 0b0, pattern>; } -defm VMLALDAVs16 : t2VMLALDAV_multi<"s16", 0b0, 0b0>; -defm VMLALDAVs32 : t2VMLALDAV_multi<"s32", 0b1, 0b0>; -defm VMLALDAVu16 : t2VMLALDAV_multi<"u16", 0b0, 0b1>; -defm VMLALDAVu32 : t2VMLALDAV_multi<"u32", 0b1, 0b1>; +defm MVE_VMLALDAVs16 : MVE_VMLALDAV_multi<"s16", 0b0, 0b0>; +defm MVE_VMLALDAVs32 : MVE_VMLALDAV_multi<"s32", 0b1, 0b0>; +defm MVE_VMLALDAVu16 : MVE_VMLALDAV_multi<"u16", 0b0, 0b1>; +defm MVE_VMLALDAVu32 : MVE_VMLALDAV_multi<"u32", 0b1, 0b1>; // vmlalv aliases vmlaldav foreach acc = ["_acc", "_noacc"] in { foreach suffix = ["s16", "s32", "u16", "u32"] in { def : MVEInstAlias(!strconcat("VMLALDAV", suffix, acc, "_noexch")) + (!cast("MVE_VMLALDAV"#suffix#acc#"_noexch") tGPREven:$RdaLoDest, tGPROdd:$RdaHiDest, MQPR:$Qn, MQPR:$Qm, vpred_n:$vp)>; } } -multiclass t2VMLSLDAV_multi pattern=[]> { - defm "" : t2VMLALDAVBase_XA; + defm "" : MVE_VMLALDAVBase_XA; } -defm t2VMLSLDAVs16 : t2VMLSLDAV_multi<"vmlsldav", "s16", 0b0, 0b0>; -defm t2VMLSLDAVs32 : t2VMLSLDAV_multi<"vmlsldav", "s32", 0b1, 0b0>; -defm t2VRMLSLDAVHs32 : t2VMLSLDAV_multi<"vrmlsldavh", "s32", 0b0, 0b1>; +defm MVE_VMLSLDAVs16 : MVE_VMLSLDAV_multi<"vmlsldav", "s16", 0b0, 0b0>; +defm MVE_VMLSLDAVs32 : MVE_VMLSLDAV_multi<"vmlsldav", "s32", 0b1, 0b0>; +defm MVE_VRMLSLDAVHs32 : MVE_VMLSLDAV_multi<"vrmlsldavh", "s32", 0b0, 0b1>; // end of mve_rDest instructions @@ -606,7 +619,7 @@ let Inst{0} = 0b0; } -class VMINMAXNM pattern=[]> : MVE_comp { @@ -623,15 +636,15 @@ let Predicates = [HasMVEFloat]; } -def VMAXNMf32 : VMINMAXNM<"vmaxnm", "f32", 0b0, 0b0>; -def VMAXNMf16 : VMINMAXNM<"vmaxnm", "f16", 0b1, 0b0>; +def MVE_VMAXNMf32 : MVE_VMINMAXNM<"vmaxnm", "f32", 0b0, 0b0>; +def MVE_VMAXNMf16 : MVE_VMINMAXNM<"vmaxnm", "f16", 0b1, 0b0>; -def VMINNMf32 : VMINMAXNM<"vminnm", "f32", 0b0, 0b1>; -def VMINNMf16 : VMINMAXNM<"vminnm", "f16", 0b1, 0b1>; +def MVE_VMINNMf32 : MVE_VMINMAXNM<"vminnm", "f32", 0b0, 0b1>; +def MVE_VMINNMf16 : MVE_VMINMAXNM<"vminnm", "f16", 0b1, 0b1>; // end of mve_comp instructions -class t2VPT size, dag iops, string asm, list pattern=[]> +class MVE_VPT size, dag iops, string asm, list pattern=[]> : MVE_MI<(outs ), iops, NoItinerary, !strconcat("vpt", "${Mk}", ".", suffix), asm, "", pattern> { bits<3> fc; bits<4> Mk; @@ -651,8 +664,8 @@ let Defs = [VPR, P0]; } -class t2VPTt1 size, dag iops> - : t2VPT { +class MVE_VPTt1 size, dag iops> + : MVE_VPT { bits<4> Qm; bits<4> Mk; @@ -662,40 +675,40 @@ let Inst{0} = fc{1}; } -class t2VPTt1i size> - : t2VPTt1 size> + : MVE_VPTt1 { let Inst{12} = 0b0; let Inst{0} = 0b0; } -def t2VPTv4i32 : t2VPTt1i<"i32", 0b10>; -def t2VPTv8i16 : t2VPTt1i<"i16", 0b01>; -def t2VPTv16i8 : t2VPTt1i<"i8", 0b00>; +def MVE_VPTv4i32 : MVE_VPTt1i<"i32", 0b10>; +def MVE_VPTv8i16 : MVE_VPTt1i<"i16", 0b01>; +def MVE_VPTv16i8 : MVE_VPTt1i<"i8", 0b00>; -class t2VPTt1u size> - : t2VPTt1 size> + : MVE_VPTt1 { let Inst{12} = 0b0; let Inst{0} = 0b1; } -def t2VPTv4u32 : t2VPTt1u<"u32", 0b10>; -def t2VPTv8u16 : t2VPTt1u<"u16", 0b01>; -def t2VPTv16u8 : t2VPTt1u<"u8", 0b00>; +def MVE_VPTv4u32 : MVE_VPTt1u<"u32", 0b10>; +def MVE_VPTv8u16 : MVE_VPTt1u<"u16", 0b01>; +def MVE_VPTv16u8 : MVE_VPTt1u<"u8", 0b00>; -class t2VPTt1s size> - : t2VPTt1 size> + : MVE_VPTt1 { let Inst{12} = 0b1; } -def t2VPTv4s32 : t2VPTt1s<"s32", 0b10>; -def t2VPTv8s16 : t2VPTt1s<"s16", 0b01>; -def t2VPTv16s8 : t2VPTt1s<"s8", 0b00>; +def MVE_VPTv4s32 : MVE_VPTt1s<"s32", 0b10>; +def MVE_VPTv8s16 : MVE_VPTt1s<"s16", 0b01>; +def MVE_VPTv16s8 : MVE_VPTt1s<"s8", 0b00>; -class t2VPTt2 size, dag iops> - : t2VPT size, dag iops> + : MVE_VPT { bits<4> Rm; bits<3> fc; @@ -706,40 +719,40 @@ let Inst{3-0} = Rm{3-0}; } -class t2VPTt2i size> - : t2VPTt2 size> + : MVE_VPTt2 { let Inst{12} = 0b0; let Inst{5} = 0b0; } -def t2VPTv4i32r : t2VPTt2i<"i32", 0b10>; -def t2VPTv8i16r : t2VPTt2i<"i16", 0b01>; -def t2VPTv16i8r : t2VPTt2i<"i8", 0b00>; +def MVE_VPTv4i32r : MVE_VPTt2i<"i32", 0b10>; +def MVE_VPTv8i16r : MVE_VPTt2i<"i16", 0b01>; +def MVE_VPTv16i8r : MVE_VPTt2i<"i8", 0b00>; -class t2VPTt2u size> - : t2VPTt2 size> + : MVE_VPTt2 { let Inst{12} = 0b0; let Inst{5} = 0b1; } -def t2VPTv4u32r : t2VPTt2u<"u32", 0b10>; -def t2VPTv8u16r : t2VPTt2u<"u16", 0b01>; -def t2VPTv16u8r : t2VPTt2u<"u8", 0b00>; +def MVE_VPTv4u32r : MVE_VPTt2u<"u32", 0b10>; +def MVE_VPTv8u16r : MVE_VPTt2u<"u16", 0b01>; +def MVE_VPTv16u8r : MVE_VPTt2u<"u8", 0b00>; -class t2VPTt2s size> - : t2VPTt2 size> + : MVE_VPTt2 { let Inst{12} = 0b1; } -def t2VPTv4s32r : t2VPTt2s<"s32", 0b10>; -def t2VPTv8s16r : t2VPTt2s<"s16", 0b01>; -def t2VPTv16s8r : t2VPTt2s<"s8", 0b00>; +def MVE_VPTv4s32r : MVE_VPTt2s<"s32", 0b10>; +def MVE_VPTv8s16r : MVE_VPTt2s<"s16", 0b01>; +def MVE_VPTv16s8r : MVE_VPTt2s<"s8", 0b00>; -class t2VPTf pattern=[]> +class MVE_VPTf pattern=[]> : MVE_MI<(outs ), iops, NoItinerary, !strconcat("vpt", "${Mk}", ".", suffix), asm, "", pattern> { bits<3> fc; @@ -763,8 +776,8 @@ let Predicates = [HasMVEFloat]; } -class t2VPTft1 - : t2VPTf + : MVE_VPTf { bits<3> fc; bits<4> Qm; @@ -775,11 +788,11 @@ let Inst{0} = fc{1}; } -def t2VPTv4f32 : t2VPTft1<"f32", 0b0>; -def t2VPTv8f16 : t2VPTft1<"f16", 0b1>; +def MVE_VPTv4f32 : MVE_VPTft1<"f32", 0b0>; +def MVE_VPTv8f16 : MVE_VPTft1<"f16", 0b1>; -class t2VPTft2 - : t2VPTf + : MVE_VPTf { bits<3> fc; bits<4> Rm; @@ -789,10 +802,10 @@ let Inst{3-0} = Rm{3-0}; } -def t2VPTv4f32r : t2VPTft2<"f32", 0b0>; -def t2VPTv8f16r : t2VPTft2<"f16", 0b1>; +def MVE_VPTv4f32r : MVE_VPTft2<"f32", 0b0>; +def MVE_VPTv8f16r : MVE_VPTft2<"f16", 0b1>; -def t2VPST : MVE_MI<(outs ), (ins vpt_mask:$Mk), NoItinerary, +def MVE_VPST : MVE_MI<(outs ), (ins vpt_mask:$Mk), NoItinerary, !strconcat("vpst", "${Mk}"), "", "", []> { bits<4> Mk; Index: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp =================================================================== --- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -9590,29 +9590,29 @@ return true; } return false; - case ARM::t2VPST: - case ARM::t2VPTv16i8: - case ARM::t2VPTv8i16: - case ARM::t2VPTv4i32: - case ARM::t2VPTv16u8: - case ARM::t2VPTv8u16: - case ARM::t2VPTv4u32: - case ARM::t2VPTv16s8: - case ARM::t2VPTv8s16: - case ARM::t2VPTv4s32: - case ARM::t2VPTv4f32: - case ARM::t2VPTv8f16: - case ARM::t2VPTv16i8r: - case ARM::t2VPTv8i16r: - case ARM::t2VPTv4i32r: - case ARM::t2VPTv16u8r: - case ARM::t2VPTv8u16r: - case ARM::t2VPTv4u32r: - case ARM::t2VPTv16s8r: - case ARM::t2VPTv8s16r: - case ARM::t2VPTv4s32r: - case ARM::t2VPTv4f32r: - case ARM::t2VPTv8f16r: { + case ARM::MVE_VPST: + case ARM::MVE_VPTv16i8: + case ARM::MVE_VPTv8i16: + case ARM::MVE_VPTv4i32: + case ARM::MVE_VPTv16u8: + case ARM::MVE_VPTv8u16: + case ARM::MVE_VPTv4u32: + case ARM::MVE_VPTv16s8: + case ARM::MVE_VPTv8s16: + case ARM::MVE_VPTv4s32: + case ARM::MVE_VPTv4f32: + case ARM::MVE_VPTv8f16: + case ARM::MVE_VPTv16i8r: + case ARM::MVE_VPTv8i16r: + case ARM::MVE_VPTv4i32r: + case ARM::MVE_VPTv16u8r: + case ARM::MVE_VPTv8u16r: + case ARM::MVE_VPTv4u32r: + case ARM::MVE_VPTv16s8r: + case ARM::MVE_VPTv8s16r: + case ARM::MVE_VPTv4s32r: + case ARM::MVE_VPTv4f32r: + case ARM::MVE_VPTv8f16r: { assert(!inVPTBlock() && "Nested VPT blocks are not allowed"); MCOperand &MO = Inst.getOperand(0); VPTState.Mask = MO.getImm(); Index: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp =================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp +++ llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp @@ -6042,13 +6042,13 @@ unsigned Rda = fieldFromInstruction(Insn, 16, 4); switch (Inst.getOpcode()) { - case ARM::t2ASRLr: - case ARM::t2SQRSHRL: - Inst.setOpcode(ARM::t2SQRSHR); + case ARM::MVE_ASRLr: + case ARM::MVE_SQRSHRL: + Inst.setOpcode(ARM::MVE_SQRSHR); break; - case ARM::t2LSLLr: - case ARM::t2UQRSHLL: - Inst.setOpcode(ARM::t2UQRSHL); + case ARM::MVE_LSLLr: + case ARM::MVE_UQRSHLL: + Inst.setOpcode(ARM::MVE_UQRSHL); break; default: llvm_unreachable("Unexpected starting opcode!"); Index: llvm/trunk/lib/Target/ARM/Thumb2ITBlockPass.cpp =================================================================== --- llvm/trunk/lib/Target/ARM/Thumb2ITBlockPass.cpp +++ llvm/trunk/lib/Target/ARM/Thumb2ITBlockPass.cpp @@ -387,7 +387,7 @@ } MachineInstrBuilder MIBuilder = - BuildMI(Block, MBIter, dl, TII->get(ARM::t2VPST)); + BuildMI(Block, MBIter, dl, TII->get(ARM::MVE_VPST)); MachineInstr *LastMI = MI; MachineBasicBlock::iterator InsertPos = MIBuilder.getInstr(); Index: llvm/trunk/test/CodeGen/ARM/mve-vpt-block.mir =================================================================== --- llvm/trunk/test/CodeGen/ARM/mve-vpt-block.mir +++ llvm/trunk/test/CodeGen/ARM/mve-vpt-block.mir @@ -61,11 +61,11 @@ bb.0.entry: liveins: $q0, $q1, $q2, $r0 - ; CHECK: VPST 8, implicit-def $p0 - ; CHECK-NEXT: $q0 = nnan ninf nsz VMINNMf32 killed renamable $q1, killed renamable $q2, 1, killed renamable $vpr, killed renamable $q0 + ; CHECK: MVE_VPST 8, implicit-def $p0 + ; CHECK-NEXT: $q0 = nnan ninf nsz MVE_VMINNMf32 killed renamable $q1, killed renamable $q2, 1, killed renamable $vpr, killed renamable $q0 $vpr = VMSR_P0 killed $r0, 14, $noreg - renamable $q0 = nnan ninf nsz VMINNMf32 killed renamable $q1, killed renamable $q2, 1, killed renamable $vpr, killed renamable $q0 + renamable $q0 = nnan ninf nsz MVE_VMINNMf32 killed renamable $q1, killed renamable $q2, 1, killed renamable $vpr, killed renamable $q0 tBX_RET 14, $noreg, implicit $q0 ...