mirror of
https://github.com/dart-lang/sdk
synced 2024-09-05 00:13:50 +00:00
![Aske Simon Christensen](/assets/img/avatar_default.png)
This is a reland of 6ecd8a10ea
Original change's description:
> [vm] MemoryCopy instruction for copying between typed data and strings.
>
> Used for copying the bytes from the Uint8List to the _OneByteString in
> String.fromCharCodes and the pure-ASCII case of UTF-8 decoding.
>
> Issue https://github.com/dart-lang/sdk/issues/42072
> Closes https://github.com/dart-lang/sdk/issues/41703
>
> Change-Id: I1ae300222877d1c6e64e32c2f40b8fb187a584c0
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149500
> Commit-Queue: Aske Simon Christensen <askesc@google.com>
> Reviewed-by: Martin Kustermann <kustermann@google.com>
Change-Id: Ia231c521e5f2db168cfc6094dfc7322327dedc6d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/150925
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Aske Simon Christensen <askesc@google.com>
148 lines
7.1 KiB
C++
148 lines
7.1 KiB
C++
// 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_
|