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