; xmm5=4.0, xmm0=xmm6=x, xmm1=xmm7=y, ecx=m
lp:
movapd xmm2, xmm0 ; xmm2=a
mulpd xmm0, xmm0 ;  xmm0=aa
movapd xmm3, xmm1 ; xmm3=b
mulpd xmm1, xmm2 ;  xmm1=ab ,free xmm2
movapd xmm2, xmm0 ; xmm2=aa
mulpd xmm3, xmm3 ;  xmm3=bb
addpd xmm0, xmm6 ;  xmm0=aa+x
addpd xmm1, xmm1 ;  xmm1=2ab
addpd xmm2, xmm3 ;  xmm2=aa+bb=rr
cmpnlepd xmm2, xmm5;xmm2=mask if(rr > 4) -1 else 0
subpd xmm0, xmm3 ;  xmm0=aa-bb+x=a' ,free xmm3
movmskpd eax, xmm2
addpd xmm1, xmm7 ;  xmm1=2ab+y=b'
test eax, eax
jnz exit
dec ecx
jnz lp
exit:

で、これがDothanで19clk/loop。速すぎw
SSE命令のスループットを単純に足しただけで27clkにもなるのに。
仮にストールゼロとしても理論値は18clk。
分岐の判定とかに必要な計算は先延ばし、ひたすら投機実行がすごい。
実は、mulpd(5-4)をmulps(4-2)に変えても19clk/loopなんだけど。