c - हाथ लक्ष्य के लिए एक आवेदन संकलित करते समय फ़्लोटिंग बिंदु एबी ध्वज का इस्तेमाल किया गया था




floating-point arm (2)

मैंने हाल ही में हाथ के लक्ष्य के लिए सी एप्लिकेशन लिखे हैं हाथ के लक्ष्य के लिए एक आवेदन को संकलन करने के लिए, एक फ्लैग -mfloat-abi=hard करने के लिए इस्तेमाल किया जाता था। लेकिन मैं वास्तव में इसका अर्थ समझ नहीं पाया था। क्या कोई कृपया समझा सकता है कि ध्वज का अर्थ क्या है आवेदन को संकलित करते समय यह क्या बदलाव करेगा?


यह अंतर कॉलिंग सम्मेलन में है। एआरएम रजिस्टर-आधारित कॉलिंग सम्मेलनों का उपयोग करता है, जिसमें कार्य करने के लिए दोनों तर्क (एक सीमा तक, जिसके बाद वे स्टैक को फैलाना शुरू करते हैं), और रिटर्न वैल्यू रजिस्टरों में पारित हो जाते हैं (पूर्ण धमाकेदार विवरण के लिए, देखें प्रक्रिया कॉल मानक )। जब फ्लोटिंग-पॉइंट वैल्यू की बात आती है, तो एक हार्डवेयर एफपीयू कॉपोकसेसर की मौजूदगी या नहीं, फ्लोटिंग प्वाइंट वैल्यू से निपटने के तरीके पर थोड़ी सी पहेली उठाती है, कोड उत्पन्न करते समय दो संभावनाएं देते हैं:

  • हार्ड फ़्लोट : आप मानते हैं कि फ्लोटिंग पॉइंट हार्डवेयर मौजूद है, और एफपी तर्क और वापसी मूल्य एफपीयू रजिस्टरों में पास किए जाते हैं। जब आपके पास कोई एफपीयू होता है, लेकिन यह मशीनों के बिना पोर्टेबल नहीं है, तो यह अधिक कुशल होता है, जहां कोड मौजूद नहीं होने वाले रजिस्टरों तक पहुंचने की कोशिश में उड़ जाएगा।

  • नरम-फ्लोट : फ्लोटिंग-पॉइंट आर्ग्यूमेंट सामान्य प्रयोजन के रजिस्टरों में पास किए जाते हैं, उसी तरह 32-बिट या 64-बिट पूर्णांक होगा। Callee फ़ंक्शन तब उन्हें एफपीयू रजिस्टरों में स्थानांतरित कर सकता है ताकि यह काम करने के लिए हार्डवेयर का समर्थन हो, या नहीं तो फ्लोटिंग-प्वाइंट इम्यूलेशन पर वापस आ जाए। इस प्रकार आपका कोड सही लाइब्रेरी समर्थन के साथ कहीं भी वास्तविक एफपीयू हार्डवेयर (जो तुच्छ कार्यों के लिए अधिक महत्वपूर्ण हो सकता है) पर थोड़ी सी ओर की लागत पर कहीं भी काम कर सकता है।

उस से, आप संभवत: इसे दोहरा सकते हैं कि आप दो मिश्रण नहीं कर सकते हैं - कहते हैं कि आप फ़ंक्शन कॉल को सॉफ्ट-फ्लोट के रूप में संकलित कर सकते हैं , लेकिन उस फ़ंक्शन को कार्यान्वित करने वाली हार्ड-फ्लोट पुस्तकालय से लिंक - आपका कॉलिंग कोड r1 1 में फ़्लोट तर्क डाल सकता है , लेकिन बछेड़ा कोड एस0 में इसके लिए खोज करेगा और वहां किसी भी कचरा मूल्य के साथ बकवास की गणना करने के लिए आगे बढ़ें। इसी तरह, लाइब्रेरी फ़ंक्शन फिर एक फ्लोट के परिणाम को एस 0 में लौटाएगा, लेकिन आपका कोड जो कुछ भी r0 में छोड़ा गया था और साथ ही ज्यादा गलत हो जाएगा।

