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