<div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Hi Ana,</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">
I'm attaching a new patch and now we can generate more SSHLL instructions. Refer to my test cases, please!</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">
However, there is a hole in lowering shuffle_vector, so we couldn't generate instruction uzip1 yet.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">
Kevin is giving follow-up and will upstream a separate patch to generate uzip1, and he will also adding more CHECK in my test case to capture this instruction.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">
<br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Thanks,<br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">-Jiangning</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2014/1/8 Jiangning Liu <span dir="ltr"><<a href="mailto:liujiangning1@gmail.com" target="_blank">liujiangning1@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Hi Ana,</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">
<br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">
Consider more about this optimization, and now I think the second patch I gave is incorrect.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">

Basically we have the following three cases to cover,</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">

1) sext_inreg(v2i16, v2i8)</div><div class="gmail_default"><div class="gmail_default"><font face="arial, helvetica, sans-serif">sshll   v0.8h, v0.8b, #0</font></div><div class="gmail_default"><span style="font-family:arial,helvetica,sans-serif">shuffle_vector(<8xi16>, <8xi16>, <i32, i32> (0, 4))</span></div>

<div class="gmail_default"><span style="font-family:arial,helvetica,sans-serif"><br></span></div><div class="gmail_default"><span style="font-family:arial,helvetica,sans-serif">2) sext_inreg(v4i16, v4i8)</span><br></div>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><div class="gmail_default" style="font-family:arial"><font face="arial, helvetica, sans-serif">sshll   v0.8h, <a href="http://v0.bb" target="_blank">v0.bb</a>, #0</font></div>

<div><div class="gmail_default" style="font-family:arial"><span style="font-family:arial,helvetica,sans-serif">shuffle_vector(<8xi16>, <8xi16>, <i32, i32, i32, i32> (0, 2, 4, 6))</span></div></div><div>
<span style="font-family:arial,helvetica,sans-serif"><br>
</span></div></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">3) sext_inreg(v2i32, v2i16)</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">

<div class="gmail_default" style="font-family:arial"><font face="arial, helvetica, sans-serif">sshll   v0.4s, v0.4h, #0</font></div><div><div><div class="gmail_default" style="font-family:arial"><span style="font-family:arial,helvetica,sans-serif">shuffle_vector(<4xi32>, <4xi32>, <i32, i32> (0, 2))</span></div>

</div></div><div><br></div><div>All other cases should have been covered by the 1st patch.</div><div><br></div><div>Thanks,</div><div>-Jiangning</div><div><br></div></div></div><div class="gmail_extra"><div><div class="h5">
<br><br><div class="gmail_quote">
2014/1/7 Jiangning Liu <span dir="ltr"><<a href="mailto:liujiangning1@gmail.com" target="_blank">liujiangning1@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr">Ana,<br><br>I see your point now.<br><br>Actually <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small;display:inline">with my patch </div>sign_extend_inreg(v8i16, v8i8) can generate SXTL(8b->8h) as shown with my test case below,<div>

<br>
<br>define <8 x i8> @test_sext_inreg_v8i8i16(<8 x i8> %v1, <8 x i8> %v2) nounwind readnone {<br>; CHECK-LABEL: test_sext_inreg_v8i8i16<br>; CHECK: sshll   v0.8h, v0.8b, #0<br>; CHECK: sshll   v1.8h, v1.8b, #0<br>


  %1 = sext <8 x i8> %v1 to <8 x i16><br>  %2 = sext <8 x i8> %v2 to <8 x i16><br>  %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14><br>


  %4 = trunc <8 x i16> %3 to <8 x i8><br>  ret <8 x i8> %4<br>}<br><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small;display:inline">And </div>sign_extend_inreg(v2i64, v2i32) doesn't exist, because we always use sign_extend(v2i64, v2i32) to solve it as shown by test case below,<br>


