Use empscripten replacement for _mm_mul_epi32

This commit is contained in:
Colin Murphy
2023-01-23 16:50:36 -05:00
parent ffec2ff6f2
commit 6f9bbcd56b
6 changed files with 69 additions and 60 deletions
+19 -16
View File
@@ -97,16 +97,16 @@ unsafe fn horiz_convolution_four_rows(
let source = wasm32_utils::load_v128(src_rows[i], x);
let l0l1_i64x2 = i8x16_swizzle(source, L0L1_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(l0l1_i64x2, coeff01_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(l0l1_i64x2, coeff01_i64x2));
let l2l3_i64x2 = i8x16_swizzle(source, L2L3_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(l2l3_i64x2, coeff23_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(l2l3_i64x2, coeff23_i64x2));
let l4l5_i64x2 = i8x16_swizzle(source, L4L5_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(l4l5_i64x2, coeff45_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(l4l5_i64x2, coeff45_i64x2));
let l6l7_i64x2 = i8x16_swizzle(source, L6L7_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(l6l7_i64x2, coeff67_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(l6l7_i64x2, coeff67_i64x2));
ll_sum[i] = sum;
}
@@ -125,10 +125,10 @@ unsafe fn horiz_convolution_four_rows(
let source = wasm32_utils::load_v128(src_rows[i], x);
let l0l1_i64x2 = i8x16_swizzle(source, L0L1_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(l0l1_i64x2, coeff01_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(l0l1_i64x2, coeff01_i64x2));
let l2l3_i64x2 = i8x16_swizzle(source, L2L3_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(l2l3_i64x2, coeff23_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(l2l3_i64x2, coeff23_i64x2));
ll_sum[i] = sum;
}
@@ -143,7 +143,10 @@ unsafe fn horiz_convolution_four_rows(
for i in 0..4 {
let source = wasm32_utils::load_v128(src_rows[i], x);
let l_i64x2 = i8x16_swizzle(source, L0L1_SHUFFLE);
ll_sum[i] = i64x2_add(ll_sum[i], i64x2_mul(l_i64x2, coeff01_i64x2));
ll_sum[i] = i64x2_add(
ll_sum[i],
wasm32_utils::i64x2_mul_lo(l_i64x2, coeff01_i64x2),
);
}
x += 2;
}
@@ -153,7 +156,7 @@ unsafe fn horiz_convolution_four_rows(
for i in 0..4 {
let pixel = (*src_rows[i].get_unchecked(x)).0 as i64;
let source = i64x2(pixel, 0);
ll_sum[i] = i64x2_add(ll_sum[i], i64x2_mul(source, coeff01_i64x2));
ll_sum[i] = i64x2_add(ll_sum[i], wasm32_utils::i64x2_mul_lo(source, coeff01_i64x2));
}
}
@@ -220,16 +223,16 @@ unsafe fn horiz_convolution_one_row(
let source = wasm32_utils::load_v128(src_row, x);
let l_i64x2 = i8x16_swizzle(source, L01_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff01_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(l_i64x2, coeff01_i64x2));
let l_i64x2 = i8x16_swizzle(source, L23_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff23_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(l_i64x2, coeff23_i64x2));
let l_i64x2 = i8x16_swizzle(source, L45_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff45_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(l_i64x2, coeff45_i64x2));
let l_i64x2 = i8x16_swizzle(source, L67_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff67_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(l_i64x2, coeff67_i64x2));
x += 8;
}
@@ -244,10 +247,10 @@ unsafe fn horiz_convolution_one_row(
let source = wasm32_utils::load_v128(src_row, x);
let l_i64x2 = i8x16_swizzle(source, L01_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff01_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(l_i64x2, coeff01_i64x2));
let l_i64x2 = i8x16_swizzle(source, L23_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff23_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(l_i64x2, coeff23_i64x2));
x += 4;
}
@@ -260,7 +263,7 @@ unsafe fn horiz_convolution_one_row(
let source = wasm32_utils::load_v128(src_row, x);
let l_i64x2 = i8x16_swizzle(source, L01_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff01_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(l_i64x2, coeff01_i64x2));
x += 2;
}
@@ -269,7 +272,7 @@ unsafe fn horiz_convolution_one_row(
let coeff01_i64x2 = i64x2(k as i64, 0);
let pixel = (*src_row.get_unchecked(x)).0 as i64;
let source = i64x2(pixel, 0);
ll_sum = i64x2_add(ll_sum, i64x2_mul(source, coeff01_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(source, coeff01_i64x2));
}
v128_store((&mut ll_buf).as_mut_ptr() as *mut v128, ll_sum);
+14 -14
View File
@@ -98,16 +98,16 @@ unsafe fn horiz_convolution_four_rows(
let source = wasm32_utils::load_v128(src_rows[i], x);
let p_i64x2 = i8x16_swizzle(source, P0_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(p_i64x2, coeff0_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(p_i64x2, coeff0_i64x2));
let p_i64x2 = i8x16_swizzle(source, P1_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(p_i64x2, coeff1_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(p_i64x2, coeff1_i64x2));
let p_i64x2 = i8x16_swizzle(source, P2_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(p_i64x2, coeff2_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(p_i64x2, coeff2_i64x2));
let p_i64x2 = i8x16_swizzle(source, P3_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(p_i64x2, coeff3_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(p_i64x2, coeff3_i64x2));
ll_sum[i] = sum;
}
@@ -126,10 +126,10 @@ unsafe fn horiz_convolution_four_rows(
let source = wasm32_utils::loadl_i64(src_rows[i], x);
let p_i64x2 = i8x16_swizzle(source, P0_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(p_i64x2, coeff0_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(p_i64x2, coeff0_i64x2));
let p_i64x2 = i8x16_swizzle(source, P1_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(p_i64x2, coeff1_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(p_i64x2, coeff1_i64x2));
ll_sum[i] = sum;
}
@@ -141,7 +141,7 @@ unsafe fn horiz_convolution_four_rows(
for i in 0..4 {
let source = wasm32_utils::loadl_i32(src_rows[i], x);
let p_i64x2 = i8x16_swizzle(source, P0_SHUFFLE);
ll_sum[i] = i64x2_add(ll_sum[i], i64x2_mul(p_i64x2, coeff0_i64x2));
ll_sum[i] = i64x2_add(ll_sum[i], wasm32_utils::i64x2_mul_lo(p_i64x2, coeff0_i64x2));
}
}
@@ -210,16 +210,16 @@ unsafe fn horiz_convolution_one_row(
let source = wasm32_utils::load_v128(src_row, x);
let p_i64x2 = i8x16_swizzle(source, P0_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff0_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(p_i64x2, coeff0_i64x2));
let p_i64x2 = i8x16_swizzle(source, P1_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff1_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(p_i64x2, coeff1_i64x2));
let p_i64x2 = i8x16_swizzle(source, P2_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff2_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(p_i64x2, coeff2_i64x2));
let p_i64x2 = i8x16_swizzle(source, P3_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff3_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(p_i64x2, coeff3_i64x2));
x += 4;
}
@@ -234,10 +234,10 @@ unsafe fn horiz_convolution_one_row(
let source = wasm32_utils::loadl_i64(src_row, x);
let p_i64x2 = i8x16_swizzle(source, P0_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff0_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(p_i64x2, coeff0_i64x2));
let p_i64x2 = i8x16_swizzle(source, P1_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff1_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(p_i64x2, coeff1_i64x2));
x += 2;
}
@@ -247,7 +247,7 @@ unsafe fn horiz_convolution_one_row(
let source = wasm32_utils::loadl_i32(src_row, x);
let p_i64x2 = i8x16_swizzle(source, P0_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff0_i64x2));
ll_sum = i64x2_add(ll_sum, wasm32_utils::i64x2_mul_lo(p_i64x2, coeff0_i64x2));
}
v128_store((&mut ll_buf).as_mut_ptr() as *mut v128, ll_sum);
+10 -10
View File
@@ -98,13 +98,13 @@ unsafe fn horiz_convolution_8u4x(
let source = wasm32_utils::load_v128(src_rows[i], x);
let rg0_i64x2 = i8x16_swizzle(source, RG0_SHUFFLE);
rg_sum[i] = i64x2_add(rg_sum[i], i64x2_mul(rg0_i64x2, coeff0_i64x2));
rg_sum[i] = i64x2_add(rg_sum[i], wasm32_utils::i64x2_mul_lo(rg0_i64x2, coeff0_i64x2));
let rg1_i64x2 = i8x16_swizzle(source, RG1_SHUFFLE);
rg_sum[i] = i64x2_add(rg_sum[i], i64x2_mul(rg1_i64x2, coeff1_i64x2));
rg_sum[i] = i64x2_add(rg_sum[i], wasm32_utils::i64x2_mul_lo(rg1_i64x2, coeff1_i64x2));
let bb_i64x2 = i8x16_swizzle(source, BB_SHUFFLE);
bb_sum[i] = i64x2_add(bb_sum[i], i64x2_mul(bb_i64x2, coeff_i64x2));
bb_sum[i] = i64x2_add(bb_sum[i], wasm32_utils::i64x2_mul_lo(bb_i64x2, coeff_i64x2));
}
x += 2;
}
@@ -116,9 +116,9 @@ unsafe fn horiz_convolution_8u4x(
for i in 0..4 {
let &pixel = src_rows[i].get_unchecked(x);
let rg_i64x2 = i64x2(pixel.0[0] as i64, pixel.0[1] as i64);
rg_sum[i] = i64x2_add(rg_sum[i], i64x2_mul(rg_i64x2, coeff_i64x2));
rg_sum[i] = i64x2_add(rg_sum[i], wasm32_utils::i64x2_mul_lo(rg_i64x2, coeff_i64x2));
let bb_i64x2 = i64x2(pixel.0[2] as i64, 0);
bb_sum[i] = i64x2_add(bb_sum[i], i64x2_mul(bb_i64x2, coeff_i64x2));
bb_sum[i] = i64x2_add(bb_sum[i], wasm32_utils::i64x2_mul_lo(bb_i64x2, coeff_i64x2));
}
x += 1;
}
@@ -193,13 +193,13 @@ unsafe fn horiz_convolution_8u(
let source = wasm32_utils::load_v128(src_row, x);
let rg0_i64x2 = i8x16_swizzle(source, RG0_SHUFFLE);
rg_sum = i64x2_add(rg_sum, i64x2_mul(rg0_i64x2, coeff0_i64x2));
rg_sum = i64x2_add(rg_sum, wasm32_utils::i64x2_mul_lo(rg0_i64x2, coeff0_i64x2));
let rg1_i64x2 = i8x16_swizzle(source, RG1_SHUFFLE);
rg_sum = i64x2_add(rg_sum, i64x2_mul(rg1_i64x2, coeff1_i64x2));
rg_sum = i64x2_add(rg_sum, wasm32_utils::i64x2_mul_lo(rg1_i64x2, coeff1_i64x2));
let bb_i64x2 = i8x16_swizzle(source, BB_SHUFFLE);
bb_sum = i64x2_add(bb_sum, i64x2_mul(bb_i64x2, coeff_i64x2));
bb_sum = i64x2_add(bb_sum, wasm32_utils::i64x2_mul_lo(bb_i64x2, coeff_i64x2));
x += 2;
}
}
@@ -209,9 +209,9 @@ unsafe fn horiz_convolution_8u(
let &pixel = src_row.get_unchecked(x);
let rg_i64x2 = i64x2(pixel.0[0] as i64, pixel.0[1] as i64);
rg_sum = i64x2_add(rg_sum, i64x2_mul(rg_i64x2, coeff_i64x2));
rg_sum = i64x2_add(rg_sum, wasm32_utils::i64x2_mul_lo(rg_i64x2, coeff_i64x2));
let bb_i64x2 = i64x2(pixel.0[2] as i64, 0);
bb_sum = i64x2_add(bb_sum, i64x2_mul(bb_i64x2, coeff_i64x2));
bb_sum = i64x2_add(bb_sum, wasm32_utils::i64x2_mul_lo(bb_i64x2, coeff_i64x2));
x += 1;
}
+12 -12
View File
@@ -97,16 +97,16 @@ unsafe fn horiz_convolution_four_rows(
let source = wasm32_utils::load_v128(src_rows[i], x);
let mut sum = rg_sum[i];
let rg_i64x2 = i8x16_swizzle(source, RG0_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(rg_i64x2, coeff0_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(rg_i64x2, coeff0_i64x2));
let rg_i64x2 = i8x16_swizzle(source, RG1_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(rg_i64x2, coeff1_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(rg_i64x2, coeff1_i64x2));
rg_sum[i] = sum;
let mut sum = ba_sum[i];
let ba_i64x2 = i8x16_swizzle(source, BA0_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(ba_i64x2, coeff0_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(ba_i64x2, coeff0_i64x2));
let ba_i64x2 = i8x16_swizzle(source, BA1_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(ba_i64x2, coeff1_i64x2));
sum = i64x2_add(sum, wasm32_utils::i64x2_mul_lo(ba_i64x2, coeff1_i64x2));
ba_sum[i] = sum;
}
x += 2;
@@ -117,9 +117,9 @@ unsafe fn horiz_convolution_four_rows(
for i in 0..4 {
let source = wasm32_utils::loadl_i64(src_rows[i], x);
let rg_i64x2 = i8x16_swizzle(source, RG0_SHUFFLE);
rg_sum[i] = i64x2_add(rg_sum[i], i64x2_mul(rg_i64x2, coeff0_i64x2));
rg_sum[i] = i64x2_add(rg_sum[i], wasm32_utils::i64x2_mul_lo(rg_i64x2, coeff0_i64x2));
let ba_i64x2 = i8x16_swizzle(source, BA0_SHUFFLE);
ba_sum[i] = i64x2_add(ba_sum[i], i64x2_mul(ba_i64x2, coeff0_i64x2));
ba_sum[i] = i64x2_add(ba_sum[i], wasm32_utils::i64x2_mul_lo(ba_i64x2, coeff0_i64x2));
}
}
@@ -194,14 +194,14 @@ unsafe fn horiz_convolution_one_row(
let source = wasm32_utils::load_v128(src_row, x);
let rg_i64x2 = i8x16_swizzle(source, RG0_SHUFFLE);
rg_sum = i64x2_add(rg_sum, i64x2_mul(rg_i64x2, coeff0_i64x2));
rg_sum = i64x2_add(rg_sum, wasm32_utils::i64x2_mul_lo(rg_i64x2, coeff0_i64x2));
let rg_i64x2 = i8x16_swizzle(source, RG1_SHUFFLE);
rg_sum = i64x2_add(rg_sum, i64x2_mul(rg_i64x2, coeff1_i64x2));
rg_sum = i64x2_add(rg_sum, wasm32_utils::i64x2_mul_lo(rg_i64x2, coeff1_i64x2));
let ba_i64x2 = i8x16_swizzle(source, BA0_SHUFFLE);
ba_sum = i64x2_add(ba_sum, i64x2_mul(ba_i64x2, coeff0_i64x2));
ba_sum = i64x2_add(ba_sum, wasm32_utils::i64x2_mul_lo(ba_i64x2, coeff0_i64x2));
let ba_i64x2 = i8x16_swizzle(source, BA1_SHUFFLE);
ba_sum = i64x2_add(ba_sum, i64x2_mul(ba_i64x2, coeff1_i64x2));
ba_sum = i64x2_add(ba_sum, wasm32_utils::i64x2_mul_lo(ba_i64x2, coeff1_i64x2));
x += 2;
}
@@ -210,9 +210,9 @@ unsafe fn horiz_convolution_one_row(
let coeff0_i64x2 = i64x2_splat(k as i64);
let source = wasm32_utils::loadl_i64(src_row, x);
let rg_i64x2 = i8x16_swizzle(source, RG0_SHUFFLE);
rg_sum = i64x2_add(rg_sum, i64x2_mul(rg_i64x2, coeff0_i64x2));
rg_sum = i64x2_add(rg_sum, wasm32_utils::i64x2_mul_lo(rg_i64x2, coeff0_i64x2));
let ba_i64x2 = i8x16_swizzle(source, BA0_SHUFFLE);
ba_sum = i64x2_add(ba_sum, i64x2_mul(ba_i64x2, coeff0_i64x2));
ba_sum = i64x2_add(ba_sum, wasm32_utils::i64x2_mul_lo(ba_i64x2, coeff0_i64x2));
}
v128_store((&mut rg_buf).as_mut_ptr() as *mut v128, rg_sum);
+8 -8
View File
@@ -85,7 +85,7 @@ unsafe fn vert_convolution_into_one_row_u16<T: PixelExt<Component = u16>>(
let source = wasm32_utils::load_v128(src_rows[r], src_x + x * 8);
for i in 0..4 {
let c_i64x2 = i8x16_swizzle(source, c_shuffles[i]);
sums[i][x] = i64x2_add(sums[i][x], i64x2_mul(c_i64x2, coeff_i64x2));
sums[i][x] = i64x2_add(sums[i][x], wasm32_utils::i64x2_mul_lo(c_i64x2, coeff_i64x2));
}
}
}
@@ -101,7 +101,7 @@ unsafe fn vert_convolution_into_one_row_u16<T: PixelExt<Component = u16>>(
let source = wasm32_utils::load_v128(components, src_x + x * 8);
for i in 0..4 {
let c_i64x2 = i8x16_swizzle(source, c_shuffles[i]);
sums[i][x] = i64x2_add(sums[i][x], i64x2_mul(c_i64x2, coeff_i64x2));
sums[i][x] = i64x2_add(sums[i][x], wasm32_utils::i64x2_mul_lo(c_i64x2, coeff_i64x2));
}
}
}
@@ -140,7 +140,7 @@ unsafe fn vert_convolution_into_one_row_u16<T: PixelExt<Component = u16>>(
let source = wasm32_utils::load_v128(src_rows[r], src_x);
for i in 0..4 {
let c_i64x2 = i8x16_swizzle(source, c_shuffles[i]);
sums[i] = i64x2_add(sums[i], i64x2_mul(c_i64x2, coeffs_i64[r]));
sums[i] = i64x2_add(sums[i], wasm32_utils::i64x2_mul_lo(c_i64x2, coeffs_i64[r]));
}
}
y += 2;
@@ -153,7 +153,7 @@ unsafe fn vert_convolution_into_one_row_u16<T: PixelExt<Component = u16>>(
let source = wasm32_utils::load_v128(components, src_x);
for i in 0..4 {
let c_i64x2 = i8x16_swizzle(source, c_shuffles[i]);
sums[i] = i64x2_add(sums[i], i64x2_mul(c_i64x2, coeff_i64x2));
sums[i] = i64x2_add(sums[i], wasm32_utils::i64x2_mul_lo(c_i64x2, coeff_i64x2));
}
}
@@ -191,9 +191,9 @@ unsafe fn vert_convolution_into_one_row_u16<T: PixelExt<Component = u16>>(
for r in 0..2 {
let comp_x4 = src_rows[r].get_unchecked(src_x..src_x + 4);
let c_i64x2 = i64x2(comp_x4[0] as i64, comp_x4[1] as i64);
c01 = i64x2_add(c01, i64x2_mul(c_i64x2, coeffs_i64[r]));
c01 = i64x2_add(c01, wasm32_utils::i64x2_mul_lo(c_i64x2, coeffs_i64[r]));
let c_i64x2 = i64x2(comp_x4[2] as i64, comp_x4[3] as i64);
c23 = i64x2_add(c23, i64x2_mul(c_i64x2, coeffs_i64[r]));
c23 = i64x2_add(c23, wasm32_utils::i64x2_mul_lo(c_i64x2, coeffs_i64[r]));
}
y += 2;
}
@@ -205,9 +205,9 @@ unsafe fn vert_convolution_into_one_row_u16<T: PixelExt<Component = u16>>(
let comp_x4 = components.get_unchecked(src_x..src_x + 4);
let c_i64x2 = i64x2(comp_x4[0] as i64, comp_x4[1] as i64);
c01 = i64x2_add(c01, i64x2_mul(c_i64x2, coeff_i64x2));
c01 = i64x2_add(c01, wasm32_utils::i64x2_mul_lo(c_i64x2, coeff_i64x2));
let c_i64x2 = i64x2(comp_x4[2] as i64, comp_x4[3] as i64);
c23 = i64x2_add(c23, i64x2_mul(c_i64x2, coeff_i64x2));
c23 = i64x2_add(c23, wasm32_utils::i64x2_mul_lo(c_i64x2, coeff_i64x2));
}
let mut dst_ptr = dst_chunk.as_mut_ptr();
+6
View File
@@ -68,3 +68,9 @@ pub unsafe fn u16x8_mul_hi(a: v128, b: v128) -> v128 {
let hi = u32x4_extmul_high_u16x8(a, b);
i16x8_shuffle::<1, 3, 5, 7, 9, 11, 13, 15>(lo, hi)
}
#[inline(always)]
pub unsafe fn i64x2_mul_lo(a: v128, b: v128) -> v128 {
const SHUFFLE: v128 = i8x16(0, 1, 2, 3, 8, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1);
i64x2_extmul_low_i32x4(i8x16_swizzle(a, SHUFFLE), i8x16_swizzle(b, SHUFFLE))
}