Ignore:
Timestamp:
May 27, 2022, 1:47:21 AM (3 years ago)
Author:
[email protected]
Message:

Enable WasmLLInt on ARMv7

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):

  • b3/B3ValueRep.h:

(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):

  • interpreter/Register.h:

(JSC::Register::unboxedFloat const):
(JSC::Register::asanUnsafeUnboxedFloat const):

  • jit/AssemblyHelpers.h:

(JSC::AssemblyHelpers::unboxDouble):

  • jit/RegisterAtOffsetList.cpp:

(JSC::RegisterAtOffsetList::RegisterAtOffsetList):

  • jit/RegisterAtOffsetList.h:

(JSC::RegisterAtOffsetList::sizeOfAreaInBytes const):

  • jit/RegisterSet.cpp:

(JSC::RegisterSet::macroScratchRegisters):

  • llint/LLIntOfflineAsmConfig.h:
  • 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):

  • wasm/WasmBinding.cpp:

(JSC::Wasm::wasmToWasm):

  • wasm/WasmCallee.cpp:

(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):

  • wasm/WasmIndexOrName.h:

(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):

  • wasm/WasmInstance.h:

(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):

  • wasm/WasmLLIntPlan.cpp:

(JSC::Wasm::LLIntPlan::didCompleteCompilation):

  • wasm/WasmMemory.cpp:

(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):

  • wasm/WasmMemoryMode.cpp:

(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):

  • wasm/WasmSlowPaths.cpp:

(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.

  • wasm/js/JSToWasm.cpp:

(JSC::Wasm::marshallJSResult):
(JSC::Wasm::createJSToWasmWrapper):

  • wasm/js/WasmToJS.cpp:

(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/251045@main

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h

    r294794 r294934  
    14681468    }
    14691469
     1470    void convertInt32ToFloat(RegisterID src, FPRegisterID dest)
     1471    {
     1472        m_assembler.vmov(fpTempRegister, src, src);
     1473        m_assembler.vcvt_signedToFloatingPoint(dest, fpTempRegisterAsSingle(), /* toDouble: */ false);
     1474    }
     1475
    14701476    void convertInt32ToDouble(RegisterID src, FPRegisterID dest)
    14711477    {
     
    22992305    }
    23002306
     2307    // FIXME: why is this the same than nearCall() in ARM64? is it right?
     2308    ALWAYS_INLINE Call threadSafePatchableNearCall()
     2309    {
     2310        invalidateAllTempRegisters();
     2311        moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister);
     2312        return Call(m_assembler.blx(dataTempRegister), Call::LinkableNear);
     2313    }
     2314
    23012315    ALWAYS_INLINE Call call(PtrTag)
    23022316    {
     
    23222336    ALWAYS_INLINE Call call(RegisterID target, RegisterID callTag) { return UNUSED_PARAM(callTag), call(target, NoPtrTag); }
    23232337    ALWAYS_INLINE Call call(Address address, RegisterID callTag) { return UNUSED_PARAM(callTag), call(address, NoPtrTag); }
     2338
     2339    ALWAYS_INLINE void callOperation(const FunctionPtr<OperationPtrTag> operation)
     2340    {
     2341        move(TrustedImmPtr(operation.executableAddress()), addressTempRegister);
     2342        call(addressTempRegister, OperationPtrTag);
     2343    }
    23242344
    23252345    ALWAYS_INLINE void ret()
Note: See TracChangeset for help on using the changeset viewer.