SystemZISelLowering.h revision 7df8462038c4393771a0961c60a2686169e4fd9a
1//==-- SystemZISelLowering.h - SystemZ DAG Lowering Interface ----*- C++ -*-==// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines the interfaces that SystemZ uses to lower LLVM code into a 11// selection DAG. 12// 13//===----------------------------------------------------------------------===// 14 15#ifndef LLVM_TARGET_SystemZ_ISELLOWERING_H 16#define LLVM_TARGET_SystemZ_ISELLOWERING_H 17 18#include "SystemZ.h" 19#include "SystemZRegisterInfo.h" 20#include "llvm/CodeGen/SelectionDAG.h" 21#include "llvm/Target/TargetLowering.h" 22 23namespace llvm { 24 namespace SystemZISD { 25 enum { 26 FIRST_NUMBER = ISD::BUILTIN_OP_END, 27 28 /// Return with a flag operand. Operand 0 is the chain operand. 29 RET_FLAG, 30 31 /// CALL/TAILCALL - These operations represent an abstract call 32 /// instruction, which includes a bunch of information. 33 CALL, 34 35 /// PCRelativeWrapper - PC relative address 36 PCRelativeWrapper, 37 38 /// CMP, UCMP - Compare instruction 39 CMP, 40 UCMP, 41 42 /// BRCOND - Conditional branch. Operand 0 is chain operand, operand 1 is 43 /// the block to branch if condition is true, operand 2 is condition code 44 /// and operand 3 is the flag operand produced by a CMP instruction. 45 BRCOND, 46 47 /// SELECT - Operands 0 and 1 are selection variables, operand 2 is 48 /// condition code and operand 3 is the flag operand. 49 SELECT 50 }; 51 } 52 53 class SystemZSubtarget; 54 class SystemZTargetMachine; 55 56 class SystemZTargetLowering : public TargetLowering { 57 public: 58 explicit SystemZTargetLowering(SystemZTargetMachine &TM); 59 60 /// LowerOperation - Provide custom lowering hooks for some operations. 61 virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG); 62 63 /// getTargetNodeName - This method returns the name of a target specific 64 /// DAG node. 65 virtual const char *getTargetNodeName(unsigned Opcode) const; 66 67 /// getFunctionAlignment - Return the Log2 alignment of this function. 68 virtual unsigned getFunctionAlignment(const Function *F) const { 69 return 1; 70 } 71 72 SDValue LowerFORMAL_ARGUMENTS(SDValue Op, SelectionDAG &DAG); 73 SDValue LowerRET(SDValue Op, SelectionDAG &DAG); 74 SDValue LowerCALL(SDValue Op, SelectionDAG &DAG); 75 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG); 76 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG); 77 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG); 78 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG); 79 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG); 80 81 SDValue LowerCCCArguments(SDValue Op, SelectionDAG &DAG); 82 SDValue LowerCCCCallTo(SDValue Op, SelectionDAG &DAG, unsigned CC); 83 SDNode* LowerCallResult(SDValue Chain, SDValue InFlag, 84 CallSDNode *TheCall, 85 unsigned CallingConv, SelectionDAG &DAG); 86 87 SDValue EmitCmp(SDValue LHS, SDValue RHS, 88 ISD::CondCode CC, SDValue &SystemZCC, 89 SelectionDAG &DAG); 90 91 92 MachineBasicBlock* EmitInstrWithCustomInserter(MachineInstr *MI, 93 MachineBasicBlock *BB) const; 94 95 private: 96 const SystemZSubtarget &Subtarget; 97 const SystemZTargetMachine &TM; 98 const SystemZRegisterInfo *RegInfo; 99 }; 100} // namespace llvm 101 102#endif // LLVM_TARGET_SystemZ_ISELLOWERING_H 103