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