<html xmlns:v="urn:schemas-microsoft-com:vml" 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:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@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;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Hi,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I am trying to port FeatureZCZeroing from Cyclone to Kryo. Using immediate #0 to zero out W and X registers works great in Kryo.  But using #0 to zero out float registers sometimes causes extra register spills or move instructions on either Cyclone or Kryo.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Take the following C function as an example<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>double foo(int n) {<o:p></o:p></p><p class=MsoNormal>  double r=-10000;     <o:p></o:p></p><p class=MsoNormal>  for (int i=0;i<n;i++) {     <o:p></o:p></p><p class=MsoNormal>    x = sin(i);                                                         <o:p></o:p></p><p class=MsoNormal>    r = max(r,x);<o:p></o:p></p><p class=MsoNormal>  }     <o:p></o:p></p><p class=MsoNormal>  return r;   <o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>If compiled towards Cyclone, the loop body has one spill and two reloads as below<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>.LBB0_1:                                // %for.body<o:p></o:p></p><p class=MsoNormal>                                        // =>This Inner Loop Header: Depth=1<o:p></o:p></p><p class=MsoNormal>                str                           q0, [sp]        // 16-byte Folded Spill<o:p></o:p></p><p class=MsoNormal>                ldr                           q0, [sp]        // 16-byte Folded Reload<o:p></o:p></p><p class=MsoNormal>                bl            sin<o:p></o:p></p><p class=MsoNormal>                fmaxnm               d8, d8, d0<o:p></o:p></p><p class=MsoNormal>                ldr                           q0, [sp]        // 16-byte Folded Reload<o:p></o:p></p><p class=MsoNormal>                fadd       d0, d0, d9<o:p></o:p></p><p class=MsoNormal>                add        w20, w20, #1            // =1<o:p></o:p></p><p class=MsoNormal>                cmp                       w20, w19<o:p></o:p></p><p class=MsoNormal>                b.lt         .LBB0_1<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>If FeatureZCZeroing is disabled (together with FeatureZCRegMove) on Cyclone, the translated assembly does not have these load/store instructions:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>.LBB0_1:                                // %for.body<o:p></o:p></p><p class=MsoNormal>                                        // =>This Inner Loop Header: Depth=1<o:p></o:p></p><p class=MsoNormal>                mov                       v0.16b, v8.16b<o:p></o:p></p><p class=MsoNormal>                bl            sin<o:p></o:p></p><p class=MsoNormal>                fmaxnm               d9, d9, d0<o:p></o:p></p><p class=MsoNormal>                fadd       d8, d8, d10<o:p></o:p></p><p class=MsoNormal>                add        w20, w20, #1            // =1<o:p></o:p></p><p class=MsoNormal>                cmp                       w20, w19<o:p></o:p></p><p class=MsoNormal>                b.lt         .LBB0_1<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>PR27454 has an attached .ll test case.   It would be nice if this problem could be solved so that Kryo and Cyclone could use the united method to zero out float registers.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Best,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Haicheng<o:p></o:p></p></div></body></html>