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
27namespace art {
28namespace x86 {
29
30enum 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
43enum 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};
55std::ostream& operator<<(std::ostream& os, const XmmRegister& reg);
56
57enum 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};
69std::ostream& operator<<(std::ostream& os, const X87Register& reg);
70
71enum ScaleFactor {
72  TIMES_1 = 0,
73  TIMES_2 = 1,
74  TIMES_4 = 2,
75  TIMES_8 = 3
76};
77
78enum 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
104class 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
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.
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