Enable WasmLLInt on ARMv7
Patch by Geza Lore <Geza Lore> on 2022-06-10
Patch by Geza Lore <Geza Lore> on 2022-05-27
https://bugs.webkit.org/show_bug.cgi?id=221260
Reviewed by Saam Barati.
Patch by Geza Lore and Xan López.
Implement the LLInt tier of WebAssembly for ARMv7. A lot of the
work will be shared by any 32bit port, but the offlineassembler
has only been updated for ARMv7 so far.
Main highlights:
We have split the WebAssembly.asm file into three chunks,
following what LowLevelInterpreter.asm does. The common code
remains in WebAssembly.asm, and 32 and 64bit specific code (mostly
opcode implementations) goes into WebAssembly32_64.asm and
WebAssembly64.asm.
We have decided to use consecutive even/odd pairs of GPRs for every
type of wasm values, even if they are 32bit (i32/f32), with the odd
(higher) numbered GPR holding the more significant half. 32bit values
are held in the even (lower) numbered register. This makes the code
much simpler and allows us to share more code with the 64bit variant.
This is mostly relevant for argument passing, and given that every
value ends up in the stack anyway we do not think it is significant
from a performance POV.
We are reusing JSValueRegs to hold Wasm values too. Obviously they
are not really JSValues, so it might make sense to create a base
class that can be used for both JS and Wasm values.
We do not have enough registers to keep things like the memory
base pointer and size in pinned registers, so we are forced to
load them on each use.
We disable the 'Signaling' memory mode, since the current
implementation relies on being able to mprotect a 232 + redzone
region of memory. This can be changed in the future but it's not a
priority at the moment.
- stress/sampling-profiler-wasm-name-section.js:
- stress/sampling-profiler-wasm.js:
- wasm/regress/llint-callee-saves-with-fast-memory.js:
- CMakeLists.txt:
- assembler/ARMv7Assembler.h:
(JSC::ARMv7Assembler::vcvt_signedToFloatingPoint):
- assembler/MacroAssemblerARMv7.h:
(JSC::MacroAssemblerARMv7::convertInt32ToFloat):
(JSC::MacroAssemblerARMv7::threadSafePatchableNearCall):
(JSC::MacroAssemblerARMv7::callOperation):
(JSC::B3::ValueRep::ValueRep):
- bytecode/BytecodeDumper.cpp:
(JSC::Wasm::BytecodeDumper::formatConstant const):
- interpreter/CallFrame.h: adapt to new callee tagging format.
(JSC::CallFrame::callee const):
(JSC::CallFrame::unsafeCallee const):
- interpreter/CalleeBits.h: add wasm tagging of callee values for
32bit.
(JSC::CalleeBits::CalleeBits):
(JSC::CalleeBits::operator=):
(JSC::CalleeBits::boxWasm):
(JSC::CalleeBits::isWasm const):
(JSC::CalleeBits::asWasmCallee const):
(JSC::Register::unboxedFloat const):
(JSC::Register::asanUnsafeUnboxedFloat const):
(JSC::AssemblyHelpers::unboxDouble):
- jit/RegisterAtOffsetList.cpp:
(JSC::RegisterAtOffsetList::RegisterAtOffsetList):
- jit/RegisterAtOffsetList.h:
(JSC::RegisterAtOffsetList::sizeOfAreaInBytes const):
(JSC::RegisterSet::macroScratchRegisters):
- llint/LowLevelInterpreter32_64.asm:
- llint/WebAssembly.asm:
- llint/WebAssembly32_64.asm: Added.
- llint/WebAssembly64.asm: Added.
- offlineasm/arm.rb:
- offlineasm/instructions.rb:
- offlineasm/registers.rb:
- offlineasm/risc.rb:
- runtime/JSCJSValue.h:
(JSC::wasmUnboxedFloat):
- runtime/JSCJSValueInlines.h:
(JSC::JSValue::JSValue):
- wasm/WasmAirIRGenerator.cpp:
(JSC::Wasm::AirIRGenerator::useSignalingMemory const):
(JSC::Wasm::AirIRGenerator::AirIRGenerator):
(JSC::Wasm::AirIRGenerator::emitCheckAndPreparePointer):
(JSC::Wasm::AirIRGenerator::addCall):
- wasm/WasmB3IRGenerator.cpp:
(JSC::Wasm::B3IRGenerator::useSignalingMemory const):
(JSC::Wasm::B3IRGenerator::B3IRGenerator):
(JSC::Wasm::B3IRGenerator::addArguments):
(JSC::Wasm::B3IRGenerator::emitCheckAndPreparePointer):
(JSC::Wasm::B3IRGenerator::memoryKind):
(JSC::Wasm::B3IRGenerator::addCall):
(JSC::Wasm::wasmToWasm):
(JSC::Wasm::LLIntCallee::calleeSaveRegisters):
- wasm/WasmCalleeGroup.cpp:
(JSC::Wasm::CalleeGroup::isSafeToRun):
- wasm/WasmCallingConvention.cpp:
(JSC::Wasm::jsCallingConvention):
(JSC::Wasm::wasmCallingConvention):
- wasm/WasmCallingConvention.h:
(JSC::Wasm::CallInformation::computeResultsOffsetList):
(JSC::Wasm::WasmCallingConvention::WasmCallingConvention):
(JSC::Wasm::WasmCallingConvention::marshallLocationImpl const):
(JSC::Wasm::WasmCallingConvention::marshallLocation const):
(JSC::Wasm::JSCallingConvention::JSCallingConvention):
(JSC::Wasm::JSCallingConvention::marshallLocationImpl const):
(JSC::Wasm::JSCallingConvention::marshallLocation const):
(JSC::Wasm::JSCallingConvention::callInformationFor const):
- wasm/WasmFormat.h:
- wasm/WasmIndexOrName.cpp:
(JSC::Wasm::IndexOrName::IndexOrName):
(JSC::Wasm::makeString):
(JSC::Wasm::IndexOrName::IndexOrName):
(JSC::Wasm::IndexOrName::isEmpty const):
(JSC::Wasm::IndexOrName::isIndex const):
(JSC::Wasm::IndexOrName::isName const):
(JSC::Wasm::IndexOrName::index const):
(JSC::Wasm::IndexOrName::name const):
(JSC::Wasm::IndexOrName::nameSection const):
(JSC::Wasm::Instance::updateCachedMemory):
- wasm/WasmLLIntGenerator.cpp:
(JSC::Wasm::LLIntGenerator::virtualRegisterForWasmLocal):
(JSC::Wasm::LLIntGenerator::callInformationForCaller):
(JSC::Wasm::LLIntGenerator::callInformationForCallee):
(JSC::Wasm::LLIntGenerator::addArguments):
(JSC::Wasm::LLIntGenerator::addLoop):
(JSC::Wasm::LLIntPlan::didCompleteCompilation):
(JSC::Wasm::MemoryHandle::~MemoryHandle):
(JSC::Wasm::Memory::tryCreate):
(JSC::Wasm::Memory::growShared):
(JSC::Wasm::Memory::grow):
(JSC::Wasm::Memory::copy):
- wasm/WasmMemory.h:
- wasm/WasmMemoryInformation.cpp:
(JSC::Wasm::PinnedRegisterInfo::get):
- wasm/WasmMemoryInformation.h:
(JSC::Wasm::PinnedRegisterInfo::toSave const):
(JSC::Wasm::makeString):
- wasm/WasmMemoryMode.h:
- wasm/WasmOpcodeOrigin.cpp:
- wasm/WasmOpcodeOrigin.h:
- wasm/WasmOperations.cpp:
(JSC::Wasm::JSC_DEFINE_JIT_OPERATION):
- wasm/WasmOperations.h:
- wasm/WasmPageCount.h:
- wasm/WasmParser.h:
(JSC::Wasm::Parser<SuccessType>::parseUInt32):
(JSC::Wasm::Parser<SuccessType>::parseUInt64):
(JSC::LLInt::WASM_SLOW_PATH_DECL):
(JSC::LLInt::slow_path_wasm_popcount):
(JSC::LLInt::slow_path_wasm_popcountll):
(JSC::LLInt::slow_path_wasm_i32_div_s):
(JSC::LLInt::slow_path_wasm_i32_div_u):
(JSC::LLInt::slow_path_wasm_i32_rem_s):
(JSC::LLInt::slow_path_wasm_i32_rem_u):
(JSC::LLInt::slow_path_wasm_i64_div_s):
(JSC::LLInt::slow_path_wasm_i64_div_u):
(JSC::LLInt::slow_path_wasm_i64_rem_s):
(JSC::LLInt::slow_path_wasm_i64_rem_u):
- wasm/WasmSlowPaths.h:
- wasm/WasmValueLocation.cpp:
(JSC::Wasm::ValueLocation::dump const):
(WTF::printInternal):
- wasm/WasmValueLocation.h:
(JSC::Wasm::ValueLocation::ValueLocation):
(JSC::Wasm::ValueLocation::isGPR const):
(JSC::Wasm::ValueLocation::isFPR const):
(JSC::Wasm::ValueLocation::isStack const):
(JSC::Wasm::ValueLocation::isStackArgument const):
(JSC::Wasm::ValueLocation::jsr const):
(JSC::Wasm::ValueLocation::fpr const):
(JSC::Wasm::ValueLocation::reg): Deleted.
(JSC::Wasm::ValueLocation::isReg const): Deleted.
(JSC::Wasm::ValueLocation::reg const): Deleted.
(JSC::Wasm::ValueLocation::gpr const): Deleted.
(JSC::Wasm::marshallJSResult):
(JSC::Wasm::createJSToWasmWrapper):
(JSC::Wasm::wasmToJS):
- wasm/js/WebAssemblyFunction.cpp:
(JSC::WebAssemblyFunction::previousInstanceOffset const):
(JSC::WebAssemblyFunction::jsCallEntrypointSlow):
- wasm/js/WebAssemblyGlobalConstructor.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION):
- wasm/js/WebAssemblyModuleRecord.cpp:
(JSC::WebAssemblyModuleRecord::initializeExports):
- wtf/PlatformEnable.h: enable WebAssembly on ARMv7.
- Scripts/run-jsc-stress-tests: allow to run the wasm tests on
armv7 even without jit support (for now).
Canonical link: https://commits.webkit.org/251455@main