[webkit-changes] [WebKit/WebKit] f20f57: [JSC] Add JIT support for Float16Array

Yusuke Suzuki noreply at github.com
Tue Aug 6 09:57:21 PDT 2024


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: f20f57564cef1db2c274f57754a5c90ec1af6a22
      https://github.com/WebKit/WebKit/commit/f20f57564cef1db2c274f57754a5c90ec1af6a22
  Author: Yusuke Suzuki <ysuzuki at apple.com>
  Date:   2024-08-06 (Tue, 06 Aug 2024)

  Changed paths:
    M JSTests/stress/array-message-passing.js
    M JSTests/stress/call-non-calleable-constructors-as-function.js
    M JSTests/stress/construct-typed-array-without-new-in-dfg-and-ftl.js
    M JSTests/stress/istypedarrayview-intrinsic.js
    M JSTests/stress/reflect-set.js
    M JSTests/stress/resources/standalone-pre.js
    M JSTests/stress/resources/typedarray-constructor-helper-functions.js
    M JSTests/stress/resources/typedarray-test-helper-functions.js
    M JSTests/stress/resources/v8-typedarray-helpers.js
    M JSTests/stress/typed-array-canonical-numeric-index-string.js
    M JSTests/stress/typed-array-sort-small.js
    M JSTests/stress/typedarray-access-monomorphic-neutered.js
    M JSTests/stress/typedarray-access-neutered.js
    M JSTests/stress/typedarray-configure-index.js
    M JSTests/stress/typedarray-getownproperty.js
    M JSTests/stress/typedarray-join.js
    M JSTests/stress/typedarray-view-string-properties-neutered.js
    A JSTests/stress/v8-float16-array-next.js
    A JSTests/stress/v8-float16-array.js
    M JSTests/stress/v8-harmony-typed-array-with.js
    M Source/JavaScriptCore/assembler/ARM64Assembler.h
    M Source/JavaScriptCore/assembler/MacroAssemblerARM64.cpp
    M Source/JavaScriptCore/assembler/MacroAssemblerARM64.h
    M Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
    M Source/JavaScriptCore/assembler/MacroAssemblerRISCV64.h
    M Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h
    M Source/JavaScriptCore/bytecode/AccessCase.cpp
    M Source/JavaScriptCore/bytecode/AccessCase.h
    M Source/JavaScriptCore/bytecode/InlineCacheCompiler.cpp
    M Source/JavaScriptCore/bytecode/Repatch.cpp
    M Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
    M Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
    M Source/JavaScriptCore/dfg/DFGCSEPhase.cpp
    M Source/JavaScriptCore/dfg/DFGClobberize.h
    M Source/JavaScriptCore/dfg/DFGDoesGC.cpp
    M Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
    M Source/JavaScriptCore/dfg/DFGMayExit.cpp
    M Source/JavaScriptCore/dfg/DFGNode.h
    M Source/JavaScriptCore/dfg/DFGNodeType.h
    M Source/JavaScriptCore/dfg/DFGOperations.cpp
    M Source/JavaScriptCore/dfg/DFGOperations.h
    M Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp
    M Source/JavaScriptCore/dfg/DFGSafeToExecute.h
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
    M Source/JavaScriptCore/ftl/FTLCapabilities.cpp
    M Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
    M Source/JavaScriptCore/ftl/FTLOutput.cpp
    M Source/JavaScriptCore/ftl/FTLOutput.h
    M Source/JavaScriptCore/runtime/Intrinsic.h
    M Source/JavaScriptCore/runtime/JSDataViewPrototype.cpp
    M Source/JavaScriptCore/runtime/MathObject.cpp
    M Source/WTF/wtf/PlatformHave.h

  Log Message:
  -----------
  [JSC] Add JIT support for Float16Array
https://bugs.webkit.org/show_bug.cgi?id=277672
rdar://133271787

Reviewed by Keith Miller.

This patch implements JIT optimizations for Float16Array. Right now it is only enabled for
ARM64 since ARM v8.3 has half-float native CPU instructions. But we could extend it further
with newer instruction set.

