1251607Sdim//==- SystemZ.h - Top-Level Interface for SystemZ representation -*- C++ -*-==//
2251607Sdim//
3251607Sdim//                     The LLVM Compiler Infrastructure
4251607Sdim//
5251607Sdim// This file is distributed under the University of Illinois Open Source
6251607Sdim// License. See LICENSE.TXT for details.
7251607Sdim//
8251607Sdim//===----------------------------------------------------------------------===//
9251607Sdim//
10251607Sdim// This file contains the entry points for global functions defined in
11251607Sdim// the LLVM SystemZ backend.
12251607Sdim//
13251607Sdim//===----------------------------------------------------------------------===//
14251607Sdim
15280031Sdim#ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZ_H
16280031Sdim#define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZ_H
17251607Sdim
18251607Sdim#include "MCTargetDesc/SystemZMCTargetDesc.h"
19251607Sdim#include "llvm/Support/CodeGen.h"
20251607Sdim
21251607Sdimnamespace llvm {
22276479Sdimclass SystemZTargetMachine;
23276479Sdimclass FunctionPass;
24251607Sdim
25276479Sdimnamespace SystemZ {
26276479Sdim// Condition-code mask values.
27276479Sdimconst unsigned CCMASK_0 = 1 << 3;
28276479Sdimconst unsigned CCMASK_1 = 1 << 2;
29276479Sdimconst unsigned CCMASK_2 = 1 << 1;
30276479Sdimconst unsigned CCMASK_3 = 1 << 0;
31276479Sdimconst unsigned CCMASK_ANY = CCMASK_0 | CCMASK_1 | CCMASK_2 | CCMASK_3;
32251607Sdim
33276479Sdim// Condition-code mask assignments for integer and floating-point
34276479Sdim// comparisons.
35276479Sdimconst unsigned CCMASK_CMP_EQ = CCMASK_0;
36276479Sdimconst unsigned CCMASK_CMP_LT = CCMASK_1;
37276479Sdimconst unsigned CCMASK_CMP_GT = CCMASK_2;
38276479Sdimconst unsigned CCMASK_CMP_NE = CCMASK_CMP_LT | CCMASK_CMP_GT;
39276479Sdimconst unsigned CCMASK_CMP_LE = CCMASK_CMP_EQ | CCMASK_CMP_LT;
40276479Sdimconst unsigned CCMASK_CMP_GE = CCMASK_CMP_EQ | CCMASK_CMP_GT;
41261991Sdim
42276479Sdim// Condition-code mask assignments for floating-point comparisons only.
43276479Sdimconst unsigned CCMASK_CMP_UO = CCMASK_3;
44276479Sdimconst unsigned CCMASK_CMP_O  = CCMASK_ANY ^ CCMASK_CMP_UO;
45251607Sdim
46276479Sdim// All condition-code values produced by comparisons.
47276479Sdimconst unsigned CCMASK_ICMP = CCMASK_0 | CCMASK_1 | CCMASK_2;
48276479Sdimconst unsigned CCMASK_FCMP = CCMASK_0 | CCMASK_1 | CCMASK_2 | CCMASK_3;
49261991Sdim
50276479Sdim// Condition-code mask assignments for CS.
51276479Sdimconst unsigned CCMASK_CS_EQ = CCMASK_0;
52276479Sdimconst unsigned CCMASK_CS_NE = CCMASK_1;
53276479Sdimconst unsigned CCMASK_CS    = CCMASK_0 | CCMASK_1;
54261991Sdim
55276479Sdim// Condition-code mask assignments for a completed SRST loop.
56276479Sdimconst unsigned CCMASK_SRST_FOUND    = CCMASK_1;
57276479Sdimconst unsigned CCMASK_SRST_NOTFOUND = CCMASK_2;
58276479Sdimconst unsigned CCMASK_SRST          = CCMASK_1 | CCMASK_2;
59261991Sdim
60276479Sdim// Condition-code mask assignments for TEST UNDER MASK.
61276479Sdimconst unsigned CCMASK_TM_ALL_0       = CCMASK_0;
62276479Sdimconst unsigned CCMASK_TM_MIXED_MSB_0 = CCMASK_1;
63276479Sdimconst unsigned CCMASK_TM_MIXED_MSB_1 = CCMASK_2;
64276479Sdimconst unsigned CCMASK_TM_ALL_1       = CCMASK_3;
65276479Sdimconst unsigned CCMASK_TM_SOME_0      = CCMASK_TM_ALL_1 ^ CCMASK_ANY;
66276479Sdimconst unsigned CCMASK_TM_SOME_1      = CCMASK_TM_ALL_0 ^ CCMASK_ANY;
67276479Sdimconst unsigned CCMASK_TM_MSB_0       = CCMASK_0 | CCMASK_1;
68276479Sdimconst unsigned CCMASK_TM_MSB_1       = CCMASK_2 | CCMASK_3;
69276479Sdimconst unsigned CCMASK_TM             = CCMASK_ANY;
70261991Sdim
71288943Sdim// Condition-code mask assignments for TRANSACTION_BEGIN.
72288943Sdimconst unsigned CCMASK_TBEGIN_STARTED       = CCMASK_0;
73288943Sdimconst unsigned CCMASK_TBEGIN_INDETERMINATE = CCMASK_1;
74288943Sdimconst unsigned CCMASK_TBEGIN_TRANSIENT     = CCMASK_2;
75288943Sdimconst unsigned CCMASK_TBEGIN_PERSISTENT    = CCMASK_3;
76288943Sdimconst unsigned CCMASK_TBEGIN               = CCMASK_ANY;
77288943Sdim
78288943Sdim// Condition-code mask assignments for TRANSACTION_END.
79288943Sdimconst unsigned CCMASK_TEND_TX   = CCMASK_0;
80288943Sdimconst unsigned CCMASK_TEND_NOTX = CCMASK_2;
81288943Sdimconst unsigned CCMASK_TEND      = CCMASK_TEND_TX | CCMASK_TEND_NOTX;
82288943Sdim
83288943Sdim// Condition-code mask assignments for vector comparisons (and similar
84288943Sdim// operations).
85288943Sdimconst unsigned CCMASK_VCMP_ALL       = CCMASK_0;
86288943Sdimconst unsigned CCMASK_VCMP_MIXED     = CCMASK_1;
87288943Sdimconst unsigned CCMASK_VCMP_NONE      = CCMASK_3;
88288943Sdimconst unsigned CCMASK_VCMP           = CCMASK_0 | CCMASK_1 | CCMASK_3;
89288943Sdim
90276479Sdim// The position of the low CC bit in an IPM result.
91276479Sdimconst unsigned IPM_CC = 28;
92261991Sdim
93276479Sdim// Mask assignments for PFD.
94276479Sdimconst unsigned PFD_READ  = 1;
95276479Sdimconst unsigned PFD_WRITE = 2;
96261991Sdim
97288943Sdim// Number of bits in a vector register.
98288943Sdimconst unsigned VectorBits = 128;
99288943Sdim
100288943Sdim// Number of bytes in a vector register (and consequently the number of
101288943Sdim// bytes in a general permute vector).
102288943Sdimconst unsigned VectorBytes = VectorBits / 8;
103288943Sdim
104276479Sdim// Return true if Val fits an LLILL operand.
105276479Sdimstatic inline bool isImmLL(uint64_t Val) {
106276479Sdim  return (Val & ~0x000000000000ffffULL) == 0;
107276479Sdim}
108251607Sdim
109276479Sdim// Return true if Val fits an LLILH operand.
110276479Sdimstatic inline bool isImmLH(uint64_t Val) {
111276479Sdim  return (Val & ~0x00000000ffff0000ULL) == 0;
112276479Sdim}
113251607Sdim
114276479Sdim// Return true if Val fits an LLIHL operand.
115276479Sdimstatic inline bool isImmHL(uint64_t Val) {
116276479Sdim  return (Val & ~0x00000ffff00000000ULL) == 0;
117276479Sdim}
118251607Sdim
119276479Sdim// Return true if Val fits an LLIHH operand.
120276479Sdimstatic inline bool isImmHH(uint64_t Val) {
121276479Sdim  return (Val & ~0xffff000000000000ULL) == 0;
122276479Sdim}
123251607Sdim
124276479Sdim// Return true if Val fits an LLILF operand.
125276479Sdimstatic inline bool isImmLF(uint64_t Val) {
126276479Sdim  return (Val & ~0x00000000ffffffffULL) == 0;
127276479Sdim}
128251607Sdim
129276479Sdim// Return true if Val fits an LLIHF operand.
130276479Sdimstatic inline bool isImmHF(uint64_t Val) {
131276479Sdim  return (Val & ~0xffffffff00000000ULL) == 0;
132276479Sdim}
133276479Sdim} // end namespace SystemZ
134251607Sdim
135276479SdimFunctionPass *createSystemZISelDag(SystemZTargetMachine &TM,
136276479Sdim                                   CodeGenOpt::Level OptLevel);
137276479SdimFunctionPass *createSystemZElimComparePass(SystemZTargetMachine &TM);
138276479SdimFunctionPass *createSystemZShortenInstPass(SystemZTargetMachine &TM);
139276479SdimFunctionPass *createSystemZLongBranchPass(SystemZTargetMachine &TM);
140288943SdimFunctionPass *createSystemZLDCleanupPass(SystemZTargetMachine &TM);
141276479Sdim} // end namespace llvm
142276479Sdim
143251607Sdim#endif
144