2008-10-29 16 views
17

पर फ्लोटिंग पॉइंट इंटरप्ट्स को सक्षम करना लिनक्स पर, फीनएबलएक्ससेप्ट और फेडिसेबल एक्ससेप्ट का उपयोग फ्लोटिंग पॉइंट अपवादों पर एसआईजीएफपीई इंटरप्ट्स की पीढ़ी को नियंत्रित करने के लिए किया जा सकता है। मैं इसे मैक ओएस एक्स इंटेल पर कैसे कर सकता हूं?मैक ओएस एक्स इंटेल

फ़्लोटिंग पॉइंट इंटरप्ट्स को सक्षम करने के लिए इनलाइन असेंबली http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf, पीपी 7-15 में प्रदान की जाती है, लेकिन केवल पावरपीसी असेंबली के लिए।

उत्तर

23

xmmintrin.h से _MM_SET_EXCEPTION_MASK का उपयोग करके एसएसई के लिए अपवाद सक्षम किए जा सकते हैं। उदाहरण के लिए, अवैध (नेन) अपवाद सक्षम करने के लिए,

#include <xmmintrin.h> 
... 
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID); 
6

मैक ओएस एक्स पर यह मामूली जटिल है। ओएस एक्स डिफ़ॉल्ट रूप से सभी एफपी गणित के लिए एसएसई इकाई का उपयोग करता है, न कि x87 एफपी इकाई। एसएसई इकाई इंटरप्ट विकल्पों का सम्मान नहीं करती है, इसका मतलब है कि इंटरप्ट को सक्षम करने के अलावा, आपको अपने सभी कोड को संकलित करना सुनिश्चित करना होगा ताकि एसएसई गणित का उपयोग न किया जा सके।

आप अपने CFLAGS में "-mno-sse-mno-sse2 -mno-sse3" जोड़कर गणित को अक्षम कर सकते हैं। एक बार ऐसा करने के बाद आप मूल रूप से लिनक्स के समान झंडे के साथ अपने एफपी अपवादों को कॉन्फ़िगर करने के लिए कुछ इनलाइन असेंबली का उपयोग कर सकते हैं।

short fpflags = 0x1332 // Default FP flags, change this however you want. 
asm("fnclex"); 
asm("fldcw _fpflags"); 

एक पकड़ आप पा सकते हैं कि जब से ओएस एक्स पूरी तरह से बनाया गया है SSE का उपयोग कर वहाँ ध्यान में न आया कीड़े हो सकता है। मुझे पता है कि सिग्नल हैंडलर के साथ एक बड़ा कोड इस्तेमाल नहीं किया गया था, लेकिन कुछ साल पहले, उम्मीद है कि यह अभी तय हो गया है।

+2

यह शायद 2008 में तो प्रासंगिक नहीं था, लेकिन यह ध्यान देने योग्य है कि 64 बिट कोड सभी प्लेटफार्मों पर SSE इकाई के बजाय x87 एफपी इकाई का उपयोग करता है के लायक है (न केवल ओएस एक्स)। – Spock