mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
Add 64-bit versions of LEA_ADDiu and DynAlloc. Modify LowerDYNAMIC_STACKALLOC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144370 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
642b109713
commit
c742e4fc90
@ -171,6 +171,12 @@ def MFLO64 : MoveFromLOHI<0x12, "mflo", CPU64Regs, [LO64]>;
|
||||
def DCLZ : CountLeading0<0x24, "dclz", CPU64Regs>;
|
||||
def DCLO : CountLeading1<0x25, "dclo", CPU64Regs>;
|
||||
|
||||
def LEA_ADDiu64 : EffectiveAddress<"addiu\t$rt, $addr", CPU64Regs, mem_ea_64>;
|
||||
|
||||
let Uses = [SP_64] in
|
||||
def DynAlloc64 : EffectiveAddress<"daddiu\t$rt, $addr", CPU64Regs, mem_ea_64>,
|
||||
Requires<[IsN64]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Arbitrary patterns that map to one or more instructions
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -200,6 +206,9 @@ defm : SetgtPats<CPU64Regs, SLT64, SLTu64>;
|
||||
defm : SetgePats<CPU64Regs, SLT64, SLTu64>;
|
||||
defm : SetgeImmPats<CPU64Regs, SLTi64, SLTiu64>;
|
||||
|
||||
// select MipsDynAlloc
|
||||
def : Pat<(MipsDynAlloc addr:$f), (DynAlloc64 addr:$f)>, Requires<[IsN64]>;
|
||||
|
||||
// truncate
|
||||
def : Pat<(i32 (trunc CPU64Regs:$src)),
|
||||
(SLL (EXTRACT_SUBREG CPU64Regs:$src, sub_32), 0)>, Requires<[IsN64]>;
|
||||
|
@ -1295,6 +1295,7 @@ LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const
|
||||
{
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
|
||||
unsigned SP = IsN64 ? Mips::SP_64 : Mips::SP;
|
||||
|
||||
assert(getTargetMachine().getFrameLowering()->getStackAlignment() >=
|
||||
cast<ConstantSDNode>(Op.getOperand(2).getNode())->getZExtValue() &&
|
||||
@ -1306,20 +1307,19 @@ LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
|
||||
// Get a reference from Mips stack pointer
|
||||
SDValue StackPointer = DAG.getCopyFromReg(Chain, dl, Mips::SP, MVT::i32);
|
||||
SDValue StackPointer = DAG.getCopyFromReg(Chain, dl, SP, getPointerTy());
|
||||
|
||||
// Subtract the dynamic size from the actual stack size to
|
||||
// obtain the new stack size.
|
||||
SDValue Sub = DAG.getNode(ISD::SUB, dl, MVT::i32, StackPointer, Size);
|
||||
SDValue Sub = DAG.getNode(ISD::SUB, dl, getPointerTy(), StackPointer, Size);
|
||||
|
||||
// The Sub result contains the new stack start address, so it
|
||||
// must be placed in the stack pointer register.
|
||||
Chain = DAG.getCopyToReg(StackPointer.getValue(1), dl, Mips::SP, Sub,
|
||||
SDValue());
|
||||
Chain = DAG.getCopyToReg(StackPointer.getValue(1), dl, SP, Sub, SDValue());
|
||||
|
||||
// This node always has two return values: a new stack pointer
|
||||
// value and a chain
|
||||
SDVTList VTLs = DAG.getVTList(MVT::i32, MVT::Other);
|
||||
SDVTList VTLs = DAG.getVTList(getPointerTy(), MVT::Other);
|
||||
SDValue Ptr = DAG.getFrameIndex(MipsFI->getDynAllocFI(), getPointerTy());
|
||||
SDValue Ops[] = { Chain, Ptr, Chain.getValue(1) };
|
||||
|
||||
|
@ -39,8 +39,8 @@ def SDT_MipsDivRem : SDTypeProfile<0, 2,
|
||||
|
||||
def SDT_MipsThreadPointer : SDTypeProfile<1, 0, [SDTCisPtrTy<0>]>;
|
||||
|
||||
def SDT_MipsDynAlloc : SDTypeProfile<1, 1, [SDTCisVT<0, i32>,
|
||||
SDTCisVT<1, iPTR>]>;
|
||||
def SDT_MipsDynAlloc : SDTypeProfile<1, 1, [SDTCisVT<0, iPTR>,
|
||||
SDTCisSameAs<0, 1>]>;
|
||||
def SDT_Sync : SDTypeProfile<0, 1, [SDTCisVT<0, i32>]>;
|
||||
|
||||
def SDT_Ext : SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisSameAs<0, 1>,
|
||||
@ -168,6 +168,12 @@ def mem_ea : Operand<i32> {
|
||||
let EncoderMethod = "getMemEncoding";
|
||||
}
|
||||
|
||||
def mem_ea_64 : Operand<i64> {
|
||||
let PrintMethod = "printMemOperandEA";
|
||||
let MIOperandInfo = (ops CPU64Regs, simm16_64);
|
||||
let EncoderMethod = "getMemEncoding";
|
||||
}
|
||||
|
||||
// size operand of ext instruction
|
||||
def size_ext : Operand<i32> {
|
||||
let EncoderMethod = "getSizeExtEncoding";
|
||||
@ -526,9 +532,9 @@ class MoveToLOHI<bits<6> func, string instr_asm, RegisterClass RC,
|
||||
let Defs = DefRegs;
|
||||
}
|
||||
|
||||
class EffectiveAddress<string instr_asm> :
|
||||
FMem<0x09, (outs CPURegs:$rt), (ins mem_ea:$addr),
|
||||
instr_asm, [(set CPURegs:$rt, addr:$addr)], IIAlu>;
|
||||
class EffectiveAddress<string instr_asm, RegisterClass RC, Operand Mem> :
|
||||
FMem<0x09, (outs RC:$rt), (ins Mem:$addr),
|
||||
instr_asm, [(set RC:$rt, addr:$addr)], IIAlu>;
|
||||
|
||||
// Count Leading Ones/Zeros in Word
|
||||
class CountLeading0<bits<6> func, string instr_asm, RegisterClass RC>:
|
||||
@ -799,13 +805,13 @@ let addr=0 in
|
||||
// instructions. The same not happens for stack address copies, so an
|
||||
// add op with mem ComplexPattern is used and the stack address copy
|
||||
// can be matched. It's similar to Sparc LEA_ADDRi
|
||||
def LEA_ADDiu : EffectiveAddress<"addiu\t$rt, $addr">;
|
||||
def LEA_ADDiu : EffectiveAddress<"addiu\t$rt, $addr", CPURegs, mem_ea>;
|
||||
|
||||
// DynAlloc node points to dynamically allocated stack space.
|
||||
// $sp is added to the list of implicitly used registers to prevent dead code
|
||||
// elimination from removing instructions that modify $sp.
|
||||
let Uses = [SP] in
|
||||
def DynAlloc : EffectiveAddress<"addiu\t$rt, $addr">;
|
||||
def DynAlloc : EffectiveAddress<"addiu\t$rt, $addr", CPURegs, mem_ea>;
|
||||
|
||||
// MADD*/MSUB*
|
||||
def MADD : MArithR<0, "madd", MipsMAdd, 1>;
|
||||
|
Loading…
Reference in New Issue
Block a user