Yazdığım fonksiyon için, eğer girdi mantıklı değilse bir Nan döndürmek istiyorum.
Bir NaN'i xmm kaydına en kolay şekilde nasıl ekleyebilirim ?
Yazdığım fonksiyon için, eğer girdi mantıklı değilse bir Nan döndürmek istiyorum.
Bir NaN'i xmm kaydına en kolay şekilde nasıl ekleyebilirim ?
Yanıtlar:
Hepsi sessizdir (sinyal vermeyen, normal olarak adlandırılır) bir NaN'dir. Birini üretmenin en kolay yolu SSE2 pcmpeqd xmm0,xmm0
ile kayıttaki her biti 1
, yani 2'nin tamamlayıcı tamsayısına ayarlamaktır -1
. ( CPU kaydındaki tüm bitleri 1'e verimli bir şekilde ayarlayın / Anında vektör sabitleri oluşturmak için en iyi talimat dizileri nelerdir? )
Aslında bir -NaN
- işaret biti ayarlandı. Tamsayı sağa kaydırmayı ( psrld xmm0,1
) düşünün veya istenmiyorsa sıfıra / sıfıra ( xorps xmm0,xmm0
/ divpd xmm0,xmm0
) bölün .
NaN döndürmek isteyen matematik işlevleri de FP-geçersiz yapışkan istisna bitinin MXCSR'de ayarlandığından emin olmak ister (ya da arayan kişi bu istisnayı maskelediğinde bir istisna oluşturur). Bunu yapmak için , NaN'i kendisiyle çarpabilir veya ekleyebilirsiniz. Örneğin
...
.error_return_path:
pcmpeqd xmm0, xmm0
mulsd xmm0, xmm0 ; Cause an FP-invalid operation.
ret
Veya mulss
tek hassasiyet için float
. mulpd
/ mulps
de uygun olur.
NaN'nin NaN ile çarpımı veya eklenmesi için bit deseni kesinlikle bir NaN'dir ve hala aynı yük olmalıdır, bu yüzden hala hepsi.
Dönüş değerinin bir mulsd
veya addsd
(veya divsd
) sonucu olması da , arayan bu döngüyü tekrar tekrar bir kayıtta kullanırsa, etki alanı geçişi baypas gecikmesine sahip olmamasıdır. (Sandybridge ailesinde, bu sonsuza kadar sürer. Örneğin , addsd xmm1, xmm0
xmm0 geldiyse pcmpeqd
ve bu tamsayı SIMD uop zaten emekli olsa bile, her birinin xmm1 girişinden xmm1 çıkışına ekstra bir gecikme döngüsü olurdu .)
cmpsd
Veya cmppd
: kullanırsanız dalsız olarak bile yapabilirsiniz: orps
bu 0 / -1 maskesini NaN veya değişmeden yapmak için bir sonuca yapabilirsiniz. FP-geçersiz bayrağını başka bir hesaplama yapacaksa (veya zaten yapmışsa) veya bunu umursamıyorsanız, hepiniz hazırsınız demektir.
Kritik yolu ekstra cmp / veya ile uzatmaya dikkat edin; süper nadir olmasını bekliyorsanız, yine de karşılaştırıp dallayabilirsiniz , örneğin bir cmppd sonucundaki movmskpd
/ test eax,eax
/ jnz
ile herhangi bir bitin ayarlanmış olup olmadığını görmek için => SIMD öğelerinden biri bazı kontrollerde başarısız oldu.