blob: 36bc6a650b95e75983cf260576f6e7b1fd868a5e [file] [log] [blame]
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#ifndef RUNTIME_VM_CONSTANTS_X86_H_
#define RUNTIME_VM_CONSTANTS_X86_H_
#include "platform/assert.h"
namespace dart {
enum Condition {
OVERFLOW = 0,
NO_OVERFLOW = 1,
BELOW = 2,
ABOVE_EQUAL = 3,
EQUAL = 4,
NOT_EQUAL = 5,
BELOW_EQUAL = 6,
ABOVE = 7,
SIGN = 8,
NOT_SIGN = 9,
PARITY_EVEN = 10,
PARITY_ODD = 11,
LESS = 12,
GREATER_EQUAL = 13,
LESS_EQUAL = 14,
GREATER = 15,
ZERO = EQUAL,
NOT_ZERO = NOT_EQUAL,
NEGATIVE = SIGN,
POSITIVE = NOT_SIGN,
CARRY = BELOW,
NOT_CARRY = ABOVE_EQUAL,
// Platform-independent variants declared for all platforms
// EQUAL,
// NOT_EQUAL,
// LESS,
// LESS_EQUAL,
// GREATER_EQUAL,
// GREATER,
UNSIGNED_LESS = BELOW,
UNSIGNED_LESS_EQUAL = BELOW_EQUAL,
UNSIGNED_GREATER = ABOVE,
UNSIGNED_GREATER_EQUAL = ABOVE_EQUAL,
kInvalidCondition = 16
};
static inline Condition InvertCondition(Condition c) {
COMPILE_ASSERT((OVERFLOW ^ NO_OVERFLOW) == 1);
COMPILE_ASSERT((BELOW ^ ABOVE_EQUAL) == 1);
COMPILE_ASSERT((EQUAL ^ NOT_EQUAL) == 1);
COMPILE_ASSERT((BELOW_EQUAL ^ ABOVE) == 1);
COMPILE_ASSERT((SIGN ^ NOT_SIGN) == 1);
COMPILE_ASSERT((PARITY_EVEN ^ PARITY_ODD) == 1);
COMPILE_ASSERT((LESS ^ GREATER_EQUAL) == 1);
COMPILE_ASSERT((LESS_EQUAL ^ GREATER) == 1);
ASSERT(c != kInvalidCondition);
return static_cast<Condition>(c ^ 1);
}
#define X86_ZERO_OPERAND_1_BYTE_INSTRUCTIONS(F) \
F(ret, 0xC3) \
F(leave, 0xC9) \
F(hlt, 0xF4) \
F(cld, 0xFC) \
F(int3, 0xCC) \
F(pushad, 0x60) \
F(popad, 0x61) \
F(pushfd, 0x9C) \
F(popfd, 0x9D) \
F(sahf, 0x9E) \
F(cdq, 0x99) \
F(fwait, 0x9B) \
F(movsb, 0xA4) \
F(movs, 0xA5) /* Size suffix added in code */ \
F(cmpsb, 0xA6) \
F(cmps, 0xA7) /* Size suffix added in code */
// clang-format off
#define X86_ALU_CODES(F) \
F(and, 4) \
F(or, 1) \
F(xor, 6) \
F(add, 0) \
F(adc, 2) \
F(sub, 5) \
F(sbb, 3) \
F(cmp, 7)
#define XMM_ALU_CODES(F) \
F(bad0, 0) \
F(sqrt, 1) \
F(rsqrt, 2) \
F(rcp, 3) \
F(and, 4) \
F(bad1, 5) \
F(or, 6) \
F(xor, 7) \
F(add, 8) \
F(mul, 9) \
F(bad2, 0xA) \
F(bad3, 0xB) \
F(sub, 0xC) \
F(min, 0xD) \
F(div, 0xE) \
F(max, 0xF)
// clang-format on
// Table 3-1, first part
#define XMM_CONDITIONAL_CODES(F) \
F(eq, 0) \
F(lt, 1) \
F(le, 2) \
F(unord, 3) \
F(neq, 4) \
F(nlt, 5) \
F(nle, 6) \
F(ord, 7)
#define X86_CONDITIONAL_SUFFIXES(F) \
F(o, OVERFLOW) \
F(no, NO_OVERFLOW) \
F(c, CARRY) \
F(nc, NOT_CARRY) \
F(z, ZERO) \
F(nz, NOT_ZERO) \
F(na, BELOW_EQUAL) \
F(a, ABOVE) \
F(s, SIGN) \
F(ns, NOT_SIGN) \
F(pe, PARITY_EVEN) \
F(po, PARITY_ODD) \
F(l, LESS) \
F(ge, GREATER_EQUAL) \
F(le, LESS_EQUAL) \
F(g, GREATER) \
/* Some alternative names */ \
F(e, EQUAL) \
F(ne, NOT_EQUAL)
} // namespace dart
#endif // RUNTIME_VM_CONSTANTS_X86_H_