<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:Courier;
        panose-1:2 7 3 9 2 2 5 2 4 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:12.0pt;
        font-family:"Aptos",sans-serif;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0cm;
        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:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-GB" link="#467886" vlink="#96607D" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">Hi Chen,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">Thank you for the feedback.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">For the vcreate_u8 vs vld1(const array):<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">  I checked the asm and the compiler just puts it in a constant pool and load it, which is effectively the same as your suggestion.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">Thanks,<br>
Micro<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><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 0cm 0cm 0cm">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="color:black">From:
</span></b><span style="color:black">chen <chenm003@163.com><br>
<b>Date: </b>Friday, 24 January 2025 at 05:59<br>
<b>To: </b>Development for x265 <x265-devel@videolan.org><br>
<b>Cc: </b>nd <nd@arm.com>, Micro Daryl Robles <MicroDaryl.Robles@arm.com><br>
<b>Subject: </b>Re:[x265] [PATCH 1/2] AArch64: Add Neon implementation of 4x4 intra_pred_planar<o:p></o:p></span></p>
</div>
<div>
<div id="spnEditorContent">
<p style="margin:0cm"><span style="font-size:10.5pt;font-family:Courier;color:black">Thank for the patches.</span><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p></o:p></span></p>
<p style="margin:0cm"><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p> </o:p></span></p>
<p style="margin:0cm"><span style="font-size:10.5pt;font-family:Courier;color:black">The algorithm kernel in my understand below, there have two vcreate_u8, it may merge into constant array c[2] to avoid compiler performance issue, other part looks good to
 me.</span><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p></o:p></span></p>
