<div dir="ltr"><div class="gmail_default" style="font-family:tahoma,sans-serif">From 1fdb5829e81aecf78665d4afdec98d784243bb9e Mon Sep 17 00:00:00 2001<br>From: Min Chen <<a href="mailto:chenm003@163.com">chenm003@163.com</a>><br>Date: Sat, 31 Aug 2024 07:50:47 -0700<br>Subject: [PATCH 2/6] AArch64: intra_pred_planar8_neon,<br> intra_pred_planar16_neon<br><br>---<br> source/common/CMakeLists.txt             |   2 +-<br> source/common/aarch64/intrapred-prim.cpp |   7 +<br> source/common/aarch64/intrapred.S        | 171 +++++++++++++++++++++++<br> 3 files changed, 179 insertions(+), 1 deletion(-)<br> create mode 100644 source/common/aarch64/intrapred.S<br><br>diff --git a/source/common/CMakeLists.txt b/source/common/CMakeLists.txt<br>index 4b7145132..45d880110 100644<br>--- a/source/common/CMakeLists.txt<br>+++ b/source/common/CMakeLists.txt<br>@@ -111,7 +111,7 @@ if(ENABLE_ASSEMBLY AND (ARM64 OR CROSS_COMPILE_ARM64))<br>     enable_language(ASM)<br> <br>     # add ARM assembly/intrinsic files here<br>-    set(A_SRCS asm.S mc-a.S mc-a-common.S sad-a.S pixel-util.S pixel-util-common.S p2s.S p2s-common.S blockcopy8.S blockcopy8-common.S ssd-a.S ssd-a-common.S)<br>+    set(A_SRCS asm.S mc-a.S mc-a-common.S sad-a.S pixel-util.S pixel-util-common.S p2s.S p2s-common.S blockcopy8.S blockcopy8-common.S ssd-a.S ssd-a-common.S intrapred.S)<br>     set(A_SRCS_SVE asm-sve.S blockcopy8-sve.S p2s-sve.S pixel-util-sve.S)<br>     set(A_SRCS_SVE2 mc-a-sve2.S pixel-util-sve2.S ssd-a-sve2.S)<br>     set(A_SRCS_NEON_DOTPROD sad-neon-dotprod.S ssd-neon-dotprod.S)<br>diff --git a/source/common/aarch64/intrapred-prim.cpp b/source/common/aarch64/intrapred-prim.cpp<br>index 9bf50c4aa..8624dd2a6 100644<br>--- a/source/common/aarch64/intrapred-prim.cpp<br>+++ b/source/common/aarch64/intrapred-prim.cpp<br>@@ -237,6 +237,8 @@ void all_angs_pred_neon(pixel *dest, pixel *refPix, pixel *filtPix, int bLuma)<br> namespace X265_NS<br> {<br> // x265 private namespace<br>+extern "C" void PFX(intra_pred_planar8_neon)(pixel* dst, intptr_t dstStride, const pixel* srcPix, int dirMode, int bFilter);<br>+extern "C" void PFX(intra_pred_planar16_neon)(pixel* dst, intptr_t dstStride, const pixel* srcPix, int dirMode, int bFilter);<br> <br> void setupIntraPrimitives_neon(EncoderPrimitives &p)<br> {<br>@@ -256,6 +258,11 @@ void setupIntraPrimitives_neon(EncoderPrimitives &p)<br>     <a href="http://p.cu">p.cu</a>[BLOCK_8x8].intra_pred_allangs = all_angs_pred_neon<3>;<br>     <a href="http://p.cu">p.cu</a>[BLOCK_16x16].intra_pred_allangs = all_angs_pred_neon<4>;<br>     <a href="http://p.cu">p.cu</a>[BLOCK_32x32].intra_pred_allangs = all_angs_pred_neon<5>;<br>+<br>+#if !HIGH_BIT_DEPTH<br>+    <a href="http://p.cu">p.cu</a>[BLOCK_8x8].intra_pred[PLANAR_IDX] = PFX(intra_pred_planar8_neon);<br>+    <a href="http://p.cu">p.cu</a>[BLOCK_16x16].intra_pred[PLANAR_IDX] = PFX(intra_pred_planar16_neon);<br>+#endif<br> }<br> <br> }<br>diff --git a/source/common/aarch64/intrapred.S b/source/common/aarch64/intrapred.S<br>new file mode 100644<br>index 000000000..2f91ebfa3<br>--- /dev/null<br>+++ b/source/common/aarch64/intrapred.S<br>@@ -0,0 +1,171 @@<br>+/*****************************************************************************<br>+ * Copyright (C) 2021 MulticoreWare, Inc<br>+ *<br>+ * Authors: Min Chen <<a href="mailto:min.chen@multicorewareinc.com">min.chen@multicorewareinc.com</a>><br>+ *<br>+ * This program is free software; you can redistribute it and/or modify<br>+ * it under the terms of the GNU General Public License as published by<br>+ * the Free Software Foundation; either version 2 of the License, or<br>+ * (at your option) any later version.<br>+ *<br>+ * This program is distributed in the hope that it will be useful,<br>+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br>+ * GNU General Public License for more details.<br>+ *<br>+ * You should have received a copy of the GNU General Public License<br>+ * along with this program; if not, write to the Free Software<br>+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.<br>+ *<br>+ * This program is also available under a commercial proprietary license.<br>+ * For more information, contact us at license @ <a href="http://x265.com">x265.com</a>.<br>+ *****************************************************************************/<br>+<br>+// Functions in this file:<br>+// ***** luma_vpp *****<br>+<br>+#include "asm.S"<br>+<br>+#ifdef __APPLE__<br>+.section __RODATA,__rodata<br>+#else<br>+.section .rodata<br>+#endif<br>+<br>+.align 4<br>+<br>+.text<br>+<br>+.align 4<br>+tbl_const_1to8_7to0:<br>+    .byte 1, 2, 3, 4, 5, 6, 7, 8<br>+    .byte 7, 6, 5, 4, 3, 2, 1, 0<br>+    .byte 9, 10, 11, 12, 13, 14, 15, 16<br>+    .byte 15, 14, 13, 12, 11, 10, 9, 8<br>+<br>+// ***** planar_pred *****<br>+// void planar_pred(pixel* dst, intptr_t dstStride, const pixel* srcPix, int /*dirMode*/, int /*bFilter*/)<br>+function PFX(intra_pred_planar8_neon)<br>+// Register map<br>+// x0  = dst<br>+// x1  = dstStride<br>+// x2  = *srcPix<br>+// x3  = left[x]<br>+// x4  = tmp<br>+// v0  = above[7:0]<br>+// v1  = left[7:0]<br>+// v2  = topRight = rep(above[blkSize])<br>+// v3  = bottomLeft = rep(left[blkSize])<br>+// v4  = const[8 7 6 5 4 3 2 1]<br>+// v5  = const[7 6 5 4 3 2 1 0]<br>+<br>+//{<br>+//    const int blkSize = 1 << log2Size;<br>+//    const pixel* above = srcPix + 1;<br>+//    const pixel* left  = srcPix + (2 * blkSize + 1);<br>+//    pixel topRight = above[blkSize];<br>+//    pixel bottomLeft = left[blkSize];<br>+//    for (int y = 0; y < blkSize; y++)<br>+//        for (int x = 0; x < blkSize; x++)<br>+//            dst[y * dstStride + x] = (pixel) (((blkSize - 1 - x) * left[y] + (blkSize - 1 -y) * above[x] + (x + 1) * topRight + (y + 1) * bottomLeft + blkSize) >> (log2Size + 1));<br>+//}<br>+<br>+    ldurb           w3, [x2, #(1+8)]                // topRight<br>+    ldurb           w4, [x2, #(2*8+1+8)]            // bottomLeft<br>+    dup             v2.8b, w3                       // v2 = topRight_b<br>+    dup             v3.8h, w4                       // v3 = bottomLeft_h<br>+    ldr             x3, [x2, #(2*8+1)]              // x3 = left[x]_b<br>+    ldr             d0, [x2, #1]                    // v0 = above[x]_b<br>+<br>+    adr             x4, tbl_const_1to8_7to0<br>+    ldr             d4, [x4]                        // v4 = const_b[8 7 6 5 4 3 2 1]<br>+    ldr             d5, [x4, #8]                    // v5 = const_b[7 6 5 4 3 2 1 0]<br>+<br>+    ushll           v6.8h, v0.8b, #3                // v6 = 8 * above[x]<br>+    usubw           v0.8h, v3.8h, v0.8b             // v0 = bottomLeft - above[x]<br>+<br>+    umlal           v6.8h, v4.8b, v2.8b             // v6 = 8 * above[x] + (x + 1) * topRight<br>+<br>+    mov             w4, #8<br>+<br>+1:<br>+    dup             v1.8b, w3<br>+    lsr             x3, x3, #8<br>+    add             v6.8h, v6.8h, v0.8h             // v6 = (blkSize - 1 -y=0) * above[x] + (x + 1) * topRight + (y=0 + 1) * bottomLeft<br>+    mov             v3.16b, v6.16b<br>+    umlal           v3.8h, v5.8b, v1.8b             // v3 = (blkSize - 1 - x) * left[y=0] + (blkSize - 1 -y=0) * above[x] + (x + 1) * topRight + (y=0 + 1) * bottomLeft<br>+    rshrn           v3.8b, v3.8h, #4<br>+    sub             w4, w4, #1<br>+    st1             {v3.8b}, [x0], x1<br>+    cbnz            w4, 1b<br>+<br>+    ret<br>+endfunc<br>+<br>+// void planar_pred(pixel* dst, intptr_t dstStride, const pixel* srcPix, int /*dirMode*/, int /*bFilter*/)<br>+function PFX(intra_pred_planar16_neon)<br>+// Register map<br>+// x0  = dst<br>+// x1  = dstStride<br>+// x2  = *srcPix<br>+// x3  = left[x]<br>+// x4  = tmp<br>+// v0  = above[7:0]<br>+// v1  = left[7:0]<br>+// v2  = topRight = rep(above[blkSize])<br>+// v3  = bottomLeft = rep(left[blkSize])<br>+// v4  = const[16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1]<br>+// v5  = const[15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0]<br>+<br>+//{<br>+//    const int blkSize = 1 << log2Size;<br>+//    const pixel* above = srcPix + 1;<br>+//    const pixel* left  = srcPix + (2 * blkSize + 1);<br>+//    pixel topRight = above[blkSize];<br>+//    pixel bottomLeft = left[blkSize];<br>+//    for (int y = 0; y < blkSize; y++)<br>+//        for (int x = 0; x < blkSize; x++)<br>+//            dst[y * dstStride + x] = (pixel) (((blkSize - 1 - x) * left[y] + (blkSize - 1 -y) * above[x] + (x + 1) * topRight + (y + 1) * bottomLeft + blkSize) >> (log2Size + 1));<br>+//}<br>+<br>+    ldurb           w3, [x2, #(1+16)]               // topRight<br>+    ldurb           w4, [x2, #(2*16+1+16)]          // bottomLeft<br>+    ldr             q0, [x2, #(2*16+1)]             // v0 = left[x]_b<br>+    ldr             q1, [x2, #1]                    // v1 = above[x]_b<br>+    dup             v2.16b, w3                      // v2 = topRight_b<br>+    dup             v3.8h, w4                       // v3 = bottomLeft_h<br>+<br>+    adr             x4, tbl_const_1to8_7to0<br>+    ld2             {v4.2d, v5.2d}, [x4]            // v4 = const_b[16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1]<br>+    ext             v5.16b, v5.16b, v5.16b, #8      // v5 = const_b[15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0]<br>+<br>+    ushll           v16.8h, v1.8b, #4               // v16,v17 = 16 * above[x]<br>+    ushll2          v17.8h, v1.16b, #4<br>+    usubw           v6.8h, v3.8h, v1.8b             // v6,v7 = bottomLeft - above[x]<br>+    usubw2          v7.8h, v3.8h, v1.16b<br>+<br>+    umlal           v16.8h, v4.8b, v2.8b            // v16,v17 = 16 * above[x] + (x + 1) * topRight<br>+    umlal2          v17.8h, v4.16b, v2.16b<br>+<br>+    mov             w4, #16<br>+<br>+1:<br>+    dup             v1.16b, v0.b[0]                 // v1 = left[x]_b<br>+    ext             v0.16b, v0.16b, v0.16b, #1<br>+<br>+    add             v16.8h, v16.8h, v6.8h           // v16,v17 = (blkSize - 1 -y=0) * above[x] + (x + 1) * topRight + (y=0 + 1) * bottomLeft<br>+    add             v17.8h, v17.8h, v7.8h<br>+<br>+    mov             v18.16b, v16.16b<br>+    mov             v19.16b, v17.16b<br>+<br>+    umlal           v18.8h, v5.8b, v1.8b             // v3 = (blkSize - 1 - x) * left[y=0] + (blkSize - 1 -y=0) * above[x] + (x + 1) * topRight + (y=0 + 1) * bottomLeft<br>+    umlal2          v19.8h, v5.16b, v1.16b<br>+    rshrn           v18.8b, v18.8h, #5<br>+    rshrn2          v18.16b, v19.8h, #5<br>+    st1             {v18.16b}, [x0], x1<br>+    sub             w4, w4, #1<br>+    cbnz            w4, 1b<br>+<br>+    ret<br>+endfunc<br>-- <br>2.36.0.windows.1<br><br></div></div>