@@ -32,8 +32,12 @@ def SDT_MipsExtr : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisSameAs<0, 1>,
3232 SDTCisVT<2, untyped>]>;
3333def SDT_MipsShilo : SDTypeProfile<1, 2, [SDTCisVT<0, untyped>,
3434 SDTCisSameAs<0, 2>, SDTCisVT<1, i32>]>;
35- def SDT_MipsDPA : SDTypeProfile<1, 3, [SDTCisVT<0, untyped>, SDTCisSameAs<0, 3>,
36- SDTCisVT<1, i32>, SDTCisSameAs<1, 2>]>;
35+ def SDT_MipsDPA_H : SDTypeProfile<1, 3, [SDTCisVT<0, untyped>, SDTCisSameAs<0, 3>,
36+ SDTCisVT<1, v4i8>, SDTCisSameAs<1, 2>]>;
37+ def SDT_MipsDPA_W : SDTypeProfile<1, 3, [SDTCisVT<0, untyped>, SDTCisSameAs<0, 3>,
38+ SDTCisVT<1, v2i16>, SDTCisSameAs<1, 2>]>;
39+ def SDT_MipsDPA_L : SDTypeProfile<1, 3, [SDTCisVT<0, untyped>, SDTCisSameAs<0, 3>,
40+ SDTCisVT<1, i32>, SDTCisSameAs<1, 2>]>;
3741def SDT_MipsSHIFT_DSP : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0, 1>,
3842 SDTCisVT<2, i32>]>;
3943
@@ -43,6 +47,7 @@ class MipsDSPBase<string Opc, SDTypeProfile Prof> :
4347class MipsDSPSideEffectBase<string Opc, SDTypeProfile Prof> :
4448 SDNode<!strconcat("MipsISD::", Opc), Prof, [SDNPHasChain, SDNPSideEffect]>;
4549
50+ // EXTR.W intrinsic nodes.
4651def MipsEXTP : MipsDSPSideEffectBase<"EXTP", SDT_MipsExtr>;
4752def MipsEXTPDP : MipsDSPSideEffectBase<"EXTPDP", SDT_MipsExtr>;
4853def MipsEXTR_S_H : MipsDSPSideEffectBase<"EXTR_S_H", SDT_MipsExtr>;
@@ -53,40 +58,45 @@ def MipsEXTR_RS_W : MipsDSPSideEffectBase<"EXTR_RS_W", SDT_MipsExtr>;
5358def MipsSHILO : MipsDSPBase<"SHILO", SDT_MipsShilo>;
5459def MipsMTHLIP : MipsDSPSideEffectBase<"MTHLIP", SDT_MipsShilo>;
5560
56- def MipsMULSAQ_S_W_PH : MipsDSPSideEffectBase<"MULSAQ_S_W_PH", SDT_MipsDPA>;
57- def MipsMAQ_S_W_PHL : MipsDSPSideEffectBase<"MAQ_S_W_PHL", SDT_MipsDPA>;
58- def MipsMAQ_S_W_PHR : MipsDSPSideEffectBase<"MAQ_S_W_PHR", SDT_MipsDPA>;
59- def MipsMAQ_SA_W_PHL : MipsDSPSideEffectBase<"MAQ_SA_W_PHL", SDT_MipsDPA>;
60- def MipsMAQ_SA_W_PHR : MipsDSPSideEffectBase<"MAQ_SA_W_PHR", SDT_MipsDPA>;
61-
62- def MipsDPAU_H_QBL : MipsDSPBase<"DPAU_H_QBL", SDT_MipsDPA>;
63- def MipsDPAU_H_QBR : MipsDSPBase<"DPAU_H_QBR", SDT_MipsDPA>;
64- def MipsDPSU_H_QBL : MipsDSPBase<"DPSU_H_QBL", SDT_MipsDPA>;
65- def MipsDPSU_H_QBR : MipsDSPBase<"DPSU_H_QBR", SDT_MipsDPA>;
66- def MipsDPAQ_S_W_PH : MipsDSPSideEffectBase<"DPAQ_S_W_PH", SDT_MipsDPA>;
67- def MipsDPSQ_S_W_PH : MipsDSPSideEffectBase<"DPSQ_S_W_PH", SDT_MipsDPA>;
68- def MipsDPAQ_SA_L_W : MipsDSPSideEffectBase<"DPAQ_SA_L_W", SDT_MipsDPA>;
69- def MipsDPSQ_SA_L_W : MipsDSPSideEffectBase<"DPSQ_SA_L_W", SDT_MipsDPA>;
70-
71- def MipsDPA_W_PH : MipsDSPBase<"DPA_W_PH", SDT_MipsDPA>;
72- def MipsDPS_W_PH : MipsDSPBase<"DPS_W_PH", SDT_MipsDPA>;
73- def MipsDPAQX_S_W_PH : MipsDSPSideEffectBase<"DPAQX_S_W_PH", SDT_MipsDPA>;
74- def MipsDPAQX_SA_W_PH : MipsDSPSideEffectBase<"DPAQX_SA_W_PH", SDT_MipsDPA>;
75- def MipsDPAX_W_PH : MipsDSPBase<"DPAX_W_PH", SDT_MipsDPA>;
76- def MipsDPSX_W_PH : MipsDSPBase<"DPSX_W_PH", SDT_MipsDPA>;
77- def MipsDPSQX_S_W_PH : MipsDSPSideEffectBase<"DPSQX_S_W_PH", SDT_MipsDPA>;
78- def MipsDPSQX_SA_W_PH : MipsDSPSideEffectBase<"DPSQX_SA_W_PH", SDT_MipsDPA>;
79- def MipsMULSA_W_PH : MipsDSPBase<"MULSA_W_PH", SDT_MipsDPA>;
80-
81- def MipsMULT : MipsDSPBase<"MULT", SDT_MipsDPA>;
82- def MipsMULTU : MipsDSPBase<"MULTU", SDT_MipsDPA>;
83- def MipsMADD_DSP : MipsDSPBase<"MADD_DSP", SDT_MipsDPA>;
84- def MipsMADDU_DSP : MipsDSPBase<"MADDU_DSP", SDT_MipsDPA>;
85- def MipsMSUB_DSP : MipsDSPBase<"MSUB_DSP", SDT_MipsDPA>;
86- def MipsMSUBU_DSP : MipsDSPBase<"MSUBU_DSP", SDT_MipsDPA>;
61+ // DPA.W intrinsic nodes.
62+ def MipsMULSAQ_S_W_PH : MipsDSPSideEffectBase<"MULSAQ_S_W_PH", SDT_MipsDPA_W>;
63+ def MipsMAQ_S_W_PHL : MipsDSPSideEffectBase<"MAQ_S_W_PHL", SDT_MipsDPA_W>;
64+ def MipsMAQ_S_W_PHR : MipsDSPSideEffectBase<"MAQ_S_W_PHR", SDT_MipsDPA_W>;
65+ def MipsMAQ_SA_W_PHL : MipsDSPSideEffectBase<"MAQ_SA_W_PHL", SDT_MipsDPA_W>;
66+ def MipsMAQ_SA_W_PHR : MipsDSPSideEffectBase<"MAQ_SA_W_PHR", SDT_MipsDPA_W>;
67+
68+ def MipsDPAU_H_QBL : MipsDSPBase<"DPAU_H_QBL", SDT_MipsDPA_H>;
69+ def MipsDPAU_H_QBR : MipsDSPBase<"DPAU_H_QBR", SDT_MipsDPA_H>;
70+ def MipsDPSU_H_QBL : MipsDSPBase<"DPSU_H_QBL", SDT_MipsDPA_H>;
71+ def MipsDPSU_H_QBR : MipsDSPBase<"DPSU_H_QBR", SDT_MipsDPA_H>;
72+ def MipsDPAQ_S_W_PH : MipsDSPSideEffectBase<"DPAQ_S_W_PH", SDT_MipsDPA_W>;
73+ def MipsDPSQ_S_W_PH : MipsDSPSideEffectBase<"DPSQ_S_W_PH", SDT_MipsDPA_W>;
74+ def MipsDPAQ_SA_L_W : MipsDSPSideEffectBase<"DPAQ_SA_L_W", SDT_MipsDPA_L>;
75+ def MipsDPSQ_SA_L_W : MipsDSPSideEffectBase<"DPSQ_SA_L_W", SDT_MipsDPA_L>;
76+
77+ def MipsDPA_W_PH : MipsDSPBase<"DPA_W_PH", SDT_MipsDPA_W>;
78+ def MipsDPS_W_PH : MipsDSPBase<"DPS_W_PH", SDT_MipsDPA_W>;
79+ def MipsDPAQX_S_W_PH : MipsDSPSideEffectBase<"DPAQX_S_W_PH", SDT_MipsDPA_W>;
80+ def MipsDPAQX_SA_W_PH : MipsDSPSideEffectBase<"DPAQX_SA_W_PH", SDT_MipsDPA_W>;
81+ def MipsDPAX_W_PH : MipsDSPBase<"DPAX_W_PH", SDT_MipsDPA_W>;
82+ def MipsDPSX_W_PH : MipsDSPBase<"DPSX_W_PH", SDT_MipsDPA_W>;
83+ def MipsDPSQX_S_W_PH : MipsDSPSideEffectBase<"DPSQX_S_W_PH", SDT_MipsDPA_W>;
84+ def MipsDPSQX_SA_W_PH : MipsDSPSideEffectBase<"DPSQX_SA_W_PH", SDT_MipsDPA_W>;
85+ def MipsMULSA_W_PH : MipsDSPBase<"MULSA_W_PH", SDT_MipsDPA_W>;
86+
87+ def MipsMULT : MipsDSPBase<"MULT", SDT_MipsDPA_L>;
88+ def MipsMULTU : MipsDSPBase<"MULTU", SDT_MipsDPA_L>;
89+ def MipsMADD_DSP : MipsDSPBase<"MADD_DSP", SDT_MipsDPA_L>;
90+ def MipsMADDU_DSP : MipsDSPBase<"MADDU_DSP", SDT_MipsDPA_L>;
91+ def MipsMSUB_DSP : MipsDSPBase<"MSUB_DSP", SDT_MipsDPA_L>;
92+ def MipsMSUBU_DSP : MipsDSPBase<"MSUBU_DSP", SDT_MipsDPA_L>;
93+
94+ // DSP shift nodes.
8795def MipsSHLL_DSP : MipsDSPBase<"SHLL_DSP", SDT_MipsSHIFT_DSP>;
8896def MipsSHRA_DSP : MipsDSPBase<"SHRA_DSP", SDT_MipsSHIFT_DSP>;
8997def MipsSHRL_DSP : MipsDSPBase<"SHRL_DSP", SDT_MipsSHIFT_DSP>;
98+
99+ // DSP setcc and select_cc nodes.
90100def MipsSETCC_DSP : MipsDSPBase<"SETCC_DSP", SDTSetCC>;
91101def MipsSELECT_CC_DSP : MipsDSPBase<"SELECT_CC_DSP", SDTSelectCC>;
92102
@@ -464,12 +474,12 @@ class WRDSP_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
464474 string BaseOpcode = instr_asm;
465475}
466476
467- class DPA_W_PH_DESC_BASE <string instr_asm, SDPatternOperator OpNode> {
477+ class DPA_DESC_BASE <string instr_asm, SDPatternOperator OpNode, ValueType VT > {
468478 dag OutOperandList = (outs ACC64DSPOpnd:$ac);
469- dag InOperandList = (ins GPR32Opnd :$rs, GPR32Opnd :$rt, ACC64DSPOpnd:$acin);
479+ dag InOperandList = (ins DSPROpnd :$rs, DSPROpnd :$rt, ACC64DSPOpnd:$acin);
470480 string AsmString = !strconcat(instr_asm, "\t$ac, $rs, $rt");
471481 list<dag> Pattern = [(set ACC64DSPOpnd:$ac,
472- (OpNode GPR32Opnd :$rs, GPR32Opnd :$rt, ACC64DSPOpnd:$acin))];
482+ (OpNode VT :$rs, VT :$rt, ACC64DSPOpnd:$acin))];
473483 string Constraints = "$acin = $ac";
474484 string BaseOpcode = instr_asm;
475485}
@@ -762,20 +772,20 @@ class MULQ_RS_PH_DESC : ADDU_QB_DESC_BASE<"mulq_rs.ph", int_mips_mulq_rs_ph,
762772 NoItinerary, DSPROpnd, DSPROpnd>,
763773 IsCommutable, Defs<[DSPOutFlag21]>;
764774
765- class MULSAQ_S_W_PH_DESC : DPA_W_PH_DESC_BASE <"mulsaq_s.w.ph",
766- MipsMULSAQ_S_W_PH>,
775+ class MULSAQ_S_W_PH_DESC : DPA_DESC_BASE <"mulsaq_s.w.ph",
776+ MipsMULSAQ_S_W_PH, v2i16 >,
767777 Defs<[DSPOutFlag16_19]>;
768778
769- class MAQ_S_W_PHL_DESC : DPA_W_PH_DESC_BASE <"maq_s.w.phl", MipsMAQ_S_W_PHL>,
779+ class MAQ_S_W_PHL_DESC : DPA_DESC_BASE <"maq_s.w.phl", MipsMAQ_S_W_PHL, v2i16 >,
770780 Defs<[DSPOutFlag16_19]>;
771781
772- class MAQ_S_W_PHR_DESC : DPA_W_PH_DESC_BASE <"maq_s.w.phr", MipsMAQ_S_W_PHR>,
782+ class MAQ_S_W_PHR_DESC : DPA_DESC_BASE <"maq_s.w.phr", MipsMAQ_S_W_PHR, v2i16 >,
773783 Defs<[DSPOutFlag16_19]>;
774784
775- class MAQ_SA_W_PHL_DESC : DPA_W_PH_DESC_BASE <"maq_sa.w.phl", MipsMAQ_SA_W_PHL>,
785+ class MAQ_SA_W_PHL_DESC : DPA_DESC_BASE <"maq_sa.w.phl", MipsMAQ_SA_W_PHL, v2i16 >,
776786 Defs<[DSPOutFlag16_19]>;
777787
778- class MAQ_SA_W_PHR_DESC : DPA_W_PH_DESC_BASE <"maq_sa.w.phr", MipsMAQ_SA_W_PHR>,
788+ class MAQ_SA_W_PHR_DESC : DPA_DESC_BASE <"maq_sa.w.phr", MipsMAQ_SA_W_PHR, v2i16 >,
779789 Defs<[DSPOutFlag16_19]>;
780790
781791// Move from/to hi/lo.
@@ -785,24 +795,24 @@ class MTHI_DESC : MTHI_DESC_BASE<"mthi", HI32DSPOpnd, NoItinerary>;
785795class MTLO_DESC : MTHI_DESC_BASE<"mtlo", LO32DSPOpnd, NoItinerary>;
786796
787797// Dot product with accumulate/subtract
788- class DPAU_H_QBL_DESC : DPA_W_PH_DESC_BASE <"dpau.h.qbl", MipsDPAU_H_QBL>;
798+ class DPAU_H_QBL_DESC : DPA_DESC_BASE <"dpau.h.qbl", MipsDPAU_H_QBL, v4i8 >;
789799
790- class DPAU_H_QBR_DESC : DPA_W_PH_DESC_BASE <"dpau.h.qbr", MipsDPAU_H_QBR>;
800+ class DPAU_H_QBR_DESC : DPA_DESC_BASE <"dpau.h.qbr", MipsDPAU_H_QBR, v4i8 >;
791801
792- class DPSU_H_QBL_DESC : DPA_W_PH_DESC_BASE <"dpsu.h.qbl", MipsDPSU_H_QBL>;
802+ class DPSU_H_QBL_DESC : DPA_DESC_BASE <"dpsu.h.qbl", MipsDPSU_H_QBL, v4i8 >;
793803
794- class DPSU_H_QBR_DESC : DPA_W_PH_DESC_BASE <"dpsu.h.qbr", MipsDPSU_H_QBR>;
804+ class DPSU_H_QBR_DESC : DPA_DESC_BASE <"dpsu.h.qbr", MipsDPSU_H_QBR, v4i8 >;
795805
796- class DPAQ_S_W_PH_DESC : DPA_W_PH_DESC_BASE <"dpaq_s.w.ph", MipsDPAQ_S_W_PH>,
806+ class DPAQ_S_W_PH_DESC : DPA_DESC_BASE <"dpaq_s.w.ph", MipsDPAQ_S_W_PH, v2i16 >,
797807 Defs<[DSPOutFlag16_19]>;
798808
799- class DPSQ_S_W_PH_DESC : DPA_W_PH_DESC_BASE <"dpsq_s.w.ph", MipsDPSQ_S_W_PH>,
809+ class DPSQ_S_W_PH_DESC : DPA_DESC_BASE <"dpsq_s.w.ph", MipsDPSQ_S_W_PH, v2i16 >,
800810 Defs<[DSPOutFlag16_19]>;
801811
802- class DPAQ_SA_L_W_DESC : DPA_W_PH_DESC_BASE <"dpaq_sa.l.w", MipsDPAQ_SA_L_W>,
812+ class DPAQ_SA_L_W_DESC : DPA_DESC_BASE <"dpaq_sa.l.w", MipsDPAQ_SA_L_W, i32 >,
803813 Defs<[DSPOutFlag16_19]>;
804814
805- class DPSQ_SA_L_W_DESC : DPA_W_PH_DESC_BASE <"dpsq_sa.l.w", MipsDPSQ_SA_L_W>,
815+ class DPSQ_SA_L_W_DESC : DPA_DESC_BASE <"dpsq_sa.l.w", MipsDPSQ_SA_L_W, i32 >,
806816 Defs<[DSPOutFlag16_19]>;
807817
808818class MULT_DSP_DESC : MULT_DESC_BASE<"mult", MipsMult, NoItinerary>;
@@ -1034,29 +1044,29 @@ class MULQ_S_PH_DESC : ADDU_QB_DESC_BASE<"mulq_s.ph", int_mips_mulq_s_ph,
10341044 IsCommutable, Defs<[DSPOutFlag21]>;
10351045
10361046// Dot product with accumulate/subtract
1037- class DPA_W_PH_DESC : DPA_W_PH_DESC_BASE <"dpa.w.ph", MipsDPA_W_PH>;
1047+ class DPA_W_PH_DESC : DPA_DESC_BASE <"dpa.w.ph", MipsDPA_W_PH, v2i16 >;
10381048
1039- class DPS_W_PH_DESC : DPA_W_PH_DESC_BASE <"dps.w.ph", MipsDPS_W_PH>;
1049+ class DPS_W_PH_DESC : DPA_DESC_BASE <"dps.w.ph", MipsDPS_W_PH, v2i16 >;
10401050
1041- class DPAQX_S_W_PH_DESC : DPA_W_PH_DESC_BASE <"dpaqx_s.w.ph", MipsDPAQX_S_W_PH>,
1051+ class DPAQX_S_W_PH_DESC : DPA_DESC_BASE <"dpaqx_s.w.ph", MipsDPAQX_S_W_PH, v2i16 >,
10421052 Defs<[DSPOutFlag16_19]>;
10431053
1044- class DPAQX_SA_W_PH_DESC : DPA_W_PH_DESC_BASE <"dpaqx_sa.w.ph",
1045- MipsDPAQX_SA_W_PH>,
1054+ class DPAQX_SA_W_PH_DESC : DPA_DESC_BASE <"dpaqx_sa.w.ph",
1055+ MipsDPAQX_SA_W_PH, v2i16 >,
10461056 Defs<[DSPOutFlag16_19]>;
10471057
1048- class DPAX_W_PH_DESC : DPA_W_PH_DESC_BASE <"dpax.w.ph", MipsDPAX_W_PH>;
1058+ class DPAX_W_PH_DESC : DPA_DESC_BASE <"dpax.w.ph", MipsDPAX_W_PH, v2i16 >;
10491059
1050- class DPSX_W_PH_DESC : DPA_W_PH_DESC_BASE <"dpsx.w.ph", MipsDPSX_W_PH>;
1060+ class DPSX_W_PH_DESC : DPA_DESC_BASE <"dpsx.w.ph", MipsDPSX_W_PH, v2i16 >;
10511061
1052- class DPSQX_S_W_PH_DESC : DPA_W_PH_DESC_BASE <"dpsqx_s.w.ph", MipsDPSQX_S_W_PH>,
1062+ class DPSQX_S_W_PH_DESC : DPA_DESC_BASE <"dpsqx_s.w.ph", MipsDPSQX_S_W_PH, v2i16 >,
10531063 Defs<[DSPOutFlag16_19]>;
10541064
1055- class DPSQX_SA_W_PH_DESC : DPA_W_PH_DESC_BASE <"dpsqx_sa.w.ph",
1056- MipsDPSQX_SA_W_PH>,
1065+ class DPSQX_SA_W_PH_DESC : DPA_DESC_BASE <"dpsqx_sa.w.ph",
1066+ MipsDPSQX_SA_W_PH, v2i16 >,
10571067 Defs<[DSPOutFlag16_19]>;
10581068
1059- class MULSA_W_PH_DESC : DPA_W_PH_DESC_BASE <"mulsa.w.ph", MipsMULSA_W_PH>;
1069+ class MULSA_W_PH_DESC : DPA_DESC_BASE <"mulsa.w.ph", MipsMULSA_W_PH, v2i16 >;
10601070
10611071// Precision reduce/expand
10621072class PRECR_QB_PH_DESC : CMP_EQ_QB_R3_DESC_BASE<"precr.qb.ph",
0 commit comments