@@ -161,12 +161,25 @@ class SM_Discard_Pseudo <string opName, OffsetMode offsets>
161161 let has_soffset = offsets.HasSOffset;
162162}
163163
164+ multiclass SM_Load_Pseudos<string op, RegisterClass baseClass,
165+ RegisterClass dstClass, OffsetMode offsets> {
166+ defvar opName = !tolower(op);
167+ def "" : SM_Load_Pseudo <opName, baseClass, dstClass, offsets>;
168+
169+ // The constrained multi-dword load equivalents with early clobber flag at
170+ // the dst operands. They are needed only for codegen and there is no need
171+ // for their real opcodes.
172+ if !gt(dstClass.RegTypes[0].Size, 32) then
173+ let Constraints = "@earlyclobber $sdst",
174+ PseudoInstr = op # offsets.Variant in
175+ def "" # _ec : SM_Load_Pseudo <opName, baseClass, dstClass, offsets>;
176+ }
177+
164178multiclass SM_Pseudo_Loads<RegisterClass baseClass,
165179 RegisterClass dstClass> {
166- defvar opName = !tolower(NAME);
167- def _IMM : SM_Load_Pseudo <opName, baseClass, dstClass, IMM_Offset>;
168- def _SGPR : SM_Load_Pseudo <opName, baseClass, dstClass, SGPR_Offset>;
169- def _SGPR_IMM : SM_Load_Pseudo <opName, baseClass, dstClass, SGPR_IMM_Offset>;
180+ defm _IMM : SM_Load_Pseudos <NAME, baseClass, dstClass, IMM_Offset>;
181+ defm _SGPR : SM_Load_Pseudos <NAME, baseClass, dstClass, SGPR_Offset>;
182+ defm _SGPR_IMM : SM_Load_Pseudos <NAME, baseClass, dstClass, SGPR_IMM_Offset>;
170183}
171184
172185multiclass SM_Pseudo_Stores<RegisterClass baseClass,
0 commit comments