আমি যে ফাংশনটি লিখছি তার জন্য আমি যদি একটি ইনপুটটি বোঝায় না তবে একটি ন্যান ফিরিয়ে দিতে চাই।
আমি কীভাবে একটি সহজ মিমি রেজিস্ট্রেশন করতে একটি এনএএনএন canোকাতে পারি?
আমি যে ফাংশনটি লিখছি তার জন্য আমি যদি একটি ইনপুটটি বোঝায় না তবে একটি ন্যান ফিরিয়ে দিতে চাই।
আমি কীভাবে একটি সহজ মিমি রেজিস্ট্রেশন করতে একটি এনএএনএন canোকাতে পারি?
উত্তর:
অল-ওয়ালস একটি শান্ত (অ-সিগন্যালিং, ওরফে সাধারণ) এনএন, যা আপনি চান তা। একটি উত্পাদন করার সবচেয়ে সহজ উপায় হ'ল এসএসই 2 pcmpeqd xmm0,xmm0
দিয়ে নিবন্ধে প্রতিটি বিট সেট করা 1
, অর্থাৎ 2 এর পরিপূরক পূর্ণসংখ্যা হয় -1
। ( সিপিইউতে সমস্ত বিটগুলি নিখুঁতভাবে 1 এ সেট করুন / ফ্লাইতে ভেক্টর ধ্রুবক তৈরি করার জন্য সেরা নির্দেশের অনুক্রমগুলি কী? )
এটি আসলে একটি -NaN
- সাইন বিট সেট করা আছে। পূর্ণসংখ্যার ডান শিফট ( psrld xmm0,1
) বিবেচনা করুন বা শূন্য / শূন্য ( xorps xmm0,xmm0
/ divpd xmm0,xmm0
) দ্বারা ভাগ করুন যদি এটি অনাকাঙ্ক্ষিত হয়।
ম্যান ফাংশনগুলি যে এনএএন ফিরে আসতে চায় তা প্রায়শই এফপি-অবৈধ স্টিকি ব্যতিক্রম এমটিএসসিএসআর সেট হয়ে যায় তা নিশ্চিত করতে চায় (বা আসলে যদি আপনার কলার সেই ব্যতিক্রমটি ছাপিয়ে না ফেলে তবে ব্যতিক্রম বাড়াতে পারে)। এটা করার জন্য যে , আপনি গুন বা নিজেই সঙ্গে 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 বা অপরিবর্তিত রাখার ফলস্বরূপ করতে পারেন। যদি অন্য কোনও গণনা এফপি-অবৈধ পতাকা সেট করে (বা ইতিমধ্যে থাকবে), বা আপনি যদি সেটির দিকে খেয়াল না করেন তবে আপনি সেট হয়ে গেছেন।
অতিরিক্ত সিএমপি / বা দিয়ে সমালোচনামূলক পথটি দীর্ঘায়িত করার বিষয়ে সতর্ক থাকুন; যদি আপনি এটির সুপার বিরল প্রত্যাশা করেন তবে আপনি সম্ভবত তুলনা এবং শাখা করতে পারেন, যেমন movmskpd
/ test eax,eax
/ jnz
একটি সেমিপিডি ফলাফলের সাথে বিট সেট করা হয়েছে কিনা তা দেখার জন্য>> সিমড উপাদানগুলির মধ্যে একটি চেক ব্যর্থ হয়েছে।