Bir NaN'i xmm kaydına nasıl ekleyebilirsiniz?


9

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 ?


1
Hangi "girdinin mantıklı olmadığını" nasıl belirlersiniz? Bu bir karşılaştırmanın sonucuysa, karşılaştırmanın sonuç maskesiyle bitsel veya "normal" sonucunuzu yapabilirsiniz.
chtz

Yanıtlar:


13

Hepsi sessizdir (sinyal vermeyen, normal olarak adlandırılır) bir NaN'dir. Birini üretmenin en kolay yolu SSE2 pcmpeqd xmm0,xmm0ile 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 mulsstek hassasiyet için float. mulpd/ mulpsde 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 mulsdveya 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, xmm0xmm0 geldiyse pcmpeqdve bu tamsayı SIMD uop zaten emekli olsa bile, her birinin xmm1 girişinden xmm1 çıkışına ekstra bir gecikme döngüsü olurdu .)


cmpsdVeya cmppd: kullanırsanız dalsız olarak bile yapabilirsiniz: orpsbu 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/ jnzile herhangi bir bitin ayarlanmış olup olmadığını görmek için => SIMD öğelerinden biri bazı kontrollerde başarısız oldu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.