[wasm][liftoff][x64] Implement write barrier for global.set
R=ulan@chromium.org, thibaudm@chromium.org Bug: v8:7581 Change-Id: I9b8f2d3967821a2edd577b13951d9b845ae2868e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2404828 Commit-Queue: Andreas Haas <ahaas@chromium.org> Reviewed-by: Thibaud Michaud <thibaudm@chromium.org> Reviewed-by: Ulan Degenbaev <ulan@chromium.org> Cr-Commit-Position: refs/heads/master@{#69917}
This commit is contained in:
parent
cfbf4fcbbc
commit
f2e58d769e
@ -6,6 +6,7 @@
|
|||||||
#define V8_WASM_BASELINE_X64_LIFTOFF_ASSEMBLER_X64_H_
|
#define V8_WASM_BASELINE_X64_LIFTOFF_ASSEMBLER_X64_H_
|
||||||
|
|
||||||
#include "src/codegen/assembler.h"
|
#include "src/codegen/assembler.h"
|
||||||
|
#include "src/heap/memory-chunk.h"
|
||||||
#include "src/wasm/baseline/liftoff-assembler.h"
|
#include "src/wasm/baseline/liftoff-assembler.h"
|
||||||
#include "src/wasm/simd-shuffle.h"
|
#include "src/wasm/simd-shuffle.h"
|
||||||
|
|
||||||
@ -280,7 +281,33 @@ void LiftoffAssembler::StoreTaggedPointer(Register dst_addr,
|
|||||||
int32_t offset_imm,
|
int32_t offset_imm,
|
||||||
LiftoffRegister src,
|
LiftoffRegister src,
|
||||||
LiftoffRegList pinned) {
|
LiftoffRegList pinned) {
|
||||||
bailout(kRefTypes, "GlobalSet");
|
DCHECK_GE(offset_imm, 0);
|
||||||
|
if (emit_debug_code() && offset_reg != no_reg) {
|
||||||
|
AssertZeroExtended(offset_reg);
|
||||||
|
}
|
||||||
|
Register scratch = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
|
||||||
|
Operand dst_op = liftoff::GetMemOp(this, dst_addr, offset_reg,
|
||||||
|
static_cast<uint32_t>(offset_imm));
|
||||||
|
StoreTaggedField(dst_op, src.gp());
|
||||||
|
|
||||||
|
Label write_barrier;
|
||||||
|
Label exit;
|
||||||
|
CheckPageFlag(dst_addr, scratch,
|
||||||
|
MemoryChunk::kPointersFromHereAreInterestingMask, not_zero,
|
||||||
|
&write_barrier, Label::kNear);
|
||||||
|
jmp(&exit, Label::kNear);
|
||||||
|
bind(&write_barrier);
|
||||||
|
JumpIfSmi(src.gp(), &exit, Label::kNear);
|
||||||
|
if (COMPRESS_POINTERS_BOOL) {
|
||||||
|
DecompressTaggedPointer(src.gp(), src.gp());
|
||||||
|
}
|
||||||
|
CheckPageFlag(src.gp(), scratch,
|
||||||
|
MemoryChunk::kPointersToHereAreInterestingMask, zero, &exit,
|
||||||
|
Label::kNear);
|
||||||
|
leaq(scratch, dst_op);
|
||||||
|
CallRecordWriteStub(dst_addr, scratch, EMIT_REMEMBERED_SET, kSaveFPRegs,
|
||||||
|
wasm::WasmCode::kRecordWrite);
|
||||||
|
bind(&exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LiftoffAssembler::AtomicLoad(LiftoffRegister dst, Register src_addr,
|
void LiftoffAssembler::AtomicLoad(LiftoffRegister dst, Register src_addr,
|
||||||
|
Loading…
Reference in New Issue
Block a user