<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 6 Jan 2016, at 15:45, Vitaly Davidovich <<a href="mailto:vitalyd@gmail.com" class="">vitalyd@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span style="font-size:12.8px" class="">Ok. The generated code for an unrolled loop firsts load array elements into registers before performing the cmovs.</span></blockquote><div class=""><span style="font-size:12.8px" class=""><br class=""></span></div><div class=""><span style="font-size:12.8px" class="">Yes, but the cmov cannot proceed until that load retires.  If you had a normal branch, speculation can continue past the branch and put more instructions into the pipeline barring other hazards/dependencies.  By "available in registers" I meant a cmov executed against 2 values in registers that are already available (i.e. the loads which put the values into registers have already completed, or the registers were set with immediates, etc).</span></div><div class=""><span style="font-size:12.8px" class=""><br class=""></span></div><div class=""><span style="font-size:12.8px" class="">Basically, if the cost of branch misprediction is higher than waiting for both inputs to cmov to be available, then cmov is better.  For very predictable branches, cmov is a loss (as we've already established in this thread) and I think always will be (i.e. cpu vendors seem to be putting more and more smarts into branch prediction instead).</span></div><div class=""><span style="font-size:12.8px" class=""><br class=""></span></div></div></div></blockquote><div><br class=""></div>Thanks for the explanations. It’s helpful.</div><div><br class=""></div><div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span style="font-size:12.8px" class="">Yes, that was me not understanding the underlying branch profiling mechanisms.</span></blockquote><div class=""><br class=""></div><div class="">Actually, that question of mine was more aimed at John who said we should do something special for loops with max/min accumulators :). </div><div class=""><br class=""></div></div></div></blockquote><div><br class=""></div>Oh, ok :-)</div><div><br class=""></div><div>Paul.</div></body></html>