10 #include "include/v8config.h" 12 #include "src/base/bits.h" 13 #include "src/utils.h" 14 #include "src/v8memory.h" 15 #include "src/wasm/wasm-external-refs.h" 21 void f32_trunc_wrapper(Address data) {
22 WriteUnalignedValue<float>(data, truncf(ReadUnalignedValue<float>(data)));
25 void f32_floor_wrapper(Address data) {
26 WriteUnalignedValue<float>(data, floorf(ReadUnalignedValue<float>(data)));
29 void f32_ceil_wrapper(Address data) {
30 WriteUnalignedValue<float>(data, ceilf(ReadUnalignedValue<float>(data)));
33 void f32_nearest_int_wrapper(Address data) {
34 WriteUnalignedValue<float>(data, nearbyintf(ReadUnalignedValue<float>(data)));
37 void f64_trunc_wrapper(Address data) {
38 WriteUnalignedValue<double>(data, trunc(ReadUnalignedValue<double>(data)));
41 void f64_floor_wrapper(Address data) {
42 WriteUnalignedValue<double>(data, floor(ReadUnalignedValue<double>(data)));
45 void f64_ceil_wrapper(Address data) {
46 WriteUnalignedValue<double>(data, ceil(ReadUnalignedValue<double>(data)));
49 void f64_nearest_int_wrapper(Address data) {
50 WriteUnalignedValue<double>(data,
51 nearbyint(ReadUnalignedValue<double>(data)));
54 void int64_to_float32_wrapper(Address data) {
55 int64_t input = ReadUnalignedValue<int64_t>(data);
56 WriteUnalignedValue<float>(data,
static_cast<float>(input));
59 void uint64_to_float32_wrapper(Address data) {
60 uint64_t input = ReadUnalignedValue<uint64_t>(data);
61 float result =
static_cast<float>(input);
74 float shift =
static_cast<float>(1ull << 32);
76 if (high_word < 0x80000000) {
78 shift =
static_cast<float>(1ull << 31);
81 if ((high_word & 0xFE000000) && low_word) {
86 result =
static_cast<float>(high_word);
88 result +=
static_cast<float>(low_word);
91 WriteUnalignedValue<float>(data, result);
94 void int64_to_float64_wrapper(Address data) {
95 int64_t input = ReadUnalignedValue<int64_t>(data);
96 WriteUnalignedValue<double>(data,
static_cast<double>(input));
99 void uint64_to_float64_wrapper(Address data) {
100 uint64_t input = ReadUnalignedValue<uint64_t>(data);
101 double result =
static_cast<double>(input);
111 double shift =
static_cast<double>(1ull << 32);
113 result =
static_cast<double>(high_word);
115 result +=
static_cast<double>(low_word);
118 WriteUnalignedValue<double>(data, result);
121 int32_t float32_to_int64_wrapper(Address data) {
125 float input = ReadUnalignedValue<float>(data);
126 if (input >= static_cast<float>(std::numeric_limits<int64_t>::min()) &&
127 input < static_cast<float>(std::numeric_limits<int64_t>::max())) {
128 WriteUnalignedValue<int64_t>(data,
static_cast<int64_t>(input));
134 int32_t float32_to_uint64_wrapper(Address data) {
135 float input = ReadUnalignedValue<float>(data);
140 input < static_cast<float>(std::numeric_limits<uint64_t>::max())) {
141 WriteUnalignedValue<uint64_t>(data,
static_cast<uint64_t
>(input));
147 int32_t float64_to_int64_wrapper(Address data) {
151 double input = ReadUnalignedValue<double>(data);
152 if (input >= static_cast<double>(std::numeric_limits<int64_t>::min()) &&
153 input < static_cast<double>(std::numeric_limits<int64_t>::max())) {
154 WriteUnalignedValue<int64_t>(data,
static_cast<int64_t>(input));
160 int32_t float64_to_uint64_wrapper(Address data) {
164 double input = ReadUnalignedValue<double>(data);
166 input < static_cast<double>(std::numeric_limits<uint64_t>::max())) {
167 WriteUnalignedValue<uint64_t>(data,
static_cast<uint64_t
>(input));
173 int32_t int64_div_wrapper(Address data) {
174 int64_t dividend = ReadUnalignedValue<int64_t>(data);
175 int64_t divisor = ReadUnalignedValue<int64_t>(data +
sizeof(dividend));
179 if (divisor == -1 && dividend == std::numeric_limits<int64_t>::min()) {
182 WriteUnalignedValue<int64_t>(data, dividend / divisor);
186 int32_t int64_mod_wrapper(Address data) {
187 int64_t dividend = ReadUnalignedValue<int64_t>(data);
188 int64_t divisor = ReadUnalignedValue<int64_t>(data +
sizeof(dividend));
192 WriteUnalignedValue<int64_t>(data, dividend % divisor);
196 int32_t uint64_div_wrapper(Address data) {
197 uint64_t dividend = ReadUnalignedValue<uint64_t>(data);
198 uint64_t divisor = ReadUnalignedValue<uint64_t>(data +
sizeof(dividend));
202 WriteUnalignedValue<uint64_t>(data, dividend / divisor);
206 int32_t uint64_mod_wrapper(Address data) {
207 uint64_t dividend = ReadUnalignedValue<uint64_t>(data);
208 uint64_t divisor = ReadUnalignedValue<uint64_t>(data +
sizeof(dividend));
212 WriteUnalignedValue<uint64_t>(data, dividend % divisor);
216 uint32_t word32_ctz_wrapper(Address data) {
217 return base::bits::CountTrailingZeros(ReadUnalignedValue<uint32_t>(data));
220 uint32_t word64_ctz_wrapper(Address data) {
221 return base::bits::CountTrailingZeros(ReadUnalignedValue<uint64_t>(data));
224 uint32_t word32_popcnt_wrapper(Address data) {
225 return base::bits::CountPopulation(ReadUnalignedValue<uint32_t>(data));
228 uint32_t word64_popcnt_wrapper(Address data) {
229 return base::bits::CountPopulation(ReadUnalignedValue<uint64_t>(data));
232 uint32_t word32_rol_wrapper(Address data) {
233 uint32_t input = ReadUnalignedValue<uint32_t>(data);
234 uint32_t shift = ReadUnalignedValue<uint32_t>(data +
sizeof(input)) & 31;
235 return (input << shift) | (input >> (32 - shift));
238 uint32_t word32_ror_wrapper(Address data) {
239 uint32_t input = ReadUnalignedValue<uint32_t>(data);
240 uint32_t shift = ReadUnalignedValue<uint32_t>(data +
sizeof(input)) & 31;
241 return (input >> shift) | (input << (32 - shift));
244 void float64_pow_wrapper(Address data) {
245 double x = ReadUnalignedValue<double>(data);
246 double y = ReadUnalignedValue<double>(data +
sizeof(x));
247 WriteUnalignedValue<double>(data, Pow(x, y));
250 static WasmTrapCallbackForTesting wasm_trap_callback_for_testing =
nullptr;
252 void set_trap_callback_for_testing(WasmTrapCallbackForTesting callback) {
253 wasm_trap_callback_for_testing = callback;
256 void call_trap_callback_for_testing() {
257 if (wasm_trap_callback_for_testing) {
258 wasm_trap_callback_for_testing();