blob: 4a90a0eb26390eacf68ff4ba4281b6d3dbf6c73d [file] [log] [blame]
Anton Korobeynikovf2c3e172009-05-03 12:57:15 +00001//==-- MSP430ISelLowering.h - MSP430 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 MSP430 uses to lower LLVM code into a
11// selection DAG.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_TARGET_MSP430_ISELLOWERING_H
16#define LLVM_TARGET_MSP430_ISELLOWERING_H
17
18#include "MSP430.h"
19#include "llvm/CodeGen/SelectionDAG.h"
20#include "llvm/Target/TargetLowering.h"
21
22namespace llvm {
Anton Korobeynikovfd1b7c72009-05-03 12:59:50 +000023 namespace MSP430ISD {
24 enum {
25 FIRST_NUMBER = ISD::BUILTIN_OP_END,
26
27 /// Return with a flag operand. Operand 0 is the chain operand.
Anton Korobeynikovd2c94ae2009-05-03 13:03:33 +000028 RET_FLAG,
29
Anton Korobeynikovea54c982009-05-03 13:13:17 +000030 /// Y = R{R,L}A X, rotate right (left) arithmetically
31 RRA, RLA,
Anton Korobeynikov44288852009-05-03 13:07:31 +000032
Anton Korobeynikove699d0f2009-05-03 13:16:17 +000033 /// Y = RRC X, rotate right via carry
34 RRC,
35
Anton Korobeynikov44288852009-05-03 13:07:31 +000036 /// CALL/TAILCALL - These operations represent an abstract call
37 /// instruction, which includes a bunch of information.
Anton Korobeynikov3513ca82009-05-03 13:08:33 +000038 CALL,
39
40 /// Wrapper - A wrapper node for TargetConstantPool, TargetExternalSymbol,
41 /// and TargetGlobalAddress.
Anton Korobeynikoved1a51a2009-05-03 13:12:06 +000042 Wrapper,
43
44 /// CMP - Compare instruction.
45 CMP,
46
47 /// SetCC. Operand 0 is condition code, and operand 1 is the flag
48 /// operand produced by a CMP instruction.
49 SETCC,
50
51 /// MSP430 conditional branches. Operand 0 is the chain operand, operand 1
52 /// is the block to branch if condition is true, operand 2 is the
53 /// condition code, and operand 3 is the flag operand produced by a CMP
54 /// instruction.
Anton Korobeynikov1bb8cd72009-05-03 13:19:09 +000055 BR_CC,
Anton Korobeynikov8b528e52009-05-03 13:12:23 +000056
Anton Korobeynikov1bb8cd72009-05-03 13:19:09 +000057 /// SELECT_CC. Operand 0 and operand 1 are selection variable, operand 3
58 /// is condition code and operand 4 is flag operand.
59 SELECT_CC
Anton Korobeynikovfd1b7c72009-05-03 12:59:50 +000060 };
61 }
Anton Korobeynikovf2c3e172009-05-03 12:57:15 +000062
63 class MSP430Subtarget;
64 class MSP430TargetMachine;
65
66 class MSP430TargetLowering : public TargetLowering {
67 public:
68 explicit MSP430TargetLowering(MSP430TargetMachine &TM);
69
70 /// LowerOperation - Provide custom lowering hooks for some operations.
71 virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG);
Anton Korobeynikovfd1b7c72009-05-03 12:59:50 +000072
73 /// getTargetNodeName - This method returns the name of a target specific
74 /// DAG node.
75 virtual const char *getTargetNodeName(unsigned Opcode) const;
76
Bill Wendlingb4202b82009-07-01 18:50:55 +000077 /// getFunctionAlignment - Return the Log2 alignment of this function.
Bill Wendling20c568f2009-06-30 22:38:32 +000078 virtual unsigned getFunctionAlignment(const Function *F) const;
79
Anton Korobeynikovc8fbb6a2009-05-03 12:59:33 +000080 SDValue LowerFORMAL_ARGUMENTS(SDValue Op, SelectionDAG &DAG);
Anton Korobeynikov44288852009-05-03 13:07:31 +000081 SDValue LowerCALL(SDValue Op, SelectionDAG &DAG);
Anton Korobeynikovfd1b7c72009-05-03 12:59:50 +000082 SDValue LowerRET(SDValue Op, SelectionDAG &DAG);
Anton Korobeynikovc8fbb6a2009-05-03 12:59:33 +000083 SDValue LowerCCCArguments(SDValue Op, SelectionDAG &DAG);
Anton Korobeynikovd2c94ae2009-05-03 13:03:33 +000084 SDValue LowerShifts(SDValue Op, SelectionDAG &DAG);
Anton Korobeynikov3513ca82009-05-03 13:08:33 +000085 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG);
Anton Korobeynikov5d59f682009-05-03 13:14:46 +000086 SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG);
Anton Korobeynikov1bb8cd72009-05-03 13:19:09 +000087 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG);
88 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG);
Anton Korobeynikovb78e2142009-05-03 13:17:49 +000089 SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG);
Anton Korobeynikov44288852009-05-03 13:07:31 +000090
91 SDValue LowerCCCCallTo(SDValue Op, SelectionDAG &DAG,
92 unsigned CC);
93 SDNode* LowerCallResult(SDValue Chain, SDValue InFlag,
94 CallSDNode *TheCall,
95 unsigned CallingConv, SelectionDAG &DAG);
96
Anton Korobeynikov8b528e52009-05-03 13:12:23 +000097 MachineBasicBlock* EmitInstrWithCustomInserter(MachineInstr *MI,
98 MachineBasicBlock *BB) const;
Anton Korobeynikov44288852009-05-03 13:07:31 +000099
Anton Korobeynikovf2c3e172009-05-03 12:57:15 +0000100 private:
101 const MSP430Subtarget &Subtarget;
102 const MSP430TargetMachine &TM;
103 };
104} // namespace llvm
105
106#endif // LLVM_TARGET_MSP430_ISELLOWERING_H