Bug 1642265 - [MIPS64] Add branchTestSymbol and fallibleUnboxPtr to MacroAssembler...
authorZhao Jiazhong <zhaojiazhong-hf@loongson.cn>
Tue, 2 Jun 2020 00:56:29 +0000 (00:56 +0000)
committerMike Hommey <glandium@debian.org>
Tue, 17 Nov 2020 21:23:03 +0000 (21:23 +0000)
Differential Revision: https://phabricator.services.mozilla.com/D77629

Gbp-Pq: Topic fixes
Gbp-Pq: Name Bug-1642265-MIPS64-Add-branchTestSymbol-and-fallible.patch

js/src/jit/mips-shared/MacroAssembler-mips-shared-inl.h
js/src/jit/mips64/MacroAssembler-mips64-inl.h

index 92f6f7ac004a6ad53fe4a378629eb48b6a5ca274..92f169bfdaad792ee9562dd572aa4042dac8d258 100644 (file)
@@ -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);
index da3fe771af82ac20d971d4b1f5f7f748f15e2258..0ed3851f2f80a403858ce3c58a4a93a596b7e9e6 100644 (file)
@@ -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
 // ===============================================================