1// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2// for details. All rights reserved. Use of this source code is governed by a
3// BSD-style license that can be found in the LICENSE file.
4
5#ifndef RUNTIME_VM_CONSTANTS_X86_H_
6#define RUNTIME_VM_CONSTANTS_X86_H_
7
8#include "platform/assert.h"
9
10namespace dart {
11
12enum Condition {
13 OVERFLOW = 0,
14 NO_OVERFLOW = 1,
15 BELOW = 2,
16 ABOVE_EQUAL = 3,
17 EQUAL = 4,
18 NOT_EQUAL = 5,
19 BELOW_EQUAL = 6,
20 ABOVE = 7,
21 SIGN = 8,
22 NOT_SIGN = 9,
23 PARITY_EVEN = 10,
24 PARITY_ODD = 11,
25 LESS = 12,
26 GREATER_EQUAL = 13,
27 LESS_EQUAL = 14,
28 GREATER = 15,
29
30 ZERO = EQUAL,
31 NOT_ZERO = NOT_EQUAL,
32 NEGATIVE = SIGN,
33 POSITIVE = NOT_SIGN,
34 CARRY = BELOW,
35 NOT_CARRY = ABOVE_EQUAL,
36
37 // Platform-independent variants declared for all platforms
38 // EQUAL,
39 // NOT_EQUAL,
40 // LESS,
41 // LESS_EQUAL,
42 // GREATER_EQUAL,
43 // GREATER,
44 UNSIGNED_LESS = BELOW,
45 UNSIGNED_LESS_EQUAL = BELOW_EQUAL,
46 UNSIGNED_GREATER = ABOVE,
47 UNSIGNED_GREATER_EQUAL = ABOVE_EQUAL,
48
49 kInvalidCondition = 16
50};
51
52static inline Condition InvertCondition(Condition c) {
53 COMPILE_ASSERT((OVERFLOW ^ NO_OVERFLOW) == 1);
54 COMPILE_ASSERT((BELOW ^ ABOVE_EQUAL) == 1);
55 COMPILE_ASSERT((EQUAL ^ NOT_EQUAL) == 1);
56 COMPILE_ASSERT((BELOW_EQUAL ^ ABOVE) == 1);
57 COMPILE_ASSERT((SIGN ^ NOT_SIGN) == 1);
58 COMPILE_ASSERT((PARITY_EVEN ^ PARITY_ODD) == 1);
59 COMPILE_ASSERT((LESS ^ GREATER_EQUAL) == 1);
60 COMPILE_ASSERT((LESS_EQUAL ^ GREATER) == 1);
61 ASSERT(c != kInvalidCondition);
62 return static_cast<Condition>(c ^ 1);
63}
64
65#define X86_ZERO_OPERAND_1_BYTE_INSTRUCTIONS(F) \
66 F(ret, 0xC3) \
67 F(leave, 0xC9) \
68 F(hlt, 0xF4) \
69 F(cld, 0xFC) \
70 F(int3, 0xCC) \
71 F(pushad, 0x60) \
72 F(popad, 0x61) \
73 F(pushfd, 0x9C) \
74 F(popfd, 0x9D) \
75 F(sahf, 0x9E) \
76 F(cdq, 0x99) \
77 F(fwait, 0x9B) \
78 F(movsb, 0xA4) \
79 F(movs, 0xA5) /* Size suffix added in code */ \
80 F(cmpsb, 0xA6) \
81 F(cmps, 0xA7) /* Size suffix added in code */
82
83// clang-format off
84#define X86_ALU_CODES(F) \
85 F(and, 4) \
86 F(or, 1) \
87 F(xor, 6) \
88 F(add, 0) \
89 F(adc, 2) \
90 F(sub, 5) \
91 F(sbb, 3) \
92 F(cmp, 7)
93
94#define XMM_ALU_CODES(F) \
95 F(bad0, 0) \
96 F(sqrt, 1) \
97 F(rsqrt, 2) \
98 F(rcp, 3) \
99 F(and, 4) \
100 F(bad1, 5) \
101 F(or, 6) \
102 F(xor, 7) \
103 F(add, 8) \
104 F(mul, 9) \
105 F(bad2, 0xA) \
106 F(bad3, 0xB) \
107 F(sub, 0xC) \
108 F(min, 0xD) \
109 F(div, 0xE) \
110 F(max, 0xF)
111// clang-format on
112
113// Table 3-1, first part
114#define XMM_CONDITIONAL_CODES(F) \
115 F(eq, 0) \
116 F(lt, 1) \
117 F(le, 2) \
118 F(unord, 3) \
119 F(neq, 4) \
120 F(nlt, 5) \
121 F(nle, 6) \
122 F(ord, 7)
123
124#define X86_CONDITIONAL_SUFFIXES(F) \
125 F(o, OVERFLOW) \
126 F(no, NO_OVERFLOW) \
127 F(c, CARRY) \
128 F(nc, NOT_CARRY) \
129 F(z, ZERO) \
130 F(nz, NOT_ZERO) \
131 F(na, BELOW_EQUAL) \
132 F(a, ABOVE) \
133 F(s, SIGN) \
134 F(ns, NOT_SIGN) \
135 F(pe, PARITY_EVEN) \
136 F(po, PARITY_ODD) \
137 F(l, LESS) \
138 F(ge, GREATER_EQUAL) \
139 F(le, LESS_EQUAL) \
140 F(g, GREATER) \
141 /* Some alternative names */ \
142 F(e, EQUAL) \
143 F(ne, NOT_EQUAL)
144
145} // namespace dart
146
147#endif // RUNTIME_VM_CONSTANTS_X86_H_
148