From 7bacb0c92c45995c416f32fd35b217aa7d3d2e2c Mon Sep 17 00:00:00 2001 From: Zhao Jiazhong Date: Tue, 2 Jun 2020 00:56:29 +0000 Subject: [PATCH] Bug 1642265 - [MIPS64] Add branchTestSymbol and fallibleUnboxPtr to MacroAssembler. r=tcampbell Differential Revision: https://phabricator.services.mozilla.com/D77629 Gbp-Pq: Topic fixes Gbp-Pq: Name Bug-1642265-MIPS64-Add-branchTestSymbol-and-fallible.patch --- .../MacroAssembler-mips-shared-inl.h | 7 +++++ js/src/jit/mips64/MacroAssembler-mips64-inl.h | 29 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/js/src/jit/mips-shared/MacroAssembler-mips-shared-inl.h b/js/src/jit/mips-shared/MacroAssembler-mips-shared-inl.h index 92f6f7ac004..92f169bfdaa 100644 --- a/js/src/jit/mips-shared/MacroAssembler-mips-shared-inl.h +++ b/js/src/jit/mips-shared/MacroAssembler-mips-shared-inl.h @@ -741,6 +741,13 @@ void MacroAssembler::branchTestSymbol(Condition cond, const BaseIndex& address, branchTestSymbol(cond, tag, label); } +void MacroAssembler::branchTestSymbol(Condition cond, const Address& address, + Label* label) { + SecondScratchRegisterScope scratch2(*this); + Register tag = extractTag(address, scratch2); + branchTestSymbol(cond, tag, label); +} + void MacroAssembler::branchTestBigInt(Condition cond, Register tag, Label* label) { MOZ_ASSERT(cond == Equal || cond == NotEqual); diff --git a/js/src/jit/mips64/MacroAssembler-mips64-inl.h b/js/src/jit/mips64/MacroAssembler-mips64-inl.h index da3fe771af8..0ed3851f2f8 100644 --- a/js/src/jit/mips64/MacroAssembler-mips64-inl.h +++ b/js/src/jit/mips64/MacroAssembler-mips64-inl.h @@ -649,6 +649,35 @@ void MacroAssembler::branchTruncateFloat32MaybeModUint32(FloatRegister src, as_sll(dest, dest, 0); } +void MacroAssembler::fallibleUnboxPtr(const ValueOperand& src, Register dest, + JSValueType type, Label* fail) { + MOZ_ASSERT(type == JSVAL_TYPE_OBJECT || type == JSVAL_TYPE_STRING || + type == JSVAL_TYPE_SYMBOL || type == JSVAL_TYPE_BIGINT); + // dest := src XOR mask + // scratch := dest >> JSVAL_TAG_SHIFT + // fail if scratch != 0 + // + // Note: src and dest can be the same register + ScratchRegisterScope scratch(asMasm()); + mov(ImmWord(JSVAL_TYPE_TO_SHIFTED_TAG(type)), scratch); + ma_xor(scratch, src.valueReg()); + ma_move(dest, scratch); + ma_dsrl(scratch, scratch, Imm32(JSVAL_TAG_SHIFT)); + ma_b(scratch, Imm32(0), fail, Assembler::NotEqual); +} + +void MacroAssembler::fallibleUnboxPtr(const Address& src, Register dest, + JSValueType type, Label* fail) { + loadValue(src, ValueOperand(dest)); + fallibleUnboxPtr(ValueOperand(dest), dest, type, fail); +} + +void MacroAssembler::fallibleUnboxPtr(const BaseIndex& src, Register dest, + JSValueType type, Label* fail) { + loadValue(src, ValueOperand(dest)); + fallibleUnboxPtr(ValueOperand(dest), dest, type, fail); +} + //}}} check_macroassembler_style // =============================================================== -- 2.30.2