SystemZ.h revision 276479
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
15251607Sdim#ifndef SYSTEMZ_H
16251607Sdim#define 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
71276479Sdim// The position of the low CC bit in an IPM result.
72276479Sdimconst unsigned IPM_CC = 28;
73261991Sdim
74276479Sdim// Mask assignments for PFD.
75276479Sdimconst unsigned PFD_READ  = 1;
76276479Sdimconst unsigned PFD_WRITE = 2;
77261991Sdim
78276479Sdim// Return true if Val fits an LLILL operand.
79276479Sdimstatic inline bool isImmLL(uint64_t Val) {
80276479Sdim  return (Val & ~0x000000000000ffffULL) == 0;
81276479Sdim}
82251607Sdim
83276479Sdim// Return true if Val fits an LLILH operand.
84276479Sdimstatic inline bool isImmLH(uint64_t Val) {
85276479Sdim  return (Val & ~0x00000000ffff0000ULL) == 0;
86276479Sdim}
87251607Sdim
88276479Sdim// Return true if Val fits an LLIHL operand.
89276479Sdimstatic inline bool isImmHL(uint64_t Val) {
90276479Sdim  return (Val & ~0x00000ffff00000000ULL) == 0;
91276479Sdim}
92251607Sdim
93276479Sdim// Return true if Val fits an LLIHH operand.
94276479Sdimstatic inline bool isImmHH(uint64_t Val) {
95276479Sdim  return (Val & ~0xffff000000000000ULL) == 0;
96276479Sdim}
97251607Sdim
98276479Sdim// Return true if Val fits an LLILF operand.
99276479Sdimstatic inline bool isImmLF(uint64_t Val) {
100276479Sdim  return (Val & ~0x00000000ffffffffULL) == 0;
101276479Sdim}
102251607Sdim
103276479Sdim// Return true if Val fits an LLIHF operand.
104276479Sdimstatic inline bool isImmHF(uint64_t Val) {
105276479Sdim  return (Val & ~0xffffffff00000000ULL) == 0;
106276479Sdim}
107276479Sdim} // end namespace SystemZ
108251607Sdim
109276479SdimFunctionPass *createSystemZISelDag(SystemZTargetMachine &TM,
110276479Sdim                                   CodeGenOpt::Level OptLevel);
111276479SdimFunctionPass *createSystemZElimComparePass(SystemZTargetMachine &TM);
112276479SdimFunctionPass *createSystemZShortenInstPass(SystemZTargetMachine &TM);
113276479SdimFunctionPass *createSystemZLongBranchPass(SystemZTargetMachine &TM);
114276479Sdim} // end namespace llvm
115276479Sdim
116251607Sdim#endif
117