mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-19 08:15:31 +00:00
Bug 1401624: Part 8: Convert C-style macros to JS::detail constexprs r=jwalden
Differential Revision: https://phabricator.services.mozilla.com/D33503 --HG-- extra : moz-landing-system : lando
This commit is contained in:
parent
e68b24eb5b
commit
98788f0b1c
@ -139,9 +139,9 @@ static_assert(sizeof(JSValueTag) == sizeof(uint32_t),
|
||||
* efficiently test membership in certain classes:
|
||||
* 1. As described above, Object is zero-tagged. Therefore,
|
||||
* anything with a non-zero tag is primitive.
|
||||
* 3. All GC tags are <= BigInt.
|
||||
* 3. All GC tags are < Undefined.
|
||||
* 4. All numbers are >= Int32.
|
||||
* See JSVAL_TEST_IS_PRIMITIVE and friends.
|
||||
* See ValueTestIsPrimitive and friends.
|
||||
*/
|
||||
|
||||
enum JSValueTag : uint32_t {
|
||||
@ -160,35 +160,6 @@ enum JSValueTag : uint32_t {
|
||||
JSVAL_TAG_UNKNOWN = 0xF
|
||||
};
|
||||
|
||||
constexpr JSValueTag JSValueTypeToTag(JSValueType type) {
|
||||
switch (type) {
|
||||
case JSVAL_TYPE_OBJECT:
|
||||
return JSVAL_TAG_OBJECT;
|
||||
case JSVAL_TYPE_PRIVATE_GCTHING:
|
||||
return JSVAL_TAG_PRIVATE_GCTHING;
|
||||
case JSVAL_TYPE_STRING:
|
||||
return JSVAL_TAG_STRING;
|
||||
case JSVAL_TYPE_SYMBOL:
|
||||
return JSVAL_TAG_SYMBOL;
|
||||
case JSVAL_TYPE_BIGINT:
|
||||
return JSVAL_TAG_BIGINT;
|
||||
case JSVAL_TYPE_UNDEFINED:
|
||||
return JSVAL_TAG_UNDEFINED;
|
||||
case JSVAL_TYPE_NULL:
|
||||
return JSVAL_TAG_NULL;
|
||||
case JSVAL_TYPE_BOOLEAN:
|
||||
return JSVAL_TAG_BOOLEAN;
|
||||
case JSVAL_TYPE_MAGIC:
|
||||
return JSVAL_TAG_MAGIC;
|
||||
case JSVAL_TYPE_INT32:
|
||||
return JSVAL_TAG_INT32;
|
||||
|
||||
default:
|
||||
MOZ_ASSERT_UNREACHABLE("Type does not have corresponding tag");
|
||||
return JSVAL_TAG_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
constexpr JSValueType JSValueTagToType(JSValueTag tag) {
|
||||
switch (tag) {
|
||||
case JSVAL_TAG_OBJECT:
|
||||
@ -245,41 +216,94 @@ static_assert(static_cast<uint64_t>(JSVAL_SHIFTED_TAG_OBJECT) == 0,
|
||||
|
||||
#endif
|
||||
|
||||
namespace JS {
|
||||
namespace detail {
|
||||
|
||||
#if defined(JS_NUNBOX32)
|
||||
|
||||
# define JSVAL_TYPE_TO_TAG(type) ((JSValueTag)(JSVAL_TAG_CLEAR | (type)))
|
||||
constexpr JSValueTag ValueTypeToTag(JSValueType type) {
|
||||
return static_cast<JSValueTag>(JSVAL_TAG_CLEAR | type);
|
||||
}
|
||||
|
||||
# define JSVAL_UPPER_EXCL_TAG_OF_PRIMITIVE_SET JSVAL_TAG_OBJECT
|
||||
# define JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET JSVAL_TAG_INT32
|
||||
# define JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET JSVAL_TAG_STRING
|
||||
constexpr JSValueTag ValueUpperExclPrimitiveTag = JSVAL_TAG_OBJECT;
|
||||
constexpr JSValueTag ValueUpperInclNumberTag = JSVAL_TAG_INT32;
|
||||
constexpr JSValueTag ValueLowerInclGCThingTag = JSVAL_TAG_STRING;
|
||||
|
||||
#elif defined(JS_PUNBOX64)
|
||||
|
||||
// This should only be used in toGCThing, see the 'Spectre mitigations' comment.
|
||||
# define JSVAL_PAYLOAD_MASK_GCTHING 0x00007FFFFFFFFFFFLL
|
||||
constexpr uint64_t ValueTagMask = 0xFFFF'8000'0000'0000;
|
||||
|
||||
# define JSVAL_TAG_MASK 0xFFFF800000000000LL
|
||||
# define JSVAL_TYPE_TO_TAG(type) (JSValueTypeToTag(type))
|
||||
// This should only be used in toGCThing. See the 'Spectre mitigations' comment.
|
||||
constexpr uint64_t ValueGCThingPayloadMask = 0x0000'7FFF'FFFF'FFFF;
|
||||
|
||||
constexpr JSValueTag ValueTypeToTag(JSValueType type) {
|
||||
switch (type) {
|
||||
case JSVAL_TYPE_OBJECT:
|
||||
return JSVAL_TAG_OBJECT;
|
||||
case JSVAL_TYPE_PRIVATE_GCTHING:
|
||||
return JSVAL_TAG_PRIVATE_GCTHING;
|
||||
case JSVAL_TYPE_STRING:
|
||||
return JSVAL_TAG_STRING;
|
||||
case JSVAL_TYPE_SYMBOL:
|
||||
return JSVAL_TAG_SYMBOL;
|
||||
case JSVAL_TYPE_BIGINT:
|
||||
return JSVAL_TAG_BIGINT;
|
||||
case JSVAL_TYPE_UNDEFINED:
|
||||
return JSVAL_TAG_UNDEFINED;
|
||||
case JSVAL_TYPE_NULL:
|
||||
return JSVAL_TAG_NULL;
|
||||
case JSVAL_TYPE_BOOLEAN:
|
||||
return JSVAL_TAG_BOOLEAN;
|
||||
case JSVAL_TYPE_MAGIC:
|
||||
return JSVAL_TAG_MAGIC;
|
||||
case JSVAL_TYPE_INT32:
|
||||
return JSVAL_TAG_INT32;
|
||||
|
||||
default:
|
||||
MOZ_ASSERT_UNREACHABLE("Type does not have corresponding tag");
|
||||
return JSVAL_TAG_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
constexpr uint64_t ValueTypeToShiftedTag(JSValueType type) {
|
||||
return static_cast<uint64_t>(ValueTypeToTag(type)) << JSVAL_TAG_SHIFT;
|
||||
}
|
||||
# define JSVAL_TYPE_TO_SHIFTED_TAG(type) \
|
||||
(((uint64_t)JSVAL_TYPE_TO_TAG(type)) << JSVAL_TAG_SHIFT)
|
||||
(JS::detail::ValueTypeToShiftedTag(type))
|
||||
|
||||
# define JSVAL_PUN64_DOUBLE_ADJUST 0x0007FFFFFFFFFFFFLL
|
||||
constexpr uint64_t ValueDoubleAdjust = 0x0007'FFFF'FFFF'FFFF;
|
||||
constexpr uint64_t ValueBoxedMaxObjPtr = 0x0000'7FFF'FFFF'FFFF;
|
||||
constexpr uint64_t ValuePrivateDoubleBit = 0x8000'0000'0000'0000;
|
||||
|
||||
# define JSVAL_PUN64_BOXED_MAX_OBJ_PTR 0x00007FFFFFFFFFFFLL
|
||||
# define JSVAL_PUN64_BOXED_UNDEFINED ((uint64_t)JSVAL_SHIFTED_TAG_UNDEFINED)
|
||||
# define JSVAL_PUN64_BOXED_MIN_INT32 ((uint64_t)JSVAL_SHIFTED_TAG_INT32)
|
||||
# define JSVAL_PUN64_BOXED_MIN_DOUBLE JSVAL_PUN64_DOUBLE_ADJUST
|
||||
constexpr uint64_t ValueBoxedUndefined =
|
||||
static_cast<uint64_t>(JSVAL_SHIFTED_TAG_UNDEFINED);
|
||||
constexpr uint64_t ValueBoxedMinInt32 =
|
||||
static_cast<uint64_t>(JSVAL_SHIFTED_TAG_INT32);
|
||||
constexpr uint64_t ValueBoxedMinDouble = ValueDoubleAdjust;
|
||||
|
||||
# define JSVAL_PRIVATE_DOUBLE_BIT 0x8000000000000000ULL
|
||||
|
||||
# define JSVAL_TEST_IS_OBJECT(val) ((val) <= JSVAL_PUN64_BOXED_MAX_OBJ_PTR)
|
||||
# define JSVAL_TEST_IS_PRIMITIVE(val) ((val) > JSVAL_PUN64_BOXED_MAX_OBJ_PTR)
|
||||
# define JSVAL_TEST_IS_NUMBER(val) ((val) >= JSVAL_PUN64_BOXED_MIN_INT32)
|
||||
# define JSVAL_TEST_IS_DOUBLE(val) ((val) >= JSVAL_PUN64_BOXED_MIN_DOUBLE)
|
||||
# define JSVAL_TEST_IS_GCTHING(val) ((val) < JSVAL_PUN64_BOXED_UNDEFINED)
|
||||
constexpr bool ValueTestIsObject(uint64_t bits) {
|
||||
return bits <= ValueBoxedMaxObjPtr;
|
||||
}
|
||||
constexpr bool ValueTestIsPrimitive(uint64_t bits) {
|
||||
return !ValueTestIsObject(bits);
|
||||
}
|
||||
constexpr bool ValueTestIsNumber(uint64_t bits) {
|
||||
return bits >= ValueBoxedMinInt32;
|
||||
}
|
||||
constexpr bool ValueTestIsDouble(uint64_t bits) {
|
||||
return bits >= ValueBoxedMinDouble;
|
||||
}
|
||||
constexpr bool ValueTestIsGCThing(uint64_t bits) {
|
||||
return bits < ValueBoxedUndefined;
|
||||
}
|
||||
|
||||
#endif /* JS_PUNBOX64 */
|
||||
|
||||
} // namespace detail
|
||||
} // namespace JS
|
||||
|
||||
#define JSVAL_TYPE_TO_TAG(type) (JS::detail::ValueTypeToTag(type))
|
||||
|
||||
enum JSWhyMagic {
|
||||
/** a hole in a native object's elements */
|
||||
JS_ELEMENTS_HOLE,
|
||||
@ -338,7 +362,7 @@ namespace JS {
|
||||
namespace detail {
|
||||
|
||||
constexpr int CanonicalizedNaNSignBit = 0;
|
||||
constexpr uint64_t CanonicalizedNaNSignificand = 0x8000000000000ULL;
|
||||
constexpr uint64_t CanonicalizedNaNSignificand = 0x8000000000000;
|
||||
|
||||
constexpr uint64_t CanonicalizedNaNBits =
|
||||
mozilla::SpecificNaNBits<double, detail::CanonicalizedNaNSignBit,
|
||||
@ -460,7 +484,7 @@ union alignas(8) Value {
|
||||
explicit Value(double d) : asBits_(mozilla::BitwiseCast<uint64_t>(d)) {}
|
||||
#elif defined(JS_PUNBOX64)
|
||||
explicit Value(double d)
|
||||
: asBits_(mozilla::BitwiseCast<uint64_t>(d) + JSVAL_PUN64_DOUBLE_ADJUST) {
|
||||
: asBits_(mozilla::BitwiseCast<uint64_t>(d) + detail::ValueDoubleAdjust) {
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -683,16 +707,16 @@ union alignas(8) Value {
|
||||
#if defined(JS_NUNBOX32)
|
||||
return uint32_t(toTag()) <= uint32_t(JSVAL_TAG_CLEAR);
|
||||
#elif defined(JS_PUNBOX64)
|
||||
return JSVAL_TEST_IS_DOUBLE(asBits_);
|
||||
return detail::ValueTestIsDouble(asBits_);
|
||||
#endif
|
||||
}
|
||||
|
||||
bool isNumber() const {
|
||||
#if defined(JS_NUNBOX32)
|
||||
MOZ_ASSERT(toTag() != JSVAL_TAG_CLEAR);
|
||||
return uint32_t(toTag()) <= uint32_t(JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET);
|
||||
return uint32_t(toTag()) <= uint32_t(detail::ValueUpperInclNumberTag);
|
||||
#elif defined(JS_PUNBOX64)
|
||||
return JSVAL_TEST_IS_NUMBER(asBits_);
|
||||
return detail::ValueTestIsNumber(asBits_);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -706,15 +730,15 @@ union alignas(8) Value {
|
||||
#if defined(JS_NUNBOX32)
|
||||
return toTag() == JSVAL_TAG_OBJECT;
|
||||
#elif defined(JS_PUNBOX64)
|
||||
return JSVAL_TEST_IS_OBJECT(asBits_);
|
||||
return detail::ValueTestIsObject(asBits_);
|
||||
#endif
|
||||
}
|
||||
|
||||
bool isPrimitive() const {
|
||||
#if defined(JS_NUNBOX32)
|
||||
return uint32_t(toTag()) < uint32_t(JSVAL_UPPER_EXCL_TAG_OF_PRIMITIVE_SET);
|
||||
return uint32_t(toTag()) < uint32_t(detail::ValueUpperExclPrimitiveTag);
|
||||
#elif defined(JS_PUNBOX64)
|
||||
return JSVAL_TEST_IS_PRIMITIVE(asBits_);
|
||||
return detail::ValueTestIsPrimitive(asBits_);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -723,9 +747,9 @@ union alignas(8) Value {
|
||||
bool isGCThing() const {
|
||||
#if defined(JS_NUNBOX32)
|
||||
/* gcc sometimes generates signed < without explicit casts. */
|
||||
return uint32_t(toTag()) >= uint32_t(JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET);
|
||||
return uint32_t(toTag()) >= uint32_t(detail::ValueLowerInclGCThingTag);
|
||||
#elif defined(JS_PUNBOX64)
|
||||
return JSVAL_TEST_IS_GCTHING(asBits_);
|
||||
return detail::ValueTestIsGCThing(asBits_);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -800,7 +824,7 @@ union alignas(8) Value {
|
||||
#if defined(JS_NUNBOX32)
|
||||
return mozilla::BitwiseCast<double>(asBits_);
|
||||
#elif defined(JS_PUNBOX64)
|
||||
return mozilla::BitwiseCast<double>(asBits_ - JSVAL_PUN64_DOUBLE_ADJUST);
|
||||
return mozilla::BitwiseCast<double>(asBits_ - detail::ValueDoubleAdjust);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -870,7 +894,7 @@ union alignas(8) Value {
|
||||
#if defined(JS_NUNBOX32)
|
||||
return s_.payload_.cell_;
|
||||
#elif defined(JS_PUNBOX64)
|
||||
uint64_t ptrBits = asBits_ & JSVAL_PAYLOAD_MASK_GCTHING;
|
||||
uint64_t ptrBits = asBits_ & detail::ValueGCThingPayloadMask;
|
||||
MOZ_ASSERT((ptrBits & 0x7) == 0);
|
||||
return reinterpret_cast<js::gc::Cell*>(ptrBits);
|
||||
#endif
|
||||
@ -931,7 +955,7 @@ union alignas(8) Value {
|
||||
s_.payload_.ptr_ = ptr;
|
||||
#elif defined(JS_PUNBOX64)
|
||||
// Set high bit so this will always masquerade as a DoubleValue.
|
||||
asBits_ = (uintptr_t(ptr) >> 1) | JSVAL_PRIVATE_DOUBLE_BIT;
|
||||
asBits_ = (uintptr_t(ptr) >> 1) | detail::ValuePrivateDoubleBit;
|
||||
#endif
|
||||
MOZ_ASSERT(isDouble());
|
||||
}
|
||||
@ -941,7 +965,7 @@ union alignas(8) Value {
|
||||
#if defined(JS_NUNBOX32)
|
||||
return s_.payload_.ptr_;
|
||||
#elif defined(JS_PUNBOX64)
|
||||
MOZ_ASSERT((asBits_ & JSVAL_PRIVATE_DOUBLE_BIT) != 0);
|
||||
MOZ_ASSERT((asBits_ & detail::ValuePrivateDoubleBit) != 0);
|
||||
return reinterpret_cast<void*>(asBits_ << 1);
|
||||
#endif
|
||||
}
|
||||
@ -1039,7 +1063,7 @@ static inline Value CanonicalizedDoubleValue(double d) {
|
||||
static inline constexpr Value NaNValue() {
|
||||
uint64_t rawBits = detail::CanonicalizedNaNBits;
|
||||
#if defined(JS_PUNBOX64)
|
||||
rawBits += JSVAL_PUN64_DOUBLE_ADJUST;
|
||||
rawBits += detail::ValueDoubleAdjust;
|
||||
#endif
|
||||
return Value::fromRawBits(rawBits);
|
||||
}
|
||||
@ -1047,7 +1071,7 @@ static inline constexpr Value NaNValue() {
|
||||
static inline Value InfinityValue() {
|
||||
uint64_t rawBits = detail::InfinityBits;
|
||||
#if defined(JS_PUNBOX64)
|
||||
rawBits += JSVAL_PUN64_DOUBLE_ADJUST;
|
||||
rawBits += detail::ValueDoubleAdjust;
|
||||
#endif
|
||||
return Value::fromRawBits(rawBits);
|
||||
}
|
||||
|
@ -2511,7 +2511,7 @@ Assembler::Condition MacroAssemblerARMCompat::testMagic(
|
||||
Assembler::Condition MacroAssemblerARMCompat::testPrimitive(
|
||||
Assembler::Condition cond, Register tag) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
ma_cmp(tag, ImmTag(JSVAL_UPPER_EXCL_TAG_OF_PRIMITIVE_SET));
|
||||
ma_cmp(tag, ImmTag(JS::detail::ValueUpperExclPrimitiveTag));
|
||||
return cond == Equal ? Below : AboveOrEqual;
|
||||
}
|
||||
|
||||
@ -2520,7 +2520,7 @@ Assembler::Condition MacroAssemblerARMCompat::testGCThing(
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
ScratchRegisterScope scratch(asMasm());
|
||||
Register tag = extractTag(address, scratch);
|
||||
ma_cmp(tag, ImmTag(JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET));
|
||||
ma_cmp(tag, ImmTag(JS::detail::ValueLowerInclGCThingTag));
|
||||
return cond == Equal ? AboveOrEqual : Below;
|
||||
}
|
||||
|
||||
@ -2625,7 +2625,7 @@ Assembler::Condition MacroAssemblerARMCompat::testDouble(Condition cond,
|
||||
Assembler::Condition MacroAssemblerARMCompat::testNumber(Condition cond,
|
||||
Register tag) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
ma_cmp(tag, ImmTag(JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET));
|
||||
ma_cmp(tag, ImmTag(JS::detail::ValueUpperInclNumberTag));
|
||||
return cond == Equal ? BelowOrEqual : Above;
|
||||
}
|
||||
|
||||
@ -2725,7 +2725,7 @@ Assembler::Condition MacroAssemblerARMCompat::testGCThing(
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
ScratchRegisterScope scratch(asMasm());
|
||||
Register tag = extractTag(address, scratch);
|
||||
ma_cmp(tag, ImmTag(JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET));
|
||||
ma_cmp(tag, ImmTag(JS::detail::ValueLowerInclGCThingTag));
|
||||
return cond == Equal ? AboveOrEqual : Below;
|
||||
}
|
||||
|
||||
|
@ -1314,7 +1314,7 @@ class MacroAssemblerCompat : public vixl::MacroAssembler {
|
||||
|
||||
void BoxDouble(ARMRegister dest, ARMRegister src) {
|
||||
// Allowed for `src` and `dest.valueReg()` to overlap here.
|
||||
Add(dest, src, Operand(int64_t(JSVAL_PUN64_DOUBLE_ADJUST)));
|
||||
Add(dest, src, Operand(int64_t(JS::detail::ValueDoubleAdjust)));
|
||||
}
|
||||
void BoxDouble(ARMRegister dest, ARMFPRegister src) {
|
||||
// Allowed for `src` and `dest.valueReg()` to overlap here.
|
||||
@ -1358,7 +1358,7 @@ class MacroAssemblerCompat : public vixl::MacroAssembler {
|
||||
vixl::UseScratchRegisterScope temps(this);
|
||||
const ARMRegister scratch64 = temps.AcquireX();
|
||||
loadPtr(src, scratch64.asUnsized());
|
||||
Sub(scratch64, scratch64, Operand(int64_t(JSVAL_PUN64_DOUBLE_ADJUST)));
|
||||
Sub(scratch64, scratch64, Operand(int64_t(JS::detail::ValueDoubleAdjust)));
|
||||
Fmov(ARMFPRegister(dest, 64), scratch64);
|
||||
}
|
||||
void unboxDouble(const ValueOperand& src, FloatRegister dest) {
|
||||
@ -1366,9 +1366,9 @@ class MacroAssemblerCompat : public vixl::MacroAssembler {
|
||||
}
|
||||
void unboxDouble(const ValueOperand& src, ARMFPRegister dest) {
|
||||
ARMRegister srcReg = ARMRegister(src.valueReg(), 64);
|
||||
Sub(srcReg, srcReg, Operand(int64_t(JSVAL_PUN64_DOUBLE_ADJUST)));
|
||||
Sub(srcReg, srcReg, Operand(int64_t(JS::detail::ValueDoubleAdjust)));
|
||||
Fmov(dest, srcReg);
|
||||
Add(srcReg, srcReg, Operand(int64_t(JSVAL_PUN64_DOUBLE_ADJUST)));
|
||||
Add(srcReg, srcReg, Operand(int64_t(JS::detail::ValueDoubleAdjust)));
|
||||
}
|
||||
|
||||
void unboxArgObjMagic(const ValueOperand& src, Register dest) {
|
||||
@ -1453,7 +1453,7 @@ class MacroAssemblerCompat : public vixl::MacroAssembler {
|
||||
void unboxGCThingForPreBarrierTrampoline(const Address& src, Register dest) {
|
||||
loadPtr(src, dest);
|
||||
And(ARMRegister(dest, 64), ARMRegister(dest, 64),
|
||||
Operand(JSVAL_PAYLOAD_MASK_GCTHING));
|
||||
Operand(JS::detail::ValueGCThingPayloadMask));
|
||||
}
|
||||
|
||||
inline void unboxValue(const ValueOperand& src, AnyRegister dest,
|
||||
@ -2122,7 +2122,7 @@ class MacroAssemblerCompat : public vixl::MacroAssembler {
|
||||
// Bfxil cannot be used with the zero register as a source.
|
||||
if (src == rzr) {
|
||||
And(ARMRegister(dest, 64), ARMRegister(dest, 64),
|
||||
Operand(JSVAL_TAG_MASK));
|
||||
Operand(JS::detail::ValueTagMask));
|
||||
} else {
|
||||
Bfxil(ARMRegister(dest, 64), ARMRegister(src, 64), 0, JSVAL_TAG_SHIFT);
|
||||
}
|
||||
|
@ -638,7 +638,7 @@ void MacroAssembler::branchTestNumber(Condition cond, Register tag,
|
||||
Label* label) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
Condition actual = cond == Equal ? BelowOrEqual : Above;
|
||||
ma_b(tag, ImmTag(JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET), label, actual);
|
||||
ma_b(tag, ImmTag(JS::detail::ValueUpperInclNumberTag), label, actual);
|
||||
}
|
||||
|
||||
void MacroAssembler::branchTestBoolean(Condition cond, Register tag,
|
||||
@ -739,7 +739,7 @@ void MacroAssembler::branchTestGCThing(Condition cond, const Address& address,
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
SecondScratchRegisterScope scratch2(*this);
|
||||
extractTag(address, scratch2);
|
||||
ma_b(scratch2, ImmTag(JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET), label,
|
||||
ma_b(scratch2, ImmTag(JS::detail::ValueLowerInclGCThingTag), label,
|
||||
(cond == Equal) ? AboveOrEqual : Below);
|
||||
}
|
||||
void MacroAssembler::branchTestGCThing(Condition cond, const BaseIndex& address,
|
||||
@ -747,14 +747,14 @@ void MacroAssembler::branchTestGCThing(Condition cond, const BaseIndex& address,
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
SecondScratchRegisterScope scratch2(*this);
|
||||
extractTag(address, scratch2);
|
||||
ma_b(scratch2, ImmTag(JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET), label,
|
||||
ma_b(scratch2, ImmTag(JS::detail::ValueLowerInclGCThingTag), label,
|
||||
(cond == Equal) ? AboveOrEqual : Below);
|
||||
}
|
||||
|
||||
void MacroAssembler::branchTestPrimitive(Condition cond, Register tag,
|
||||
Label* label) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
ma_b(tag, ImmTag(JSVAL_UPPER_EXCL_TAG_OF_PRIMITIVE_SET), label,
|
||||
ma_b(tag, ImmTag(JS::detail::ValueUpperExclPrimitiveTag), label,
|
||||
(cond == Equal) ? Below : AboveOrEqual);
|
||||
}
|
||||
|
||||
|
@ -20,8 +20,7 @@ struct ImmShiftedTag : public ImmWord {
|
||||
explicit ImmShiftedTag(JSValueShiftedTag shtag) : ImmWord((uintptr_t)shtag) {}
|
||||
|
||||
explicit ImmShiftedTag(JSValueType type)
|
||||
: ImmWord(uintptr_t(JSValueShiftedTag(JSVAL_TYPE_TO_SHIFTED_TAG(type)))) {
|
||||
}
|
||||
: ImmWord(uintptr_t(JSVAL_TYPE_TO_SHIFTED_TAG(type))) {}
|
||||
};
|
||||
|
||||
struct ImmTag : public Imm32 {
|
||||
@ -305,7 +304,7 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared {
|
||||
|
||||
Condition testUndefined(Condition cond, const ValueOperand& src) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmpPtr(src.valueReg(), ImmWord(JSVAL_PUN64_BOXED_UNDEFINED));
|
||||
cmpPtr(src.valueReg(), ImmWord(JS::detail::ValueBoxedUndefined));
|
||||
return cond;
|
||||
}
|
||||
Condition testInt32(Condition cond, const ValueOperand& src) {
|
||||
@ -320,12 +319,12 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared {
|
||||
}
|
||||
Condition testDouble(Condition cond, const ValueOperand& src) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmpPtr(src.valueReg(), ImmWord(JSVAL_PUN64_BOXED_MIN_DOUBLE));
|
||||
cmpPtr(src.valueReg(), ImmWord(JS::detail::ValueBoxedMinDouble));
|
||||
return cond == Equal ? AboveOrEqual : Below;
|
||||
}
|
||||
Condition testNumber(Condition cond, const ValueOperand& src) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmpPtr(src.valueReg(), ImmWord(JSVAL_PUN64_BOXED_MIN_INT32));
|
||||
cmpPtr(src.valueReg(), ImmWord(JS::detail::ValueBoxedMinInt32));
|
||||
return cond == Equal ? AboveOrEqual : Below;
|
||||
}
|
||||
Condition testNull(Condition cond, const ValueOperand& src) {
|
||||
@ -350,17 +349,17 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared {
|
||||
}
|
||||
Condition testObject(Condition cond, const ValueOperand& src) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmpPtr(src.valueReg(), ImmWord(JSVAL_PUN64_BOXED_MAX_OBJ_PTR));
|
||||
cmpPtr(src.valueReg(), ImmWord(JS::detail::ValueBoxedMaxObjPtr));
|
||||
return cond == Equal ? BelowOrEqual : Above;
|
||||
}
|
||||
Condition testGCThing(Condition cond, const ValueOperand& src) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmpPtr(src.valueReg(), ImmWord(JSVAL_PUN64_BOXED_UNDEFINED));
|
||||
cmpPtr(src.valueReg(), ImmWord(JS::detail::ValueBoxedUndefined));
|
||||
return cond == Equal ? Below : AboveOrEqual;
|
||||
}
|
||||
Condition testPrimitive(Condition cond, const ValueOperand& src) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmpPtr(src.valueReg(), ImmWord(JSVAL_PUN64_BOXED_MAX_OBJ_PTR));
|
||||
cmpPtr(src.valueReg(), ImmWord(JS::detail::ValueBoxedMaxObjPtr));
|
||||
return cond == Equal ? Above : BelowOrEqual;
|
||||
}
|
||||
|
||||
@ -379,12 +378,12 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared {
|
||||
}
|
||||
Condition testDouble(Condition cond, const Address& src) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmpPtr(src, ImmWord(JSVAL_PUN64_BOXED_MIN_DOUBLE));
|
||||
cmpPtr(src, ImmWord(JS::detail::ValueBoxedMinDouble));
|
||||
return cond == Equal ? AboveOrEqual : Below;
|
||||
}
|
||||
Condition testNumber(Condition cond, const Address& src) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmpPtr(src, ImmWord(JSVAL_PUN64_BOXED_MIN_INT32));
|
||||
cmpPtr(src, ImmWord(JS::detail::ValueBoxedMinInt32));
|
||||
return cond == Equal ? AboveOrEqual : Below;
|
||||
}
|
||||
Condition testNull(Condition cond, const Address& src) {
|
||||
@ -413,12 +412,12 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared {
|
||||
}
|
||||
Condition testPrimitive(Condition cond, const Address& src) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmpPtr(src, ImmWord(JSVAL_PUN64_BOXED_MAX_OBJ_PTR));
|
||||
cmpPtr(src, ImmWord(JS::detail::ValueBoxedMaxObjPtr));
|
||||
return cond == Equal ? Above : BelowOrEqual;
|
||||
}
|
||||
Condition testGCThing(Condition cond, const Address& src) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmpPtr(src, ImmWord(JSVAL_PUN64_BOXED_UNDEFINED));
|
||||
cmpPtr(src, ImmWord(JS::detail::ValueBoxedUndefined));
|
||||
return cond == Equal ? Below : AboveOrEqual;
|
||||
}
|
||||
Condition testMagic(Condition cond, const Address& src) {
|
||||
@ -716,7 +715,7 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared {
|
||||
void boxDouble(FloatRegister src, const Operand& dest, Register scratch) {
|
||||
vmovq(src, scratch);
|
||||
movq(scratch, Operand(dest));
|
||||
movq(ImmWord(JSVAL_PUN64_DOUBLE_ADJUST), scratch);
|
||||
movq(ImmWord(JS::detail::ValueDoubleAdjust), scratch);
|
||||
addq(scratch, Operand(dest));
|
||||
}
|
||||
void boxDouble(FloatRegister src, const Address& dest, Register scratch) {
|
||||
@ -730,7 +729,7 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared {
|
||||
void boxDouble(FloatRegister src, const ValueOperand& dest, FloatRegister) {
|
||||
ScratchRegisterScope scratch(asMasm());
|
||||
vmovq(src, dest.valueReg());
|
||||
movq(ImmWord(JSVAL_PUN64_DOUBLE_ADJUST), scratch);
|
||||
movq(ImmWord(JS::detail::ValueDoubleAdjust), scratch);
|
||||
addq(scratch, dest.valueReg());
|
||||
}
|
||||
void boxNonDouble(JSValueType type, Register src, const ValueOperand& dest) {
|
||||
@ -752,7 +751,7 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared {
|
||||
// The value we want to produce is: to_float(src - ADJUST)
|
||||
// we note that (src - ADJUST) == -ADJUST + src
|
||||
ScratchRegisterScope scratch(asMasm());
|
||||
movq(ImmWord(-JSVAL_PUN64_DOUBLE_ADJUST), scratch);
|
||||
movq(ImmWord(-JS::detail::ValueDoubleAdjust), scratch);
|
||||
addq(Operand(src), scratch);
|
||||
vmovq(scratch, dest);
|
||||
}
|
||||
@ -783,7 +782,7 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared {
|
||||
// The value we want to produce is: to_float(src - ADJUST)
|
||||
// we note that (src - ADJUST) == -ADJUST + src
|
||||
ScratchRegisterScope scratch(asMasm());
|
||||
movq(ImmWord(-JSVAL_PUN64_DOUBLE_ADJUST), scratch);
|
||||
movq(ImmWord(-JS::detail::ValueDoubleAdjust), scratch);
|
||||
addq(src.valueReg(), scratch);
|
||||
vmovq(scratch, dest);
|
||||
}
|
||||
@ -905,7 +904,7 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared {
|
||||
// the actual Value type. In almost all other cases, this would be
|
||||
// Spectre-unsafe - use unboxNonDouble and friends instead.
|
||||
void unboxGCThingForPreBarrierTrampoline(const Address& src, Register dest) {
|
||||
movq(ImmWord(JSVAL_PAYLOAD_MASK_GCTHING), dest);
|
||||
movq(ImmWord(JS::detail::ValueGCThingPayloadMask), dest);
|
||||
andq(Operand(src), dest);
|
||||
}
|
||||
|
||||
|
@ -325,17 +325,17 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared {
|
||||
}
|
||||
Condition testNumber(Condition cond, Register tag) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmp32(tag, ImmTag(JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET));
|
||||
cmp32(tag, ImmTag(JS::detail::ValueUpperInclNumberTag));
|
||||
return cond == Equal ? BelowOrEqual : Above;
|
||||
}
|
||||
Condition testGCThing(Condition cond, Register tag) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmp32(tag, ImmTag(JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET));
|
||||
cmp32(tag, ImmTag(JS::detail::ValueLowerInclGCThingTag));
|
||||
return cond == Equal ? AboveOrEqual : Below;
|
||||
}
|
||||
Condition testGCThing(Condition cond, const Address& address) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmp32(tagOf(address), ImmTag(JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET));
|
||||
cmp32(tagOf(address), ImmTag(JS::detail::ValueLowerInclGCThingTag));
|
||||
return cond == Equal ? AboveOrEqual : Below;
|
||||
}
|
||||
Condition testMagic(Condition cond, const Address& address) {
|
||||
@ -355,7 +355,7 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared {
|
||||
}
|
||||
Condition testPrimitive(Condition cond, Register tag) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmp32(tag, ImmTag(JSVAL_UPPER_EXCL_TAG_OF_PRIMITIVE_SET));
|
||||
cmp32(tag, ImmTag(JS::detail::ValueUpperExclPrimitiveTag));
|
||||
return cond == Equal ? Below : AboveOrEqual;
|
||||
}
|
||||
Condition testError(Condition cond, Register tag) {
|
||||
@ -513,7 +513,7 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared {
|
||||
}
|
||||
Condition testGCThing(Condition cond, const BaseIndex& address) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmp32(tagOf(address), ImmTag(JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET));
|
||||
cmp32(tagOf(address), ImmTag(JS::detail::ValueLowerInclGCThingTag));
|
||||
return cond == Equal ? AboveOrEqual : Below;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user