| //===-- X86ISelLowering.h - X86 DAG Lowering Interface ----------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file was developed by Chris Lattner and is distributed under |
| // the University of Illinois Open Source License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines the interfaces that X86 uses to lower LLVM code into a |
| // selection DAG. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef X86ISELLOWERING_H |
| #define X86ISELLOWERING_H |
| |
| #include "llvm/Target/TargetLowering.h" |
| #include "llvm/CodeGen/SelectionDAG.h" |
| |
| namespace llvm { |
| // X86 Specific DAG Nodes |
| namespace X86ISD { |
| enum NodeType { |
| // Start the numbering where the builtin ops leave off. |
| FIRST_NUMBER = ISD::BUILTIN_OP_END, |
| |
| /// FILD64m - This instruction implements SINT_TO_FP with a |
| /// 64-bit source in memory and a FP reg result. This corresponds to |
| /// the X86::FILD64m instruction. It has two inputs (token chain and |
| /// address) and two outputs (FP value and token chain). |
| FILD64m, |
| |
| /// FP_TO_INT*_IN_MEM - This instruction implements FP_TO_SINT with the |
| /// integer destination in memory and a FP reg source. This corresponds |
| /// to the X86::FIST*m instructions and the rounding mode change stuff. It |
| /// has two inputs (token chain and address) and two outputs (FP value and |
| /// token chain). |
| FP_TO_INT16_IN_MEM, |
| FP_TO_INT32_IN_MEM, |
| FP_TO_INT64_IN_MEM, |
| |
| /// CALL/TAILCALL - These operations represent an abstract X86 call |
| /// instruction, which includes a bunch of information. In particular the |
| /// operands of these node are: |
| /// |
| /// #0 - The incoming token chain |
| /// #1 - The callee |
| /// #2 - The number of arg bytes the caller pushes on the stack. |
| /// #3 - The number of arg bytes the callee pops off the stack. |
| /// #4 - The value to pass in AL/AX/EAX (optional) |
| /// #5 - The value to pass in DL/DX/EDX (optional) |
| /// |
| /// The result values of these nodes are: |
| /// |
| /// #0 - The outgoing token chain |
| /// #1 - The first register result value (optional) |
| /// #2 - The second register result value (optional) |
| /// |
| /// The CALL vs TAILCALL distinction boils down to whether the callee is |
| /// known not to modify the caller's stack frame, as is standard with |
| /// LLVM. |
| CALL, |
| TAILCALL, |
| |
| /// RDTSC_DAG - This operation implements the lowering for |
| /// readcyclecounter |
| RDTSC_DAG, |
| }; |
| } |
| |
| //===----------------------------------------------------------------------===// |
| // X86TargetLowering - X86 Implementation of the TargetLowering interface |
| class X86TargetLowering : public TargetLowering { |
| int VarArgsFrameIndex; // FrameIndex for start of varargs area. |
| int ReturnAddrIndex; // FrameIndex for return slot. |
| int BytesToPopOnReturn; // Number of arg bytes ret should pop. |
| int BytesCallerReserves; // Number of arg bytes caller makes. |
| public: |
| X86TargetLowering(TargetMachine &TM); |
| |
| // Return the number of bytes that a function should pop when it returns (in |
| // addition to the space used by the return address). |
| // |
| unsigned getBytesToPopOnReturn() const { return BytesToPopOnReturn; } |
| |
| // Return the number of bytes that the caller reserves for arguments passed |
| // to this function. |
| unsigned getBytesCallerReserves() const { return BytesCallerReserves; } |
| |
| /// LowerOperation - Provide custom lowering hooks for some operations. |
| /// |
| virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG); |
| |
| /// LowerArguments - This hook must be implemented to indicate how we should |
| /// lower the arguments for the specified function, into the specified DAG. |
| virtual std::vector<SDOperand> |
| LowerArguments(Function &F, SelectionDAG &DAG); |
| |
| /// LowerCallTo - This hook lowers an abstract call to a function into an |
| /// actual call. |
| virtual std::pair<SDOperand, SDOperand> |
| LowerCallTo(SDOperand Chain, const Type *RetTy, bool isVarArg, unsigned CC, |
| bool isTailCall, SDOperand Callee, ArgListTy &Args, |
| SelectionDAG &DAG); |
| |
| virtual SDOperand LowerVAStart(SDOperand Chain, SDOperand VAListP, |
| Value *VAListV, SelectionDAG &DAG); |
| virtual std::pair<SDOperand,SDOperand> |
| LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV, |
| const Type *ArgTy, SelectionDAG &DAG); |
| |
| virtual std::pair<SDOperand, SDOperand> |
| LowerFrameReturnAddress(bool isFrameAddr, SDOperand Chain, unsigned Depth, |
| SelectionDAG &DAG); |
| |
| SDOperand getReturnAddressFrameIndex(SelectionDAG &DAG); |
| |
| private: |
| // C Calling Convention implementation. |
| std::vector<SDOperand> LowerCCCArguments(Function &F, SelectionDAG &DAG); |
| std::pair<SDOperand, SDOperand> |
| LowerCCCCallTo(SDOperand Chain, const Type *RetTy, bool isVarArg, |
| bool isTailCall, |
| SDOperand Callee, ArgListTy &Args, SelectionDAG &DAG); |
| |
| // Fast Calling Convention implementation. |
| std::vector<SDOperand> LowerFastCCArguments(Function &F, SelectionDAG &DAG); |
| std::pair<SDOperand, SDOperand> |
| LowerFastCCCallTo(SDOperand Chain, const Type *RetTy, bool isTailCall, |
| SDOperand Callee, ArgListTy &Args, SelectionDAG &DAG); |
| }; |
| } |
| |
| #endif // X86ISELLOWERING_H |