5#ifndef V8_COMPILER_TURBOSHAFT_WASM_IN_JS_INLINING_REDUCER_INL_H_
6#define V8_COMPILER_TURBOSHAFT_WASM_IN_JS_INLINING_REDUCER_INL_H_
8#if !V8_ENABLE_WEBASSEMBLY
9#error This header should only be included if WebAssembly is enabled.
33 if (v8_flags.trace_turbo_inlining) { \
34 StdoutStream() << x << std::endl; \
45 base::Vector<const
OpIndex> arguments,
47 if (!descriptor->js_wasm_call_parameters) {
49 return Next::ReduceCall(callee, frame_state, arguments, descriptor,
58 descriptor->js_wasm_call_parameters->module();
60 descriptor->js_wasm_call_parameters->native_module();
61 uint32_t func_idx = descriptor->js_wasm_call_parameters->function_index();
76 OpIndex isolate_root = __ LoadRootRegister();
77 V<WordPtr> thread_in_wasm_flag_address =
78 __ Load(isolate_root, LoadOp::Kind::RawAligned().Immutable(),
79 MemoryRepresentation::UintPtr(),
80 Isolate::thread_in_wasm_flag_address_offset());
81 __ Store(thread_in_wasm_flag_address, __ Word32Constant(1),
82 LoadOp::Kind::RawAligned(), MemoryRepresentation::Int32(),
83 compiler::kNoWriteBarrier);
86 Next::ReduceCall(callee, frame_state, arguments, descriptor, effects);
88 __ Store(thread_in_wasm_flag_address, __ Word32Constant(0),
89 LoadOp::Kind::RawAligned(), MemoryRepresentation::Int32(),
90 compiler::kNoWriteBarrier);
124template <
class Assembler>
132 template <
typename... Args>
154 decoder->
errorf(
"unsupported operation: %s",
166 uint32_t index =
static_cast<uint32_t
>(decoder->
sig_->parameter_count());
171 if (!type.is_defaultable()) {
172 DCHECK(type.is_reference());
173 op =
__ RootConstant(RootIndex::kOptimizedOut);
213 case wasm::kExprI32Eqz:
214 return __ Word32Equal(arg, 0);
215 case wasm::kExprF32Abs:
216 return __ Float32Abs(arg);
217 case wasm::kExprF32Neg:
218 return __ Float32Negate(arg);
219 case wasm::kExprF32Sqrt:
220 return __ Float32Sqrt(arg);
221 case wasm::kExprF64Abs:
222 return __ Float64Abs(arg);
223 case wasm::kExprF64Neg:
224 return __ Float64Negate(arg);
225 case wasm::kExprF64Sqrt:
226 return __ Float64Sqrt(arg);
227 case wasm::kExprF64SConvertI32:
228 return __ ChangeInt32ToFloat64(arg);
229 case wasm::kExprF64UConvertI32:
230 return __ ChangeUint32ToFloat64(arg);
231 case wasm::kExprF32SConvertI32:
232 return __ ChangeInt32ToFloat32(arg);
233 case wasm::kExprF32UConvertI32:
234 return __ ChangeUint32ToFloat32(arg);
235 case wasm::kExprF32ConvertF64:
236 return __ TruncateFloat64ToFloat32(arg);
237 case wasm::kExprF64ConvertF32:
238 return __ ChangeFloat32ToFloat64(arg);
239 case wasm::kExprF32ReinterpretI32:
240 return __ BitcastWord32ToFloat32(arg);
241 case wasm::kExprI32ReinterpretF32:
242 return __ BitcastFloat32ToWord32(arg);
243 case wasm::kExprI32Clz:
244 return __ Word32CountLeadingZeros(arg);
245 case wasm::kExprI32SExtendI8:
246 return __ Word32SignExtend8(arg);
247 case wasm::kExprI32SExtendI16:
248 return __ Word32SignExtend16(arg);
249 case wasm::kExprRefIsNull:
251 case wasm::kExprRefAsNonNull:
255 return __ Word32Equal(
__ IsNull(arg, input_type), 0);
264 case wasm::kExprI32ConvertI64:
265 case wasm::kExprI64SConvertI32:
266 case wasm::kExprI64UConvertI32:
267 case wasm::kExprF64ReinterpretI64:
268 case wasm::kExprI64ReinterpretF64:
269 case wasm::kExprI64Clz:
270 case wasm::kExprI64Eqz:
271 case wasm::kExprI64SExtendI8:
272 case wasm::kExprI64SExtendI16:
273 case wasm::kExprI64SExtendI32:
274 case wasm::kExprI32SConvertF32:
275 case wasm::kExprI32UConvertF32:
276 case wasm::kExprI32SConvertF64:
277 case wasm::kExprI32UConvertF64:
278 case wasm::kExprI64SConvertF32:
279 case wasm::kExprI64UConvertF32:
280 case wasm::kExprI64SConvertF64:
281 case wasm::kExprI64UConvertF64:
282 case wasm::kExprI32SConvertSatF32:
283 case wasm::kExprI32UConvertSatF32:
284 case wasm::kExprI32SConvertSatF64:
285 case wasm::kExprI32UConvertSatF64:
286 case wasm::kExprI64SConvertSatF32:
287 case wasm::kExprI64UConvertSatF32:
288 case wasm::kExprI64SConvertSatF64:
289 case wasm::kExprI64UConvertSatF64:
290 case wasm::kExprI32Ctz:
291 case wasm::kExprI32Popcnt:
292 case wasm::kExprF32Floor:
293 case wasm::kExprF32Ceil:
294 case wasm::kExprF32Trunc:
295 case wasm::kExprF32NearestInt:
296 case wasm::kExprF64Floor:
297 case wasm::kExprF64Ceil:
298 case wasm::kExprF64Trunc:
299 case wasm::kExprF64NearestInt:
300 case wasm::kExprI64Ctz:
301 case wasm::kExprI64Popcnt:
302 case wasm::kExprF32SConvertI64:
303 case wasm::kExprF32UConvertI64:
304 case wasm::kExprF64SConvertI64:
305 case wasm::kExprF64UConvertI64:
309 case wasm::kExprAnyConvertExtern:
310 case wasm::kExprExternConvertAny:
313 case wasm::kExprF64Acos:
314 case wasm::kExprF64Asin:
315 case wasm::kExprF64Atan:
316 case wasm::kExprF64Cos:
317 case wasm::kExprF64Sin:
318 case wasm::kExprF64Tan:
319 case wasm::kExprF64Exp:
320 case wasm::kExprF64Log:
321 case wasm::kExprI32AsmjsLoadMem8S:
322 case wasm::kExprI32AsmjsLoadMem8U:
323 case wasm::kExprI32AsmjsLoadMem16S:
324 case wasm::kExprI32AsmjsLoadMem16U:
325 case wasm::kExprI32AsmjsLoadMem:
326 case wasm::kExprF32AsmjsLoadMem:
327 case wasm::kExprF64AsmjsLoadMem:
328 case wasm::kExprI32AsmjsSConvertF32:
329 case wasm::kExprI32AsmjsUConvertF32:
330 case wasm::kExprI32AsmjsSConvertF64:
331 case wasm::kExprI32AsmjsUConvertF64:
348 case wasm::kExprI32Add:
349 return __ Word32Add(lhs, rhs);
350 case wasm::kExprI32Sub:
351 return __ Word32Sub(lhs, rhs);
352 case wasm::kExprI32Mul:
353 return __ Word32Mul(lhs, rhs);
354 case wasm::kExprI32And:
355 return __ Word32BitwiseAnd(lhs, rhs);
356 case wasm::kExprI32Ior:
357 return __ Word32BitwiseOr(lhs, rhs);
358 case wasm::kExprI32Xor:
359 return __ Word32BitwiseXor(lhs, rhs);
360 case wasm::kExprI32Shl:
362 return __ Word32ShiftLeft(lhs,
__ Word32BitwiseAnd(rhs, 0x1f));
363 case wasm::kExprI32ShrS:
364 return __ Word32ShiftRightArithmetic(lhs,
365 __ Word32BitwiseAnd(rhs, 0x1f));
366 case wasm::kExprI32ShrU:
367 return __ Word32ShiftRightLogical(lhs,
__ Word32BitwiseAnd(rhs, 0x1f));
368 case wasm::kExprI32Ror:
369 return __ Word32RotateRight(lhs,
__ Word32BitwiseAnd(rhs, 0x1f));
370 case wasm::kExprI32Rol:
371 if (SupportedOperations::word32_rol()) {
372 return __ Word32RotateLeft(lhs,
__ Word32BitwiseAnd(rhs, 0x1f));
374 return __ Word32RotateRight(
375 lhs,
__ Word32Sub(32,
__ Word32BitwiseAnd(rhs, 0x1f)));
377 case wasm::kExprI32Eq:
378 return __ Word32Equal(lhs, rhs);
379 case wasm::kExprI32Ne:
380 return __ Word32Equal(
__ Word32Equal(lhs, rhs), 0);
381 case wasm::kExprI32LtS:
382 return __ Int32LessThan(lhs, rhs);
383 case wasm::kExprI32LeS:
384 return __ Int32LessThanOrEqual(lhs, rhs);
385 case wasm::kExprI32LtU:
386 return __ Uint32LessThan(lhs, rhs);
387 case wasm::kExprI32LeU:
388 return __ Uint32LessThanOrEqual(lhs, rhs);
389 case wasm::kExprI32GtS:
390 return __ Int32LessThan(rhs, lhs);
391 case wasm::kExprI32GeS:
392 return __ Int32LessThanOrEqual(rhs, lhs);
393 case wasm::kExprI32GtU:
394 return __ Uint32LessThan(rhs, lhs);
395 case wasm::kExprI32GeU:
396 return __ Uint32LessThanOrEqual(rhs, lhs);
398 case wasm::kExprF32CopySign: {
400 __ Word32BitwiseAnd(
__ BitcastFloat32ToWord32(lhs), 0x7fffffff);
402 __ Word32BitwiseAnd(
__ BitcastFloat32ToWord32(rhs), 0x80000000);
403 return __ BitcastWord32ToFloat32(
404 __ Word32BitwiseOr(lhs_without_sign, rhs_sign));
406 case wasm::kExprF32Add:
407 return __ Float32Add(lhs, rhs);
408 case wasm::kExprF32Sub:
409 return __ Float32Sub(lhs, rhs);
410 case wasm::kExprF32Mul:
411 return __ Float32Mul(lhs, rhs);
412 case wasm::kExprF32Div:
413 return __ Float32Div(lhs, rhs);
414 case wasm::kExprF32Eq:
415 return __ Float32Equal(lhs, rhs);
416 case wasm::kExprF32Ne:
417 return __ Word32Equal(
__ Float32Equal(lhs, rhs), 0);
418 case wasm::kExprF32Lt:
419 return __ Float32LessThan(lhs, rhs);
420 case wasm::kExprF32Le:
421 return __ Float32LessThanOrEqual(lhs, rhs);
422 case wasm::kExprF32Gt:
423 return __ Float32LessThan(rhs, lhs);
424 case wasm::kExprF32Ge:
425 return __ Float32LessThanOrEqual(rhs, lhs);
426 case wasm::kExprF32Min:
427 return __ Float32Min(rhs, lhs);
428 case wasm::kExprF32Max:
429 return __ Float32Max(rhs, lhs);
430 case wasm::kExprF64Add:
432 case wasm::kExprF64Sub:
433 return __ Float64Sub(lhs, rhs);
434 case wasm::kExprF64Mul:
435 return __ Float64Mul(lhs, rhs);
436 case wasm::kExprF64Div:
437 return __ Float64Div(lhs, rhs);
438 case wasm::kExprF64Eq:
439 return __ Float64Equal(lhs, rhs);
440 case wasm::kExprF64Ne:
441 return __ Word32Equal(
__ Float64Equal(lhs, rhs), 0);
442 case wasm::kExprF64Lt:
443 return __ Float64LessThan(lhs, rhs);
444 case wasm::kExprF64Le:
445 return __ Float64LessThanOrEqual(lhs, rhs);
446 case wasm::kExprF64Gt:
447 return __ Float64LessThan(rhs, lhs);
448 case wasm::kExprF64Ge:
449 return __ Float64LessThanOrEqual(rhs, lhs);
450 case wasm::kExprF64Min:
451 return __ Float64Min(lhs, rhs);
452 case wasm::kExprF64Max:
453 return __ Float64Max(lhs, rhs);
454 case wasm::kExprRefEq:
455 return __ TaggedEqual(lhs, rhs);
464 case wasm::kExprI64Add:
465 case wasm::kExprI64Sub:
466 case wasm::kExprI64Mul:
467 case wasm::kExprI64And:
468 case wasm::kExprI64Ior:
469 case wasm::kExprI64Xor:
470 case wasm::kExprI64Shl:
471 case wasm::kExprI64ShrS:
472 case wasm::kExprI64ShrU:
473 case wasm::kExprI64Ror:
474 case wasm::kExprI64Rol:
475 case wasm::kExprI64Eq:
476 case wasm::kExprI64Ne:
477 case wasm::kExprI64LtS:
478 case wasm::kExprI64LeS:
479 case wasm::kExprI64LtU:
480 case wasm::kExprI64LeU:
481 case wasm::kExprI64GtS:
482 case wasm::kExprI64GeS:
483 case wasm::kExprI64GtU:
484 case wasm::kExprI64GeU:
486 case wasm::kExprF64CopySign:
488 case wasm::kExprI32DivS:
489 case wasm::kExprI32DivU:
490 case wasm::kExprI32RemS:
491 case wasm::kExprI32RemU:
492 case wasm::kExprI64DivS:
493 case wasm::kExprI64DivU:
494 case wasm::kExprI64RemS:
495 case wasm::kExprI64RemU:
498 case wasm::kExprF64Atan2:
499 case wasm::kExprF64Pow:
500 case wasm::kExprF64Mod:
501 case wasm::kExprI32AsmjsDivS:
502 case wasm::kExprI32AsmjsDivU:
503 case wasm::kExprI32AsmjsRemS:
504 case wasm::kExprI32AsmjsRemU:
505 case wasm::kExprI32AsmjsStoreMem8:
506 case wasm::kExprI32AsmjsStoreMem16:
507 case wasm::kExprI32AsmjsStoreMem:
508 case wasm::kExprF32AsmjsStoreMem:
509 case wasm::kExprF64AsmjsStoreMem:
524 result->op =
__ Word32Constant(value);
533 result->op =
__ Float32Constant(value);
537 result->op =
__ Float64Constant(value);
576 bool shared = decoder->
module_->globals[imm.
index].shared;
585 bool shared = decoder->
module_->globals[imm.
index].shared;
614 size_t return_count = decoder->
sig_->return_count();
616 if (return_count == 1) {
619 ->
stack_value(
static_cast<uint32_t
>(return_count + drop_values))
621 }
else if (return_count == 0) {
624 result_ =
__ HeapConstant(isolate->factory()->undefined_value());
640 const Value arg_values[]) {
719 const Value& size_val) {
724 const Value& size_val) {
761 const Value& length,
const Value& initial_value,
780 const Value& value) {
793 const Value& length) {
811 const Value& length) {
868 const Value& value) {
874 const Value& value,
const uint8_t laneidx) {
921 bool pass_null_along_branch,
Value* result_on_fallthrough) {
926 uint32_t depth,
bool ) {
931 const Value&
object,
Value* value_on_branch, uint32_t br_depth,
937 Value* value_on_branch, uint32_t br_depth,
947 const Value&
object,
Value* value_on_fallthrough,
953 Value* value_on_fallthrough, uint32_t br_depth,
1126 switch (type.kind()) {
1130 return __ Word32Constant(int32_t{0});
1132 return __ Word64Constant(int64_t{0});
1135 return __ Float32Constant(0.0f);
1137 return __ Float64Constant(0.0);
1138 case wasm::kRefNull:
1142 return __ Simd128Constant(value);
1169template <
class Next>
1175 TRACE(
"Considering wasm function ["
1177 << JSInliner::WasmFunctionNameForTrace(native_module, func_idx)
1178 <<
" of module " << module <<
" for inlining");
1181 TRACE(
"- not inlining: asm.js-in-JS inlining is not supported");
1185 if (func_idx < module->num_imported_functions) {
1186 TRACE(
"- not inlining: call to an imported function");
1194 bool is_shared =
module->type(func.sig_index).is_shared;
1196 TRACE(
"- not inlining: shared everything is not supported");
1218 Block* inlinee_body_and_rest =
__ NewBlock();
1219 __ Goto(inlinee_body_and_rest);
1224 Block* unreachable =
__ NewBlock();
1225 __ Bind(unreachable);
1231 env.enabled_features, &detected, func_body, Asm(),
1232 arguments_without_instance, trusted_instance_data);
1233 DCHECK(env.module->function_was_validated(func_idx));
1234 can_inline_decoder.
Decode();
1238 if (!can_inline_decoder.ok()) {
1239 TRACE(
"- not inlining: " << can_inline_decoder.error().message());
1240 __ Bind(inlinee_body_and_rest);
1245 __ Bind(inlinee_body_and_rest);
1247 &detected, func_body, Asm(),
1248 arguments_without_instance, trusted_instance_data);
1249 emitting_decoder.
Decode();
1250 DCHECK(emitting_decoder.ok());
1251 DCHECK(emitting_decoder.interface().Result().
valid());
1252 TRACE(
"- inlining");
1253 return emitting_decoder.interface().Result();
#define REDUCE(operation)
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
Vector< T > SubVectorFrom(size_t from) const
constexpr T * begin() const
virtual void Decode(Instruction *instr)
static constexpr OpIndex Invalid()
constexpr bool valid() const
V< Any > TryInlineWasmCall(const wasm::WasmModule *module, wasm::NativeModule *native_module, uint32_t func_idx, base::Vector< const OpIndex > arguments)
void StringViewIterSlice(FullDecoder *decoder, const Value &view, const Value &codepoints, Value *result)
void StringViewWtf8Slice(FullDecoder *decoder, const Value &view, const Value &start, const Value &end, Value *result)
void GlobalSet(FullDecoder *decoder, const Value &value, const GlobalIndexImmediate &imm)
void Else(FullDecoder *decoder, Control *if_block)
void StringViewWtf8Advance(FullDecoder *decoder, const Value &view, const Value &pos, const Value &bytes, Value *result)
void StructSet(FullDecoder *decoder, const Value &struct_object, const FieldImmediate &field, const Value &field_value)
void CallRef(FullDecoder *decoder, const Value &func_ref, const wasm::FunctionSig *sig, const Value args[], Value returns[])
void StringAsIter(FullDecoder *decoder, const Value &str, Value *result)
void I31GetU(FullDecoder *decoder, const Value &input, Value *result)
void AssertNullTypecheck(FullDecoder *decoder, const Value &obj, Value *result)
void ElemDrop(FullDecoder *decoder, const IndexImmediate &imm)
void BrOrRet(FullDecoder *decoder, uint32_t depth, uint32_t drop_values=0)
void CatchCase(FullDecoder *decoder, Control *block, const wasm::CatchCase &catch_case, base::Vector< Value > values)
void Select(FullDecoder *decoder, const Value &cond, const Value &fval, const Value &tval, Value *result)
void Bailout(FullDecoder *decoder)
void ArrayLen(FullDecoder *decoder, const Value &array_obj, Value *result)
void ArraySet(FullDecoder *decoder, const Value &array_obj, const ArrayIndexImmediate &imm, const Value &index, const Value &value)
void Loop(FullDecoder *decoder, Control *block)
V< WasmTrustedInstanceData > trusted_instance_data_
void DoReturn(FullDecoder *decoder, uint32_t drop_values)
void BrOnCastDesc(FullDecoder *decoder, wasm::HeapType target_type, const Value &object, const Value &descriptor, Value *value_on_branch, uint32_t br_depth, bool null_succeeds)
void RefCastAbstract(FullDecoder *decoder, const Value &object, wasm::HeapType type, Value *result, bool null_succeeds)
void StringNewWtf16Array(FullDecoder *decoder, const Value &array, const Value &start, const Value &end, Value *result)
void I64Const(FullDecoder *decoder, Value *result, int64_t value)
void If(FullDecoder *decoder, const Value &cond, Control *if_block)
void BrOnCastFail(FullDecoder *decoder, wasm::HeapType target_type, const Value &object, Value *value_on_fallthrough, uint32_t br_depth, bool null_succeeds)
void Throw(FullDecoder *decoder, const TagIndexImmediate &imm, const Value arg_values[])
void LocalGet(FullDecoder *decoder, Value *result, const IndexImmediate &imm)
void Block(FullDecoder *decoder, Control *block)
void LocalTee(FullDecoder *decoder, const Value &value, Value *result, const IndexImmediate &imm)
void StringMeasureWtf16(FullDecoder *decoder, const Value &str, Value *result)
void AssertNotNullTypecheck(FullDecoder *decoder, const Value &obj, Value *result)
void TableSet(FullDecoder *decoder, const Value &index, const Value &value, const TableIndexImmediate &imm)
void StringViewIterNext(FullDecoder *decoder, const Value &view, Value *result)
void SimdOp(FullDecoder *decoder, WasmOpcode opcode, const Value *args, Value *result)
void CallIndirect(FullDecoder *decoder, const Value &index, const CallIndirectImmediate &imm, const Value args[], Value returns[])
void ArrayGet(FullDecoder *decoder, const Value &array_obj, const ArrayIndexImmediate &imm, const Value &index, bool is_signed, Value *result)
void BrOnCastAbstract(FullDecoder *decoder, const Value &object, wasm::HeapType type, Value *value_on_branch, uint32_t br_depth, bool null_succeeds)
void OnFirstError(FullDecoder *)
static constexpr bool kUsesPoppedArgs
void StringConcat(FullDecoder *decoder, const Value &head, const Value &tail, Value *result)
void ArrayInitSegment(FullDecoder *decoder, const ArrayIndexImmediate &array_imm, const IndexImmediate &segment_imm, const Value &array, const Value &array_index, const Value &segment_offset, const Value &length)
void AtomicNotify(FullDecoder *decoder, const MemoryAccessImmediate &imm, OpIndex index, OpIndex num_waiters_to_wake, Value *result)
void CurrentMemoryPages(FullDecoder *decoder, const MemoryIndexImmediate &imm, Value *result)
void SimdLaneOp(FullDecoder *decoder, WasmOpcode opcode, const SimdLaneImmediate &imm, base::Vector< const Value > inputs, Value *result)
void LoadMem(FullDecoder *decoder, wasm::LoadType type, const MemoryAccessImmediate &imm, const Value &index, Value *result)
base::Vector< const OpIndex > arguments_
void TableSize(FullDecoder *decoder, const TableIndexImmediate &imm, Value *result)
void Delegate(FullDecoder *decoder, uint32_t depth, Control *block)
void StoreLane(FullDecoder *decoder, wasm::StoreType type, const MemoryAccessImmediate &imm, const Value &index, const Value &value, const uint8_t laneidx)
void EffectHandlerTable(FullDecoder *decoder, Control *block)
V< Any > DefaultValue(ValueType type)
void RefTestAbstract(FullDecoder *decoder, const Value &object, wasm::HeapType type, Value *result, bool null_succeeds)
void StructNew(FullDecoder *decoder, const StructIndexImmediate &imm, const Value &descriptor, const Value args[], Value *result)
void AtomicFence(FullDecoder *decoder)
void ArrayNewDefault(FullDecoder *decoder, const ArrayIndexImmediate &imm, const Value &length, Value *result)
void TableGrow(FullDecoder *decoder, const TableIndexImmediate &imm, const Value &value, const Value &delta, Value *result)
void ReturnCall(FullDecoder *decoder, const CallFunctionImmediate &imm, const Value args[])
void Rethrow(FullDecoder *decoder, Control *block)
void Drop(FullDecoder *decoder)
void CallDirect(FullDecoder *decoder, const CallFunctionImmediate &imm, const Value args[], Value returns[])
void StructNewDefault(FullDecoder *decoder, const StructIndexImmediate &imm, const Value &descriptor, Value *result)
void MemoryFill(FullDecoder *decoder, const MemoryIndexImmediate &imm, const Value &dst, const Value &value, const Value &size)
void StringNewWtf16(FullDecoder *decoder, const MemoryIndexImmediate &imm, const Value &offset, const Value &size, Value *result)
void ArrayNew(FullDecoder *decoder, const ArrayIndexImmediate &imm, const Value &length, const Value &initial_value, Value *result)
void StringViewWtf16GetCodeUnit(FullDecoder *decoder, const Value &view, const Value &pos, Value *result)
void MemoryInit(FullDecoder *decoder, const MemoryInitImmediate &imm, const Value &dst, const Value &src, const Value &size)
void StringEncodeWtf16Array(FullDecoder *decoder, const Value &str, const Value &array, const Value &start, Value *result)
void FallThruTo(FullDecoder *decoder, Control *block)
void LoadLane(FullDecoder *decoder, wasm::LoadType type, const Value &value, const Value &index, const MemoryAccessImmediate &imm, const uint8_t laneidx, Value *result)
void MemoryGrow(FullDecoder *decoder, const MemoryIndexImmediate &imm, const Value &value, Value *result)
void RefCastDesc(FullDecoder *decoder, const Value &object, const Value &descriptor, Value *result)
void TableGet(FullDecoder *decoder, const Value &index, Value *result, const TableIndexImmediate &imm)
void Try(FullDecoder *decoder, Control *block)
void StringMeasureWtf8(FullDecoder *decoder, const unibrow::Utf8Variant variant, const Value &str, Value *result)
void ReturnCallRef(FullDecoder *decoder, const Value &func_ref, const wasm::FunctionSig *sig, const Value args[])
void Trap(FullDecoder *decoder, wasm::TrapReason reason)
void ThrowRef(FullDecoder *decoder, Value *value)
OpIndex UnOpImpl(FullDecoder *decoder, WasmOpcode opcode, OpIndex arg, ValueType input_type)
void StoreMem(FullDecoder *decoder, wasm::StoreType type, const MemoryAccessImmediate &imm, const Value &index, const Value &value)
void TableInit(FullDecoder *decoder, const TableInitImmediate &imm, const Value &dst_val, const Value &src_val, const Value &size_val)
void StringCompare(FullDecoder *decoder, const Value &lhs, const Value &rhs, Value *result)
void StringViewWtf16Slice(FullDecoder *decoder, const Value &view, const Value &start, const Value &end, Value *result)
void BrOnCastFailAbstract(FullDecoder *decoder, const Value &object, wasm::HeapType type, Value *value_on_fallthrough, uint32_t br_depth, bool null_succeeds)
void FinishFunction(FullDecoder *decoder)
void TryTable(FullDecoder *decoder, Control *block)
void StringNewWtf8(FullDecoder *decoder, const MemoryIndexImmediate &imm, const unibrow::Utf8Variant variant, const Value &offset, const Value &size, Value *result)
void RefAsNonNull(FullDecoder *decoder, const Value &arg, Value *result)
void DataDrop(FullDecoder *decoder, const IndexImmediate &imm)
void StringAsWtf16(FullDecoder *decoder, const Value &str, Value *result)
void I32Const(FullDecoder *decoder, Value *result, int32_t value)
void StringEncodeWtf8(FullDecoder *decoder, const MemoryIndexImmediate &memory, const unibrow::Utf8Variant variant, const Value &str, const Value &offset, Value *result)
void BrIf(FullDecoder *decoder, const Value &cond, uint32_t depth)
void ArrayNewFixed(FullDecoder *decoder, const ArrayIndexImmediate &array_imm, const IndexImmediate &length_imm, const Value elements[], Value *result)
void StringEq(FullDecoder *decoder, const Value &a, const Value &b, Value *result)
void AtomicOp(FullDecoder *decoder, WasmOpcode opcode, const Value args[], const size_t argc, const MemoryAccessImmediate &imm, Value *result)
OpIndex BinOpImpl(FullDecoder *decoder, WasmOpcode opcode, OpIndex lhs, OpIndex rhs)
void BrOnNonNull(FullDecoder *decoder, const Value &ref_object, Value *result, uint32_t depth, bool)
void BrOnCastDescFail(FullDecoder *decoder, wasm::HeapType target_type, const Value &object, const Value &descriptor, Value *value_on_fallthrough, uint32_t br_depth, bool null_succeeds)
void StringIsUSVSequence(FullDecoder *decoder, const Value &str, Value *result)
void CatchAll(FullDecoder *decoder, Control *block)
void RefGetDesc(FullDecoder *decoder, const Value &ref, Value *desc)
void StringEncodeWtf8Array(FullDecoder *decoder, const unibrow::Utf8Variant variant, const Value &str, const Value &array, const Value &start, Value *result)
void F64Const(FullDecoder *decoder, Value *result, double value)
void BrTable(FullDecoder *decoder, const BranchTableImmediate &imm, const Value &key)
void BinOp(FullDecoder *decoder, WasmOpcode opcode, const Value &lhs, const Value &rhs, Value *result)
void LoadTransform(FullDecoder *decoder, wasm::LoadType type, wasm::LoadTransformationKind transform, const MemoryAccessImmediate &imm, const Value &index, Value *result)
void StringHash(FullDecoder *decoder, const Value &string, Value *result)
ZoneVector< OpIndex > locals_
void RefNull(FullDecoder *decoder, ValueType type, Value *result)
void ReturnCallIndirect(FullDecoder *decoder, const Value &index, const CallIndirectImmediate &imm, const Value args[])
void PopControl(FullDecoder *decoder, Control *block)
void RefFunc(FullDecoder *decoder, uint32_t function_index, Value *result)
void ArrayFill(FullDecoder *decoder, ArrayIndexImmediate &imm, const Value &array, const Value &index, const Value &value, const Value &length)
void RefI31(FullDecoder *decoder, const Value &input, Value *result)
WasmInJsInliningInterface(Assembler &assembler, base::Vector< const OpIndex > arguments, V< WasmTrustedInstanceData > trusted_instance_data)
void F32Const(FullDecoder *decoder, Value *result, float value)
void StringConst(FullDecoder *decoder, const StringConstImmediate &imm, Value *result)
void AtomicWait(FullDecoder *decoder, WasmOpcode opcode, const MemoryAccessImmediate &imm, OpIndex index, OpIndex expected, V< Word64 > timeout, Value *result)
void StartFunction(FullDecoder *decoder)
void BrOnNull(FullDecoder *decoder, const Value &ref_object, uint32_t depth, bool pass_null_along_branch, Value *result_on_fallthrough)
void GlobalGet(FullDecoder *decoder, Value *result, const GlobalIndexImmediate &imm)
void TableFill(FullDecoder *decoder, const TableIndexImmediate &imm, const Value &start, const Value &value, const Value &count)
void BrOnCast(FullDecoder *decoder, wasm::HeapType target_type, const Value &object, Value *value_on_branch, uint32_t br_depth, bool null_succeeds)
void StringNewWtf8Array(FullDecoder *decoder, const unibrow::Utf8Variant variant, const Value &array, const Value &start, const Value &end, Value *result)
void StartFunctionBody(FullDecoder *decoder, Control *block)
void StringViewWtf16Encode(FullDecoder *decoder, const MemoryIndexImmediate &imm, const Value &view, const Value &offset, const Value &pos, const Value &codeunits, Value *result)
void NextInstruction(FullDecoder *decoder, WasmOpcode)
void StringViewIterAdvance(FullDecoder *decoder, const Value &view, const Value &codepoints, Value *result)
void Simd8x16ShuffleOp(FullDecoder *decoder, const Simd128Immediate &imm, const Value &input0, const Value &input1, Value *result)
void LocalSet(FullDecoder *decoder, const Value &value, const IndexImmediate &imm)
void StringFromCodePoint(FullDecoder *decoder, const Value &code_point, Value *result)
void NopForTestingUnsupportedInLiftoff(FullDecoder *decoder)
void CatchException(FullDecoder *decoder, const TagIndexImmediate &imm, Control *block, base::Vector< Value > values)
void ArrayNewSegment(FullDecoder *decoder, const ArrayIndexImmediate &array_imm, const IndexImmediate &segment_imm, const Value &offset, const Value &length, Value *result)
void Forward(FullDecoder *decoder, const Value &from, Value *to)
void StringEncodeWtf16(FullDecoder *decoder, const MemoryIndexImmediate &imm, const Value &str, const Value &offset, Value *result)
void I31GetS(FullDecoder *decoder, const Value &input, Value *result)
void RefTest(FullDecoder *decoder, wasm::HeapType target_type, const Value &object, Value *result, bool null_succeeds)
void StructGet(FullDecoder *decoder, const Value &struct_object, const FieldImmediate &field, bool is_signed, Value *result)
void MemoryCopy(FullDecoder *decoder, const MemoryCopyImmediate &imm, const Value &dst, const Value &src, const Value &size)
void StringViewIterRewind(FullDecoder *decoder, const Value &view, const Value &codepoints, Value *result)
void S128Const(FullDecoder *decoder, const Simd128Immediate &imm, Value *result)
void TableCopy(FullDecoder *decoder, const TableCopyImmediate &imm, const Value &dst_val, const Value &src_val, const Value &size_val)
void StringAsWtf8(FullDecoder *decoder, const Value &str, Value *result)
void ArrayCopy(FullDecoder *decoder, const Value &dst, const Value &dst_index, const Value &src, const Value &src_index, const ArrayIndexImmediate &src_imm, const Value &length)
void TraceInstruction(FullDecoder *decoder, uint32_t markid)
void StringViewWtf8Encode(FullDecoder *decoder, const MemoryIndexImmediate &memory, const unibrow::Utf8Variant variant, const Value &view, const Value &addr, const Value &pos, const Value &bytes, Value *next_pos, Value *bytes_written)
void UnOp(FullDecoder *decoder, WasmOpcode opcode, const Value &value, Value *result)
void RefCast(FullDecoder *decoder, const Value &object, Value *result)
void V8_NOINLINE V8_PRESERVE_MOST errorf(const char *format, Args... args)
const uint8_t * pc() const
base::Vector< const uint8_t > wire_bytes() const
const WasmModule * module_
uint32_t num_locals() const
ValueType local_type(uint32_t index) const
const char * SafeOpcodeNameAt(const uint8_t *pc)
Value * stack_value(uint32_t depth) const
uint32_t end_offset() const
#define TURBOSHAFT_REDUCER_BOILERPLATE(Name)
base::Vector< const DirectHandle< Object > > args
ZoneVector< RpoNumber > & result
TNode< Float64T > Float64Add(TNode< Float64T > a, TNode< Float64T > b)
constexpr int kWasmInstanceDataParameterIndex
bool is_asmjs_module(const WasmModule *module)
constexpr int kSimd128Size
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
V8_EXPORT_PRIVATE FlagValues v8_flags
JSArrayBuffer::IsDetachableBit is_shared
kInstanceDescriptorsOffset kTransitionsOrPrototypeInfoOffset IsNull(value)||IsJSProxy(value)||IsWasmObject(value)||(IsJSObject(value) &&(HeapLayout
bool is_signed(Condition cond)
const size_t segment_offset
#define DCHECK_LE(v1, v2)
#define DCHECK_WITH_MSG(condition, msg)
#define CHECK_LE(lhs, rhs)
#define DCHECK_NOT_NULL(val)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
Value(Args &&... args) V8_NOEXCEPT
static CompilationEnv ForModule(const NativeModule *native_module)
ValueBase(const uint8_t *pc, ValueType type)
uint32_t num_declared_functions
uint32_t num_imported_functions