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
|
||||
//
|
||||
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;
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user