12#if V8_ENABLE_WEBASSEMBLY
21#define __ ACCESS_MASM(masm)
23#if V8_ENABLE_WEBASSEMBLY
28void PrepareForJsToWasmConversionBuiltinCall(
29 MacroAssembler* masm, Register array_start, Register param_count,
30 Register current_param_slot, Register valuetypes_array_ptr,
31 Register wasm_instance, Register function_data) {
34 rbp, BuiltinWasmInterpreterWrapperConstants::kGCScanSlotCountOffset),
39 __ pushq(array_start);
40 __ pushq(param_count);
41 __ pushq(current_param_slot);
42 __ pushq(valuetypes_array_ptr);
45 __ pushq(wasm_instance);
46 __ pushq(function_data);
49 Register wasm_trusted_instance = wasm_instance;
50 __ LoadTrustedPointerField(
51 wasm_trusted_instance,
57 WasmTrustedInstanceData::kNativeContextOffset)));
60void RestoreAfterJsToWasmConversionBuiltinCall(
61 MacroAssembler* masm, Register function_data, Register wasm_instance,
62 Register valuetypes_array_ptr, Register current_param_slot,
63 Register param_count, Register array_start) {
66 __ popq(function_data);
67 __ popq(wasm_instance);
68 __ popq(valuetypes_array_ptr);
69 __ popq(current_param_slot);
75 rbp, BuiltinWasmInterpreterWrapperConstants::kGCScanSlotCountOffset),
79void PrepareForBuiltinCall(MacroAssembler* masm, Register array_start,
80 Register return_count, Register wasm_instance) {
85 rbp, BuiltinWasmInterpreterWrapperConstants::kGCScanSlotCountOffset),
88 __ pushq(array_start);
89 __ pushq(return_count);
92 __ pushq(wasm_instance);
95 Register wasm_trusted_instance = wasm_instance;
96 __ LoadTrustedPointerField(
97 wasm_trusted_instance,
103 WasmTrustedInstanceData::kNativeContextOffset)));
106void RestoreAfterBuiltinCall(MacroAssembler* masm, Register wasm_instance,
107 Register return_count, Register array_start) {
110 __ popq(wasm_instance);
111 __ popq(return_count);
112 __ popq(array_start);
115void PrepareForWasmToJsConversionBuiltinCall(
116 MacroAssembler* masm, Register return_count, Register result_index,
117 Register current_return_slot, Register valuetypes_array_ptr,
118 Register wasm_instance, Register fixed_array, Register jsarray) {
121 rbp, BuiltinWasmInterpreterWrapperConstants::kGCScanSlotCountOffset),
126 __ pushq(return_count);
127 __ pushq(result_index);
128 __ pushq(current_return_slot);
129 __ pushq(valuetypes_array_ptr);
132 __ pushq(wasm_instance);
133 __ pushq(fixed_array);
136 Register wasm_trusted_instance = wasm_instance;
137 __ LoadTrustedPointerField(
138 wasm_trusted_instance,
139 FieldMemOperand(wasm_instance, WasmInstanceObject::kTrustedDataOffset),
144 WasmTrustedInstanceData::kNativeContextOffset)));
147void RestoreAfterWasmToJsConversionBuiltinCall(
148 MacroAssembler* masm, Register jsarray, Register fixed_array,
149 Register wasm_instance, Register valuetypes_array_ptr,
150 Register current_return_slot, Register result_index,
151 Register return_count) {
155 __ popq(fixed_array);
156 __ popq(wasm_instance);
157 __ popq(valuetypes_array_ptr);
158 __ popq(current_return_slot);
159 __ popq(result_index);
160 __ popq(return_count);
165void Builtins::Generate_WasmInterpreterEntry(MacroAssembler* masm) {
171 __ EnterFrame(StackFrame::WASM_INTERPRETER_ENTRY);
173 __ pushq(wasm_instance);
174 __ pushq(function_index);
175 __ pushq(array_start);
176 __ Move(wasm_instance, 0);
177 __ CallRuntime(Runtime::kWasmRunInterpreter, 3);
180 __ LeaveFrame(StackFrame::WASM_INTERPRETER_ENTRY);
184void LoadFunctionDataAndWasmInstance(MacroAssembler* masm,
185 Register function_data,
186 Register wasm_instance) {
188 Register shared_function_info = closure;
190 shared_function_info,
195 __ LoadTrustedPointerField(
198 SharedFunctionInfo::kTrustedFunctionDataOffset),
200 shared_function_info =
no_reg;
202 Register trusted_instance_data = wasm_instance;
204 __ DecompressProtected(
205 trusted_instance_data,
207 WasmExportedFunctionData::kProtectedInstanceDataOffset -
211 trusted_instance_data,
213 WasmExportedFunctionData::kProtectedInstanceDataOffset -
216 __ LoadTaggedField(wasm_instance,
218 WasmTrustedInstanceData::kInstanceObjectOffset -
222void LoadFromSignature(MacroAssembler* masm, Register valuetypes_array_ptr,
223 Register return_count, Register param_count) {
224 Register signature = valuetypes_array_ptr;
225 __ movq(return_count,
229 valuetypes_array_ptr = signature;
230 __ movq(valuetypes_array_ptr,
234void LoadValueTypesArray(MacroAssembler* masm, Register function_data,
235 Register valuetypes_array_ptr, Register return_count,
236 Register param_count, Register signature_data) {
240 WasmExportedFunctionData::kPackedArgsSizeOffset));
241 __ SmiToInt32(signature_data);
243 Register signature = valuetypes_array_ptr;
247 LoadFromSignature(masm, valuetypes_array_ptr, return_count, param_count);
252void Builtins::Generate_GenericJSToWasmInterpreterWrapper(
253 MacroAssembler* masm) {
255 __ EnterFrame(StackFrame::JS_TO_WASM);
279 constexpr int kMarkerOffset =
280 BuiltinWasmInterpreterWrapperConstants::kGCScanSlotCountOffset +
283 constexpr int kInParamCountOffset =
284 BuiltinWasmInterpreterWrapperConstants::kGCScanSlotCountOffset -
287 constexpr int kParamCountOffset =
288 BuiltinWasmInterpreterWrapperConstants::kParamCountOffset;
289 constexpr int kReturnCountOffset =
290 BuiltinWasmInterpreterWrapperConstants::kReturnCountOffset;
291 constexpr int kSigRepsOffset =
292 BuiltinWasmInterpreterWrapperConstants::kSigRepsOffset;
293 constexpr int kValueTypesArrayStartOffset =
294 BuiltinWasmInterpreterWrapperConstants::kValueTypesArrayStartOffset;
296 constexpr int kArgRetsAddressOffset =
297 BuiltinWasmInterpreterWrapperConstants::kArgRetsAddressOffset;
300 constexpr int kArgRetsIsArgsOffset =
301 BuiltinWasmInterpreterWrapperConstants::kArgRetsIsArgsOffset;
303 constexpr int kCurrentIndexOffset =
304 BuiltinWasmInterpreterWrapperConstants::kCurrentIndexOffset;
309 constexpr int kSignatureDataOffset =
310 BuiltinWasmInterpreterWrapperConstants::kSignatureDataOffset;
313 constexpr int kNumSpillSlots =
319 __ decq(in_param_count);
320 __ movq(
MemOperand(rbp, kInParamCountOffset), in_param_count);
328 LoadFunctionDataAndWasmInstance(masm, function_data, wasm_instance);
337 LoadValueTypesArray(masm, function_data, valuetypes_array_ptr, return_count,
338 param_count, signature_data);
339 __ movq(
MemOperand(rbp, kSignatureDataOffset), signature_data);
340 Register array_size = signature_data;
352 __ movq(
MemOperand(rbp, kParamCountOffset), param_count);
353 __ movq(
MemOperand(rbp, kReturnCountOffset), return_count);
354 __ movq(
MemOperand(rbp, kSigRepsOffset), valuetypes_array_ptr);
355 __ movq(
MemOperand(rbp, kValueTypesArrayStartOffset), valuetypes_array_ptr);
362 __ negq(array_start);
363 __ addq(array_start, rsp);
364 __ movq(rsp, array_start);
365 __ movq(
MemOperand(rbp, kArgRetsAddressOffset), array_start);
367 __ movq(
MemOperand(rbp, kArgRetsIsArgsOffset), Immediate(1));
370 Label prepare_for_wasm_call;
371 __ Cmp(param_count, 0);
374 __ j(
equal, &prepare_for_wasm_call);
385 __ movq(current_param_slot, array_start);
393 constexpr int kArgsOffset =
399 constexpr int kValueTypeSize =
sizeof(wasm::ValueType);
400 static_assert(kValueTypeSize == 4);
401 const int32_t kValueTypeSizeLog2 =
log2(kValueTypeSize);
403 Register returns_size = return_count;
405 __ shlq(returns_size, Immediate(kValueTypeSizeLog2));
406 __ addq(valuetypes_array_ptr, returns_size);
410 __ Move(current_index, 0);
415 Label loop_through_params;
416 __ bind(&loop_through_params);
419 rbp, BuiltinWasmInterpreterWrapperConstants::kCurrentIndexOffset),
425 __ movl(valuetype, Operand(valuetypes_array_ptr, 0));
432 Label param_conversion_done;
433 Label check_ref_param;
437 __ JumpIfNotSmi(param, &convert_param);
442 __ movl(param, param);
445 __ addq(current_param_slot, Immediate(
sizeof(int32_t)));
446 __ jmp(¶m_conversion_done);
448 Label handle_ref_param;
449 __ bind(&check_ref_param);
450 __ testl(valuetype, Immediate(1));
454 __ bind(&handle_ref_param);
456 __ movq(r9, current_param_slot);
457 __ andq(r9, Immediate(0x04));
458 __ addq(current_param_slot, r9);
465 __ bind(¶m_conversion_done);
467 __ addq(valuetypes_array_ptr, Immediate(kValueTypeSize));
472 BuiltinWasmInterpreterWrapperConstants::kCurrentIndexOffset));
473 __ incq(current_index);
474 __ cmpq(current_index, param_count);
475 __ j(
less, &loop_through_params);
477 rbp, BuiltinWasmInterpreterWrapperConstants::kCurrentIndexOffset),
489 __ bind(&prepare_for_wasm_call);
494 Register thread_in_wasm_flag_addr = r12;
496 thread_in_wasm_flag_addr,
498 __ movl(
MemOperand(thread_in_wasm_flag_addr, 0), Immediate(1));
499 thread_in_wasm_flag_addr =
no_reg;
504 MemOperand(function_data, WasmExportedFunctionData::kFunctionIndexOffset -
510 constexpr int kWasmCallGCScanSlotCount = 1;
513 rbp, BuiltinWasmInterpreterWrapperConstants::kGCScanSlotCountOffset),
514 kWasmCallGCScanSlotCount);
519 __ pushq(wasm_instance);
522 __ popq(wasm_instance);
523 __ movq(array_start,
MemOperand(rbp, kArgRetsAddressOffset));
529 thread_in_wasm_flag_addr = r8;
531 thread_in_wasm_flag_addr,
533 __ movl(
MemOperand(thread_in_wasm_flag_addr, 0), Immediate(0));
534 thread_in_wasm_flag_addr =
no_reg;
544 __ movq(return_count,
MemOperand(rbp, kReturnCountOffset));
548 rbp, BuiltinWasmInterpreterWrapperConstants::kCurrentIndexOffset),
553 __ Move(fixed_array, 0);
557 Label return_undefined;
558 __ cmpl(return_count, Immediate(1));
560 __ j(
less, &return_undefined);
562 Label start_return_conversion;
564 __ j(
equal, &start_return_conversion);
566 PrepareForBuiltinCall(masm, array_start, return_count, wasm_instance);
567 __ movq(rax, return_count);
572 __ movq(jsarray, rax);
573 RestoreAfterBuiltinCall(masm, wasm_instance, return_count, array_start);
574 __ LoadTaggedField(fixed_array,
MemOperand(jsarray, JSArray::kElementsOffset -
577 __ bind(&start_return_conversion);
578 Register current_return_slot = array_start;
581 __ xorq(result_index, result_index);
583 Label convert_return_value;
584 __ jmp(&convert_return_value);
586 __ bind(&return_undefined);
587 __ LoadRoot(return_value, RootIndex::kUndefinedValue);
588 Label all_results_conversion_done;
589 __ jmp(&all_results_conversion_done);
591 Label next_return_value;
592 __ bind(&next_return_value);
593 __ incq(result_index);
594 __ cmpq(result_index, return_count);
595 __ j(
less, &convert_return_value);
597 __ bind(&all_results_conversion_done);
598 __ movq(param_count,
MemOperand(rbp, kParamCountOffset));
601 __ cmpq(fixed_array, Immediate(0));
604 __ movq(rax, jsarray);
609 in_param_count = rdx;
610 __ movq(in_param_count,
MemOperand(rbp, kInParamCountOffset));
611 __ cmpq(param_count, in_param_count);
612 __ cmovq(
less, param_count, in_param_count);
617 __ LeaveFrame(StackFrame::JS_TO_WASM);
626 __ DropArguments(param_count, rbx);
636 __ bind(&convert_param);
645 PrepareForJsToWasmConversionBuiltinCall(
646 masm, array_start, param_count, current_param_slot, valuetypes_array_ptr,
647 wasm_instance, function_data);
649 Label param_kWasmI32_not_smi;
650 Label param_kWasmI64;
651 Label param_kWasmF32;
652 Label param_kWasmF64;
653 Label throw_type_error;
656 __ j(
equal, ¶m_kWasmI32_not_smi);
666 __ j(
equal, &throw_type_error);
670 __ bind(¶m_kWasmI32_not_smi);
674 __ AssertZeroExtended(param);
675 RestoreAfterJsToWasmConversionBuiltinCall(
676 masm, function_data, wasm_instance, valuetypes_array_ptr,
677 current_param_slot, param_count, array_start);
679 __ addq(current_param_slot, Immediate(
sizeof(int32_t)));
680 __ jmp(¶m_conversion_done);
682 __ bind(¶m_kWasmI64);
684 RestoreAfterJsToWasmConversionBuiltinCall(
685 masm, function_data, wasm_instance, valuetypes_array_ptr,
686 current_param_slot, param_count, array_start);
688 __ addq(current_param_slot, Immediate(
sizeof(int64_t)));
689 __ jmp(¶m_conversion_done);
691 __ bind(¶m_kWasmF32);
694 RestoreAfterJsToWasmConversionBuiltinCall(
695 masm, function_data, wasm_instance, valuetypes_array_ptr,
696 current_param_slot, param_count, array_start);
698 __ addq(current_param_slot, Immediate(
sizeof(
float)));
699 __ jmp(¶m_conversion_done);
701 __ bind(¶m_kWasmF64);
704 RestoreAfterJsToWasmConversionBuiltinCall(
705 masm, function_data, wasm_instance, valuetypes_array_ptr,
706 current_param_slot, param_count, array_start);
708 __ addq(current_param_slot, Immediate(
sizeof(
double)));
709 __ jmp(¶m_conversion_done);
711 __ bind(&throw_type_error);
713 __ CallRuntime(Runtime::kWasmThrowJSTypeError);
719 __ bind(&convert_return_value);
725 __ movq(valuetypes_array_ptr,
MemOperand(rbp, kValueTypesArrayStartOffset));
727 __ movl(valuetype, Operand(valuetypes_array_ptr, 0));
729 Label return_kWasmI32;
730 Label return_kWasmI64;
731 Label return_kWasmF32;
732 Label return_kWasmF64;
733 Label return_kWasmRef;
747 __ testl(valuetype, Immediate(1));
753 Label return_value_done;
755 __ bind(&return_kWasmI32);
756 __ movl(return_value,
MemOperand(current_return_slot, 0));
757 __ addq(current_return_slot, Immediate(
sizeof(int32_t)));
761 __ SmiTag(return_value);
764 __ movq(temp, return_value);
766 __ addl(temp, return_value);
769 __ j(overflow, &to_heapnumber);
771 __ SmiTag(return_value);
773 __ jmp(&return_value_done);
777 __ bind(&to_heapnumber);
779 PrepareForWasmToJsConversionBuiltinCall(
780 masm, return_count, result_index, current_return_slot,
781 valuetypes_array_ptr, wasm_instance, fixed_array, jsarray);
784 RestoreAfterWasmToJsConversionBuiltinCall(
785 masm, jsarray, fixed_array, wasm_instance, valuetypes_array_ptr,
786 current_return_slot, result_index, return_count);
787 __ jmp(&return_value_done);
789 __ bind(&return_kWasmI64);
790 __ movq(return_value,
MemOperand(current_return_slot, 0));
791 __ addq(current_return_slot, Immediate(
sizeof(int64_t)));
792 PrepareForWasmToJsConversionBuiltinCall(
793 masm, return_count, result_index, current_return_slot,
794 valuetypes_array_ptr, wasm_instance, fixed_array, jsarray);
796 RestoreAfterWasmToJsConversionBuiltinCall(
797 masm, jsarray, fixed_array, wasm_instance, valuetypes_array_ptr,
798 current_return_slot, result_index, return_count);
799 __ jmp(&return_value_done);
801 __ bind(&return_kWasmF32);
803 __ addq(current_return_slot, Immediate(
sizeof(
float)));
805 __ Movss(xmm0, xmm1);
806 PrepareForWasmToJsConversionBuiltinCall(
807 masm, return_count, result_index, current_return_slot,
808 valuetypes_array_ptr, wasm_instance, fixed_array, jsarray);
811 RestoreAfterWasmToJsConversionBuiltinCall(
812 masm, jsarray, fixed_array, wasm_instance, valuetypes_array_ptr,
813 current_return_slot, result_index, return_count);
814 __ jmp(&return_value_done);
816 __ bind(&return_kWasmF64);
819 __ addq(current_return_slot, Immediate(
sizeof(
double)));
820 PrepareForWasmToJsConversionBuiltinCall(
821 masm, return_count, result_index, current_return_slot,
822 valuetypes_array_ptr, wasm_instance, fixed_array, jsarray);
825 RestoreAfterWasmToJsConversionBuiltinCall(
826 masm, jsarray, fixed_array, wasm_instance, valuetypes_array_ptr,
827 current_return_slot, result_index, return_count);
828 __ jmp(&return_value_done);
830 __ bind(&return_kWasmRef);
832 __ movq(rbx, current_return_slot);
833 __ andq(rbx, Immediate(0x04));
834 __ addq(current_return_slot, rbx);
835 __ movq(return_value,
MemOperand(current_return_slot, 0));
839 __ bind(&return_value_done);
840 __ addq(valuetypes_array_ptr, Immediate(kValueTypeSize));
841 __ movq(
MemOperand(rbp, kValueTypesArrayStartOffset), valuetypes_array_ptr);
842 __ cmpq(fixed_array, Immediate(0));
843 __ j(
equal, &next_return_value);
850 PrepareForWasmToJsConversionBuiltinCall(
851 masm, return_count, result_index, current_return_slot,
852 valuetypes_array_ptr, wasm_instance, fixed_array, jsarray);
859 RestoreAfterWasmToJsConversionBuiltinCall(
860 masm, jsarray, fixed_array, wasm_instance, valuetypes_array_ptr,
861 current_return_slot, result_index, return_count);
863 __ jmp(&next_return_value);
875void Builtins::Generate_WasmInterpreterCWasmEntry(MacroAssembler* masm) {
876 Label
invoke, handler_entry, exit;
914 constexpr int kCEntryFpParameterOffset = 0x30;
915 constexpr int kCallableOffset = 0x38;
919 __ EnterFrame(StackFrame::C_WASM_ENTRY);
922 __ subq(rsp, Immediate(0x10));
925#ifdef V8_TARGET_OS_WIN
927 __ subq(rsp, Immediate(0xa0));
928 __ movdqu(Operand(rsp, 0x00), xmm6);
929 __ movdqu(Operand(rsp, 0x10), xmm7);
930 __ movdqu(Operand(rsp, 0x20), xmm8);
931 __ movdqu(Operand(rsp, 0x30), xmm9);
932 __ movdqu(Operand(rsp, 0x40), xmm10);
933 __ movdqu(Operand(rsp, 0x50), xmm11);
934 __ movdqu(Operand(rsp, 0x60), xmm12);
935 __ movdqu(Operand(rsp, 0x70), xmm13);
936 __ movdqu(Operand(rsp, 0x80), xmm14);
937 __ movdqu(Operand(rsp, 0x90), xmm15);
943#ifdef V8_TARGET_OS_WIN
951#ifdef V8_COMPRESS_POINTERS_IN_SHARED_CAGE
953 IsolateData::cage_base_offset());
959 __ movq(
MemOperand(rbp, WasmInterpreterCWasmEntryConstants::kCEntryFPOffset),
961 __ movq(callable, r9);
964 __ movq(rbx,
MemOperand(rbp, kCEntryFpParameterOffset));
965 __ movq(
MemOperand(rbp, WasmInterpreterCWasmEntryConstants::kCEntryFPOffset),
975 __ bind(&handler_entry);
979 masm->isolate()->builtins()->SetCWasmInterpreterEntryHandlerOffset(
980 handler_entry.pos());
986 __ movq(
MemOperand(rbp, WasmInterpreterCWasmEntryConstants::kSPFPOffset),
988 __ PushStackHandler();
993 __ PopStackHandler();
998#ifdef V8_TARGET_OS_WIN
1006#ifdef V8_TARGET_OS_WIN
1008 __ movdqu(xmm15, Operand(rsp, 0x90));
1009 __ movdqu(xmm14, Operand(rsp, 0x80));
1010 __ movdqu(xmm13, Operand(rsp, 0x70));
1011 __ movdqu(xmm12, Operand(rsp, 0x60));
1012 __ movdqu(xmm11, Operand(rsp, 0x50));
1013 __ movdqu(xmm10, Operand(rsp, 0x40));
1014 __ movdqu(xmm9, Operand(rsp, 0x30));
1015 __ movdqu(xmm8, Operand(rsp, 0x20));
1016 __ movdqu(xmm7, Operand(rsp, 0x10));
1017 __ movdqu(xmm6, Operand(rsp, 0x00));
1021 __ LeaveFrame(StackFrame::C_WASM_ENTRY);
1025void Builtins::Generate_GenericWasmToJSInterpreterWrapper(
1026 MacroAssembler* masm) {
1033 __ EnterFrame(StackFrame::WASM_TO_JS);
1058 constexpr int kMarkerOffset =
1059 WasmToJSInterpreterFrameConstants::kGCScanSlotLimitOffset +
1061 static_assert(WasmToJSInterpreterFrameConstants::kGCSPOffset ==
1062 WasmToJSInterpreterFrameConstants::kGCScanSlotLimitOffset -
1064 constexpr int kPackedArrayOffset =
1072 constexpr int kResultIndexOffset = kParamIndexOffset;
1073 constexpr int kValueTypesArrayStartOffset =
1075 constexpr int kCurrentParamOffset =
1078 constexpr int kCurrentResultAddressOffset = kCurrentParamOffset;
1079 constexpr int kNumSpillSlots =
1083 __ movq(
MemOperand(rbp, kPackedArrayOffset), packed_args);
1084 __ Move(
MemOperand(rbp, WasmToJSInterpreterFrameConstants::kGCSPOffset), 0);
1089 WasmToJSInterpreterFrameConstants::kGCScanSlotLimitOffset),
1096 target_js_function = rcx;
1101 __ movq(callable, r8);
1103 Register shared_function_info = r15;
1105 shared_function_info,
1114 context,
FieldOperand(target_js_function, JSFunction::kContextOffset));
1115 target_js_function =
no_reg;
1121 Label receiver_undefined;
1122 Label calculate_js_function_arity;
1126 FieldOperand(shared_function_info, SharedFunctionInfo::kFlagsOffset));
1127 __ testq(flags, Immediate(SharedFunctionInfo::IsNativeBit::kMask |
1128 SharedFunctionInfo::IsStrictBit::kMask));
1132 __ jmp(&calculate_js_function_arity);
1134 __ bind(&receiver_undefined);
1135 __ LoadRoot(
receiver, RootIndex::kUndefinedValue);
1137 __ bind(&calculate_js_function_arity);
1141 Register valuetypes_array_ptr = signature;
1144 LoadFromSignature(masm, valuetypes_array_ptr, return_count, param_count);
1145 __ movq(
MemOperand(rbp, kParamCountOffset), param_count);
1146 shared_function_info =
no_reg;
1150 __ movq(expected_arity, param_count);
1153 __ movq(rax, expected_arity);
1157 Register param_index = param_count;
1158 __ Move(param_index, 0);
1164 __ movq(
MemOperand(rbp, kReturnCountOffset), return_count);
1165 __ movq(
MemOperand(rbp, kValueTypesArrayStartOffset), valuetypes_array_ptr);
1167 Label prepare_for_js_call;
1168 __ Cmp(expected_arity, 0);
1170 __ j(
equal, &prepare_for_js_call);
1173 Register current_param_slot_offset = r10;
1174 __ Move(current_param_slot_offset, Immediate(0));
1179 constexpr int kValueTypeSize =
sizeof(wasm::ValueType);
1180 static_assert(kValueTypeSize == 4);
1181 const int32_t kValueTypeSizeLog2 =
log2(kValueTypeSize);
1184 Register returns_size = return_count;
1186 __ shlq(returns_size, Immediate(kValueTypeSizeLog2));
1187 __ addq(valuetypes_array_ptr, returns_size);
1199 Label loop_copy_param_ref, load_ref_param, set_and_move;
1201 __ bind(&loop_copy_param_ref);
1202 __ movl(valuetype, Operand(valuetypes_array_ptr, 0));
1203 __ testl(valuetype, Immediate(1));
1210 Label inc_param_32bit;
1212 __ j(
equal, &inc_param_32bit);
1214 __ j(
equal, &inc_param_32bit);
1216 Label inc_param_64bit;
1218 __ j(
equal, &inc_param_64bit);
1220 __ j(
equal, &inc_param_64bit);
1225 __ bind(&inc_param_32bit);
1226 __ addq(current_param_slot_offset, Immediate(
sizeof(int32_t)));
1227 __ jmp(&set_and_move);
1229 __ bind(&inc_param_64bit);
1230 __ addq(current_param_slot_offset, Immediate(
sizeof(int64_t)));
1231 __ jmp(&set_and_move);
1233 __ bind(&load_ref_param);
1238 __ bind(&set_and_move);
1240 __ addq(valuetypes_array_ptr, Immediate(kValueTypeSize));
1241 __ incq(param_index);
1242 __ cmpq(param_index,
MemOperand(rbp, kParamCountOffset));
1243 __ j(
less, &loop_copy_param_ref);
1248 __ movq(returns_size,
MemOperand(rbp, kReturnCountOffset));
1249 __ shlq(returns_size, Immediate(kValueTypeSizeLog2));
1250 __ movq(valuetypes_array_ptr,
MemOperand(rbp, kValueTypesArrayStartOffset));
1251 __ addq(valuetypes_array_ptr, returns_size);
1253 __ movq(current_param_slot_offset, Immediate(0));
1254 __ movq(param_index, Immediate(0));
1259 Label loop_through_params;
1260 __ bind(&loop_through_params);
1262 __ movl(valuetype, Operand(valuetypes_array_ptr, 0));
1269 Label param_conversion_done, check_ref_param, skip_ref_param, convert_param;
1282 __ movq(temp, param);
1284 __ addl(temp, param);
1287 __ j(overflow, &convert_param);
1294 __ addq(current_param_slot_offset, Immediate(
sizeof(int32_t)));
1295 __ jmp(¶m_conversion_done);
1298 __ bind(&check_ref_param);
1299 __ testl(valuetype, Immediate(1));
1302 __ bind(&skip_ref_param);
1308 __ bind(¶m_conversion_done);
1309 __ addq(valuetypes_array_ptr, Immediate(kValueTypeSize));
1310 __ incq(param_index);
1311 __ decq(expected_arity);
1312 __ j(
equal, &prepare_for_js_call);
1313 __ cmpq(param_index,
MemOperand(rbp, kParamCountOffset));
1319 __ bind(&prepare_for_js_call);
1322 Register thread_in_wasm_flag_addr = rcx;
1324 thread_in_wasm_flag_addr,
1326 __ movl(
MemOperand(thread_in_wasm_flag_addr, 0), Immediate(0));
1327 thread_in_wasm_flag_addr =
no_reg;
1349 __ movq(
MemOperand(rbp, WasmToJSInterpreterFrameConstants::kGCSPOffset), rsp);
1356 __ movq(rsp,
MemOperand(rbp, WasmToJSInterpreterFrameConstants::kGCSPOffset));
1357 __ movq(
MemOperand(rbp, WasmToJSInterpreterFrameConstants::kGCSPOffset),
1365 rbp, WasmToJSInterpreterFrameConstants::kGCScanSlotLimitOffset));
1369 WasmToJSInterpreterFrameConstants::kGCScanSlotLimitOffset),
1377 __ movq(return_count,
MemOperand(rbp, kReturnCountOffset));
1378 __ movq(packed_args,
MemOperand(rbp, kPackedArrayOffset));
1380 __ movq(valuetypes_array_ptr,
1383 __ movq(result_index, Immediate(0));
1386 Label convert_return;
1389 Label loop_copy_return_refs;
1391 __ movq(fixed_array, Immediate(0));
1392 __ cmpl(return_count, Immediate(1));
1403 __ pushq(return_reg);
1410 WasmToJSInterpreterFrameConstants::kGCScanSlotLimitOffset),
1412 __ movq(fixed_array, rax);
1414 __ popq(return_reg);
1415 __ movq(return_count,
MemOperand(rbp, kReturnCountOffset));
1416 __ movq(packed_args,
MemOperand(rbp, kPackedArrayOffset));
1418 __ movq(valuetypes_array_ptr,
1420 __ movq(result_index, Immediate(0));
1422 __ LoadTaggedField(return_reg,
1426 __ jmp(&convert_return);
1429 __ bind(&return_done);
1433 __ popq(fixed_array);
1434 __ movq(valuetypes_array_ptr,
MemOperand(rbp, kValueTypesArrayStartOffset));
1436 __ addq(valuetypes_array_ptr, Immediate(kValueTypeSize));
1437 __ movq(result_index,
MemOperand(rbp, kResultIndexOffset));
1438 __ incq(result_index);
1439 __ cmpq(result_index,
MemOperand(rbp, kReturnCountOffset));
1442 __ LoadTaggedField(return_reg,
1446 __ jmp(&convert_return);
1455 __ bind(&loop_copy_return_refs);
1459 __ movq(return_count,
MemOperand(rbp, kReturnCountOffset));
1460 __ cmpl(return_count, Immediate(1));
1463 Label copy_return_if_ref, copy_return_ref, done_copy_return_ref;
1464 __ movq(packed_args,
MemOperand(rbp, kPackedArrayOffset));
1466 __ movq(valuetypes_array_ptr,
1468 __ movq(result_index, Immediate(0));
1471 __ bind(©_return_if_ref);
1472 __ movl(valuetype, Operand(valuetypes_array_ptr, 0));
1474 __ testl(valuetype, Immediate(1));
1477 Label inc_result_32bit;
1479 __ j(
equal, &inc_result_32bit);
1481 __ j(
equal, &inc_result_32bit);
1483 Label inc_result_64bit;
1485 __ j(
equal, &inc_result_64bit);
1487 __ j(
equal, &inc_result_64bit);
1492 __ bind(&inc_result_32bit);
1493 __ addq(packed_args, Immediate(
sizeof(int32_t)));
1494 __ jmp(&done_copy_return_ref);
1496 __ bind(&inc_result_64bit);
1497 __ addq(packed_args, Immediate(
sizeof(int64_t)));
1498 __ jmp(&done_copy_return_ref);
1500 __ bind(©_return_ref);
1501 __ LoadTaggedField(return_reg,
1509 __ bind(&done_copy_return_ref);
1510 __ addq(valuetypes_array_ptr, Immediate(kValueTypeSize));
1511 __ incq(result_index);
1512 __ cmpq(result_index,
MemOperand(rbp, kReturnCountOffset));
1513 __ j(
less, ©_return_if_ref);
1521 thread_in_wasm_flag_addr = rcx;
1523 thread_in_wasm_flag_addr,
1525 __ movl(
MemOperand(thread_in_wasm_flag_addr, 0), Immediate(1));
1526 thread_in_wasm_flag_addr =
no_reg;
1529 __ LeaveFrame(StackFrame::WASM_TO_JS);
1531 __ movq(rax, Immediate(WasmToJSInterpreterFrameConstants::kSuccess));
1541 __ bind(&convert_param);
1549 __ movq(
MemOperand(rbp, kExpectedArityOffset), expected_arity);
1550 __ movq(
MemOperand(rbp, kParamIndexOffset), param_index);
1551 __ movq(
MemOperand(rbp, kValueTypesArrayStartOffset), valuetypes_array_ptr);
1552 __ movq(
MemOperand(rbp, kCurrentParamOffset), current_param_slot_offset);
1558 Label param_kWasmI32_not_smi;
1559 Label param_kWasmI64;
1560 Label param_kWasmF32;
1561 Label param_kWasmF64;
1562 Label finish_param_conversion;
1565 __ j(
equal, ¶m_kWasmI32_not_smi);
1579 __ bind(¶m_kWasmI32_not_smi);
1583 __ movq(rbx, Immediate(
sizeof(int32_t)));
1584 __ jmp(&finish_param_conversion);
1586 __ bind(¶m_kWasmI64);
1590 __ movq(rbx, Immediate(
sizeof(int64_t)));
1591 __ jmp(&finish_param_conversion);
1593 __ bind(¶m_kWasmF32);
1598 __ movq(rbx, Immediate(
sizeof(
float)));
1599 __ jmp(&finish_param_conversion);
1601 __ bind(¶m_kWasmF64);
1605 __ movq(rbx, Immediate(
sizeof(
double)));
1608 __ bind(&finish_param_conversion);
1613 __ movq(current_param_slot_offset,
MemOperand(rbp, kCurrentParamOffset));
1614 __ addq(current_param_slot_offset, rbx);
1615 __ movq(valuetypes_array_ptr,
MemOperand(rbp, kValueTypesArrayStartOffset));
1616 __ movq(param_index,
MemOperand(rbp, kParamIndexOffset));
1617 __ movq(expected_arity,
MemOperand(rbp, kExpectedArityOffset));
1618 __ movq(packed_args,
MemOperand(rbp, kPackedArrayOffset));
1621 __ jmp(¶m_conversion_done);
1626 __ bind(&convert_return);
1629 __ movq(
MemOperand(rbp, kResultIndexOffset), result_index);
1630 __ movq(
MemOperand(rbp, kValueTypesArrayStartOffset), valuetypes_array_ptr);
1631 __ movq(
MemOperand(rbp, kCurrentResultAddressOffset), packed_args);
1634 WasmToJSInterpreterFrameConstants::kGCScanSlotLimitOffset),
1636 __ pushq(fixed_array);
1642 __ movl(valuetype, Operand(valuetypes_array_ptr, 0));
1644 Label return_kWasmI32;
1645 Label return_kWasmI32_not_smi;
1646 Label return_kWasmI64;
1647 Label return_kWasmF32;
1648 Label return_kWasmF64;
1649 Label return_kWasmRef;
1654 __ j(
equal, &return_kWasmI32);
1657 __ j(
equal, &return_kWasmI64);
1660 __ j(
equal, &return_kWasmF32);
1663 __ j(
equal, &return_kWasmF64);
1665 __ testl(valuetype, Immediate(1));
1671 __ bind(&return_kWasmI32);
1672 __ JumpIfNotSmi(return_reg, &return_kWasmI32_not_smi);
1676 __ movl(return_reg, return_reg);
1678 __ addq(packed_args, Immediate(
sizeof(int32_t)));
1679 __ jmp(&return_done);
1681 __ bind(&return_kWasmI32_not_smi);
1684 __ AssertZeroExtended(return_reg);
1685 __ movq(packed_args,
MemOperand(rbp, kCurrentResultAddressOffset));
1687 __ addq(packed_args, Immediate(
sizeof(int32_t)));
1688 __ jmp(&return_done);
1690 __ bind(&return_kWasmI64);
1692 __ movq(packed_args,
MemOperand(rbp, kCurrentResultAddressOffset));
1694 __ addq(packed_args, Immediate(
sizeof(int64_t)));
1695 __ jmp(&return_done);
1697 __ bind(&return_kWasmF32);
1700 __ movq(packed_args,
MemOperand(rbp, kCurrentResultAddressOffset));
1702 __ addq(packed_args, Immediate(
sizeof(
float)));
1703 __ jmp(&return_done);
1705 __ bind(&return_kWasmF64);
1708 __ movq(packed_args,
MemOperand(rbp, kCurrentResultAddressOffset));
1710 __ addq(packed_args, Immediate(
sizeof(
double)));
1711 __ jmp(&return_done);
1713 __ bind(&return_kWasmRef);
1716 __ jmp(&return_done);
1719#ifndef V8_DRUMBRAKE_BOUNDS_CHECKS
1733enum IntValueType { kValueInt32, kValueInt64 };
1737void EmitLoadInstruction(MacroAssembler* masm, Register
result,
1738 Register memory_start, Register memory_index,
1739 IntValueType value_type, IntMemoryType memory_type) {
1740 switch (memory_type) {
1742 switch (value_type) {
1751 switch (value_type) {
1761 switch (value_type) {
1770 switch (value_type) {
1780 switch (value_type) {
1790 switch (value_type) {
1800 switch (value_type) {
1814void EmitLoadInstruction(MacroAssembler* masm, Register memory_start,
1815 Register memory_offset, XMMRegister
result,
1819 __ movss(xmm0, Operand(memory_start, memory_offset,
times_1, 0));
1830void EmitLoadInstruction(MacroAssembler* masm, Register memory_start,
1831 Register memory_offset, Register sp,
1832 Register slot_offset, FloatType
float_type) {
1835 __ movss(xmm0, Operand(memory_start, memory_offset,
times_1, 0));
1836 __ movss(Operand(sp, slot_offset,
times_4, 0), xmm0);
1839 __ movsd(xmm0, Operand(memory_start, memory_offset,
times_1, 0));
1840 __ movsd(Operand(sp, slot_offset,
times_4, 0), xmm0);
1847void WriteToSlot(MacroAssembler* masm, Register sp, Register slot_offset,
1848 Register value, IntValueType value_type) {
1849 switch (value_type) {
1851 __ movq(Operand(sp, slot_offset,
times_4, 0), value);
1854 __ movl(Operand(sp, slot_offset,
times_4, 0), value);
1859void EmitStoreInstruction(MacroAssembler* masm, Register value,
1860 Register memory_start, Register memory_index,
1861 IntMemoryType memory_type) {
1862 switch (memory_type) {
1864 __ movq(Operand(memory_start, memory_index,
times_1, 0), value);
1867 __ movl(Operand(memory_start, memory_index,
times_1, 0), value);
1870 __ movw(Operand(memory_start, memory_index,
times_1, 0), value);
1873 __ movb(Operand(memory_start, memory_index,
times_1, 0), value);
1880void EmitStoreInstruction(MacroAssembler* masm, XMMRegister value,
1881 Register memory_start, Register memory_index,
1885 __ movss(Operand(memory_start, memory_index,
times_1, 0), value);
1888 __ movsd(Operand(memory_start, memory_index,
times_1, 0), value);
1895void EmitLoadNextInstructionId(MacroAssembler* masm, Register next_handler_id,
1896 Register code, uint32_t code_offset) {
1899 __ movzxwq(next_handler_id,
MemOperand(code, code_offset));
1908template <
bool Compressed>
1909class WasmInterpreterHandlerCodeEmitter {
1911 static void EmitLoadSlotOffset(MacroAssembler* masm, Register slot_offset,
1912 const MemOperand& operand);
1913 static void EmitLoadMemoryOffset(MacroAssembler* masm, Register memory_offset,
1914 const MemOperand& operand);
1918void WasmInterpreterHandlerCodeEmitter<true>::EmitLoadSlotOffset(
1919 MacroAssembler* masm, Register slot_offset,
const MemOperand& operand) {
1920 __ movzxwq(slot_offset, operand);
1923void WasmInterpreterHandlerCodeEmitter<true>::EmitLoadMemoryOffset(
1924 MacroAssembler* masm, Register memory_offset,
const MemOperand& operand) {
1925 __ movl(memory_offset, operand);
1929void WasmInterpreterHandlerCodeEmitter<false>::EmitLoadSlotOffset(
1930 MacroAssembler* masm, Register slot_offset,
const MemOperand& operand) {
1931 __ movl(slot_offset, operand);
1934void WasmInterpreterHandlerCodeEmitter<false>::EmitLoadMemoryOffset(
1935 MacroAssembler* masm, Register memory_offset,
const MemOperand& operand) {
1936 __ movq(memory_offset, operand);
1939template <
bool Compressed>
1940class WasmInterpreterHandlerBuiltins {
1941 using slot_offset_t = wasm::handler_traits<Compressed>::slot_offset_t;
1942 using memory_offset32_t = wasm::handler_traits<Compressed>::memory_offset32_t;
1943 using handler_id_t = wasm::handler_traits<Compressed>::handler_id_t;
1944 using emitter = WasmInterpreterHandlerCodeEmitter<Compressed>;
1947 static void Generate_r2r_ILoadMem(MacroAssembler* masm,
1948 IntValueType value_type,
1949 IntMemoryType memory_type) {
1950 constexpr uint32_t kMemoryOffset = 0;
1951 constexpr uint32_t kNextHandlerId =
1952 kMemoryOffset +
sizeof(memory_offset32_t);
1953 constexpr uint32_t kInstructionCodeLength =
1954 kNextHandlerId +
sizeof(handler_id_t);
1960 __ movl(memory_index, memory_index);
1962 Register memory_start_plus_index = memory_index;
1963 __ addq(memory_start_plus_index,
1965 wasm::WasmInterpreterRuntime::memory_start_offset()));
1968 emitter::EmitLoadMemoryOffset(masm, memory_offset,
1972 EmitLoadInstruction(masm,
result, memory_start_plus_index, memory_offset,
1973 value_type, memory_type);
1976 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
1977 __ addq(code, Immediate(kInstructionCodeLength));
1983 wasm::WasmInterpreterRuntime::instruction_table_offset()));
1986 __ movq(next_handler_addr,
1987 MemOperand(instr_table, next_handler_id, times_8, 0));
1988 __ jmp(next_handler_addr);
1991 static void Generate_r2r_FLoadMem(MacroAssembler* masm,
1992 FloatType float_type) {
1993 constexpr uint32_t kMemoryOffset = 0;
1994 constexpr uint32_t kNextHandlerId =
1995 kMemoryOffset +
sizeof(memory_offset32_t);
1996 constexpr uint32_t kInstructionCodeLength =
1997 kNextHandlerId +
sizeof(handler_id_t);
2003 __ movl(memory_index, memory_index);
2005 Register memory_start_plus_index = memory_index;
2006 __ addq(memory_start_plus_index,
2008 wasm::WasmInterpreterRuntime::memory_start_offset()));
2011 emitter::EmitLoadMemoryOffset(masm, memory_offset,
2014 EmitLoadInstruction(masm, memory_start_plus_index, memory_offset, xmm4,
2018 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2019 __ addq(code, Immediate(kInstructionCodeLength));
2025 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2028 __ movq(next_handler_addr,
2029 MemOperand(instr_table, next_handler_id, times_8, 0));
2030 __ jmp(next_handler_addr);
2033 static void Generate_r2s_ILoadMem(MacroAssembler* masm,
2034 IntValueType value_type,
2035 IntMemoryType memory_type) {
2036 constexpr uint32_t kMemoryOffset = 0;
2037 constexpr uint32_t kSlotOffset = kMemoryOffset +
sizeof(memory_offset32_t);
2038 constexpr uint32_t kNextHandlerId = kSlotOffset +
sizeof(slot_offset_t);
2039 constexpr uint32_t kInstructionCodeLength =
2040 kNextHandlerId +
sizeof(handler_id_t);
2047 __ movl(memory_index, memory_index);
2049 Register memory_start_plus_index = memory_index;
2050 __ addq(memory_start_plus_index,
2052 wasm::WasmInterpreterRuntime::memory_start_offset()));
2055 emitter::EmitLoadMemoryOffset(masm, memory_offset,
2059 EmitLoadInstruction(masm, value, memory_start_plus_index, memory_offset,
2060 value_type, memory_type);
2063 emitter::EmitLoadSlotOffset(masm, slot_offset,
2066 WriteToSlot(masm, sp, slot_offset, value, value_type);
2069 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2070 __ addq(code, Immediate(kInstructionCodeLength));
2076 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2079 __ movq(next_handler_addr,
2080 MemOperand(instr_table, next_handler_id, times_8, 0));
2081 __ jmp(next_handler_addr);
2084 static void Generate_r2s_FLoadMem(MacroAssembler* masm,
2085 FloatType float_type) {
2086 constexpr uint32_t kMemoryOffset = 0;
2087 constexpr uint32_t kSlotOffset = kMemoryOffset +
sizeof(memory_offset32_t);
2088 constexpr uint32_t kNextHandlerId = kSlotOffset +
sizeof(slot_offset_t);
2089 constexpr uint32_t kInstructionCodeLength =
2090 kNextHandlerId +
sizeof(handler_id_t);
2097 __ movl(memory_index, memory_index);
2099 Register memory_start_plus_index = memory_index;
2100 __ addq(memory_start_plus_index,
2102 wasm::WasmInterpreterRuntime::memory_start_offset()));
2105 emitter::EmitLoadMemoryOffset(masm, memory_offset,
2109 emitter::EmitLoadSlotOffset(masm, slot_offset,
2112 EmitLoadInstruction(masm, memory_start_plus_index, memory_offset, sp,
2113 slot_offset, float_type);
2116 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2117 __ addq(code, Immediate(kInstructionCodeLength));
2123 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2126 __ movq(next_handler_addr,
2127 MemOperand(instr_table, next_handler_id, times_8, 0));
2128 __ jmp(next_handler_addr);
2131 static void Generate_s2r_ILoadMem(MacroAssembler* masm,
2132 IntValueType value_type,
2133 IntMemoryType memory_type) {
2134 constexpr uint32_t kMemoryOffset = 0;
2135 constexpr uint32_t kMemoryIndexSlot =
2136 kMemoryOffset +
sizeof(memory_offset32_t);
2137 constexpr uint32_t kNextHandlerId =
2138 kMemoryIndexSlot +
sizeof(slot_offset_t);
2139 constexpr uint32_t kInstructionCodeLength =
2140 kNextHandlerId +
sizeof(handler_id_t);
2147 emitter::EmitLoadMemoryOffset(masm, memory_offset,
2150 Register memory_index_slot_offset = rax;
2151 emitter::EmitLoadSlotOffset(masm, memory_index_slot_offset,
2154 Register memory_start_plus_offset = memory_offset;
2155 __ addq(memory_start_plus_offset,
2157 wasm::WasmInterpreterRuntime::memory_start_offset()));
2159 Register memory_index = memory_index_slot_offset;
2160 __ movl(memory_index, Operand(sp, memory_index_slot_offset, times_4, 0));
2163 EmitLoadInstruction(masm, value, memory_start_plus_offset, memory_index,
2164 value_type, memory_type);
2167 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2168 __ addq(code, Immediate(kInstructionCodeLength));
2174 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2177 __ movq(next_handler_addr,
2178 MemOperand(instr_table, next_handler_id, times_8, 0));
2179 __ jmp(next_handler_addr);
2182 static void Generate_s2r_FLoadMem(MacroAssembler* masm,
2183 FloatType float_type) {
2184 constexpr uint32_t kMemoryOffset = 0;
2185 constexpr uint32_t kMemoryIndexSlot =
2186 kMemoryOffset +
sizeof(memory_offset32_t);
2187 constexpr uint32_t kNextHandlerId =
2188 kMemoryIndexSlot +
sizeof(slot_offset_t);
2189 constexpr uint32_t kInstructionCodeLength =
2190 kNextHandlerId +
sizeof(handler_id_t);
2197 emitter::EmitLoadMemoryOffset(masm, memory_offset,
2200 Register memory_index_slot_offset = rax;
2201 emitter::EmitLoadSlotOffset(masm, memory_index_slot_offset,
2204 Register memory_start_plus_offset = memory_offset;
2205 __ addq(memory_start_plus_offset,
2207 wasm::WasmInterpreterRuntime::memory_start_offset()));
2209 Register memory_index = memory_index_slot_offset;
2210 __ movl(memory_index, Operand(sp, memory_index_slot_offset, times_4, 0));
2212 EmitLoadInstruction(masm, memory_start_plus_offset, memory_index, xmm4,
2216 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2217 __ addq(code, Immediate(kInstructionCodeLength));
2223 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2226 __ movq(next_handler_addr,
2227 MemOperand(instr_table, next_handler_id, times_8, 0));
2228 __ jmp(next_handler_addr);
2231 static void Generate_s2s_ILoadMem(MacroAssembler* masm,
2232 IntValueType value_type,
2233 IntMemoryType memory_type) {
2234 constexpr uint32_t kMemoryOffset = 0;
2235 constexpr uint32_t kIndexSlot = kMemoryOffset +
sizeof(memory_offset32_t);
2236 constexpr uint32_t kResultSlot = kIndexSlot +
sizeof(slot_offset_t);
2237 constexpr uint32_t kNextHandlerId = kResultSlot +
sizeof(slot_offset_t);
2238 constexpr uint32_t kInstructionCodeLength =
2239 kNextHandlerId +
sizeof(handler_id_t);
2246 emitter::EmitLoadMemoryOffset(masm, memory_offset,
2249 Register memory_index_slot_offset = rax;
2250 emitter::EmitLoadSlotOffset(masm, memory_index_slot_offset,
2253 Register memory_start_plus_offset = memory_offset;
2254 __ addq(memory_start_plus_offset,
2256 wasm::WasmInterpreterRuntime::memory_start_offset()));
2259 __ movl(memory_index, Operand(sp, memory_index_slot_offset, times_4, 0));
2262 emitter::EmitLoadSlotOffset(masm, result_slot_offset,
2266 EmitLoadInstruction(masm, value, memory_start_plus_offset, memory_index,
2267 value_type, memory_type);
2269 WriteToSlot(masm, sp, result_slot_offset, value, value_type);
2272 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2273 __ addq(code, Immediate(kInstructionCodeLength));
2279 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2282 __ movq(next_handler_addr,
2283 MemOperand(instr_table, next_handler_id, times_8, 0));
2284 __ jmp(next_handler_addr);
2287 static void Generate_s2s_FLoadMem(MacroAssembler* masm,
2288 FloatType float_type) {
2289 constexpr uint32_t kMemoryOffset = 0;
2290 constexpr uint32_t kIndexSlot = kMemoryOffset +
sizeof(memory_offset32_t);
2291 constexpr uint32_t kResultSlot = kIndexSlot +
sizeof(slot_offset_t);
2292 constexpr uint32_t kNextHandlerId = kResultSlot +
sizeof(slot_offset_t);
2293 constexpr uint32_t kInstructionCodeLength =
2294 kNextHandlerId +
sizeof(handler_id_t);
2301 emitter::EmitLoadMemoryOffset(masm, memory_offset,
2304 Register memory_index_slot_offset = rax;
2305 emitter::EmitLoadSlotOffset(masm, memory_index_slot_offset,
2308 Register memory_start_plus_offset = memory_offset;
2309 __ addq(memory_start_plus_offset,
2311 wasm::WasmInterpreterRuntime::memory_start_offset()));
2314 __ movl(memory_index, Operand(sp, memory_index_slot_offset, times_4, 0));
2317 emitter::EmitLoadSlotOffset(masm, result_slot_offset,
2320 EmitLoadInstruction(masm, memory_start_plus_offset, memory_index, sp,
2321 result_slot_offset, float_type);
2324 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2325 __ addq(code, Immediate(kInstructionCodeLength));
2331 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2334 __ movq(next_handler_addr,
2335 MemOperand(instr_table, next_handler_id, times_8, 0));
2336 __ jmp(next_handler_addr);
2339 static void Generate_s2s_ILoadMem_LocalSet(MacroAssembler* masm,
2340 IntValueType value_type,
2341 IntMemoryType memory_type) {
2342 constexpr uint32_t kMemoryOffset = 0;
2343 constexpr uint32_t kIndexSlot = kMemoryOffset +
sizeof(memory_offset32_t);
2344 constexpr uint32_t kSetSlot = kIndexSlot +
sizeof(slot_offset_t);
2345 constexpr uint32_t kNextHandlerId = kSetSlot +
sizeof(slot_offset_t);
2346 constexpr uint32_t kInstructionCodeLength =
2347 kNextHandlerId +
sizeof(handler_id_t);
2354 emitter::EmitLoadMemoryOffset(masm, memory_offset,
2357 Register memory_index_slot_offset = rax;
2358 emitter::EmitLoadSlotOffset(masm, memory_index_slot_offset,
2361 Register memory_start_plus_offset = memory_offset;
2362 __ addq(memory_start_plus_offset,
2364 wasm::WasmInterpreterRuntime::memory_start_offset()));
2366 Register memory_index = memory_index_slot_offset;
2367 __ movl(memory_index, Operand(sp, memory_index_slot_offset, times_4, 0));
2370 emitter::EmitLoadSlotOffset(masm, set_slot_offset,
2374 EmitLoadInstruction(masm, value, memory_start_plus_offset, memory_index,
2375 value_type, memory_type);
2377 WriteToSlot(masm, sp, set_slot_offset, value, value_type);
2380 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2381 __ addq(code, Immediate(kInstructionCodeLength));
2387 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2390 __ movq(next_handler_addr,
2391 MemOperand(instr_table, next_handler_id, times_8, 0));
2392 __ jmp(next_handler_addr);
2395 static void Generate_s2s_FLoadMem_LocalSet(MacroAssembler* masm,
2396 FloatType float_type) {
2397 constexpr uint32_t kMemoryOffset = 0;
2398 constexpr uint32_t kIndexSlot = kMemoryOffset +
sizeof(memory_offset32_t);
2399 constexpr uint32_t kSetSlot = kIndexSlot +
sizeof(slot_offset_t);
2400 constexpr uint32_t kNextHandlerId = kSetSlot +
sizeof(slot_offset_t);
2401 constexpr uint32_t kInstructionCodeLength =
2402 kNextHandlerId +
sizeof(handler_id_t);
2409 emitter::EmitLoadMemoryOffset(masm, memory_offset,
2412 Register memory_index_slot_offset = rax;
2413 emitter::EmitLoadSlotOffset(masm, memory_index_slot_offset,
2416 Register memory_start_plus_offset = memory_offset;
2417 __ addq(memory_start_plus_offset,
2419 wasm::WasmInterpreterRuntime::memory_start_offset()));
2421 Register memory_index = memory_index_slot_offset;
2422 __ movl(memory_index, Operand(sp, memory_index_slot_offset, times_4, 0));
2425 emitter::EmitLoadSlotOffset(masm, set_slot_offset,
2428 EmitLoadInstruction(masm, memory_start_plus_offset, memory_index, sp,
2429 set_slot_offset, float_type);
2432 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2433 __ addq(code, Immediate(kInstructionCodeLength));
2439 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2442 __ movq(next_handler_addr,
2443 MemOperand(instr_table, next_handler_id, times_8, 0));
2444 __ jmp(next_handler_addr);
2447 static void Generate_r2s_IStoreMem(MacroAssembler* masm,
2449 IntMemoryType memory_type) {
2450 constexpr uint32_t kMemoryOffset = 0;
2451 constexpr uint32_t kMemoryIndexSlot =
2452 kMemoryOffset +
sizeof(memory_offset32_t);
2453 constexpr uint32_t kNextHandlerId =
2454 kMemoryIndexSlot +
sizeof(slot_offset_t);
2455 constexpr uint32_t kInstructionCodeLength =
2456 kNextHandlerId +
sizeof(handler_id_t);
2464 emitter::EmitLoadMemoryOffset(masm, memory_offset,
2468 emitter::EmitLoadSlotOffset(masm, memory_index_slot_offset,
2471 Register memory_start_plus_offset = memory_offset;
2472 __ addq(memory_start_plus_offset,
2474 wasm::WasmInterpreterRuntime::memory_start_offset()));
2476 Register memory_index = memory_index_slot_offset;
2477 __ movl(memory_index, Operand(sp, memory_index_slot_offset, times_4, 0));
2479 EmitStoreInstruction(masm, value, memory_start_plus_offset, memory_index,
2483 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2484 __ addq(code, Immediate(kInstructionCodeLength));
2490 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2493 __ movq(next_handler_addr,
2494 MemOperand(instr_table, next_handler_id, times_8, 0));
2495 __ jmp(next_handler_addr);
2498 static void Generate_r2s_FStoreMem(MacroAssembler* masm,
2499 FloatType float_type) {
2500 constexpr uint32_t kMemoryOffset = 0;
2501 constexpr uint32_t kMemoryIndexSlot =
2502 kMemoryOffset +
sizeof(memory_offset32_t);
2503 constexpr uint32_t kNextHandlerId =
2504 kMemoryIndexSlot +
sizeof(slot_offset_t);
2505 constexpr uint32_t kInstructionCodeLength =
2506 kNextHandlerId +
sizeof(handler_id_t);
2512 XMMRegister value = xmm4;
2513 if (float_type == kFloat32) {
2514 __ cvtsd2ss(value, xmm4);
2518 emitter::EmitLoadMemoryOffset(masm, memory_offset,
2522 emitter::EmitLoadSlotOffset(masm, memory_index_slot_offset,
2525 Register memory_start_plus_offset = memory_offset;
2526 __ addq(memory_start_plus_offset,
2528 wasm::WasmInterpreterRuntime::memory_start_offset()));
2530 Register memory_index = memory_index_slot_offset;
2531 __ movl(memory_index, Operand(sp, memory_index_slot_offset, times_4, 0));
2533 EmitStoreInstruction(masm, value, memory_start_plus_offset, memory_index,
2537 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2538 __ addq(code, Immediate(kInstructionCodeLength));
2544 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2547 __ movq(next_handler_addr,
2548 MemOperand(instr_table, next_handler_id, times_8, 0));
2549 __ jmp(next_handler_addr);
2552 static void Generate_s2s_IStoreMem(MacroAssembler* masm,
2554 IntMemoryType memory_type) {
2555 constexpr uint32_t kValueSlot = 0;
2556 constexpr uint32_t kMemoryOffset = kValueSlot +
sizeof(slot_offset_t);
2557 constexpr uint32_t kMemoryIndexSlot =
2558 kMemoryOffset +
sizeof(memory_offset32_t);
2559 constexpr uint32_t kNextHandlerId =
2560 kMemoryIndexSlot +
sizeof(slot_offset_t);
2561 constexpr uint32_t kInstructionCodeLength =
2562 kNextHandlerId +
sizeof(handler_id_t);
2569 emitter::EmitLoadSlotOffset(masm, value_slot_offset,
2572 Register value = value_slot_offset;
2573 switch (memory_type) {
2575 __ movq(value,
MemOperand(sp, value_slot_offset, times_4, 0));
2578 __ movl(value,
MemOperand(sp, value_slot_offset, times_4, 0));
2581 __ movw(value,
MemOperand(sp, value_slot_offset, times_4, 0));
2584 __ movb(value,
MemOperand(sp, value_slot_offset, times_4, 0));
2591 emitter::EmitLoadMemoryOffset(masm, memory_offset,
2595 emitter::EmitLoadSlotOffset(masm, memory_index_slot_offset,
2598 Register memory_start_plus_offset = memory_offset;
2599 __ addq(memory_start_plus_offset,
2601 wasm::WasmInterpreterRuntime::memory_start_offset()));
2603 Register memory_index = memory_index_slot_offset;
2604 __ movl(memory_index, Operand(sp, memory_index_slot_offset, times_4, 0));
2606 EmitStoreInstruction(masm, value, memory_start_plus_offset, memory_index,
2610 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2611 __ addq(code, Immediate(kInstructionCodeLength));
2617 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2620 __ movq(next_handler_addr,
2621 MemOperand(instr_table, next_handler_id, times_8, 0));
2622 __ jmp(next_handler_addr);
2625 static void Generate_s2s_FStoreMem(MacroAssembler* masm,
2626 FloatType float_type) {
2627 constexpr uint32_t kValueSlot = 0;
2628 constexpr uint32_t kMemoryOffset = kValueSlot +
sizeof(slot_offset_t);
2629 constexpr uint32_t kMemoryIndexSlot =
2630 kMemoryOffset +
sizeof(memory_offset32_t);
2631 constexpr uint32_t kNextHandlerId =
2632 kMemoryIndexSlot +
sizeof(slot_offset_t);
2633 constexpr uint32_t kInstructionCodeLength =
2634 kNextHandlerId +
sizeof(handler_id_t);
2641 emitter::EmitLoadSlotOffset(masm, value_slot_offset,
2644 XMMRegister value = xmm0;
2645 switch (float_type) {
2647 __ movss(value,
MemOperand(sp, value_slot_offset, times_4, 0));
2650 __ movsd(value,
MemOperand(sp, value_slot_offset, times_4, 0));
2657 emitter::EmitLoadMemoryOffset(masm, memory_offset,
2661 emitter::EmitLoadSlotOffset(masm, memory_index_slot_offset,
2664 Register memory_start_plus_offset = memory_offset;
2665 __ addq(memory_start_plus_offset,
2667 wasm::WasmInterpreterRuntime::memory_start_offset()));
2669 Register memory_index = memory_index_slot_offset;
2670 __ movl(memory_index, Operand(sp, memory_index_slot_offset, times_4, 0));
2672 EmitStoreInstruction(masm, value, memory_start_plus_offset, memory_index,
2676 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2677 __ addq(code, Immediate(kInstructionCodeLength));
2683 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2686 __ movq(next_handler_addr,
2687 MemOperand(instr_table, next_handler_id, times_8, 0));
2688 __ jmp(next_handler_addr);
2691 static void Generate_r2s_ILoadStoreMem(MacroAssembler* masm,
2692 IntValueType value_type,
2693 IntMemoryType memory_type) {
2694 constexpr uint32_t kLoadOffset = 0;
2695 constexpr uint32_t kStoreOffset = kLoadOffset +
sizeof(memory_offset32_t);
2696 constexpr uint32_t kStoreIndexSlot =
2697 kStoreOffset +
sizeof(memory_offset32_t);
2698 constexpr uint32_t kNextHandlerId = kStoreIndexSlot +
sizeof(slot_offset_t);
2699 constexpr uint32_t kInstructionCodeLength =
2700 kNextHandlerId +
sizeof(handler_id_t);
2707 __ movl(load_index, load_index);
2709 Register memory_start_plus_load_index = load_index;
2710 __ addq(memory_start_plus_load_index,
2712 wasm::WasmInterpreterRuntime::memory_start_offset()));
2715 emitter::EmitLoadMemoryOffset(masm, load_offset,
2719 EmitLoadInstruction(masm, value, memory_start_plus_load_index, load_offset,
2720 value_type, memory_type);
2722 Register store_index_slot_offset = r9;
2723 emitter::EmitLoadSlotOffset(masm, store_index_slot_offset,
2726 Register store_index = store_index_slot_offset;
2727 __ movl(store_index,
MemOperand(sp, store_index_slot_offset, times_4, 0));
2730 emitter::EmitLoadMemoryOffset(masm, store_offset,
2733 Register memory_start_plus_store_index = store_index;
2734 __ addq(memory_start_plus_store_index,
2736 wasm::WasmInterpreterRuntime::memory_start_offset()));
2738 EmitStoreInstruction(masm, value, memory_start_plus_store_index,
2739 store_offset, memory_type);
2742 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2743 __ addq(code, Immediate(kInstructionCodeLength));
2749 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2752 __ movq(next_handler_addr,
2753 MemOperand(instr_table, next_handler_id, times_8, 0));
2754 __ jmp(next_handler_addr);
2757 static void Generate_s2s_ILoadStoreMem(MacroAssembler* masm,
2758 IntValueType value_type,
2759 IntMemoryType memory_type) {
2760 constexpr uint32_t kLoadOffset = 0;
2761 constexpr uint32_t kLoadIndexSlot = kLoadOffset +
sizeof(memory_offset32_t);
2762 constexpr uint32_t kStoreOffset = kLoadIndexSlot +
sizeof(slot_offset_t);
2763 constexpr uint32_t kStoreIndexSlot =
2764 kStoreOffset +
sizeof(memory_offset32_t);
2765 constexpr uint32_t kNextHandlerId = kStoreIndexSlot +
sizeof(slot_offset_t);
2766 constexpr uint32_t kInstructionCodeLength =
2767 kNextHandlerId +
sizeof(handler_id_t);
2773 Register load_index_slot_offset = r9;
2774 emitter::EmitLoadSlotOffset(masm, load_index_slot_offset,
2777 Register load_index = load_index_slot_offset;
2778 __ movl(load_index, Operand(sp, load_index_slot_offset, times_4, 0));
2780 Register memory_start_plus_load_index = load_index;
2781 __ addq(memory_start_plus_load_index,
2783 wasm::WasmInterpreterRuntime::memory_start_offset()));
2786 emitter::EmitLoadMemoryOffset(masm, load_offset,
2790 EmitLoadInstruction(masm, value, memory_start_plus_load_index, load_offset,
2791 value_type, memory_type);
2793 Register store_index_slot_offset = r9;
2794 emitter::EmitLoadSlotOffset(masm, store_index_slot_offset,
2797 Register store_index = store_index_slot_offset;
2798 __ movl(store_index,
MemOperand(sp, store_index_slot_offset, times_4, 0));
2801 emitter::EmitLoadMemoryOffset(masm, store_offset,
2804 Register memory_start_plus_store_index = store_index;
2805 __ addq(memory_start_plus_store_index,
2807 wasm::WasmInterpreterRuntime::memory_start_offset()));
2809 EmitStoreInstruction(masm, value, memory_start_plus_store_index,
2810 store_offset, memory_type);
2813 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2814 __ addq(code, Immediate(kInstructionCodeLength));
2820 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2823 __ movq(next_handler_addr,
2824 MemOperand(instr_table, next_handler_id, times_8, 0));
2825 __ jmp(next_handler_addr);
2828 static void Generate_r2s_FLoadStoreMem(MacroAssembler* masm,
2829 FloatType float_type) {
2830 constexpr uint32_t kLoadOffset = 0;
2831 constexpr uint32_t kStoreOffset = kLoadOffset +
sizeof(memory_offset32_t);
2832 constexpr uint32_t kStoreIndexSlot =
2833 kStoreOffset +
sizeof(memory_offset32_t);
2834 constexpr uint32_t kNextHandlerId = kStoreIndexSlot +
sizeof(slot_offset_t);
2835 constexpr uint32_t kInstructionCodeLength =
2836 kNextHandlerId +
sizeof(handler_id_t);
2843 __ movl(load_index, load_index);
2845 Register memory_start_plus_load_index = load_index;
2846 __ addq(memory_start_plus_load_index,
2848 wasm::WasmInterpreterRuntime::memory_start_offset()));
2851 emitter::EmitLoadMemoryOffset(masm, load_offset,
2854 XMMRegister value = xmm0;
2855 switch (float_type) {
2857 __ movss(value, Operand(memory_start_plus_load_index, load_offset,
2861 __ movsd(value, Operand(memory_start_plus_load_index, load_offset,
2868 Register store_index_slot_offset = r9;
2869 emitter::EmitLoadSlotOffset(masm, store_index_slot_offset,
2872 Register store_index = store_index_slot_offset;
2873 __ movl(store_index,
MemOperand(sp, store_index_slot_offset, times_4, 0));
2876 emitter::EmitLoadMemoryOffset(masm, store_offset,
2879 Register memory_start_plus_store_index = store_index;
2880 __ addq(memory_start_plus_store_index,
2882 wasm::WasmInterpreterRuntime::memory_start_offset()));
2884 EmitStoreInstruction(masm, value, memory_start_plus_store_index,
2885 store_offset, float_type);
2888 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2889 __ addq(code, Immediate(kInstructionCodeLength));
2895 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2898 __ movq(next_handler_addr,
2899 MemOperand(instr_table, next_handler_id, times_8, 0));
2900 __ jmp(next_handler_addr);
2903 static void Generate_s2s_FLoadStoreMem(MacroAssembler* masm,
2904 FloatType float_type) {
2905 constexpr uint32_t kLoadOffset = 0;
2906 constexpr uint32_t kLoadIndexSlot = kLoadOffset +
sizeof(memory_offset32_t);
2907 constexpr uint32_t kStoreOffset = kLoadIndexSlot +
sizeof(slot_offset_t);
2908 constexpr uint32_t kStoreIndexSlot =
2909 kStoreOffset +
sizeof(memory_offset32_t);
2910 constexpr uint32_t kNextHandlerId = kStoreIndexSlot +
sizeof(slot_offset_t);
2911 constexpr uint32_t kInstructionCodeLength =
2912 kNextHandlerId +
sizeof(handler_id_t);
2918 Register load_index_slot_offset = r9;
2919 emitter::EmitLoadSlotOffset(masm, load_index_slot_offset,
2922 Register load_index = load_index_slot_offset;
2923 __ movl(load_index, Operand(sp, load_index_slot_offset, times_4, 0));
2925 Register memory_start_plus_load_index = load_index;
2926 __ addq(memory_start_plus_load_index,
2928 wasm::WasmInterpreterRuntime::memory_start_offset()));
2930 emitter::EmitLoadMemoryOffset(masm, load_offset,
2933 XMMRegister value = xmm0;
2934 switch (float_type) {
2936 __ movss(value, Operand(memory_start_plus_load_index, load_offset,
2940 __ movsd(value, Operand(memory_start_plus_load_index, load_offset,
2947 Register store_index_slot_offset = r9;
2948 emitter::EmitLoadSlotOffset(masm, store_index_slot_offset,
2951 Register store_index = store_index_slot_offset;
2952 __ movl(store_index,
MemOperand(sp, store_index_slot_offset, times_4, 0));
2955 emitter::EmitLoadMemoryOffset(masm, store_offset,
2958 Register memory_start_plus_store_index = store_index;
2959 __ addq(memory_start_plus_store_index,
2961 wasm::WasmInterpreterRuntime::memory_start_offset()));
2963 EmitStoreInstruction(masm, value, memory_start_plus_store_index,
2964 store_offset, float_type);
2967 EmitLoadNextInstructionId(masm, next_handler_id, code, kNextHandlerId);
2968 __ addq(code, Immediate(kInstructionCodeLength));
2974 wasm::WasmInterpreterRuntime::instruction_table_offset()));
2977 __ movq(next_handler_addr,
2978 MemOperand(instr_table, next_handler_id, times_8, 0));
2979 __ jmp(next_handler_addr);
2985#define FOREACH_INT_LOADSTORE_BUILTIN(V) \
2986 V(r2r_I32LoadMem8S, Generate_r2r_ILoadMem, kValueInt32, kIntS8) \
2987 V(r2r_I32LoadMem8U, Generate_r2r_ILoadMem, kValueInt32, kIntU8) \
2988 V(r2r_I32LoadMem16S, Generate_r2r_ILoadMem, kValueInt32, kIntS16) \
2989 V(r2r_I32LoadMem16U, Generate_r2r_ILoadMem, kValueInt32, kIntU16) \
2990 V(r2r_I64LoadMem8S, Generate_r2r_ILoadMem, kValueInt64, kIntS8) \
2991 V(r2r_I64LoadMem8U, Generate_r2r_ILoadMem, kValueInt64, kIntU8) \
2992 V(r2r_I64LoadMem16S, Generate_r2r_ILoadMem, kValueInt64, kIntS16) \
2993 V(r2r_I64LoadMem16U, Generate_r2r_ILoadMem, kValueInt64, kIntU16) \
2994 V(r2r_I64LoadMem32S, Generate_r2r_ILoadMem, kValueInt64, kIntS32) \
2995 V(r2r_I64LoadMem32U, Generate_r2r_ILoadMem, kValueInt64, kIntU32) \
2996 V(r2r_I32LoadMem, Generate_r2r_ILoadMem, kValueInt32, kIntS32) \
2997 V(r2r_I64LoadMem, Generate_r2r_ILoadMem, kValueInt64, kInt64) \
2999 V(r2s_I32LoadMem8S, Generate_r2s_ILoadMem, kValueInt32, kIntS8) \
3000 V(r2s_I32LoadMem8U, Generate_r2s_ILoadMem, kValueInt32, kIntU8) \
3001 V(r2s_I32LoadMem16S, Generate_r2s_ILoadMem, kValueInt32, kIntS16) \
3002 V(r2s_I32LoadMem16U, Generate_r2s_ILoadMem, kValueInt32, kIntU16) \
3003 V(r2s_I64LoadMem8S, Generate_r2s_ILoadMem, kValueInt64, kIntS8) \
3004 V(r2s_I64LoadMem8U, Generate_r2s_ILoadMem, kValueInt64, kIntU8) \
3005 V(r2s_I64LoadMem16S, Generate_r2s_ILoadMem, kValueInt64, kIntS16) \
3006 V(r2s_I64LoadMem16U, Generate_r2s_ILoadMem, kValueInt64, kIntU16) \
3007 V(r2s_I64LoadMem32S, Generate_r2s_ILoadMem, kValueInt64, kIntS32) \
3008 V(r2s_I64LoadMem32U, Generate_r2s_ILoadMem, kValueInt64, kIntU32) \
3009 V(r2s_I32LoadMem, Generate_r2s_ILoadMem, kValueInt32, kIntS32) \
3010 V(r2s_I64LoadMem, Generate_r2s_ILoadMem, kValueInt64, kInt64) \
3012 V(s2r_I32LoadMem8S, Generate_s2r_ILoadMem, kValueInt32, kIntS8) \
3013 V(s2r_I32LoadMem8U, Generate_s2r_ILoadMem, kValueInt32, kIntU8) \
3014 V(s2r_I32LoadMem16S, Generate_s2r_ILoadMem, kValueInt32, kIntS16) \
3015 V(s2r_I32LoadMem16U, Generate_s2r_ILoadMem, kValueInt32, kIntU16) \
3016 V(s2r_I64LoadMem8S, Generate_s2r_ILoadMem, kValueInt64, kIntS8) \
3017 V(s2r_I64LoadMem8U, Generate_s2r_ILoadMem, kValueInt64, kIntU8) \
3018 V(s2r_I64LoadMem16S, Generate_s2r_ILoadMem, kValueInt64, kIntS16) \
3019 V(s2r_I64LoadMem16U, Generate_s2r_ILoadMem, kValueInt64, kIntU16) \
3020 V(s2r_I64LoadMem32S, Generate_s2r_ILoadMem, kValueInt64, kIntS32) \
3021 V(s2r_I64LoadMem32U, Generate_s2r_ILoadMem, kValueInt64, kIntU32) \
3022 V(s2r_I32LoadMem, Generate_s2r_ILoadMem, kValueInt32, kIntS32) \
3023 V(s2r_I64LoadMem, Generate_s2r_ILoadMem, kValueInt64, kInt64) \
3025 V(s2s_I32LoadMem8S, Generate_s2s_ILoadMem, kValueInt32, kIntS8) \
3026 V(s2s_I32LoadMem8U, Generate_s2s_ILoadMem, kValueInt32, kIntU8) \
3027 V(s2s_I32LoadMem16S, Generate_s2s_ILoadMem, kValueInt32, kIntS16) \
3028 V(s2s_I32LoadMem16U, Generate_s2s_ILoadMem, kValueInt32, kIntU16) \
3029 V(s2s_I64LoadMem8S, Generate_s2s_ILoadMem, kValueInt64, kIntS8) \
3030 V(s2s_I64LoadMem8U, Generate_s2s_ILoadMem, kValueInt64, kIntU8) \
3031 V(s2s_I64LoadMem16S, Generate_s2s_ILoadMem, kValueInt64, kIntS16) \
3032 V(s2s_I64LoadMem16U, Generate_s2s_ILoadMem, kValueInt64, kIntU16) \
3033 V(s2s_I64LoadMem32S, Generate_s2s_ILoadMem, kValueInt64, kIntS32) \
3034 V(s2s_I64LoadMem32U, Generate_s2s_ILoadMem, kValueInt64, kIntU32) \
3035 V(s2s_I32LoadMem, Generate_s2s_ILoadMem, kValueInt32, kIntS32) \
3036 V(s2s_I64LoadMem, Generate_s2s_ILoadMem, kValueInt64, kInt64) \
3038 V(s2s_I32LoadMem8S_LocalSet, Generate_s2s_ILoadMem_LocalSet, kValueInt32, \
3040 V(s2s_I32LoadMem8U_LocalSet, Generate_s2s_ILoadMem_LocalSet, kValueInt32, \
3042 V(s2s_I32LoadMem16S_LocalSet, Generate_s2s_ILoadMem_LocalSet, kValueInt32, \
3044 V(s2s_I32LoadMem16U_LocalSet, Generate_s2s_ILoadMem_LocalSet, kValueInt32, \
3046 V(s2s_I64LoadMem8S_LocalSet, Generate_s2s_ILoadMem_LocalSet, kValueInt64, \
3048 V(s2s_I64LoadMem8U_LocalSet, Generate_s2s_ILoadMem_LocalSet, kValueInt64, \
3050 V(s2s_I64LoadMem16S_LocalSet, Generate_s2s_ILoadMem_LocalSet, kValueInt64, \
3052 V(s2s_I64LoadMem16U_LocalSet, Generate_s2s_ILoadMem_LocalSet, kValueInt64, \
3054 V(s2s_I64LoadMem32S_LocalSet, Generate_s2s_ILoadMem_LocalSet, kValueInt64, \
3056 V(s2s_I64LoadMem32U_LocalSet, Generate_s2s_ILoadMem_LocalSet, kValueInt64, \
3058 V(s2s_I32LoadMem_LocalSet, Generate_s2s_ILoadMem_LocalSet, kValueInt32, \
3060 V(s2s_I64LoadMem_LocalSet, Generate_s2s_ILoadMem_LocalSet, kValueInt64, \
3063 V(r2s_I32StoreMem8, Generate_r2s_IStoreMem, kValueInt32, kIntS8) \
3064 V(r2s_I32StoreMem16, Generate_r2s_IStoreMem, kValueInt32, kIntS16) \
3065 V(r2s_I64StoreMem8, Generate_r2s_IStoreMem, kValueInt64, kIntS8) \
3066 V(r2s_I64StoreMem16, Generate_r2s_IStoreMem, kValueInt64, kIntS16) \
3067 V(r2s_I64StoreMem32, Generate_r2s_IStoreMem, kValueInt64, kIntS32) \
3068 V(r2s_I32StoreMem, Generate_r2s_IStoreMem, kValueInt32, kIntS32) \
3069 V(r2s_I64StoreMem, Generate_r2s_IStoreMem, kValueInt64, kInt64) \
3071 V(s2s_I32StoreMem8, Generate_s2s_IStoreMem, kValueInt32, kIntS8) \
3072 V(s2s_I32StoreMem16, Generate_s2s_IStoreMem, kValueInt32, kIntS16) \
3073 V(s2s_I64StoreMem8, Generate_s2s_IStoreMem, kValueInt64, kIntS8) \
3074 V(s2s_I64StoreMem16, Generate_s2s_IStoreMem, kValueInt64, kIntS16) \
3075 V(s2s_I64StoreMem32, Generate_s2s_IStoreMem, kValueInt64, kIntS32) \
3076 V(s2s_I32StoreMem, Generate_s2s_IStoreMem, kValueInt32, kIntS32) \
3077 V(s2s_I64StoreMem, Generate_s2s_IStoreMem, kValueInt64, kInt64) \
3079 V(r2s_I32LoadStoreMem, Generate_r2s_ILoadStoreMem, kValueInt32, kIntS32) \
3080 V(r2s_I64LoadStoreMem, Generate_r2s_ILoadStoreMem, kValueInt64, kInt64) \
3082 V(s2s_I32LoadStoreMem, Generate_s2s_ILoadStoreMem, kValueInt32, kIntS32) \
3083 V(s2s_I64LoadStoreMem, Generate_s2s_ILoadStoreMem, kValueInt64, kInt64)
3085#define GENERATE_INT_LOADSTORE_BUILTIN(builtin_name, generator, value_type, \
3087 void Builtins::Generate_##builtin_name##_s(MacroAssembler* masm) { \
3088 return WasmInterpreterHandlerBuiltins<true>::generator(masm, value_type, \
3091 void Builtins::Generate_##builtin_name##_l(MacroAssembler* masm) { \
3092 return WasmInterpreterHandlerBuiltins<false>::generator(masm, value_type, \
3096FOREACH_INT_LOADSTORE_BUILTIN(GENERATE_INT_LOADSTORE_BUILTIN)
3097#undef FOREACH_INT_LOADSTORE_BUILTIN
3099#define FOREACH_FLOAT_LOADMEM_BUILTIN(V) \
3100 V(r2r_F32LoadMem, Generate_r2r_FLoadMem, kFloat32) \
3101 V(r2r_F64LoadMem, Generate_r2r_FLoadMem, kFloat64) \
3102 V(r2s_F32LoadMem, Generate_r2s_FLoadMem, kFloat32) \
3103 V(r2s_F64LoadMem, Generate_r2s_FLoadMem, kFloat64) \
3104 V(s2r_F32LoadMem, Generate_s2r_FLoadMem, kFloat32) \
3105 V(s2r_F64LoadMem, Generate_s2r_FLoadMem, kFloat64) \
3106 V(s2s_F32LoadMem, Generate_s2s_FLoadMem, kFloat32) \
3107 V(s2s_F64LoadMem, Generate_s2s_FLoadMem, kFloat64) \
3108 V(s2s_F32LoadMem_LocalSet, Generate_s2s_FLoadMem_LocalSet, kFloat32) \
3109 V(s2s_F64LoadMem_LocalSet, Generate_s2s_FLoadMem_LocalSet, kFloat64) \
3110 V(r2s_F32StoreMem, Generate_r2s_FStoreMem, kFloat32) \
3111 V(r2s_F64StoreMem, Generate_r2s_FStoreMem, kFloat64) \
3112 V(s2s_F32StoreMem, Generate_s2s_FStoreMem, kFloat32) \
3113 V(s2s_F64StoreMem, Generate_s2s_FStoreMem, kFloat64) \
3114 V(r2s_F32LoadStoreMem, Generate_r2s_FLoadStoreMem, kFloat32) \
3115 V(r2s_F64LoadStoreMem, Generate_r2s_FLoadStoreMem, kFloat64) \
3116 V(s2s_F32LoadStoreMem, Generate_s2s_FLoadStoreMem, kFloat32) \
3117 V(s2s_F64LoadStoreMem, Generate_s2s_FLoadStoreMem, kFloat64)
3119#define GENERATE_FLOAT_LOADMEM_BUILTIN(builtin_name, generator, value_type) \
3120 void Builtins::Generate_##builtin_name##_s(MacroAssembler* masm) { \
3121 return WasmInterpreterHandlerBuiltins<true>::generator(masm, value_type); \
3123 void Builtins::Generate_##builtin_name##_l(MacroAssembler* masm) { \
3124 return WasmInterpreterHandlerBuiltins<false>::generator(masm, value_type); \
3127FOREACH_FLOAT_LOADMEM_BUILTIN(GENERATE_FLOAT_LOADMEM_BUILTIN)
3128#undef FOREACH_FLOAT_LOADMEM_BUILTIN
#define BUILTIN_CODE(isolate, name)
static constexpr Builtin RecordWrite(SaveFPRegsMode fp_mode)
static constexpr Builtin Call(ConvertReceiverMode=ConvertReceiverMode::kAny)
static constexpr uint32_t thread_in_wasm_flag_address_offset()
static constexpr size_t kReturnCountOffset
static constexpr size_t kRepsOffset
static constexpr size_t kParameterCountOffset
static constexpr Tagged< Smi > zero()
static constexpr Register SlotAddressRegister()
static constexpr int SharedFunctionInfoOffsetInTaggedJSFunction()
static constexpr int ToTagged(int offset)
ZoneVector< RpoNumber > & result
typename detail::TypeForBits< Bits >::float_type float_type
int invoke(const char *params)
constexpr IndependentValueType kWasmF32
uint32_t WasmInterpreterRuntime * wasm_runtime
constexpr IndependentValueType kWasmI32
static constexpr uint32_t kInstructionTableMask
constexpr IndependentValueType kWasmS128
constexpr IndependentValueType kWasmF64
constexpr IndependentValueType kWasmI64
constexpr Register no_reg
constexpr Register kRootRegister
@ kUnknownIndirectPointerTag
constexpr int kPCOnStackSize
Operand FieldOperand(Register object, int offset)
constexpr int kSystemPointerSizeLog2
constexpr int kFPOnStackSize
MemOperand FieldMemOperand(Register object, int offset)
constexpr int kSystemPointerSize
constexpr int kTaggedSizeLog2
constexpr Register kScratchRegister
constexpr Register kWasmImplicitArgRegister
constexpr bool SmiValuesAre32Bits()
constexpr Register kPtrComprCageBaseRegister
@ times_system_pointer_size
constexpr Register kCArgRegs[]
#define OFFSET_OF_DATA_START(Type)