สำหรับฟังก์ชั่นที่ฉันเขียนฉันต้องการคืนน่านถ้าอินพุตไม่สมเหตุสมผล
ฉันจะใส่ NaN ลงใน xmm register ได้อย่างไร?
สำหรับฟังก์ชั่นที่ฉันเขียนฉันต้องการคืนน่านถ้าอินพุตไม่สมเหตุสมผล
ฉันจะใส่ NaN ลงใน xmm register ได้อย่างไร?
คำตอบ:
ทุกคนเป็นความเงียบ (ไม่ใช่การส่งสัญญาณ, ปกติ) NaN, ซึ่งเป็นสิ่งที่คุณต้องการ วิธีที่ง่ายที่สุดในการผลิตหนึ่งอยู่กับ SSE2 pcmpeqd xmm0,xmm0
การตั้งค่าทุกบิตในการลงทะเบียนไป1
คือ 2 -1
จำนวนเต็มสมบูรณ์ ( ตั้งค่าบิตทั้งหมดใน CPU register 1 อย่างมีประสิทธิภาพ / ลำดับการเรียนการสอนที่ดีที่สุดในการสร้างค่าคงที่แบบเวกเตอร์คือเท่าใด )
อันที่จริงแล้วมันคือ-NaN
- เครื่องหมายบิตถูกตั้งค่า พิจารณาการเลื่อนขวาจำนวนเต็ม ( psrld xmm0,1
) หรือหารด้วยศูนย์ / ศูนย์ ( xorps xmm0,xmm0
/ divpd xmm0,xmm0
) หากไม่พึงประสงค์
ฟังก์ชันทางคณิตศาสตร์ที่ต้องการส่งกลับ NaN มักต้องการตรวจสอบให้แน่ใจว่าบิตข้อผิดพลาดที่ไม่ถูกต้องของ FP ได้รับการตั้งค่าใน MXCSR (หรือยกข้อยกเว้นจริง ๆ ถ้าผู้โทรของคุณเปิดโปงข้อยกเว้นนั้น) ในการทำเช่นนั้นคุณสามารถคูณหรือเพิ่ม NaN ด้วยตัวเองได้ เช่น
...
.error_return_path:
pcmpeqd xmm0, xmm0
mulsd xmm0, xmm0 ; Cause an FP-invalid operation.
ret
หรือmulss
เพื่อความแม่นยำfloat
เดียว mulpd
/ mulps
ก็จะมีความเหมาะสม
รูปแบบบิตสำหรับการคูณหรือการเพิ่มของ NaN กับ NaN ยังคงเป็น NaN แน่นอนและควรยังคงเป็นส่วนของข้อมูลเดียวกันดังนั้นจึงยังคงอยู่ทั้งหมด
การมีค่าส่งคืนเป็นผลมาจากmulsd
หรือaddsd
(หรือdivsd
) ยังมีข้อได้เปรียบว่าหากผู้เรียกใช้ที่ลงทะเบียนซ้ำ ๆ ในลูปนั้นจะไม่มีความล่าช้าบายพาสข้ามโดเมน (สำหรับตระกูล Sandybridge สิ่งนี้จะคงอยู่ตลอดไปเช่นทุกรอบaddsd xmm1, xmm0
จะมีวงจรแฝงเพิ่มเติมจากอินพุต xmm1 ไปยังเอาต์พุต xmm1 หาก xmm0 มาจากpcmpeqd
แม้ว่าจะเป็นเมื่อนานมาแล้วและจำนวนเต็ม-SIMD uop ได้เลิกใช้ไปแล้ว)
คุณอาจสามารถทำได้โดยไม่ไร้สาระหากคุณใช้cmpsd
หรือcmppd
คุณสามารถorps
ใส่หน้ากาก 0 / -1 ลงในผลลัพธ์เพื่อให้เป็น NaN หรือไม่เปลี่ยนแปลง หากการคำนวณอื่น ๆ จะ (หรือมีอยู่แล้ว) จะตั้งค่าสถานะที่ไม่ถูกต้องของ FP หรือหากคุณไม่สนใจสิ่งนั้นคุณก็พร้อมแล้ว
ระวังการยืดเส้นทางสำคัญให้ยาวขึ้นด้วย cmp พิเศษ / หรือ; หากคุณคาดว่าจะหายากสุด ๆ คุณอาจเปรียบเทียบและแยกสาขาเช่นกับmovmskpd
/ test eax,eax
/ jnz
ในผลการค้นหาด้วย cmppd เพื่อดูว่ามีการตั้งค่าบิตทั้งสอง => หนึ่งในองค์ประกอบ SIMD ที่ล้มเหลวในการตรวจสอบบางอย่าง