Skip to content

Implement more SIMD instructions #510

@dcodeIO

Description

@dcodeIO

#508 adds an initial set of SIMD operations as built-in functions that map directly to WebAssembly instructions. Given those as a starting point, it should be relatively straight forward to add the remaining ones.

Instruction Built-in Status
v128.const i8x16 (=v128), i16x8, i32x4, i64x2, f32x4, f64x2 done
i8x16.splat v128.splat<i8> + alias done
i16x8.splat v128.splat<i16> + alias done
i32x4.splat v128.splat<i32> + alias done
i64x2.splat v128.splat<i64> + alias done
f32x4.splat v128.splat<f32> + alias done
f64x2.splat v128.splat<f64> + alias done
v128.load i8x16 (=v128), i16x8, i32x4, i64x2, f32x4, f64x2 done
v128.store i8x16 (=v128), i16x8, i32x4, i64x2, f32x4, f64x2 done
i8x16.extract_lane_s v128.extract_lane<i8> + alias done
i8x16.extract_lane_u v128.extract_lane<u8> + alias done
i16x8.extract_lane_s v128.extract_lane<i16> + alias done
i16x8.extract_lane_u v128.extract_lane<u16> + alias done
i32x4.extract_lane v128.extract_lane<i/u32> + alias done
i64x2.extract_lane v128.extract_lane<i/u64> + alias done
f32x4.extract_lane v128.extract_lane<f32> + alias done
f64x2.extract_lane v128.extract_lane<f64> + alias done
i8x16.replace_lane v128.replace_lane<i/u8> + alias done
i16x8.replace_lane v128.replace_lane<i/u16> + alias done
i32x4.replace_lane v128.replace_lane<i/u32> + alias done
i64x2.replace_lane v128.replace_lane<i/u64> + alias done
f32x4.replace_lane v128.replace_lane<f32> + alias done
f64x2.replace_lane v128.replace_lane<f64> + alias done
i8x16.shuffle v128.shuffle<i/u8/16/32/f32/64> + aliases done
i8x16.bitselect v128.bitselect<i/u8/16/32/f32/64> + aliases done
i8x16.any_true v128.any_true<i/u8> + alias done
i16x8.any_true v128.any_true<i/u16> + alias done
i32x4.any_true v128.any_true<i/u32> + alias done
i64x2.any_true v128.any_true<i/u64> + alias done
i8x16.all_true v128.all_true<i/u8> + alias done
i16x8.all_true v128.all_true<i/u16> + alias done
i32x4.all_true v128.all_true<i/u32> + alias done
i64x2.all_true v128.all_true<i/u64> + alias done
i8x16.shl v128.shl<i/u8> + alias done
i16x8.shl v128.shl<i/u16> + alias done
i32x4.shl v128.shl<i/u32> + alias done
i64x2.shl v128.shl<i/u64> + alias done
i8x16.shr v128.shr<i/u8> + alias done
i16x8.shr v128.shr<i/u16> + alias done
i32x4.shr v128.shr<i/u32> + alias done
i64x2.shr v128.shr<i/u64> + alias done
i8x16.and v128.and<i/u8> + alias done
i16x8.and v128.and<i/u16> + alias done
i32x4.and v128.and<i/u32> + alias done
i64x2.and v128.and<i/u64> + alias done
i8x16.or v128.or<i/u8> + alias done
i16x8.or v128.or<i/u16> + alias done
i32x4.or v128.or<i/u32> + alias done
i64x2.or v128.or<i/u64> + alias done
i8x16.xor v128.xor<i/u8> + alias done
i16x8.xor v128.xor<i/u16> + alias done
i32x4.xor v128.xor<i/u32> + alias done
i64x2.xor v128.xor<i/u64> + alias done
i8x16.not v128.not<i/u8> + alias done
i16x8.not v128.not<i/u16> + alias done
i32x4.not v128.not<i/u32> + alias done
i64x2.not v128.not<i/u64> + alias done
i8x16.neg v128.neg<i/u8> + alias done
i16x8.neg v128.neg<i/u16> + alias done
i32x4.neg v128.neg<i/u32> + alias done
i64x2.neg v128.neg<i/u64> + alias done
f32x4.neg v128.neg<f32> + alias done
f64x2.neg v128.neg<f64> + alias done
i8x16.add v128.add<i/u8> + alias done
i16x8.add v128.add<i/u16> + alias done
i32x4.add v128.add<i/u32> + alias done
i64x2.add v128.add<i/u64> + alias done
f32x4.add v128.add<f32> + alias done
f64x2.add v128.add<f64> + alias done
i8x16.sub v128.sub<i/u8> + alias done
i16x8.sub v128.sub<i/u16> + alias done
i32x4.sub v128.sub<i/u32> + alias done
i64x2.sub v128.sub<i/u64> + alias done
f32x4.sub v128.sub<f32> + alias done
f64x2.sub v128.sub<f64> + alias done
i8x16.mul v128.mul<i/u8> + alias done
i16x8.mul v128.mul<i/u16> + alias done
i32x4.mul v128.mul<i/u32> + alias done
i64x2.mul v128.mul<i/u64> + alias done
f32x4.mul v128.mul<f32> + alias done
f64x2.mul v128.mul<f64> + alias done
f32x4.div v128.div<f32> + alias done
f64x2.div v128.div<f64> + alias done
f32x4.min v128.min<f32> + alias done
f64x2.min v128.min<f64> + alias done
f32x4.max v128.max<f32> + alias done
f64x2.max v128.max<f64> + alias done
i8x16.add_saturate v128.add_saturate<i/u8> + alias done
i16x8.add_saturate v128.add_saturate<i/u16> + alias done
i8x16.sub_saturate v128.sub_saturate<i/u8> + alias done
i16x8.sub_saturate v128.sub_saturate<i/u16> + alias done
... ... todo

See also: https://github.com/WebAssembly/simd/blob/master/proposals/simd/SIMD.md

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions