|
3 | 3 | use super::no_std_floats::NoStdFloatExt;
|
4 | 4 |
|
5 | 5 | use alloc::{format, rc::Rc, string::ToString};
|
6 |
| -use core::ops::{ControlFlow, Not}; |
| 6 | +use core::ops::ControlFlow; |
7 | 7 | use core::simd::cmp::{SimdPartialEq, SimdPartialOrd};
|
8 | 8 | use core::simd::num::SimdUint;
|
9 | 9 | use interpreter::stack::CallFrame;
|
@@ -316,67 +316,71 @@ impl<'store, 'stack> Executor<'store, 'stack> {
|
316 | 316 | V128Xor => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a ^ b)).to_cf()?,
|
317 | 317 | V128Bitselect => self.stack.values.calculate_same_3::<Value128>(|v1, v2, c| Ok((v1 & c) | (v2 & !c))).to_cf()?,
|
318 | 318 | V128AnyTrue => self.stack.values.replace_top::<Value128, i32>(|v| Ok((v.reduce_sum() != 0) as i32)).to_cf()?,
|
319 |
| - |
320 | 319 | I8x16Swizzle => self.stack.values.calculate_same::<Value128>(|a, s| Ok(a.swizzle_dyn(s))).to_cf()?,
|
321 | 320 |
|
322 |
| - I8x16Splat => self.stack.values.replace_top::<i32, Value128>(|v| Ok(Simd::<i8, 16>::splat(v as i8).to_ne_bytes())).to_cf()?, |
323 |
| - I16x8Splat => self.stack.values.replace_top::<i32, Value128>(|v| Ok(Simd::<i16, 8>::splat(v as i16).to_ne_bytes())).to_cf()?, |
324 |
| - I32x4Splat => self.stack.values.replace_top::<i32, Value128>(|v| Ok(Simd::<i32, 4>::splat(v).to_ne_bytes())).to_cf()?, |
325 |
| - I64x2Splat => self.stack.values.replace_top::<i64, Value128>(|v| Ok(Simd::<i64, 2>::splat(v).to_ne_bytes())).to_cf()?, |
326 |
| - F32x4Splat => self.stack.values.replace_top::<f32, Value128>(|v| Ok(Simd::<f32, 4>::splat(v).to_ne_bytes())).to_cf()?, |
327 |
| - F64x2Splat => self.stack.values.replace_top::<f64, Value128>(|v| Ok(Simd::<f64, 2>::splat(v).to_ne_bytes())).to_cf()?, |
328 |
| - |
329 |
| - I8x16Eq => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_eq(b).to_int().to_ne_bytes())).to_cf()?, |
330 |
| - I16x8Eq => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_eq(b).to_int().to_ne_bytes())).to_cf()?, |
331 |
| - I32x4Eq => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_eq(b).to_int().to_ne_bytes())).to_cf()?, |
332 |
| - F32x4Eq => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_eq(b).to_int().to_ne_bytes())).to_cf()?, |
333 |
| - F64x2Eq => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_eq(b).to_int().to_ne_bytes())).to_cf()?, |
334 |
| - |
335 |
| - I8x16Ne => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ne(b).to_int().to_ne_bytes())).to_cf()?, |
336 |
| - I16x8Ne => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ne(b).to_int().to_ne_bytes())).to_cf()?, |
337 |
| - I32x4Ne => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ne(b).to_int().to_ne_bytes())).to_cf()?, |
338 |
| - F32x4Ne => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ne(b).to_int().to_ne_bytes())).to_cf()?, |
339 |
| - F64x2Ne => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ne(b).to_int().to_ne_bytes())).to_cf()?, |
340 |
| - |
341 |
| - I8x16LtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, |
342 |
| - I16x8LtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, |
343 |
| - I32x4LtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, |
344 |
| - I64x2LtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, |
345 |
| - F32x4Lt => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, |
346 |
| - F64x2Lt => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, |
347 |
| - |
348 |
| - I8x16LtU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, |
349 |
| - I16x8LtU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, |
350 |
| - I32x4LtU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, |
351 |
| - I64x2GtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, |
352 |
| - F32x4Gt => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, |
353 |
| - F64x2Gt => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, |
354 |
| - |
355 |
| - I8x16GtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, |
356 |
| - I16x8GtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, |
357 |
| - I32x4GtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, |
358 |
| - I64x2LeS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, |
359 |
| - F32x4Le => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, |
360 |
| - F64x2Le => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, |
361 |
| - |
362 |
| - I8x16GtU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, |
363 |
| - I16x8GtU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, |
364 |
| - I32x4GtU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, |
365 |
| - I64x2GeS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ge(b).to_int().to_ne_bytes())).to_cf()?, |
366 |
| - F32x4Ge => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ge(b).to_int().to_ne_bytes())).to_cf()?, |
367 |
| - F64x2Ge => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ge(b).to_int().to_ne_bytes())).to_cf()?, |
368 |
| - |
369 |
| - I8x16LeS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, |
370 |
| - I16x8LeS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, |
371 |
| - I32x4LeS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, |
372 |
| - |
373 |
| - I8x16LeU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, |
374 |
| - I16x8LeU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, |
375 |
| - I32x4LeU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, |
376 |
| - |
377 |
| - I8x16GeU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ge(b).to_int().to_ne_bytes())).to_cf()?, |
378 |
| - I16x8GeU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ge(b).to_int().to_ne_bytes())).to_cf()?, |
379 |
| - I32x4GeU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ge(b).to_int().to_ne_bytes())).to_cf()?, |
| 321 | + I8x16Splat => self.stack.values.replace_top::<i32, i8x16>(|v| Ok(Simd::<i8, 16>::splat(v as i8))).to_cf()?, |
| 322 | + I16x8Splat => self.stack.values.replace_top::<i32, i16x8>(|v| Ok(Simd::<i16, 8>::splat(v as i16))).to_cf()?, |
| 323 | + I32x4Splat => self.stack.values.replace_top::<i32, i32x4>(|v| Ok(Simd::<i32, 4>::splat(v))).to_cf()?, |
| 324 | + I64x2Splat => self.stack.values.replace_top::<i64, i64x2>(|v| Ok(Simd::<i64, 2>::splat(v))).to_cf()?, |
| 325 | + F32x4Splat => self.stack.values.replace_top::<f32, f32x4>(|v| Ok(Simd::<f32, 4>::splat(v))).to_cf()?, |
| 326 | + F64x2Splat => self.stack.values.replace_top::<f64, f64x2>(|v| Ok(Simd::<f64, 2>::splat(v))).to_cf()?, |
| 327 | + |
| 328 | + I8x16Eq => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?, |
| 329 | + I16x8Eq => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?, |
| 330 | + I32x4Eq => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?, |
| 331 | + F32x4Eq => self.stack.values.calculate::<f32x4, _>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?, |
| 332 | + F64x2Eq => self.stack.values.calculate::<f64x2, _>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?, |
| 333 | + |
| 334 | + I8x16Ne => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?, |
| 335 | + I16x8Ne => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?, |
| 336 | + I32x4Ne => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?, |
| 337 | + F32x4Ne => self.stack.values.calculate::<f32x4, _>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?, |
| 338 | + F64x2Ne => self.stack.values.calculate::<f64x2, _>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?, |
| 339 | + |
| 340 | + I8x16LtS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, |
| 341 | + I16x8LtS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, |
| 342 | + I32x4LtS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, |
| 343 | + I64x2LtS => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, |
| 344 | + I8x16LtU => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, |
| 345 | + I16x8LtU => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, |
| 346 | + I32x4LtU => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, |
| 347 | + F32x4Lt => self.stack.values.calculate::<f32x4, _>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, |
| 348 | + F64x2Lt => self.stack.values.calculate::<f64x2, _>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, |
| 349 | + |
| 350 | + I64x2GtS => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, |
| 351 | + F32x4Gt => self.stack.values.calculate::<f32x4, _>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, |
| 352 | + F64x2Gt => self.stack.values.calculate::<f64x2, _>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, |
| 353 | + |
| 354 | + I8x16GtS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, |
| 355 | + I16x8GtS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, |
| 356 | + I32x4GtS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, |
| 357 | + I64x2LeS => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, |
| 358 | + F32x4Le => self.stack.values.calculate::<f32x4,_>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, |
| 359 | + F64x2Le => self.stack.values.calculate::<f64x2,_>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, |
| 360 | + |
| 361 | + I8x16GtU => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, |
| 362 | + I16x8GtU => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, |
| 363 | + I32x4GtU => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, |
| 364 | + I64x2GeS => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?, |
| 365 | + F32x4Ge => self.stack.values.calculate::<f32x4,_>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?, |
| 366 | + F64x2Ge => self.stack.values.calculate::<f64x2,_>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?, |
| 367 | + |
| 368 | + I8x16LeS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, |
| 369 | + I16x8LeS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, |
| 370 | + I32x4LeS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, |
| 371 | + |
| 372 | + I8x16LeU => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, |
| 373 | + I16x8LeU => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, |
| 374 | + I32x4LeU => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, |
| 375 | + |
| 376 | + I8x16GeU => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?, |
| 377 | + I16x8GeU => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?, |
| 378 | + I32x4GeU => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?, |
| 379 | + |
| 380 | + I8x16Abs => self.stack.values.replace_top_same::<i8x16>(|a| Ok(a.abs())).to_cf()?, |
| 381 | + I16x8Abs => self.stack.values.replace_top_same::<i16x8>(|a| Ok(a.abs())).to_cf()?, |
| 382 | + I32x4Abs => self.stack.values.replace_top_same::<i32x4>(|a| Ok(a.abs())).to_cf()?, |
| 383 | + I64x2Abs => self.stack.values.replace_top_same::<i64x2>(|a| Ok(a.abs())).to_cf()?, |
380 | 384 |
|
381 | 385 | i => return ControlFlow::Break(Some(Error::UnsupportedFeature(format!("unimplemented opcode: {i:?}")))),
|
382 | 386 | };
|
|
0 commit comments