mirror of
https://github.com/Cykooz/fast_image_resize.git
synced 2026-10-08 01:11:09 +00:00
Improve efficiency
This commit is contained in:
@@ -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,
|
||||
));
|
||||
|
||||
@@ -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,
|
||||
));
|
||||
|
||||
@@ -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,
|
||||
));
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user