X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FARM%2FARM.h;h=b41ef90f129e0c32d03555a3321bdabbf997d248;hb=0c795d61878156817cedbac51ec2921f2634c1a5;hp=ca84634bed48a5bd33175da48f03c4eb9761b62f;hpb=3ad5e5cf998841681e9d11e08eb82a94ddffd1f8;p=oota-llvm.git diff --git a/lib/Target/ARM/ARM.h b/lib/Target/ARM/ARM.h index ca84634bed4..b41ef90f129 100644 --- a/lib/Target/ARM/ARM.h +++ b/lib/Target/ARM/ARM.h @@ -2,8 +2,7 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by the "Instituto Nokia de Tecnologia" and -// is distributed under the University of Illinois Open Source +// This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// @@ -16,67 +15,101 @@ #ifndef TARGET_ARM_H #define TARGET_ARM_H -#include +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Target/TargetMachine.h" #include namespace llvm { - // Enums corresponding to ARM condition codes - namespace ARMCC { - enum CondCodes { - EQ, - NE, - CS, - CC, - MI, - PL, - VS, - VC, - HI, - LS, - GE, - LT, - GT, - LE, - AL - }; - } - namespace ARMShift { - enum ShiftTypes { - LSL, - LSR, - ASR, - ROR, - RRX - }; - } +class ARMBaseTargetMachine; +class FunctionPass; +class MachineCodeEmitter; +class JITCodeEmitter; +class ObjectCodeEmitter; +class formatted_raw_ostream; + +// Enums corresponding to ARM condition codes +namespace ARMCC { + // The CondCodes constants map directly to the 4-bit encoding of the + // condition field for predicated instructions. + enum CondCodes { + EQ, + NE, + HS, + LO, + MI, + PL, + VS, + VC, + HI, + LS, + GE, + LT, + GT, + LE, + AL + }; - static const char *ARMCondCodeToString(ARMCC::CondCodes CC) { + inline static CondCodes getOppositeCondition(CondCodes CC){ switch (CC) { - default: assert(0 && "Unknown condition code"); - case ARMCC::EQ: return "eq"; - case ARMCC::NE: return "ne"; - case ARMCC::CS: return "cs"; - case ARMCC::CC: return "cc"; - case ARMCC::MI: return "mi"; - case ARMCC::PL: return "pl"; - case ARMCC::VS: return "vs"; - case ARMCC::VC: return "vc"; - case ARMCC::HI: return "hi"; - case ARMCC::LS: return "ls"; - case ARMCC::GE: return "ge"; - case ARMCC::LT: return "lt"; - case ARMCC::GT: return "gt"; - case ARMCC::LE: return "le"; - case ARMCC::AL: return "al"; + default: llvm_unreachable("Unknown condition code"); + case EQ: return NE; + case NE: return EQ; + case HS: return LO; + case LO: return HS; + case MI: return PL; + case PL: return MI; + case VS: return VC; + case VC: return VS; + case HI: return LS; + case LS: return HI; + case GE: return LT; + case LT: return GE; + case GT: return LE; + case LE: return GT; } } +} + +inline static const char *ARMCondCodeToString(ARMCC::CondCodes CC) { + switch (CC) { + default: llvm_unreachable("Unknown condition code"); + case ARMCC::EQ: return "eq"; + case ARMCC::NE: return "ne"; + case ARMCC::HS: return "hs"; + case ARMCC::LO: return "lo"; + case ARMCC::MI: return "mi"; + case ARMCC::PL: return "pl"; + case ARMCC::VS: return "vs"; + case ARMCC::VC: return "vc"; + case ARMCC::HI: return "hi"; + case ARMCC::LS: return "ls"; + case ARMCC::GE: return "ge"; + case ARMCC::LT: return "lt"; + case ARMCC::GT: return "gt"; + case ARMCC::LE: return "le"; + case ARMCC::AL: return "al"; + } +} + +FunctionPass *createARMISelDag(ARMBaseTargetMachine &TM); +FunctionPass *createARMCodeEmitterPass(ARMBaseTargetMachine &TM, + MachineCodeEmitter &MCE); + +FunctionPass *createARMCodeEmitterPass(ARMBaseTargetMachine &TM, + MachineCodeEmitter &MCE); +FunctionPass *createARMJITCodeEmitterPass(ARMBaseTargetMachine &TM, + JITCodeEmitter &JCE); +FunctionPass *createARMObjectCodeEmitterPass(ARMBaseTargetMachine &TM, + ObjectCodeEmitter &OCE); + +FunctionPass *createARMLoadStoreOptimizationPass(bool PreAlloc = false); +FunctionPass *createARMConstantIslandPass(); + +FunctionPass *createThumb2ITBlockPass(); - class FunctionPass; - class TargetMachine; +extern Target TheARMTarget, TheThumbTarget; - FunctionPass *createARMISelDag(TargetMachine &TM); - FunctionPass *createARMCodePrinterPass(std::ostream &OS, TargetMachine &TM); } // end namespace llvm; // Defines symbolic names for ARM registers. This defines a mapping from