blob: 2dfb65c479d5c3364375b4d9dd9a0014c41e3587 [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
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 */
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070016
Ian Rogers166db042013-07-26 12:05:57 -070017#ifndef ART_COMPILER_UTILS_X86_CONSTANTS_X86_H_
18#define ART_COMPILER_UTILS_X86_CONSTANTS_X86_H_
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070019
Ian Rogersb033c752011-07-20 12:22:35 -070020#include <iosfwd>
Elliott Hughes07ed66b2012-12-12 18:34:25 -080021
Ian Rogers166db042013-07-26 12:05:57 -070022#include "arch/x86/registers_x86.h"
Elliott Hughes07ed66b2012-12-12 18:34:25 -080023#include "base/logging.h"
Elliott Hughes76160052012-12-12 16:31:20 -080024#include "base/macros.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070025#include "globals.h"
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070026
Carl Shapiro6b6b5f02011-06-21 15:05:09 -070027namespace art {
Ian Rogers2c8f6532011-09-02 17:16:34 -070028namespace x86 {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070029
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070030enum 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};
Ian Rogersb033c752011-07-20 12:22:35 -070055std::ostream& operator<<(std::ostream& os, const XmmRegister& reg);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070056
Ian Rogersb033c752011-07-20 12:22:35 -070057enum 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);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070070
71enum ScaleFactor {
72 TIMES_1 = 0,
73 TIMES_2 = 1,
74 TIMES_4 = 2,
75 TIMES_8 = 3
76};
77
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070078enum Condition {
Elliott Hughes18c07532011-08-18 15:50:51 -070079 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,
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070095
Elliott Hughes18c07532011-08-18 15:50:51 -070096 kZero = kEqual,
97 kNotZero = kNotEqual,
98 kNegative = kSign,
Calin Juravlecea28ec2014-11-25 20:56:51 +000099 kPositive = kNotSign,
100 kUnordered = kParityEven
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700101};
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;
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700109
110 bool IsBreakPoint() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700111 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
Ian Rogers2c8f6532011-09-02 17:16:34 -0700124} // namespace x86
Carl Shapiro6b6b5f02011-06-21 15:05:09 -0700125} // namespace art
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700126
Ian Rogers166db042013-07-26 12:05:57 -0700127#endif // ART_COMPILER_UTILS_X86_CONSTANTS_X86_H_