<br>define <2 x i32> @test_sext_inreg_v2i32i64(<2 x i32> %v1, <2 x i32> %v2) nounwind readnone {<br>; CHECK-LABEL: test_sext_inreg_v2i32i64<br>; CHECK: sshll v0.2d, v0.2s, #0<br>; CHECK: sshll v1.2d, v1.2s, #0<br>


  %1 = sext <2 x i32> %v1 to <2 x i64><br>  %2 = sext <2 x i32> %v2 to <2 x i64><br>  %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 0, i32 2><br>  %4 = trunc <2 x i64> %3 to <2 x i32><br>


  ret <2 x i32> %4<br>}<br><br>However, yes<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small;display:inline">, </div>sign_extend_inreg(v2i32, v2i16) would be an issue, so I modified my patch as attached and changed the test test_sext_inreg_v2i16i32 to be like below by using sshll instruction.<div>

<br>
<br>define <2 x i16> @test_sext_inreg_v2i16i32(<2 x i16> %v1, <2 x i16> %v2) nounwind readnone {<br>; CHECK-LABEL: test_sext_inreg_v2i16i32<br></div>; CHECK: sshll   v0.4s, v0.4h, #0<br>; CHECK: sshll   v1.4s, v1.4h, #0<div>

<br>
  %1 = sext <2 x i16> %v1 to <2 x i32><br>  %2 = sext <2 x i16> %v2 to <2 x i32><br>  %3 = shufflevector <2 x i32> %1, <2 x i32> %2, <2 x i32> <i32 0, i32 2><br>  %4 = trunc <2 x i32> %3 to <2 x i16><br>


  ret <2 x i16> %4<br>}<br><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">The solution is by doing combine to capture this special sha/shl pair. <span style="font-family:arial">Do we have more missing cases?</span></div>


<br>Thanks,<br>-Jiangning<div class="gmail_default"><font color="#1f497d" face="Calibri, sans-serif"><div style="font-size:14.399999618530273px"><br></div></font></div></div><div class="gmail_extra"><div><div>
<br><br><div class="gmail_quote">
2014/1/7 Ana Pazos <span dir="ltr"><<a href="mailto:apazos@codeaurora.org" target="_blank">apazos@codeaurora.org</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Hi Jiangning,<u></u><u></u></span></p><p class="MsoNormal">


<span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">The test cases I see failure are<u></u><u></u></span></p>


<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">sign_extend_inreg(v2i32, v2i16) and <u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">sign_extend_inreg(v4i16, v4i8)     - sorry I had a typo v8i8 but I meant v4i8 which confused you.<u></u><u></u></span></p>


<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">So it seems your patch addresses both cases I was concerned about.<u></u><u></u></span></p>


<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">But for such cases I think the SXTL instruction could be used instead of the combo shift right + shift left.<u></u><u></u></span></p>


<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">For example sign_extend_inreg(v2i32, v2i16):<u></u><u></u></span></p>


<p><u></u><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><span>-<span style="font:7.0pt "Times New Roman"">        </span></span></span><u></u><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Input are 16-bit values in a 2S register<u></u><u></u></span></p>


<p><u></u><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><span>-<span style="font:7.0pt "Times New Roman"">        </span></span></span><u></u><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Reinterpret register as 4H register<u></u><u></u></span></p>


<p><u></u><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><span>-<span style="font:7.0pt "Times New Roman"">        </span></span></span><u></u><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">SXTL (4S <– 4H)<u></u><u></u></span></p>


<p><u></u><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><span>-<span style="font:7.0pt "Times New Roman"">        </span></span></span><u></u><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Ins/uzp1 (to extract the vector indexes 0, 2 we need into a 2S register)<u></u><u></u></span></p>


<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">The same can be done for sign_extend_inreg(v8i16, v8i8) and sign_extend_inreg(v2i64, v2i32).<u></u><u></u></span></p>


<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">I think in some cases the extraction of vector indexes we are interested in will be a no-op and an instruction will be saved.<u></u><u></u></span></p>


