mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-19 19:29:31 +00:00
add an option to turn on LSR.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26080 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
239862ce99
commit
9413678f91
@ -493,6 +493,7 @@ def UMULrr : F3_1<2, 0b001010,
|
|||||||
def UMULri : F3_2<2, 0b001010,
|
def UMULri : F3_2<2, 0b001010,
|
||||||
(ops IntRegs:$dst, IntRegs:$b, i32imm:$c),
|
(ops IntRegs:$dst, IntRegs:$b, i32imm:$c),
|
||||||
"umul $b, $c, $dst", []>;
|
"umul $b, $c, $dst", []>;
|
||||||
|
|
||||||
def SMULrr : F3_1<2, 0b001011,
|
def SMULrr : F3_1<2, 0b001011,
|
||||||
(ops IntRegs:$dst, IntRegs:$b, IntRegs:$c),
|
(ops IntRegs:$dst, IntRegs:$b, IntRegs:$c),
|
||||||
"smul $b, $c, $dst",
|
"smul $b, $c, $dst",
|
||||||
@ -502,6 +503,61 @@ def SMULri : F3_2<2, 0b001011,
|
|||||||
"smul $b, $c, $dst",
|
"smul $b, $c, $dst",
|
||||||
[(set IntRegs:$dst, (mul IntRegs:$b, simm13:$c))]>;
|
[(set IntRegs:$dst, (mul IntRegs:$b, simm13:$c))]>;
|
||||||
|
|
||||||
|
/*
|
||||||
|
//===-------------------------
|
||||||
|
// Sparc Example
|
||||||
|
defm intinst<id OPC1, id OPC2, bits Opc, string asmstr, SDNode code> {
|
||||||
|
def OPC1 : F3_1<2, Opc, asmstr, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c),
|
||||||
|
[(set IntRegs:$dst, (code IntRegs:$b, IntRegs:$c))]>;
|
||||||
|
def OPC2 : F3_2<2, Opc, asmstr, (ops IntRegs:$dst, IntRegs:$b, i32imm:$c),
|
||||||
|
[(set IntRegs:$dst, (code IntRegs:$b, simm13:$c))]>;
|
||||||
|
}
|
||||||
|
defm intinst_np<id OPC1, id OPC2, bits Opc, string asmstr> {
|
||||||
|
def OPC1 : F3_1<2, Opc, asmstr, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c),
|
||||||
|
[]>;
|
||||||
|
def OPC2 : F3_2<2, Opc, asmstr, (ops IntRegs:$dst, IntRegs:$b, i32imm:$c),
|
||||||
|
[]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
def intinstnp< ADDXrr, ADDXri, 0b001000, "addx $b, $c, $dst">;
|
||||||
|
def intinst < SUBrr, SUBri, 0b000100, "sub $b, $c, $dst", sub>;
|
||||||
|
def intinstnp< SUBXrr, SUBXri, 0b001100, "subx $b, $c, $dst">;
|
||||||
|
def intinst <SUBCCrr, SUBCCri, 0b010100, "subcc $b, $c, $dst", SPcmpicc>;
|
||||||
|
def intinst < SMULrr, SMULri, 0b001011, "smul $b, $c, $dst", mul>;
|
||||||
|
|
||||||
|
//===-------------------------
|
||||||
|
// X86 Example
|
||||||
|
defm cmov32<id OPC1, id OPC2, int opc, string asmstr, PatLeaf cond> {
|
||||||
|
def OPC1 : I<opc, MRMSrcReg, (ops R32:$dst, R32:$src1, R32:$src2),
|
||||||
|
asmstr+" {$src2, $dst|$dst, $src2}",
|
||||||
|
[(set R32:$dst, (X86cmov R32:$src1, R32:$src2, cond))]>, TB;
|
||||||
|
def OPC2 : I<opc, MRMSrcMem, (ops R32:$dst, R32:$src1, i32mem:$src2),
|
||||||
|
asmstr+" {$src2, $dst|$dst, $src2}",
|
||||||
|
[(set R32:$dst, (X86cmov R32:$src1,
|
||||||
|
(loadi32 addr:$src2), cond))]>, TB;
|
||||||
|
}
|
||||||
|
|
||||||
|
def cmov<CMOVL32rr, CMOVL32rm, 0x4C, "cmovl", X86_COND_L>;
|
||||||
|
def cmov<CMOVB32rr, CMOVB32rm, 0x4C, "cmovb", X86_COND_B>;
|
||||||
|
|
||||||
|
//===-------------------------
|
||||||
|
// PPC Example
|
||||||
|
|
||||||
|
def fpunop<id OPC1, id OPC2, id FORM, int op1, int op2, int op3, string asmstr,
|
||||||
|
SDNode code> {
|
||||||
|
def OPC1 : FORM<op1, op3, (ops F4RC:$frD, F4RC:$frB),
|
||||||
|
asmstr+" $frD, $frB", FPGeneral,
|
||||||
|
[(set F4RC:$frD, (code F4RC:$frB))]>;
|
||||||
|
def OPC2 : FORM<op2, op3, (ops F8RC:$frD, F8RC:$frB),
|
||||||
|
asmstr+" $frD, $frB", FPGeneral,
|
||||||
|
[(set F8RC:$frD, (code F8RC:$frB))]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
def fpunop< FABSS, FABSD, XForm_26, 63, 63, 264, "fabs", fabs>;
|
||||||
|
def fpunop<FNABSS, FNABSD, XForm_26, 63, 63, 136, "fnabs", fnabs>;
|
||||||
|
def fpunop< FNEGS, FNEGD, XForm_26, 63, 63, 40, "fneg", fneg>;
|
||||||
|
*/
|
||||||
|
|
||||||
// Section B.19 - Divide Instructions, p. 115
|
// Section B.19 - Divide Instructions, p. 115
|
||||||
def UDIVrr : F3_1<2, 0b001110,
|
def UDIVrr : F3_1<2, 0b001110,
|
||||||
(ops IntRegs:$dst, IntRegs:$b, IntRegs:$c),
|
(ops IntRegs:$dst, IntRegs:$b, IntRegs:$c),
|
||||||
|
@ -27,6 +27,8 @@ using namespace llvm;
|
|||||||
namespace {
|
namespace {
|
||||||
// Register the target.
|
// Register the target.
|
||||||
RegisterTarget<SparcTargetMachine> X("sparc", " SPARC");
|
RegisterTarget<SparcTargetMachine> X("sparc", " SPARC");
|
||||||
|
|
||||||
|
cl::opt<bool> EnableLSR("enable-sparc-lsr", cl::Hidden);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// SparcTargetMachine ctor - Create an ILP32 architecture model
|
/// SparcTargetMachine ctor - Create an ILP32 architecture model
|
||||||
@ -65,6 +67,9 @@ bool SparcTargetMachine::addPassesToEmitFile(PassManager &PM, std::ostream &Out,
|
|||||||
bool Fast) {
|
bool Fast) {
|
||||||
if (FileType != TargetMachine::AssemblyFile) return true;
|
if (FileType != TargetMachine::AssemblyFile) return true;
|
||||||
|
|
||||||
|
// Run loop strength reduction before anything else.
|
||||||
|
if (EnableLSR && !Fast) PM.add(createLoopStrengthReducePass());
|
||||||
|
|
||||||
// FIXME: Implement efficient support for garbage collection intrinsics.
|
// FIXME: Implement efficient support for garbage collection intrinsics.
|
||||||
PM.add(createLowerGCPass());
|
PM.add(createLowerGCPass());
|
||||||
|
|
||||||
@ -73,7 +78,7 @@ bool SparcTargetMachine::addPassesToEmitFile(PassManager &PM, std::ostream &Out,
|
|||||||
|
|
||||||
// FIXME: implement the switch instruction in the instruction selector.
|
// FIXME: implement the switch instruction in the instruction selector.
|
||||||
PM.add(createLowerSwitchPass());
|
PM.add(createLowerSwitchPass());
|
||||||
|
|
||||||
// Print LLVM code input to instruction selector:
|
// Print LLVM code input to instruction selector:
|
||||||
if (PrintMachineCode)
|
if (PrintMachineCode)
|
||||||
PM.add(new PrintFunctionPass());
|
PM.add(new PrintFunctionPass());
|
||||||
|
Loading…
Reference in New Issue
Block a user