xref: /aosp_15_r20/external/llvm/lib/Target/SystemZ/SystemZ.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //==- SystemZ.h - Top-Level Interface for SystemZ representation -*- C++ -*-==//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file contains the entry points for global functions defined in
11*9880d681SAndroid Build Coastguard Worker // the LLVM SystemZ backend.
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZ_H
16*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZ_H
17*9880d681SAndroid Build Coastguard Worker 
18*9880d681SAndroid Build Coastguard Worker #include "MCTargetDesc/SystemZMCTargetDesc.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/CodeGen.h"
20*9880d681SAndroid Build Coastguard Worker 
21*9880d681SAndroid Build Coastguard Worker namespace llvm {
22*9880d681SAndroid Build Coastguard Worker class SystemZTargetMachine;
23*9880d681SAndroid Build Coastguard Worker class FunctionPass;
24*9880d681SAndroid Build Coastguard Worker 
25*9880d681SAndroid Build Coastguard Worker namespace SystemZ {
26*9880d681SAndroid Build Coastguard Worker // Condition-code mask values.
27*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_0 = 1 << 3;
28*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_1 = 1 << 2;
29*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_2 = 1 << 1;
30*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_3 = 1 << 0;
31*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_ANY = CCMASK_0 | CCMASK_1 | CCMASK_2 | CCMASK_3;
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker // Condition-code mask assignments for integer and floating-point
34*9880d681SAndroid Build Coastguard Worker // comparisons.
35*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_CMP_EQ = CCMASK_0;
36*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_CMP_LT = CCMASK_1;
37*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_CMP_GT = CCMASK_2;
38*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_CMP_NE = CCMASK_CMP_LT | CCMASK_CMP_GT;
39*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_CMP_LE = CCMASK_CMP_EQ | CCMASK_CMP_LT;
40*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_CMP_GE = CCMASK_CMP_EQ | CCMASK_CMP_GT;
41*9880d681SAndroid Build Coastguard Worker 
42*9880d681SAndroid Build Coastguard Worker // Condition-code mask assignments for floating-point comparisons only.
43*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_CMP_UO = CCMASK_3;
44*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_CMP_O  = CCMASK_ANY ^ CCMASK_CMP_UO;
45*9880d681SAndroid Build Coastguard Worker 
46*9880d681SAndroid Build Coastguard Worker // All condition-code values produced by comparisons.
47*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_ICMP = CCMASK_0 | CCMASK_1 | CCMASK_2;
48*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_FCMP = CCMASK_0 | CCMASK_1 | CCMASK_2 | CCMASK_3;
49*9880d681SAndroid Build Coastguard Worker 
50*9880d681SAndroid Build Coastguard Worker // Condition-code mask assignments for CS.
51*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_CS_EQ = CCMASK_0;
52*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_CS_NE = CCMASK_1;
53*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_CS    = CCMASK_0 | CCMASK_1;
54*9880d681SAndroid Build Coastguard Worker 
55*9880d681SAndroid Build Coastguard Worker // Condition-code mask assignments for a completed SRST loop.
56*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_SRST_FOUND    = CCMASK_1;
57*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_SRST_NOTFOUND = CCMASK_2;
58*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_SRST          = CCMASK_1 | CCMASK_2;
59*9880d681SAndroid Build Coastguard Worker 
60*9880d681SAndroid Build Coastguard Worker // Condition-code mask assignments for TEST UNDER MASK.
61*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TM_ALL_0       = CCMASK_0;
62*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TM_MIXED_MSB_0 = CCMASK_1;
63*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TM_MIXED_MSB_1 = CCMASK_2;
64*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TM_ALL_1       = CCMASK_3;
65*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TM_SOME_0      = CCMASK_TM_ALL_1 ^ CCMASK_ANY;
66*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TM_SOME_1      = CCMASK_TM_ALL_0 ^ CCMASK_ANY;
67*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TM_MSB_0       = CCMASK_0 | CCMASK_1;
68*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TM_MSB_1       = CCMASK_2 | CCMASK_3;
69*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TM             = CCMASK_ANY;
70*9880d681SAndroid Build Coastguard Worker 
71*9880d681SAndroid Build Coastguard Worker // Condition-code mask assignments for TRANSACTION_BEGIN.
72*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TBEGIN_STARTED       = CCMASK_0;
73*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TBEGIN_INDETERMINATE = CCMASK_1;
74*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TBEGIN_TRANSIENT     = CCMASK_2;
75*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TBEGIN_PERSISTENT    = CCMASK_3;
76*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TBEGIN               = CCMASK_ANY;
77*9880d681SAndroid Build Coastguard Worker 
78*9880d681SAndroid Build Coastguard Worker // Condition-code mask assignments for TRANSACTION_END.
79*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TEND_TX   = CCMASK_0;
80*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TEND_NOTX = CCMASK_2;
81*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TEND      = CCMASK_TEND_TX | CCMASK_TEND_NOTX;
82*9880d681SAndroid Build Coastguard Worker 
83*9880d681SAndroid Build Coastguard Worker // Condition-code mask assignments for vector comparisons (and similar
84*9880d681SAndroid Build Coastguard Worker // operations).
85*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_VCMP_ALL       = CCMASK_0;
86*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_VCMP_MIXED     = CCMASK_1;
87*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_VCMP_NONE      = CCMASK_3;
88*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_VCMP           = CCMASK_0 | CCMASK_1 | CCMASK_3;
89*9880d681SAndroid Build Coastguard Worker 
90*9880d681SAndroid Build Coastguard Worker // Condition-code mask assignments for Test Data Class.
91*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TDC_NOMATCH   = CCMASK_0;
92*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TDC_MATCH     = CCMASK_1;
93*9880d681SAndroid Build Coastguard Worker const unsigned CCMASK_TDC           = CCMASK_TDC_NOMATCH | CCMASK_TDC_MATCH;
94*9880d681SAndroid Build Coastguard Worker 
95*9880d681SAndroid Build Coastguard Worker // The position of the low CC bit in an IPM result.
96*9880d681SAndroid Build Coastguard Worker const unsigned IPM_CC = 28;
97*9880d681SAndroid Build Coastguard Worker 
98*9880d681SAndroid Build Coastguard Worker // Mask assignments for PFD.
99*9880d681SAndroid Build Coastguard Worker const unsigned PFD_READ  = 1;
100*9880d681SAndroid Build Coastguard Worker const unsigned PFD_WRITE = 2;
101*9880d681SAndroid Build Coastguard Worker 
102*9880d681SAndroid Build Coastguard Worker // Mask assignments for TDC
103*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_ZERO_PLUS       = 0x800;
104*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_ZERO_MINUS      = 0x400;
105*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_NORMAL_PLUS     = 0x200;
106*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_NORMAL_MINUS    = 0x100;
107*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_SUBNORMAL_PLUS  = 0x080;
108*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_SUBNORMAL_MINUS = 0x040;
109*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_INFINITY_PLUS   = 0x020;
110*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_INFINITY_MINUS  = 0x010;
111*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_QNAN_PLUS       = 0x008;
112*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_QNAN_MINUS      = 0x004;
113*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_SNAN_PLUS       = 0x002;
114*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_SNAN_MINUS      = 0x001;
115*9880d681SAndroid Build Coastguard Worker 
116*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_ZERO            = TDCMASK_ZERO_PLUS | TDCMASK_ZERO_MINUS;
117*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_POSITIVE        = TDCMASK_NORMAL_PLUS |
118*9880d681SAndroid Build Coastguard Worker                                          TDCMASK_SUBNORMAL_PLUS |
119*9880d681SAndroid Build Coastguard Worker                                          TDCMASK_INFINITY_PLUS;
120*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_NEGATIVE        = TDCMASK_NORMAL_MINUS |
121*9880d681SAndroid Build Coastguard Worker                                          TDCMASK_SUBNORMAL_MINUS |
122*9880d681SAndroid Build Coastguard Worker                                          TDCMASK_INFINITY_MINUS;
123*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_NAN             = TDCMASK_QNAN_PLUS |
124*9880d681SAndroid Build Coastguard Worker                                          TDCMASK_QNAN_MINUS |
125*9880d681SAndroid Build Coastguard Worker                                          TDCMASK_SNAN_PLUS |
126*9880d681SAndroid Build Coastguard Worker                                          TDCMASK_SNAN_MINUS;
127*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_PLUS            = TDCMASK_POSITIVE |
128*9880d681SAndroid Build Coastguard Worker                                          TDCMASK_ZERO_PLUS |
129*9880d681SAndroid Build Coastguard Worker                                          TDCMASK_QNAN_PLUS |
130*9880d681SAndroid Build Coastguard Worker                                          TDCMASK_SNAN_PLUS;
131*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_MINUS           = TDCMASK_NEGATIVE |
132*9880d681SAndroid Build Coastguard Worker                                          TDCMASK_ZERO_MINUS |
133*9880d681SAndroid Build Coastguard Worker                                          TDCMASK_QNAN_MINUS |
134*9880d681SAndroid Build Coastguard Worker                                          TDCMASK_SNAN_MINUS;
135*9880d681SAndroid Build Coastguard Worker const unsigned TDCMASK_ALL             = TDCMASK_PLUS | TDCMASK_MINUS;
136*9880d681SAndroid Build Coastguard Worker 
137*9880d681SAndroid Build Coastguard Worker // Number of bits in a vector register.
138*9880d681SAndroid Build Coastguard Worker const unsigned VectorBits = 128;
139*9880d681SAndroid Build Coastguard Worker 
140*9880d681SAndroid Build Coastguard Worker // Number of bytes in a vector register (and consequently the number of
141*9880d681SAndroid Build Coastguard Worker // bytes in a general permute vector).
142*9880d681SAndroid Build Coastguard Worker const unsigned VectorBytes = VectorBits / 8;
143*9880d681SAndroid Build Coastguard Worker 
144*9880d681SAndroid Build Coastguard Worker // Return true if Val fits an LLILL operand.
isImmLL(uint64_t Val)145*9880d681SAndroid Build Coastguard Worker static inline bool isImmLL(uint64_t Val) {
146*9880d681SAndroid Build Coastguard Worker   return (Val & ~0x000000000000ffffULL) == 0;
147*9880d681SAndroid Build Coastguard Worker }
148*9880d681SAndroid Build Coastguard Worker 
149*9880d681SAndroid Build Coastguard Worker // Return true if Val fits an LLILH operand.
isImmLH(uint64_t Val)150*9880d681SAndroid Build Coastguard Worker static inline bool isImmLH(uint64_t Val) {
151*9880d681SAndroid Build Coastguard Worker   return (Val & ~0x00000000ffff0000ULL) == 0;
152*9880d681SAndroid Build Coastguard Worker }
153*9880d681SAndroid Build Coastguard Worker 
154*9880d681SAndroid Build Coastguard Worker // Return true if Val fits an LLIHL operand.
isImmHL(uint64_t Val)155*9880d681SAndroid Build Coastguard Worker static inline bool isImmHL(uint64_t Val) {
156*9880d681SAndroid Build Coastguard Worker   return (Val & ~0x00000ffff00000000ULL) == 0;
157*9880d681SAndroid Build Coastguard Worker }
158*9880d681SAndroid Build Coastguard Worker 
159*9880d681SAndroid Build Coastguard Worker // Return true if Val fits an LLIHH operand.
isImmHH(uint64_t Val)160*9880d681SAndroid Build Coastguard Worker static inline bool isImmHH(uint64_t Val) {
161*9880d681SAndroid Build Coastguard Worker   return (Val & ~0xffff000000000000ULL) == 0;
162*9880d681SAndroid Build Coastguard Worker }
163*9880d681SAndroid Build Coastguard Worker 
164*9880d681SAndroid Build Coastguard Worker // Return true if Val fits an LLILF operand.
isImmLF(uint64_t Val)165*9880d681SAndroid Build Coastguard Worker static inline bool isImmLF(uint64_t Val) {
166*9880d681SAndroid Build Coastguard Worker   return (Val & ~0x00000000ffffffffULL) == 0;
167*9880d681SAndroid Build Coastguard Worker }
168*9880d681SAndroid Build Coastguard Worker 
169*9880d681SAndroid Build Coastguard Worker // Return true if Val fits an LLIHF operand.
isImmHF(uint64_t Val)170*9880d681SAndroid Build Coastguard Worker static inline bool isImmHF(uint64_t Val) {
171*9880d681SAndroid Build Coastguard Worker   return (Val & ~0xffffffff00000000ULL) == 0;
172*9880d681SAndroid Build Coastguard Worker }
173*9880d681SAndroid Build Coastguard Worker } // end namespace SystemZ
174*9880d681SAndroid Build Coastguard Worker 
175*9880d681SAndroid Build Coastguard Worker FunctionPass *createSystemZISelDag(SystemZTargetMachine &TM,
176*9880d681SAndroid Build Coastguard Worker                                    CodeGenOpt::Level OptLevel);
177*9880d681SAndroid Build Coastguard Worker FunctionPass *createSystemZElimComparePass(SystemZTargetMachine &TM);
178*9880d681SAndroid Build Coastguard Worker FunctionPass *createSystemZShortenInstPass(SystemZTargetMachine &TM);
179*9880d681SAndroid Build Coastguard Worker FunctionPass *createSystemZLongBranchPass(SystemZTargetMachine &TM);
180*9880d681SAndroid Build Coastguard Worker FunctionPass *createSystemZLDCleanupPass(SystemZTargetMachine &TM);
181*9880d681SAndroid Build Coastguard Worker FunctionPass *createSystemZTDCPass();
182*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
183*9880d681SAndroid Build Coastguard Worker 
184*9880d681SAndroid Build Coastguard Worker #endif
185