<div dir="ltr"><div class="gmail_default" style="font-family:tahoma,sans-serif">From 8a7952f80361f251d86bc689d43a09e3f5320535 Mon Sep 17 00:00:00 2001<br>From: Min Chen <<a href="mailto:chenm003@163.com">chenm003@163.com</a>><br>Date: Mon, 2 Sep 2024 13:27:54 -0700<br>Subject: [PATCH 3/6] AArch64: IDCT16x16<br><br>---<br> source/common/CMakeLists.txt       |   2 +-<br> source/common/aarch64/asm.S        |  15 +<br> source/common/aarch64/dct-prim.cpp |   4 +-<br> source/common/aarch64/dct.S        | 461 +++++++++++++++++++++++++++++<br> 4 files changed, 480 insertions(+), 2 deletions(-)<br> create mode 100644 source/common/aarch64/dct.S<br><br>diff --git a/source/common/CMakeLists.txt b/source/common/CMakeLists.txt<br>index 45d880110..dc4a74107 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 intrapred.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 dct.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/asm.S b/source/common/aarch64/asm.S<br>index 742978631..0450ea138 100644<br>--- a/source/common/aarch64/asm.S<br>+++ b/source/common/aarch64/asm.S<br>@@ -194,4 +194,19 @@ ELF     .size   \name, . - \name<br>     vtrn            \t3, \t4, \s3, \s4<br> .endm<br> <br>+<br>+.macro push_vec_regs<br>+    stp             d8, d9, [sp,#-16]!<br>+    stp             d10, d11, [sp,#-16]!<br>+    stp             d12, d13, [sp,#-16]!<br>+    stp             d14, d15, [sp,#-16]!<br>+.endm<br>+<br>+.macro pop_vec_regs<br>+    ldp             d14, d15, [sp], #16<br>+    ldp             d12, d13, [sp], #16<br>+    ldp             d10, d11, [sp], #16<br>+    ldp             d8, d9, [sp], #16<br>+.endm<br>+<br> #endif<br>diff --git a/source/common/aarch64/dct-prim.cpp b/source/common/aarch64/dct-prim.cpp<br>index 96dd9a4b0..063dde845 100644<br>--- a/source/common/aarch64/dct-prim.cpp<br>+++ b/source/common/aarch64/dct-prim.cpp<br>@@ -14,6 +14,8 @@<br> #define X265_PRAGMA_UNROLL(n)<br> #endif<br> <br>+extern "C" void PFX(idct16_neon)(const int16_t *src, int16_t *dst, intptr_t dstStride);<br>+<br> namespace<br> {<br> using namespace X265_NS;<br>@@ -1112,7 +1114,7 @@ void setupDCTPrimitives_neon(EncoderPrimitives &p)<br>     <a href="http://p.cu">p.cu</a>[BLOCK_16x16].dct = dct16_neon;<br>     <a href="http://p.cu">p.cu</a>[BLOCK_32x32].dct = dct32_neon;<br>     <a href="http://p.cu">p.cu</a>[BLOCK_4x4].idct   = idct4_neon;<br>-    <a href="http://p.cu">p.cu</a>[BLOCK_16x16].idct = idct16_neon;<br>+    <a href="http://p.cu">p.cu</a>[BLOCK_16x16].idct = PFX(idct16_neon);<br>     <a href="http://p.cu">p.cu</a>[BLOCK_32x32].idct = idct32_neon;<br>     <a href="http://p.cu">p.cu</a>[BLOCK_4x4].count_nonzero = count_nonzero_neon<4>;<br>     <a href="http://p.cu">p.cu</a>[BLOCK_8x8].count_nonzero = count_nonzero_neon<8>;<br>diff --git a/source/common/aarch64/dct.S b/source/common/aarch64/dct.S<br>new file mode 100644<br>index 000000000..26a88ef76<br>--- /dev/null<br>+++ b/source/common/aarch64/dct.S<br>@@ -0,0 +1,461 @@<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>+.set idct_shift_1, 7<br>+.set idct_shift_2, 12<br>+<br>+.align 4<br>+// NOTE: Hardcoded due to asm syntax issue, don't reorder!<br>+tbl_const_idct_0:<br>+    .hword 64, 83, 36, 89, 75, 50, 18,  0   // v0<br>+    .hword 90, 87, 80, 70, 57, 43, 25,  9   // v1<br>+//    .hword 0=64, 1=83, 2=36, 3=89, 4=75, 5=50, 6=18, 7=00<br>+//    .hword 0=90, 1=87, 2=80, 3=70, 4=57, 5=43, 6=25, 7= 9<br>+<br>+    .hword 64, 83, 64, 36   // v0<br>+    .hword 64, 36,-64,-83<br>+    .hword 64,-36,-64, 83   // v1<br>+    .hword 64,-83, 64,-36<br>+<br>+    .hword 89, 75, 50, 18   // v2<br>+    .hword 75,-18,-89,-50<br>+    .hword 50,-89, 18, 75   // v3<br>+    .hword 18,-50, 75,-89<br>+<br>+    .hword 90,+87,+80,+70, +57,+43,+25,+ 9   // v4<br>+    .hword 87,+57, +9,-43, -80,-90,-70,-25   // v5<br>+    .hword 80, +9,-70,-87, -25,+57,+90,+43   // v6<br>+    .hword 70,-43,-87, +9, +90,+25,-80,-57   // v7<br>+    .hword 57,-80,-25,+90, - 9,-87,+43,+70   // v8<br>+    .hword 43,-90,+57,+25, -87,+70,+ 9,-80   // v9<br>+    .hword 25,-70,+90,-80, +43,+ 9,-57,+87   // v16<br>+    .hword  9,-25,+43,-57, +70,-80,+87,-90   // v17<br>+<br>+    .byte 12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3  // v18<br>+<br>+// ***** idct 16x16 *****<br>+// void idct16(const int16_t* src, int16_t* dst, intptr_t dstStride)<br>+function PFX(idct16_neon)<br>+// Register map<br>+// x0  = src<br>+// x1  = dst<br>+// x2  = dstStride<br>+// x8  = tbl_const_idct_0<br>+<br>+    stp             d8, d9, [sp,#-16]!<br>+    sub             sp, sp, #(16*16*2)<br>+<br>+    adr             x8, tbl_const_idct_0<br>+    ldp             q0, q1, [x8]<br>+<br>+    mov             x5, sp<br>+    mov             w4, #16<br>+<br>+    // Pass1<br>+5:<br>+    ldr             d16, [x0, #(0*16*2)]<br>+    ldr             d17, [x0, #(2*16*2)]<br>+    ldr             d18, [x0, #(4*16*2)]<br>+    ldr             d19, [x0, #(6*16*2)]<br>+    ldr             d20, [x0, #(8*16*2)]<br>+    ldr             d21, [x0, #(10*16*2)]<br>+    ldr             d22, [x0, #(12*16*2)]<br>+    ldr             d23, [x0, #(14*16*2)]<br>+<br>+// EEE0 = 64*src[0*16+i] + 64*src[ 8*16+i];<br>+// EEE1 = 64*src[0*16+i] - 64*src[ 8*16+i];<br>+// EEO0 = 83*src[4*16+i] + 36*src[12*16+i];<br>+// EEO1 = 36*src[4*16+i] - 83*src[12*16+i];<br>+    smull           v24.4s, v16.4h, v0.h[0]         // EEE0 = 64*[0]<br>+    smull           v26.4s, v18.4h, v0.h[1]         // EEO0 = 83*[4]<br>+    mov             v25.16b, v24.16b                // EEE1 = 64*[0]<br>+    smull           v27.4s, v18.4h, v0.h[2]         // EEO1 = 36*[4]<br>+<br>+// EO0 = 89*src[ 2*16+i] + 75*src[ 6*16+i] + 50*src[10*16+i] + 18*src[14*16+i];<br>+// EO1 = 75*src[ 2*16+i] - 18*src[ 6*16+i] - 89*src[10*16+i] - 50*src[14*16+i];<br>+// EO2 = 50*src[ 2*16+i] - 89*src[ 6*16+i] + 18*src[10*16+i] + 75*src[14*16+i];<br>+// EO3 = 18*src[ 2*16+i] - 50*src[ 6*16+i] + 75*src[10*16+i] - 89*src[14*16+i];<br>+    smull           v28.4s, v17.4h, v0.h[3]         // EO0 = 89*[2]<br>+    smull           v29.4s, v17.4h, v0.h[4]         // EO1 = 75*[2]<br>+    smull           v30.4s, v17.4h, v0.h[5]         // EO2 = 50*[2]<br>+    smull           v31.4s, v17.4h, v0.h[6]         // EO3 = 18*[2]<br>+<br>+    smlal           v28.4s, v19.4h, v0.h[4]         // EO0 = 89*[2]+75*[6]<br>+    smlsl           v29.4s, v19.4h, v0.h[6]         // EO1 = 75*[2]-18*[6]<br>+    smlsl           v30.4s, v19.4h, v0.h[3]         // EO2 = 50*[2]-89*[6]<br>+    smlsl           v31.4s, v19.4h, v0.h[5]         // EO3 = 18*[2]-50*[6]<br>+<br>+    ldr             d16, [x0, #(1*16*2)]<br>+    ldr             d17, [x0, #(3*16*2)]<br>+    ldr             d18, [x0, #(5*16*2)]<br>+    ldr             d19, [x0, #(7*16*2)]<br>+<br>+    orr             v2.8b, v20.8b, v21.8b<br>+    orr             v2.8b, v2.8b, v22.8b<br>+    orr             v2.8b, v2.8b, v23.8b<br>+    orr             v3.8b, v18.8b, v19.8b<br>+    mov             x6, v2.d[0]<br>+    mov             x7, v3.d[0]<br>+<br>+// O0 = 90*src[ 1*16+i] + 87*src[ 3*16+i] + 80*src[ 5*16+i] + 70*src[ 7*16+i] + 57*src[ 9*16+i] + 43*src[11*16+i] + 25*src[13*16+i] +  9*src[15*16+i];<br>+// O1 = 87*src[ 1*16+i] + 57*src[ 3*16+i] +  9*src[ 5*16+i] - 43*src[ 7*16+i] - 80*src[ 9*16+i] - 90*src[11*16+i] - 70*src[13*16+i] - 25*src[15*16+i];<br>+// O2 = 80*src[ 1*16+i] +  9*src[ 3*16+i] - 70*src[ 5*16+i] - 87*src[ 7*16+i] - 25*src[ 9*16+i] + 57*src[11*16+i] + 90*src[13*16+i] + 43*src[15*16+i];<br>+// O3 = 70*src[ 1*16+i] - 43*src[ 3*16+i] - 87*src[ 5*16+i] +  9*src[ 7*16+i] + 90*src[ 9*16+i] + 25*src[11*16+i] - 80*src[13*16+i] - 57*src[15*16+i];<br>+// O4 = 57*src[ 1*16+i] - 80*src[ 3*16+i] - 25*src[ 5*16+i] + 90*src[ 7*16+i] -  9*src[ 9*16+i] - 87*src[11*16+i] + 43*src[13*16+i] + 70*src[15*16+i];<br>+// O5 = 43*src[ 1*16+i] - 90*src[ 3*16+i] + 57*src[ 5*16+i] + 25*src[ 7*16+i] - 87*src[ 9*16+i] + 70*src[11*16+i] +  9*src[13*16+i] - 80*src[15*16+i];<br>+// O6 = 25*src[ 1*16+i] - 70*src[ 3*16+i] + 90*src[ 5*16+i] - 80*src[ 7*16+i] + 43*src[ 9*16+i] +  9*src[11*16+i] - 57*src[13*16+i] + 87*src[15*16+i];<br>+// O7 =  9*src[ 1*16+i] - 25*src[ 3*16+i] + 43*src[ 5*16+i] - 57*src[ 7*16+i] + 70*src[ 9*16+i] - 80*src[11*16+i] + 87*src[13*16+i] - 90*src[15*16+i];<br>+    smull           v2.4s, v16.4h, v1.h[0]          // v2 = O0 = 90*[1]<br>+    smull           v3.4s, v16.4h, v1.h[1]          // v3 = O1 = 87*[1]<br>+    smull           v4.4s, v16.4h, v1.h[2]          // v4 = O2 = 80*[1]<br>+    smull           v5.4s, v16.4h, v1.h[3]          // v5 = O3 = 70*[1]<br>+    smull           v6.4s, v16.4h, v1.h[4]          // v6 = O4 = 57*[1]<br>+    smull           v7.4s, v16.4h, v1.h[5]          // v7 = O5 = 43*[1]<br>+    smull           v8.4s, v16.4h, v1.h[6]          // v8 = O6 = 25*[1]<br>+    smull           v9.4s, v16.4h, v1.h[7]          // v9 = O7 =  9*[1]<br>+<br>+    smlal           v2.4s, v17.4h, v1.h[1]          // v2 = O0 = 90*[1]+87*[3]<br>+    smlal           v3.4s, v17.4h, v1.h[4]          // v3 = O1 = 87*[1]+57*[3]<br>+    smlal           v4.4s, v17.4h, v1.h[7]          // v4 = O2 = 80*[1]+ 9*[3]<br>+    smlsl           v5.4s, v17.4h, v1.h[5]          // v5 = O3 = 70*[1]-43*[3]<br>+    smlsl           v6.4s, v17.4h, v1.h[2]          // v6 = O4 = 57*[1]-80*[3]<br>+    smlsl           v7.4s, v17.4h, v1.h[0]          // v7 = O5 = 43*[1]-90*[3]<br>+    smlsl           v8.4s, v17.4h, v1.h[3]          // v8 = O6 = 25*[1]-70*[3]<br>+    smlsl           v9.4s, v17.4h, v1.h[6]          // v9 = O7 =  9*[1]-25*[3]<br>+<br>+    cmp             x7, #0<br>+    beq             1f<br>+<br>+    smlal           v2.4s, v18.4h, v1.h[2]          // v2 = O0 = 90*[1]+87*[3]+80*[5]<br>+    smlal           v3.4s, v18.4h, v1.h[7]          // v3 = O1 = 87*[1]+57*[3]+ 9*[5]<br>+    smlsl           v4.4s, v18.4h, v1.h[3]          // v4 = O2 = 80*[1]+ 9*[3]-70*[5]<br>+    smlsl           v5.4s, v18.4h, v1.h[1]          // v5 = O3 = 70*[1]-43*[3]-87*[5]<br>+    smlsl           v6.4s, v18.4h, v1.h[6]          // v6 = O4 = 57*[1]-80*[3]-25*[5]<br>+    smlal           v7.4s, v18.4h, v1.h[4]          // v7 = O5 = 43*[1]-90*[3]+57*[5]<br>+    smlal           v8.4s, v18.4h, v1.h[0]          // v8 = O6 = 25*[1]-70*[3]+90*[5]<br>+    smlal           v9.4s, v18.4h, v1.h[5]          // v9 = O7 =  9*[1]-25*[3]+43*[5]<br>+<br>+    smlal           v2.4s, v19.4h, v1.h[3]          // v2 = O0 = 90*[1]+87*[3]+80*[5]+70*[7]<br>+    smlsl           v3.4s, v19.4h, v1.h[5]          // v3 = O1 = 87*[1]+57*[3]+ 9*[5]-43*[7]<br>+    smlsl           v4.4s, v19.4h, v1.h[1]          // v4 = O2 = 80*[1]+ 9*[3]-70*[5]-87*[7]<br>+    smlal           v5.4s, v19.4h, v1.h[7]          // v5 = O3 = 70*[1]-43*[3]-87*[5]+ 9*[7]<br>+    smlal           v6.4s, v19.4h, v1.h[0]          // v6 = O4 = 57*[1]-80*[3]-25*[5]+90*[7]<br>+    smlal           v7.4s, v19.4h, v1.h[6]          // v7 = O5 = 43*[1]-90*[3]+57*[5]+25*[7]<br>+    smlsl           v8.4s, v19.4h, v1.h[2]          // v8 = O6 = 25*[1]-70*[3]+90*[5]-80*[7]<br>+    smlsl           v9.4s, v19.4h, v1.h[4]          // v9 = O7 =  9*[1]-25*[3]+43*[5]-57*[7]<br>+<br>+1:<br>+    ldr             d16, [x0, #(9*16*2)]<br>+    ldr             d17, [x0, #(11*16*2)]<br>+    ldr             d18, [x0, #(13*16*2)]<br>+    ldr             d19, [x0, #(15*16*2)]<br>+<br>+    cmp             x6, #0<br>+    beq             1f<br>+<br>+    smlal           v24.4s, v20.4h, v0.h[0]         // EEE0 = 64*[0]+64*[8]<br>+    smlsl           v25.4s, v20.4h, v0.h[0]         // EEE1 = 64*[0]-64*[8]<br>+    smlal           v26.4s, v22.4h, v0.h[2]         // EEO0 = 83*[0]+36*[12]<br>+    smlsl           v27.4s, v22.4h, v0.h[1]         // EEO1 = 36*[0]-83*[12]<br>+<br>+    smlal           v28.4s, v21.4h, v0.h[5]         // EO0 = 89*[2]+75*[6]+50*[10]<br>+    smlsl           v29.4s, v21.4h, v0.h[3]         // EO1 = 75*[2]-18*[6]-89*[10]<br>+    smlal           v30.4s, v21.4h, v0.h[6]         // EO2 = 50*[2]-89*[6]+18*[10]<br>+    smlal           v31.4s, v21.4h, v0.h[4]         // EO3 = 18*[2]-50*[6]+75*[10]<br>+<br>+    smlal           v28.4s, v23.4h, v0.h[6]         // EO0 = 89*[2]+75*[6]+50*[10]+18*[14]<br>+    smlsl           v29.4s, v23.4h, v0.h[5]         // EO1 = 75*[2]-18*[6]-89*[10]-50*[14]<br>+    smlal           v30.4s, v23.4h, v0.h[4]         // EO2 = 50*[2]-89*[6]+18*[10]+75*[14]<br>+    smlsl           v31.4s, v23.4h, v0.h[3]         // EO3 = 18*[2]-50*[6]+75*[10]-89*[14]<br>+<br>+1:<br>+    orr             v20.8b, v16.8b, v17.8b<br>+    orr             v21.8b, v18.8b, v19.8b<br>+    mov             x6, v20.d[0]<br>+    mov             x7, v21.d[0]<br>+<br>+    add             v20.4s, v24.4s, v26.4s          // EE0 = EEE0+EEO0<br>+    add             v21.4s, v25.4s, v27.4s          // EE1 = EEE1+EEO1<br>+    sub             v22.4s, v25.4s, v27.4s          // EE2 = EEE1-EEO1<br>+    sub             v23.4s, v24.4s, v26.4s          // EE3 = EEE0-EEO0<br>+<br>+    add             v24.4s, v20.4s, v28.4s          // v24 = E0 = EE0+EO0<br>+    sub             v25.4s, v20.4s, v28.4s          // v25 = E7 = EE0-EO0<br>+    add             v26.4s, v21.4s, v29.4s          // v26 = E1 = EE1+EO1<br>+    sub             v27.4s, v21.4s, v29.4s          // v27 = E6 = EE1-EO1<br>+    add             v28.4s, v22.4s, v30.4s          // v28 = E2 = EE2+EO2<br>+    sub             v29.4s, v22.4s, v30.4s          // v29 = E5 = EE2-EO2<br>+    add             v30.4s, v23.4s, v31.4s          // v30 = E3 = EE3+EO3<br>+    sub             v31.4s, v23.4s, v31.4s          // v31 = E4 = EE3-EO3<br>+<br>+    cmp             x6, #0<br>+    beq             1f<br>+<br>+    smlal           v2.4s, v16.4h, v1.h[4]          // v2 = O0 = 90*[1]+87*[3]+80*[5]+70*[7]+57*[9]<br>+    smlsl           v3.4s, v16.4h, v1.h[2]          // v3 = O1 = 87*[1]+57*[3]+ 9*[5]-43*[7]-80*[9]<br>+    smlsl           v4.4s, v16.4h, v1.h[6]          // v4 = O2 = 80*[1]+ 9*[3]-70*[5]-87*[7]-25*[9]<br>+    smlal           v5.4s, v16.4h, v1.h[0]          // v5 = O3 = 70*[1]-43*[3]-87*[5]+ 9*[7]+90*[9]<br>+    smlsl           v6.4s, v16.4h, v1.h[7]          // v6 = O4 = 57*[1]-80*[3]-25*[5]+90*[7]- 9*[9]<br>+    smlsl           v7.4s, v16.4h, v1.h[1]          // v7 = O5 = 43*[1]-90*[3]+57*[5]+25*[7]-87*[9]<br>+    smlal           v8.4s, v16.4h, v1.h[5]          // v8 = O6 = 25*[1]-70*[3]+90*[5]-80*[7]+43*[9]<br>+    smlal           v9.4s, v16.4h, v1.h[3]          // v9 = O7 =  9*[1]-25*[3]+43*[5]-57*[7]+70*[9]<br>+<br>+    smlal           v2.4s, v17.4h, v1.h[5]          // v2 = O0 = 90*[1]+87*[3]+80*[5]+70*[7]+57*[9]+43*[11]<br>+    smlsl           v3.4s, v17.4h, v1.h[0]          // v3 = O1 = 87*[1]+57*[3]+ 9*[5]-43*[7]-80*[9]-90*[11]<br>+    smlal           v4.4s, v17.4h, v1.h[4]          // v4 = O2 = 80*[1]+ 9*[3]-70*[5]-87*[7]-25*[9]+57*[11]<br>+    smlal           v5.4s, v17.4h, v1.h[6]          // v5 = O3 = 70*[1]-43*[3]-87*[5]+ 9*[7]+90*[9]+25*[11]<br>+    smlsl           v6.4s, v17.4h, v1.h[1]          // v6 = O4 = 57*[1]-80*[3]-25*[5]+90*[7]- 9*[9]-87*[11]<br>+    smlal           v7.4s, v17.4h, v1.h[3]          // v7 = O5 = 43*[1]-90*[3]+57*[5]+25*[7]-87*[9]+70*[11]<br>+    smlal           v8.4s, v17.4h, v1.h[7]          // v8 = O6 = 25*[1]-70*[3]+90*[5]-80*[7]+43*[9]+ 9*[11]<br>+    smlsl           v9.4s, v17.4h, v1.h[2]          // v9 = O7 =  9*[1]-25*[3]+43*[5]-57*[7]+70*[9]-80*[11]<br>+<br>+1:<br>+    cmp             x7, #0<br>+    beq             1f<br>+<br>+    smlal           v2.4s, v18.4h, v1.h[6]          // v2 = O0 = 90*[1]+87*[3]+80*[5]+70*[7]+57*[9]+43*[11]+25*[13]<br>+    smlsl           v3.4s, v18.4h, v1.h[3]          // v3 = O1 = 87*[1]+57*[3]+ 9*[5]-43*[7]-80*[9]-90*[11]-70*[13]<br>+    smlal           v4.4s, v18.4h, v1.h[0]          // v4 = O2 = 80*[1]+ 9*[3]-70*[5]-87*[7]-25*[9]+57*[11]+90*[13]<br>+    smlsl           v5.4s, v18.4h, v1.h[2]          // v5 = O3 = 70*[1]-43*[3]-87*[5]+ 9*[7]+90*[9]+25*[11]-80*[13]<br>+    smlal           v6.4s, v18.4h, v1.h[5]          // v6 = O4 = 57*[1]-80*[3]-25*[5]+90*[7]- 9*[9]-87*[11]+43*[13]<br>+    smlal           v7.4s, v18.4h, v1.h[7]          // v7 = O5 = 43*[1]-90*[3]+57*[5]+25*[7]-87*[9]+70*[11]+ 9*[13]<br>+    smlsl           v8.4s, v18.4h, v1.h[4]          // v8 = O6 = 25*[1]-70*[3]+90*[5]-80*[7]+43*[9]+ 9*[11]-57*[13]<br>+    smlal           v9.4s, v18.4h, v1.h[1]          // v9 = O7 =  9*[1]-25*[3]+43*[5]-57*[7]+70*[9]-80*[11]+87*[13]<br>+<br>+    smlal           v2.4s, v19.4h, v1.h[7]          // v2 = O0 = 90*[1]+87*[3]+80*[5]+70*[7]+57*[9]+43*[11]+25*[13]+ 9*[15]<br>+    smlsl           v3.4s, v19.4h, v1.h[6]          // v3 = O1 = 87*[1]+57*[3]+ 9*[5]-43*[7]-80*[9]-90*[11]-70*[13]-25*[15]<br>+    smlal           v4.4s, v19.4h, v1.h[5]          // v4 = O2 = 80*[1]+ 9*[3]-70*[5]-87*[7]-25*[9]+57*[11]+90*[13]+43*[15]<br>+    smlsl           v5.4s, v19.4h, v1.h[4]          // v5 = O3 = 70*[1]-43*[3]-87*[5]+ 9*[7]+90*[9]+25*[11]-80*[13]-57*[15]<br>+    smlal           v6.4s, v19.4h, v1.h[3]          // v6 = O4 = 57*[1]-80*[3]-25*[5]+90*[7]- 9*[9]-87*[11]+43*[13]+70*[15]<br>+    smlsl           v7.4s, v19.4h, v1.h[2]          // v7 = O5 = 43*[1]-90*[3]+57*[5]+25*[7]-87*[9]+70*[11]+ 9*[13]-80*[15]<br>+    smlal           v8.4s, v19.4h, v1.h[1]          // v8 = O6 = 25*[1]-70*[3]+90*[5]-80*[7]+43*[9]+ 9*[11]-57*[13]+87*[15]<br>+    smlsl           v9.4s, v19.4h, v1.h[0]          // v9 = O7 =  9*[1]-25*[3]+43*[5]-57*[7]+70*[9]-80*[11]+87*[13]-90*[15]<br>+<br>+1:<br>+    add             v16.4s, v24.4s, v2.4s           // [ 0] = E0+O0<br>+    sub             v17.4s, v24.4s, v2.4s           // [15] = E0-O0<br>+    add             v18.4s, v26.4s, v3.4s           // [ 1] = E1+O1<br>+    sub             v19.4s, v26.4s, v3.4s           // [14] = E1-O1<br>+    add             v20.4s, v28.4s, v4.4s           // [ 2] = E2+O2<br>+    sub             v21.4s, v28.4s, v4.4s           // [13] = E2-O2<br>+    add             v22.4s, v30.4s, v5.4s           // [ 3] = E3+O3<br>+    sub             v23.4s, v30.4s, v5.4s           // [12] = E3-O3<br>+    sqrshrn         v16.4h, v16.4s, #idct_shift_1<br>+    sqrshrn         v17.4h, v17.4s, #idct_shift_1<br>+    sqrshrn         v18.4h, v18.4s, #idct_shift_1<br>+    sqrshrn         v19.4h, v19.4s, #idct_shift_1<br>+    sqrshrn         v20.4h, v20.4s, #idct_shift_1<br>+    sqrshrn         v21.4h, v21.4s, #idct_shift_1<br>+    sqrshrn         v22.4h, v22.4s, #idct_shift_1<br>+    sqrshrn         v23.4h, v23.4s, #idct_shift_1<br>+    str             d16, [x5, #( 0*16*2)]<br>+    str             d17, [x5, #(15*16*2)]<br>+    str             d18, [x5, #( 1*16*2)]<br>+    str             d19, [x5, #(14*16*2)]<br>+    str             d20, [x5, #( 2*16*2)]<br>+    str             d21, [x5, #(13*16*2)]<br>+    str             d22, [x5, #( 3*16*2)]<br>+    str             d23, [x5, #(12*16*2)]<br>+<br>+    add             v16.4s, v31.4s, v6.4s           // [ 4] = E4+O4<br>+    sub             v17.4s, v31.4s, v6.4s           // [11] = E4-O4<br>+    add             v18.4s, v29.4s, v7.4s           // [ 5] = E5+O5<br>+    sub             v19.4s, v29.4s, v7.4s           // [10] = E5-O5<br>+    add             v20.4s, v27.4s, v8.4s           // [ 6] = E6+O6<br>+    sub             v21.4s, v27.4s, v8.4s           // [ 9] = E6-O6<br>+    add             v22.4s, v25.4s, v9.4s           // [ 7] = E7+O7<br>+    sub             v23.4s, v25.4s, v9.4s           // [ 8] = E7-O7<br>+    sqrshrn         v16.4h, v16.4s, #idct_shift_1<br>+    sqrshrn         v17.4h, v17.4s, #idct_shift_1<br>+    sqrshrn         v18.4h, v18.4s, #idct_shift_1<br>+    sqrshrn         v19.4h, v19.4s, #idct_shift_1<br>+    sqrshrn         v20.4h, v20.4s, #idct_shift_1<br>+    sqrshrn         v21.4h, v21.4s, #idct_shift_1<br>+    sqrshrn         v22.4h, v22.4s, #idct_shift_1<br>+    sqrshrn         v23.4h, v23.4s, #idct_shift_1<br>+    str             d16, [x5, #( 4*16*2)]<br>+    str             d17, [x5, #(11*16*2)]<br>+    str             d18, [x5, #( 5*16*2)]<br>+    str             d19, [x5, #(10*16*2)]<br>+    str             d20, [x5, #( 6*16*2)]<br>+    str             d21, [x5, #( 9*16*2)]<br>+    str             d22, [x5, #( 7*16*2)]<br>+    str             d23, [x5, #( 8*16*2)]<br>+<br>+<br>+    add             x0, x0, #(4*2)<br>+    add             x5, x5, #(4*2)<br>+    sub             w4, w4, #4<br>+    cbnz            w4, 5b<br>+<br>+    // Pass2<br>+    mov             x5, sp<br>+    mov             w4, #16<br>+<br>+    ldp             q0, q1, [x8, #(32*1)]<br>+    ldp             q2, q3, [x8, #(32*2)]<br>+    ldp             q4, q5, [x8, #(32*3)]<br>+    ldp             q6, q7, [x8, #(32*4)]<br>+    ldp             q8, q9, [x8, #(32*5)]<br>+    ldp             q16, q17, [x8, #(32*6)]<br>+    ldr             q18, [x8, #(32*7)]<br>+<br>+6:<br>+    ld2             {v30.8h, v31.8h}, [x5]          // v30 = [14 12 10 8 6 4 2 0], v31 = [15 13 11 9 7 5 3 1]<br>+    mov             x6, v31.d[1]<br>+<br>+    uzp1            v20.8h, v30.8h, v30.8h           // v20 = [12 8 4 0]<br>+    uzp2            v21.8h, v30.8h, v30.8h           // v21 = [14 10 6 2]<br>+<br>+// EE0 = 64*dst[0+dstStride*i] + 83*dst[4+dstStride*i] + 64*dst[ 8+dstStride*i] + 36*dst[12+dstStride*i];<br>+// EE1 = 64*dst[0+dstStride*i] + 36*dst[4+dstStride*i] - 64*dst[ 8+dstStride*i] - 83*dst[12+dstStride*i];<br>+// EE2 = 64*dst[0+dstStride*i] - 36*dst[4+dstStride*i] - 64*dst[ 8+dstStride*i] + 83*dst[12+dstStride*i];<br>+// EE3 = 64*dst[0+dstStride*i] - 83*dst[4+dstStride*i] + 64*dst[ 8+dstStride*i] - 36*dst[12+dstStride*i];<br>+<br>+    smull           v22.4s, v20.4h, v0.4h            // EE0<br>+    smull2          v23.4s, v20.8h, v0.8h            // EE1<br>+    smull           v24.4s, v20.4h, v1.4h            // EE2<br>+    smull2          v25.4s, v20.8h, v1.8h            // EE3<br>+<br>+// EO0 = 89*dst[ 2+dstStride*i] + 75*dst[ 6+dstStride*i] + 50*dst[10+dstStride*i] + 18*dst[14+dstStride*i];<br>+// EO1 = 75*dst[ 2+dstStride*i] - 18*dst[ 6+dstStride*i] - 89*dst[10+dstStride*i] - 50*dst[14+dstStride*i];<br>+// EO2 = 50*dst[ 2+dstStride*i] - 89*dst[ 6+dstStride*i] + 18*dst[10+dstStride*i] + 75*dst[14+dstStride*i];<br>+// EO3 = 18*dst[ 2+dstStride*i] - 50*dst[ 6+dstStride*i] + 75*dst[10+dstStride*i] - 89*dst[14+dstStride*i];<br>+    smull           v26.4s, v21.4h, v2.4h            // EO0<br>+    smull2          v27.4s, v21.8h, v2.8h            // EO1<br>+    smull           v28.4s, v21.4h, v3.4h            // EO2<br>+    smull2          v29.4s, v21.8h, v3.8h            // EO3<br>+<br>+// E0 = EE0 + EO0;<br>+// E1 = EE1 + EO1;<br>+// E2 = EE2 + EO2;<br>+// E3 = EE3 + EO3;<br>+// E4 = EE3 - EO3;<br>+// E5 = EE2 - EO2;<br>+// E6 = EE1 - EO1;<br>+// E7 = EE0 - EO0;<br>+<br>+    addp    v20.4s, v22.4s, v23.4s                  // [EE1 EE0]<br>+    addp    v21.4s, v24.4s, v25.4s                  // [EE3 EE2]<br>+    addp    v22.4s, v26.4s, v27.4s                  // [EO1 EO0]<br>+    addp    v23.4s, v28.4s, v29.4s                  // [EO3 EO2]<br>+    addp    v24.4s, v20.4s, v21.4s                  // v24 = [EE3 EE2 EE1 EE0]<br>+    addp    v25.4s, v22.4s, v23.4s                  // v25 = [EO3 EO2 EO1 EO0]<br>+<br>+    add     v19.4s, v24.4s, v25.4s                  // v19 = [E3 E2 E1 E0]<br>+    sub     v20.4s, v24.4s, v25.4s                  // v20 = [E4 E5 E6 E7]<br>+    //tbl     v21.16b, {v20.16b}, v18.16b             // v21 = [E0 E1 E2 E3]<br>+    //tbl     v22.16b, {v21.16b}, v18.16b             // v22 = [E7 E6 E5 E4]<br>+<br>+// O0 =   90*dst[ 1+dstStride*i] + 87*dst[ 3+dstStride*i] + 80*dst[ 5+dstStride*i] + 70*dst[ 7+dstStride*i] + 57*dst[ 9+dstStride*i] + 43*dst[11+dstStride*i] + 25*dst[13+dstStride*i] +  9*dst[15+dstStride*i];<br>+// O1 =   87*dst[ 1+dstStride*i] + 57*dst[ 3+dstStride*i] +  9*dst[ 5+dstStride*i] - 43*dst[ 7+dstStride*i] - 80*dst[ 9+dstStride*i] - 90*dst[11+dstStride*i] - 70*dst[13+dstStride*i] - 25*dst[15+dstStride*i];<br>+// O2 =   80*dst[ 1+dstStride*i] +  9*dst[ 3+dstStride*i] - 70*dst[ 5+dstStride*i] - 87*dst[ 7+dstStride*i] - 25*dst[ 9+dstStride*i] + 57*dst[11+dstStride*i] + 90*dst[13+dstStride*i] + 43*dst[15+dstStride*i];<br>+// O3 =   70*dst[ 1+dstStride*i] - 43*dst[ 3+dstStride*i] - 87*dst[ 5+dstStride*i] +  9*dst[ 7+dstStride*i] + 90*dst[ 9+dstStride*i] + 25*dst[11+dstStride*i] - 80*dst[13+dstStride*i] - 57*dst[15+dstStride*i];<br>+// O4 =   57*dst[ 1+dstStride*i] - 80*dst[ 3+dstStride*i] - 25*dst[ 5+dstStride*i] + 90*dst[ 7+dstStride*i] -  9*dst[ 9+dstStride*i] - 87*dst[11+dstStride*i] + 43*dst[13+dstStride*i] + 70*dst[15+dstStride*i];<br>+// O5 =   43*dst[ 1+dstStride*i] - 90*dst[ 3+dstStride*i] + 57*dst[ 5+dstStride*i] + 25*dst[ 7+dstStride*i] - 87*dst[ 9+dstStride*i] + 70*dst[11+dstStride*i] +  9*dst[13+dstStride*i] - 80*dst[15+dstStride*i];<br>+// O6 =   25*dst[ 1+dstStride*i] - 70*dst[ 3+dstStride*i] + 90*dst[ 5+dstStride*i] - 80*dst[ 7+dstStride*i] + 43*dst[ 9+dstStride*i] +  9*dst[11+dstStride*i] - 57*dst[13+dstStride*i] + 87*dst[15+dstStride*i];<br>+// O7 =    9*dst[ 1+dstStride*i] - 25*dst[ 3+dstStride*i] + 43*dst[ 5+dstStride*i] - 57*dst[ 7+dstStride*i] + 70*dst[ 9+dstStride*i] - 80*dst[11+dstStride*i] + 87*dst[13+dstStride*i] - 90*dst[15+dstStride*i];<br>+    // Free v21-v30<br>+    smull   v23.4s, v31.4h, v4.4h                   // v23 = [O0]<br>+    smull   v24.4s, v31.4h, v5.4h                   // v24 = [O1]<br>+    smull   v25.4s, v31.4h, v6.4h                   // v25 = [O2]<br>+    smull   v26.4s, v31.4h, v7.4h                   // v26 = [O3]<br>+    smull   v27.4s, v31.4h, v8.4h                   // v27 = [O4]<br>+    smull   v28.4s, v31.4h, v9.4h                   // v28 = [O5]<br>+    smull   v29.4s, v31.4h, v16.4h                  // v29 = [O6]<br>+    smull   v30.4s, v31.4h, v17.4h                  // v30 = [O7]<br>+<br>+    cmp     x6, #0<br>+    beq     1f<br>+<br>+    smlal2  v23.4s, v31.8h, v4.8h<br>+    smlal2  v24.4s, v31.8h, v5.8h<br>+    smlal2  v25.4s, v31.8h, v6.8h<br>+    smlal2  v26.4s, v31.8h, v7.8h<br>+    smlal2  v27.4s, v31.8h, v8.8h<br>+    smlal2  v28.4s, v31.8h, v9.8h<br>+    smlal2  v29.4s, v31.8h, v16.8h<br>+    smlal2  v30.4s, v31.8h, v17.8h<br>+<br>+1:<br>+//        dst[i*dstStride+ 0] = x265_clip3( -32768, 32767, (E0 + O0 + rnd) >> nShift);<br>+//        dst[i*dstStride+ 1] = x265_clip3( -32768, 32767, (E1 + O1 + rnd) >> nShift);<br>+//        dst[i*dstStride+ 2] = x265_clip3( -32768, 32767, (E2 + O2 + rnd) >> nShift);<br>+//        dst[i*dstStride+ 3] = x265_clip3( -32768, 32767, (E3 + O3 + rnd) >> nShift);<br>+//        dst[i*dstStride+ 4] = x265_clip3( -32768, 32767, (E4 + O4 + rnd) >> nShift);<br>+//        dst[i*dstStride+ 5] = x265_clip3( -32768, 32767, (E5 + O5 + rnd) >> nShift);<br>+//        dst[i*dstStride+ 6] = x265_clip3( -32768, 32767, (E6 + O6 + rnd) >> nShift);<br>+//        dst[i*dstStride+ 7] = x265_clip3( -32768, 32767, (E7 + O7 + rnd) >> nShift);<br>+//        dst[i*dstStride+ 8] = x265_clip3( -32768, 32767, (E7 - O7 + rnd) >> nShift);<br>+//        dst[i*dstStride+ 9] = x265_clip3( -32768, 32767, (E6 - O6 + rnd) >> nShift);<br>+//        dst[i*dstStride+10] = x265_clip3( -32768, 32767, (E5 - O5 + rnd) >> nShift);<br>+//        dst[i*dstStride+11] = x265_clip3( -32768, 32767, (E4 - O4 + rnd) >> nShift);<br>+//        dst[i*dstStride+12] = x265_clip3( -32768, 32767, (E3 - O3 + rnd) >> nShift);<br>+//        dst[i*dstStride+13] = x265_clip3( -32768, 32767, (E2 - O2 + rnd) >> nShift);<br>+//        dst[i*dstStride+14] = x265_clip3( -32768, 32767, (E1 - O1 + rnd) >> nShift);<br>+//        dst[i*dstStride+15] = x265_clip3( -32768, 32767, (E0 - O0 + rnd) >> nShift);<br>+    addp    v23.4s, v23.4s, v24.4s                  // [O1 O0]<br>+    addp    v24.4s, v25.4s, v26.4s                  // [O3 O2]<br>+    addp    v25.4s, v28.4s, v27.4s                  // [O4 O5]<br>+    addp    v26.4s, v30.4s, v29.4s                  // [O6 O7]<br>+    addp    v23.4s, v23.4s, v24.4s                  // v23 = [O3 O2 O1 O0]<br>+    addp    v24.4s, v26.4s, v25.4s                  // v24 = [O4 O5 O6 O7]<br>+<br>+    add     v26.4s, v20.4s, v24.4s                  // v26 = [4 5 6 7]<br>+    sub     v27.4s, v19.4s, v23.4s                  // v27 = [12 13 14 15]<br>+    add     v25.4s, v19.4s, v23.4s                  // v25 = [3 2 1 0]<br>+    sub     v28.4s, v20.4s, v24.4s                  // v28 = [11 10 9 8]<br>+<br>+    tbl     v26.16b, {v26.16b}, v18.16b             // v26 = [7 6 5 4]<br>+    tbl     v27.16b, {v27.16b}, v18.16b             // v27 = [15 14 13 12]<br>+<br>+    sqrshrn         v20.4h, v25.4s, #idct_shift_2<br>+    sqrshrn         v21.4h, v26.4s, #idct_shift_2<br>+    sqrshrn         v22.4h, v28.4s, #idct_shift_2<br>+    sqrshrn         v23.4h, v27.4s, #idct_shift_2<br>+    stp             d20, d21, [x1, #0]<br>+    stp             d22, d23, [x1, #16]<br>+<br>+    add             x1, x1, x2, lsl #1<br>+    add             x5, x5, #(16*2)<br>+    sub             w4, w4, #1<br>+    cbnz            w4, 6b<br>+9:<br>+    add             sp, sp, #(16*16*2)<br>+    ldp             d8, d9, [sp], #16<br>+    ret<br>+endfunc<br>-- <br>2.36.0.windows.1<br><br></div></div>