diff options
author | B Krishnan Iyer <krishnaniyer97@gmail.com> | 2019-06-15 09:58:56 +0300 |
---|---|---|
committer | B Krishnan Iyer <krishnaniyer97@gmail.com> | 2019-07-13 20:53:43 +0300 |
commit | b271590aae34d3aa802d2e401b0c051ac4b4eeba (patch) | |
tree | f6908e665a864153a2a6deb5e6dd5032da807bfa | |
parent | 6ef9a030145eef79fdeab6d4d38e00423ae7a83d (diff) |
arm: mc: NEON implementation of w_mask_444/422/420 function
A73 A53
w_mask_420_w4_8bpc_c: 797.5 1072.7
w_mask_420_w4_8bpc_neon: 85.6 152.7
w_mask_420_w8_8bpc_c: 2344.3 3118.7
w_mask_420_w8_8bpc_neon: 221.9 372.4
w_mask_420_w16_8bpc_c: 7429.9 9702.1
w_mask_420_w16_8bpc_neon: 620.4 1024.1
w_mask_420_w32_8bpc_c: 27498.2 37205.7
w_mask_420_w32_8bpc_neon: 2394.1 3838
w_mask_420_w64_8bpc_c: 66495.8 88721.3
w_mask_420_w64_8bpc_neon: 6081.4 9630
w_mask_420_w128_8bpc_c: 163369.3 219494
w_mask_420_w128_8bpc_neon: 16015.7 24969.3
w_mask_422_w4_8bpc_c: 858.3 1100.2
w_mask_422_w4_8bpc_neon: 81.5 143.1
w_mask_422_w8_8bpc_c: 2447.5 3284.6
w_mask_422_w8_8bpc_neon: 217.5 342.4
w_mask_422_w16_8bpc_c: 7673.4 10135.9
w_mask_422_w16_8bpc_neon: 632.5 1062.6
w_mask_422_w32_8bpc_c: 28344.9 39090
w_mask_422_w32_8bpc_neon: 2393.4 3963.8
w_mask_422_w64_8bpc_c: 68159.6 93447
w_mask_422_w64_8bpc_neon: 6015.7 9928.1
w_mask_422_w128_8bpc_c: 169501.2 231702.7
w_mask_422_w128_8bpc_neon: 15847.5 25803.4
w_mask_444_w4_8bpc_c: 674.6 862.3
w_mask_444_w4_8bpc_neon: 80.2 135.4
w_mask_444_w8_8bpc_c: 2031.4 2693
w_mask_444_w8_8bpc_neon: 209.3 318.7
w_mask_444_w16_8bpc_c: 6576 8217.4
w_mask_444_w16_8bpc_neon: 627.3 986.2
w_mask_444_w32_8bpc_c: 26051.7 31593.9
w_mask_444_w32_8bpc_neon: 2374 3671.6
w_mask_444_w64_8bpc_c: 63600 75849.9
w_mask_444_w64_8bpc_neon: 5957 9335.5
w_mask_444_w128_8bpc_c: 156964.7 187932.4
w_mask_444_w128_8bpc_neon: 15759.4 24549.5
-rw-r--r-- | src/arm/32/mc.S | 235 | ||||
-rw-r--r-- | src/arm/mc_init_tmpl.c | 7 |
2 files changed, 242 insertions, 0 deletions
diff --git a/src/arm/32/mc.S b/src/arm/32/mc.S index 8c198c0..24b723c 100644 --- a/src/arm/32/mc.S +++ b/src/arm/32/mc.S @@ -215,6 +215,241 @@ bidir_fn w_avg bidir_fn mask +.macro w_mask_fn type +function w_mask_\type\()_8bpc_neon, export=1 + push {r4-r10,lr} + ldr r4, [sp, #32] + ldr r5, [sp, #36] + ldr r6, [sp, #40] + ldr r7, [sp, #44] + clz r8, r4 + adr r9, L(w_mask_\type\()_tbl) + sub r8, r8, #24 + ldr r8, [r9, r8, lsl #2] + add r9, r9, r8 + mov r12, #6903 + vdup.16 q14, r12 +.if \type == 444 + vmov.i8 q15, #64 +.elseif \type == 422 + vdup.8 d0, r7 // d0[] <- sign + vmov.i8 d30, #129 + vsub.i8 d30, d30, d0 // 129 - sign +.elseif \type == 420 + vdup.16 q0, r7 // d0[] <- sign + vmov.i16 q15, #256 + vsub.i16 q15, q15, q0 // 256 - sign +.endif + add r12, r0, r1 + lsl r1, r1, #1 + bx r9 + .align 2 +L(w_mask_\type\()_tbl): + .word 1280f - L(w_mask_\type\()_tbl) + CONFIG_THUMB + .word 640f - L(w_mask_\type\()_tbl) + CONFIG_THUMB + .word 320f - L(w_mask_\type\()_tbl) + CONFIG_THUMB + .word 160f - L(w_mask_\type\()_tbl) + CONFIG_THUMB + .word 8f - L(w_mask_\type\()_tbl) + CONFIG_THUMB + .word 4f - L(w_mask_\type\()_tbl) + CONFIG_THUMB +4: + vld1.16 {d0, d1, d2, d3}, [r2]! // tmp1 (four rows at once) + vld1.16 {d4, d5, d6, d7}, [r3]! // tmp2 (four rows at once) + subs r5, r5, #4 + vsub.i16 q8, q2, q0 // tmp2-tmp1 + vsub.i16 q9, q3, q1 + vabd.s16 q10, q0, q2 // (abs(tmp1[x] - tmp2[x])) + vabd.s16 q11, q1, q3 + vqsub.u16 q10, q14, q10 // 6903 - abs () + vqsub.u16 q11, q14, q11 + vshr.s16 q10, q10, #8 // 64-m = (6903 - abs()) >> 8 + vshr.s16 q11, q11, #8 + vshl.s16 q12, q10, #9 // (64-m)<<9 + vshl.s16 q13, q11, #9 + vqdmulh.s16 q12, q12, q8 // ((tmp2-tmp1)*(64-m)<<9)>>15 + vqdmulh.s16 q13, q13, q9 + vadd.i16 q12, q12, q0 // (((tmp2-tmp1)*(64-m)<<9)>>15) + tmp1 + vadd.i16 q13, q13, q1 + vqrshrun.s16 d24, q12, #4 // (((((tmp2-tmp1)*(64-m)<<9)>>15) + tmp1) + 8) >> 4 + vqrshrun.s16 d25, q13, #4 +.if \type == 444 + vmovn.u16 d20, q10 // 64 - m + vmovn.u16 d21, q11 + vsub.i8 q10, q15, q10 // m + vst1.8 {d20, d21}, [r6]! +.elseif \type == 422 + vpadd.s16 d20, d20, d21 // (64 - m) + (64 - n) (column wise addition) + vpadd.s16 d21, d22, d23 + vmovn.s16 d6, q10 + vhsub.u8 d6, d30, d6 // ((129 - sign) - ((64 - m) + (64 - n))) >> 1 + vst1.8 {d6}, [r6]! +.elseif \type == 420 + vadd.s16 d20, d20, d21 // (64 - my1) + (64 - my2) (row wise addition) + vadd.s16 d21, d22, d23 + vpadd.s16 d20, d20, d21 // (128 - m) + (128 - n) (column wise addition) + vsub.s16 d20, d30, d20 // (256 - sign) - ((128 - m) + (128 - n)) + vrshrn.u16 d20, q10, #2 // ((256 - sign) - ((128 - m) + (128 - n)) + 2) >> 2 + vst1.32 {d20[0]}, [r6]! +.endif + vst1.32 {d24[0]}, [r0], r1 + vst1.32 {d24[1]}, [r12], r1 + vst1.32 {d25[0]}, [r0], r1 + vst1.32 {d25[1]}, [r12], r1 + bgt 4b + pop {r4-r10,pc} +8: + vld1.16 {d0, d1, d2, d3}, [r2]! // tmp1y1, tmp1y2 + vld1.16 {d4, d5, d6, d7}, [r3]! // tmp2y1, tmp2y2 + subs r5, r5, #2 + vsub.i16 q8, q2, q0 // tmp2y1 - tmp1y1 + vsub.i16 q9, q3, q1 // tmp2y2 - tmp1y2 + vabd.s16 q10, q0, q2 // abs(tmp1y1 - tmp2y1) + vabd.s16 q11, q1, q3 // abs(tmp1y2 - tmp2y2) + vqsub.u16 q10, q14, q10 // 6903 - abs(tmp1y1 - tmp2y1) + vqsub.u16 q11, q14, q11 // 6903 - abs(tmp1y2 - tmp2y2) + vshr.s16 q10, q10, #8 // 64 - my1 = 6903 - abs(tmp1y1 - tmp2y1) >> 8 + vshr.s16 q11, q11, #8 // 64 - my2 = 6903 - abs(tmp1y2 - tmp2y2) >> 8 + vshl.s16 q12, q10, #9 // (64 - my1) << 9 + vshl.s16 q13, q11, #9 // (64 - my2) << 9 + vqdmulh.s16 q12, q12, q8 // ((tmp2y1 - tmp1y1) * (64 - my1) << 9) >> 15 + vqdmulh.s16 q13, q13, q9 // ((tmp2y2 - tmp1y2) * (64 - my2) << 9) >> 15 + vadd.s16 q12, q12, q0 // (((tmp2y1 - tmp1y1) * (64 - my1) << 9) >> 15) + tmp1y1 + vadd.s16 q13, q13, q1 // (((tmp2y2 - tmp1y2) * (64 - my2) << 9) >> 15) + tmp1y2 + vqrshrun.s16 d24, q12, #4 // (((((tmp2y1 - tmp1y1) * (64 - my1) << 9) >> 15) + tmp1y1) + 8) >> 4 + vqrshrun.s16 d25, q13, #4 // (((((tmp2y2 - tmp1y2) * (64 - my2) << 9) >> 15) + tmp1y2) + 8) >> 4 +.if \type == 444 + vmovn.u16 d20, q10 // 64 - m + vmovn.u16 d21, q11 + vsub.i8 q10, q15, q10 // m + vst1.8 {d20, d21}, [r6]! +.elseif \type == 422 + vpadd.s16 d20, d20, d21 // (64 - my1) + (64 - ny1) (column wise addition) + vpadd.s16 d21, d22, d23 // (64 - my2) + (64 - ny2) + vmovn.s16 d20, q10 + vhsub.u8 d20, d30, d20 // ((129 - sign) - ((64 - my1/y2) + (64 - ny1/y2))) >> 1 + vst1.8 {d20}, [r6]! +.elseif \type == 420 + vadd.s16 q10, q10, q11 // (64 - my1) + (64 - my2) (row wise addition) + vpadd.s16 d20, d20, d21 // (128 - m) + (128 - n) (column wise addition) + vsub.s16 d20, d30, d20 // (256 - sign) - ((128 - m) + (128 - n)) + vrshrn.u16 d20, q10, #2 // ((256 - sign) - ((128 - m) + (128 - n)) + 2) >> 2 + vst1.32 {d20[0]}, [r6]! +.endif + vst1.16 {d24}, [r0], r1 + vst1.16 {d25}, [r12], r1 + bgt 8b + pop {r4-r10,pc} +1280: +640: +320: +160: + sub r1, r1, r4 +.if \type == 444 + add r10, r6, r4 +.elseif \type == 422 + add r10, r6, r4, lsr #1 +.endif + mov lr, r7 + add r9, r3, r4, lsl #1 + add r7, r2, r4, lsl #1 +161: + mov r8, r4 +16: + vld1.16 {d0, d1, d2, d3}, [r2]! // tmp1y1 + vld1.16 {d4, d5, d6, d7}, [r3]! // tmp2y1 + vld1.16 {d16, d17, d18, d19}, [r7]! // tmp1y2 + subs r8, r8, #16 + vsub.i16 q2, q2, q0 // tmp2y1 - tmp1y1 + vsub.i16 q3, q3, q1 + vabs.s16 q10, q2 // abs(tm2y1 - tmp1y1) + vabs.s16 q11, q3 + vqsub.u16 q10, q14, q10 // 6903 - abs(tmp1y1 - tmp2y1) + vqsub.u16 q11, q14, q11 + vshr.s16 q10, q10, #8 // 64 - my1 = 6903 - abs(tmp1y1 - tmp2y1) >> 8 + vshr.s16 q11, q11, #8 + vshl.s16 q12, q10, #9 // (64 - my1) << 9 + vshl.s16 q13, q11, #9 + vqdmulh.s16 q12, q12, q2 // ((tmp2y1 - tmp1y1) * (64 - my1) << 9) >> 15 + vqdmulh.s16 q13, q13, q3 + vadd.i16 q12, q12, q0 // (((tmp2y1 - tmp1y1) * (64 - my1) << 9) >> 15) + tmp1y1 + vadd.i16 q13, q13, q1 + vld1.16 {d0, d1, d2, d3}, [r9]! // tmp2h2 +.if \type == 444 + vmovn.u16 d20, q10 // 64 - my1 + vmovn.u16 d21, q11 + vsub.i8 q10, q15, q10 // my1 + vst1.8 {d20, d21}, [r6]! +.elseif \type == 422 + vpadd.s16 d20, d20, d21 // (64 - my1) + (64 - ny1) (column wise addition) + vpadd.s16 d21, d22, d23 + vmovn.s16 d20, q10 + vhsub.u8 d20, d30, d20 // ((129 - sign) - ((64 - my1) + (64 - ny1))) >> 1 + vst1.8 {d20}, [r6]! +.endif + vqrshrun.s16 d24, q12, #4 // (((((tmp2y1 - tmp1y1)*(64 - my1) << 9) >> 15) + tmp1y1) + 8) >> 4 + vqrshrun.s16 d25, q13, #4 + vsub.i16 q0, q0, q8 // tmp2y2 - tmp1y2 + vsub.i16 q1, q1, q9 + vst1.16 {d24, d25}, [r0]! // store dsty1 + vabs.s16 q2, q0 // abs(tmp2y2 - tmp1y2) + vabs.s16 q3, q1 + vqsub.u16 q2, q14, q2 // 6903 - abs(tmp2y2 - tmp1y2) + vqsub.u16 q3, q14, q3 + vshr.s16 q2, q2, #8 // (6903 - abs(tmp2y2 - tmp1y2)) >> 8 + vshr.s16 q3, q3, #8 + vshl.s16 q12, q2, #9 // (64 - my2) << 9 + vshl.s16 q13, q3, #9 +.if \type == 444 + vmovn.u16 d4, q2 // 64 - my2 + vmovn.u16 d5, q3 + vsub.i8 q2, q15, q2 // my2 + vst1.8 {d4, d5}, [r10]! +.elseif \type == 422 + vpadd.s16 d4, d4, d5 // (64 - my2) + (64 - ny2) (column wise addition) + vpadd.s16 d5, d6, d7 + vmovn.s16 d4, q2 + vhsub.u8 d4, d30, d4 // ((129 - sign) - ((64 - my2) + (64 - ny2))) >> 1 + vst1.8 {d4}, [r10]! +.elseif \type == 420 + vadd.s16 q10, q10, q2 // (64 - my1) + (64 - my2) (row wise addition) + vadd.s16 q11, q11, q3 + vpadd.s16 d20, d20, d21 // (128 - m) + (128 - n) (column wise addition) + vpadd.s16 d21, d22, d23 + vsub.s16 q10, q15, q10 // (256 - sign) - ((128 - m) + (128 - n)) + vrshrn.u16 d20, q10, #2 // ((256 - sign) - ((128 - m) + (128 - n)) + 2) >> 2 + vst1.8 {d20}, [r6]! +.endif + vqdmulh.s16 q12, q12, q0 // ((tmp2y2 - tmp1y2) * (64 - my2) << 9) >> 15 + vqdmulh.s16 q13, q13, q1 + vadd.i16 q12, q12, q8 // (((tmp2y2 - tmp1y2) * (64 - my2) << 9) >> 15) + tmp1y2 + vadd.i16 q13, q13, q9 + vqrshrun.s16 d24, q12, #4 // (((((tmp2y2 - tmp1y2)*(64 - my2) << 9) >> 15) + tmp1y2) + 8) >> 4 + vqrshrun.s16 d25, q13, #4 + vst1.16 {d24, d25}, [r12]! // store dsty2 + bgt 16b + subs r5, r5, #2 + add r2, r2, r4, lsl #1 + add r3, r3, r4, lsl #1 + add r7, r7, r4, lsl #1 + add r9, r9, r4, lsl #1 +.if \type == 444 + add r6, r6, r4 + add r10, r10, r4 +.elseif \type == 422 + add r6, r6, r4, lsr #1 + add r10, r10, r4, lsr #1 +.endif + add r0, r0, r1 + add r12, r12, r1 + bgt 161b + pop {r4-r10,pc} +endfunc +.endm + +w_mask_fn 444 +w_mask_fn 422 +w_mask_fn 420 + + function blend_8bpc_neon, export=1 push {r4-r8,lr} ldr r4, [sp, #24] diff --git a/src/arm/mc_init_tmpl.c b/src/arm/mc_init_tmpl.c index f8e27a4..cfc8de0 100644 --- a/src/arm/mc_init_tmpl.c +++ b/src/arm/mc_init_tmpl.c @@ -59,6 +59,10 @@ decl_blend_fn(dav1d_blend_8bpc_neon); decl_blend_dir_fn(dav1d_blend_h_8bpc_neon); decl_blend_dir_fn(dav1d_blend_v_8bpc_neon); +decl_w_mask_fn(dav1d_w_mask_444_8bpc_neon); +decl_w_mask_fn(dav1d_w_mask_422_8bpc_neon); +decl_w_mask_fn(dav1d_w_mask_420_8bpc_neon); + decl_warp8x8_fn(dav1d_warp_affine_8x8_8bpc_neon); decl_warp8x8t_fn(dav1d_warp_affine_8x8t_8bpc_neon); @@ -104,6 +108,9 @@ void bitfn(dav1d_mc_dsp_init_arm)(Dav1dMCDSPContext *const c) { c->blend = dav1d_blend_8bpc_neon; c->blend_h = dav1d_blend_h_8bpc_neon; c->blend_v = dav1d_blend_v_8bpc_neon; + c->w_mask[0] = dav1d_w_mask_444_8bpc_neon; + c->w_mask[1] = dav1d_w_mask_422_8bpc_neon; + c->w_mask[2] = dav1d_w_mask_420_8bpc_neon; #endif #endif } |