Improve efficiency

This commit is contained in:
Colin
2023-01-23 16:46:56 -05:00
committed by Colin Murphy
parent 14e0a15d40
commit c23cab9df8
11 changed files with 171 additions and 171 deletions
+5 -5
View File
@@ -82,9 +82,9 @@ unsafe fn multiplies_alpha_4_pixels(pixels: v128) -> v128 {
|L0 A0 | |L1 A1 | |L2 A2 | |L3 A3 |
|0001 0203| |0405 0607| |0809 1011| |1213 1415|
*/
let factor_mask = i8x16(2, 3, 2, 3, 6, 7, 6, 7, 10, 11, 10, 11, 14, 15, 14, 15);
const FACTOR_MASK: v128 = i8x16(2, 3, 2, 3, 6, 7, 6, 7, 10, 11, 10, 11, 14, 15, 14, 15);
let factor_pixels = u8x16_swizzle(pixels, factor_mask);
let factor_pixels = u8x16_swizzle(pixels, FACTOR_MASK);
let factor_pixels = v128_or(factor_pixels, max_alpha);
let src_i32_lo = i16x8_shuffle::<0, 8, 1, 9, 2, 10, 3, 11>(pixels, zero);
@@ -196,12 +196,12 @@ unsafe fn divide_alpha_4_pixels(pixels: v128) -> v128 {
|L0 A0 | |L1 A1 | |L2 A2 | |L3 A3 |
|0001 0203| |0405 0607| |0809 1011| |1213 1415|
*/
let alpha32_sh = i8x16(2, 3, -1, -1, 6, 7, -1, -1, 10, 11, -1, -1, 14, 15, -1, -1);
const ALPHA32_SH: v128 = i8x16(2, 3, -1, -1, 6, 7, -1, -1, 10, 11, -1, -1, 14, 15, -1, -1);
let alpha_f32x4 = f32x4_convert_i32x4(u8x16_swizzle(pixels, alpha32_sh));
let alpha_f32x4 = f32x4_convert_i32x4(u8x16_swizzle(pixels, ALPHA32_SH));
let luma_f32x4 = f32x4_convert_i32x4(v128_and(pixels, luma_mask));
let scaled_luma_f32x4 = f32x4_mul(luma_f32x4, alpha_max);
let divided_luma_u32x4 = u32x4_trunc_sat_f32x4(f32x4_min(
let divided_luma_u32x4 = u32x4_trunc_sat_f32x4(f32x4_pmin(
f32x4_div(scaled_luma_f32x4, alpha_f32x4),
alpha_scale_max,
));
+8 -8
View File
@@ -81,9 +81,9 @@ unsafe fn multiply_alpha_2_pixels(pixels: v128) -> v128 {
|R0 G0 B0 A0 | |R1 G1 B1 A1 |
|0001 0203 0405 0607| |0809 1011 1213 1415|
*/
let factor_mask = i8x16(6, 7, 6, 7, 6, 7, 6, 7, 14, 15, 14, 15, 14, 15, 14, 15);
const FACTOR_MASK: v128 = i8x16(6, 7, 6, 7, 6, 7, 6, 7, 14, 15, 14, 15, 14, 15, 14, 15);
let factor_pixels = u8x16_swizzle(pixels, factor_mask);
let factor_pixels = u8x16_swizzle(pixels, FACTOR_MASK);
let factor_pixels = v128_or(factor_pixels, max_alpha);
let src_i32_lo = i16x8_shuffle::<0, 8, 1, 9, 2, 10, 3, 11>(pixels, zero);
@@ -191,13 +191,13 @@ unsafe fn divide_alpha_2_pixels(pixels: v128) -> v128 {
|R0 G0 B0 A0 | |R1 G1 B1 A1 |
|0001 0203 0405 0607| |0809 1011 1213 1415|
*/
let alpha32_sh0 = i8x16(6, 7, -1, -1, 6, 7, -1, -1, 6, 7, -1, -1, 6, 7, -1, -1);
let alpha32_sh1 = i8x16(
const ALPHA32_SH0: v128 = i8x16(6, 7, -1, -1, 6, 7, -1, -1, 6, 7, -1, -1, 6, 7, -1, -1);
const ALPHA32_SH1: v128 = i8x16(
14, 15, -1, -1, 14, 15, -1, -1, 14, 15, -1, -1, 14, 15, -1, -1,
);
let alpha0_f32x4 = f32x4_convert_i32x4(u8x16_swizzle(pixels, alpha32_sh0));
let alpha1_f32x4 = f32x4_convert_i32x4(u8x16_swizzle(pixels, alpha32_sh1));
let alpha0_f32x4 = f32x4_convert_i32x4(u8x16_swizzle(pixels, ALPHA32_SH0));
let alpha1_f32x4 = f32x4_convert_i32x4(u8x16_swizzle(pixels, ALPHA32_SH1));
let pix0_f32x4 = f32x4_convert_i32x4(i16x8_shuffle::<0, 8, 1, 9, 2, 10, 3, 11>(pixels, zero));
let pix1_f32x4 = f32x4_convert_i32x4(i16x8_shuffle::<4, 12, 5, 13, 6, 14, 7, 15>(pixels, zero));
@@ -205,11 +205,11 @@ unsafe fn divide_alpha_2_pixels(pixels: v128) -> v128 {
let scaled_pix0_f32x4 = f32x4_mul(pix0_f32x4, alpha_max);
let scaled_pix1_f32x4 = f32x4_mul(pix1_f32x4, alpha_max);
let divided_pix0_i32x4 = u32x4_trunc_sat_f32x4(f32x4_min(
let divided_pix0_i32x4 = u32x4_trunc_sat_f32x4(f32x4_pmin(
f32x4_div(scaled_pix0_f32x4, alpha0_f32x4),
alpha_scale_max,
));
let divided_pix1_i32x4 = u32x4_trunc_sat_f32x4(f32x4_min(
let divided_pix1_i32x4 = u32x4_trunc_sat_f32x4(f32x4_pmin(
f32x4_div(scaled_pix1_f32x4, alpha1_f32x4),
alpha_scale_max,
));
+8 -8
View File
@@ -75,9 +75,9 @@ unsafe fn multiplies_alpha_8_pixels(pixels: v128) -> v128 {
|L A | |L A | |L A | |L A | |L A | |L A | |L A | |L A |
|00 01| |02 03| |04 05| |06 07| |08 09| |10 11| |12 13| |14 15|
*/
let factor_mask = i8x16(1, 1, 3, 3, 5, 5, 7, 7, 9, 9, 11, 11, 13, 13, 15, 15);
const FACTOR_MASK: v128 = i8x16(1, 1, 3, 3, 5, 5, 7, 7, 9, 9, 11, 11, 13, 13, 15, 15);
let factor_pixels = i8x16_swizzle(pixels, factor_mask);
let factor_pixels = i8x16_swizzle(pixels, FACTOR_MASK);
let factor_pixels = v128_or(factor_pixels, max_alpha);
let src_i16_lo =
@@ -196,8 +196,8 @@ pub(crate) unsafe fn divide_alpha_row_inplace(row: &mut [U8x2]) {
unsafe fn divide_alpha_8_pixels(pixels: v128) -> v128 {
let alpha_mask = i16x8_splat(0xff00u16 as i16);
let luma_mask = i16x8_splat(0xff);
let alpha32_sh_lo = i8x16(1, -1, -1, -1, 3, -1, -1, -1, 5, -1, -1, -1, 7, -1, -1, -1);
let alpha32_sh_hi = i8x16(
const ALPHA32_SH_LO: v128 = i8x16(1, -1, -1, -1, 3, -1, -1, -1, 5, -1, -1, -1, 7, -1, -1, -1);
const ALPHA32_SH_HI: v128 = i8x16(
9, -1, -1, -1, 11, -1, -1, -1, 13, -1, -1, -1, 15, -1, -1, -1,
);
let alpha_scale = f32x4_splat(255.0 * 256.0);
@@ -207,15 +207,15 @@ unsafe fn divide_alpha_8_pixels(pixels: v128) -> v128 {
// and other potential test cases will (probably?) break.
let alpha_scale_max = f32x4_splat(2147483648f32);
let alpha_lo_f32 = f32x4_convert_u32x4(i8x16_swizzle(pixels, alpha32_sh_lo));
let alpha_lo_f32 = f32x4_convert_u32x4(i8x16_swizzle(pixels, ALPHA32_SH_LO));
// trunc_sat will always round down. Adding f32x4_nearest would match _mm_cvtps_ep32 exactly,
// but would add extra instructions.
let scaled_alpha_lo_u32 = u32x4_trunc_sat_f32x4(f32x4_min(
let scaled_alpha_lo_u32 = u32x4_trunc_sat_f32x4(f32x4_pmin(
f32x4_div(alpha_scale, alpha_lo_f32),
alpha_scale_max,
));
let alpha_hi_f32 = f32x4_convert_u32x4(i8x16_swizzle(pixels, alpha32_sh_hi));
let scaled_alpha_hi_u32 = u32x4_trunc_sat_f32x4(f32x4_min(
let alpha_hi_f32 = f32x4_convert_u32x4(i8x16_swizzle(pixels, ALPHA32_SH_HI));
let scaled_alpha_hi_u32 = u32x4_trunc_sat_f32x4(f32x4_pmin(
f32x4_div(alpha_scale, alpha_hi_f32),
alpha_scale_max,
));
+8 -8
View File
@@ -70,12 +70,12 @@ pub(crate) unsafe fn multiply_alpha_row_inplace(row: &mut [U8x4]) {
unsafe fn multiply_alpha_4_pixels(pixels: v128) -> v128 {
let zero = i64x2_splat(0);
let half = i16x8_splat(128);
let max_alpha = i32x4_splat(MAX_A);
const MAX_A: i32 = 0xff000000u32 as i32;
let max_alpha = i32x4_splat(MAX_A);
let factor_mask = i8x16(3, 3, 3, 3, 7, 7, 7, 7, 11, 11, 11, 11, 15, 15, 15, 15);
const FACTOR_MASK: v128 = i8x16(3, 3, 3, 3, 7, 7, 7, 7, 11, 11, 11, 11, 15, 15, 15, 15);
let factor_pixels = u8x16_swizzle(pixels, factor_mask);
let factor_pixels = u8x16_swizzle(pixels, FACTOR_MASK);
let factor_pixels = v128_or(factor_pixels, max_alpha);
let pix1 =
@@ -193,16 +193,16 @@ pub(crate) unsafe fn divide_alpha_row_inplace(row: &mut [U8x4]) {
unsafe fn divide_alpha_4_pixels(src_pixels: v128) -> v128 {
let zero = i64x2_splat(0);
let alpha_mask = i32x4_splat(0xff000000u32 as i32);
let shuffle1 = i8x16(0, 1, 0, 1, 0, 1, 0, 1, 4, 5, 4, 5, 4, 5, 4, 5);
let shuffle2 = i8x16(8, 9, 8, 9, 8, 9, 8, 9, 12, 13, 12, 13, 12, 13, 12, 13);
const SHUFFLE1: v128 = i8x16(0, 1, 0, 1, 0, 1, 0, 1, 4, 5, 4, 5, 4, 5, 4, 5);
const SHUFFLE2: v128 = i8x16(8, 9, 8, 9, 8, 9, 8, 9, 12, 13, 12, 13, 12, 13, 12, 13);
let alpha_scale = f32x4_splat(255.0 * 256.0);
let alpha_scale_max = f32x4_splat(2147483648f32);
let alpha_f32 = f32x4_convert_i32x4(u32x4_shr(src_pixels, 24));
let scaled_alpha_f32 = f32x4_div(alpha_scale, alpha_f32);
let scaled_alpha_u32 = u32x4_trunc_sat_f32x4(f32x4_min(scaled_alpha_f32, alpha_scale_max));
let mma0 = u8x16_swizzle(scaled_alpha_u32, shuffle1);
let mma1 = u8x16_swizzle(scaled_alpha_u32, shuffle2);
let scaled_alpha_u32 = u32x4_trunc_sat_f32x4(f32x4_pmin(scaled_alpha_f32, alpha_scale_max));
let mma0 = u8x16_swizzle(scaled_alpha_u32, SHUFFLE1);
let mma1 = u8x16_swizzle(scaled_alpha_u32, SHUFFLE2);
let pix0 =
u8x16_shuffle::<0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23>(zero, src_pixels);
+22 -22
View File
@@ -70,10 +70,10 @@ unsafe fn horiz_convolution_four_rows(
12, 13, -1, -1, -1, -1, -1, -1, 14, 15, -1, -1, -1, -1, -1, -1
*/
let l0l1_shuffle = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
let l2l3_shuffle = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1, -1);
let l4l5_shuffle = i8x16(8, 9, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
let l6l7_shuffle = i8x16(
const L0L1_SHUFFLE: v128 = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
const L2L3_SHUFFLE: v128 = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1, -1);
const L4L5_SHUFFLE: v128 = i8x16(8, 9, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
const L6L7_SHUFFLE: v128 = i8x16(
12, 13, -1, -1, -1, -1, -1, -1, 14, 15, -1, -1, -1, -1, -1, -1,
);
@@ -96,16 +96,16 @@ unsafe fn horiz_convolution_four_rows(
let mut sum = ll_sum[i];
let source = wasm32_utils::load_v128(src_rows[i], x);
let l0l1_i64x2 = i8x16_swizzle(source, l0l1_shuffle);
let l0l1_i64x2 = i8x16_swizzle(source, L0L1_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(l0l1_i64x2, coeff01_i64x2));
let l2l3_i64x2 = i8x16_swizzle(source, l2l3_shuffle);
let l2l3_i64x2 = i8x16_swizzle(source, L2L3_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(l2l3_i64x2, coeff23_i64x2));
let l4l5_i64x2 = i8x16_swizzle(source, l4l5_shuffle);
let l4l5_i64x2 = i8x16_swizzle(source, L4L5_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(l4l5_i64x2, coeff45_i64x2));
let l6l7_i64x2 = i8x16_swizzle(source, l6l7_shuffle);
let l6l7_i64x2 = i8x16_swizzle(source, L6L7_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(l6l7_i64x2, coeff67_i64x2));
ll_sum[i] = sum;
@@ -124,10 +124,10 @@ unsafe fn horiz_convolution_four_rows(
let mut sum = ll_sum[i];
let source = wasm32_utils::load_v128(src_rows[i], x);
let l0l1_i64x2 = i8x16_swizzle(source, l0l1_shuffle);
let l0l1_i64x2 = i8x16_swizzle(source, L0L1_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(l0l1_i64x2, coeff01_i64x2));
let l2l3_i64x2 = i8x16_swizzle(source, l2l3_shuffle);
let l2l3_i64x2 = i8x16_swizzle(source, L2L3_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(l2l3_i64x2, coeff23_i64x2));
ll_sum[i] = sum;
@@ -142,7 +142,7 @@ unsafe fn horiz_convolution_four_rows(
let coeff01_i64x2 = i64x2(k[0] as i64, k[1] as i64);
for i in 0..4 {
let source = wasm32_utils::load_v128(src_rows[i], x);
let l_i64x2 = i8x16_swizzle(source, l0l1_shuffle);
let l_i64x2 = i8x16_swizzle(source, L0L1_SHUFFLE);
ll_sum[i] = i64x2_add(ll_sum[i], i64x2_mul(l_i64x2, coeff01_i64x2));
}
x += 2;
@@ -196,10 +196,10 @@ unsafe fn horiz_convolution_one_row(
12, 13, -1, -1, -1, -1, -1, -1, 14, 15, -1, -1, -1, -1, -1, -1
*/
let l01_shuffle = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
let l23_shuffle = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1, -1);
let l45_shuffle = i8x16(8, 9, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
let l67_shuffle = i8x16(
const L01_SHUFFLE: v128 = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
const L23_SHUFFLE: v128 = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1, -1);
const L45_SHUFFLE: v128 = i8x16(8, 9, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
const L67_SHUFFLE: v128 = i8x16(
12, 13, -1, -1, -1, -1, -1, -1, 14, 15, -1, -1, -1, -1, -1, -1,
);
@@ -219,16 +219,16 @@ unsafe fn horiz_convolution_one_row(
let source = wasm32_utils::load_v128(src_row, x);
let l_i64x2 = i8x16_swizzle(source, l01_shuffle);
let l_i64x2 = i8x16_swizzle(source, L01_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff01_i64x2));
let l_i64x2 = i8x16_swizzle(source, l23_shuffle);
let l_i64x2 = i8x16_swizzle(source, L23_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff23_i64x2));
let l_i64x2 = i8x16_swizzle(source, l45_shuffle);
let l_i64x2 = i8x16_swizzle(source, L45_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff45_i64x2));
let l_i64x2 = i8x16_swizzle(source, l67_shuffle);
let l_i64x2 = i8x16_swizzle(source, L67_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff67_i64x2));
x += 8;
@@ -243,10 +243,10 @@ unsafe fn horiz_convolution_one_row(
let source = wasm32_utils::load_v128(src_row, x);
let l_i64x2 = i8x16_swizzle(source, l01_shuffle);
let l_i64x2 = i8x16_swizzle(source, L01_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff01_i64x2));
let l_i64x2 = i8x16_swizzle(source, l23_shuffle);
let l_i64x2 = i8x16_swizzle(source, L23_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff23_i64x2));
x += 4;
@@ -259,7 +259,7 @@ unsafe fn horiz_convolution_one_row(
let coeff01_i64x2 = i64x2(k[0] as i64, k[1] as i64);
let source = wasm32_utils::load_v128(src_row, x);
let l_i64x2 = i8x16_swizzle(source, l01_shuffle);
let l_i64x2 = i8x16_swizzle(source, L01_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(l_i64x2, coeff01_i64x2));
x += 2;
+22 -22
View File
@@ -71,10 +71,10 @@ unsafe fn horiz_convolution_four_rows(
12, 13, -1, -1, -1, -1, -1, -1, 14, 15, -1, -1, -1, -1, -1, -1
*/
let p0_shuffle = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
let p1_shuffle = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1, -1);
let p2_shuffle = i8x16(8, 9, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
let p3_shuffle = i8x16(
const P0_SHUFFLE: v128 = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
const P1_SHUFFLE: v128 = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1, -1);
const P2_SHUFFLE: v128 = i8x16(8, 9, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
const P3_SHUFFLE: v128 = i8x16(
12, 13, -1, -1, -1, -1, -1, -1, 14, 15, -1, -1, -1, -1, -1, -1,
);
@@ -97,16 +97,16 @@ unsafe fn horiz_convolution_four_rows(
let mut sum = ll_sum[i];
let source = wasm32_utils::load_v128(src_rows[i], x);
let p_i64x2 = i8x16_swizzle(source, p0_shuffle);
let p_i64x2 = i8x16_swizzle(source, P0_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(p_i64x2, coeff0_i64x2));
let p_i64x2 = i8x16_swizzle(source, p1_shuffle);
let p_i64x2 = i8x16_swizzle(source, P1_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(p_i64x2, coeff1_i64x2));
let p_i64x2 = i8x16_swizzle(source, p2_shuffle);
let p_i64x2 = i8x16_swizzle(source, P2_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(p_i64x2, coeff2_i64x2));
let p_i64x2 = i8x16_swizzle(source, p3_shuffle);
let p_i64x2 = i8x16_swizzle(source, P3_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(p_i64x2, coeff3_i64x2));
ll_sum[i] = sum;
@@ -125,10 +125,10 @@ unsafe fn horiz_convolution_four_rows(
let mut sum = ll_sum[i];
let source = wasm32_utils::loadl_i64(src_rows[i], x);
let p_i64x2 = i8x16_swizzle(source, p0_shuffle);
let p_i64x2 = i8x16_swizzle(source, P0_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(p_i64x2, coeff0_i64x2));
let p_i64x2 = i8x16_swizzle(source, p1_shuffle);
let p_i64x2 = i8x16_swizzle(source, P1_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(p_i64x2, coeff1_i64x2));
ll_sum[i] = sum;
@@ -140,7 +140,7 @@ unsafe fn horiz_convolution_four_rows(
let coeff0_i64x2 = i64x2_splat(k as i64);
for i in 0..4 {
let source = wasm32_utils::loadl_i32(src_rows[i], x);
let p_i64x2 = i8x16_swizzle(source, p0_shuffle);
let p_i64x2 = i8x16_swizzle(source, P0_SHUFFLE);
ll_sum[i] = i64x2_add(ll_sum[i], i64x2_mul(p_i64x2, coeff0_i64x2));
}
}
@@ -186,10 +186,10 @@ unsafe fn horiz_convolution_one_row(
12, 13, -1, -1, -1, -1, -1, -1, 14, 15, -1, -1, -1, -1, -1, -1
*/
let p0_shuffle = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
let p1_shuffle = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1, -1);
let p2_shuffle = i8x16(8, 9, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
let p3_shuffle = i8x16(
const P0_SHUFFLE: v128 = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
const P1_SHUFFLE: v128 = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1, -1);
const P2_SHUFFLE: v128 = i8x16(8, 9, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
const P3_SHUFFLE: v128 = i8x16(
12, 13, -1, -1, -1, -1, -1, -1, 14, 15, -1, -1, -1, -1, -1, -1,
);
@@ -209,16 +209,16 @@ unsafe fn horiz_convolution_one_row(
let source = wasm32_utils::load_v128(src_row, x);
let p_i64x2 = i8x16_swizzle(source, p0_shuffle);
let p_i64x2 = i8x16_swizzle(source, P0_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff0_i64x2));
let p_i64x2 = i8x16_swizzle(source, p1_shuffle);
let p_i64x2 = i8x16_swizzle(source, P1_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff1_i64x2));
let p_i64x2 = i8x16_swizzle(source, p2_shuffle);
let p_i64x2 = i8x16_swizzle(source, P2_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff2_i64x2));
let p_i64x2 = i8x16_swizzle(source, p3_shuffle);
let p_i64x2 = i8x16_swizzle(source, P3_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff3_i64x2));
x += 4;
@@ -233,10 +233,10 @@ unsafe fn horiz_convolution_one_row(
let source = wasm32_utils::loadl_i64(src_row, x);
let p_i64x2 = i8x16_swizzle(source, p0_shuffle);
let p_i64x2 = i8x16_swizzle(source, P0_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff0_i64x2));
let p_i64x2 = i8x16_swizzle(source, p1_shuffle);
let p_i64x2 = i8x16_swizzle(source, P1_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff1_i64x2));
x += 2;
@@ -246,7 +246,7 @@ unsafe fn horiz_convolution_one_row(
let coeff0_i64x2 = i64x2_splat(k as i64);
let source = wasm32_utils::loadl_i32(src_row, x);
let p_i64x2 = i8x16_swizzle(source, p0_shuffle);
let p_i64x2 = i8x16_swizzle(source, P0_SHUFFLE);
ll_sum = i64x2_add(ll_sum, i64x2_mul(p_i64x2, coeff0_i64x2));
}
+12 -12
View File
@@ -71,9 +71,9 @@ unsafe fn horiz_convolution_8u4x(
*/
let rg0_shuffle = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
let rg1_shuffle = i8x16(6, 7, -1, -1, -1, -1, -1, -1, 8, 9, -1, -1, -1, -1, -1, -1);
let bb_shuffle = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
const RG0_SHUFFLE: v128 = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
const RG1_SHUFFLE: v128 = i8x16(6, 7, -1, -1, -1, -1, -1, -1, 8, 9, -1, -1, -1, -1, -1, -1);
const BB_SHUFFLE: v128 = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
let width = src_rows[0].len();
@@ -97,13 +97,13 @@ unsafe fn horiz_convolution_8u4x(
for i in 0..4 {
let source = wasm32_utils::load_v128(src_rows[i], x);
let rg0_i64x2 = i8x16_swizzle(source, rg0_shuffle);
let rg0_i64x2 = i8x16_swizzle(source, RG0_SHUFFLE);
rg_sum[i] = i64x2_add(rg_sum[i], i64x2_mul(rg0_i64x2, coeff0_i64x2));
let rg1_i64x2 = i8x16_swizzle(source, rg1_shuffle);
let rg1_i64x2 = i8x16_swizzle(source, RG1_SHUFFLE);
rg_sum[i] = i64x2_add(rg_sum[i], i64x2_mul(rg1_i64x2, coeff1_i64x2));
let bb_i64x2 = i8x16_swizzle(source, bb_shuffle);
let bb_i64x2 = i8x16_swizzle(source, BB_SHUFFLE);
bb_sum[i] = i64x2_add(bb_sum[i], i64x2_mul(bb_i64x2, coeff_i64x2));
}
x += 2;
@@ -164,9 +164,9 @@ unsafe fn horiz_convolution_8u(
*/
let rg0_shuffle = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
let rg1_shuffle = i8x16(6, 7, -1, -1, -1, -1, -1, -1, 8, 9, -1, -1, -1, -1, -1, -1);
let bb_shuffle = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
const RG0_SHUFFLE: v128 = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
const RG1_SHUFFLE: v128 = i8x16(6, 7, -1, -1, -1, -1, -1, -1, 8, 9, -1, -1, -1, -1, -1, -1);
const BB_SHUFFLE: v128 = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
let mut rg_buf = [0i64; 2];
let mut bb_buf = [0i64; 2];
@@ -192,13 +192,13 @@ unsafe fn horiz_convolution_8u(
let source = wasm32_utils::load_v128(src_row, x);
let rg0_i64x2 = i8x16_swizzle(source, rg0_shuffle);
let rg0_i64x2 = i8x16_swizzle(source, RG0_SHUFFLE);
rg_sum = i64x2_add(rg_sum, i64x2_mul(rg0_i64x2, coeff0_i64x2));
let rg1_i64x2 = i8x16_swizzle(source, rg1_shuffle);
let rg1_i64x2 = i8x16_swizzle(source, RG1_SHUFFLE);
rg_sum = i64x2_add(rg_sum, i64x2_mul(rg1_i64x2, coeff1_i64x2));
let bb_i64x2 = i8x16_swizzle(source, bb_shuffle);
let bb_i64x2 = i8x16_swizzle(source, BB_SHUFFLE);
bb_sum = i64x2_add(bb_sum, i64x2_mul(bb_i64x2, coeff_i64x2));
x += 2;
}
+20 -20
View File
@@ -72,10 +72,10 @@ unsafe fn horiz_convolution_four_rows(
12, 13, -1, -1, -1, -1, -1, -1, 14, 15, -1, -1, -1, -1, -1, -1
*/
let rg0_shuffle = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
let rg1_shuffle = i8x16(8, 9, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
let ba0_shuffle = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1, -1);
let ba1_shuffle = i8x16(
const RG0_SHUFFLE: v128 = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
const RG1_SHUFFLE: v128 = i8x16(8, 9, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
const BA0_SHUFFLE: v128 = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1, -1);
const BA1_SHUFFLE: v128 = i8x16(
12, 13, -1, -1, -1, -1, -1, -1, 14, 15, -1, -1, -1, -1, -1, -1,
);
@@ -96,16 +96,16 @@ unsafe fn horiz_convolution_four_rows(
for i in 0..4 {
let source = wasm32_utils::load_v128(src_rows[i], x);
let mut sum = rg_sum[i];
let rg_i64x2 = i8x16_swizzle(source, rg0_shuffle);
let rg_i64x2 = i8x16_swizzle(source, RG0_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(rg_i64x2, coeff0_i64x2));
let rg_i64x2 = i8x16_swizzle(source, rg1_shuffle);
let rg_i64x2 = i8x16_swizzle(source, RG1_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(rg_i64x2, coeff1_i64x2));
rg_sum[i] = sum;
let mut sum = ba_sum[i];
let ba_i64x2 = i8x16_swizzle(source, ba0_shuffle);
let ba_i64x2 = i8x16_swizzle(source, BA0_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(ba_i64x2, coeff0_i64x2));
let ba_i64x2 = i8x16_swizzle(source, ba1_shuffle);
let ba_i64x2 = i8x16_swizzle(source, BA1_SHUFFLE);
sum = i64x2_add(sum, i64x2_mul(ba_i64x2, coeff1_i64x2));
ba_sum[i] = sum;
}
@@ -116,9 +116,9 @@ unsafe fn horiz_convolution_four_rows(
let coeff0_i64x2 = i64x2_splat(k as i64);
for i in 0..4 {
let source = wasm32_utils::loadl_i64(src_rows[i], x);
let rg_i64x2 = i8x16_swizzle(source, rg0_shuffle);
let rg_i64x2 = i8x16_swizzle(source, RG0_SHUFFLE);
rg_sum[i] = i64x2_add(rg_sum[i], i64x2_mul(rg_i64x2, coeff0_i64x2));
let ba_i64x2 = i8x16_swizzle(source, ba0_shuffle);
let ba_i64x2 = i8x16_swizzle(source, BA0_SHUFFLE);
ba_sum[i] = i64x2_add(ba_sum[i], i64x2_mul(ba_i64x2, coeff0_i64x2));
}
}
@@ -171,10 +171,10 @@ unsafe fn horiz_convolution_one_row(
12, 13, -1, -1, -1, -1, -1, -1, 14, 15, -1, -1, -1, -1, -1, -1
*/
let rg0_shuffle = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
let rg1_shuffle = i8x16(8, 9, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
let ba0_shuffle = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1, -1);
let ba1_shuffle = i8x16(
const RG0_SHUFFLE: v128 = i8x16(0, 1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1);
const RG1_SHUFFLE: v128 = i8x16(8, 9, -1, -1, -1, -1, -1, -1, 10, 11, -1, -1, -1, -1, -1, -1);
const BA0_SHUFFLE: v128 = i8x16(4, 5, -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1, -1);
const BA1_SHUFFLE: v128 = i8x16(
12, 13, -1, -1, -1, -1, -1, -1, 14, 15, -1, -1, -1, -1, -1, -1,
);
@@ -193,14 +193,14 @@ unsafe fn horiz_convolution_one_row(
let source = wasm32_utils::load_v128(src_row, x);
let rg_i64x2 = i8x16_swizzle(source, rg0_shuffle);
let rg_i64x2 = i8x16_swizzle(source, RG0_SHUFFLE);
rg_sum = i64x2_add(rg_sum, i64x2_mul(rg_i64x2, coeff0_i64x2));
let rg_i64x2 = i8x16_swizzle(source, rg1_shuffle);
let rg_i64x2 = i8x16_swizzle(source, RG1_SHUFFLE);
rg_sum = i64x2_add(rg_sum, i64x2_mul(rg_i64x2, coeff1_i64x2));
let ba_i64x2 = i8x16_swizzle(source, ba0_shuffle);
let ba_i64x2 = i8x16_swizzle(source, BA0_SHUFFLE);
ba_sum = i64x2_add(ba_sum, i64x2_mul(ba_i64x2, coeff0_i64x2));
let ba_i64x2 = i8x16_swizzle(source, ba1_shuffle);
let ba_i64x2 = i8x16_swizzle(source, BA1_SHUFFLE);
ba_sum = i64x2_add(ba_sum, i64x2_mul(ba_i64x2, coeff1_i64x2));
x += 2;
@@ -209,9 +209,9 @@ unsafe fn horiz_convolution_one_row(
if let Some(&k) = coeffs.first() {
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);
let rg_i64x2 = i8x16_swizzle(source, RG0_SHUFFLE);
rg_sum = i64x2_add(rg_sum, i64x2_mul(rg_i64x2, coeff0_i64x2));
let ba_i64x2 = i8x16_swizzle(source, ba0_shuffle);
let ba_i64x2 = i8x16_swizzle(source, BA0_SHUFFLE);
ba_sum = i64x2_add(ba_sum, i64x2_mul(ba_i64x2, coeff0_i64x2));
}
+17 -17
View File
@@ -64,7 +64,7 @@ unsafe fn horiz_convolution_four_rows(
L: |-1 06| |-1 04| |-1 02| |-1 00|
*/
#[rustfmt::skip]
let sh1 = i8x16(
const SH1: v128 = i8x16(
0, -1, 2, -1, 4, -1, 6, -1, 1, -1, 3, -1, 5, -1, 7, -1
);
/*
@@ -72,7 +72,7 @@ unsafe fn horiz_convolution_four_rows(
L: |-1 14| |-1 12| |-1 10| |-1 08|
*/
#[rustfmt::skip]
let sh2 = i8x16(
const SH2: v128 = i8x16(
8, -1, 10, -1, 12, -1, 14, -1, 9, -1, 11, -1, 13, -1, 15, -1
);
@@ -91,9 +91,9 @@ unsafe fn horiz_convolution_four_rows(
for i in 0..4 {
let source = wasm32_utils::load_v128(src_rows[i], x);
let pix = i8x16_swizzle(source, sh1);
let pix = i8x16_swizzle(source, SH1);
let tmp_sum = i32x4_add(sss[i], i32x4_dot_i16x8(pix, mmk0));
let pix = i8x16_swizzle(source, sh2);
let pix = i8x16_swizzle(source, SH2);
sss[i] = i32x4_add(tmp_sum, i32x4_dot_i16x8(pix, mmk1));
}
x += 8;
@@ -107,7 +107,7 @@ unsafe fn horiz_convolution_four_rows(
for i in 0..4 {
let source = wasm32_utils::loadl_i64(src_rows[i], x);
let pix = i8x16_swizzle(source, sh1);
let pix = i8x16_swizzle(source, SH1);
sss[i] = i32x4_add(sss[i], i32x4_dot_i16x8(pix, mmk));
}
x += 4;
@@ -121,7 +121,7 @@ unsafe fn horiz_convolution_four_rows(
for i in 0..4 {
let source = wasm32_utils::loadl_i32(src_rows[i], x);
let pix = i8x16_swizzle(source, sh1);
let pix = i8x16_swizzle(source, SH1);
sss[i] = i32x4_add(sss[i], i32x4_dot_i16x8(pix, mmk));
}
x += 2;
@@ -132,7 +132,7 @@ unsafe fn horiz_convolution_four_rows(
for i in 0..4 {
let source = wasm32_utils::loadl_i16(src_rows[i], x);
let pix = i8x16_swizzle(source, sh1);
let pix = i8x16_swizzle(source, SH1);
sss[i] = i32x4_add(sss[i], i32x4_dot_i16x8(pix, mmk));
}
}
@@ -184,7 +184,7 @@ unsafe fn horiz_convolution_one_row(
L: |-1 02| |-1 00|
*/
#[rustfmt::skip]
let pix_sh1 = i8x16(
const PIX_SH1: v128 = i8x16(
0, -1, 2, -1, 1, -1, 3, -1, 4, -1, 6, -1, 5, -1, 7, -1
);
/*
@@ -199,7 +199,7 @@ unsafe fn horiz_convolution_one_row(
CL: |03 02| |01 00|
*/
#[rustfmt::skip]
let coeff_sh1 = i8x16(
const COEFF_SH1: v128 = i8x16(
0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7
);
@@ -215,7 +215,7 @@ unsafe fn horiz_convolution_one_row(
L: |-1 10| |-1 08|
*/
#[rustfmt::skip]
let pix_sh2 = i8x16(
const PIX_SH2: v128 = i8x16(
8, -1, 10, -1, 9, -1, 11, -1, 12, -1, 14, -1, 13, -1, 15, -1
);
/*
@@ -230,7 +230,7 @@ unsafe fn horiz_convolution_one_row(
CL: |11 10| |09 08|
*/
#[rustfmt::skip]
let coeff_sh2 = i8x16(
const COEFF_SH2: v128 = i8x16(
8, 9, 10, 11, 8, 9, 10, 11, 12, 13, 14, 15, 12, 13, 14, 15
);
@@ -245,7 +245,7 @@ unsafe fn horiz_convolution_one_row(
A: |-1 03| |-1 01|
L: |-1 02| |-1 00|
*/
let pix_sh3 = i8x16(0, -1, 2, -1, 1, -1, 3, -1, 4, -1, 6, -1, 5, -1, 7, -1);
const PIX_SH3: v128 = i8x16(0, -1, 2, -1, 1, -1, 3, -1, 4, -1, 6, -1, 5, -1, 7, -1);
for (dst_x, &coeffs_chunk) in coefficients_chunks.iter().enumerate() {
let mut x = coeffs_chunk.start as usize;
@@ -261,12 +261,12 @@ unsafe fn horiz_convolution_one_row(
let ksource = wasm32_utils::load_v128(k, 0);
let source = wasm32_utils::load_v128(src_row, x);
let pix = i8x16_swizzle(source, pix_sh1);
let mmk = i8x16_swizzle(ksource, coeff_sh1);
let pix = i8x16_swizzle(source, PIX_SH1);
let mmk = i8x16_swizzle(ksource, COEFF_SH1);
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk));
let pix = i8x16_swizzle(source, pix_sh2);
let mmk = i8x16_swizzle(ksource, coeff_sh2);
let pix = i8x16_swizzle(source, PIX_SH2);
let mmk = i8x16_swizzle(ksource, COEFF_SH2);
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk));
x += 8;
@@ -278,7 +278,7 @@ unsafe fn horiz_convolution_one_row(
for k in coeffs_by_4 {
let mmk = i16x8(k[0], k[1], k[0], k[1], k[2], k[3], k[2], k[3]);
let source = wasm32_utils::loadl_i64(src_row, x);
let pix = i8x16_swizzle(source, pix_sh3);
let pix = i8x16_swizzle(source, PIX_SH3);
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk));
x += 4
+14 -14
View File
@@ -70,7 +70,7 @@ unsafe fn horiz_convolution_8u4x(
R: |-1 03| |-1 00|
*/
#[rustfmt::skip]
let sh_lo = i8x16(
const SH_LO: v128 = i8x16(
0, -1, 3, -1, 1, -1, 4, -1, 2, -1, 5, -1, -1, -1, -1, -1
);
/*
@@ -80,7 +80,7 @@ unsafe fn horiz_convolution_8u4x(
R: |-1 09| |-1 06|
*/
#[rustfmt::skip]
let sh_hi = i8x16(
const SH_HI: v128 = i8x16(
6, -1, 9, -1, 7, -1, 10, -1, 8, -1, 11, -1, -1, -1, -1, -1
);
@@ -104,10 +104,10 @@ unsafe fn horiz_convolution_8u4x(
let mmk1 = wasm32_utils::ptr_i16_to_set1_i32(k, 2);
for i in 0..4 {
let source = wasm32_utils::load_v128(src_rows[i], x);
let pix = i8x16_swizzle(source, sh_lo);
let pix = i8x16_swizzle(source, SH_LO);
let mut sss = sss_a[i];
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk0));
let pix = i8x16_swizzle(source, sh_hi);
let pix = i8x16_swizzle(source, SH_HI);
sss_a[i] = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk1));
}
@@ -131,7 +131,7 @@ unsafe fn horiz_convolution_8u4x(
for i in 0..4 {
let source = wasm32_utils::loadl_i64(src_rows[i], x);
let pix = i8x16_swizzle(source, sh_lo);
let pix = i8x16_swizzle(source, SH_LO);
sss_a[i] = i32x4_add(sss_a[i], i32x4_dot_i16x8(pix, mmk));
}
@@ -184,19 +184,19 @@ unsafe fn horiz_convolution_8u(
precision: u8,
) {
#[rustfmt::skip]
let pix_sh1 = i8x16(
const PIX_SH1: v128 = i8x16(
0, -1, 3, -1, 1, -1, 4, -1, 2, -1, 5, -1, -1, -1, -1, -1
);
#[rustfmt::skip]
let coef_sh1 = i8x16(
const COEF_SH1: v128 = i8x16(
0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
);
#[rustfmt::skip]
let pix_sh2 = i8x16(
const PIX_SH2: v128 = i8x16(
6, -1, 9, -1, 7, -1, 10, -1, 8, -1, 11, -1, -1, -1, -1, -1
);
#[rustfmt::skip]
let coef_sh2 = i8x16(
const COEF_SH2: v128 = i8x16(
4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7
);
/*
@@ -231,12 +231,12 @@ unsafe fn horiz_convolution_8u(
let ksource = wasm32_utils::loadl_i64(k, 0);
let source = wasm32_utils::load_v128(src_row, x);
let pix = i8x16_swizzle(source, pix_sh1);
let mmk = i8x16_swizzle(ksource, coef_sh1);
let pix = i8x16_swizzle(source, PIX_SH1);
let mmk = i8x16_swizzle(ksource, COEF_SH1);
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk));
let pix = i8x16_swizzle(source, pix_sh2);
let mmk = i8x16_swizzle(ksource, coef_sh2);
let pix = i8x16_swizzle(source, PIX_SH2);
let mmk = i8x16_swizzle(ksource, COEF_SH2);
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk));
x += 4;
@@ -257,7 +257,7 @@ unsafe fn horiz_convolution_8u(
for k in coeffs_by_2 {
let mmk = wasm32_utils::ptr_i16_to_set1_i32(k, 0);
let source = wasm32_utils::loadl_i64(src_row, x);
let pix = i8x16_swizzle(source, pix_sh1);
let pix = i8x16_swizzle(source, PIX_SH1);
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk));
x += 2;
+35 -35
View File
@@ -56,9 +56,9 @@ unsafe fn horiz_convolution_8u4x(
precision: u8,
) {
let initial = i32x4_splat(1 << (precision - 1));
let mask_lo = i8x16(0, -1, 4, -1, 1, -1, 5, -1, 2, -1, 6, -1, 3, -1, 7, -1);
let mask_hi = i8x16(8, -1, 12, -1, 9, -1, 13, -1, 10, -1, 14, -1, 11, -1, 15, -1);
let mask = i8x16(0, -1, 4, -1, 1, -1, 5, -1, 2, -1, 6, -1, 3, -1, 7, -1);
const MASK_LO: v128 = i8x16(0, -1, 4, -1, 1, -1, 5, -1, 2, -1, 6, -1, 3, -1, 7, -1);
const MASK_HI: v128 = i8x16(8, -1, 12, -1, 9, -1, 13, -1, 10, -1, 14, -1, 11, -1, 15, -1);
const MASK: v128 = i8x16(0, -1, 4, -1, 1, -1, 5, -1, 2, -1, 6, -1, 3, -1, 7, -1);
for (dst_x, coeffs_chunk) in coefficients_chunks.iter().enumerate() {
let mut x: usize = coeffs_chunk.start as usize;
@@ -79,28 +79,28 @@ unsafe fn horiz_convolution_8u4x(
// [8] a3 b3 g3 r3 a2 b2 g2 r2 a1 b1 g1 r1 a0 b0 g0 r0
let mut source = wasm32_utils::load_v128(src_rows[0], x);
// [16] a1 a0 b1 b0 g1 g0 r1 r0
let mut pix = i8x16_swizzle(source, mask_lo);
let mut pix = i8x16_swizzle(source, MASK_LO);
sss0 = i32x4_add(sss0, i32x4_dot_i16x8(pix, mmk_lo));
// [16] a3 a2 b3 b2 g3 g2 r3 r2
pix = i8x16_swizzle(source, mask_hi);
pix = i8x16_swizzle(source, MASK_HI);
sss0 = i32x4_add(sss0, i32x4_dot_i16x8(pix, mmk_hi));
source = wasm32_utils::load_v128(src_rows[1], x);
pix = i8x16_swizzle(source, mask_lo);
pix = i8x16_swizzle(source, MASK_LO);
sss1 = i32x4_add(sss1, i32x4_dot_i16x8(pix, mmk_lo));
pix = i8x16_swizzle(source, mask_hi);
pix = i8x16_swizzle(source, MASK_HI);
sss1 = i32x4_add(sss1, i32x4_dot_i16x8(pix, mmk_hi));
source = wasm32_utils::load_v128(src_rows[2], x);
pix = i8x16_swizzle(source, mask_lo);
pix = i8x16_swizzle(source, MASK_LO);
sss2 = i32x4_add(sss2, i32x4_dot_i16x8(pix, mmk_lo));
pix = i8x16_swizzle(source, mask_hi);
pix = i8x16_swizzle(source, MASK_HI);
sss2 = i32x4_add(sss2, i32x4_dot_i16x8(pix, mmk_hi));
source = wasm32_utils::load_v128(src_rows[3], x);
pix = i8x16_swizzle(source, mask_lo);
pix = i8x16_swizzle(source, MASK_LO);
sss3 = i32x4_add(sss3, i32x4_dot_i16x8(pix, mmk_lo));
pix = i8x16_swizzle(source, mask_hi);
pix = i8x16_swizzle(source, MASK_HI);
sss3 = i32x4_add(sss3, i32x4_dot_i16x8(pix, mmk_hi));
x += 4;
}
@@ -115,19 +115,19 @@ unsafe fn horiz_convolution_8u4x(
// [8] x x x x x x x x a1 b1 g1 r1 a0 b0 g0 r0
let mut pix = wasm32_utils::loadl_i64(src_rows[0], x);
// [16] a1 a0 b1 b0 g1 g0 r1 r0
pix = i8x16_swizzle(pix, mask);
pix = i8x16_swizzle(pix, MASK);
sss0 = i32x4_add(sss0, i32x4_dot_i16x8(pix, mmk));
pix = wasm32_utils::loadl_i64(src_rows[1], x);
pix = i8x16_swizzle(pix, mask);
pix = i8x16_swizzle(pix, MASK);
sss1 = i32x4_add(sss1, i32x4_dot_i16x8(pix, mmk));
pix = wasm32_utils::loadl_i64(src_rows[2], x);
pix = i8x16_swizzle(pix, mask);
pix = i8x16_swizzle(pix, MASK);
sss2 = i32x4_add(sss2, i32x4_dot_i16x8(pix, mmk));
pix = wasm32_utils::loadl_i64(src_rows[3], x);
pix = i8x16_swizzle(pix, mask);
pix = i8x16_swizzle(pix, MASK);
sss3 = i32x4_add(sss3, i32x4_dot_i16x8(pix, mmk));
x += 2;
@@ -187,15 +187,15 @@ unsafe fn horiz_convolution_8u(
precision: u8,
) {
let initial = i32x4_splat(1 << (precision - 1));
let sh1 = i8x16(0, -1, 8, -1, 1, -1, 9, -1, 2, -1, 10, -1, 3, -1, 11, -1);
let sh2 = i8x16(0, 1, 4, 5, 0, 1, 4, 5, 0, 1, 4, 5, 0, 1, 4, 5);
let sh3 = i8x16(4, -1, 12, -1, 5, -1, 13, -1, 6, -1, 14, -1, 7, -1, 15, -1);
let sh4 = i8x16(2, 3, 6, 7, 2, 3, 6, 7, 2, 3, 6, 7, 2, 3, 6, 7);
let sh5 = i8x16(8, 9, 12, 13, 8, 9, 12, 13, 8, 9, 12, 13, 8, 9, 12, 13);
let sh6 = i8x16(
const SH1: v128 = i8x16(0, -1, 8, -1, 1, -1, 9, -1, 2, -1, 10, -1, 3, -1, 11, -1);
const SH2: v128 = i8x16(0, 1, 4, 5, 0, 1, 4, 5, 0, 1, 4, 5, 0, 1, 4, 5);
const SH3: v128 = i8x16(4, -1, 12, -1, 5, -1, 13, -1, 6, -1, 14, -1, 7, -1, 15, -1);
const SH4: v128 = i8x16(2, 3, 6, 7, 2, 3, 6, 7, 2, 3, 6, 7, 2, 3, 6, 7);
const SH5: v128 = i8x16(8, 9, 12, 13, 8, 9, 12, 13, 8, 9, 12, 13, 8, 9, 12, 13);
const SH6: v128 = i8x16(
10, 11, 14, 15, 10, 11, 14, 15, 10, 11, 14, 15, 10, 11, 14, 15,
);
let sh7 = i8x16(0, -1, 4, -1, 1, -1, 5, -1, 2, -1, 6, -1, 3, -1, 7, -1);
const SH7: v128 = i8x16(0, -1, 4, -1, 1, -1, 5, -1, 2, -1, 6, -1, 3, -1, 7, -1);
for (dst_x, &coeffs_chunk) in coefficients_chunks.iter().enumerate() {
let mut x: usize = coeffs_chunk.start as usize;
@@ -209,22 +209,22 @@ unsafe fn horiz_convolution_8u(
let mut source = wasm32_utils::load_v128(src_row, x);
let mut pix = i8x16_swizzle(source, sh1);
let mut mmk = i8x16_swizzle(ksource, sh2);
let mut pix = i8x16_swizzle(source, SH1);
let mut mmk = i8x16_swizzle(ksource, SH2);
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk));
pix = i8x16_swizzle(source, sh3);
mmk = i8x16_swizzle(ksource, sh4);
pix = i8x16_swizzle(source, SH3);
mmk = i8x16_swizzle(ksource, SH4);
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk));
source = wasm32_utils::load_v128(src_row, x + 4);
pix = i8x16_swizzle(source, sh1);
mmk = i8x16_swizzle(ksource, sh5);
pix = i8x16_swizzle(source, SH1);
mmk = i8x16_swizzle(ksource, SH5);
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk));
pix = i8x16_swizzle(source, sh3);
mmk = i8x16_swizzle(ksource, sh6);
pix = i8x16_swizzle(source, SH3);
mmk = i8x16_swizzle(ksource, SH6);
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk));
x += 8;
@@ -237,12 +237,12 @@ unsafe fn horiz_convolution_8u(
let source = wasm32_utils::load_v128(src_row, x);
let ksource = wasm32_utils::loadl_i64(k, 0);
let mut pix = i8x16_swizzle(source, sh1);
let mut mmk = i8x16_swizzle(ksource, sh2);
let mut pix = i8x16_swizzle(source, SH1);
let mut mmk = i8x16_swizzle(ksource, SH2);
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk));
pix = i8x16_swizzle(source, sh3);
mmk = i8x16_swizzle(ksource, sh4);
pix = i8x16_swizzle(source, SH3);
mmk = i8x16_swizzle(ksource, SH4);
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk));
x += 4;
@@ -254,7 +254,7 @@ unsafe fn horiz_convolution_8u(
for k in coeffs_by_2 {
let mmk = wasm32_utils::ptr_i16_to_set1_i32(k, 0);
let source = wasm32_utils::loadl_i64(src_row, x);
let pix = i8x16_swizzle(source, sh7);
let pix = i8x16_swizzle(source, SH7);
sss = i32x4_add(sss, i32x4_dot_i16x8(pix, mmk));
x += 2