diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2001-10-22 13:31:53 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2001-10-22 13:31:53 +0000 |
commit | c152163eb46835266a373bfd77068ab1801c28fb (patch) | |
tree | 9c9a524a7c486b3ec1307a80689d5fe80596ddf8 | |
parent | 822695901fce5a010dda2a4d9e0b217ca0e3cfd7 (diff) |
Reordered a couple of registers to simplify some new checks.
Added code to map between caller's and callee's register windows.
Added frame layout class.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@937 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/SparcV9/SparcV9Internals.h | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/lib/Target/SparcV9/SparcV9Internals.h b/lib/Target/SparcV9/SparcV9Internals.h index e19d304495..3564251607 100644 --- a/lib/Target/SparcV9/SparcV9Internals.h +++ b/lib/Target/SparcV9/SparcV9Internals.h @@ -62,7 +62,7 @@ enum SparcMachineOpCode { // End-of-array marker INVALID_OPCODE, - NUM_REAL_OPCODES = RETURN+1, // number of valid opcodes + NUM_REAL_OPCODES = PHI, // number of valid opcodes NUM_TOTAL_OPCODES = INVALID_OPCODE }; @@ -358,13 +358,22 @@ class UltraSparcRegInfo : public MachineRegInfo else if ( reg == 64+32+4) return "xcc"; // only integer cc reg - else if (reg== InvalidRegNum) //****** TODO: Remove + else if (reg== InvalidRegNum) //****** TODO: Remove */ return "<*NoReg*>"; else assert(0 && "Invalid register number"); } - + inline unsigned int getRegNumInCallersWindow(int reg) { + if (reg == InvalidRegNum || reg >= 32) + return reg; + return SparcIntRegOrder::getRegNumInCallersWindow(reg); + } + + inline bool mustBeRemappedInCallersWindow(int reg) { + return (reg != InvalidRegNum && reg < 32); + } + const Value * getCallInstRetVal(const MachineInstr *CallMI) const; MachineInstr * cpReg2RegMI(const unsigned SrcReg, const unsigned DestReg, @@ -813,8 +822,6 @@ const InstrIssueDelta SparcInstrIssueDeltas[] = { { ADDCcc, true, true, 0 }, { SUBC, true, true, 0 }, { SUBCcc, true, true, 0 }, -//{ SAVE, true, true, 0 }, -//{ RESTORE, true, true, 0 }, //{ LDSTUB, true, true, 0 }, //{ SWAP, true, true, 0 }, //{ SWAPA, true, true, 0 }, @@ -848,7 +855,8 @@ const InstrIssueDelta SparcInstrIssueDeltas[] = { // Special cases for breaking group *before* // CURRENTLY NOT SUPPORTED! { CALL, false, false, 0 }, - { JMPL, false, false, 0 }, + { JMPLCALL, false, false, 0 }, + { JMPLRET, false, false, 0 }, // Special cases for breaking the group *after* { MULX, true, true, (4+34)/2 }, @@ -888,7 +896,8 @@ const InstrRUsageDelta SparcInstrUsageDeltas[] = { // // JMPL counts as a load/store instruction for issue! // - { JMPL, LSIssueSlots.rid, 0, 1 }, + { JMPLCALL, LSIssueSlots.rid, 0, 1 }, + { JMPLRET, LSIssueSlots.rid, 0, 1 }, // // Many instructions cannot issue for the next 2 cycles after an FCMP @@ -1093,6 +1102,28 @@ protected: //--------------------------------------------------------------------------- +// class UltraSparcFrameInfo +// +// Purpose: +// Interface to stack frame layout info for the UltraSPARC. +// Note that there is no machine-independent interface to this information +//--------------------------------------------------------------------------- + +class UltraSparcFrameInfo: public NonCopyable { +public: + static const int MinStackFrameSize = 176; + static const int FirstOutgoingArgOffsetFromSP = 128; + static const int FirstOptionalOutgoingArgOffsetFromSP = 176; + static const int StaticStackAreaOffsetFromFP = -1; + + static int getFirstAutomaticVarOffsetFromFP (const Method* method); + static int getRegSpillAreaOffsetFromFP (const Method* method); + static int getFrameSizeBelowDynamicArea (const Method* method); +}; + + + +//--------------------------------------------------------------------------- // class UltraSparcMachine // // Purpose: @@ -1107,6 +1138,7 @@ private: UltraSparcInstrInfo instrInfo; UltraSparcSchedInfo schedInfo; UltraSparcRegInfo regInfo; + UltraSparcFrameInfo frameInfo; public: UltraSparc(); virtual ~UltraSparc() {} @@ -1114,6 +1146,8 @@ public: virtual const MachineInstrInfo &getInstrInfo() const { return instrInfo; } virtual const MachineSchedInfo &getSchedInfo() const { return schedInfo; } virtual const MachineRegInfo &getRegInfo() const { return regInfo; } + const UltraSparcFrameInfo &getFrameInfo() const { return frameInfo; } + // compileMethod - For the sparc, we do instruction selection, followed by // delay slot scheduling, then register allocation. |