mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
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
This commit is contained in:
parent
d2cd46676c
commit
57dd3bc460
@ -21,11 +21,12 @@ class F2 : InstV8 { // Format 2 instructions
|
|||||||
|
|
||||||
// Specific F2 classes: SparcV8 manual, page 44
|
// 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;
|
bits<5> rd;
|
||||||
|
|
||||||
dag OperandList = ops;
|
dag OperandList = ops;
|
||||||
let AsmString = asmstr;
|
let AsmString = asmstr;
|
||||||
|
let Pattern = pattern;
|
||||||
|
|
||||||
let op2 = op2Val;
|
let op2 = op2Val;
|
||||||
|
|
||||||
|
@ -39,6 +39,15 @@ def simm13 : PatLeaf<(imm), [{
|
|||||||
return (((int)N->getValue() << (32-13)) >> (32-13)) == (int)N->getValue();
|
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
|
// Instructions
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
@ -160,12 +169,13 @@ def STDFQri : F3_2<3, 0b100110,
|
|||||||
// Section B.9 - SETHI Instruction, p. 104
|
// Section B.9 - SETHI Instruction, p. 104
|
||||||
def SETHIi: F2_1<0b100,
|
def SETHIi: F2_1<0b100,
|
||||||
(ops IntRegs:$dst, i32imm:$src),
|
(ops IntRegs:$dst, i32imm:$src),
|
||||||
"sethi $src, $dst">;
|
"sethi $src, $dst",
|
||||||
|
[(set IntRegs:$dst, SETHIimm:$src)]>;
|
||||||
|
|
||||||
// Section B.10 - NOP Instruction, p. 105
|
// Section B.10 - NOP Instruction, p. 105
|
||||||
// (It's a special case of SETHI)
|
// (It's a special case of SETHI)
|
||||||
let rd = 0, imm22 = 0 in
|
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
|
// Section B.11 - Logical Instructions, p. 106
|
||||||
def ANDrr : F3_1<2, 0b000001,
|
def ANDrr : F3_1<2, 0b000001,
|
||||||
|
@ -21,11 +21,12 @@ class F2 : InstV8 { // Format 2 instructions
|
|||||||
|
|
||||||
// Specific F2 classes: SparcV8 manual, page 44
|
// 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;
|
bits<5> rd;
|
||||||
|
|
||||||
dag OperandList = ops;
|
dag OperandList = ops;
|
||||||
let AsmString = asmstr;
|
let AsmString = asmstr;
|
||||||
|
let Pattern = pattern;
|
||||||
|
|
||||||
let op2 = op2Val;
|
let op2 = op2Val;
|
||||||
|
|
||||||
|
@ -39,6 +39,15 @@ def simm13 : PatLeaf<(imm), [{
|
|||||||
return (((int)N->getValue() << (32-13)) >> (32-13)) == (int)N->getValue();
|
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
|
// Instructions
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
@ -160,12 +169,13 @@ def STDFQri : F3_2<3, 0b100110,
|
|||||||
// Section B.9 - SETHI Instruction, p. 104
|
// Section B.9 - SETHI Instruction, p. 104
|
||||||
def SETHIi: F2_1<0b100,
|
def SETHIi: F2_1<0b100,
|
||||||
(ops IntRegs:$dst, i32imm:$src),
|
(ops IntRegs:$dst, i32imm:$src),
|
||||||
"sethi $src, $dst">;
|
"sethi $src, $dst",
|
||||||
|
[(set IntRegs:$dst, SETHIimm:$src)]>;
|
||||||
|
|
||||||
// Section B.10 - NOP Instruction, p. 105
|
// Section B.10 - NOP Instruction, p. 105
|
||||||
// (It's a special case of SETHI)
|
// (It's a special case of SETHI)
|
||||||
let rd = 0, imm22 = 0 in
|
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
|
// Section B.11 - Logical Instructions, p. 106
|
||||||
def ANDrr : F3_1<2, 0b000001,
|
def ANDrr : F3_1<2, 0b000001,
|
||||||
|
Loading…
Reference in New Issue
Block a user