<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">I am just suggesting to use a hardware instruction that does the sign extension for those vector types it supports.<u></u><u></u></span></p>


<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Do you agree?<u></u><u></u></span></p>


<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Thanks,<u></u><u></u></span></p>


<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Ana.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>


<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Jiangning Liu [mailto:<a href="mailto:liujiangning1@gmail.com" target="_blank">liujiangning1@gmail.com</a>] <br>


<b>Sent:</b> Sunday, January 05, 2014 10:44 PM<br><b>To:</b> Ana Pazos<br><b>Cc:</b> <a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a> for LLVM; <a href="mailto:mcrosier@codeaurora.org" target="_blank">mcrosier@codeaurora.org</a><br>


<b>Subject:</b> Re: [PATCH] [AArch64] Support ISD::SIGN_EXTEND_INREG<u></u><u></u></span></p><div><div><p class="MsoNormal"><u></u> <u></u></p><div><div><p class="MsoNormal"><span style="font-family:"Arial","sans-serif"">Hi <u></u><u></u></span></p>


</div><p class="MsoNormal" style="margin-bottom:12.0pt">Ana,<br><br>Sorry, I don't quite understand what you said. Do you have a small test to articulate what you mentioned?<br><br>For sign_extend_inreg(v2i32, v2i16), my test case below should show my patch work,<br>


<br>define <2 x i16> @test_sext_inreg_v2i16i32(<2 x i16> %v1, <2 x i16> %v2) nounwind readnone {<br>; CHECK-LABEL: test_sext_inreg_v2i16i32<br>; CHECK: shl     v0.2s, v0.2s, #16<br>; CHECK: sshr    v0.2s, v0.2s, #16<br>


; CHECK: shl     v1.2s, v1.2s, #16<br>; CHECK: sshr    v1.2s, v1.2s, #16<br>  %1 = sext <2 x i16> %v1 to <2 x i32><br>  %2 = sext <2 x i16> %v2 to <2 x i32><br>  %3 = shufflevector <2 x i32> %1, <2 x i32> %2, <2 x i32> <i32 0, i32 2><br>


  %4 = trunc <2 x i32> %3 to <2 x i16><br>  ret <2 x i16> %4<br>}<br><br>For sign_extend_inreg(v4i16, v8i8), is this a valid? I thought it should be sign_extend_inreg(v8i16, v8i8). If this is the case, my test below should also show my patch work,<br>


<br>define <8 x i8> @test_sext_inreg_v8i8i16(<8 x i8> %v1, <8 x i8> %v2) nounwind readnone {<br>; CHECK-LABEL: test_sext_inreg_v8i8i16<br>; CHECK: sshll   v0.8h, v0.8b, #0<br>; CHECK: sshll   v1.8h, v1.8b, #0<br>


  %1 = sext <8 x i8> %v1 to <8 x i16><br>  %2 = sext <8 x i8> %v2 to <8 x i16><br>  %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14><br>


  %4 = trunc <8 x i16> %3 to <8 x i8><br>  ret <8 x i8> %4<br>}<br><br>Thanks,<br>-Jiangning<u></u><u></u></p></div></div></div></div></div></blockquote></div><br><br clear="all"><div><br></div></div></div>

<span><font color="#888888">-- <br><div dir="ltr">
<font face="courier new, monospace">Thanks,</font><div><font face="courier new, monospace">-Jiangning</font></div></div>
</font></span></div>
</blockquote></div><br><br clear="all"><div><br></div></div></div><span class="HOEnZb"><font color="#888888">-- <br><div dir="ltr"><font face="courier new, monospace">Thanks,</font><div><font face="courier new, monospace">-Jiangning</font></div>
</div>
</font></span></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr"><font face="courier new, monospace">Thanks,</font><div><font face="courier new, monospace">-Jiangning</font></div></div>
</div>