1754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach//===-- ARMBaseInfo.h - Top level definitions for ARM -------- --*- C++ -*-===// 2754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach// 3754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach// The LLVM Compiler Infrastructure 4754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach// 5754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach// This file is distributed under the University of Illinois Open Source 6754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach// License. See LICENSE.TXT for details. 7754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach// 8754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach//===----------------------------------------------------------------------===// 9754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach// 10754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach// This file contains small standalone helper functions and enum definitions for 11754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach// the ARM target useful for the compiler back-end and the MC libraries. 12754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach// As such, it deliberately does not include references to LLVM core 13754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach// code gen types, passes, etc.. 14754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach// 15754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach//===----------------------------------------------------------------------===// 16754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach 17754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach#ifndef ARMBASEINFO_H 18754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach#define ARMBASEINFO_H 19754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach 20be74029f44c32efc09274a16cbff588ad10dc5eaEvan Cheng#include "ARMMCTargetDesc.h" 21754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach#include "llvm/Support/ErrorHandling.h" 22754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach 23754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbachnamespace llvm { 24754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach 25754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach// Enums corresponding to ARM condition codes 26754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbachnamespace ARMCC { 27754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach // The CondCodes constants map directly to the 4-bit encoding of the 28754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach // condition field for predicated instructions. 29754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach enum CondCodes { // Meaning (integer) Meaning (floating-point) 30754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach EQ, // Equal Equal 31754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach NE, // Not equal Not equal, or unordered 32754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach HS, // Carry set >, ==, or unordered 33754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach LO, // Carry clear Less than 34754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach MI, // Minus, negative Less than 35754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach PL, // Plus, positive or zero >, ==, or unordered 36754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach VS, // Overflow Unordered 37754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach VC, // No overflow Not unordered 38754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach HI, // Unsigned higher Greater than, or unordered 39754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach LS, // Unsigned lower or same Less than or equal 40754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach GE, // Greater than or equal Greater than or equal 41754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach LT, // Less than Less than, or unordered 42754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach GT, // Greater than Greater than 43754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach LE, // Less than or equal <, ==, or unordered 44754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach AL // Always (unconditional) Always (unconditional) 45754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach }; 46754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach 47754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach inline static CondCodes getOppositeCondition(CondCodes CC) { 48754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach switch (CC) { 49754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach default: llvm_unreachable("Unknown condition code"); 50754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case EQ: return NE; 51754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case NE: return EQ; 52754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case HS: return LO; 53754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case LO: return HS; 54754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case MI: return PL; 55754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case PL: return MI; 56754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case VS: return VC; 57754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case VC: return VS; 58754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case HI: return LS; 59754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case LS: return HI; 60754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case GE: return LT; 61754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case LT: return GE; 62754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case GT: return LE; 63754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case LE: return GT; 64754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach } 65754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach } 66754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach} // namespace ARMCC 67754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach 68754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbachinline static const char *ARMCondCodeToString(ARMCC::CondCodes CC) { 69754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach switch (CC) { 70754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::EQ: return "eq"; 71754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::NE: return "ne"; 72754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::HS: return "hs"; 73754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::LO: return "lo"; 74754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::MI: return "mi"; 75754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::PL: return "pl"; 76754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::VS: return "vs"; 77754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::VC: return "vc"; 78754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::HI: return "hi"; 79754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::LS: return "ls"; 80754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::GE: return "ge"; 81754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::LT: return "lt"; 82754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::GT: return "gt"; 83754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::LE: return "le"; 84754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ARMCC::AL: return "al"; 85754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach } 86ea7ad3b3e60f91a5256053b26988806f1dbfdd27Richard Smith llvm_unreachable("Unknown condition code"); 87754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach} 88754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach 89a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopesnamespace ARM_PROC { 90a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes enum IMod { 91a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes IE = 2, 92a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes ID = 3 93a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes }; 94a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes 95a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes enum IFlags { 96a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes F = 1, 97a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes I = 2, 98a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes A = 4 99a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes }; 100a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes 101a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes inline static const char *IFlagsToString(unsigned val) { 102a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes switch (val) { 103a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes default: llvm_unreachable("Unknown iflags operand"); 104a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes case F: return "f"; 105a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes case I: return "i"; 106a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes case A: return "a"; 107a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes } 108a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes } 109a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes 110a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes inline static const char *IModToString(unsigned val) { 111a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes switch (val) { 112a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes default: llvm_unreachable("Unknown imod operand"); 113a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes case IE: return "ie"; 114a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes case ID: return "id"; 115a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes } 116a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes } 117a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes} 118a2b6e4151b75248f9dbf8067186cba673520f8f4Bruno Cardoso Lopes 119754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbachnamespace ARM_MB { 120754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach // The Memory Barrier Option constants map directly to the 4-bit encoding of 121754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach // the option field for memory barrier operations. 122754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach enum MemBOpt { 123c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu RESERVED_0 = 0, 124c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu RESERVED_1 = 1, 125c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu OSHST = 2, 126754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach OSH = 3, 127c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu RESERVED_4 = 4, 128c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu RESERVED_5 = 5, 129c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu NSHST = 6, 130c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu NSH = 7, 131c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu RESERVED_8 = 8, 132c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu RESERVED_9 = 9, 133c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu ISHST = 10, 134c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu ISH = 11, 135c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu RESERVED_12 = 12, 136c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu RESERVED_13 = 13, 137c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu ST = 14, 138c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu SY = 15 139754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach }; 140754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach 141754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach inline static const char *MemBOptToString(unsigned val) { 142754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach switch (val) { 1438b7fa198c352993c406b756c84531e33fe1b49ebJim Grosbach default: llvm_unreachable("Unknown memory operation"); 144f74a4298163a7d0b500c7f7a818829c153dc942eBob Wilson case SY: return "sy"; 145754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ST: return "st"; 146c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu case RESERVED_13: return "#0xd"; 147c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu case RESERVED_12: return "#0xc"; 148754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ISH: return "ish"; 149754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case ISHST: return "ishst"; 150c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu case RESERVED_9: return "#0x9"; 151c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu case RESERVED_8: return "#0x8"; 152754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case NSH: return "nsh"; 153754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case NSHST: return "nshst"; 154c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu case RESERVED_5: return "#0x5"; 155c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu case RESERVED_4: return "#0x4"; 156754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case OSH: return "osh"; 157754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach case OSHST: return "oshst"; 158c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu case RESERVED_1: return "#0x1"; 159c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu case RESERVED_0: return "#0x0"; 160754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach } 161754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach } 162754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach} // namespace ARM_MB 163754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach 164194bd8982936c819a4b14335a4d08f28af8f3d42Jim Grosbach/// isARMLowRegister - Returns true if the register is a low register (r0-r7). 165194bd8982936c819a4b14335a4d08f28af8f3d42Jim Grosbach/// 166194bd8982936c819a4b14335a4d08f28af8f3d42Jim Grosbachstatic inline bool isARMLowRegister(unsigned Reg) { 167194bd8982936c819a4b14335a4d08f28af8f3d42Jim Grosbach using namespace ARM; 168194bd8982936c819a4b14335a4d08f28af8f3d42Jim Grosbach switch (Reg) { 169194bd8982936c819a4b14335a4d08f28af8f3d42Jim Grosbach case R0: case R1: case R2: case R3: 170194bd8982936c819a4b14335a4d08f28af8f3d42Jim Grosbach case R4: case R5: case R6: case R7: 171194bd8982936c819a4b14335a4d08f28af8f3d42Jim Grosbach return true; 172194bd8982936c819a4b14335a4d08f28af8f3d42Jim Grosbach default: 173194bd8982936c819a4b14335a4d08f28af8f3d42Jim Grosbach return false; 174194bd8982936c819a4b14335a4d08f28af8f3d42Jim Grosbach } 175194bd8982936c819a4b14335a4d08f28af8f3d42Jim Grosbach} 176194bd8982936c819a4b14335a4d08f28af8f3d42Jim Grosbach 177ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng/// ARMII - This namespace holds all of the target specific flags that 178ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng/// instruction info tracks. 179ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng/// 180c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbachnamespace ARMII { 181ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes 182ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes /// ARM Index Modes 183ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes enum IndexMode { 184ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes IndexModeNone = 0, 185ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes IndexModePre = 1, 186ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes IndexModePost = 2, 187ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes IndexModeUpd = 3 188ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes }; 189ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes 190ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes /// ARM Addressing Modes 191ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes enum AddrMode { 192ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrModeNone = 0, 193ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrMode1 = 1, 194ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrMode2 = 2, 195ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrMode3 = 3, 196ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrMode4 = 4, 197ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrMode5 = 5, 198ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrMode6 = 6, 199ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrModeT1_1 = 7, 200ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrModeT1_2 = 8, 201ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrModeT1_4 = 9, 202ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrModeT1_s = 10, // i8 * 4 for pc and sp relative data 203ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrModeT2_i12 = 11, 204ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrModeT2_i8 = 12, 205ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrModeT2_so = 13, 206ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrModeT2_pc = 14, // +/- i12 for pc relative data 207ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrModeT2_i8s4 = 15, // i8 * 4 208ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes AddrMode_i12 = 16 209ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes }; 210ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes 211ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes inline static const char *AddrModeToString(AddrMode addrmode) { 212ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes switch (addrmode) { 213ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrModeNone: return "AddrModeNone"; 214ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrMode1: return "AddrMode1"; 215ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrMode2: return "AddrMode2"; 216ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrMode3: return "AddrMode3"; 217ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrMode4: return "AddrMode4"; 218ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrMode5: return "AddrMode5"; 219ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrMode6: return "AddrMode6"; 220ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrModeT1_1: return "AddrModeT1_1"; 221ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrModeT1_2: return "AddrModeT1_2"; 222ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrModeT1_4: return "AddrModeT1_4"; 223ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrModeT1_s: return "AddrModeT1_s"; 224ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrModeT2_i12: return "AddrModeT2_i12"; 225ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrModeT2_i8: return "AddrModeT2_i8"; 226ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrModeT2_so: return "AddrModeT2_so"; 227ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrModeT2_pc: return "AddrModeT2_pc"; 228ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrModeT2_i8s4: return "AddrModeT2_i8s4"; 229ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes case AddrMode_i12: return "AddrMode_i12"; 230ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes } 231ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes } 232ae0855401b8c80f96904b6808b0bc4c89216aecdBruno Cardoso Lopes 233c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach /// Target Operand Flag enum. 234c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach enum TOF { 235c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach //===------------------------------------------------------------------===// 236c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach // ARM Specific MachineOperand flags. 237c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach 238c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach MO_NO_FLAG, 239c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach 240c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach /// MO_LO16 - On a symbol operand, this represents a relocation containing 241c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach /// lower 16 bit of the address. Used only via movw instruction. 242c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach MO_LO16, 243c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach 244c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach /// MO_HI16 - On a symbol operand, this represents a relocation containing 245c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach /// higher 16 bit of the address. Used only via movt instruction. 246637d89fe0eca4fa2b9c95f6c15eb69a99bae83bcJim Grosbach MO_HI16, 247637d89fe0eca4fa2b9c95f6c15eb69a99bae83bcJim Grosbach 24853519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng /// MO_LO16_NONLAZY - On a symbol operand "FOO", this represents a 24953519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng /// relocation containing lower 16 bit of the non-lazy-ptr indirect symbol, 25053519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng /// i.e. "FOO$non_lazy_ptr". 25153519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng /// Used only via movw instruction. 25253519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng MO_LO16_NONLAZY, 25353519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng 25453519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng /// MO_HI16_NONLAZY - On a symbol operand "FOO", this represents a 25553519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng /// relocation containing lower 16 bit of the non-lazy-ptr indirect symbol, 25653519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng /// i.e. "FOO$non_lazy_ptr". Used only via movt instruction. 25753519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng MO_HI16_NONLAZY, 25853519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng 2595de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng /// MO_LO16_NONLAZY_PIC - On a symbol operand "FOO", this represents a 2605de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng /// relocation containing lower 16 bit of the PC relative address of the 2615de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng /// non-lazy-ptr indirect symbol, i.e. "FOO$non_lazy_ptr - LABEL". 2625de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng /// Used only via movw instruction. 2635de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng MO_LO16_NONLAZY_PIC, 2645de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng 2655de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng /// MO_HI16_NONLAZY_PIC - On a symbol operand "FOO", this represents a 2665de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng /// relocation containing lower 16 bit of the PC relative address of the 2675de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng /// non-lazy-ptr indirect symbol, i.e. "FOO$non_lazy_ptr - LABEL". 2685de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng /// Used only via movt instruction. 2695de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng MO_HI16_NONLAZY_PIC, 2705de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng 271637d89fe0eca4fa2b9c95f6c15eb69a99bae83bcJim Grosbach /// MO_PLT - On a symbol operand, this represents an ELF PLT reference on a 272637d89fe0eca4fa2b9c95f6c15eb69a99bae83bcJim Grosbach /// call operand. 273637d89fe0eca4fa2b9c95f6c15eb69a99bae83bcJim Grosbach MO_PLT 274c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach }; 275ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 276ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng enum { 277ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng //===------------------------------------------------------------------===// 278ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Instruction Flags. 279ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 280ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng //===------------------------------------------------------------------===// 281ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // This four-bit field describes the addressing mode used. 282ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng AddrModeMask = 0x1f, // The AddrMode enums are declared in ARMBaseInfo.h 283ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 284ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // IndexMode - Unindex, pre-indexed, or post-indexed are valid for load 285ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // and store ops only. Generic "updating" flag is used for ld/st multiple. 286ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // The index mode enums are declared in ARMBaseInfo.h 287ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng IndexModeShift = 5, 288ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng IndexModeMask = 3 << IndexModeShift, 289ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 290ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng //===------------------------------------------------------------------===// 291ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Instruction encoding formats. 292ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // 293ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng FormShift = 7, 294ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng FormMask = 0x3f << FormShift, 295ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 296ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Pseudo instructions 297ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng Pseudo = 0 << FormShift, 298ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 299ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Multiply instructions 300ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng MulFrm = 1 << FormShift, 301ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 302ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Branch instructions 303ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng BrFrm = 2 << FormShift, 304ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng BrMiscFrm = 3 << FormShift, 305ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 306ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Data Processing instructions 307ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng DPFrm = 4 << FormShift, 308ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng DPSoRegFrm = 5 << FormShift, 309ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 310ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Load and Store 311ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng LdFrm = 6 << FormShift, 312ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng StFrm = 7 << FormShift, 313ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng LdMiscFrm = 8 << FormShift, 314ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng StMiscFrm = 9 << FormShift, 315ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng LdStMulFrm = 10 << FormShift, 316ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 317ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng LdStExFrm = 11 << FormShift, 318ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 319ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Miscellaneous arithmetic instructions 320ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng ArithMiscFrm = 12 << FormShift, 321ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng SatFrm = 13 << FormShift, 322ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 323ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Extend instructions 324ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng ExtFrm = 14 << FormShift, 325ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 326ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // VFP formats 327ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng VFPUnaryFrm = 15 << FormShift, 328ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng VFPBinaryFrm = 16 << FormShift, 329ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng VFPConv1Frm = 17 << FormShift, 330ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng VFPConv2Frm = 18 << FormShift, 331ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng VFPConv3Frm = 19 << FormShift, 332ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng VFPConv4Frm = 20 << FormShift, 333ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng VFPConv5Frm = 21 << FormShift, 334ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng VFPLdStFrm = 22 << FormShift, 335ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng VFPLdStMulFrm = 23 << FormShift, 336ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng VFPMiscFrm = 24 << FormShift, 337ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 338ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Thumb format 339ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng ThumbFrm = 25 << FormShift, 340ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 341ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Miscelleaneous format 342ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng MiscFrm = 26 << FormShift, 343ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 344ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // NEON formats 345ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng NGetLnFrm = 27 << FormShift, 346ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng NSetLnFrm = 28 << FormShift, 347ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng NDupFrm = 29 << FormShift, 348ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng NLdStFrm = 30 << FormShift, 349ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng N1RegModImmFrm= 31 << FormShift, 350ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng N2RegFrm = 32 << FormShift, 351ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng NVCVTFrm = 33 << FormShift, 352ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng NVDupLnFrm = 34 << FormShift, 353ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng N2RegVShLFrm = 35 << FormShift, 354ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng N2RegVShRFrm = 36 << FormShift, 355ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng N3RegFrm = 37 << FormShift, 356ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng N3RegVShFrm = 38 << FormShift, 357ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng NVExtFrm = 39 << FormShift, 358ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng NVMulSLFrm = 40 << FormShift, 359ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng NVTBLFrm = 41 << FormShift, 360ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 361ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng //===------------------------------------------------------------------===// 362ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Misc flags. 363ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 364ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // UnaryDP - Indicates this is a unary data processing instruction, i.e. 365ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // it doesn't have a Rn operand. 366ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng UnaryDP = 1 << 13, 367ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 368ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Xform16Bit - Indicates this Thumb2 instruction may be transformed into 369ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // a 16-bit Thumb instruction if certain conditions are met. 370ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng Xform16Bit = 1 << 14, 371ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 37247a0d52b69056250a1edaca8b28f705993094542Jim Grosbach // ThumbArithFlagSetting - The instruction is a 16-bit flag setting Thumb 37347a0d52b69056250a1edaca8b28f705993094542Jim Grosbach // instruction. Used by the parser to determine whether to require the 'S' 37447a0d52b69056250a1edaca8b28f705993094542Jim Grosbach // suffix on the mnemonic (when not in an IT block) or preclude it (when 37547a0d52b69056250a1edaca8b28f705993094542Jim Grosbach // in an IT block). 37647a0d52b69056250a1edaca8b28f705993094542Jim Grosbach ThumbArithFlagSetting = 1 << 18, 37747a0d52b69056250a1edaca8b28f705993094542Jim Grosbach 378ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng //===------------------------------------------------------------------===// 379ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Code domain. 380ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng DomainShift = 15, 381ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng DomainMask = 7 << DomainShift, 382ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng DomainGeneral = 0 << DomainShift, 383ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng DomainVFP = 1 << DomainShift, 384ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng DomainNEON = 2 << DomainShift, 385ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng DomainNEONA8 = 4 << DomainShift, 386ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 387ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng //===------------------------------------------------------------------===// 388ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // Field shifts - such shifts are used to set field while generating 389ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // machine instructions. 390ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // 391ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // FIXME: This list will need adjusting/fixing as the MC code emitter 392ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng // takes shape and the ARMCodeEmitter.cpp bits go away. 393ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng ShiftTypeShift = 4, 394ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 395ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng M_BitShift = 5, 396ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng ShiftImmShift = 5, 397ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng ShiftShift = 7, 398ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng N_BitShift = 7, 399ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng ImmHiShift = 8, 400ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng SoRotImmShift = 8, 401ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng RegRsShift = 8, 402ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng ExtRotImmShift = 10, 403ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng RegRdLoShift = 12, 404ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng RegRdShift = 12, 405ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng RegRdHiShift = 16, 406ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng RegRnShift = 16, 407ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng S_BitShift = 20, 408ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng W_BitShift = 21, 409ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng AM3_I_BitShift = 22, 410ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng D_BitShift = 22, 411ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng U_BitShift = 23, 412ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng P_BitShift = 24, 413ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng I_BitShift = 25, 414ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng CondShift = 28 415ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng }; 416ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng 417c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach} // end namespace ARMII 418c686e33d12f84e1e1f5c96eadef851d078bab043Jim Grosbach 419a4c3c8f28d9465dc7c42eb43c2377530f1821574Jim Grosbach} // end namespace llvm; 420754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach 421754578b56518d57c28cd439a6dab2b75865e6746Jim Grosbach#endif 422