<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:SimSun;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:DengXian;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:Aptos;
panose-1:2 11 0 4 2 2 2 2 2 4;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
{font-family:"\@DengXian";
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"\@SimSun";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:10.0pt;
font-family:"Aptos",sans-serif;}
pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0in;
font-size:10.0pt;
font-family:"Courier New";}
span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:Consolas;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="#467886" vlink="#96607D" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt">Thanks for the comment! I sent a v2 patch with the fixes.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Li<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<div id="mail-editor-reference-message-container">
<div>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">chen <chenm003@163.com><br>
<b>Date: </b>Saturday, 2025. June 14. at 6:15<br>
<b>To: </b>Development for x265 <x265-devel@videolan.org><br>
<b>Cc: </b>nd <nd@arm.com>, Li Zhang <Li.Zhang2@arm.com><br>
<b>Subject: </b>Re:[x265] [PATCH] AArch64: Optimize and clean up add_ps Neon and SVE2 functions<o:p></o:p></span></p>
</div>
<div>
<div id="spnEditorContent">
<p style="margin:0in"><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black">Thank for the patch, it looks good, just a comment,<o:p></o:p></span></p>
<p style="margin:0in"><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p> </o:p></span></p>
</div>
<p style="margin:0in"><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black">+ int16x8_t sum_lo = vaddq_s16(vreinterpretq_s16_u16(s0_lo), s1_lo);<o:p></o:p></span></p>
<p style="margin:0in"><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black">+ int16x8_t sum_hi = vaddq_s16(vreinterpretq_s16_u16(s0_hi), s1_hi);<o:p></o:p></span></p>
<p style="margin:0in"><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black">+ sum_lo = vminq_s16(sum_lo, vdupq_n_s16((1 << X265_DEPTH) - 1));<o:p></o:p></span></p>
<p style="margin:0in"><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black">+ sum_lo = vmaxq_s16(sum_lo, vdupq_n_s16(0));<o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black">On A64, we may use USQADD, it save <i>VMAXQ</i><o:p></o:p></span></p>
</div>
<pre><span style="color:black"><br>At 2025-06-12 18:21:00, "Li Zhang" <li.zhang2@arm.com> wrote:<o:p></o:p></span></pre>
<pre><span style="color:black">>Optimize the standard bit-depth Neon intrinsics implementation to use<o:p></o:p></span></pre>
<pre><span style="color:black">>ADDW instead of UXTL and ADD. Also unroll the Neon intrinsics<o:p></o:p></span></pre>
<pre><span style="color:black">>implementations to enable the usage of LDP and STP. Implement Neon<o:p></o:p></span></pre>
<pre><span style="color:black">>intrinsics for blocksizes of width 4.<o:p></o:p></span></pre>
<pre><span style="color:black">><o:p> </o:p></span></pre>
<pre><span style="color:black">>Delete the Neon and SVE2 assembly implementation as they are slower than<o:p></o:p></span></pre>
<pre><span style="color:black">>Neon intrinsics implementation.<o:p></o:p></span></pre>
<pre><span style="color:black">>---<o:p></o:p></span></pre>
<pre><span style="color:black">> source/common/aarch64/asm-primitives.cpp | 64 -----<o:p></o:p></span></pre>
<pre><span style="color:black">> source/common/aarch64/pixel-prim.cpp | 104 +++++++--<o:p></o:p></span></pre>
<pre><span style="color:black">> source/common/aarch64/pixel-util-sve2.S | 286 -----------------------<o:p></o:p></span></pre>
<pre><span style="color:black">> source/common/aarch64/pixel-util.S | 183 ---------------<o:p></o:p></span></pre>
<pre><span style="color:black">> 4 files changed, 79 insertions(+), 558 deletions(-)<o:p></o:p></span></pre>
<pre><span style="color:black">><o:p> </o:p></span></pre>
<pre><span style="color:black">>diff --git a/source/common/aarch64/asm-primitives.cpp b/source/common/aarch64/asm-primitives.cpp<o:p></o:p></span></pre>
<pre><span style="color:black">>index 5ce9352bd..f6203c857 100644<o:p></o:p></span></pre>
<pre><span style="color:black">>--- a/source/common/aarch64/asm-primitives.cpp<o:p></o:p></span></pre>
<pre><span style="color:black">>+++ b/source/common/aarch64/asm-primitives.cpp<o:p></o:p></span></pre>
<pre><span style="color:black">>@@ -504,38 +504,6 @@ void setupNeonPrimitives(EncoderPrimitives &p)<o:p></o:p></span></pre>
<pre><span style="color:black">> p.chroma[X265_CSP_I422].cu[BLOCK_422_16x32].sub_ps = PFX(pixel_sub_ps_16x32_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">> p.chroma[X265_CSP_I422].cu[BLOCK_422_32x64].sub_ps = PFX(pixel_sub_ps_32x64_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">> <o:p></o:p></span></pre>
<pre><span style="color:black">>- // pixel_add_ps<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_4x4].add_ps[NONALIGNED] = PFX(pixel_add_ps_4x4_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_8x8].add_ps[NONALIGNED] = PFX(pixel_add_ps_8x8_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_16x16].add_ps[NONALIGNED] = PFX(pixel_add_ps_16x16_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_32x32].add_ps[NONALIGNED] = PFX(pixel_add_ps_32x32_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_64x64].add_ps[NONALIGNED] = PFX(pixel_add_ps_64x64_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_4x4].add_ps[ALIGNED] = PFX(pixel_add_ps_4x4_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_8x8].add_ps[ALIGNED] = PFX(pixel_add_ps_8x8_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_16x16].add_ps[ALIGNED] = PFX(pixel_add_ps_16x16_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_32x32].add_ps[ALIGNED] = PFX(pixel_add_ps_32x32_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_64x64].add_ps[ALIGNED] = PFX(pixel_add_ps_64x64_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>- // chroma add_ps<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_4x4].add_ps[NONALIGNED] = PFX(pixel_add_ps_4x4_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_8x8].add_ps[NONALIGNED] = PFX(pixel_add_ps_8x8_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_16x16].add_ps[NONALIGNED] = PFX(pixel_add_ps_16x16_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_32x32].add_ps[NONALIGNED] = PFX(pixel_add_ps_32x32_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_4x8].add_ps[NONALIGNED] = PFX(pixel_add_ps_4x8_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_8x16].add_ps[NONALIGNED] = PFX(pixel_add_ps_8x16_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_16x32].add_ps[NONALIGNED] = PFX(pixel_add_ps_16x32_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_32x64].add_ps[NONALIGNED] = PFX(pixel_add_ps_32x64_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_4x4].add_ps[ALIGNED] = PFX(pixel_add_ps_4x4_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_8x8].add_ps[ALIGNED] = PFX(pixel_add_ps_8x8_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_16x16].add_ps[ALIGNED] = PFX(pixel_add_ps_16x16_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_32x32].add_ps[ALIGNED] = PFX(pixel_add_ps_32x32_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_4x8].add_ps[ALIGNED] = PFX(pixel_add_ps_4x8_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_8x16].add_ps[ALIGNED] = PFX(pixel_add_ps_8x16_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_16x32].add_ps[ALIGNED] = PFX(pixel_add_ps_16x32_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_32x64].add_ps[ALIGNED] = PFX(pixel_add_ps_32x64_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">> //scale2D_64to32<o:p></o:p></span></pre>
<pre><span style="color:black">> p.scale2D_64to32 = PFX(scale2D_64to32_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">> <o:p></o:p></span></pre>
<pre><span style="color:black">>@@ -664,38 +632,6 @@ void setupSve2Primitives(EncoderPrimitives &p)<o:p></o:p></span></pre>
<pre><span style="color:black">> p.chroma[X265_CSP_I420].cu[BLOCK_420_32x32].sub_ps = PFX(pixel_sub_ps_32x32_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">> p.chroma[X265_CSP_I422].cu[BLOCK_422_32x64].sub_ps = PFX(pixel_sub_ps_32x64_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">> <o:p></o:p></span></pre>
<pre><span style="color:black">>- // pixel_add_ps<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_4x4].add_ps[NONALIGNED] = PFX(pixel_add_ps_4x4_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_8x8].add_ps[NONALIGNED] = PFX(pixel_add_ps_8x8_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_16x16].add_ps[NONALIGNED] = PFX(pixel_add_ps_16x16_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_32x32].add_ps[NONALIGNED] = PFX(pixel_add_ps_32x32_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_64x64].add_ps[NONALIGNED] = PFX(pixel_add_ps_64x64_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_4x4].add_ps[ALIGNED] = PFX(pixel_add_ps_4x4_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_8x8].add_ps[ALIGNED] = PFX(pixel_add_ps_8x8_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_16x16].add_ps[ALIGNED] = PFX(pixel_add_ps_16x16_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_32x32].add_ps[ALIGNED] = PFX(pixel_add_ps_32x32_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.cu[BLOCK_64x64].add_ps[ALIGNED] = PFX(pixel_add_ps_64x64_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>- // chroma add_ps<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_4x4].add_ps[NONALIGNED] = PFX(pixel_add_ps_4x4_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_8x8].add_ps[NONALIGNED] = PFX(pixel_add_ps_8x8_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_16x16].add_ps[NONALIGNED] = PFX(pixel_add_ps_16x16_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_32x32].add_ps[NONALIGNED] = PFX(pixel_add_ps_32x32_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_4x8].add_ps[NONALIGNED] = PFX(pixel_add_ps_4x8_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_8x16].add_ps[NONALIGNED] = PFX(pixel_add_ps_8x16_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_16x32].add_ps[NONALIGNED] = PFX(pixel_add_ps_16x32_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_32x64].add_ps[NONALIGNED] = PFX(pixel_add_ps_32x64_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_4x4].add_ps[ALIGNED] = PFX(pixel_add_ps_4x4_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_8x8].add_ps[ALIGNED] = PFX(pixel_add_ps_8x8_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_16x16].add_ps[ALIGNED] = PFX(pixel_add_ps_16x16_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I420].cu[BLOCK_420_32x32].add_ps[ALIGNED] = PFX(pixel_add_ps_32x32_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_4x8].add_ps[ALIGNED] = PFX(pixel_add_ps_4x8_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_8x16].add_ps[ALIGNED] = PFX(pixel_add_ps_8x16_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_16x32].add_ps[ALIGNED] = PFX(pixel_add_ps_16x32_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>- p.chroma[X265_CSP_I422].cu[BLOCK_422_32x64].add_ps[ALIGNED] = PFX(pixel_add_ps_32x64_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">> // scale1D_128to64<o:p></o:p></span></pre>
<pre><span style="color:black">> p.scale1D_128to64[NONALIGNED] = PFX(scale1D_128to64_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">> p.scale1D_128to64[ALIGNED] = PFX(scale1D_128to64_sve2);<o:p></o:p></span></pre>
<pre><span style="color:black">>diff --git a/source/common/aarch64/pixel-prim.cpp b/source/common/aarch64/pixel-prim.cpp<o:p></o:p></span></pre>
<pre><span style="color:black">>index f4df6786e..851105dd8 100644<o:p></o:p></span></pre>
<pre><span style="color:black">>--- a/source/common/aarch64/pixel-prim.cpp<o:p></o:p></span></pre>
<pre><span style="color:black">>+++ b/source/common/aarch64/pixel-prim.cpp<o:p></o:p></span></pre>
<pre><span style="color:black">>@@ -1110,38 +1110,92 @@ void pixel_sub_ps_neon(int16_t *a, intptr_t dstride, const pixel *b0, const pixe<o:p></o:p></span></pre>
<pre><span style="color:black">> }<o:p></o:p></span></pre>
<pre><span style="color:black">> }<o:p></o:p></span></pre>
<pre><span style="color:black">> <o:p></o:p></span></pre>
<pre><span style="color:black">>-template<int bx, int by><o:p></o:p></span></pre>
<pre><span style="color:black">>-void pixel_add_ps_neon(pixel *a, intptr_t dstride, const pixel *b0, const int16_t *b1, intptr_t sstride0,<o:p></o:p></span></pre>
<pre><span style="color:black">>- intptr_t sstride1)<o:p></o:p></span></pre>
<pre><span style="color:black">>+template<int width, int height><o:p></o:p></span></pre>
<pre><span style="color:black">>+void pixel_add_ps_neon(pixel *dst, intptr_t dstride, const pixel *src0,<o:p></o:p></span></pre>
<pre><span style="color:black">>+ const int16_t *src1, intptr_t sstride0, intptr_t sstride1)<o:p></o:p></span></pre>
<pre><span style="color:black">> {<o:p></o:p></span></pre>
<pre><span style="color:black">>- for (int y = 0; y < by; y++)<o:p></o:p></span></pre>
<pre><span style="color:black">>+ for (int h = 0; h < height; h++)<o:p></o:p></span></pre>
<pre><span style="color:black">> {<o:p></o:p></span></pre>
<pre><span style="color:black">>- int x = 0;<o:p></o:p></span></pre>
<pre><span style="color:black">>- for (; (x + 8) <= bx; x += 8)<o:p></o:p></span></pre>
<pre><span style="color:black">>- {<o:p></o:p></span></pre>
<pre><span style="color:black">>- int16x8_t t;<o:p></o:p></span></pre>
<pre><span style="color:black">>- int16x8_t b1e = vld1q_s16(b1 + x);<o:p></o:p></span></pre>
<pre><span style="color:black">>- int16x8_t b0e;<o:p></o:p></span></pre>
<pre><span style="color:black">> #if HIGH_BIT_DEPTH<o:p></o:p></span></pre>
<pre><span style="color:black">>- b0e = vreinterpretq_s16_u16(vld1q_u16(b0 + x));<o:p></o:p></span></pre>
<pre><span style="color:black">>- t = vaddq_s16(b0e, b1e);<o:p></o:p></span></pre>
<pre><span style="color:black">>- t = vminq_s16(t, vdupq_n_s16((1 << X265_DEPTH) - 1));<o:p></o:p></span></pre>
<pre><span style="color:black">>- t = vmaxq_s16(t, vdupq_n_s16(0));<o:p></o:p></span></pre>
<pre><span style="color:black">>- vst1q_u16(a + x, vreinterpretq_u16_s16(t));<o:p></o:p></span></pre>
<pre><span style="color:black">>-#else<o:p></o:p></span></pre>
<pre><span style="color:black">>- b0e = vreinterpretq_s16_u16(vmovl_u8(vld1_u8(b0 + x)));<o:p></o:p></span></pre>
<pre><span style="color:black">>- t = vaddq_s16(b0e, b1e);<o:p></o:p></span></pre>
<pre><span style="color:black">>- vst1_u8(a + x, vqmovun_s16(t));<o:p></o:p></span></pre>
<pre><span style="color:black">>-#endif<o:p></o:p></span></pre>
<pre><span style="color:black">>+ for (int w = 0; w + 16 <= width; w += 16)<o:p></o:p></span></pre>
<pre><span style="color:black">>+ {<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint16x8_t s0_lo = vld1q_u16(src0 + w);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint16x8_t s0_hi = vld1q_u16(src0 + w + 8);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ int16x8_t s1_lo = vld1q_s16(src1 + w);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ int16x8_t s1_hi = vld1q_s16(src1 + w + 8);<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+ int16x8_t sum_lo = vaddq_s16(vreinterpretq_s16_u16(s0_lo), s1_lo);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ int16x8_t sum_hi = vaddq_s16(vreinterpretq_s16_u16(s0_hi), s1_hi);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ sum_lo = vminq_s16(sum_lo, vdupq_n_s16((1 << X265_DEPTH) - 1));<o:p></o:p></span></pre>
<pre><span style="color:black">>+ sum_lo = vmaxq_s16(sum_lo, vdupq_n_s16(0));<o:p></o:p></span></pre>
<pre><span style="color:black">>+ sum_hi = vminq_s16(sum_hi, vdupq_n_s16((1 << X265_DEPTH) - 1));<o:p></o:p></span></pre>
<pre><span style="color:black">>+ sum_hi = vmaxq_s16(sum_hi, vdupq_n_s16(0));<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+ vst1q_u16(dst + w, vreinterpretq_u16_s16(sum_lo));<o:p></o:p></span></pre>
<pre><span style="color:black">>+ vst1q_u16(dst + w + 8, vreinterpretq_u16_s16(sum_hi));<o:p></o:p></span></pre>
<pre><span style="color:black">>+ }<o:p></o:p></span></pre>
<pre><span style="color:black">>+ if (width == 8)<o:p></o:p></span></pre>
<pre><span style="color:black">>+ {<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint16x8_t s0 = vld1q_u16(src0);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ int16x8_t s1 = vld1q_s16(src1);<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+ int16x8_t sum = vaddq_s16(vreinterpretq_s16_u16(s0), s1);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ sum = vminq_s16(sum, vdupq_n_s16((1 << X265_DEPTH) - 1));<o:p></o:p></span></pre>
<pre><span style="color:black">>+ sum = vmaxq_s16(sum, vdupq_n_s16(0));<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+ vst1q_u16(dst, vreinterpretq_u16_s16(sum));<o:p></o:p></span></pre>
<pre><span style="color:black">> }<o:p></o:p></span></pre>
<pre><span style="color:black">>- for (; x < bx; x++)<o:p></o:p></span></pre>
<pre><span style="color:black">>+ if (width == 4)<o:p></o:p></span></pre>
<pre><span style="color:black">> {<o:p></o:p></span></pre>
<pre><span style="color:black">>- a[x] = (int16_t)x265_clip(b0[x] + b1[x]);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ int16x4_t s1 = vld1_s16(src1);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint16x4_t s0 = vld1_u16(src0);<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+ int16x4_t sum = vadd_s16(vreinterpret_s16_u16(s0), s1);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ sum = vmin_s16(sum, vdup_n_s16((1 << X265_DEPTH) - 1));<o:p></o:p></span></pre>
<pre><span style="color:black">>+ sum = vmax_s16(sum, vdup_n_s16(0));<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+ vst1_u16(dst, vreinterpret_u16_s16(sum));<o:p></o:p></span></pre>
<pre><span style="color:black">> }<o:p></o:p></span></pre>
<pre><span style="color:black">>+#else // !HIGH_BIT_DEPTH<o:p></o:p></span></pre>
<pre><span style="color:black">>+ for (int w = 0; w + 16 <= width; w += 16)<o:p></o:p></span></pre>
<pre><span style="color:black">>+ {<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint8x16_t s0 = vld1q_u8(src0 + w);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ int16x8_t s1_lo = vld1q_s16(src1 + w);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ int16x8_t s1_hi = vld1q_s16(src1 + w + 8);<o:p></o:p></span></pre>
<pre><span style="color:black">> <o:p></o:p></span></pre>
<pre><span style="color:black">>- b0 += sstride0;<o:p></o:p></span></pre>
<pre><span style="color:black">>- b1 += sstride1;<o:p></o:p></span></pre>
<pre><span style="color:black">>- a += dstride;<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint16x8_t sum_lo = vaddw_u8(vreinterpretq_u16_s16(s1_lo), vget_low_u8(s0));<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint16x8_t sum_hi = vaddw_u8(vreinterpretq_u16_s16(s1_hi), vget_high_u8(s0));<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint8x8_t d0_lo = vqmovun_s16(vreinterpretq_s16_u16(sum_lo));<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint8x8_t d0_hi = vqmovun_s16(vreinterpretq_s16_u16(sum_hi));<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+ vst1_u8(dst + w, d0_lo);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ vst1_u8(dst + w + 8, d0_hi);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ }<o:p></o:p></span></pre>
<pre><span style="color:black">>+ if (width == 8)<o:p></o:p></span></pre>
<pre><span style="color:black">>+ {<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint8x8_t s0 = vld1_u8(src0);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ int16x8_t s1 = vld1q_s16(src1);<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint16x8_t sum = vaddw_u8(vreinterpretq_u16_s16(s1), s0);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint8x8_t d0 = vqmovun_s16(vreinterpretq_s16_u16(sum));<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+ vst1_u8(dst, d0);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ }<o:p></o:p></span></pre>
<pre><span style="color:black">>+ if (width == 4)<o:p></o:p></span></pre>
<pre><span style="color:black">>+ {<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint8x8_t s0 = load_u8x4x1(src0);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ int16x8_t s1 = vcombine_s16(vld1_s16(src1), vdup_n_s16(0));<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint16x8_t sum = vaddw_u8(vreinterpretq_u16_s16(s1), s0);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ uint8x8_t d0 = vqmovun_s16(vreinterpretq_s16_u16(sum));<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+ store_u8x4x1(dst, d0);<o:p></o:p></span></pre>
<pre><span style="color:black">>+ }<o:p></o:p></span></pre>
<pre><span style="color:black">>+#endif<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+ src0 += sstride0;<o:p></o:p></span></pre>
<pre><span style="color:black">>+ src1 += sstride1;<o:p></o:p></span></pre>
<pre><span style="color:black">>+ dst += dstride;<o:p></o:p></span></pre>
<pre><span style="color:black">> }<o:p></o:p></span></pre>
<pre><span style="color:black">> }<o:p></o:p></span></pre>
<pre><span style="color:black">> <o:p></o:p></span></pre>
<pre><span style="color:black">>diff --git a/source/common/aarch64/pixel-util-sve2.S b/source/common/aarch64/pixel-util-sve2.S<o:p></o:p></span></pre>
<pre><span style="color:black">>index 56a2253ea..257bcd7aa 100644<o:p></o:p></span></pre>
<pre><span style="color:black">>--- a/source/common/aarch64/pixel-util-sve2.S<o:p></o:p></span></pre>
<pre><span style="color:black">>+++ b/source/common/aarch64/pixel-util-sve2.S<o:p></o:p></span></pre>
<pre><span style="color:black">>@@ -531,292 +531,6 @@ function PFX(pixel_sub_ps_32x64_sve2)<o:p></o:p></span></pre>
<pre><span style="color:black">> ret<o:p></o:p></span></pre>
<pre><span style="color:black">> endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">> <o:p></o:p></span></pre>
<pre><span style="color:black">>-function PFX(pixel_add_ps_4x4_sve2)<o:p></o:p></span></pre>
<pre><span style="color:black">>- ptrue p0.h, vl8<o:p></o:p></span></pre>
<pre><span style="color:black">>- ptrue p1.h, vl4<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z0.h}, p0/z, [x2]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z2.h}, p1/z, [x3]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x2, x2, x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x3, x3, x5, lsl #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z4.h, z0.h, z2.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z4.b, z4.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z4.h}, p1, [x0]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x0, x0, x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-function PFX(pixel_add_ps_8x8_sve2)<o:p></o:p></span></pre>
<pre><span style="color:black">>- ptrue p0.h, vl8<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 8<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z0.h}, p0/z, [x2]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z2.h}, p0/z, [x3]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x2, x2, x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x3, x3, x5, lsl #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z4.h, z0.h, z2.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z4.b, z4.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z4.h}, p0, [x0]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x0, x0, x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-.macro pixel_add_ps_16xN_sve2 h<o:p></o:p></span></pre>
<pre><span style="color:black">>-function PFX(pixel_add_ps_16x\h\()_sve2)<o:p></o:p></span></pre>
<pre><span style="color:black">>- rdvl x9, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- cmp x9, #16<o:p></o:p></span></pre>
<pre><span style="color:black">>- bgt .vl_gt_16_pixel_add_ps_16x\h<o:p></o:p></span></pre>
<pre><span style="color:black">>- ptrue p0.b, vl16<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept \h<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z0.h}, p0/z, [x2]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z1.h}, p0/z, [x2, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z2.h}, p0/z, [x3]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z3.h}, p0/z, [x3, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x2, x2, x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x3, x3, x5, lsl #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z24.h, z0.h, z2.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z25.h, z1.h, z3.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z6.b, z24.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z7.b, z25.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z6.h}, p0, [x0]<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z7.h}, p0, [x0, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x0, x0, x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-.vl_gt_16_pixel_add_ps_16x\h\():<o:p></o:p></span></pre>
<pre><span style="color:black">>- ptrue p0.b, vl32<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept \h<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z0.h}, p0/z, [x2]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z2.h}, p0/z, [x3]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x2, x2, x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x3, x3, x5, lsl #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z24.h, z0.h, z2.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z6.b, z24.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z6.h}, p0, [x0]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x0, x0, x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endm<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-pixel_add_ps_16xN_sve2 16<o:p></o:p></span></pre>
<pre><span style="color:black">>-pixel_add_ps_16xN_sve2 32<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-.macro pixel_add_ps_32xN_sve2 h<o:p></o:p></span></pre>
<pre><span style="color:black">>- function PFX(pixel_add_ps_32x\h\()_sve2)<o:p></o:p></span></pre>
<pre><span style="color:black">>- rdvl x9, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- cmp x9, #16<o:p></o:p></span></pre>
<pre><span style="color:black">>- bgt .vl_gt_16_pixel_add_ps_32x\h<o:p></o:p></span></pre>
<pre><span style="color:black">>- lsl x5, x5, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- mov w12, #\h / 4<o:p></o:p></span></pre>
<pre><span style="color:black">>-.Loop_add_ps__sve2_32x\h\():<o:p></o:p></span></pre>
<pre><span style="color:black">>- sub w12, w12, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v0.16b-v1.16b}, [x2], x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v16.8h-v19.8h}, [x3], x5<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v4.8h, v0.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl2 v5.8h, v0.16b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v6.8h, v1.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl2 v7.8h, v1.16b<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v24.8h, v4.8h, v16.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v25.8h, v5.8h, v17.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v26.8h, v6.8h, v18.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v27.8h, v7.8h, v19.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v4.8b, v24.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun2 v4.16b, v25.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v5.8b, v26.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun2 v5.16b, v27.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1 {v4.16b-v5.16b}, [x0], x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- cbnz w12, .Loop_add_ps__sve2_32x\h<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-.vl_gt_16_pixel_add_ps_32x\h\():<o:p></o:p></span></pre>
<pre><span style="color:black">>- cmp x9, #48<o:p></o:p></span></pre>
<pre><span style="color:black">>- bgt .vl_gt_48_pixel_add_ps_32x\h<o:p></o:p></span></pre>
<pre><span style="color:black">>- ptrue p0.b, vl32<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept \h<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z0.h}, p0/z, [x2]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z1.h}, p0/z, [x2, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z4.h}, p0/z, [x3]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z5.h}, p0/z, [x3, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x2, x2, x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x3, x3, x5, lsl #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z24.h, z0.h, z4.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z25.h, z1.h, z5.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z6.b, z24.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z7.b, z25.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z6.h}, p0, [x0]<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z7.h}, p0, [x0, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x0, x0, x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-.vl_gt_48_pixel_add_ps_32x\h\():<o:p></o:p></span></pre>
<pre><span style="color:black">>- ptrue p0.b, vl64<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept \h<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z0.h}, p0/z, [x2]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z4.h}, p0/z, [x3]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x2, x2, x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x3, x3, x5, lsl #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z24.h, z0.h, z4.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z6.b, z24.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z6.h}, p0, [x0]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x0, x0, x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endm<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-pixel_add_ps_32xN_sve2 32<o:p></o:p></span></pre>
<pre><span style="color:black">>-pixel_add_ps_32xN_sve2 64<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-function PFX(pixel_add_ps_64x64_sve2)<o:p></o:p></span></pre>
<pre><span style="color:black">>- rdvl x9, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- cmp x9, #16<o:p></o:p></span></pre>
<pre><span style="color:black">>- bgt .vl_gt_16_pixel_add_ps_64x64<o:p></o:p></span></pre>
<pre><span style="color:black">>- ptrue p0.b, vl16<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 64<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z0.h}, p0/z, [x2]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z1.h}, p0/z, [x2, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z2.h}, p0/z, [x2, #2, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z3.h}, p0/z, [x2, #3, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z4.h}, p0/z, [x2, #4 ,mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z5.h}, p0/z, [x2, #5, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z6.h}, p0/z, [x2, #6, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z7.h}, p0/z, [x2, #7, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z8.h}, p0/z, [x3]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z9.h}, p0/z, [x3, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z10.h}, p0/z, [x3, #2, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z11.h}, p0/z, [x3, #3, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z12.h}, p0/z, [x3, #4, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z13.h}, p0/z, [x3, #5, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z14.h}, p0/z, [x3, #6, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z15.h}, p0/z, [x3, #7, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x2, x2, x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x3, x3, x5, lsl #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z24.h, z0.h, z8.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z25.h, z1.h, z9.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z26.h, z2.h, z10.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z27.h, z3.h, z11.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z28.h, z4.h, z12.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z29.h, z5.h, z13.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z30.h, z6.h, z14.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z31.h, z7.h, z15.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z6.b, z24.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z7.b, z25.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z8.b, z26.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z9.b, z27.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z10.b, z28.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z11.b, z29.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z12.b, z30.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z13.b, z31.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z6.h}, p0, [x0]<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z7.h}, p0, [x0, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z8.h}, p0, [x0, #2, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z9.h}, p0, [x0, #3, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z10.h}, p0, [x0, #4, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z11.h}, p0, [x0, #5, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z12.h}, p0, [x0, #6, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z13.h}, p0, [x0, #7, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x0, x0, x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-.vl_gt_16_pixel_add_ps_64x64:<o:p></o:p></span></pre>
<pre><span style="color:black">>- cmp x9, #48<o:p></o:p></span></pre>
<pre><span style="color:black">>- bgt .vl_gt_48_pixel_add_ps_64x64<o:p></o:p></span></pre>
<pre><span style="color:black">>- ptrue p0.b, vl32<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 64<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z0.h}, p0/z, [x2]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z1.h}, p0/z, [x2, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z2.h}, p0/z, [x2, #2, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z3.h}, p0/z, [x2, #3, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z8.h}, p0/z, [x3]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z9.h}, p0/z, [x3, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z10.h}, p0/z, [x3, #2, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z11.h}, p0/z, [x3, #3, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x2, x2, x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x3, x3, x5, lsl #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z24.h, z0.h, z8.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z25.h, z1.h, z9.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z26.h, z2.h, z10.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z27.h, z3.h, z11.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z6.b, z24.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z7.b, z25.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z8.b, z26.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z9.b, z27.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z6.h}, p0, [x0]<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z7.h}, p0, [x0, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z8.h}, p0, [x0, #2, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z9.h}, p0, [x0, #3, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x0, x0, x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-.vl_gt_48_pixel_add_ps_64x64:<o:p></o:p></span></pre>
<pre><span style="color:black">>- cmp x9, #112<o:p></o:p></span></pre>
<pre><span style="color:black">>- bgt .vl_gt_112_pixel_add_ps_64x64<o:p></o:p></span></pre>
<pre><span style="color:black">>- ptrue p0.b, vl64<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 64<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z0.h}, p0/z, [x2]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z1.h}, p0/z, [x2, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z8.h}, p0/z, [x3]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z9.h}, p0/z, [x3, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x2, x2, x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x3, x3, x5, lsl #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z24.h, z0.h, z8.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z25.h, z1.h, z9.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z6.b, z24.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z7.b, z25.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z6.h}, p0, [x0]<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z7.h}, p0, [x0, #1, mul vl]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x0, x0, x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-.vl_gt_112_pixel_add_ps_64x64:<o:p></o:p></span></pre>
<pre><span style="color:black">>- ptrue p0.b, vl128<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 64<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z0.h}, p0/z, [x2]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z8.h}, p0/z, [x3]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x2, x2, x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x3, x3, x5, lsl #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z24.h, z0.h, z8.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z6.b, z24.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z6.h}, p0, [x0]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x0, x0, x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-// Chroma add_ps<o:p></o:p></span></pre>
<pre><span style="color:black">>-function PFX(pixel_add_ps_4x8_sve2)<o:p></o:p></span></pre>
<pre><span style="color:black">>- ptrue p0.h,vl4<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 8<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z0.h}, p0/z, [x2]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z2.h}, p0/z, [x3]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x2, x2, x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x3, x3, x5, lsl #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z4.h, z0.h, z2.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z4.b, z4.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z4.h}, p0, [x0]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x0, x0, x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-function PFX(pixel_add_ps_8x16_sve2)<o:p></o:p></span></pre>
<pre><span style="color:black">>- ptrue p0.h,vl8<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 16<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1b {z0.h}, p0/z, [x2]<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1h {z2.h}, p0/z, [x3]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x2, x2, x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x3, x3, x5, lsl #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- add z4.h, z0.h, z2.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtunb z4.b, z4.h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1b {z4.h}, p0, [x0]<o:p></o:p></span></pre>
<pre><span style="color:black">>- add x0, x0, x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">> // void scale1D_128to64(pixel *dst, const pixel *src)<o:p></o:p></span></pre>
<pre><span style="color:black">> function PFX(scale1D_128to64_sve2)<o:p></o:p></span></pre>
<pre><span style="color:black">> rdvl x9, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>diff --git a/source/common/aarch64/pixel-util.S b/source/common/aarch64/pixel-util.S<o:p></o:p></span></pre>
<pre><span style="color:black">>index 480278e5e..0751e0e7c 100644<o:p></o:p></span></pre>
<pre><span style="color:black">>--- a/source/common/aarch64/pixel-util.S<o:p></o:p></span></pre>
<pre><span style="color:black">>+++ b/source/common/aarch64/pixel-util.S<o:p></o:p></span></pre>
<pre><span style="color:black">>@@ -340,189 +340,6 @@ function PFX(pixel_sub_ps_32x64_neon)<o:p></o:p></span></pre>
<pre><span style="color:black">> ret<o:p></o:p></span></pre>
<pre><span style="color:black">> endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">> <o:p></o:p></span></pre>
<pre><span style="color:black">>-// void x265_pixel_add_ps_neon(pixel* a, intptr_t dstride, const pixel* b0, const int16_t* b1, intptr_t sstride0, intptr_t sstride1);<o:p></o:p></span></pre>
<pre><span style="color:black">>-function PFX(pixel_add_ps_4x4_neon)<o:p></o:p></span></pre>
<pre><span style="color:black">>- lsl x5, x5, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 2<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v0.8b}, [x2], x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v1.8b}, [x2], x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v2.4h}, [x3], x5<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v3.4h}, [x3], x5<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v0.8h, v0.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v1.8h, v1.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v4.8h, v0.8h, v2.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v5.8h, v1.8h, v3.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v4.8b, v4.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v5.8b, v5.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1 {v4.s}[0], [x0], x1<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1 {v5.s}[0], [x0], x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-function PFX(pixel_add_ps_8x8_neon)<o:p></o:p></span></pre>
<pre><span style="color:black">>- lsl x5, x5, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v0.8b}, [x2], x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v1.8b}, [x2], x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v2.8h}, [x3], x5<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v3.8h}, [x3], x5<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v0.8h, v0.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v1.8h, v1.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v4.8h, v0.8h, v2.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v5.8h, v1.8h, v3.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v4.8b, v4.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v5.8b, v5.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1 {v4.8b}, [x0], x1<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1 {v5.8b}, [x0], x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-.macro pixel_add_ps_16xN_neon h<o:p></o:p></span></pre>
<pre><span style="color:black">>-function PFX(pixel_add_ps_16x\h\()_neon)<o:p></o:p></span></pre>
<pre><span style="color:black">>- lsl x5, x5, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- mov w12, #\h / 8<o:p></o:p></span></pre>
<pre><span style="color:black">>-.Loop_add_ps_16x\h\():<o:p></o:p></span></pre>
<pre><span style="color:black">>- sub w12, w12, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v0.16b}, [x2], x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v1.16b}, [x2], x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v16.8h-v17.8h}, [x3], x5<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v18.8h-v19.8h}, [x3], x5<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v4.8h, v0.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl2 v5.8h, v0.16b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v6.8h, v1.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl2 v7.8h, v1.16b<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v24.8h, v4.8h, v16.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v25.8h, v5.8h, v17.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v26.8h, v6.8h, v18.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v27.8h, v7.8h, v19.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v4.8b, v24.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun2 v4.16b, v25.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v5.8b, v26.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun2 v5.16b, v27.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1 {v4.16b}, [x0], x1<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1 {v5.16b}, [x0], x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- cbnz w12, .Loop_add_ps_16x\h<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endm<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-pixel_add_ps_16xN_neon 16<o:p></o:p></span></pre>
<pre><span style="color:black">>-pixel_add_ps_16xN_neon 32<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-.macro pixel_add_ps_32xN_neon h<o:p></o:p></span></pre>
<pre><span style="color:black">>- function PFX(pixel_add_ps_32x\h\()_neon)<o:p></o:p></span></pre>
<pre><span style="color:black">>- lsl x5, x5, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- mov w12, #\h / 4<o:p></o:p></span></pre>
<pre><span style="color:black">>-.Loop_add_ps_32x\h\():<o:p></o:p></span></pre>
<pre><span style="color:black">>- sub w12, w12, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v0.16b-v1.16b}, [x2], x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v16.8h-v19.8h}, [x3], x5<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v4.8h, v0.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl2 v5.8h, v0.16b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v6.8h, v1.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl2 v7.8h, v1.16b<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v24.8h, v4.8h, v16.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v25.8h, v5.8h, v17.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v26.8h, v6.8h, v18.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v27.8h, v7.8h, v19.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v4.8b, v24.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun2 v4.16b, v25.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v5.8b, v26.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun2 v5.16b, v27.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1 {v4.16b-v5.16b}, [x0], x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- cbnz w12, .Loop_add_ps_32x\h<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endm<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-pixel_add_ps_32xN_neon 32<o:p></o:p></span></pre>
<pre><span style="color:black">>-pixel_add_ps_32xN_neon 64<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-function PFX(pixel_add_ps_64x64_neon)<o:p></o:p></span></pre>
<pre><span style="color:black">>- lsl x5, x5, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>- sub x5, x5, #64<o:p></o:p></span></pre>
<pre><span style="color:black">>- mov w12, #32<o:p></o:p></span></pre>
<pre><span style="color:black">>-.Loop_add_ps_64x64:<o:p></o:p></span></pre>
<pre><span style="color:black">>- sub w12, w12, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 2<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v0.16b-v3.16b}, [x2], x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v16.8h-v19.8h}, [x3], #64<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v20.8h-v23.8h}, [x3], x5<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v4.8h, v0.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl2 v5.8h, v0.16b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v6.8h, v1.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl2 v7.8h, v1.16b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v24.8h, v2.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl2 v25.8h, v2.16b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v26.8h, v3.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl2 v27.8h, v3.16b<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v0.8h, v4.8h, v16.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v1.8h, v5.8h, v17.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v2.8h, v6.8h, v18.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v3.8h, v7.8h, v19.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v4.8h, v24.8h, v20.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v5.8h, v25.8h, v21.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v6.8h, v26.8h, v22.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v7.8h, v27.8h, v23.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v0.8b, v0.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun2 v0.16b, v1.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v1.8b, v2.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun2 v1.16b, v3.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v2.8b, v4.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun2 v2.16b, v5.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v3.8b, v6.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun2 v3.16b, v7.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1 {v0.16b-v3.16b}, [x0], x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- cbnz w12, .Loop_add_ps_64x64<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-// Chroma add_ps<o:p></o:p></span></pre>
<pre><span style="color:black">>-function PFX(pixel_add_ps_4x8_neon)<o:p></o:p></span></pre>
<pre><span style="color:black">>- lsl x5, x5, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v0.8b}, [x2], x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v1.8b}, [x2], x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v2.4h}, [x3], x5<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v3.4h}, [x3], x5<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v0.8h, v0.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v1.8h, v1.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v4.8h, v0.8h, v2.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v5.8h, v1.8h, v3.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v4.8b, v4.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v5.8b, v5.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1 {v4.s}[0], [x0], x1<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1 {v5.s}[0], [x0], x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">>-function PFX(pixel_add_ps_8x16_neon)<o:p></o:p></span></pre>
<pre><span style="color:black">>- lsl x5, x5, #1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.rept 8<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v0.8b}, [x2], x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v1.8b}, [x2], x4<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v2.8h}, [x3], x5<o:p></o:p></span></pre>
<pre><span style="color:black">>- ld1 {v3.8h}, [x3], x5<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v0.8h, v0.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- uxtl v1.8h, v1.8b<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v4.8h, v0.8h, v2.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- add v5.8h, v1.8h, v3.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v4.8b, v4.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- sqxtun v5.8b, v5.8h<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1 {v4.8b}, [x0], x1<o:p></o:p></span></pre>
<pre><span style="color:black">>- st1 {v5.8b}, [x0], x1<o:p></o:p></span></pre>
<pre><span style="color:black">>-.endr<o:p></o:p></span></pre>
<pre><span style="color:black">>- ret<o:p></o:p></span></pre>
<pre><span style="color:black">>-endfunc<o:p></o:p></span></pre>
<pre><span style="color:black">>-<o:p></o:p></span></pre>
<pre><span style="color:black">> // void scale1D_128to64(pixel *dst, const pixel *src)<o:p></o:p></span></pre>
<pre><span style="color:black">> function PFX(scale1D_128to64_neon)<o:p></o:p></span></pre>
<pre><span style="color:black">> .rept 2<o:p></o:p></span></pre>
<pre><span style="color:black">>-- <o:p></o:p></span></pre>
<pre><span style="color:black">>2.39.5 (Apple Git-154)<o:p></o:p></span></pre>
<pre><span style="color:black">><o:p> </o:p></span></pre>
</div>
</div>
</div>
</div>
</div>
</body>
</html>