Commit 2f5817fc authored by Igor Sheludko's avatar Igor Sheludko Committed by Commit Bot

[ptr-compr][Liftoff] Add macro operations for loading tagged pointer fields

These load operations will decompress values if pointer compression is
enabled.

Bug: v8:7703
Change-Id: I4c5cef39a735f3b03e36d27c0e5e7c21653bbbc0
Reviewed-on: https://chromium-review.googlesource.com/c/1382742
Commit-Queue: Igor Sheludko <ishell@chromium.org>
Reviewed-by: 's avatarClemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#58356}
parent 9efa28bf
...@@ -269,6 +269,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset, ...@@ -269,6 +269,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset,
ldr(dst, MemOperand(dst, offset)); ldr(dst, MemOperand(dst, offset));
} }
void LiftoffAssembler::LoadTaggedPointerFromInstance(Register dst,
uint32_t offset) {
LoadFromInstance(dst, offset, kTaggedSize);
}
void LiftoffAssembler::SpillInstance(Register instance) { void LiftoffAssembler::SpillInstance(Register instance) {
str(instance, liftoff::GetInstanceOperand()); str(instance, liftoff::GetInstanceOperand());
} }
...@@ -277,6 +282,15 @@ void LiftoffAssembler::FillInstanceInto(Register dst) { ...@@ -277,6 +282,15 @@ void LiftoffAssembler::FillInstanceInto(Register dst) {
ldr(dst, liftoff::GetInstanceOperand()); ldr(dst, liftoff::GetInstanceOperand());
} }
void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
Register offset_reg,
uint32_t offset_imm,
LiftoffRegList pinned) {
STATIC_ASSERT(kTaggedSize == kInt32Size);
Load(LiftoffRegister(dst), src_addr, offset_reg, offset_imm,
LoadType::kI32Load, pinned);
}
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr, void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm, Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned, LoadType type, LiftoffRegList pinned,
......
...@@ -188,6 +188,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset, ...@@ -188,6 +188,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset,
} }
} }
void LiftoffAssembler::LoadTaggedPointerFromInstance(Register dst,
uint32_t offset) {
LoadFromInstance(dst, offset, kTaggedSize);
}
void LiftoffAssembler::SpillInstance(Register instance) { void LiftoffAssembler::SpillInstance(Register instance) {
Str(instance, liftoff::GetInstanceOperand()); Str(instance, liftoff::GetInstanceOperand());
} }
...@@ -196,6 +201,15 @@ void LiftoffAssembler::FillInstanceInto(Register dst) { ...@@ -196,6 +201,15 @@ void LiftoffAssembler::FillInstanceInto(Register dst) {
Ldr(dst, liftoff::GetInstanceOperand()); Ldr(dst, liftoff::GetInstanceOperand());
} }
void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
Register offset_reg,
uint32_t offset_imm,
LiftoffRegList pinned) {
STATIC_ASSERT(kTaggedSize == kInt64Size);
Load(LiftoffRegister(dst), src_addr, offset_reg, offset_imm,
LoadType::kI64Load, pinned);
}
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr, void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm, Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned, LoadType type, LiftoffRegList pinned,
......
...@@ -213,6 +213,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset, ...@@ -213,6 +213,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset,
mov(dst, Operand(dst, offset)); mov(dst, Operand(dst, offset));
} }
void LiftoffAssembler::LoadTaggedPointerFromInstance(Register dst,
uint32_t offset) {
LoadFromInstance(dst, offset, kTaggedSize);
}
void LiftoffAssembler::SpillInstance(Register instance) { void LiftoffAssembler::SpillInstance(Register instance) {
mov(liftoff::GetInstanceOperand(), instance); mov(liftoff::GetInstanceOperand(), instance);
} }
...@@ -221,6 +226,15 @@ void LiftoffAssembler::FillInstanceInto(Register dst) { ...@@ -221,6 +226,15 @@ void LiftoffAssembler::FillInstanceInto(Register dst) {
mov(dst, liftoff::GetInstanceOperand()); mov(dst, liftoff::GetInstanceOperand());
} }
void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
Register offset_reg,
uint32_t offset_imm,
LiftoffRegList pinned) {
STATIC_ASSERT(kTaggedSize == kInt32Size);
Load(LiftoffRegister(dst), src_addr, offset_reg, offset_imm,
LoadType::kI32Load, pinned);
}
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr, void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm, Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned, LoadType type, LiftoffRegList pinned,
......
...@@ -360,8 +360,12 @@ class LiftoffAssembler : public TurboAssembler { ...@@ -360,8 +360,12 @@ class LiftoffAssembler : public TurboAssembler {
inline void LoadConstant(LiftoffRegister, WasmValue, inline void LoadConstant(LiftoffRegister, WasmValue,
RelocInfo::Mode rmode = RelocInfo::NONE); RelocInfo::Mode rmode = RelocInfo::NONE);
inline void LoadFromInstance(Register dst, uint32_t offset, int size); inline void LoadFromInstance(Register dst, uint32_t offset, int size);
inline void LoadTaggedPointerFromInstance(Register dst, uint32_t offset);
inline void SpillInstance(Register instance); inline void SpillInstance(Register instance);
inline void FillInstanceInto(Register dst); inline void FillInstanceInto(Register dst);
inline void LoadTaggedPointer(Register dst, Register src_addr,
Register offset_reg, uint32_t offset_imm,
LiftoffRegList pinned);
inline void Load(LiftoffRegister dst, Register src_addr, Register offset_reg, inline void Load(LiftoffRegister dst, Register src_addr, Register offset_reg,
uint32_t offset_imm, LoadType type, LiftoffRegList pinned, uint32_t offset_imm, LoadType type, LiftoffRegList pinned,
uint32_t* protected_load_pc = nullptr, uint32_t* protected_load_pc = nullptr,
......
...@@ -41,7 +41,7 @@ namespace { ...@@ -41,7 +41,7 @@ namespace {
if (FLAG_trace_liftoff) PrintF("[liftoff] " __VA_ARGS__); \ if (FLAG_trace_liftoff) PrintF("[liftoff] " __VA_ARGS__); \
} while (false) } while (false)
#define WASM_INSTANCE_OBJECT_OFFSET(name) \ #define WASM_INSTANCE_OBJECT_FIELD_OFFSET(name) \
ObjectAccess::ToTagged(WasmInstanceObject::k##name##Offset) ObjectAccess::ToTagged(WasmInstanceObject::k##name##Offset)
template <int expected_size, int actual_size> template <int expected_size, int actual_size>
...@@ -51,14 +51,20 @@ struct assert_field_size { ...@@ -51,14 +51,20 @@ struct assert_field_size {
static constexpr int size = actual_size; static constexpr int size = actual_size;
}; };
#define WASM_INSTANCE_OBJECT_SIZE(name) \ #define WASM_INSTANCE_OBJECT_FIELD_SIZE(name) \
(WasmInstanceObject::k##name##OffsetEnd - \ (WasmInstanceObject::k##name##OffsetEnd - \
WasmInstanceObject::k##name##Offset + 1) // NOLINT(whitespace/indent) WasmInstanceObject::k##name##Offset + 1) // NOLINT(whitespace/indent)
#define LOAD_INSTANCE_FIELD(dst, name, load_size) \ #define LOAD_INSTANCE_FIELD(dst, name, load_size) \
__ LoadFromInstance( \ __ LoadFromInstance(dst, WASM_INSTANCE_OBJECT_FIELD_OFFSET(name), \
dst, WASM_INSTANCE_OBJECT_OFFSET(name), \ assert_field_size<WASM_INSTANCE_OBJECT_FIELD_SIZE(name), \
assert_field_size<WASM_INSTANCE_OBJECT_SIZE(name), load_size>::size); load_size>::size);
#define LOAD_TAGGED_PTR_INSTANCE_FIELD(dst, name) \
static_assert(WASM_INSTANCE_OBJECT_FIELD_SIZE(name) == kTaggedSize, \
"field in WasmInstance does not have the expected size"); \
__ LoadTaggedPointerFromInstance(dst, \
WASM_INSTANCE_OBJECT_FIELD_OFFSET(name));
#ifdef DEBUG #ifdef DEBUG
#define DEBUG_CODE_COMMENT(str) \ #define DEBUG_CODE_COMMENT(str) \
...@@ -1481,7 +1487,7 @@ class LiftoffCompiler { ...@@ -1481,7 +1487,7 @@ class LiftoffCompiler {
__ TurboAssembler::Move(kContextRegister, __ TurboAssembler::Move(kContextRegister,
Smi::FromInt(Context::kNoContext)); Smi::FromInt(Context::kNoContext));
Register centry = kJavaScriptCallCodeStartRegister; Register centry = kJavaScriptCallCodeStartRegister;
LOAD_INSTANCE_FIELD(centry, CEntryStub, kPointerSize); LOAD_TAGGED_PTR_INSTANCE_FIELD(centry, CEntryStub);
__ CallRuntimeWithCEntry(runtime_function, centry); __ CallRuntimeWithCEntry(runtime_function, centry);
safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kSimple, 0, safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kSimple, 0,
Safepoint::kNoLazyDeopt); Safepoint::kNoLazyDeopt);
...@@ -1642,12 +1648,12 @@ class LiftoffCompiler { ...@@ -1642,12 +1648,12 @@ class LiftoffCompiler {
imm.index * sizeof(Address), kPointerLoadType, pinned); imm.index * sizeof(Address), kPointerLoadType, pinned);
Register imported_function_refs = tmp; Register imported_function_refs = tmp;
LOAD_INSTANCE_FIELD(imported_function_refs, ImportedFunctionRefs, LOAD_TAGGED_PTR_INSTANCE_FIELD(imported_function_refs,
kPointerSize); ImportedFunctionRefs);
Register imported_function_ref = tmp; Register imported_function_ref = tmp;
__ Load(LiftoffRegister(imported_function_ref), imported_function_refs, __ LoadTaggedPointer(
no_reg, ObjectAccess::ElementOffsetInTaggedFixedArray(imm.index), imported_function_ref, imported_function_refs, no_reg,
kPointerLoadType, pinned); ObjectAccess::ElementOffsetInTaggedFixedArray(imm.index), pinned);
Register* explicit_instance = &imported_function_ref; Register* explicit_instance = &imported_function_ref;
__ PrepareCall(imm.sig, call_descriptor, &target, explicit_instance); __ PrepareCall(imm.sig, call_descriptor, &target, explicit_instance);
...@@ -1770,18 +1776,20 @@ class LiftoffCompiler { ...@@ -1770,18 +1776,20 @@ class LiftoffCompiler {
__ emit_i32_mul(index, index, tmp_const); __ emit_i32_mul(index, index, tmp_const);
} }
// Load the instance from {instance->ift_instances[key]}
LOAD_TAGGED_PTR_INSTANCE_FIELD(table, IndirectFunctionTableRefs);
// {index} has already been multiplied by kSystemPointerSizeLog2.
STATIC_ASSERT(kTaggedSize == kSystemPointerSize);
__ LoadTaggedPointer(tmp_const, table, index,
ObjectAccess::ElementOffsetInTaggedFixedArray(0),
pinned);
Register* explicit_instance = &tmp_const;
// Load the target from {instance->ift_targets[key]} // Load the target from {instance->ift_targets[key]}
LOAD_INSTANCE_FIELD(table, IndirectFunctionTableTargets, kPointerSize); LOAD_INSTANCE_FIELD(table, IndirectFunctionTableTargets, kPointerSize);
__ Load(LiftoffRegister(scratch), table, index, 0, kPointerLoadType, __ Load(LiftoffRegister(scratch), table, index, 0, kPointerLoadType,
pinned); pinned);
// Load the instance from {instance->ift_instances[key]}
LOAD_INSTANCE_FIELD(table, IndirectFunctionTableRefs, kPointerSize);
__ Load(LiftoffRegister(tmp_const), table, index,
ObjectAccess::ElementOffsetInTaggedFixedArray(0), kPointerLoadType,
pinned);
Register* explicit_instance = &tmp_const;
source_position_table_builder_.AddPosition( source_position_table_builder_.AddPosition(
__ pc_offset(), SourcePosition(decoder->position()), false); __ pc_offset(), SourcePosition(decoder->position()), false);
...@@ -1968,9 +1976,10 @@ bool LiftoffCompilationUnit::ExecuteCompilation(CompilationEnv* env, ...@@ -1968,9 +1976,10 @@ bool LiftoffCompilationUnit::ExecuteCompilation(CompilationEnv* env,
#undef __ #undef __
#undef TRACE #undef TRACE
#undef WASM_INSTANCE_OBJECT_OFFSET #undef WASM_INSTANCE_OBJECT_FIELD_OFFSET
#undef WASM_INSTANCE_OBJECT_SIZE #undef WASM_INSTANCE_OBJECT_FIELD_SIZE
#undef LOAD_INSTANCE_FIELD #undef LOAD_INSTANCE_FIELD
#undef LOAD_TAGGED_PTR_INSTANCE_FIELD
#undef DEBUG_CODE_COMMENT #undef DEBUG_CODE_COMMENT
} // namespace wasm } // namespace wasm
......
...@@ -301,6 +301,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset, ...@@ -301,6 +301,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset,
lw(dst, MemOperand(dst, offset)); lw(dst, MemOperand(dst, offset));
} }
void LiftoffAssembler::LoadTaggedPointerFromInstance(Register dst,
uint32_t offset) {
LoadFromInstance(dst, offset, kTaggedSize);
}
void LiftoffAssembler::SpillInstance(Register instance) { void LiftoffAssembler::SpillInstance(Register instance) {
sw(instance, liftoff::GetInstanceOperand()); sw(instance, liftoff::GetInstanceOperand());
} }
...@@ -309,6 +314,15 @@ void LiftoffAssembler::FillInstanceInto(Register dst) { ...@@ -309,6 +314,15 @@ void LiftoffAssembler::FillInstanceInto(Register dst) {
lw(dst, liftoff::GetInstanceOperand()); lw(dst, liftoff::GetInstanceOperand());
} }
void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
Register offset_reg,
uint32_t offset_imm,
LiftoffRegList pinned) {
STATIC_ASSERT(kTaggedSize == kInt32Size);
Load(LiftoffRegister(dst), src_addr, offset_reg, offset_imm,
LoadType::kI32Load, pinned);
}
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr, void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm, Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned, LoadType type, LiftoffRegList pinned,
......
...@@ -267,6 +267,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset, ...@@ -267,6 +267,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset,
} }
} }
void LiftoffAssembler::LoadTaggedPointerFromInstance(Register dst,
uint32_t offset) {
LoadFromInstance(dst, offset, kTaggedSize);
}
void LiftoffAssembler::SpillInstance(Register instance) { void LiftoffAssembler::SpillInstance(Register instance) {
sd(instance, liftoff::GetInstanceOperand()); sd(instance, liftoff::GetInstanceOperand());
} }
...@@ -275,6 +280,15 @@ void LiftoffAssembler::FillInstanceInto(Register dst) { ...@@ -275,6 +280,15 @@ void LiftoffAssembler::FillInstanceInto(Register dst) {
ld(dst, liftoff::GetInstanceOperand()); ld(dst, liftoff::GetInstanceOperand());
} }
void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
Register offset_reg,
uint32_t offset_imm,
LiftoffRegList pinned) {
STATIC_ASSERT(kTaggedSize == kInt64Size);
Load(LiftoffRegister(dst), src_addr, offset_reg, offset_imm,
LoadType::kI64Load, pinned);
}
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr, void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm, Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned, LoadType type, LiftoffRegList pinned,
......
...@@ -37,6 +37,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset, ...@@ -37,6 +37,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset,
BAILOUT("LoadFromInstance"); BAILOUT("LoadFromInstance");
} }
void LiftoffAssembler::LoadTaggedPointerFromInstance(Register dst,
uint32_t offset) {
BAILOUT("LoadTaggedPointerFromInstance");
}
void LiftoffAssembler::SpillInstance(Register instance) { void LiftoffAssembler::SpillInstance(Register instance) {
BAILOUT("SpillInstance"); BAILOUT("SpillInstance");
} }
...@@ -45,6 +50,13 @@ void LiftoffAssembler::FillInstanceInto(Register dst) { ...@@ -45,6 +50,13 @@ void LiftoffAssembler::FillInstanceInto(Register dst) {
BAILOUT("FillInstanceInto"); BAILOUT("FillInstanceInto");
} }
void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
Register offset_reg,
uint32_t offset_imm,
LiftoffRegList pinned) {
BAILOUT("LoadTaggedPointer");
}
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr, void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm, Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned, LoadType type, LiftoffRegList pinned,
......
...@@ -37,6 +37,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset, ...@@ -37,6 +37,11 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset,
BAILOUT("LoadFromInstance"); BAILOUT("LoadFromInstance");
} }
void LiftoffAssembler::LoadTaggedPointerFromInstance(Register dst,
uint32_t offset) {
BAILOUT("LoadTaggedPointerFromInstance");
}
void LiftoffAssembler::SpillInstance(Register instance) { void LiftoffAssembler::SpillInstance(Register instance) {
BAILOUT("SpillInstance"); BAILOUT("SpillInstance");
} }
...@@ -45,6 +50,13 @@ void LiftoffAssembler::FillInstanceInto(Register dst) { ...@@ -45,6 +50,13 @@ void LiftoffAssembler::FillInstanceInto(Register dst) {
BAILOUT("FillInstanceInto"); BAILOUT("FillInstanceInto");
} }
void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
Register offset_reg,
uint32_t offset_imm,
LiftoffRegList pinned) {
BAILOUT("LoadTaggedPointer");
}
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr, void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm, Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned, LoadType type, LiftoffRegList pinned,
......
...@@ -195,6 +195,13 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset, ...@@ -195,6 +195,13 @@ void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset,
} }
} }
void LiftoffAssembler::LoadTaggedPointerFromInstance(Register dst,
uint32_t offset) {
DCHECK_LE(offset, kMaxInt);
movp(dst, liftoff::GetInstanceOperand());
LoadTaggedPointerField(dst, Operand(dst, offset));
}
void LiftoffAssembler::SpillInstance(Register instance) { void LiftoffAssembler::SpillInstance(Register instance) {
movp(liftoff::GetInstanceOperand(), instance); movp(liftoff::GetInstanceOperand(), instance);
} }
...@@ -203,6 +210,17 @@ void LiftoffAssembler::FillInstanceInto(Register dst) { ...@@ -203,6 +210,17 @@ void LiftoffAssembler::FillInstanceInto(Register dst) {
movp(dst, liftoff::GetInstanceOperand()); movp(dst, liftoff::GetInstanceOperand());
} }
void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
Register offset_reg,
uint32_t offset_imm,
LiftoffRegList pinned) {
if (emit_debug_code() && offset_reg != no_reg) {
AssertZeroExtended(offset_reg);
}
Operand src_op = liftoff::GetMemOp(this, src_addr, offset_reg, offset_imm);
LoadTaggedPointerField(dst, src_op);
}
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr, void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm, Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned, LoadType type, LiftoffRegList pinned,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment