2013-10-29 6 views
5

मुझे आईपैड पर लाखों 32-बिट पूर्णांक पर एमएसबी (सबसे महत्वपूर्ण बिट) की गणना करने की आवश्यकता है। मेरे पास सादा सी पर लिखा गया एमएसबी का अपना (बदसूरत) कार्यान्वयन है, जो धीमा है। एआरएम प्रोसेसर के पास CLZ (अग्रणी शून्यों की गणना करें) हार्डवेयर कमांड है, जो इसके लिए बहुत उपयोगी हो सकता है। ARM reference के अनुसार एक आंतरिक सी फ़ंक्शन __CLZ है। मैं अपने एक्सकोड प्रोजेक्ट में एआरएम आंतरिक कार्यों का समर्थन कैसे जोड़ सकता हूं?आईओएस में एआरएम इंट्रिनिक्स का उपयोग कैसे करें?

पीएस मैंने नीयन से हार्डवेयर सीएलजेड (arm_neon.h सहित) तक पहुंचने का तरीका ढूंढने में कामयाब रहा है, लेकिन यह वही नहीं है जो मुझे चाहिए, क्योंकि यह केवल वेक्टर के साथ काम करता है, लेकिन मुझे स्केलर एमएसबी की आवश्यकता है।

+1

क्या आप इनलाइन एएसएम कोड का उपयोग नहीं कर सकते? – tarmes

+0

मुझे नहीं पता कि इनलाइन एएसएम कैसे लिखना है, फिर भी ;-) –

उत्तर

4

मुझे ARM C language extensions के पृष्ठ 44 पर एआरएम आंतरिक कार्यों के नाम मिले। उनमें से कुछ एक्सकोड में काम करता है। यह 31 प्रिंट के रूप में उम्मीद:

NSLog(@"%u", __builtin_clz(1)); 

नोट्स:

  • मैं नहीं इस बात का कोई संदर्भ एप्पल डॉक्स में मिल गया है। संभवतः एक्सकोड ने उन कार्यों को एलएलवीएम या क्लैंग से विरासत में मिलाया।
  • आपको उन कार्यों का उपयोग करने के लिए किसी भी विशेष शीर्षलेख या ढांचे को शामिल करने की आवश्यकता नहीं है। एक्सकोड आईडीई स्वतः पूर्ण उनके बारे में नहीं जानता है।
  • एक्सटेंशन सूची से केवल कुछ ही कार्य लागू किए गए हैं। पृष्ठों के मुताबिक 12-13 उसी दस्तावेज़ के लिए यह दो हेडर फाइलें होनी चाहिए: non_ NEON intrinsics और arm_neon.h के लिए arm_acle.h NEON intrinsics के लिए। एक्सकोड में केवल दूसरी फ़ाइल है, लेकिन पहली फ़ाइल के कुछ फ़ंक्शंस कहीं और घोषित किए गए हैं।
0

यह स्पष्ट हो सकता है, लेकिन यदि आप एआरएम-विशिष्ट निर्देशों का उपयोग करते हैं, तो आप आईओएस सिम्युलेटर में अपना ऐप चलाने में सक्षम नहीं होंगे। सिम्युलेटर आपके मैक के मूल x86-64 हार्डवेयर का उपयोग करता है।

आप एक रैपर फ़ंक्शन बना सकते हैं जो एआरएम कमांड का उपयोग करने के लिए एक कंपाइलर निर्देश का उपयोग करता है या यदि आपके पास समर्थन नहीं है तो "बदसूरत" कोड पर वापस आना।

+0

मैं सिम्युलेटर का उपयोग नहीं करता हूं। क्या आप समझ सकते हैं कि मैं कोड में सीएलजेड कैसे जोड़ सकता हूं? मैंने 'clz, CLZ, __clz, __builtin_clz__'', आदि ... कार्यों को जोड़ने का प्रयास किया है, लेकिन वे बस कहीं भी घोषित नहीं किए जाते हैं। मैंने 'grep -R" clz "/ एप्लिकेशन/Xcode.app/सामग्री/डेवलपर/टूलचेन्स/XcodeDefault.xctoolchain'' भी कोशिश की है लेकिन नीयन और x86 के लिए केवल लिंक पाए गए हैं –

संबंधित मुद्दे