24#if defined(ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) || \
25 defined(THREAD_SANITIZER) || defined(LEAK_SANITIZER) || \
26 defined(UNDEFINED_SANITIZER)
27#define V8_WITH_SANITIZER
30#if defined(V8_OS_WIN) && defined(V8_WITH_SANITIZER)
36#define RESET_THREAD_IN_WASM_FLAG_FOR_ASAN_ON_WINDOWS
51 WriteUnalignedValue<float>(data, truncf(ReadUnalignedValue<float>(data)));
55 WriteUnalignedValue<float>(data, floorf(ReadUnalignedValue<float>(data)));
59 WriteUnalignedValue<float>(data, ceilf(ReadUnalignedValue<float>(data)));
63 float input = ReadUnalignedValue<float>(data);
64 float value = nearbyintf(input);
66 value = FpOpWorkaround<float>(input, value);
68 WriteUnalignedValue<float>(data, value);
72 WriteUnalignedValue<double>(data, trunc(ReadUnalignedValue<double>(data)));
76 WriteUnalignedValue<double>(data, floor(ReadUnalignedValue<double>(data)));
80 WriteUnalignedValue<double>(data, ceil(ReadUnalignedValue<double>(data)));
84 double input = ReadUnalignedValue<double>(data);
85 double value = nearbyint(input);
87 value = FpOpWorkaround<double>(input, value);
89 WriteUnalignedValue<double>(data, value);
93 int64_t input = ReadUnalignedValue<int64_t>(data);
94 WriteUnalignedValue<float>(data,
static_cast<float>(input));
98 uint64_t input = ReadUnalignedValue<uint64_t>(data);
134 constexpr uint32_t num_extracted_bits = 25;
136 if (leading_zeros + trailing_zeros + num_extracted_bits < 64) {
138 uint32_t num_aggregation_bits = 64 - num_extracted_bits - leading_zeros;
142 int32_t extracted_bits =
143 static_cast<int32_t
>(input >> (num_aggregation_bits - 1));
147 float result =
static_cast<float>(extracted_bits);
152 int32_t shift_back =
static_cast<int32_t
>(num_aggregation_bits) - 1 - 2;
159 int32_t multiplier_bits = ((shift_back - 127) & 0xff) << 23;
161 WriteUnalignedValue<float>(data,
result);
165 WriteUnalignedValue<float>(data,
static_cast<float>(input));
169 int64_t input = ReadUnalignedValue<int64_t>(data);
170 WriteUnalignedValue<double>(data,
static_cast<double>(input));
174 uint64_t input = ReadUnalignedValue<uint64_t>(data);
175 double result =
static_cast<double>(input);
182 uint32_t low_word =
static_cast<uint32_t
>(input & 0xFFFFFFFF);
183 uint32_t high_word =
static_cast<uint32_t
>(input >> 32);
185 double shift =
static_cast<double>(1ull << 32);
187 result =
static_cast<double>(high_word);
189 result +=
static_cast<double>(low_word);
192 WriteUnalignedValue<double>(data,
result);
196 float input = ReadUnalignedValue<float>(data);
197 if (base::IsValueInRangeForNumericType<int64_t>(input)) {
198 WriteUnalignedValue<int64_t>(data,
static_cast<int64_t
>(input));
205 float input = ReadUnalignedValue<float>(data);
206 if (base::IsValueInRangeForNumericType<uint64_t>(input)) {
207 WriteUnalignedValue<uint64_t>(data,
static_cast<uint64_t
>(input));
214 double input = ReadUnalignedValue<double>(data);
215 if (base::IsValueInRangeForNumericType<int64_t>(input)) {
216 WriteUnalignedValue<int64_t>(data,
static_cast<int64_t
>(input));
223 double input = ReadUnalignedValue<double>(data);
224 if (base::IsValueInRangeForNumericType<uint64_t>(input)) {
225 WriteUnalignedValue<uint64_t>(data,
static_cast<uint64_t
>(input));
232 float input = ReadUnalignedValue<float>(data);
233 if (base::IsValueInRangeForNumericType<int64_t>(input)) {
234 WriteUnalignedValue<int64_t>(data,
static_cast<int64_t
>(input));
237 if (std::isnan(input)) {
238 WriteUnalignedValue<int64_t>(data, 0);
242 WriteUnalignedValue<int64_t>(data, std::numeric_limits<int64_t>::min());
245 WriteUnalignedValue<int64_t>(data, std::numeric_limits<int64_t>::max());
249 float input = ReadUnalignedValue<float>(data);
250 if (base::IsValueInRangeForNumericType<uint64_t>(input)) {
251 WriteUnalignedValue<uint64_t>(data,
static_cast<uint64_t
>(input));
254 if (input >=
static_cast<float>(std::numeric_limits<uint64_t>::max())) {
255 WriteUnalignedValue<uint64_t>(data, std::numeric_limits<uint64_t>::max());
258 WriteUnalignedValue<uint64_t>(data, 0);
262 double input = ReadUnalignedValue<double>(data);
263 if (base::IsValueInRangeForNumericType<int64_t>(input)) {
264 WriteUnalignedValue<int64_t>(data,
static_cast<int64_t
>(input));
267 if (std::isnan(input)) {
268 WriteUnalignedValue<int64_t>(data, 0);
272 WriteUnalignedValue<int64_t>(data, std::numeric_limits<int64_t>::min());
275 WriteUnalignedValue<int64_t>(data, std::numeric_limits<int64_t>::max());
279 double input = ReadUnalignedValue<double>(data);
280 if (base::IsValueInRangeForNumericType<uint64_t>(input)) {
281 WriteUnalignedValue<uint64_t>(data,
static_cast<uint64_t
>(input));
284 if (input >=
static_cast<double>(std::numeric_limits<uint64_t>::max())) {
285 WriteUnalignedValue<uint64_t>(data, std::numeric_limits<uint64_t>::max());
288 WriteUnalignedValue<uint64_t>(data, 0);
292 WriteUnalignedValue<float>(data,
Float16::Read(data).ToFloat32());
300 int64_t dividend = ReadUnalignedValue<int64_t>(data);
301 int64_t divisor = ReadUnalignedValue<int64_t>(data +
sizeof(dividend));
305 if (divisor == -1 && dividend == std::numeric_limits<int64_t>::min()) {
308 WriteUnalignedValue<int64_t>(data, dividend / divisor);
313 int64_t dividend = ReadUnalignedValue<int64_t>(data);
314 int64_t divisor = ReadUnalignedValue<int64_t>(data +
sizeof(dividend));
318 if (divisor == -1 && dividend == std::numeric_limits<int64_t>::min()) {
319 WriteUnalignedValue<int64_t>(data, 0);
322 WriteUnalignedValue<int64_t>(data, dividend % divisor);
327 uint64_t dividend = ReadUnalignedValue<uint64_t>(data);
328 uint64_t divisor = ReadUnalignedValue<uint64_t>(data +
sizeof(dividend));
332 WriteUnalignedValue<uint64_t>(data, dividend / divisor);
337 uint64_t dividend = ReadUnalignedValue<uint64_t>(data);
338 uint64_t divisor = ReadUnalignedValue<uint64_t>(data +
sizeof(dividend));
342 WriteUnalignedValue<uint64_t>(data, dividend % divisor);
347 return (input << (shift & 31)) | (input >> ((32 - shift) & 31));
351 return (input >> (shift & 31)) | (input << ((32 - shift) & 31));
355 return (input << (shift & 63)) | (input >> ((64 - shift) & 63));
359 return (input >> (shift & 63)) | (input << ((64 - shift) & 63));
363 double x = ReadUnalignedValue<double>(data);
364 double y = ReadUnalignedValue<double>(data +
sizeof(
x));
365 WriteUnalignedValue<double>(data,
math::pow(
x,
y));
368template <
typename T, T (*
float_round_op)(T)>
371 for (
int i = 0;
i <
n;
i++) {
372 T input = ReadUnalignedValue<T>(data + (
i *
sizeof(T)));
373 T value = float_round_op(input);
375 value = FpOpWorkaround<T>(input, value);
377 WriteUnalignedValue<T>(data + (
i *
sizeof(T)), value);
467template <
typename R, R (*
float_bin_op)(Float16, Float16)>
470 for (
int i = 0;
i <
n;
i++) {
473 R value = float_bin_op(lhs, rhs);
474 WriteUnalignedValue<R>(data + (
i *
sizeof(R)), value);
479 return a.ToFloat32() == b.
ToFloat32() ? -1 : 0;
487 return a.ToFloat32() != b.
ToFloat32() ? -1 : 0;
495 return a.ToFloat32() < b.
ToFloat32() ? -1 : 0;
503 return a.ToFloat32() <= b.
ToFloat32() ? -1 : 0;
574template <
typename T,
typename R, R (*
float_un_op)(T)>
577 for (
int i = 0;
i <
n;
i++) {
578 T input = ReadUnalignedValue<T>(data + (
i *
sizeof(T)));
579 R value = float_un_op(input);
580 WriteUnalignedValue<R>(data + (
i *
sizeof(T)), value);
586 if (std::isnan(f32))
return 0;
589 return static_cast<int16_t
>(f32);
594 if (std::isnan(f32))
return 0;
596 if (f32 <
float{0})
return 0;
597 return static_cast<uint16_t
>(f32);
628 WriteUnalignedValue<float>(data, a.ToFloat32());
629 WriteUnalignedValue<float>(data +
sizeof(
float), b.
ToFloat32());
630 WriteUnalignedValue<float>(data + (2 *
sizeof(
float)), c.
ToFloat32());
631 WriteUnalignedValue<float>(data + (3 *
sizeof(
float)), d.ToFloat32());
635#if V8_TARGET_BIG_ENDIAN
636 for (
int i = 3, j = 7;
i >= 0;
i--, j--) {
637 float input = ReadUnalignedValue<float>(data + (
i *
sizeof(
float)));
640 for (
int i = 0;
i < 4;
i++) {
641 WriteUnalignedValue<Float16>(data + (
i *
sizeof(
Float16)),
645 for (
int i = 0;
i < 4;
i++) {
646 float input = ReadUnalignedValue<float>(data + (
i *
sizeof(
float)));
649 for (
int i = 4;
i < 8;
i++) {
650 WriteUnalignedValue<Float16>(data + (
i *
sizeof(
Float16)),
657#if V8_TARGET_BIG_ENDIAN
658 for (
int i = 1, j = 7;
i >= 0;
i--, j--) {
659 double input = ReadUnalignedValue<double>(data + (
i *
sizeof(
double)));
660 WriteUnalignedValue<uint16_t>(data + (j *
sizeof(uint16_t)),
663 for (
int i = 0;
i < 6;
i++) {
664 WriteUnalignedValue<Float16>(data + (
i *
sizeof(
Float16)),
668 for (
int i = 0;
i < 2;
i++) {
669 double input = ReadUnalignedValue<double>(data + (
i *
sizeof(
double)));
670 WriteUnalignedValue<uint16_t>(data + (
i *
sizeof(uint16_t)),
673 for (
int i = 2;
i < 8;
i++) {
674 WriteUnalignedValue<Float16>(data + (
i *
sizeof(
Float16)),
680template <
float (*
float_fma_op)(
float,
float,
float)>
683 for (
int i = 0;
i <
n;
i++) {
693float Qfma(
float a,
float b,
float c) {
return a * b + c; }
699float Qfms(
float a,
float b,
float c) {
return -(a * b) + c; }
714#if defined(RESET_THREAD_IN_WASM_FLAG_FOR_ASAN_ON_WINDOWS)
717 ThreadNotInWasmScope() : thread_was_in_wasm_(trap_handler::IsThreadInWasm()) {
718 if (thread_was_in_wasm_) {
719 trap_handler::ClearThreadInWasm();
723 ~ThreadNotInWasmScope() {
724 if (thread_was_in_wasm_) {
725 trap_handler::SetThreadInWasm();
730 bool thread_was_in_wasm_;
734 ThreadNotInWasmScope() {
742 uint32_t mem_index, uintptr_t index) {
754constexpr int32_t kOutOfBounds = 0;
758 uintptr_t dst, uint32_t src, uint32_t seg_index,
760 ThreadNotInWasmScope thread_not_in_wasm_scope;
765 uint64_t mem_size =
trusted_data->memory_size(mem_index);
768 uint32_t seg_size =
trusted_data->data_segment_sizes()->get(seg_index);
771 uint8_t* seg_start =
reinterpret_cast<uint8_t*
>(
773 std::memcpy(EffectiveAddress(
trusted_data, mem_index, dst), seg_start + src,
779 uint32_t src_mem_index, uintptr_t dst,
780 uintptr_t src, uintptr_t size) {
781 ThreadNotInWasmScope thread_not_in_wasm_scope;
786 size_t dst_mem_size =
trusted_data->memory_size(dst_mem_index);
787 size_t src_mem_size =
trusted_data->memory_size(src_mem_index);
788 static_assert(std::is_same_v<size_t, uintptr_t>);
793 std::memmove(EffectiveAddress(
trusted_data, dst_mem_index, dst),
794 EffectiveAddress(
trusted_data, src_mem_index, src), size);
799 uintptr_t dst, uint8_t value, uintptr_t size) {
800 ThreadNotInWasmScope thread_not_in_wasm_scope;
806 uint64_t mem_size =
trusted_data->memory_size(mem_index);
809 std::memset(EffectiveAddress(
trusted_data, mem_index, dst), value, size);
814inline void* ArrayElementAddress(
Address array, uint32_t index,
815 int element_size_bytes) {
816 return reinterpret_cast<void*
>(array + WasmArray::kHeaderSize -
820 int element_size_bytes) {
821 return ArrayElementAddress(array.ptr(), index, element_size_bytes);
826 Address raw_src_array, uint32_t src_index,
829 ThreadNotInWasmScope thread_not_in_wasm_scope;
834 bool overlapping_ranges =
835 dst_array.
ptr() == src_array.
ptr() &&
836 (dst_index < src_index ? dst_index + length > src_index
837 : src_index + length > dst_index);
839 src_array->map()->wasm_type_info()->element_type();
841 ObjectSlot dst_slot = dst_array->ElementSlot(dst_index);
842 ObjectSlot src_slot = src_array->ElementSlot(src_index);
844 if (overlapping_ranges) {
845 heap->MoveRange(dst_array, dst_slot, src_slot, length,
848 heap->CopyRange(dst_array, dst_slot, src_slot, length,
853 void* dst = ArrayElementAddress(dst_array, dst_index, element_size_bytes);
854 void* src = ArrayElementAddress(src_array, src_index, element_size_bytes);
855 size_t copy_size = length * element_size_bytes;
856 if (overlapping_ranges) {
865 uint32_t emit_write_barrier, uint32_t raw_type,
867 ThreadNotInWasmScope thread_not_in_wasm_scope;
870 int8_t* initial_element_address =
reinterpret_cast<int8_t*
>(
871 ArrayElementAddress(raw_array, index, type.value_kind_size()));
872 const int bytes_to_set = length * type.value_kind_size();
877 CHECK_GE(
static_cast<size_t>(bytes_to_set),
sizeof(int64_t));
879 switch (type.kind()) {
883 int64_t initial_value =
885 if (initial_value == 0) {
886 std::memset(initial_element_address, 0, bytes_to_set);
892 reinterpret_cast<Address>(initial_element_address), initial_value);
897 int32_t initial_value = *
reinterpret_cast<int32_t*
>(initial_value_addr);
898 if (initial_value == 0) {
899 std::memset(initial_element_address, 0, bytes_to_set);
902 int32_t*
base =
reinterpret_cast<int32_t*
>(initial_element_address);
909 int16_t initial_value = *
reinterpret_cast<int32_t*
>(initial_value_addr);
910 if (initial_value == 0) {
911 std::memset(initial_element_address, 0, bytes_to_set);
914 int16_t*
base =
reinterpret_cast<int16_t*
>(initial_element_address);
920 int8_t initial_value = *
reinterpret_cast<int32_t*
>(initial_value_addr);
921 if (initial_value == 0) {
922 std::memset(initial_element_address, 0, bytes_to_set);
925 int8_t*
base =
reinterpret_cast<int8_t*
>(initial_element_address);
926 for (
size_t i = 0;
i <
sizeof(int64_t);
i++) {
927 base[
i] = initial_value;
933 intptr_t uncompressed_pointer =
936 int32_t*
base =
reinterpret_cast<int32_t*
>(initial_element_address);
937 base[0] =
base[1] =
static_cast<int32_t
>(uncompressed_pointer);
940 reinterpret_cast<Address>(initial_element_address),
941 uncompressed_pointer);
948 std::memset(initial_element_address, 0, bytes_to_set);
956 int bytes_already_set =
sizeof(int64_t);
958 while (bytes_already_set * 2 <= bytes_to_set) {
959 std::memcpy(initial_element_address + bytes_already_set,
960 initial_element_address, bytes_already_set);
961 bytes_already_set *= 2;
964 if (bytes_already_set < bytes_to_set) {
965 std::memcpy(initial_element_address + bytes_already_set,
966 initial_element_address, bytes_to_set - bytes_already_set);
969 if (emit_write_barrier) {
970 DCHECK(type.is_reference());
975 reinterpret_cast<Address>(initial_element_address + bytes_to_set));
983 std::numeric_limits<double>::quiet_NaN());
987 isolate->SwitchStacks(from, isolate->isolate_data()->active_stack());
991 isolate->SwitchStacks(from, isolate->isolate_data()->active_stack());
992 isolate->RetireWasmStack(from);
997 StackGuard* stack_guard = isolate->stack_guard();
999 auto secondary_stack_limit = stack_guard->
real_jslimit();
1008 auto counter = isolate->wasm_switch_to_the_central_stack_counter();
1009 isolate->set_wasm_switch_to_the_central_stack_counter(counter + 1);
1024 StackGuard* stack_guard = isolate->stack_guard();
1030 StackGuard* stack_guard = isolate->stack_guard();
1033 stack->set_stack_switch_info(fp, central_stack_sp);
1037 return central_stack_sp;
1046 StackGuard* stack_guard = isolate->stack_guard();
1048 reinterpret_cast<uintptr_t
>(stack->jslimit()));
1053 size_t gap,
Address current_fp) {
1056 if (check.WasmHasOverflowed(gap)) {
1063 if (!active_stack->
Grow(current_fp)) {
1067 Address new_sp = active_stack->
base() - frame_size;
1072 std::memcpy(
reinterpret_cast<void*
>(new_sp), current_sp, frame_size);
1074#if V8_TARGET_ARCH_ARM64
1076 new_sp + (current_fp -
reinterpret_cast<Address>(current_sp));
1083 WriteUnalignedValue<Address>(new_pc_address, new_signed_pc);
1086 isolate->stack_guard()->SetStackLimitForStackSwitching(
1087 reinterpret_cast<uintptr_t
>(active_stack->
jslimit()));
1103 isolate->stack_guard()->SetStackLimitForStackSwitching(
1104 reinterpret_cast<uintptr_t
>(active_stack->
jslimit()));
1115 return active_stack->
old_fp();
1120#undef V8_WITH_SANITIZER
1121#undef RESET_THREAD_IN_WASM_FLAG_FOR_ASAN_ON_WINDOWS
static constexpr int kCallerPCOffset
void Write(base::Address destination)
static Float16 FromFloat32(float f32)
static Float16 Read(base::Address source)
static V8_INLINE Isolate * Current()
static V8_INLINE Address MoveSignedPC(Isolate *isolate, Address pc, Address new_sp, Address old_sp)
void SetStackLimitForStackSwitching(uintptr_t limit)
V8_INLINE constexpr StorageType ptr() const
uint8_t is_on_central_stack_flag_
Address central_stack_sp_
Address central_stack_limit_
Address secondary_stack_limit_
Address secondary_stack_sp_
static void ForRange(Heap *heap, Tagged< HeapObject > object, TSlot start, TSlot end)
void clear_stack_switch_info()
bool Grow(Address current_fp)
constexpr int value_kind_size() const
constexpr bool is_reference() const
static constexpr ValueType FromRawBitField(uint32_t bits)
ZoneVector< RpoNumber > & result
constexpr unsigned CountLeadingZeros(T value)
constexpr unsigned CountTrailingZeros(T value)
static V ReadUnalignedValue(Address p)
constexpr bool IsInBounds(T index, T length, T max)
V8_INLINE Dest bit_cast(Source const &source)
static void WriteUnalignedValue(Address p, V value)
double pow(double x, double y)
void f32_trunc_wrapper(Address data)
void f16x8_eq_wrapper(Address data)
void int64_to_float32_wrapper(Address data)
void uint64_to_float32_wrapper(Address data)
void switch_stacks(Isolate *isolate, wasm::StackMemory *from)
void simd_float16_fma_wrapper(Address data)
void f16x8_min_wrapper(Address data)
int32_t memory_copy_wrapper(Address trusted_data_addr, uint32_t dst_mem_index, uint32_t src_mem_index, uintptr_t dst, uintptr_t src, uintptr_t size)
void f16x8_sqrt_wrapper(Address data)
void f16x8_qfma_wrapper(Address data)
int32_t uint64_div_wrapper(Address data)
void f64_nearest_int_wrapper(Address data)
Float16 f16_trunc(Float16 a)
void f16x8_floor_wrapper(Address data)
void f16x8_abs_wrapper(Address data)
Float16 f16_abs(Float16 a)
Float16 f16_floor(Float16 a)
Float16 ConvertToF16S(int16_t val)
uint32_t word32_rol_wrapper(uint32_t input, uint32_t shift)
Float16 f16_div(Float16 a, Float16 b)
void f32x4_floor_wrapper(Address data)
void f16x8_sub_wrapper(Address data)
void f16x8_sconvert_i16x8_wrapper(Address data)
Address shrink_stack(Isolate *isolate)
Float16 f16_pmax(Float16 a, Float16 b)
void float16_to_float32_wrapper(Address data)
void simd_float_un_wrapper(Address data)
uint32_t word32_ror_wrapper(uint32_t input, uint32_t shift)
Float16 f16_sub(Float16 a, Float16 b)
intptr_t switch_to_the_central_stack_for_js(Isolate *isolate, Address fp)
double flat_string_to_f64(Address string_address)
Address grow_stack(Isolate *isolate, void *current_sp, size_t frame_size, size_t gap, Address current_fp)
void f16x8_demote_f64x2_zero_wrapper(Address data)
int32_t memory_init_wrapper(Address trusted_data_addr, uint32_t mem_index, uintptr_t dst, uint32_t src, uint32_t seg_index, uint32_t size)
void f16x8_pmin_wrapper(Address data)
Float16 f16_min(Float16 a, Float16 b)
void f16x8_lt_wrapper(Address data)
void float64_to_uint64_sat_wrapper(Address data)
void switch_from_the_central_stack(Isolate *isolate)
void simd_float_round_wrapper(Address data)
void f64x2_ceil_wrapper(Address data)
int16_t f16_lt(Float16 a, Float16 b)
void f16x8_nearest_int_wrapper(Address data)
Float16 f16_neg(Float16 a)
float Qfma(float a, float b, float c)
int32_t float32_to_uint64_wrapper(Address data)
void f32_nearest_int_wrapper(Address data)
int16_t f16_eq(Float16 a, Float16 b)
int32_t float64_to_int64_wrapper(Address data)
int32_t float32_to_int64_wrapper(Address data)
Float16 ConvertToF16U(uint16_t val)
void f16x8_mul_wrapper(Address data)
intptr_t switch_to_the_central_stack(Isolate *isolate, uintptr_t current_sp)
void f64x2_trunc_wrapper(Address data)
uint64_t word64_rol_wrapper(uint64_t input, uint32_t shift)
float Qfms(float a, float b, float c)
void simd_float16_bin_wrapper(Address data)
int32_t memory_fill_wrapper(Address trusted_data_addr, uint32_t mem_index, uintptr_t dst, uint8_t value, uintptr_t size)
void f16x8_neg_wrapper(Address data)
void f16x8_pmax_wrapper(Address data)
int32_t int64_div_wrapper(Address data)
void f64x2_floor_wrapper(Address data)
void f32x4_ceil_wrapper(Address data)
uint16_t ConvertToIntU(Float16 val)
void f16x8_ceil_wrapper(Address data)
void float64_pow_wrapper(Address data)
void float32_to_int64_sat_wrapper(Address data)
void f32x4_trunc_wrapper(Address data)
Float16 f16_max(Float16 a, Float16 b)
uint64_t word64_ror_wrapper(uint64_t input, uint32_t shift)
void i16x8_uconvert_f16x8_wrapper(Address data)
void f16x8_div_wrapper(Address data)
void uint64_to_float64_wrapper(Address data)
void float64_to_int64_sat_wrapper(Address data)
void f16x8_trunc_wrapper(Address data)
Float16 f16_sqrt(Float16 a)
void i16x8_sconvert_f16x8_wrapper(Address data)
void array_copy_wrapper(Address raw_dst_array, uint32_t dst_index, Address raw_src_array, uint32_t src_index, uint32_t length)
Float16 f16_ceil(Float16 a)
void array_fill_wrapper(Address raw_array, uint32_t index, uint32_t length, uint32_t emit_write_barrier, uint32_t raw_type, Address initial_value_addr)
Float16 f16_nearest_int(Float16 a)
int16_t f16_le(Float16 a, Float16 b)
void f16x8_demote_f32x4_zero_wrapper(Address data)
void f16x8_add_wrapper(Address data)
int32_t uint64_mod_wrapper(Address data)
void f64_ceil_wrapper(Address data)
void f32x4_nearest_int_wrapper(Address data)
int16_t ConvertToIntS(Float16 val)
void return_switch(Isolate *isolate, wasm::StackMemory *from)
void f16x8_qfms_wrapper(Address data)
void f32_floor_wrapper(Address data)
int32_t float64_to_uint64_wrapper(Address data)
void f16x8_uconvert_i16x8_wrapper(Address data)
void switch_from_the_central_stack_for_js(Isolate *isolate)
Address load_old_fp(Isolate *isolate)
void f16x8_max_wrapper(Address data)
void float32_to_float16_wrapper(Address data)
Float16 f16_mul(Float16 a, Float16 b)
int32_t int64_mod_wrapper(Address data)
void f64_trunc_wrapper(Address data)
void f32x4_promote_low_f16x8_wrapper(Address data)
Float16 f16_add(Float16 a, Float16 b)
void f16x8_ne_wrapper(Address data)
int16_t f16_ne(Float16 a, Float16 b)
void f64x2_nearest_int_wrapper(Address data)
Float16 f16_pmin(Float16 a, Float16 b)
void f32_ceil_wrapper(Address data)
void f64_floor_wrapper(Address data)
void int64_to_float64_wrapper(Address data)
void float32_to_uint64_sat_wrapper(Address data)
void f16x8_le_wrapper(Address data)
constexpr int kTaggedSize
constexpr int kSimd128Size
double FlatStringToDouble(Tagged< String > string, ConversionFlag flag, double empty_string_val)
Tagged(T object) -> Tagged< T >
constexpr int kSystemPointerSize
V8_EXPORT_PRIVATE void MemMove(void *dest, const void *src, size_t size)
uint16_t DoubleToFloat16(double value)
void MemCopy(void *dest, const void *src, size_t size)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define CHECK_GE(lhs, rhs)
#define CHECK_NE(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)