• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use core::arch::wasm32::*;
2 
v128_from_f32x4(a: [f32; 4]) -> v1283 pub const fn v128_from_f32x4(a: [f32; 4]) -> v128 {
4     f32x4(a[0], a[1], a[2], a[3])
5 }
6 
7 /// Calculates the vector 3 dot product and returns answer in x lane of v128.
8 #[inline(always)]
dot3_in_x(lhs: v128, rhs: v128) -> v1289 pub(crate) fn dot3_in_x(lhs: v128, rhs: v128) -> v128 {
10     let x2_y2_z2_w2 = f32x4_mul(lhs, rhs);
11     let y2_0_0_0 = i32x4_shuffle::<1, 0, 0, 0>(x2_y2_z2_w2, x2_y2_z2_w2);
12     let z2_0_0_0 = i32x4_shuffle::<2, 0, 0, 0>(x2_y2_z2_w2, x2_y2_z2_w2);
13     let x2y2_0_0_0 = f32x4_add(x2_y2_z2_w2, y2_0_0_0);
14     f32x4_add(x2y2_0_0_0, z2_0_0_0)
15 }
16 
17 /// Calculates the vector 4 dot product and returns answer in x lane of v128.
18 #[inline(always)]
dot4_in_x(lhs: v128, rhs: v128) -> v12819 pub(crate) fn dot4_in_x(lhs: v128, rhs: v128) -> v128 {
20     let x2_y2_z2_w2 = f32x4_mul(lhs, rhs);
21     let z2_w2_0_0 = i32x4_shuffle::<2, 3, 0, 0>(x2_y2_z2_w2, x2_y2_z2_w2);
22     let x2z2_y2w2_0_0 = f32x4_add(x2_y2_z2_w2, z2_w2_0_0);
23     let y2w2_0_0_0 = i32x4_shuffle::<1, 0, 0, 0>(x2z2_y2w2_0_0, x2z2_y2w2_0_0);
24     f32x4_add(x2z2_y2w2_0_0, y2w2_0_0_0)
25 }
26 
27 #[inline]
dot3(lhs: v128, rhs: v128) -> f3228 pub(crate) fn dot3(lhs: v128, rhs: v128) -> f32 {
29     f32x4_extract_lane::<0>(dot3_in_x(lhs, rhs))
30 }
31 
32 #[inline]
dot3_into_v128(lhs: v128, rhs: v128) -> v12833 pub(crate) fn dot3_into_v128(lhs: v128, rhs: v128) -> v128 {
34     let dot_in_x = dot3_in_x(lhs, rhs);
35     i32x4_shuffle::<0, 0, 0, 0>(dot_in_x, dot_in_x)
36 }
37 
38 #[inline]
dot4(lhs: v128, rhs: v128) -> f3239 pub(crate) fn dot4(lhs: v128, rhs: v128) -> f32 {
40     f32x4_extract_lane::<0>(dot4_in_x(lhs, rhs))
41 }
42 
43 #[inline]
dot4_into_v128(lhs: v128, rhs: v128) -> v12844 pub(crate) fn dot4_into_v128(lhs: v128, rhs: v128) -> v128 {
45     let dot_in_x = dot4_in_x(lhs, rhs);
46     i32x4_shuffle::<0, 0, 0, 0>(dot_in_x, dot_in_x)
47 }
48