SystemZISelLowering.h revision aff1c6427ce22125adfa29de4145030aa3214a2e
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, 3580f54784da0bd42fb79176bbf447a31d69287fe3Richard Sandiford SIBCALL, 361d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 371d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Wraps a TargetGlobalAddress that should be loaded using PC-relative 381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // accesses (LARL). Operand 0 is the address. 391d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand PCREL_WRAPPER, 401d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 41aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford // Integer comparisons. There are three operands: the two values 42aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford // to compare, and an integer of type SystemZICMP. 43aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford ICMP, 441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 45aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford // Floating-point comparisons. The two operands are the values to compare. 46aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford FCMP, 471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 48477168192c98e1f75a5bc6db3d34a177f327bd34Richard Sandiford // Test under mask. The first operand is ANDed with the second operand 49477168192c98e1f75a5bc6db3d34a177f327bd34Richard Sandiford // and the condition codes are set on the result. 50477168192c98e1f75a5bc6db3d34a177f327bd34Richard Sandiford TM, 51477168192c98e1f75a5bc6db3d34a177f327bd34Richard Sandiford 521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Branches if a condition is true. Operand 0 is the chain operand; 531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // operand 1 is the 4-bit condition-code mask, with bit N in 541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // big-endian order meaning "branch if CC=N"; operand 2 is the 551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // target block and operand 3 is the flag operand. 561d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand BR_CCMASK, 571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Selects between operand 0 and operand 1. Operand 2 is the 591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // mask of condition-code values for which operand 0 should be 601d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // chosen over operand 1; it has the same form as BR_CCMASK. 611d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 3 is the flag operand. 621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SELECT_CCMASK, 631d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 641d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Evaluates to the gap between the stack pointer and the 651d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // base of the dynamically-allocatable area. 661d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ADJDYNALLOC, 671d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 681d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Extracts the value of a 32-bit access register. Operand 0 is 691d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // the number of the register. 701d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand EXTRACT_ACCESS, 711d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 721d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Wrappers around the ISD opcodes of the same name. The output and 731d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // first input operands are GR128s. The trailing numbers are the 741d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // widths of the second operand in bits. 751d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand UMUL_LOHI64, 7635b7bebe1162326c38217ff80d4a49fbbffcc365Richard Sandiford SDIVREM32, 771d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDIVREM64, 781d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand UDIVREM32, 791d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand UDIVREM64, 801d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 81842a1be06c53757e7498c9894abc1431b633a92fRichard Sandiford // Use a series of MVCs to copy bytes from one memory location to another. 82842a1be06c53757e7498c9894abc1431b633a92fRichard Sandiford // The operands are: 83842a1be06c53757e7498c9894abc1431b633a92fRichard Sandiford // - the target address 84842a1be06c53757e7498c9894abc1431b633a92fRichard Sandiford // - the source address 85842a1be06c53757e7498c9894abc1431b633a92fRichard Sandiford // - the constant length 86842a1be06c53757e7498c9894abc1431b633a92fRichard Sandiford // 87dff0009d0ced62b92cb5900bc2203ec40142ba15Richard Sandiford // This isn't a memory opcode because we'd need to attach two 88dff0009d0ced62b92cb5900bc2203ec40142ba15Richard Sandiford // MachineMemOperands rather than one. 89dff0009d0ced62b92cb5900bc2203ec40142ba15Richard Sandiford MVC, 90dff0009d0ced62b92cb5900bc2203ec40142ba15Richard Sandiford 91842a1be06c53757e7498c9894abc1431b633a92fRichard Sandiford // Like MVC, but implemented as a loop that handles X*256 bytes 92842a1be06c53757e7498c9894abc1431b633a92fRichard Sandiford // followed by straight-line code to handle the rest (if any). 93842a1be06c53757e7498c9894abc1431b633a92fRichard Sandiford // The value of X is passed as an additional operand. 94842a1be06c53757e7498c9894abc1431b633a92fRichard Sandiford MVC_LOOP, 95842a1be06c53757e7498c9894abc1431b633a92fRichard Sandiford 9616277c4698f36a756c540fae326874774156aaedRichard Sandiford // Similar to MVC and MVC_LOOP, but for logic operations (AND, OR, XOR). 9716277c4698f36a756c540fae326874774156aaedRichard Sandiford NC, 9816277c4698f36a756c540fae326874774156aaedRichard Sandiford NC_LOOP, 9916277c4698f36a756c540fae326874774156aaedRichard Sandiford OC, 10016277c4698f36a756c540fae326874774156aaedRichard Sandiford OC_LOOP, 10116277c4698f36a756c540fae326874774156aaedRichard Sandiford XC, 10216277c4698f36a756c540fae326874774156aaedRichard Sandiford XC_LOOP, 10316277c4698f36a756c540fae326874774156aaedRichard Sandiford 104e03a56d62fc623e2f72d623b816f91b293d5904bRichard Sandiford // Use CLC to compare two blocks of memory, with the same comments 105842a1be06c53757e7498c9894abc1431b633a92fRichard Sandiford // as for MVC and MVC_LOOP. 106e03a56d62fc623e2f72d623b816f91b293d5904bRichard Sandiford CLC, 107842a1be06c53757e7498c9894abc1431b633a92fRichard Sandiford CLC_LOOP, 108e03a56d62fc623e2f72d623b816f91b293d5904bRichard Sandiford 1094fc7355a21e1fa838406e15459aaf54a58fcf909Richard Sandiford // Use an MVST-based sequence to implement stpcpy(). 1104fc7355a21e1fa838406e15459aaf54a58fcf909Richard Sandiford STPCPY, 1114fc7355a21e1fa838406e15459aaf54a58fcf909Richard Sandiford 112e1b2af731e2a45344a7c502232f66c55cd746da0Richard Sandiford // Use a CLST-based sequence to implement strcmp(). The two input operands 113e1b2af731e2a45344a7c502232f66c55cd746da0Richard Sandiford // are the addresses of the strings to compare. 114e1b2af731e2a45344a7c502232f66c55cd746da0Richard Sandiford STRCMP, 115e1b2af731e2a45344a7c502232f66c55cd746da0Richard Sandiford 11619262ee0725a09b7c621a3d2eb66ba1513ae932aRichard Sandiford // Use an SRST-based sequence to search a block of memory. The first 11719262ee0725a09b7c621a3d2eb66ba1513ae932aRichard Sandiford // operand is the end address, the second is the start, and the third 11819262ee0725a09b7c621a3d2eb66ba1513ae932aRichard Sandiford // is the character to search for. CC is set to 1 on success and 2 11919262ee0725a09b7c621a3d2eb66ba1513ae932aRichard Sandiford // on failure. 12019262ee0725a09b7c621a3d2eb66ba1513ae932aRichard Sandiford SEARCH_STRING, 12119262ee0725a09b7c621a3d2eb66ba1513ae932aRichard Sandiford 122ac168b8bc8773a083a10902f64e4ae57a925aee4Richard Sandiford // Store the CC value in bits 29 and 28 of an integer. 123ac168b8bc8773a083a10902f64e4ae57a925aee4Richard Sandiford IPM, 124ac168b8bc8773a083a10902f64e4ae57a925aee4Richard Sandiford 1251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Wrappers around the inner loop of an 8- or 16-bit ATOMIC_SWAP or 1261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // ATOMIC_LOAD_<op>. 1271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // 1281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 0: the address of the containing 32-bit-aligned field 1291d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 1: the second operand of <op>, in the high bits of an i32 1301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // for everything except ATOMIC_SWAPW 1311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 2: how many bits to rotate the i32 left to bring the first 1321d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // operand into the high bits 1331d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 3: the negative of operand 2, for rotating the other way 1341d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 4: the width of the field in bits (8 or 16) 1351d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_SWAPW = ISD::FIRST_TARGET_MEMORY_OPCODE, 1361d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_ADD, 1371d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_SUB, 1381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_AND, 1391d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_OR, 1401d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_XOR, 1411d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_NAND, 1421d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_MIN, 1431d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_MAX, 1441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_UMIN, 1451d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ATOMIC_LOADW_UMAX, 1461d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // A wrapper around the inner loop of an ATOMIC_CMP_SWAP. 1481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // 1491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 0: the address of the containing 32-bit-aligned field 1501d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 1: the compare value, in the low bits of an i32 1511d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 2: the swap value, in the low bits of an i32 1521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 3: how many bits to rotate the i32 left to bring the first 1531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // operand into the high bits 1541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 4: the negative of operand 2, for rotating the other way 1551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Operand 5: the width of the field in bits (8 or 16) 156a550b51bac50493db75a7b5788a3f2c3b62fd913Richard Sandiford ATOMIC_CMP_SWAPW, 157a550b51bac50493db75a7b5788a3f2c3b62fd913Richard Sandiford 158a550b51bac50493db75a7b5788a3f2c3b62fd913Richard Sandiford // Prefetch from the second operand using the 4-bit control code in 159a550b51bac50493db75a7b5788a3f2c3b62fd913Richard Sandiford // the first operand. The code is 1 for a load prefetch and 2 for 160a550b51bac50493db75a7b5788a3f2c3b62fd913Richard Sandiford // a store prefetch. 161a550b51bac50493db75a7b5788a3f2c3b62fd913Richard Sandiford PREFETCH 1621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand }; 1631d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 1641d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 165aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandifordnamespace SystemZICMP { 166aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford // Describes whether an integer comparison needs to be signed or unsigned, 167aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford // or whether either type is OK. 168aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford enum { 169aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford Any, 170aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford UnsignedOnly, 171aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford SignedOnly 172aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford }; 173aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford} 174aff1c6427ce22125adfa29de4145030aa3214a2eRichard Sandiford 1751d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass SystemZSubtarget; 1761d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass SystemZTargetMachine; 1771d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1781d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass SystemZTargetLowering : public TargetLowering { 1791d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandpublic: 1801d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand explicit SystemZTargetLowering(SystemZTargetMachine &TM); 1811d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1821d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Override TargetLowering. 1831d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual MVT getScalarShiftAmountTy(EVT LHSTy) const LLVM_OVERRIDE { 1841d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return MVT::i32; 1851d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 18604ded924f3583438c6633823eddb87761fa73cceRichard Sandiford virtual EVT getSetCCResultType(LLVMContext &, EVT) const LLVM_OVERRIDE { 1871d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return MVT::i32; 1881d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 189e54885af9b54bfc7436a928a48d3db1ef88a2a70Stephen Lin virtual bool isFMAFasterThanFMulAndFAdd(EVT VT) const LLVM_OVERRIDE; 19004ded924f3583438c6633823eddb87761fa73cceRichard Sandiford virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const LLVM_OVERRIDE; 19104ded924f3583438c6633823eddb87761fa73cceRichard Sandiford virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const 19204ded924f3583438c6633823eddb87761fa73cceRichard Sandiford LLVM_OVERRIDE; 19304ded924f3583438c6633823eddb87761fa73cceRichard Sandiford virtual bool allowsUnalignedMemoryAccesses(EVT VT, bool *Fast) const 19404ded924f3583438c6633823eddb87761fa73cceRichard Sandiford LLVM_OVERRIDE; 19580f54784da0bd42fb79176bbf447a31d69287fe3Richard Sandiford virtual bool isTruncateFree(Type *, Type *) const LLVM_OVERRIDE; 19680f54784da0bd42fb79176bbf447a31d69287fe3Richard Sandiford virtual bool isTruncateFree(EVT, EVT) const LLVM_OVERRIDE; 1971d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual const char *getTargetNodeName(unsigned Opcode) const LLVM_OVERRIDE; 1981d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual std::pair<unsigned, const TargetRegisterClass *> 1991d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand getRegForInlineAsmConstraint(const std::string &Constraint, 2005b3fca50a08865f0db55fc92ad1c037a04e12177Chad Rosier MVT VT) const LLVM_OVERRIDE; 2011d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual TargetLowering::ConstraintType 2021d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand getConstraintType(const std::string &Constraint) const LLVM_OVERRIDE; 2031d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual TargetLowering::ConstraintWeight 2041d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand getSingleConstraintMatchWeight(AsmOperandInfo &info, 2051d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const char *constraint) const LLVM_OVERRIDE; 2061d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual void 2071d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand LowerAsmOperandForConstraint(SDValue Op, 2081d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand std::string &Constraint, 2091d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand std::vector<SDValue> &Ops, 2101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SelectionDAG &DAG) const LLVM_OVERRIDE; 2111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual MachineBasicBlock * 2121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand EmitInstrWithCustomInserter(MachineInstr *MI, 2131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *BB) const LLVM_OVERRIDE; 2141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual SDValue LowerOperation(SDValue Op, 2151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SelectionDAG &DAG) const LLVM_OVERRIDE; 21680f54784da0bd42fb79176bbf447a31d69287fe3Richard Sandiford virtual bool allowTruncateForTailCall(Type *, Type *) const LLVM_OVERRIDE; 21780f54784da0bd42fb79176bbf447a31d69287fe3Richard Sandiford virtual bool mayBeEmittedAsTailCall(CallInst *CI) const LLVM_OVERRIDE; 2181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual SDValue 2191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand LowerFormalArguments(SDValue Chain, 2201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand CallingConv::ID CallConv, bool isVarArg, 2211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const SmallVectorImpl<ISD::InputArg> &Ins, 222ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick SDLoc DL, SelectionDAG &DAG, 2231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SmallVectorImpl<SDValue> &InVals) const LLVM_OVERRIDE; 2241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual SDValue 2251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand LowerCall(CallLoweringInfo &CLI, 2261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SmallVectorImpl<SDValue> &InVals) const LLVM_OVERRIDE; 2271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 2281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand virtual SDValue 2291d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand LowerReturn(SDValue Chain, 2301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand CallingConv::ID CallConv, bool IsVarArg, 2311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const SmallVectorImpl<ISD::OutputArg> &Outs, 2321d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const SmallVectorImpl<SDValue> &OutVals, 233ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick SDLoc DL, SelectionDAG &DAG) const LLVM_OVERRIDE; 2341d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 2351d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandprivate: 2361d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const SystemZSubtarget &Subtarget; 2371d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const SystemZTargetMachine &TM; 2381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 2391d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Implement LowerOperation for individual opcodes. 2401d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerBR_CC(SDValue Op, SelectionDAG &DAG) const; 2411d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const; 2421d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerGlobalAddress(GlobalAddressSDNode *Node, 2431d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SelectionDAG &DAG) const; 2441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerGlobalTLSAddress(GlobalAddressSDNode *Node, 2451d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SelectionDAG &DAG) const; 2461d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerBlockAddress(BlockAddressSDNode *Node, 2471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SelectionDAG &DAG) const; 2481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerJumpTable(JumpTableSDNode *JT, SelectionDAG &DAG) const; 2491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerConstantPool(ConstantPoolSDNode *CP, SelectionDAG &DAG) const; 2501d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const; 2511d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerVACOPY(SDValue Op, SelectionDAG &DAG) const; 2521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const; 253df40f8e8ad0aa93defa44b8a136e8d871cfd44eaRichard Sandiford SDValue lowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const; 2541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const; 2551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerSDIVREM(SDValue Op, SelectionDAG &DAG) const; 2561d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerUDIVREM(SDValue Op, SelectionDAG &DAG) const; 2571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerBITCAST(SDValue Op, SelectionDAG &DAG) const; 2581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerOR(SDValue Op, SelectionDAG &DAG) const; 2591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG, 2601d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned Opcode) const; 2611d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const; 2621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerSTACKSAVE(SDValue Op, SelectionDAG &DAG) const; 2631d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SDValue lowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG) const; 264a550b51bac50493db75a7b5788a3f2c3b62fd913Richard Sandiford SDValue lowerPREFETCH(SDValue Op, SelectionDAG &DAG) const; 2651d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 266d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford // If the last instruction before MBBI in MBB was some form of COMPARE, 267d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford // try to replace it with a COMPARE AND BRANCH just before MBBI. 268d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford // CCMask and Target are the BRC-like operands for the branch. 269d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford // Return true if the change was made. 270d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford bool convertPrevCompareToBranch(MachineBasicBlock *MBB, 271d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford MachineBasicBlock::iterator MBBI, 272d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford unsigned CCMask, 273d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford MachineBasicBlock *Target) const; 274d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford 2751d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Implement EmitInstrWithCustomInserter for individual operation types. 2761d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *emitSelect(MachineInstr *MI, 2771d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *BB) const; 278722e9e6d0a5b67d136be40bc015abc5b0b32f97bRichard Sandiford MachineBasicBlock *emitCondStore(MachineInstr *MI, 279722e9e6d0a5b67d136be40bc015abc5b0b32f97bRichard Sandiford MachineBasicBlock *BB, 280b284e1bf08d24deb20b7deab71fce6f3034cc89aRichard Sandiford unsigned StoreOpcode, unsigned STOCOpcode, 281b284e1bf08d24deb20b7deab71fce6f3034cc89aRichard Sandiford bool Invert) const; 2821d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *emitExt128(MachineInstr *MI, 2831d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *MBB, 2841d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand bool ClearEven, unsigned SubReg) const; 2851d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *emitAtomicLoadBinary(MachineInstr *MI, 2861d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *BB, 2871d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned BinOpcode, unsigned BitSize, 2881d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand bool Invert = false) const; 2891d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *emitAtomicLoadMinMax(MachineInstr *MI, 2901d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *MBB, 2911d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned CompareOpcode, 2921d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned KeepOldMask, 2931d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned BitSize) const; 2941d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *emitAtomicCmpSwapW(MachineInstr *MI, 2951d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineBasicBlock *BB) const; 296ac168b8bc8773a083a10902f64e4ae57a925aee4Richard Sandiford MachineBasicBlock *emitMemMemWrapper(MachineInstr *MI, 297ac168b8bc8773a083a10902f64e4ae57a925aee4Richard Sandiford MachineBasicBlock *BB, 298ac168b8bc8773a083a10902f64e4ae57a925aee4Richard Sandiford unsigned Opcode) const; 299e1b2af731e2a45344a7c502232f66c55cd746da0Richard Sandiford MachineBasicBlock *emitStringWrapper(MachineInstr *MI, 300e1b2af731e2a45344a7c502232f66c55cd746da0Richard Sandiford MachineBasicBlock *BB, 301e1b2af731e2a45344a7c502232f66c55cd746da0Richard Sandiford unsigned Opcode) const; 3021d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}; 3031d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} // end namespace llvm 3041d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 3051d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#endif // LLVM_TARGET_SystemZ_ISELLOWERING_H 306