फ़ंक्शन के लिए मैं लिख रहा हूं अगर कोई इनपुट वापस नहीं करता है तो मैं एक एनएएन वापस करना चाहता हूं।
मैं एक एक्सएमएम रजिस्टर करने का सबसे आसान तरीका कैसे एक NaN सम्मिलित कर सकता हूं ?
फ़ंक्शन के लिए मैं लिख रहा हूं अगर कोई इनपुट वापस नहीं करता है तो मैं एक एनएएन वापस करना चाहता हूं।
मैं एक एक्सएमएम रजिस्टर करने का सबसे आसान तरीका कैसे एक NaN सम्मिलित कर सकता हूं ?
जवाबों:
ऑल-वे एक शांत (गैर-सिग्नलिंग, उर्फ सामान्य) NaN है, जो आप चाहते हैं। एक उत्पादन करने का सबसे आसान तरीका है SSE2 के साथ pcmpeqd xmm0,xmm0
रजिस्टर में हर बिट को सेट करना 1
, अर्थात 2 का पूरक पूर्णांक -1
। ( सीपीयू में सभी बिट्स को कुशलतापूर्वक 1 पर सेट करें / मक्खी पर वेक्टर स्थिरांक उत्पन्न करने के लिए सबसे अच्छा निर्देश अनुक्रम क्या हैं? )
यह वास्तव में एक है -NaN
- साइन बिट सेट है। पूर्णांक सही बदलाव ( psrld xmm0,1
) पर विचार करें या यदि यह अवांछनीय है तो शून्य / शून्य ( xorps xmm0,xmm0
/ divpd xmm0,xmm0
) से विभाजित करें ।
मैथ फ़ंक्शंस जो NaN को वापस करना चाहते हैं, अक्सर यह भी सुनिश्चित करना चाहते हैं कि एमएक्ससीएसआर में एफपी-अवैध चिपचिपा अपवाद बिट सेट हो जाता है (या वास्तव में एक अपवाद बढ़ाएं यदि आपका कॉलर उस अपवाद को अनमास्क करता है)। ऐसा करने के लिए कि , आप गुणा या खुद के साथ 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
) का एक फायदा यह भी होता है कि अगर कॉलर लूप में बार-बार रजिस्टर करता है, तो इसमें डोमेन-क्रॉसिंग बाईपास लेटेंसी नहीं होगी। (सैंडीब्रिज-परिवार पर, यह हमेशा के लिए रहता है। जैसे addsd xmm1, xmm0
xmm1 इनपुट से xmm1 आउटपुट में प्रत्येक के पास विलंब का एक अतिरिक्त चक्र होगा यदि xmm0 से आया था pcmpeqd
, भले ही वह बहुत पहले से था और पूर्णांक- SIMD यूओपी पहले ही सेवानिवृत्त हो चुका है।)
यदि आप उपयोग करते हैं cmpsd
या cmppd
आप कर सकते हैं, तो आप इसे शाखा-विहीन भी कर सकते हैंorps
इसे NaN या अपरिवर्तित करने के परिणामस्वरूप 0 / -1 मास्क हैं। यदि कुछ अन्य गणनाएँ (या पहले से ही होंगी) एफपी-अवैध झंडे को सेट करती हैं, या यदि आप इस बारे में परवाह नहीं करते हैं, तो आप सभी सेट हैं।
अतिरिक्त सीएमपी के साथ महत्वपूर्ण पथ को लंबा करने से सावधान रहें / या; यदि आप उम्मीद करते हैं कि यह सुपर दुर्लभ है, तो आप अभी भी तुलना और शाखा कर सकते हैं, जैसे movmskpd
/ test eax,eax
/ jnz
एक cmppd परिणाम पर यह देखने के लिए कि या तो बिट सेट किया गया था => SIMD तत्वों में से एक कुछ जांच में विफल रहा।