<div dir="ltr"><div>Full icc code sequence (for the 32-bit case):<br>        xorl      %eax, %eax<br>        movl      $1, %edx<br>        btl       %esi, %edi<br>        cmovc     %edx, %eax<br>        ret       <br><br></div>Chris's code example is actually returning the result, so no 'test' or 'bt' in the constant mask case:<br><br>unsigned int IsBitSetA_32(unsigned int val) { return (val & (1U<<25)) != 0U; }<br><br><div>        andl      $33554432, %edi<br>        shrl      $25, %edi<br>        movl      %edi, %eax<br>        ret       <br><br><br><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 23, 2015 at 9:45 AM, Stephen Canon <span dir="ltr"><<a href="mailto:scanon@apple.com" target="_blank">scanon@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>I suspect that this is because the mask in your example is the result of a variable shift, which (a) has it’s own performance and flags hazards pre-SHLX and (b) requires additional µops to do with TEST.  I expect that ICC is putting a dummy TEST or XOR ahead of the BT to break the false flags dependency, as well.</div><div><br></div><div>If the mask were constant, I expect ICC would generate TEST instead (but I don’t have it handy to check).</div><div><br></div><div>– Steve</div><div><div class="h5"><br><div><blockquote type="cite"><div>On Jan 23, 2015, at 11:32 AM, Sanjay Patel <<a href="mailto:spatel@rotateright.com" target="_blank">spatel@rotateright.com</a>> wrote:</div><br><div><div dir="ltr"><div>If 'bt' is a perf sin, icc doesn't seem to know it:<br><br>$ icc -v <br>icc version 15.0.1 (gcc version 4.9.0 compatibility)<br><br>$ cat bt.c<br>unsigned long long IsBitSetB_64(unsigned long long val, int index) { return (val & (1ULL<<index)) != 0ULL; } <br>unsigned int IsBitSetB_32(unsigned int val, int index) { return (val & (1U<<index)) != 0U; } <br><br>$ icc -O3 -S bt.c -o - | grep bt<br>    .file "bt.c"<br>        btq       %rsi, %rdi<br>        btl       %esi, %edi<br><br></div>Does anyone at Intel have guidance for us?<br><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 22, 2015 at 4:34 PM, Eric Christopher <span dir="ltr"><<a href="mailto:echristo@gmail.com" target="_blank">echristo@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br><br><div class="gmail_quote"><div><div>On Thu Jan 22 2015 at 3:32:53 PM Chris Sears <<a href="mailto:chris.sears@gmail.com" target="_blank">chris.sears@gmail.com</a>> wrote:<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_extra">The status quo is:</div><div class="gmail_extra"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_extra">a) 40b REX+BT instruction for the 64b case</div><div class="gmail_extra">b) 48b TEST for the 32b case</div><div class="gmail_extra">c) unless it's small TEST</div></blockquote><br><div>You are currently paying a 16b penalty for TEST vs BT in the 32b case.</div><div>That may be worth testing the -Os flag.</div></div></blockquote><div><br></div></div></div><div>You'll want -Oz here, Os isn't supposed to affect the runtime as much as this is going to.</div><span><font color="#888888"><div><br></div><div>-eric </div></font></span></div>
<br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu/" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
<br></blockquote></div><br></div>
_______________________________________________<br>LLVM Developers mailing list<br><a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br></div></blockquote></div><br></div></div></div></blockquote></div><br></div>