<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><p style="margin: 0;"><br></p><p>At 2021-07-24 05:23:44, "Pop, Sebastian" <spop@amazon.com> wrote:</p><blockquote id="isReplyContent" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">



<style><!--

_font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
_font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}

p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:12.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle21
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
_page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>


<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt">Hi,<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">> +    fmov            w12, s4<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> +    neg             w12, w12<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> +    add             w0, w12, #16<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> (-w12) + 16 equal to 16-w12, load #16 into w0 may execution parallelism with FMOV.<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">I see a small improvement with this change.  Please see attached a patch.<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">> +    clz             v2.4h, v0.4h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> +    clz             v3.4h, v1.4h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> +    ushr            v2.4h, v2.4h, #4<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> +    ushr            v3.4h, v3.4h, #4<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> +    add             v2.4h, v2.4h, v3.4h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">> clz+ushr+add is slower than cmeq+add in either exection throughput or cycles.<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">I do not see any improvement with this change applied to x265_copy_cnt_{4,8,16,32}:<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">@@ -508,14 +508,14 @@ function x265_copy_cnt_4_neon<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">.rept 2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">     ld1             {v0.8b}, [x1], x2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">     ld1             {v1.8b}, [x1], x2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">-    clz             v2.4h, v0.4h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">-    clz             v3.4h, v1.4h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">-    ushr            v2.4h, v2.4h, #4<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">-    ushr            v3.4h, v3.4h, #4<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">-    add             v2.4h, v2.4h, v3.4h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">-    add             v4.4h, v4.4h, v2.4h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">     st1             {v0.8b}, [x0], #8<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">     st1             {v1.8b}, [x0], #8<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">+    cmeq            v0.4h, v0.4h, #0<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">+    cmeq            v1.4h, v1.4h, #0<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">+    ushr            v0.4h, v0.4h, #15<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">+    ushr            v1.4h, v1.4h, #15<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">+    add             v4.4h, v4.4h, v0.4h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">+    add             v4.4h, v4.4h, v1.4h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">.endr<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">     uaddlv          s4, v4.4h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">     fmov            w12, s4<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">Before this change, the time is slightly better:<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">         copy_cnt[4x4]  13.84x   7.53            104.19<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">         copy_cnt[8x8]  31.37x   12.44           390.16<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">       copy_cnt[16x16]  43.34x   35.83           1553.07<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">       copy_cnt[32x32]  47.40x   129.28          6127.89<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">than after the change:<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">         copy_cnt[4x4]  13.91x   7.50            104.25<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">         copy_cnt[8x8]  31.09x   12.57           390.92<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">       copy_cnt[16x16]  43.12x   36.04           1554.11<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">       copy_cnt[32x32]  47.38x   129.34          6128.81<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: 11pt;">Neoverse-N1 SWOG says:</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">https://documentation-service.arm.com/static/5f05e93dcafe527e86f61acd<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">CLZ  latency 2, throughput 2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">CMEQ latency 2, throughput 1<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">Changing CLZ to CMEQ has less parallelism with a lower throughput.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p><br></o:p></span></p><p class="MsoNormal"><span style="font-size: 11pt;"><o:p><br></o:p></span></p><p class="MsoNormal"><span style="font-size: 11pt;"><o:p>You didn't see improve because you still use USHR, after CMEQ, we get 0 or -1 depends on result, we can sum of these -1 to get totally number of non-zero coeffs, it reduce 3 instructions to 2.</o:p></span></p><p class="MsoNormal"><br></p><p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p><p class="MsoNormal"><span style="font-size: 11pt;">> The copy_s* looks good, my only comment is the instruction TBL faster than XTN/XTN2</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"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Neoverse-N1 SWOG says TBL is as fast as XTN:<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">TBL (with 1 or 2 table regs) latency 2 throughput 2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">XTN latency 2 throughput 2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p><br></o:p></span></p><p class="MsoNormal"><span style="font-size: 14.6667px;">+    xtn             v0.8b, v0.8h</span></p><p class="MsoNormal"><span style="font-size: 14.6667px;"><o:p></o:p></span></p><p class="MsoNormal"><span style="font-size: 14.6667px;">+    xtn2            v0.16b, v1.8h</span></p><div>equal to</div><div>tbl v0, {v0,v1}, v2</div><p class="MsoNormal"><span style="font-size: 11pt;"><o:p><br></o:p></span></p><p class="MsoNormal"><span style="font-size:11.0pt"><o:p><br></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">Sebastian<o:p></o:p></span></p>
</div>


</blockquote></div>