diff --git a/lib/Target/Sparc/SparcInstrFormats.td b/lib/Target/Sparc/SparcInstrFormats.td index 503a0ec202e..ace4a9c6b5f 100644 --- a/lib/Target/Sparc/SparcInstrFormats.td +++ b/lib/Target/Sparc/SparcInstrFormats.td @@ -21,11 +21,12 @@ class F2 : InstV8 { // Format 2 instructions // Specific F2 classes: SparcV8 manual, page 44 // -class F2_1 op2Val, dag ops, string asmstr> : F2 { +class F2_1 op2Val, dag ops, string asmstr, list pattern> : F2 { bits<5> rd; dag OperandList = ops; let AsmString = asmstr; + let Pattern = pattern; let op2 = op2Val; diff --git a/lib/Target/Sparc/SparcInstrInfo.td b/lib/Target/Sparc/SparcInstrInfo.td index 53d62d05015..bc6938b1fde 100644 --- a/lib/Target/Sparc/SparcInstrInfo.td +++ b/lib/Target/Sparc/SparcInstrInfo.td @@ -39,6 +39,15 @@ def simm13 : PatLeaf<(imm), [{ return (((int)N->getValue() << (32-13)) >> (32-13)) == (int)N->getValue(); }]>; +def HI22 : SDNodeXFormgetTargetConstant((unsigned)N->getValue() >> 10, MVT::i32); +}]>; + +def SETHIimm : PatLeaf<(imm), [{ + return (((unsigned)N->getValue() >> 10) << 10) == (unsigned)N->getValue(); +}], HI22>; + //===----------------------------------------------------------------------===// // Instructions //===----------------------------------------------------------------------===// @@ -160,12 +169,13 @@ def STDFQri : F3_2<3, 0b100110, // Section B.9 - SETHI Instruction, p. 104 def SETHIi: F2_1<0b100, (ops IntRegs:$dst, i32imm:$src), - "sethi $src, $dst">; + "sethi $src, $dst", + [(set IntRegs:$dst, SETHIimm:$src)]>; // Section B.10 - NOP Instruction, p. 105 // (It's a special case of SETHI) let rd = 0, imm22 = 0 in - def NOP : F2_1<0b100, (ops), "nop">; + def NOP : F2_1<0b100, (ops), "nop", []>; // Section B.11 - Logical Instructions, p. 106 def ANDrr : F3_1<2, 0b000001, diff --git a/lib/Target/SparcV8/SparcV8InstrFormats.td b/lib/Target/SparcV8/SparcV8InstrFormats.td index 503a0ec202e..ace4a9c6b5f 100644 --- a/lib/Target/SparcV8/SparcV8InstrFormats.td +++ b/lib/Target/SparcV8/SparcV8InstrFormats.td @@ -21,11 +21,12 @@ class F2 : InstV8 { // Format 2 instructions // Specific F2 classes: SparcV8 manual, page 44 // -class F2_1 op2Val, dag ops, string asmstr> : F2 { +class F2_1 op2Val, dag ops, string asmstr, list pattern> : F2 { bits<5> rd; dag OperandList = ops; let AsmString = asmstr; + let Pattern = pattern; let op2 = op2Val; diff --git a/lib/Target/SparcV8/SparcV8InstrInfo.td b/lib/Target/SparcV8/SparcV8InstrInfo.td index 53d62d05015..bc6938b1fde 100644 --- a/lib/Target/SparcV8/SparcV8InstrInfo.td +++ b/lib/Target/SparcV8/SparcV8InstrInfo.td @@ -39,6 +39,15 @@ def simm13 : PatLeaf<(imm), [{ return (((int)N->getValue() << (32-13)) >> (32-13)) == (int)N->getValue(); }]>; +def HI22 : SDNodeXFormgetTargetConstant((unsigned)N->getValue() >> 10, MVT::i32); +}]>; + +def SETHIimm : PatLeaf<(imm), [{ + return (((unsigned)N->getValue() >> 10) << 10) == (unsigned)N->getValue(); +}], HI22>; + //===----------------------------------------------------------------------===// // Instructions //===----------------------------------------------------------------------===// @@ -160,12 +169,13 @@ def STDFQri : F3_2<3, 0b100110, // Section B.9 - SETHI Instruction, p. 104 def SETHIi: F2_1<0b100, (ops IntRegs:$dst, i32imm:$src), - "sethi $src, $dst">; + "sethi $src, $dst", + [(set IntRegs:$dst, SETHIimm:$src)]>; // Section B.10 - NOP Instruction, p. 105 // (It's a special case of SETHI) let rd = 0, imm22 = 0 in - def NOP : F2_1<0b100, (ops), "nop">; + def NOP : F2_1<0b100, (ops), "nop", []>; // Section B.11 - Logical Instructions, p. 106 def ANDrr : F3_1<2, 0b000001,