mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95506 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			161 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===-- MipsISelLowering.h - Mips DAG Lowering Interface --------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file defines the interfaces that Mips uses to lower LLVM code into a
 | |
| // selection DAG.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef MipsISELLOWERING_H
 | |
| #define MipsISELLOWERING_H
 | |
| 
 | |
| #include "llvm/CodeGen/SelectionDAG.h"
 | |
| #include "llvm/Target/TargetLowering.h"
 | |
| #include "Mips.h"
 | |
| #include "MipsSubtarget.h"
 | |
| 
 | |
| namespace llvm {
 | |
|   namespace MipsISD {
 | |
|     enum NodeType {
 | |
|       // Start the numbering from where ISD NodeType finishes.
 | |
|       FIRST_NUMBER = ISD::BUILTIN_OP_END,
 | |
| 
 | |
|       // Jump and link (call)
 | |
|       JmpLink,
 | |
| 
 | |
|       // Get the Higher 16 bits from a 32-bit immediate
 | |
|       // No relation with Mips Hi register
 | |
|       Hi, 
 | |
| 
 | |
|       // Get the Lower 16 bits from a 32-bit immediate
 | |
|       // No relation with Mips Lo register
 | |
|       Lo, 
 | |
| 
 | |
|       // Handle gp_rel (small data/bss sections) relocation.
 | |
|       GPRel,
 | |
| 
 | |
|       // Conditional Move
 | |
|       CMov,
 | |
| 
 | |
|       // Select CC Pseudo Instruction
 | |
|       SelectCC,
 | |
| 
 | |
|       // Floating Point Select CC Pseudo Instruction
 | |
|       FPSelectCC,
 | |
| 
 | |
|       // Floating Point Branch Conditional
 | |
|       FPBrcond,
 | |
| 
 | |
|       // Floating Point Compare
 | |
|       FPCmp,
 | |
| 
 | |
|       // Floating Point Rounding
 | |
|       FPRound,
 | |
| 
 | |
|       // Return 
 | |
|       Ret
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   //===--------------------------------------------------------------------===//
 | |
|   // TargetLowering Implementation
 | |
|   //===--------------------------------------------------------------------===//
 | |
|   
 | |
|   class MipsTargetLowering : public TargetLowering  {
 | |
|     int VarArgsFrameIndex;            // FrameIndex for start of varargs area.
 | |
| 
 | |
|   public:
 | |
| 
 | |
|     explicit MipsTargetLowering(MipsTargetMachine &TM);
 | |
| 
 | |
|     /// LowerOperation - Provide custom lowering hooks for some operations.
 | |
|     virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG);
 | |
| 
 | |
|     /// getTargetNodeName - This method returns the name of a target specific 
 | |
|     //  DAG node.
 | |
|     virtual const char *getTargetNodeName(unsigned Opcode) const;
 | |
| 
 | |
|     /// getSetCCResultType - get the ISD::SETCC result ValueType
 | |
|     MVT::SimpleValueType getSetCCResultType(EVT VT) const;
 | |
| 
 | |
|     /// getFunctionAlignment - Return the Log2 alignment of this function.
 | |
|     virtual unsigned getFunctionAlignment(const Function *F) const;
 | |
|   private:
 | |
|     // Subtarget Info
 | |
|     const MipsSubtarget *Subtarget;
 | |
| 
 | |
| 
 | |
|     // Lower Operand helpers
 | |
|     SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
 | |
|                             CallingConv::ID CallConv, bool isVarArg,
 | |
|                             const SmallVectorImpl<ISD::InputArg> &Ins,
 | |
|                             DebugLoc dl, SelectionDAG &DAG,
 | |
|                             SmallVectorImpl<SDValue> &InVals);
 | |
| 
 | |
|     // Lower Operand specifics
 | |
|     SDValue LowerANDOR(SDValue Op, SelectionDAG &DAG);
 | |
|     SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG);
 | |
|     SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG);
 | |
|     SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG);
 | |
|     SDValue LowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG);
 | |
|     SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG);
 | |
|     SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG);
 | |
|     SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG);
 | |
|     SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG);
 | |
|     SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG);
 | |
|     SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG);
 | |
| 
 | |
|     virtual SDValue
 | |
|       LowerFormalArguments(SDValue Chain,
 | |
|                            CallingConv::ID CallConv, bool isVarArg,
 | |
|                            const SmallVectorImpl<ISD::InputArg> &Ins,
 | |
|                            DebugLoc dl, SelectionDAG &DAG,
 | |
|                            SmallVectorImpl<SDValue> &InVals);
 | |
| 
 | |
|     virtual SDValue
 | |
|       LowerCall(SDValue Chain, SDValue Callee,
 | |
|                 CallingConv::ID CallConv, bool isVarArg,
 | |
|                 bool &isTailCall,
 | |
|                 const SmallVectorImpl<ISD::OutputArg> &Outs,
 | |
|                 const SmallVectorImpl<ISD::InputArg> &Ins,
 | |
|                 DebugLoc dl, SelectionDAG &DAG,
 | |
|                 SmallVectorImpl<SDValue> &InVals);
 | |
| 
 | |
|     virtual SDValue
 | |
|       LowerReturn(SDValue Chain,
 | |
|                   CallingConv::ID CallConv, bool isVarArg,
 | |
|                   const SmallVectorImpl<ISD::OutputArg> &Outs,
 | |
|                   DebugLoc dl, SelectionDAG &DAG);
 | |
| 
 | |
|     virtual MachineBasicBlock *EmitInstrWithCustomInserter(MachineInstr *MI,
 | |
|                                                          MachineBasicBlock *MBB,
 | |
|                     DenseMap<MachineBasicBlock*, MachineBasicBlock*> *EM) const;
 | |
| 
 | |
|     // Inline asm support
 | |
|     ConstraintType getConstraintType(const std::string &Constraint) const;
 | |
| 
 | |
|     std::pair<unsigned, const TargetRegisterClass*> 
 | |
|               getRegForInlineAsmConstraint(const std::string &Constraint,
 | |
|               EVT VT) const;
 | |
| 
 | |
|     std::vector<unsigned>
 | |
|     getRegClassForInlineAsmConstraint(const std::string &Constraint,
 | |
|               EVT VT) const;
 | |
| 
 | |
|     virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
 | |
| 
 | |
|     /// isFPImmLegal - Returns true if the target can instruction select the
 | |
|     /// specified FP immediate natively. If false, the legalizer will
 | |
|     /// materialize the FP immediate as a load from a constant pool.
 | |
|     virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const;
 | |
|   };
 | |
| }
 | |
| 
 | |
| #endif // MipsISELLOWERING_H
 |