From d06b171582104db5f0b61ee782fb835dd6038d62 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 7 Feb 2017 10:39:48 +0100 Subject: Mark where we need a write barrier in the JIT Separate the loadAddress calls into loadAddressForReading and loadAddressForWriting. In the second case, add an out argument that specifies whether the write will need a barrier. Pass the write barrier type that is required for a store down into the actual store methods. Change-Id: I3f7634ab82d82f1b20dab331e083d1a662cd314e Reviewed-by: Simon Hausmann --- src/qml/jit/qv4assembler.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'src/qml/jit/qv4assembler.cpp') diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp index 0b8be97ef5..59470aeea2 100644 --- a/src/qml/jit/qv4assembler.cpp +++ b/src/qml/jit/qv4assembler.cpp @@ -246,13 +246,16 @@ void Assembler::generateCJumpOnCompare(RelationalCondition } template -typename Assembler::Pointer Assembler::loadAddress(RegisterID tmp, IR::Expr *e) +typename Assembler::Pointer +Assembler::loadAddressForWriting(RegisterID tmp, IR::Expr *e, WriteBarrier::Type *barrier) { + if (barrier) + *barrier = WriteBarrier::NoBarrier; IR::Temp *t = e->asTemp(); if (t) return loadTempAddress(t); else - return loadArgLocalAddress(tmp, e->asArgLocal()); + return loadArgLocalAddressForWriting(tmp, e->asArgLocal(), barrier); } template @@ -265,7 +268,8 @@ typename Assembler::Pointer Assembler: } template -typename Assembler::Pointer Assembler::loadArgLocalAddress(RegisterID baseReg, IR::ArgLocal *al) +typename Assembler::Pointer +Assembler::loadArgLocalAddressForWriting(RegisterID baseReg, IR::ArgLocal *al, WriteBarrier::Type *barrier) { int32_t offset = 0; int scope = al->scope; @@ -291,6 +295,8 @@ typename Assembler::Pointer Assembler: default: Q_UNREACHABLE(); } + if (barrier) + *barrier = _function->argLocalRequiresWriteBarrier(al) ? WriteBarrier::Barrier : WriteBarrier::NoBarrier; return Pointer(baseReg, offset); } @@ -329,8 +335,9 @@ void Assembler::loadStringRef(RegisterID reg, const QString template void Assembler::storeValue(QV4::Primitive value, IR::Expr *destination) { - Address addr = loadAddress(ScratchRegister, destination); - storeValue(value, addr); + WriteBarrier::Type barrier; + Address addr = loadAddressForWriting(ScratchRegister, destination, &barrier); + storeValue(value, addr, barrier); } template @@ -419,7 +426,7 @@ typename Assembler::Jump Assembler::ge // It's not a number type, so it cannot be in a register. Q_ASSERT(src->asArgLocal() || src->asTemp()->kind != IR::Temp::PhysicalRegister || src->type == IR::BoolType); - Assembler::Pointer tagAddr = loadAddress(Assembler::ScratchRegister, src); + Assembler::Pointer tagAddr = loadAddressForReading(Assembler::ScratchRegister, src); tagAddr.offset += 4; load32(tagAddr, Assembler::ScratchRegister); -- cgit v1.2.3