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:
Iain Ireland 2019-06-12 17:49:52 +00:00
parent e68b24eb5b
commit 98788f0b1c
6 changed files with 127 additions and 104 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;
}