<div dir="ltr">Hi Arnold,<div><br></div><div style>Nice catch! I'm no expert in TableGen, especially the patterns, so I'll wait for others to comment.</div><div style><br></div><div style>Typo in:</div><div style><div>
+// Fix scalarized uitof/sitof 2xf64 to no use intermediate scalar registers.</div><div>-> "to NOT use"<br></div><div style><br></div><div style>cheers,</div><div style>--renato</div><div><br></div></div></div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On 14 February 2013 23:47, Arnold Schwaighofer <span dir="ltr"><<a href="mailto:aschwaighofer@apple.com" target="_blank">aschwaighofer@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">A vectorized sitfp on doubles will get scalarized to a sequence of an<br>
extract_element of <2 x i32>, a bitcast to f32 and a sitofp.<br>
Due to the the extract_element, and the bitcast we will uneccessarily generate<br>
moves between scalar and vector registers.<br>
<br>
The patch fixes this by using COPY_TO_REGCLASS and EXTRACT_SUBREG instead.<br>
<br>
Example:<br>
<br>
define void @vsitofp_double(<2 x i32>* %loadaddr,<br>
                            <2 x double>* %storeaddr) {<br>
  %v0 = load <2 x i32>* %loadaddr<br>
  %r = sitofp <2 x i32> %v0 to <2 x double><br>
  store <2 x double> %r, <2 x double>* %storeaddr<br>
  ret void<br>
}<br>
<br>
We used to generate:<br>
        vldr    d16, [r0]<br>
        vmov.32 r2, d16[1]<br>
        vmov.32 r0, d16[0]<br>
        vmov    s0, r2<br>
        vmov    s2, r0<br>
        vcvt.f64.s32    d17, s0<br>
        vcvt.f64.s32    d16, s2<br>
        vst1.32 {d16, d17}, [r1]<br>
Now we generate:<br>
        vldr    d0, [r0]<br>
        vcvt.f64.s32    d17, s1<br>
        vcvt.f64.s32    d16, s0<br>
        vst1.32 {d16, d17}, [r1]<br>
<br>
<br>
<br>
</blockquote></div><br></div>