aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/Sparc
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-12-17 19:37:00 +0000
committerChris Lattner <sabre@nondot.org>2005-12-17 19:37:00 +0000
commit57dd3bc46049c528858cdd02f76149d9525199fa (patch)
tree48c518af2c4dddc0eaaaa4aca5fed0d767b4c10a /lib/Target/Sparc
parentd2cd46676c697137be7b57c04e3615ba2cdc00b2 (diff)
Use sethi to build large immediates with zeros at the bottom
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24779 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Sparc')
-rw-r--r--lib/Target/Sparc/SparcInstrFormats.td3
-rw-r--r--lib/Target/Sparc/SparcInstrInfo.td14
2 files changed, 14 insertions, 3 deletions
diff --git a/lib/Target/Sparc/SparcInstrFormats.td b/lib/Target/Sparc/SparcInstrFormats.td
index 503a0ec202..ace4a9c6b5 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<bits<3> op2Val, dag ops, string asmstr> : F2 {
+class F2_1<bits<3> op2Val, dag ops, string asmstr, list<dag> 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 53d62d0501..bc6938b1fd 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 : SDNodeXForm<imm, [{
+ // Transformation function: shift the immediate value down into the low bits.
+ return CurDAG->getTargetConstant((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,