SystemZISelLowering.h revision 04ded924f3583438c6633823eddb87761fa73cce
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" 19d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford#include "llvm/CodeGen/MachineBasicBlock.h" 201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/CodeGen/SelectionDAG.h" 211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/Target/TargetLowering.h" 221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandnamespace llvm { 241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandnamespace SystemZISD { 251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand enum { 261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand FIRST_NUMBER = ISD::BUILTIN_OP_END, 271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Return with a flag operand. Operand 0 is the chain operand. 291d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand RET_FLAG, 301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Calls a function. Operand 0 is the chain operand and operand 1 321d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // is the target address. The arguments start at operand 2. 331d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // There is an optional glue operand at the end. 341d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand CALL, 351d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 361d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Wraps a TargetGlobalAddress that should be loaded using PC-relative 371d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // accesses (LARL). Operand 0 is the address. 381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand PCREL_WRAPPER, 391d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 401d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Signed integer and floating-point comparisons. The operands are the 411d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // two values to compare. 421d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand CMP, 431d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Likewise unsigned integer comparison. 451d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand UCMP, 461d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Branches if a condition is true. Operand 0 is the chain operand; 481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // operand 1 is the 4-bit condition-code mask, with bit N in 491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // big-endian order meaning "branch if CC=N"; operand 2 is the 501d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // target block and operand 3 is the flag operand. 511d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand BR_CCMASK, 521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Selects between operand 0 and operand 1. Operand 2 is the 541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // mask of condition-code values for which operand 0 should be 551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // chosen over operand 1; it has the same form as BR_CCMASK. 561d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 3 is the flag operand. 571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SELECT_CCMASK, 581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Evaluates to the gap between the stack pointer and the 601d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // base of the dynamically-allocatable area. 611d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ADJDYNALLOC, 621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 631d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Extracts the value of a 32-bit access register. Operand 0 is 641d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // the number of the register. 651d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand EXTRACT_ACCESS, 661d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 671d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Wrappers around the ISD opcodes of the same name. The output and 681d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // first input operands are GR128s. The trailing numbers are the 691d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // widths of the second operand in bits. 701d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand UMUL_LOHI64, 7135b7bebe1162326c38217ff80d4a49fbbffcc365Richard Sandiford SDIVREM32, 721d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDIVREM64, 731d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand UDIVREM32, 741d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand UDIVREM64, 751d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 76dff0009d0ced62b92cb5900bc2203ec40142ba15Richard Sandiford // Use MVC to copy bytes from one memory location to another. 77dff0009d0ced62b92cb5900bc2203ec40142ba15Richard Sandiford // The first operand is the target address, the second operand is the 78dff0009d0ced62b92cb5900bc2203ec40142ba15Richard Sandiford // source address, and the third operand is the constant length. 79dff0009d0ced62b92cb5900bc2203ec40142ba15Richard Sandiford // This isn't a memory opcode because we'd need to attach two 80dff0009d0ced62b92cb5900bc2203ec40142ba15Richard Sandiford // MachineMemOperands rather than one. 81dff0009d0ced62b92cb5900bc2203ec40142ba15Richard Sandiford MVC, 82dff0009d0ced62b92cb5900bc2203ec40142ba15Richard Sandiford 831d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Wrappers around the inner loop of an 8- or 16-bit ATOMIC_SWAP or 841d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // ATOMIC_LOAD_<op>. 851d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // 861d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 0: the address of the containing 32-bit-aligned field 871d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 1: the second operand of <op>, in the high bits of an i32 881d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // for everything except ATOMIC_SWAPW 891d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 2: how many bits to rotate the i32 left to bring the first 901d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // operand into the high bits 911d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 3: the negative of operand 2, for rotating the other way 921d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 4: the width of the field in bits (8 or 16) 931d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_SWAPW = ISD::FIRST_TARGET_MEMORY_OPCODE, 941d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_ADD, 951d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_SUB, 961d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_AND, 971d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_OR, 981d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_XOR, 991d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_NAND, 1001d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_MIN, 1011d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_MAX, 1021d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_UMIN, 1031d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_UMAX, 1041d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1051d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // A wrapper around the inner loop of an ATOMIC_CMP_SWAP. 1061d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // 1071d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 0: the address of the containing 32-bit-aligned field 1081d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 1: the compare value, in the low bits of an i32 1091d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 2: the swap value, in the low bits of an i32 1101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 3: how many bits to rotate the i32 left to bring the first 1111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // operand into the high bits 1121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 4: the negative of operand 2, for rotating the other way 1131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 5: the width of the field in bits (8 or 16) 1141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_CMP_SWAPW 1151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand }; 1161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 1171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass SystemZSubtarget; 1191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass SystemZTargetMachine; 1201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass SystemZTargetLowering : public TargetLowering { 1221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandpublic: 1231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand explicit SystemZTargetLowering(SystemZTargetMachine &TM); 1241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Override TargetLowering. 1261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual MVT getScalarShiftAmountTy(EVT LHSTy) const LLVM_OVERRIDE { 1271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return MVT::i32; 1281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 12904ded924f3583438c6633823eddb87761fa73cceRichard Sandiford virtual EVT getSetCCResultType(LLVMContext &, EVT) const LLVM_OVERRIDE { 1301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return MVT::i32; 1311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 132e54885af9b54bfc7436a928a48d3db1ef88a2a70Stephen Lin virtual bool isFMAFasterThanFMulAndFAdd(EVT VT) const LLVM_OVERRIDE; 13304ded924f3583438c6633823eddb87761fa73cceRichard Sandiford virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const LLVM_OVERRIDE; 13404ded924f3583438c6633823eddb87761fa73cceRichard Sandiford virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const 13504ded924f3583438c6633823eddb87761fa73cceRichard Sandiford LLVM_OVERRIDE; 13604ded924f3583438c6633823eddb87761fa73cceRichard Sandiford virtual bool allowsUnalignedMemoryAccesses(EVT VT, bool *Fast) const 13704ded924f3583438c6633823eddb87761fa73cceRichard Sandiford LLVM_OVERRIDE; 1381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual const char *getTargetNodeName(unsigned Opcode) const LLVM_OVERRIDE; 1391d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual std::pair<unsigned, const TargetRegisterClass *> 1401d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand getRegForInlineAsmConstraint(const std::string &Constraint, 1415b3fca50a08865f0db55fc92ad1c037a04e12177Chad Rosier MVT VT) const LLVM_OVERRIDE; 1421d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual TargetLowering::ConstraintType 1431d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand getConstraintType(const std::string &Constraint) const LLVM_OVERRIDE; 1441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual TargetLowering::ConstraintWeight 1451d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand getSingleConstraintMatchWeight(AsmOperandInfo &info, 1461d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const char *constraint) const LLVM_OVERRIDE; 1471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual void 1481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand LowerAsmOperandForConstraint(SDValue Op, 1491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand std::string &Constraint, 1501d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand std::vector<SDValue> &Ops, 1511d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SelectionDAG &DAG) const LLVM_OVERRIDE; 1521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual MachineBasicBlock * 1531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand EmitInstrWithCustomInserter(MachineInstr *MI, 1541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *BB) const LLVM_OVERRIDE; 1551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual SDValue LowerOperation(SDValue Op, 1561d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SelectionDAG &DAG) const LLVM_OVERRIDE; 1571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual SDValue 1581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand LowerFormalArguments(SDValue Chain, 1591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand CallingConv::ID CallConv, bool isVarArg, 1601d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const SmallVectorImpl<ISD::InputArg> &Ins, 161ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick SDLoc DL, SelectionDAG &DAG, 1621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SmallVectorImpl<SDValue> &InVals) const LLVM_OVERRIDE; 1631d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual SDValue 1641d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand LowerCall(CallLoweringInfo &CLI, 1651d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SmallVectorImpl<SDValue> &InVals) const LLVM_OVERRIDE; 1661d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1671d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual SDValue 1681d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand LowerReturn(SDValue Chain, 1691d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand CallingConv::ID CallConv, bool IsVarArg, 1701d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const SmallVectorImpl<ISD::OutputArg> &Outs, 1711d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const SmallVectorImpl<SDValue> &OutVals, 172ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick SDLoc DL, SelectionDAG &DAG) const LLVM_OVERRIDE; 1731d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1741d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandprivate: 1751d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const SystemZSubtarget &Subtarget; 1761d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const SystemZTargetMachine &TM; 1771d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1781d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Implement LowerOperation for individual opcodes. 1791d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerBR_CC(SDValue Op, SelectionDAG &DAG) const; 1801d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const; 1811d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerGlobalAddress(GlobalAddressSDNode *Node, 1821d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SelectionDAG &DAG) const; 1831d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerGlobalTLSAddress(GlobalAddressSDNode *Node, 1841d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SelectionDAG &DAG) const; 1851d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerBlockAddress(BlockAddressSDNode *Node, 1861d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SelectionDAG &DAG) const; 1871d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerJumpTable(JumpTableSDNode *JT, SelectionDAG &DAG) const; 1881d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerConstantPool(ConstantPoolSDNode *CP, SelectionDAG &DAG) const; 1891d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const; 1901d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerVACOPY(SDValue Op, SelectionDAG &DAG) const; 1911d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const; 1921d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const; 1931d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerSDIVREM(SDValue Op, SelectionDAG &DAG) const; 1941d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerUDIVREM(SDValue Op, SelectionDAG &DAG) const; 1951d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerBITCAST(SDValue Op, SelectionDAG &DAG) const; 1961d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerOR(SDValue Op, SelectionDAG &DAG) const; 1971d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG, 1981d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned Opcode) const; 1991d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const; 2001d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerSTACKSAVE(SDValue Op, SelectionDAG &DAG) const; 2011d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG) const; 2021d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 203d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford // If the last instruction before MBBI in MBB was some form of COMPARE, 204d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford // try to replace it with a COMPARE AND BRANCH just before MBBI. 205d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford // CCMask and Target are the BRC-like operands for the branch. 206d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford // Return true if the change was made. 207d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford bool convertPrevCompareToBranch(MachineBasicBlock *MBB, 208d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford MachineBasicBlock::iterator MBBI, 209d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford unsigned CCMask, 210d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford MachineBasicBlock *Target) const; 211d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford 2121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Implement EmitInstrWithCustomInserter for individual operation types. 2131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *emitSelect(MachineInstr *MI, 2141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *BB) const; 215722e9e6d0a5b67d136be40bc015abc5b0b32f97bRichard Sandiford MachineBasicBlock *emitCondStore(MachineInstr *MI, 216722e9e6d0a5b67d136be40bc015abc5b0b32f97bRichard Sandiford MachineBasicBlock *BB, 217b284e1bf08d24deb20b7deab71fce6f3034cc89aRichard Sandiford unsigned StoreOpcode, unsigned STOCOpcode, 218b284e1bf08d24deb20b7deab71fce6f3034cc89aRichard Sandiford bool Invert) const; 2191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *emitExt128(MachineInstr *MI, 2201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *MBB, 2211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand bool ClearEven, unsigned SubReg) const; 2221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *emitAtomicLoadBinary(MachineInstr *MI, 2231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *BB, 2241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned BinOpcode, unsigned BitSize, 2251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand bool Invert = false) const; 2261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *emitAtomicLoadMinMax(MachineInstr *MI, 2271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *MBB, 2281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned CompareOpcode, 2291d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned KeepOldMask, 2301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned BitSize) const; 2311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *emitAtomicCmpSwapW(MachineInstr *MI, 2321d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *BB) const; 233dff0009d0ced62b92cb5900bc2203ec40142ba15Richard Sandiford MachineBasicBlock *emitMVCWrapper(MachineInstr *MI, 234dff0009d0ced62b92cb5900bc2203ec40142ba15Richard Sandiford MachineBasicBlock *BB) const; 2351d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}; 2361d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} // end namespace llvm 2371d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 2381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#endif // LLVM_TARGET_SystemZ_ISELLOWERING_H 239