@@ -133,6 +133,26 @@ def SBF_CC_LTU : PatLeaf<(i64 imm),
133133 [{return (N->getZExtValue() == ISD::SETULT);}]>;
134134def SBF_CC_LEU : PatLeaf<(i64 imm),
135135 [{return (N->getZExtValue() == ISD::SETULE);}]>;
136+ def SBF_CC_EQ_32 : PatLeaf<(i32 imm),
137+ [{return (N->getZExtValue() == ISD::SETEQ);}]>;
138+ def SBF_CC_NE_32 : PatLeaf<(i32 imm),
139+ [{return (N->getZExtValue() == ISD::SETNE);}]>;
140+ def SBF_CC_GE_32 : PatLeaf<(i32 imm),
141+ [{return (N->getZExtValue() == ISD::SETGE);}]>;
142+ def SBF_CC_GT_32 : PatLeaf<(i32 imm),
143+ [{return (N->getZExtValue() == ISD::SETGT);}]>;
144+ def SBF_CC_GTU_32 : PatLeaf<(i32 imm),
145+ [{return (N->getZExtValue() == ISD::SETUGT);}]>;
146+ def SBF_CC_GEU_32 : PatLeaf<(i32 imm),
147+ [{return (N->getZExtValue() == ISD::SETUGE);}]>;
148+ def SBF_CC_LE_32 : PatLeaf<(i32 imm),
149+ [{return (N->getZExtValue() == ISD::SETLE);}]>;
150+ def SBF_CC_LT_32 : PatLeaf<(i32 imm),
151+ [{return (N->getZExtValue() == ISD::SETLT);}]>;
152+ def SBF_CC_LTU_32 : PatLeaf<(i32 imm),
153+ [{return (N->getZExtValue() == ISD::SETULT);}]>;
154+ def SBF_CC_LEU_32 : PatLeaf<(i32 imm),
155+ [{return (N->getZExtValue() == ISD::SETULE);}]>;
136156
137157// For arithmetic and jump instructions the 8-bit 'code'
138158// field is divided into three parts:
@@ -217,23 +237,59 @@ class JMP_RI<SBFJumpOp Opc, string Mnemonic, PatLeaf Cond>
217237 let SBFClass = SBF_JMP;
218238}
219239
220- multiclass J<SBFJumpOp Opc, string Mnemonic, PatLeaf Cond> {
240+ class JMP_RR_32<SBFJumpOp Opc, string Mnemonic, PatLeaf Cond>
241+ : TYPE_ALU_JMP<Opc.Value, SBF_X.Value,
242+ (outs),
243+ (ins GPR32:$dst, GPR32:$src, brtarget:$BrDst),
244+ Mnemonic # "32 $dst, $src, $BrDst",
245+ [(SBFbrcc i32:$dst, i32:$src, Cond, bb:$BrDst)]> {
246+ bits<4> dst;
247+ bits<4> src;
248+ bits<16> BrDst;
249+
250+ let Inst{55-52} = src;
251+ let Inst{51-48} = dst;
252+ let Inst{47-32} = BrDst;
253+ let SBFClass = SBF_JMP32;
254+ }
255+
256+ class JMP_RI_32<SBFJumpOp Opc, string Mnemonic, PatLeaf Cond>
257+ : TYPE_ALU_JMP<Opc.Value, SBF_K.Value,
258+ (outs),
259+ (ins GPR32:$dst, i32imm:$imm, brtarget:$BrDst),
260+ Mnemonic # "32 $dst, $imm, $BrDst",
261+ [(SBFbrcc i32:$dst, i32immSExt32:$imm, Cond, bb:$BrDst)]> {
262+ bits<4> dst;
263+ bits<16> BrDst;
264+ bits<32> imm;
265+
266+ let Inst{51-48} = dst;
267+ let Inst{47-32} = BrDst;
268+ let Inst{31-0} = imm;
269+ let SBFClass = SBF_JMP32;
270+ }
271+
272+ multiclass J<SBFJumpOp Opc, string Mnemonic, PatLeaf Cond, PatLeaf Cond32> {
221273 def _rr : JMP_RR<Opc, Mnemonic, Cond>;
222274 def _ri : JMP_RI<Opc, Mnemonic, Cond>;
275+ let DecoderNamespace = "SBFv3" in {
276+ def _rr_32 : JMP_RR_32<Opc, Mnemonic, Cond32>;
277+ def _ri_32 : JMP_RI_32<Opc, Mnemonic, Cond32>;
278+ }
223279}
224280
225281let isBranch = 1, isTerminator = 1, hasDelaySlot=0 in {
226282// cmp+goto instructions
227- defm JEQ : J<SBF_JEQ, "jeq", SBF_CC_EQ>;
228- defm JUGT : J<SBF_JGT, "jgt", SBF_CC_GTU>;
229- defm JUGE : J<SBF_JGE, "jge", SBF_CC_GEU>;
230- defm JNE : J<SBF_JNE, "jne", SBF_CC_NE>;
231- defm JSGT : J<SBF_JSGT, "jsgt", SBF_CC_GT>;
232- defm JSGE : J<SBF_JSGE, "jsge", SBF_CC_GE>;
233- defm JULT : J<SBF_JLT, "jlt", SBF_CC_LTU>;
234- defm JULE : J<SBF_JLE, "jle", SBF_CC_LEU>;
235- defm JSLT : J<SBF_JSLT, "jslt", SBF_CC_LT>;
236- defm JSLE : J<SBF_JSLE, "jsle", SBF_CC_LE>;
283+ defm JEQ : J<SBF_JEQ, "jeq", SBF_CC_EQ, SBF_CC_EQ_32 >;
284+ defm JUGT : J<SBF_JGT, "jgt", SBF_CC_GTU, SBF_CC_GTU_32 >;
285+ defm JUGE : J<SBF_JGE, "jge", SBF_CC_GEU, SBF_CC_GEU_32 >;
286+ defm JNE : J<SBF_JNE, "jne", SBF_CC_NE, SBF_CC_NE_32 >;
287+ defm JSGT : J<SBF_JSGT, "jsgt", SBF_CC_GT, SBF_CC_GT_32 >;
288+ defm JSGE : J<SBF_JSGE, "jsge", SBF_CC_GE, SBF_CC_GE_32 >;
289+ defm JULT : J<SBF_JLT, "jlt", SBF_CC_LTU, SBF_CC_LTU_32 >;
290+ defm JULE : J<SBF_JLE, "jle", SBF_CC_LEU, SBF_CC_LEU_32 >;
291+ defm JSLT : J<SBF_JSLT, "jslt", SBF_CC_LT, SBF_CC_LT_32 >;
292+ defm JSLE : J<SBF_JSLE, "jsle", SBF_CC_LE, SBF_CC_LE_32 >;
237293}
238294
239295// ALU instructions
0 commit comments