<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">
<br class="">
<div>
<blockquote type="cite" class="">
<div class="">On Nov 23, 2015, at 12:04 PM, John Ridges &lt;<a href="mailto:jridges@masque.com" class="">jridges@masque.com</a>&gt; wrote:</div>
<br class="Apple-interchange-newline">
<div class="">Hi Jonathan.<br class="">
<br class="">
I really, really hate to bring this up this late in the game, but I just noticed that your NEON code doesn't use any of the &quot;high&quot; intrinsics for ARM64, e.g. instead of:<br class="">
<br class="">
int32x4_t coef1 = vmovl_s16(vget_high_s16(coef16));<br class="">
<br class="">
you could use:<br class="">
<br class="">
int32x4_t coef1 = vmovl_high_s16(coef16);<br class="">
<br class="">
and instead of:<br class="">
<br class="">
int64x2_t b1 = vmlal_s32(b0, vget_high_s32(a0), vget_high_s32(coef0));<br class="">
<br class="">
you could use:<br class="">
<br class="">
int64x2_t b1 = vmlal_high_s32(b0, a0, coef0);<br class="">
<br class="">
and instead of:<br class="">
<br class="">
int64x1_t c = vadd_s64(vget_low_s64(b3), vget_high_s64(b3));<br class="">
int64x1_t cS = vshr_n_s64(c, 16);<br class="">
int32x2_t d = vreinterpret_s32_s64(cS);<br class="">
out = vget_lane_s32(d, 0);<br class="">
<br class="">
you could use:<br class="">
<br class="">
out = (opus_int32)(vaddvq_s64(b3) &gt;&gt; 16);<br class="">
<br class="">
I understand that ARM added these intrinsics because &quot;vget_high_xxx&quot; generates an instruction in ARM64, and isn't just free the way it was in ARMv7 (&quot;vget_low_xxx&quot; is of course still free on both platforms).</div>
</blockquote>
<br class="">
</div>
<div>Other than the one-intrinsic optimizations, I’d rather keep the Neon intrinsics code compilable on ARMv7 as well as ARM64 — the Neon code is a performance boost for both platforms, and I’d rather not litter it with #ifdef’s unless there’s a large difference
 between the platforms.</div>
<div><br class="">
</div>
<div>It looks like Clang (the version in Xcode 7.1.1, at least) is smart enough to optimize the first two operations you mention, figuring out sshll2 and smlal2 properly, though the third causes a gratuitous extra “ext.16b” to be generated. &nbsp;I’ve filed a missed-optimization
 bug on Clang for the latter.</div>
<div><br class="">
</div>
<div>Here’s the code it generates:</div>
<div><br class="">
</div>
<div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">_silk_NSQ_noise_shape_feedback_loop_neon:</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">000000000000004c&nbsp; &nbsp; &nbsp; &nbsp; ldr&nbsp; &nbsp; &nbsp; w9, [x0]</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000050&nbsp; &nbsp; &nbsp; &nbsp; cmp&nbsp; &nbsp; &nbsp; w3, #8</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000054&nbsp; &nbsp; &nbsp; &nbsp; b.ne&nbsp; &nbsp; 0x9c</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000058&nbsp; &nbsp; &nbsp; &nbsp; dup.4s&nbsp; v0, w9</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">000000000000005c&nbsp; &nbsp; &nbsp; &nbsp; ldr&nbsp; &nbsp; &nbsp; q1, [x1]</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000060&nbsp; &nbsp; &nbsp; &nbsp; ext.16b v0, v0, v1, #12</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000064&nbsp; &nbsp; &nbsp; &nbsp; ldur&nbsp; &nbsp; q1, [x1, #12]</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000068&nbsp; &nbsp; &nbsp; &nbsp; ldr&nbsp; &nbsp; &nbsp; q2, [x2]</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">000000000000006c&nbsp; &nbsp; &nbsp; &nbsp; sshll.4s&nbsp; &nbsp; &nbsp; &nbsp; v3, v2, #0</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000070&nbsp; &nbsp; &nbsp; &nbsp; sshll2.4s &nbsp; &nbsp; &nbsp; v2, v2, #0</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000074&nbsp; &nbsp; &nbsp; &nbsp; smull.2d&nbsp; &nbsp; &nbsp; &nbsp; v4, v0, v3</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000078&nbsp; &nbsp; &nbsp; &nbsp; smlal2.2d &nbsp; &nbsp; &nbsp; v4, v0, v3</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">000000000000007c&nbsp; &nbsp; &nbsp; &nbsp; smlal.2d&nbsp; &nbsp; &nbsp; &nbsp; v4, v1, v2</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000080&nbsp; &nbsp; &nbsp; &nbsp; smlal2.2d &nbsp; &nbsp; &nbsp; v4, v1, v2</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000084&nbsp; &nbsp; &nbsp; &nbsp; ext.16b v2, v4, v4, #8</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000088&nbsp; &nbsp; &nbsp; &nbsp; add &nbsp; &nbsp; d2, d4, d2</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">000000000000008c&nbsp; &nbsp; &nbsp; &nbsp; sshr&nbsp; &nbsp; d2, d2, #16</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000090&nbsp; &nbsp; &nbsp; &nbsp; fmov&nbsp; &nbsp; w0, s2</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000094&nbsp; &nbsp; &nbsp; &nbsp; stp&nbsp; &nbsp; &nbsp; q0, q1, [x1]</div>
<div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">0000000000000098&nbsp; &nbsp; &nbsp; &nbsp; ret</div>
<div class=""><br class="">
</div>
<div class="">(Non-vectorized code for non-order-8 omitted.)</div>
</div>
</body>
</html>