SystemZISelLowering.h revision ac6d9bec671252dd1e596fa71180ff6b39d06b5d
11d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===-- SystemZISelLowering.h - SystemZ DAG lowering interface --*- C++ -*-===//
21d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
31d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//                     The LLVM Compiler Infrastructure
41d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
51d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// This file is distributed under the University of Illinois Open Source
61d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// License. See LICENSE.TXT for details.
71d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
81d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===//
91d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// This file defines the interfaces that SystemZ uses to lower LLVM code into a
111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// selection DAG.
121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===//
141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#ifndef LLVM_TARGET_SystemZ_ISELLOWERING_H
161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#define LLVM_TARGET_SystemZ_ISELLOWERING_H
171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZ.h"
191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/CodeGen/SelectionDAG.h"
201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/Target/TargetLowering.h"
211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandnamespace llvm {
231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandnamespace SystemZISD {
241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  enum {
251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    FIRST_NUMBER = ISD::BUILTIN_OP_END,
261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Return with a flag operand.  Operand 0 is the chain operand.
281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    RET_FLAG,
291d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Calls a function.  Operand 0 is the chain operand and operand 1
311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // is the target address.  The arguments start at operand 2.
321d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // There is an optional glue operand at the end.
331d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    CALL,
341d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
351d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Wraps a TargetGlobalAddress that should be loaded using PC-relative
361d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // accesses (LARL).  Operand 0 is the address.
371d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    PCREL_WRAPPER,
381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
391d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Signed integer and floating-point comparisons.  The operands are the
401d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // two values to compare.
411d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    CMP,
421d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
431d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Likewise unsigned integer comparison.
441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    UCMP,
451d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
461d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Branches if a condition is true.  Operand 0 is the chain operand;
471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // operand 1 is the 4-bit condition-code mask, with bit N in
481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // big-endian order meaning "branch if CC=N"; operand 2 is the
491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // target block and operand 3 is the flag operand.
501d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    BR_CCMASK,
511d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Selects between operand 0 and operand 1.  Operand 2 is the
531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // mask of condition-code values for which operand 0 should be
541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // chosen over operand 1; it has the same form as BR_CCMASK.
551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Operand 3 is the flag operand.
561d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    SELECT_CCMASK,
571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Evaluates to the gap between the stack pointer and the
591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // base of the dynamically-allocatable area.
601d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    ADJDYNALLOC,
611d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Extracts the value of a 32-bit access register.  Operand 0 is
631d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // the number of the register.
641d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    EXTRACT_ACCESS,
651d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
661d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Wrappers around the ISD opcodes of the same name.  The output and
671d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // first input operands are GR128s.  The trailing numbers are the
681d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // widths of the second operand in bits.
691d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    UMUL_LOHI64,
701d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    SDIVREM64,
711d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    UDIVREM32,
721d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    UDIVREM64,
731d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
741d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Wrappers around the inner loop of an 8- or 16-bit ATOMIC_SWAP or
751d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // ATOMIC_LOAD_<op>.
761d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    //
771d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Operand 0: the address of the containing 32-bit-aligned field
781d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Operand 1: the second operand of <op>, in the high bits of an i32
791d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    //            for everything except ATOMIC_SWAPW
801d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Operand 2: how many bits to rotate the i32 left to bring the first
811d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    //            operand into the high bits
821d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Operand 3: the negative of operand 2, for rotating the other way
831d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Operand 4: the width of the field in bits (8 or 16)
841d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    ATOMIC_SWAPW = ISD::FIRST_TARGET_MEMORY_OPCODE,
851d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    ATOMIC_LOADW_ADD,
861d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    ATOMIC_LOADW_SUB,
871d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    ATOMIC_LOADW_AND,
881d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    ATOMIC_LOADW_OR,
891d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    ATOMIC_LOADW_XOR,
901d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    ATOMIC_LOADW_NAND,
911d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    ATOMIC_LOADW_MIN,
921d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    ATOMIC_LOADW_MAX,
931d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    ATOMIC_LOADW_UMIN,
941d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    ATOMIC_LOADW_UMAX,
951d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
961d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // A wrapper around the inner loop of an ATOMIC_CMP_SWAP.
971d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    //
981d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Operand 0: the address of the containing 32-bit-aligned field
991d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Operand 1: the compare value, in the low bits of an i32
1001d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Operand 2: the swap value, in the low bits of an i32
1011d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Operand 3: how many bits to rotate the i32 left to bring the first
1021d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    //            operand into the high bits
1031d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Operand 4: the negative of operand 2, for rotating the other way
1041d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Operand 5: the width of the field in bits (8 or 16)
1051d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    ATOMIC_CMP_SWAPW
1061d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  };
1071d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
1081d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1091d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass SystemZSubtarget;
1101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass SystemZTargetMachine;
1111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass SystemZTargetLowering : public TargetLowering {
1131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandpublic:
1141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  explicit SystemZTargetLowering(SystemZTargetMachine &TM);
1151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Override TargetLowering.
1171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  virtual MVT getScalarShiftAmountTy(EVT LHSTy) const LLVM_OVERRIDE {
1181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    return MVT::i32;
1191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
120225ed7069caae9ece32d8bd3d15c6e41e21cc04bMatt Arsenault  virtual EVT getSetCCResultType(LLVMContext &, EVT) const {
1211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    return MVT::i32;
1221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
1231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  virtual bool isFMAFasterThanMulAndAdd(EVT) const LLVM_OVERRIDE {
1241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    return true;
1251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
1261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const;
1271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  virtual const char *getTargetNodeName(unsigned Opcode) const LLVM_OVERRIDE;
1281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  virtual std::pair<unsigned, const TargetRegisterClass *>
1291d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    getRegForInlineAsmConstraint(const std::string &Constraint,
1301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                 EVT VT) const LLVM_OVERRIDE;
1311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  virtual TargetLowering::ConstraintType
1321d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    getConstraintType(const std::string &Constraint) const LLVM_OVERRIDE;
1331d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  virtual TargetLowering::ConstraintWeight
1341d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    getSingleConstraintMatchWeight(AsmOperandInfo &info,
1351d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                   const char *constraint) const LLVM_OVERRIDE;
1361d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  virtual void
1371d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    LowerAsmOperandForConstraint(SDValue Op,
1381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                 std::string &Constraint,
1391d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                 std::vector<SDValue> &Ops,
1401d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                 SelectionDAG &DAG) const LLVM_OVERRIDE;
1411d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  virtual MachineBasicBlock *
1421d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    EmitInstrWithCustomInserter(MachineInstr *MI,
1431d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                MachineBasicBlock *BB) const LLVM_OVERRIDE;
1441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  virtual SDValue LowerOperation(SDValue Op,
1451d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                 SelectionDAG &DAG) const LLVM_OVERRIDE;
1461d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  virtual SDValue
1471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    LowerFormalArguments(SDValue Chain,
1481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                         CallingConv::ID CallConv, bool isVarArg,
1491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                         const SmallVectorImpl<ISD::InputArg> &Ins,
150ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                         SDLoc DL, SelectionDAG &DAG,
1511d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                         SmallVectorImpl<SDValue> &InVals) const LLVM_OVERRIDE;
1521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  virtual SDValue
1531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    LowerCall(CallLoweringInfo &CLI,
1541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand              SmallVectorImpl<SDValue> &InVals) const LLVM_OVERRIDE;
1551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1561d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  virtual SDValue
1571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    LowerReturn(SDValue Chain,
1581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                CallingConv::ID CallConv, bool IsVarArg,
1591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                const SmallVectorImpl<ISD::OutputArg> &Outs,
1601d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                const SmallVectorImpl<SDValue> &OutVals,
161ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                SDLoc DL, SelectionDAG &DAG) const LLVM_OVERRIDE;
1621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1631d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandprivate:
1641d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  const SystemZSubtarget &Subtarget;
1651d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  const SystemZTargetMachine &TM;
1661d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1671d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Implement LowerOperation for individual opcodes.
1681d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
1691d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
1701d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerGlobalAddress(GlobalAddressSDNode *Node,
1711d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                             SelectionDAG &DAG) const;
1721d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerGlobalTLSAddress(GlobalAddressSDNode *Node,
1731d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                SelectionDAG &DAG) const;
1741d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerBlockAddress(BlockAddressSDNode *Node,
1751d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                            SelectionDAG &DAG) const;
1761d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerJumpTable(JumpTableSDNode *JT, SelectionDAG &DAG) const;
1771d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerConstantPool(ConstantPoolSDNode *CP, SelectionDAG &DAG) const;
1781d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
1791d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
1801d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
1811d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
1821d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerSDIVREM(SDValue Op, SelectionDAG &DAG) const;
1831d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerUDIVREM(SDValue Op, SelectionDAG &DAG) const;
1841d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
1851d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerOR(SDValue Op, SelectionDAG &DAG) const;
1861d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG,
1871d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                           unsigned Opcode) const;
1881d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const;
1891d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerSTACKSAVE(SDValue Op, SelectionDAG &DAG) const;
1901d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SDValue lowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG) const;
1911d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1921d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Implement EmitInstrWithCustomInserter for individual operation types.
1931d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  MachineBasicBlock *emitSelect(MachineInstr *MI,
1941d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                MachineBasicBlock *BB) const;
1951d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  MachineBasicBlock *emitExt128(MachineInstr *MI,
1961d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                MachineBasicBlock *MBB,
1971d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                bool ClearEven, unsigned SubReg) const;
1981d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  MachineBasicBlock *emitAtomicLoadBinary(MachineInstr *MI,
1991d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                          MachineBasicBlock *BB,
2001d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                          unsigned BinOpcode, unsigned BitSize,
2011d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                          bool Invert = false) const;
2021d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  MachineBasicBlock *emitAtomicLoadMinMax(MachineInstr *MI,
2031d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                          MachineBasicBlock *MBB,
2041d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                          unsigned CompareOpcode,
2051d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                          unsigned KeepOldMask,
2061d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                          unsigned BitSize) const;
2071d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  MachineBasicBlock *emitAtomicCmpSwapW(MachineInstr *MI,
2081d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                        MachineBasicBlock *BB) const;
2091d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand};
2101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} // end namespace llvm
2111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#endif // LLVM_TARGET_SystemZ_ISELLOWERING_H
213