Skip to content

Commit 7806d39

Browse files
chore: progress on more simd instructions
Signed-off-by: Henry Gressmann <[email protected]>
1 parent 904aa39 commit 7806d39

File tree

2 files changed

+102
-7
lines changed

2 files changed

+102
-7
lines changed

crates/tinywasm/src/interpreter/executor.rs

+101-6
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,13 @@ impl<'store, 'stack> Executor<'store, 'stack> {
470470
I32x4MaxU => self.stack.values.calculate_same::<u32x4>(|a, b| Ok(a.simd_max(b))).to_cf()?,
471471

472472
I64x2Mul => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a * b)).to_cf()?,
473+
I16x8Mul => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a * b)).to_cf()?,
474+
I32x4Mul => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a * b)).to_cf()?,
475+
476+
I8x16NarrowI16x8S => unimplemented!(),
477+
I8x16NarrowI16x8U => unimplemented!(),
478+
I16x8NarrowI32x4S => unimplemented!(),
479+
I16x8NarrowI32x4U => unimplemented!(),
473480

474481
I8x16AddSatS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.saturating_add(b))).to_cf()?,
475482
I16x8AddSatS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.saturating_add(b))).to_cf()?,
@@ -480,8 +487,72 @@ impl<'store, 'stack> Executor<'store, 'stack> {
480487
I8x16SubSatU => self.stack.values.calculate_same::<u8x16>(|a, b| Ok(a.saturating_sub(b))).to_cf()?,
481488
I16x8SubSatU => self.stack.values.calculate_same::<u16x8>(|a, b| Ok(a.saturating_sub(b))).to_cf()?,
482489

483-
I16x8Mul => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a * b)).to_cf()?,
484-
I32x4Mul => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a * b)).to_cf()?,
490+
I16x8ExtAddPairwiseI8x16S => unimplemented!(),
491+
I16x8ExtAddPairwiseI8x16U => unimplemented!(),
492+
I32x4ExtAddPairwiseI16x8S => unimplemented!(),
493+
I32x4ExtAddPairwiseI16x8U => unimplemented!(),
494+
495+
I16x8ExtMulLowI8x16S => unimplemented!(),
496+
I16x8ExtMulLowI8x16U => unimplemented!(),
497+
I16x8ExtMulHighI8x16S => unimplemented!(),
498+
I16x8ExtMulHighI8x16U => unimplemented!(),
499+
I32x4ExtMulLowI16x8S => unimplemented!(),
500+
I32x4ExtMulLowI16x8U => unimplemented!(),
501+
I32x4ExtMulHighI16x8S => unimplemented!(),
502+
I32x4ExtMulHighI16x8U => unimplemented!(),
503+
I64x2ExtMulLowI32x4S => unimplemented!(),
504+
I64x2ExtMulLowI32x4U => unimplemented!(),
505+
I64x2ExtMulHighI32x4S => unimplemented!(),
506+
I64x2ExtMulHighI32x4U => unimplemented!(),
507+
508+
I16x8ExtendLowI8x16S => unimplemented!(),
509+
I16x8ExtendLowI8x16U => unimplemented!(),
510+
I16x8ExtendHighI8x16S => unimplemented!(),
511+
I16x8ExtendHighI8x16U => unimplemented!(),
512+
I32x4ExtendLowI16x8S => unimplemented!(),
513+
I32x4ExtendLowI16x8U => unimplemented!(),
514+
I32x4ExtendHighI16x8S => unimplemented!(),
515+
I32x4ExtendHighI16x8U => unimplemented!(),
516+
I64x2ExtendLowI32x4S => unimplemented!(),
517+
I64x2ExtendLowI32x4U => unimplemented!(),
518+
I64x2ExtendHighI32x4S => unimplemented!(),
519+
I64x2ExtendHighI32x4U => unimplemented!(),
520+
521+
I8x16Popcnt => self.stack.values.replace_top::<i8x16, _>(|v| Ok(v.count_ones())).to_cf()?,
522+
523+
I16x8Q15MulrSatS => self.stack.values.calculate_same::<i16x8>(|a, b| {
524+
let subq15mulr = |a,b| {
525+
let a = a as i32;
526+
let b = b as i32;
527+
let r = (a * b + 0x4000) >> 15;
528+
if r > i16::MAX as i32 {
529+
i16::MAX
530+
} else if r < i16::MIN as i32 {
531+
i16::MIN
532+
} else {
533+
r as i16
534+
}
535+
};
536+
Ok(Simd::<i16, 8>::from_array([
537+
subq15mulr(a[0], b[0]),
538+
subq15mulr(a[1], b[1]),
539+
subq15mulr(a[2], b[2]),
540+
subq15mulr(a[3], b[3]),
541+
subq15mulr(a[4], b[4]),
542+
subq15mulr(a[5], b[5]),
543+
subq15mulr(a[6], b[6]),
544+
subq15mulr(a[7], b[7]),
545+
]))
546+
}).to_cf()?,
547+
548+
I32x4DotI16x8S => self.stack.values.calculate::<i16x8, i32x4>(|a, b| {
549+
Ok(Simd::<i32, 4>::from_array([
550+
i32::from(a[0] * b[0] + a[1] * b[1]),
551+
i32::from(a[2] * b[2] + a[3] * b[3]),
552+
i32::from(a[4] * b[4] + a[5] * b[5]),
553+
i32::from(a[6] * b[6] + a[7] * b[7]),
554+
]))
555+
}).to_cf()?,
485556

