WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
WIP Patch
bug-173471-20210207173847.patch (text/plain), 12.03 KB, created by
Sergey Rubanov
on 2021-02-07 06:38:49 PST
(
hide
)
Description:
WIP Patch
Filename:
MIME Type:
Creator:
Sergey Rubanov
Created:
2021-02-07 06:38:49 PST
Size:
12.03 KB
patch
obsolete
>Subversion Revision: 272471 >diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog >index 79a71313567b05461527adc106b16669ab18a7c0..59f1dc5fe80315142fd07ca5aeecc2d1a6d43fe0 100644 >--- a/Source/JavaScriptCore/ChangeLog >+++ b/Source/JavaScriptCore/ChangeLog >@@ -1,3 +1,25 @@ >+2021-02-07 Sergey Rubanov <chi187@gmail.com> >+ >+ WebAssembly: implement non-trapping float to int conversion >+ https://bugs.webkit.org/show_bug.cgi?id=173471 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * generator/Wasm.rb: >+ * llint/WebAssembly.asm: >+ * wasm/WasmAirIRGenerator.cpp: >+ (JSC::Wasm::AirIRGenerator::addOp<OpType::I32TruncSatSF32>): >+ * wasm/WasmB3IRGenerator.cpp: >+ (JSC::Wasm::B3IRGenerator::addOp<OpType::I32TruncSatSF32>): >+ * wasm/generateWasm.py: >+ (isExtConv): >+ * wasm/generateWasmOpsHeader.py: >+ (opcodeWithTypesMacroizer): >+ (extCodeMacroizer): >+ (extCodeMacroizer.modifier): >+ (ExtTableOpType): >+ * wasm/wasm.json: >+ > 2021-02-07 Yusuke Suzuki <ysuzuki@apple.com> > > [JSC] Replace toInteger with toIntegerOrInfinity >diff --git a/Source/JavaScriptCore/generator/Wasm.rb b/Source/JavaScriptCore/generator/Wasm.rb >index c178586d521fad7dbb52b677ba51fad52169f9c5..85bb53c370e56d6e466e9b9ad60652096f072051 100644 >--- a/Source/JavaScriptCore/generator/Wasm.rb >+++ b/Source/JavaScriptCore/generator/Wasm.rb >@@ -9,7 +9,7 @@ module Wasm > JSON.parse(wasm_json)["opcode"].each do |name, value| > category = value["category"] > >- next unless ["arithmetic", "comparison", "conversion"].include? category >+ next unless ["arithmetic", "comparison", "conversion", "extconv"].include? category > > returnCount = value["return"].size > parameterCount = value["parameter"].size >@@ -39,7 +39,7 @@ module Wasm > end > > def self.generate_llint_generator(section) >- opcodes = section.opcodes.select { |op| ["arithmetic", "comparison", "conversion"].include? op.extras["category"] } >+ opcodes = section.opcodes.select { |op| ["arithmetic", "comparison", "conversion", "extconv"].include? op.extras["category"] } > methods = opcodes.map do |op| > case op.args.size > when 2 >diff --git a/Source/JavaScriptCore/llint/WebAssembly.asm b/Source/JavaScriptCore/llint/WebAssembly.asm >index 643160eee2ccef0f676bf90c0aea201a8d50153f..20a071aa9138b09e140a060795aa1185366df54f 100644 >--- a/Source/JavaScriptCore/llint/WebAssembly.asm >+++ b/Source/JavaScriptCore/llint/WebAssembly.asm >@@ -1364,6 +1364,25 @@ wasmOp(i64_trunc_u_f64, WasmI64TruncUF64, macro (ctx) > throwException(OutOfBoundsTrunc) > end) > >+// FIXME: this is a copy of i32_trunc_s_f32 for now, change it to actual i32_trunc_sat_s_f32 >+wasmOp(i32_trunc_sat_s_f32, WasmI32TruncSatSF32, macro (ctx) >+ mloadf(ctx, m_operand, ft0) >+ >+ move 0xcf000000, t0 # INT32_MIN (Note that INT32_MIN - 1.0 in float is the same as INT32_MIN in float). >+ fi2f t0, ft1 >+ bfltun ft0, ft1, .outOfBoundsTrunc >+ >+ move 0x4f000000, t0 # -INT32_MIN >+ fi2f t0, ft1 >+ bfgtequn ft0, ft1, .outOfBoundsTrunc >+ >+ truncatef2is ft0, t0 >+ returni(ctx, t0) >+ >+.outOfBoundsTrunc: >+ throwException(OutOfBoundsTrunc) >+end) >+ > wasmOp(f32_convert_u_i64, WasmF32ConvertUI64, macro (ctx) > mloadq(ctx, m_operand, t0) > if X86_64 >diff --git a/Source/JavaScriptCore/wasm/WasmAirIRGenerator.cpp b/Source/JavaScriptCore/wasm/WasmAirIRGenerator.cpp >index 996a99588604a66dd082e5bfdb08076498134307..9ab992f364e7b3e3cc6709a81c187bb0ca32f0df 100644 >--- a/Source/JavaScriptCore/wasm/WasmAirIRGenerator.cpp >+++ b/Source/JavaScriptCore/wasm/WasmAirIRGenerator.cpp >@@ -3959,6 +3959,35 @@ auto AirIRGenerator::addOp<OpType::I64TruncUF32>(ExpressionType arg, ExpressionT > return { }; > } > >+// FIXME: this is a copy of I32TruncSF32 for now, change it to actual I32TruncSatSF32 >+template<> >+auto AirIRGenerator::addOp<OpType::I32TruncSatSF32>(ExpressionType arg, ExpressionType& result) -> PartialResult >+{ >+ auto max = addConstant(Type::F32, bitwise_cast<uint32_t>(-static_cast<float>(std::numeric_limits<int32_t>::min()))); >+ auto min = addConstant(Type::F32, bitwise_cast<uint32_t>(static_cast<float>(std::numeric_limits<int32_t>::min()))); >+ >+ auto temp1 = g32(); >+ auto temp2 = g32(); >+ append(CompareFloat, Arg::doubleCond(MacroAssembler::DoubleLessThanOrUnordered), arg, min, temp1); >+ append(CompareFloat, Arg::doubleCond(MacroAssembler::DoubleGreaterThanOrEqualOrUnordered), arg, max, temp2); >+ append(Or32, temp1, temp2); >+ >+ emitCheck([&] { >+ return Inst(BranchTest32, nullptr, Arg::resCond(MacroAssembler::NonZero), temp2, temp2); >+ }, [=] (CCallHelpers& jit, const B3::StackmapGenerationParams&) { >+ this->emitThrowException(jit, ExceptionType::OutOfBoundsTrunc); >+ }); >+ >+ auto* patchpoint = addPatchpoint(B3::Int32); >+ patchpoint->effects = B3::Effects::none(); >+ patchpoint->setGenerator([=] (CCallHelpers& jit, const B3::StackmapGenerationParams& params) { >+ jit.truncateFloatToInt32(params[1].fpr(), params[0].gpr()); >+ }); >+ result = g32(); >+ emitPatchpoint(patchpoint, result, arg); >+ return { }; >+} >+ > auto AirIRGenerator::addShift(Type type, B3::Air::Opcode op, ExpressionType value, ExpressionType shift, ExpressionType& result) -> PartialResult > { > ASSERT(type == Type::I64 || type == Type::I32); >diff --git a/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp b/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp >index 69e99a638b04a6d39742216a55ab7596423115d7..ace72c35b3c8cd7f6cb7d34821c5948cb08aff23 100644 >--- a/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp >+++ b/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp >@@ -3038,6 +3038,30 @@ auto B3IRGenerator::addOp<OpType::I64TruncUF32>(ExpressionType arg, ExpressionTy > return { }; > } > >+// FIXME: this is a copy of I32TruncSF32 for now, change it to actual I32TruncSatSF32 >+template<> >+auto B3IRGenerator::addOp<OpType::I32TruncSatSF32>(ExpressionType arg, ExpressionType& result) -> PartialResult >+{ >+ Value* max = constant(Float, bitwise_cast<uint32_t>(-static_cast<float>(std::numeric_limits<int32_t>::min()))); >+ Value* min = constant(Float, bitwise_cast<uint32_t>(static_cast<float>(std::numeric_limits<int32_t>::min()))); >+ Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, origin(), >+ m_currentBlock->appendNew<Value>(m_proc, LessThan, origin(), arg, max), >+ m_currentBlock->appendNew<Value>(m_proc, GreaterEqual, origin(), arg, min)); >+ outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, origin(), outOfBounds, constant(Int32, 0)); >+ CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(), outOfBounds); >+ trap->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams&) { >+ this->emitExceptionCheck(jit, ExceptionType::OutOfBoundsTrunc); >+ }); >+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int32, origin()); >+ patchpoint->append(arg, ValueRep::SomeRegister); >+ patchpoint->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) { >+ jit.truncateFloatToInt32(params[1].fpr(), params[0].gpr()); >+ }); >+ patchpoint->effects = Effects::none(); >+ result = patchpoint; >+ return { }; >+} >+ > } } // namespace JSC::Wasm > > #include "WasmB3IRGeneratorInlines.h" >diff --git a/Source/JavaScriptCore/wasm/generateWasm.py b/Source/JavaScriptCore/wasm/generateWasm.py >index 786a3d3efa4a42fafd8fc899c0d4e32193907edc..b953fae1681238418877cdca7d1c09ba883ac36a 100755 >--- a/Source/JavaScriptCore/wasm/generateWasm.py >+++ b/Source/JavaScriptCore/wasm/generateWasm.py >@@ -109,6 +109,9 @@ def isAtomicBinaryRMW(op): > return op["category"] == "atomic.rmw.binary" > > >+def isExtConv(op): >+ return op["category"] == "extconv" >+ > def isSimple(op): > return "b3op" in op > >diff --git a/Source/JavaScriptCore/wasm/generateWasmOpsHeader.py b/Source/JavaScriptCore/wasm/generateWasmOpsHeader.py >index 5ba0dd5cc07c1ea4a8adf593be97d18af2db8aac..e661d513a3abc05ac735e86629490e0a39adec10 100755 >--- a/Source/JavaScriptCore/wasm/generateWasmOpsHeader.py >+++ b/Source/JavaScriptCore/wasm/generateWasmOpsHeader.py >@@ -79,7 +79,6 @@ def opcodeWithTypesMacroizer(filter): > return [cppType(type) for type in op["parameter"] + op["return"]] > return opcodeMacroizer(filter, modifier=modifier) > >- > def memoryLoadMacroizer(): > def modifier(op): > return [cppType(op["return"][0])] >@@ -110,8 +109,13 @@ def atomicBinaryRMWMacroizer(): > return opcodeMacroizer(lambda op: isAtomicBinaryRMW(op), modifier=modifier, opcodeField="extendedOp") > > >+def extCodeMacroizer(): >+ def modifier(op): >+ return [cppType(type) for type in op["parameter"] + op["return"]] >+ return opcodeMacroizer(lambda op: isExtConv(op), modifier=modifier, opcodeField="extendedOp") >+ > defines = ["#define FOR_EACH_WASM_SPECIAL_OP(macro)"] >-defines.extend([op for op in opcodeMacroizer(lambda op: not (isUnary(op) or isBinary(op) or op["category"] == "control" or op["category"] == "memory" or op["category"] == "exttable"or isAtomic(op)))]) >+defines.extend([op for op in opcodeMacroizer(lambda op: not (isUnary(op) or isBinary(op) or op["category"] == "control" or op["category"] == "memory" or op["category"] == "exttable" or op["category"] == "extconv" or isAtomic(op)))]) > defines.append("\n\n#define FOR_EACH_WASM_CONTROL_FLOW_OP(macro)") > defines.extend([op for op in opcodeMacroizer(lambda op: op["category"] == "control")]) > defines.append("\n\n#define FOR_EACH_WASM_SIMPLE_UNARY_OP(macro)") >@@ -128,6 +132,8 @@ defines.append("\n\n#define FOR_EACH_WASM_MEMORY_STORE_OP(macro)") > defines.extend([op for op in memoryStoreMacroizer()]) > defines.append("\n\n#define FOR_EACH_WASM_EXT_TABLE_OP(macro)") > defines.extend([op for op in opcodeMacroizer(lambda op: (op["category"] == "exttable"), opcodeField="extendedOp")]) >+defines.append("\n\n#define FOR_EACH_WASM_EXT_CONV_OP(macro)") >+defines.extend([op for op in extCodeMacroizer()]) > defines.append("\n\n#define FOR_EACH_WASM_EXT_ATOMIC_LOAD_OP(macro)") > defines.extend([op for op in atomicMemoryLoadMacroizer()]) > defines.append("\n\n#define FOR_EACH_WASM_EXT_ATOMIC_STORE_OP(macro)") >@@ -308,6 +314,7 @@ enum class StoreOpType : uint8_t { > > enum class ExtTableOpType : uint8_t { > FOR_EACH_WASM_EXT_TABLE_OP(CREATE_ENUM_VALUE) >+ FOR_EACH_WASM_EXT_CONV_OP(CREATE_ENUM_VALUE) > }; > > enum class ExtAtomicOpType : uint8_t { >diff --git a/Source/JavaScriptCore/wasm/wasm.json b/Source/JavaScriptCore/wasm/wasm.json >index 2985d0f284d1d9fd3f2896d66ccedb69fa027b57..dee9bf8190e36ccbbd23f0307a7b5d93ed92f49e 100644 >--- a/Source/JavaScriptCore/wasm/wasm.json >+++ b/Source/JavaScriptCore/wasm/wasm.json >@@ -211,6 +211,7 @@ > "i32.trunc_s/f64": { "category": "conversion", "value": 170, "return": ["i32"], "parameter": ["f64"], "immediate": [] }, > "i32.trunc_u/f32": { "category": "conversion", "value": 169, "return": ["i32"], "parameter": ["f32"], "immediate": [] }, > "i32.trunc_u/f64": { "category": "conversion", "value": 171, "return": ["i32"], "parameter": ["f64"], "immediate": [] }, >+ "i32.trunc_sat_s/f32": { "category": "extconv", "value": 252, "return": ["i32"], "parameter": ["f32"], "immediate": [], "extendedOp": 0 }, > "i32.wrap/i64": { "category": "conversion", "value": 167, "return": ["i32"], "parameter": ["i64"], "immediate": [], "b3op": "Trunc" }, > "i64.trunc_s/f32": { "category": "conversion", "value": 174, "return": ["i64"], "parameter": ["f32"], "immediate": [] }, > "i64.trunc_s/f64": { "category": "conversion", "value": 176, "return": ["i64"], "parameter": ["f64"], "immediate": [] },
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 173471
:
419538
|
420006
|
420459
|
420460
|
420461
|
420463
|
420469