इस प्रकार यदि आपके टूलकेन हार्ड फ्लोट लाइब्रेरी प्रदान करता है, तो आप केवल उनसे लिंक कर सकते हैं यदि आप अपने कोड को हार्ड फ्लोट के रूप में संकलित करते हैं, और इसके विपरीत। ध्यान दें कि मल्टीलिब के जादू का मतलब है कि एक टूलचैन दोनों पुस्तकालयों के दोनों संस्करणों के माध्यम से, दोनों का समर्थन कर सकता है और जब आप लिंक करते हैं तो स्वचालित रूप से सही चुनते हैं।


दस्तावेज़ीकरण पर एक नज़र डालें:

-mfloat-abi=name निर्दिष्ट करता है कि किस फ़्लोटिंग-बिंदु एबीआई का उपयोग करना है। स्वीकार्य मूल्य हैं: 'सॉफ्ट', 'सॉफ्टफप' और 'हार्ड' 'नरम' निर्दिष्ट करने के कारण जीसीसी को फ्लोटिंग-पॉइंट ऑपरेशंस के लिए लाइब्रेरी कॉल्स वाले आउटपुट उत्पन्न करने के लिए 'सॉफ्टफप' हार्डवेयर फ्लोटिंग-पॉइंट निर्देशों का उपयोग करते हुए कोड पीढ़ी की अनुमति देता है, लेकिन फिर भी नरम फ्लोट कॉलिंग सम्मेलनों का उपयोग करता है। 'हार्ड' फ्लोटिंग-पॉइंट निर्देशों के निर्माण की अनुमति देता है और एफपीयू-विशिष्ट कॉलिंग सम्मेलनों का उपयोग करता है।

डिफ़ॉल्ट विशिष्ट लक्ष्य कॉन्फ़िगरेशन पर निर्भर करता है। ध्यान दें कि कड़ी मेहनत और नरम फ्लोट एबीआई लिंक-संगत नहीं हैं; आपको अपने पूरे कार्यक्रम को उसी एबीआई के साथ संकलित करना होगा, और पुस्तकालयों के संगत सेट के साथ लिंक करना होगा।

इसका मतलब है कि hard हार्डवेयर विशिष्ट चल बिन्दु निर्देशों का उपयोग करता है soft उन निर्देशों का उपयोग नहीं करेगा, लेकिन यह एक सॉफ्टवेयर लायब्रेरी के रूप में एफपी संचालन को लागू करेगा।

अंत में, softfp मतलब है कि यह soft बुला सम्मेलनों (और अन्य एबीआई) का उपयोग करेगा, जो कि पैरामीटर को पास करने या ले जाने के लिए एफपी हार्डवेयर रजिस्टरों का उपयोग नहीं करेगा, लेकिन यह उपलब्ध होने पर हार्डवेयर एफपी निर्देशों का उपयोग करेगा

soft और softfp लिंक-संगत हैं, जो कि वे उसी एबीआई का उपयोग करते हैं, ताकि आप उन्हें एक ही कार्यक्रम में मिला दें। लेकिन hard तर्क तर्क के लिए हार्डवेयर रजिस्टरों का उपयोग करेगा, इसलिए इसे अन्य दो के साथ मिलाया नहीं जा सकता।

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

अपवाद यह है कि यदि आप soft एबीआई के साथ ओएस का प्रयोग कर रहे हैं, और आप इसे किसी ऐसे हार्डवेयर में चला रहे हैं जिसे आप जानते हैं, तो वह मुश्किल-एफपी में सक्षम है, तो आप अपने प्रोग्राम को softfp रूप में संकलित कर सकते हैं और लिंक को तोड़ने के बिना उस सुविधा का फायदा उठा सकते हैं। ।





cross-compiling