Bug 1446766 part 2 - Move some wasm code from CodeGenerator-shared.cpp to CodeGenerator.cpp. r=bbouvier

This commit is contained in:
Jan de Mooij 2018-03-19 14:31:25 +01:00
Родитель 989e24aa7d
Коммит 31dc39303a
4 изменённых файлов: 178 добавлений и 178 удалений

Просмотреть файл

@ -7068,6 +7068,182 @@ CodeGenerator::visitGetNextEntryForIterator(LGetNextEntryForIterator* lir)
}
}
void
CodeGenerator::emitWasmCallBase(MWasmCall* mir, bool needsBoundsCheck)
{
if (mir->spIncrement())
masm.freeStack(mir->spIncrement());
MOZ_ASSERT((sizeof(wasm::Frame) + masm.framePushed()) % WasmStackAlignment == 0);
static_assert(WasmStackAlignment >= ABIStackAlignment &&
WasmStackAlignment % ABIStackAlignment == 0,
"The wasm stack alignment should subsume the ABI-required alignment");
#ifdef DEBUG
Label ok;
masm.branchTestStackPtr(Assembler::Zero, Imm32(WasmStackAlignment - 1), &ok);
masm.breakpoint();
masm.bind(&ok);
#endif
// LWasmCallBase::isCallPreserved() assumes that all MWasmCalls preserve the
// TLS and pinned regs. The only case where where we don't have to reload
// the TLS and pinned regs is when the callee preserves them.
bool reloadRegs = true;
const wasm::CallSiteDesc& desc = mir->desc();
const wasm::CalleeDesc& callee = mir->callee();
switch (callee.which()) {
case wasm::CalleeDesc::Func:
masm.call(desc, callee.funcIndex());
reloadRegs = false;
break;
case wasm::CalleeDesc::Import:
masm.wasmCallImport(desc, callee);
break;
case wasm::CalleeDesc::AsmJSTable:
case wasm::CalleeDesc::WasmTable:
masm.wasmCallIndirect(desc, callee, needsBoundsCheck);
reloadRegs = callee.which() == wasm::CalleeDesc::WasmTable && callee.wasmTableIsExternal();
break;
case wasm::CalleeDesc::Builtin:
masm.call(desc, callee.builtin());
reloadRegs = false;
break;
case wasm::CalleeDesc::BuiltinInstanceMethod:
masm.wasmCallBuiltinInstanceMethod(desc, mir->instanceArg(), callee.builtin());
break;
}
if (reloadRegs) {
masm.loadWasmTlsRegFromFrame();
masm.loadWasmPinnedRegsFromTls();
}
if (mir->spIncrement())
masm.reserveStack(mir->spIncrement());
}
void
CodeGenerator::visitWasmCall(LWasmCall* ins)
{
emitWasmCallBase(ins->mir(), ins->needsBoundsCheck());
}
void
CodeGenerator::visitWasmCallVoid(LWasmCallVoid* ins)
{
emitWasmCallBase(ins->mir(), ins->needsBoundsCheck());
}
void
CodeGenerator::visitWasmCallI64(LWasmCallI64* ins)
{
emitWasmCallBase(ins->mir(), ins->needsBoundsCheck());
}
void
CodeGenerator::visitWasmLoadGlobalVar(LWasmLoadGlobalVar* ins)
{
MWasmLoadGlobalVar* mir = ins->mir();
MIRType type = mir->type();
MOZ_ASSERT(IsNumberType(type) || IsSimdType(type));
Register tls = ToRegister(ins->tlsPtr());
Address addr(tls, offsetof(wasm::TlsData, globalArea) + mir->globalDataOffset());
switch (type) {
case MIRType::Int32:
masm.load32(addr, ToRegister(ins->output()));
break;
case MIRType::Float32:
masm.loadFloat32(addr, ToFloatRegister(ins->output()));
break;
case MIRType::Double:
masm.loadDouble(addr, ToFloatRegister(ins->output()));
break;
// Aligned access: code is aligned on PageSize + there is padding
// before the global data section.
case MIRType::Int8x16:
case MIRType::Int16x8:
case MIRType::Int32x4:
case MIRType::Bool8x16:
case MIRType::Bool16x8:
case MIRType::Bool32x4:
masm.loadInt32x4(addr, ToFloatRegister(ins->output()));
break;
case MIRType::Float32x4:
masm.loadFloat32x4(addr, ToFloatRegister(ins->output()));
break;
default:
MOZ_CRASH("unexpected type in visitWasmLoadGlobalVar");
}
}
void
CodeGenerator::visitWasmStoreGlobalVar(LWasmStoreGlobalVar* ins)
{
MWasmStoreGlobalVar* mir = ins->mir();
MIRType type = mir->value()->type();
MOZ_ASSERT(IsNumberType(type) || IsSimdType(type));
Register tls = ToRegister(ins->tlsPtr());
Address addr(tls, offsetof(wasm::TlsData, globalArea) + mir->globalDataOffset());
switch (type) {
case MIRType::Int32:
masm.store32(ToRegister(ins->value()), addr);
break;
case MIRType::Float32:
masm.storeFloat32(ToFloatRegister(ins->value()), addr);
break;
case MIRType::Double:
masm.storeDouble(ToFloatRegister(ins->value()), addr);
break;
// Aligned access: code is aligned on PageSize + there is padding
// before the global data section.
case MIRType::Int8x16:
case MIRType::Int16x8:
case MIRType::Int32x4:
case MIRType::Bool8x16:
case MIRType::Bool16x8:
case MIRType::Bool32x4:
masm.storeInt32x4(ToFloatRegister(ins->value()), addr);
break;
case MIRType::Float32x4:
masm.storeFloat32x4(ToFloatRegister(ins->value()), addr);
break;
default:
MOZ_CRASH("unexpected type in visitWasmStoreGlobalVar");
}
}
void
CodeGenerator::visitWasmLoadGlobalVarI64(LWasmLoadGlobalVarI64* ins)
{
MWasmLoadGlobalVar* mir = ins->mir();
MOZ_ASSERT(mir->type() == MIRType::Int64);
Register tls = ToRegister(ins->tlsPtr());
Address addr(tls, offsetof(wasm::TlsData, globalArea) + mir->globalDataOffset());
Register64 output = ToOutRegister64(ins);
masm.load64(addr, output);
}
void
CodeGenerator::visitWasmStoreGlobalVarI64(LWasmStoreGlobalVarI64* ins)
{
MWasmStoreGlobalVar* mir = ins->mir();
MOZ_ASSERT(mir->value()->type() == MIRType::Int64);
Register tls = ToRegister(ins->tlsPtr());
Address addr(tls, offsetof(wasm::TlsData, globalArea) + mir->globalDataOffset());
Register64 value = ToRegister64(ins->value());
masm.store64(value, addr);
}
void
CodeGenerator::visitTypedArrayLength(LTypedArrayLength* lir)
{

Просмотреть файл

@ -221,6 +221,8 @@ class CodeGenerator final : public CodeGeneratorSpecific
template <class OrderedHashTable>
void emitLoadIteratorValues(Register result, Register temp, Register front);
void emitWasmCallBase(MWasmCall* mir, bool needsBoundsCheck);
IonScriptCounts* maybeCreateScriptCounts();
// This function behaves like testValueTruthy with the exception that it can

Просмотреть файл

@ -1495,182 +1495,6 @@ CodeGeneratorShared::omitOverRecursedCheck() const
return frameSize() < MAX_UNCHECKED_LEAF_FRAME_SIZE && !gen->needsOverrecursedCheck();
}
void
CodeGeneratorShared::emitWasmCallBase(MWasmCall* mir, bool needsBoundsCheck)
{
if (mir->spIncrement())
masm.freeStack(mir->spIncrement());
MOZ_ASSERT((sizeof(wasm::Frame) + masm.framePushed()) % WasmStackAlignment == 0);
static_assert(WasmStackAlignment >= ABIStackAlignment &&
WasmStackAlignment % ABIStackAlignment == 0,
"The wasm stack alignment should subsume the ABI-required alignment");
#ifdef DEBUG
Label ok;
masm.branchTestStackPtr(Assembler::Zero, Imm32(WasmStackAlignment - 1), &ok);
masm.breakpoint();
masm.bind(&ok);
#endif
// LWasmCallBase::isCallPreserved() assumes that all MWasmCalls preserve the
// TLS and pinned regs. The only case where where we don't have to reload
// the TLS and pinned regs is when the callee preserves them.
bool reloadRegs = true;
const wasm::CallSiteDesc& desc = mir->desc();
const wasm::CalleeDesc& callee = mir->callee();
switch (callee.which()) {
case wasm::CalleeDesc::Func:
masm.call(desc, callee.funcIndex());
reloadRegs = false;
break;
case wasm::CalleeDesc::Import:
masm.wasmCallImport(desc, callee);
break;
case wasm::CalleeDesc::AsmJSTable:
case wasm::CalleeDesc::WasmTable:
masm.wasmCallIndirect(desc, callee, needsBoundsCheck);
reloadRegs = callee.which() == wasm::CalleeDesc::WasmTable && callee.wasmTableIsExternal();
break;
case wasm::CalleeDesc::Builtin:
masm.call(desc, callee.builtin());
reloadRegs = false;
break;
case wasm::CalleeDesc::BuiltinInstanceMethod:
masm.wasmCallBuiltinInstanceMethod(desc, mir->instanceArg(), callee.builtin());
break;
}
if (reloadRegs) {
masm.loadWasmTlsRegFromFrame();
masm.loadWasmPinnedRegsFromTls();
}
if (mir->spIncrement())
masm.reserveStack(mir->spIncrement());
}
void
CodeGenerator::visitWasmCall(LWasmCall* ins)
{
emitWasmCallBase(ins->mir(), ins->needsBoundsCheck());
}
void
CodeGenerator::visitWasmCallVoid(LWasmCallVoid* ins)
{
emitWasmCallBase(ins->mir(), ins->needsBoundsCheck());
}
void
CodeGenerator::visitWasmCallI64(LWasmCallI64* ins)
{
emitWasmCallBase(ins->mir(), ins->needsBoundsCheck());
}
void
CodeGenerator::visitWasmLoadGlobalVar(LWasmLoadGlobalVar* ins)
{
MWasmLoadGlobalVar* mir = ins->mir();
MIRType type = mir->type();
MOZ_ASSERT(IsNumberType(type) || IsSimdType(type));
Register tls = ToRegister(ins->tlsPtr());
Address addr(tls, offsetof(wasm::TlsData, globalArea) + mir->globalDataOffset());
switch (type) {
case MIRType::Int32:
masm.load32(addr, ToRegister(ins->output()));
break;
case MIRType::Float32:
masm.loadFloat32(addr, ToFloatRegister(ins->output()));
break;
case MIRType::Double:
masm.loadDouble(addr, ToFloatRegister(ins->output()));
break;
// Aligned access: code is aligned on PageSize + there is padding
// before the global data section.
case MIRType::Int8x16:
case MIRType::Int16x8:
case MIRType::Int32x4:
case MIRType::Bool8x16:
case MIRType::Bool16x8:
case MIRType::Bool32x4:
masm.loadInt32x4(addr, ToFloatRegister(ins->output()));
break;
case MIRType::Float32x4:
masm.loadFloat32x4(addr, ToFloatRegister(ins->output()));
break;
default:
MOZ_CRASH("unexpected type in visitWasmLoadGlobalVar");
}
}
void
CodeGenerator::visitWasmStoreGlobalVar(LWasmStoreGlobalVar* ins)
{
MWasmStoreGlobalVar* mir = ins->mir();
MIRType type = mir->value()->type();
MOZ_ASSERT(IsNumberType(type) || IsSimdType(type));
Register tls = ToRegister(ins->tlsPtr());
Address addr(tls, offsetof(wasm::TlsData, globalArea) + mir->globalDataOffset());
switch (type) {
case MIRType::Int32:
masm.store32(ToRegister(ins->value()), addr);
break;
case MIRType::Float32:
masm.storeFloat32(ToFloatRegister(ins->value()), addr);
break;
case MIRType::Double:
masm.storeDouble(ToFloatRegister(ins->value()), addr);
break;
// Aligned access: code is aligned on PageSize + there is padding
// before the global data section.
case MIRType::Int8x16:
case MIRType::Int16x8:
case MIRType::Int32x4:
case MIRType::Bool8x16:
case MIRType::Bool16x8:
case MIRType::Bool32x4:
masm.storeInt32x4(ToFloatRegister(ins->value()), addr);
break;
case MIRType::Float32x4:
masm.storeFloat32x4(ToFloatRegister(ins->value()), addr);
break;
default:
MOZ_CRASH("unexpected type in visitWasmStoreGlobalVar");
}
}
void
CodeGenerator::visitWasmLoadGlobalVarI64(LWasmLoadGlobalVarI64* ins)
{
MWasmLoadGlobalVar* mir = ins->mir();
MOZ_ASSERT(mir->type() == MIRType::Int64);
Register tls = ToRegister(ins->tlsPtr());
Address addr(tls, offsetof(wasm::TlsData, globalArea) + mir->globalDataOffset());
Register64 output = ToOutRegister64(ins);
masm.load64(addr, output);
}
void
CodeGenerator::visitWasmStoreGlobalVarI64(LWasmStoreGlobalVarI64* ins)
{
MWasmStoreGlobalVar* mir = ins->mir();
MOZ_ASSERT(mir->value()->type() == MIRType::Int64);
Register tls = ToRegister(ins->tlsPtr());
Address addr(tls, offsetof(wasm::TlsData, globalArea) + mir->globalDataOffset());
Register64 value = ToRegister64(ins->value());
masm.store64(value, addr);
}
void
CodeGeneratorShared::emitPreBarrier(Register base, const LAllocation* index, int32_t offsetAdjustment)
{

Просмотреть файл

@ -348,8 +348,6 @@ class CodeGeneratorShared : public LElementVisitor
void emitTruncateDouble(FloatRegister src, Register dest, MTruncateToInt32* mir);
void emitTruncateFloat32(FloatRegister src, Register dest, MTruncateToInt32* mir);
void emitWasmCallBase(MWasmCall* mir, bool needsBoundsCheck);
void emitPreBarrier(Register base, const LAllocation* index, int32_t offsetAdjustment);
void emitPreBarrier(Address address);