Right now, we are not showing Float16 in B3 pipeline, and we are always convert it to Double via patchpoint.
In the future, we should add Float16 type into B3 as a first-citizen and support various Float16 instructions
in B3 opcodes. But for JS, it is not so important.

* JSTests/stress/array-message-passing.js:
* JSTests/stress/call-non-calleable-constructors-as-function.js:
* JSTests/stress/construct-typed-array-without-new-in-dfg-and-ftl.js:
* JSTests/stress/istypedarrayview-intrinsic.js:
* JSTests/stress/reflect-set.js:
(set get Uint8Array):
* JSTests/stress/resources/standalone-pre.js:
(isTypedArray):
* JSTests/stress/resources/typedarray-constructor-helper-functions.js:
* JSTests/stress/resources/typedarray-test-helper-functions.js:
* JSTests/stress/resources/v8-typedarray-helpers.js:
* JSTests/stress/typed-array-canonical-numeric-index-string.js:
* JSTests/stress/typed-array-sort-small.js:
(shouldBe):
* JSTests/stress/typedarray-access-monomorphic-neutered.js:
* JSTests/stress/typedarray-access-neutered.js:
* JSTests/stress/typedarray-configure-index.js:
* JSTests/stress/typedarray-getownproperty.js:
* JSTests/stress/typedarray-join.js:
* JSTests/stress/typedarray-view-string-properties-neutered.js:
* JSTests/stress/v8-float16-array-next.js: Added.
(f):
* JSTests/stress/v8-float16-array.js: Added.
(storeAndLoad):
(assertAlmostEquals):
(0.3.const.copied.new.Float32Array.source):
* Source/JavaScriptCore/assembler/ARM64Assembler.h:
* Source/JavaScriptCore/assembler/MacroAssemblerARM64.cpp:
(JSC::MacroAssemblerARM64::collectCPUFeatures):
* Source/JavaScriptCore/assembler/MacroAssemblerARM64.h:
(JSC::MacroAssemblerARM64::convertDoubleToFloat16):
(JSC::MacroAssemblerARM64::convertFloat16ToDouble):
(JSC::MacroAssemblerARM64::loadFloat16):
(JSC::MacroAssemblerARM64::moveZeroToFloat16):
(JSC::MacroAssemblerARM64::moveFloat16To16):
(JSC::MacroAssemblerARM64::move16ToFloat16):
(JSC::MacroAssemblerARM64::storeFloat16):
(JSC::MacroAssemblerARM64::supportsFloat16):
* Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h:
(JSC::MacroAssemblerARMv7::supportsFloat16):
(JSC::MacroAssemblerARMv7::convertDoubleToFloat16):
(JSC::MacroAssemblerARMv7::convertFloat16ToDouble):
(JSC::MacroAssemblerARMv7::loadFloat16):
(JSC::MacroAssemblerARMv7::moveZeroToFloat16):
(JSC::MacroAssemblerARMv7::move16ToFloat16):
(JSC::MacroAssemblerARMv7::moveFloat16To16):
(JSC::MacroAssemblerARMv7::storeFloat16):
* Source/JavaScriptCore/assembler/MacroAssemblerRISCV64.h:
(JSC::MacroAssemblerRISCV64::supportsFloat16):
(JSC::MacroAssemblerRISCV64::convertDoubleToFloat16):
(JSC::MacroAssemblerRISCV64::convertFloat16ToDouble):
(JSC::MacroAssemblerRISCV64::loadFloat16):
(JSC::MacroAssemblerRISCV64::moveZeroToFloat16):
(JSC::MacroAssemblerRISCV64::move16ToFloat16):
(JSC::MacroAssemblerRISCV64::moveFloat16To16):
(JSC::MacroAssemblerRISCV64::storeFloat16):
* Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h:
(JSC::MacroAssemblerX86_64::convertDoubleToFloat16):
(JSC::MacroAssemblerX86_64::convertFloat16ToDouble):
(JSC::MacroAssemblerX86_64::loadFloat16):
(JSC::MacroAssemblerX86_64::moveZeroToFloat16):
(JSC::MacroAssemblerX86_64::move16ToFloat16):
(JSC::MacroAssemblerX86_64::moveFloat16To16):
(JSC::MacroAssemblerX86_64::storeFloat16):
(JSC::MacroAssemblerX86_64::supportsFloat16):
* Source/JavaScriptCore/bytecode/AccessCase.cpp:
(JSC::AccessCase::create):
(JSC::AccessCase::guardedByStructureCheckSkippingConstantIdentifierCheck const):
(JSC::AccessCase::requiresIdentifierNameMatch const):
(JSC::AccessCase::requiresInt32PropertyCheck const):
(JSC::AccessCase::forEachDependentCell const):
(JSC::AccessCase::doesCalls const):
(JSC::AccessCase::canReplace const):
(JSC::AccessCase::runWithDowncast):
(JSC::AccessCase::canBeShared):
* Source/JavaScriptCore/bytecode/AccessCase.h:
* Source/JavaScriptCore/bytecode/InlineCacheCompiler.cpp:
(JSC::toTypedArrayType):
(JSC::forResizableTypedArray):
(JSC::needsScratchFPR):
(JSC::forInBy):
(JSC::isStateless):
(JSC::doesJSCalls):
(JSC::isMegamorphic):
(JSC::canBeViaGlobalProxy):
(JSC::InlineCacheCompiler::generateWithGuard):
(JSC::InlineCacheCompiler::generateAccessCase):
* Source/JavaScriptCore/bytecode/Repatch.cpp:
(JSC::tryCacheArrayGetByVal):
(JSC::tryCacheArrayPutByVal):
(JSC::tryCacheArrayInByVal):
* Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h:
(JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
* Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::handleIntrinsicCall):
* Source/JavaScriptCore/dfg/DFGCSEPhase.cpp:
* Source/JavaScriptCore/dfg/DFGClobberize.h:
(JSC::DFG::clobberize):
* Source/JavaScriptCore/dfg/DFGDoesGC.cpp:
(JSC::DFG::doesGC):
* Source/JavaScriptCore/dfg/DFGFixupPhase.cpp:
(JSC::DFG::FixupPhase::fixupNode):
* Source/JavaScriptCore/dfg/DFGMayExit.cpp:
* Source/JavaScriptCore/dfg/DFGNode.h:
(JSC::DFG::Node::shouldSpeculateFloat16Array):
* Source/JavaScriptCore/dfg/DFGNodeType.h:
* Source/JavaScriptCore/dfg/DFGOperations.cpp:
(JSC::DFG::JSC_DEFINE_JIT_OPERATION):
* Source/JavaScriptCore/dfg/DFGOperations.h:
* Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp:
* Source/JavaScriptCore/dfg/DFGSafeToExecute.h:
(JSC::DFG::safeToExecute):
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp:
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h:
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::compileGetByVal):
(JSC::DFG::SpeculativeJIT::compile):
(JSC::DFG::SpeculativeJIT::compilePutByVal):
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::compileGetByVal):
(JSC::DFG::SpeculativeJIT::compile):
(JSC::DFG::SpeculativeJIT::compilePutByVal):
* Source/JavaScriptCore/ftl/FTLCapabilities.cpp:
(JSC::FTL::canCompile):
* Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::compileNode):
(JSC::FTL::DFG::LowerDFGToB3::compileArithF16Round):
(JSC::FTL::DFG::LowerDFGToB3::compileGetByValImpl):
(JSC::FTL::DFG::LowerDFGToB3::compilePutByVal):
(JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
* Source/JavaScriptCore/ftl/FTLOutput.cpp:
(JSC::FTL::Output::storeDoubleAsFloat16):
(JSC::FTL::Output::f16round):
(JSC::FTL::Output::loadFloat16AsDouble):
* Source/JavaScriptCore/ftl/FTLOutput.h:
* Source/JavaScriptCore/runtime/Intrinsic.h:
* Source/JavaScriptCore/runtime/JSDataViewPrototype.cpp:
* Source/JavaScriptCore/runtime/MathObject.cpp:
(JSC::MathObject::finishCreation):
(JSC::JSC_DEFINE_HOST_FUNCTION):
* Source/WTF/wtf/PlatformHave.h:

Canonical link: https://commits.webkit.org/281895@main



To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications


More information about the webkit-changes mailing list