1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2011 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_COMPILER_UTILS_X86_CONSTANTS_X86_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_COMPILER_UTILS_X86_CONSTANTS_X86_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include <iosfwd> 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker #include <android-base/logging.h> 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker #include "arch/x86/registers_x86.h" 25*795d594fSAndroid Build Coastguard Worker #include "base/globals.h" 26*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 29*795d594fSAndroid Build Coastguard Worker namespace x86 { 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker enum ByteRegister { 32*795d594fSAndroid Build Coastguard Worker AL = 0, 33*795d594fSAndroid Build Coastguard Worker CL = 1, 34*795d594fSAndroid Build Coastguard Worker DL = 2, 35*795d594fSAndroid Build Coastguard Worker BL = 3, 36*795d594fSAndroid Build Coastguard Worker AH = 4, 37*795d594fSAndroid Build Coastguard Worker CH = 5, 38*795d594fSAndroid Build Coastguard Worker DH = 6, 39*795d594fSAndroid Build Coastguard Worker BH = 7, 40*795d594fSAndroid Build Coastguard Worker kNoByteRegister = -1 // Signals an illegal register. 41*795d594fSAndroid Build Coastguard Worker }; 42*795d594fSAndroid Build Coastguard Worker 43*795d594fSAndroid Build Coastguard Worker enum X87Register { 44*795d594fSAndroid Build Coastguard Worker ST0 = 0, 45*795d594fSAndroid Build Coastguard Worker ST1 = 1, 46*795d594fSAndroid Build Coastguard Worker ST2 = 2, 47*795d594fSAndroid Build Coastguard Worker ST3 = 3, 48*795d594fSAndroid Build Coastguard Worker ST4 = 4, 49*795d594fSAndroid Build Coastguard Worker ST5 = 5, 50*795d594fSAndroid Build Coastguard Worker ST6 = 6, 51*795d594fSAndroid Build Coastguard Worker ST7 = 7, 52*795d594fSAndroid Build Coastguard Worker kNumberOfX87Registers = 8, 53*795d594fSAndroid Build Coastguard Worker kNoX87Register = -1 // Signals an illegal register. 54*795d594fSAndroid Build Coastguard Worker }; 55*795d594fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const X87Register& reg); 56*795d594fSAndroid Build Coastguard Worker 57*795d594fSAndroid Build Coastguard Worker enum Condition { 58*795d594fSAndroid Build Coastguard Worker kOverflow = 0, 59*795d594fSAndroid Build Coastguard Worker kNoOverflow = 1, 60*795d594fSAndroid Build Coastguard Worker kBelow = 2, 61*795d594fSAndroid Build Coastguard Worker kAboveEqual = 3, 62*795d594fSAndroid Build Coastguard Worker kEqual = 4, 63*795d594fSAndroid Build Coastguard Worker kNotEqual = 5, 64*795d594fSAndroid Build Coastguard Worker kBelowEqual = 6, 65*795d594fSAndroid Build Coastguard Worker kAbove = 7, 66*795d594fSAndroid Build Coastguard Worker kSign = 8, 67*795d594fSAndroid Build Coastguard Worker kNotSign = 9, 68*795d594fSAndroid Build Coastguard Worker kParityEven = 10, 69*795d594fSAndroid Build Coastguard Worker kParityOdd = 11, 70*795d594fSAndroid Build Coastguard Worker kLess = 12, 71*795d594fSAndroid Build Coastguard Worker kGreaterEqual = 13, 72*795d594fSAndroid Build Coastguard Worker kLessEqual = 14, 73*795d594fSAndroid Build Coastguard Worker kGreater = 15, 74*795d594fSAndroid Build Coastguard Worker 75*795d594fSAndroid Build Coastguard Worker kZero = kEqual, 76*795d594fSAndroid Build Coastguard Worker kNotZero = kNotEqual, 77*795d594fSAndroid Build Coastguard Worker kNegative = kSign, 78*795d594fSAndroid Build Coastguard Worker kPositive = kNotSign, 79*795d594fSAndroid Build Coastguard Worker kCarrySet = kBelow, 80*795d594fSAndroid Build Coastguard Worker kCarryClear = kAboveEqual, 81*795d594fSAndroid Build Coastguard Worker kUnordered = kParityEven 82*795d594fSAndroid Build Coastguard Worker }; 83*795d594fSAndroid Build Coastguard Worker 84*795d594fSAndroid Build Coastguard Worker 85*795d594fSAndroid Build Coastguard Worker class Instr { 86*795d594fSAndroid Build Coastguard Worker public: 87*795d594fSAndroid Build Coastguard Worker static const uint8_t kHltInstruction = 0xF4; 88*795d594fSAndroid Build Coastguard Worker // We prefer not to use the int3 instruction since it conflicts with gdb. 89*795d594fSAndroid Build Coastguard Worker static const uint8_t kBreakPointInstruction = kHltInstruction; 90*795d594fSAndroid Build Coastguard Worker IsBreakPoint()91*795d594fSAndroid Build Coastguard Worker bool IsBreakPoint() { 92*795d594fSAndroid Build Coastguard Worker return (*reinterpret_cast<const uint8_t*>(this)) == kBreakPointInstruction; 93*795d594fSAndroid Build Coastguard Worker } 94*795d594fSAndroid Build Coastguard Worker 95*795d594fSAndroid Build Coastguard Worker // Instructions are read out of a code stream. The only way to get a 96*795d594fSAndroid Build Coastguard Worker // reference to an instruction is to convert a pointer. There is no way 97*795d594fSAndroid Build Coastguard Worker // to allocate or create instances of class Instr. 98*795d594fSAndroid Build Coastguard Worker // Use the At(pc) function to create references to Instr. At(uintptr_t pc)99*795d594fSAndroid Build Coastguard Worker static Instr* At(uintptr_t pc) { return reinterpret_cast<Instr*>(pc); } 100*795d594fSAndroid Build Coastguard Worker 101*795d594fSAndroid Build Coastguard Worker private: 102*795d594fSAndroid Build Coastguard Worker DISALLOW_IMPLICIT_CONSTRUCTORS(Instr); 103*795d594fSAndroid Build Coastguard Worker }; 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker } // namespace x86 106*795d594fSAndroid Build Coastguard Worker } // namespace art 107*795d594fSAndroid Build Coastguard Worker 108*795d594fSAndroid Build Coastguard Worker #endif // ART_COMPILER_UTILS_X86_CONSTANTS_X86_H_ 109