486557
F32x4Ceil => self.stack.values.replace_top_same::<f32x4>(|v| Ok(v.ceil())).to_cf()?,
487558
F64x2Ceil => self.stack.values.replace_top_same::<f64x2>(|v| Ok(v.ceil())).to_cf()?,
@@ -508,10 +579,34 @@ impl<'store, 'stack> Executor<'store, 'stack> {
508579
F32x4Max => self.stack.values.calculate_same::<f32x4>(|a, b| Ok(a.simd_max(b))).to_cf()?,
509580
F64x2Max => self.stack.values.calculate_same::<f64x2>(|a, b| Ok(a.simd_max(b))).to_cf()?,
510581

511-
F32x4PMin => unimplemented!(),
512-
F32x4PMax => unimplemented!(),
513-
F64x2PMin => unimplemented!(),
514-
F64x2PMax => unimplemented!(),
582+
F32x4PMin => self.stack.values.calculate_same::<f32x4>(|a, b| {
583+
Ok(Simd::<f32, 4>::from_array([
584+
if b[0] < a[0] { b[0] } else { a[0]},
585+
if b[1] < a[1] { b[1] } else { a[1]},
586+
if b[2] < a[2] { b[2] } else { a[2]},
587+
if b[3] < a[3] { b[3] } else { a[3]},
588+
]))
589+
}).to_cf()?,
590+
F32x4PMax => self.stack.values.calculate_same::<f32x4>(|a, b| {
591+
Ok(Simd::<f32, 4>::from_array([
592+
if b[0] > a[0] { b[0] } else { a[0]},
593+
if b[1] > a[1] { b[1] } else { a[1]},
594+
if b[2] > a[2] { b[2] } else { a[2]},
595+
if b[3] > a[3] { b[3] } else { a[3]},
596+
]))
597+
}).to_cf()?,
598+
F64x2PMin => self.stack.values.calculate_same::<f64x2>(|a, b| {
599+
Ok(Simd::<f64, 2>::from_array([
600+
if b[0] < a[0] { b[0] } else { a[0]},
601+
if b[1] < a[1] { b[1] } else { a[1]},
602+
]))
603+
}).to_cf()?,
604+
F64x2PMax => self.stack.values.calculate_same::<f64x2>(|a, b| {
605+
Ok(Simd::<f64, 2>::from_array([
606+
if b[0] > a[0] { b[0] } else { a[0]},
607+
if b[1] > a[1] { b[1] } else { a[1]},
608+
]))
609+
}).to_cf()?,
515610

516611
// not correct
517612
I32x4TruncSatF32x4S => self.stack.values.replace_top::<f32x4, f32x4>(|v| Ok(v.trunc())).to_cf()?,
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
0.8.0,1300,24679,[{"name":"simd_address.wast","passed":4,"failed":45},{"name":"simd_align.wast","passed":46,"failed":54},{"name":"simd_bit_shift.wast","passed":39,"failed":213},{"name":"simd_bitwise.wast","passed":28,"failed":141},{"name":"simd_boolean.wast","passed":16,"failed":261},{"name":"simd_const.wast","passed":301,"failed":456},{"name":"simd_conversions.wast","passed":48,"failed":234},{"name":"simd_f32x4.wast","passed":16,"failed":774},{"name":"simd_f32x4_arith.wast","passed":16,"failed":1806},{"name":"simd_f32x4_cmp.wast","passed":24,"failed":2583},{"name":"simd_f32x4_pmin_pmax.wast","passed":14,"failed":3873},{"name":"simd_f32x4_rounding.wast","passed":24,"failed":177},{"name":"simd_f64x2.wast","passed":8,"failed":795},{"name":"simd_f64x2_arith.wast","passed":16,"failed":1809},{"name":"simd_f64x2_cmp.wast","passed":24,"failed":2661},{"name":"simd_f64x2_pmin_pmax.wast","passed":14,"failed":3873},{"name":"simd_f64x2_rounding.wast","passed":24,"failed":177},{"name":"simd_i16x8_arith.wast","passed":11,"failed":183},{"name":"simd_i16x8_arith2.wast","passed":19,"failed":153},{"name":"simd_i16x8_cmp.wast","passed":30,"failed":435},{"name":"simd_i16x8_extadd_pairwise_i8x16.wast","passed":4,"failed":17},{"name":"simd_i16x8_extmul_i8x16.wast","passed":12,"failed":105},{"name":"simd_i16x8_q15mulr_sat_s.wast","passed":3,"failed":27},{"name":"simd_i16x8_sat_arith.wast","passed":16,"failed":206},{"name":"simd_i32x4_arith.wast","passed":11,"failed":183},{"name":"simd_i32x4_arith2.wast","passed":26,"failed":123},{"name":"simd_i32x4_cmp.wast","passed":40,"failed":435},{"name":"simd_i32x4_dot_i16x8.wast","passed":3,"failed":27},{"name":"simd_i32x4_extadd_pairwise_i16x8.wast","passed":4,"failed":17},{"name":"simd_i32x4_extmul_i16x8.wast","passed":12,"failed":105},{"name":"simd_i32x4_trunc_sat_f32x4.wast","passed":4,"failed":103},{"name":"simd_i32x4_trunc_sat_f64x2.wast","passed":4,"failed":103},{"name":"simd_i64x2_arith.wast","passed":11,"failed":189},{"name":"simd_i64x2_arith2.wast","passed":2,"failed":23},{"name":"simd_i64x2_cmp.wast","passed":10,"failed":103},{"name":"simd_i64x2_extmul_i32x4.wast","passed":12,"failed":105},{"name":"simd_i8x16_arith.wast","passed":8,"failed":123},{"name":"simd_i8x16_arith2.wast","passed":25,"failed":186},{"name":"simd_i8x16_cmp.wast","passed":30,"failed":415},{"name":"simd_i8x16_sat_arith.wast","passed":24,"failed":190},{"name":"simd_int_to_int_extend.wast","passed":24,"failed":229},{"name":"simd_lane.wast","passed":189,"failed":286},{"name":"simd_linking.wast","passed":0,"failed":3},{"name":"simd_load.wast","passed":8,"failed":31},{"name":"simd_load16_lane.wast","passed":3,"failed":33},{"name":"simd_load32_lane.wast","passed":3,"failed":21},{"name":"simd_load64_lane.wast","passed":3,"failed":13},{"name":"simd_load8_lane.wast","passed":3,"failed":49},{"name":"simd_load_extend.wast","passed":18,"failed":86},{"name":"simd_load_splat.wast","passed":12,"failed":114},{"name":"simd_load_zero.wast","passed":10,"failed":29},{"name":"simd_splat.wast","passed":23,"failed":162},{"name":"simd_store.wast","passed":9,"failed":19},{"name":"simd_store16_lane.wast","passed":3,"failed":33},{"name":"simd_store32_lane.wast","passed":3,"failed":21},{"name":"simd_store64_lane.wast","passed":3,"failed":13},{"name":"simd_store8_lane.wast","passed":3,"failed":49}]
2-
0.9.0-alpha.0,15151,10829,[{"name":"simd_address.wast","passed":49,"failed":0},{"name":"simd_align.wast","passed":100,"failed":0},{"name":"simd_bit_shift.wast","passed":252,"failed":0},{"name":"simd_bitwise.wast","passed":169,"failed":0},{"name":"simd_boolean.wast","passed":277,"failed":0},{"name":"simd_const.wast","passed":757,"failed":0},{"name":"simd_conversions.wast","passed":56,"failed":226},{"name":"simd_f32x4.wast","passed":629,"failed":161},{"name":"simd_f32x4_arith.wast","passed":1357,"failed":465},{"name":"simd_f32x4_cmp.wast","passed":2607,"failed":0},{"name":"simd_f32x4_pmin_pmax.wast","passed":15,"failed":3872},{"name":"simd_f32x4_rounding.wast","passed":148,"failed":53},{"name":"simd_f64x2.wast","passed":639,"failed":164},{"name":"simd_f64x2_arith.wast","passed":1360,"failed":465},{"name":"simd_f64x2_cmp.wast","passed":2685,"failed":0},{"name":"simd_f64x2_pmin_pmax.wast","passed":15,"failed":3872},{"name":"simd_f64x2_rounding.wast","passed":148,"failed":53},{"name":"simd_i16x8_arith.wast","passed":194,"failed":0},{"name":"simd_i16x8_arith2.wast","passed":142,"failed":30},{"name":"simd_i16x8_cmp.wast","passed":436,"failed":29},{"name":"simd_i16x8_extadd_pairwise_i8x16.wast","passed":5,"failed":16},{"name":"simd_i16x8_extmul_i8x16.wast","passed":13,"failed":104},{"name":"simd_i16x8_q15mulr_sat_s.wast","passed":4,"failed":26},{"name":"simd_i16x8_sat_arith.wast","passed":222,"failed":0},{"name":"simd_i32x4_arith.wast","passed":194,"failed":0},{"name":"simd_i32x4_arith2.wast","passed":149,"failed":0},{"name":"simd_i32x4_cmp.wast","passed":450,"failed":25},{"name":"simd_i32x4_dot_i16x8.wast","passed":4,"failed":26},{"name":"simd_i32x4_extadd_pairwise_i16x8.wast","passed":5,"failed":16},{"name":"simd_i32x4_extmul_i16x8.wast","passed":13,"failed":104},{"name":"simd_i32x4_trunc_sat_f32x4.wast","passed":17,"failed":90},{"name":"simd_i32x4_trunc_sat_f64x2.wast","passed":5,"failed":102},{"name":"simd_i64x2_arith.wast","passed":200,"failed":0},{"name":"simd_i64x2_arith2.wast","passed":25,"failed":0},{"name":"simd_i64x2_cmp.wast","passed":97,"failed":16},{"name":"simd_i64x2_extmul_i32x4.wast","passed":13,"failed":104},{"name":"simd_i8x16_arith.wast","passed":131,"failed":0},{"name":"simd_i8x16_arith2.wast","passed":148,"failed":63},{"name":"simd_i8x16_cmp.wast","passed":409,"failed":36},{"name":"simd_i8x16_sat_arith.wast","passed":214,"failed":0},{"name":"simd_int_to_int_extend.wast","passed":25,"failed":228},{"name":"simd_lane.wast","passed":331,"failed":144},{"name":"simd_linking.wast","passed":3,"failed":0},{"name":"simd_load.wast","passed":37,"failed":2},{"name":"simd_load16_lane.wast","passed":36,"failed":0},{"name":"simd_load32_lane.wast","passed":24,"failed":0},{"name":"simd_load64_lane.wast","passed":16,"failed":0},{"name":"simd_load8_lane.wast","passed":52,"failed":0},{"name":"simd_load_extend.wast","passed":20,"failed":84},{"name":"simd_load_splat.wast","passed":14,"failed":112},{"name":"simd_load_zero.wast","passed":12,"failed":27},{"name":"simd_memory-multi.wast","passed":1,"failed":0},{"name":"simd_splat.wast","passed":183,"failed":2},{"name":"simd_store.wast","passed":28,"failed":0},{"name":"simd_store16_lane.wast","passed":4,"failed":32},{"name":"simd_store32_lane.wast","passed":4,"failed":20},{"name":"simd_store64_lane.wast","passed":4,"failed":12},{"name":"simd_store8_lane.wast","passed":4,"failed":48}]
2+
0.9.0-alpha.0,22962,3018,[{"name":"simd_address.wast","passed":49,"failed":0},{"name":"simd_align.wast","passed":100,"failed":0},{"name":"simd_bit_shift.wast","passed":252,"failed":0},{"name":"simd_bitwise.wast","passed":169,"failed":0},{"name":"simd_boolean.wast","passed":277,"failed":0},{"name":"simd_const.wast","passed":757,"failed":0},{"name":"simd_conversions.wast","passed":56,"failed":226},{"name":"simd_f32x4.wast","passed":629,"failed":161},{"name":"simd_f32x4_arith.wast","passed":1357,"failed":465},{"name":"simd_f32x4_cmp.wast","passed":2607,"failed":0},{"name":"simd_f32x4_pmin_pmax.wast","passed":3887,"failed":0},{"name":"simd_f32x4_rounding.wast","passed":148,"failed":53},{"name":"simd_f64x2.wast","passed":639,"failed":164},{"name":"simd_f64x2_arith.wast","passed":1360,"failed":465},{"name":"simd_f64x2_cmp.wast","passed":2685,"failed":0},{"name":"simd_f64x2_pmin_pmax.wast","passed":3887,"failed":0},{"name":"simd_f64x2_rounding.wast","passed":148,"failed":53},{"name":"simd_i16x8_arith.wast","passed":194,"failed":0},{"name":"simd_i16x8_arith2.wast","passed":142,"failed":30},{"name":"simd_i16x8_cmp.wast","passed":436,"failed":29},{"name":"simd_i16x8_extadd_pairwise_i8x16.wast","passed":5,"failed":16},{"name":"simd_i16x8_extmul_i8x16.wast","passed":13,"failed":104},{"name":"simd_i16x8_q15mulr_sat_s.wast","passed":30,"failed":0},{"name":"simd_i16x8_sat_arith.wast","passed":222,"failed":0},{"name":"simd_i32x4_arith.wast","passed":194,"failed":0},{"name":"simd_i32x4_arith2.wast","passed":149,"failed":0},{"name":"simd_i32x4_cmp.wast","passed":450,"failed":25},{"name":"simd_i32x4_dot_i16x8.wast","passed":14,"failed":16},{"name":"simd_i32x4_extadd_pairwise_i16x8.wast","passed":5,"failed":16},{"name":"simd_i32x4_extmul_i16x8.wast","passed":13,"failed":104},{"name":"simd_i32x4_trunc_sat_f32x4.wast","passed":17,"failed":90},{"name":"simd_i32x4_trunc_sat_f64x2.wast","passed":5,"failed":102},{"name":"simd_i64x2_arith.wast","passed":200,"failed":0},{"name":"simd_i64x2_arith2.wast","passed":25,"failed":0},{"name":"simd_i64x2_cmp.wast","passed":97,"failed":16},{"name":"simd_i64x2_extmul_i32x4.wast","passed":13,"failed":104},{"name":"simd_i8x16_arith.wast","passed":131,"failed":0},{"name":"simd_i8x16_arith2.wast","passed":179,"failed":32},{"name":"simd_i8x16_cmp.wast","passed":409,"failed":36},{"name":"simd_i8x16_sat_arith.wast","passed":214,"failed":0},{"name":"simd_int_to_int_extend.wast","passed":25,"failed":228},{"name":"simd_lane.wast","passed":331,"failed":144},{"name":"simd_linking.wast","passed":3,"failed":0},{"name":"simd_load.wast","passed":37,"failed":2},{"name":"simd_load16_lane.wast","passed":36,"failed":0},{"name":"simd_load32_lane.wast","passed":24,"failed":0},{"name":"simd_load64_lane.wast","passed":16,"failed":0},{"name":"simd_load8_lane.wast","passed":52,"failed":0},{"name":"simd_load_extend.wast","passed":20,"failed":84},{"name":"simd_load_splat.wast","passed":14,"failed":112},{"name":"simd_load_zero.wast","passed":12,"failed":27},{"name":"simd_memory-multi.wast","passed":1,"failed":0},{"name":"simd_splat.wast","passed":183,"failed":2},{"name":"simd_store.wast","passed":28,"failed":0},{"name":"simd_store16_lane.wast","passed":4,"failed":32},{"name":"simd_store32_lane.wast","passed":4,"failed":20},{"name":"simd_store64_lane.wast","passed":4,"failed":12},{"name":"simd_store8_lane.wast","passed":4,"failed":48}]

0 commit comments

Comments
 (0)