<p style="margin:0cm"><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p> </o:p></span></p>
<p style="margin:0cm"><span style="font-size:10.5pt;font-family:Courier;color:black">+    uint16x8_t t = vmull_u8(topRight, vget_high_u8(c0));                                       ;  topRight     *[4 3 2 1 4 3 2 1]</span><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p></o:p></span></p>
<p style="margin:0cm"><span style="font-size:10.5pt;font-family:Courier;color:black">+    t = vmlal_u8(t, above, vget_low_u8(c1));                                                   ; +above        *[1 1 1 1 3 3 3 3]</span><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p></o:p></span></p>
<p style="margin:0cm"><span style="font-size:10.5pt;font-family:Courier;color:black">+    t = vmlal_u8(t, bottomLeft, vget_high_u8(c1));                                             ; +bottomLeft   *[3 3 3 3 1 1 1 1]</span><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p></o:p></span></p>
<p style="margin:0cm"><span style="font-size:10.5pt;font-family:Courier;color:black">+</span><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p></o:p></span></p>
<p style="margin:0cm"><span style="font-size:10.5pt;font-family:Courier;color:black">+    uint8x8_t index02 = vcreate_u8(0x0A0A0A0A08080808);</span><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p></o:p></span></p>
<p style="margin:0cm"><span style="font-size:10.5pt;font-family:Courier;color:black">+    uint8x8_t left02 = vqtbl1_u8(src, index02);                                                ; left02 = [L2 L2 L2 L2 L0 L0 L0 L0]</span><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p></o:p></span></p>
<p style="margin:0cm"><span style="font-size:10.5pt;font-family:Courier;color:black">+    uint16x8_t t02 = vmlal_u8(t, left02, vget_low_u8(c0));                                     ; t02 = [ L2*[0 1 2 3] L0*[0 1 2 3] ]</span><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p></o:p></span></p>
<p style="margin:0cm"><span style="font-size:10.5pt;font-family:Courier;color:black">+    uint8x8_t d02 = vrshrn_n_u16(t02, log2Size + 1);</span><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p> </o:p></span></p>
</div>
<p style="margin:0cm"><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black"><o:p> </o:p></span></p>
</div>
<pre><span style="color:black">At 2025-01-23 22:15:30, "Micro Daryl Robles" <microdaryl.robles@arm.com> wrote:<o:p></o:p></span></pre>
<pre><span style="color:black">>Relative performance compared to scalar C:<o:p></o:p></span></pre>
<pre><span style="color:black">><o:p> </o:p></span></pre>
<pre><span style="color:black">> Neoverse N1: 2.65x<o:p></o:p></span></pre>
<pre><span style="color:black">> Neoverse N2: 2.27x<o:p></o:p></span></pre>
<pre><span style="color:black">> Neoverse V1: 2.67x<o:p></o:p></span></pre>
<pre><span style="color:black">> Neoverse V2: 2.82x<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/intrapred-prim.cpp | 47 ++++++++++++++++++++++++<o:p></o:p></span></pre>
<pre><span style="color:black">> 1 file changed, 47 insertions(+)<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/intrapred-prim.cpp b/source/common/aarch64/intrapred-prim.cpp<o:p></o:p></span></pre>
<pre><span style="color:black">>index 68a9f26ac..c5d47fe0d 100644<o:p></o:p></span></pre>
<pre><span style="color:black">>--- a/source/common/aarch64/intrapred-prim.cpp<o:p></o:p></span></pre>
<pre><span style="color:black">>+++ b/source/common/aarch64/intrapred-prim.cpp<o:p></o:p></span></pre>
<pre><span style="color:black">>@@ -4,6 +4,7 @@<o:p></o:p></span></pre>
<pre><span style="color:black">> <o:p></o:p></span></pre>
<pre><span style="color:black">> #if HAVE_NEON<o:p></o:p></span></pre>
<pre><span style="color:black">> #include "arm64-utils.h"<o:p></o:p></span></pre>
<pre><span style="color:black">>+#include "mem-neon.h"<o:p></o:p></span></pre>
<pre><span style="color:black">> #include <arm_neon.h><o:p></o:p></span></pre>
<pre><span style="color:black">> <o:p></o:p></span></pre>
<pre><span style="color:black">> using namespace X265_NS;<o:p></o:p></span></pre>
<pre><span style="color:black">>@@ -399,6 +400,51 @@ void planar_pred_neon(pixel * dst, intptr_t dstStride, const pixel * srcPix, int<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">>+#if !HIGH_BIT_DEPTH<o:p></o:p></span></pre>
<pre><span style="color:black">>+void intra_pred_planar4_neon(pixel *dst, intptr_t dstStride, const pixel *srcPix,<o:p></o:p></span></pre>
<pre><span style="color:black">>+                             int /*dirMode*/, int /*bFilter*/)<o:p></o:p></span></pre>
<pre><span style="color:black">>+{<o:p></o:p></span></pre>
<pre><span style="color:black">>+    const int log2Size = 2;<o:p></o:p></span></pre>
<pre><span style="color:black">>+    const int blkSize = 1 << log2Size;<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint8x16_t src = vld1q_u8(srcPix + 1);<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint8x8_t above =<o:p></o:p></span></pre>
<pre><span style="color:black">>+        vreinterpret_u8_u32(vdup_laneq_u32(vreinterpretq_u32_u8(src), 0));<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint8x8_t topRight = vdup_laneq_u8(src, blkSize);<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint8x8_t bottomLeft = vdup_laneq_u8(src, 3 * blkSize);<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+    const uint8_t c[2][16] =<o:p></o:p></span></pre>
<pre><span style="color:black">>+    {<o:p></o:p></span></pre>
<pre><span style="color:black">>+        {3, 2, 1, 0, 3, 2, 1, 0, 1, 2, 3, 4, 1, 2, 3, 4},<o:p></o:p></span></pre>
<pre><span style="color:black">>+        {3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3}<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">>+    const uint8x16_t c0 = vld1q_u8(c[0]);<o:p></o:p></span></pre>
<pre><span style="color:black">>+    const uint8x16_t c1 = vld1q_u8(c[1]);<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint16x8_t t = vmull_u8(topRight, vget_high_u8(c0));<o:p></o:p></span></pre>
<pre><span style="color:black">>+    t = vmlal_u8(t, above, vget_low_u8(c1));<o:p></o:p></span></pre>
<pre><span style="color:black">>+    t = vmlal_u8(t, bottomLeft, vget_high_u8(c1));<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint8x8_t index02 = vcreate_u8(0x0A0A0A0A08080808);<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint8x8_t left02 = vqtbl1_u8(src, index02);<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint16x8_t t02 = vmlal_u8(t, left02, vget_low_u8(c0));<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint8x8_t d02 = vrshrn_n_u16(t02, log2Size + 1);<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint8x8_t index13 = vcreate_u8(0x0B0B0B0B09090909);<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint8x8_t left13 = vqtbl1_u8(src, index13);<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint16x8_t t13 = vmlal_u8(t, left13, vget_low_u8(c0));<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint16x8_t sub_bottomLeft_above = vsubl_u8(bottomLeft, above);<o:p></o:p></span></pre>
<pre><span style="color:black">>+    t13 = vaddq_u16(t13, sub_bottomLeft_above);<o:p></o:p></span></pre>
<pre><span style="color:black">>+    uint8x8_t d13 = vrshrn_n_u16(t13, log2Size + 1);<o:p></o:p></span></pre>
<pre><span style="color:black">>+<o:p></o:p></span></pre>
<pre><span style="color:black">>+    store_u8x4_strided_xN<2>(dst + 0 * dstStride, 2 * dstStride, &d02);<o:p></o:p></span></pre>
<pre><span style="color:black">>+    store_u8x4_strided_xN<2>(dst + 1 * dstStride, 2 * dstStride, &d13);<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">> static void dcPredFilter(const pixel* above, const pixel* left, pixel* dst, intptr_t dststride, int size)<o:p></o:p></span></pre>
<pre><span style="color:black">> {<o:p></o:p></span></pre>
<pre><span style="color:black">>     // boundary pixels processing<o:p></o:p></span></pre>
<pre><span style="color:black">>@@ -576,6 +622,7 @@ void setupIntraPrimitives_neon(EncoderPrimitives &p)<o:p></o:p></span></pre>
<pre><span style="color:black">>     p.cu[BLOCK_32x32].intra_pred_allangs = all_angs_pred_neon<5>;<o:p></o:p></span></pre>
<pre><span style="color:black">> <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">>+    p.cu[BLOCK_4x4].intra_pred[PLANAR_IDX] = intra_pred_planar4_neon;<o:p></o:p></span></pre>
<pre><span style="color:black">>     p.cu[BLOCK_8x8].intra_pred[PLANAR_IDX] = PFX(intra_pred_planar8_neon);<o:p></o:p></span></pre>
<pre><span style="color:black">>     p.cu[BLOCK_16x16].intra_pred[PLANAR_IDX] = PFX(intra_pred_planar16_neon);<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">>2.34.1<o:p></o:p></span></pre>
<pre><span style="color:black">><o:p> </o:p></span></pre>
</div>
</div>
</div>
</div>
</div>
IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose,
 or store or copy the information in any medium. Thank you.
</body>
</html>