2013-02-06 29 views
12

LLVM भाषा में है, जहां एन पूर्णांक के बिट-चौड़ाई है के रूप में पूर्णांक प्रकार निर्दिष्ट करती है और 1 से 2^23-1 के बीच है (के अनुसार: http://llvm.org/docs/LangRef.html#integer-type)LLVM के पूर्णांक प्रकार

2 प्रश्न हैं :

  1. जब LLVM आईआर स्तर तक एक सी कार्यक्रम नीचे संकलन, क्या प्रकार I1, I2, i3, आदि के लिए उतारा जा सकता है? ऐसा लगता है जैसे i8, i16, i32, i64 पर्याप्त होना चाहिए, इसलिए मैं सोच रहा था कि अन्य सभी 8 मिलियन पूर्णांक प्रकार क्या हैं।

  2. क्या यह सच है कि हस्ताक्षरित और हस्ताक्षरित पूर्णांक प्रकार दोनों i32 को कम कर दिए गए हैं? इसका कारण क्या है, और यह 32-बिट फ्लोट (जिसे एलएलवीएम में एफ 32 के रूप में दर्शाया गया है) पर कुछ क्यों लागू नहीं होता है?

    सभी की

उत्तर

15

सबसे पहले, के बारे में पता दोनों मनमाने ढंग से आकार पूर्णांकों और बीच हस्ताक्षरित और अहस्ताक्षरित पूर्णांकों LLVM 2.0 करने के लिए जोड़ा संशोधनों हैं कोई फर्क नहीं होना। पहले के संस्करणों में हस्ताक्षर/हस्ताक्षरित भेद के साथ केवल कुछ पूर्णांक प्रकार थे।

अब, अपने प्रश्नों के:

  1. LLVM फिर भी ध्यान के साथ C/C++ के लिए बनाया गया है, न कि इन भाषाओं के लिए विशिष्ट है। अधिक संभावित पूर्णांक प्रकार होने से आपको अधिक लचीलापन मिल जाता है। आपको इन प्रकारों का उपयोग करने की ज़रूरत नहीं है, ज़ाहिर है - और मैं अनुमान लगा रहा हूं, जैसा कि आपने उल्लेख किया है, एलएलवीएम (यानी क्लैंग) के लिए कोई भी सी/सी ++ फ्रंटेंड शायद आई 1, आई 8, आई 16, आई 32 और आई 64 उत्पन्न करेगा ।

    संपादित करें: स्पष्ट रूप से मैं गलत हूं और क्लैंग कुछ अन्य पूर्णांक प्रकारों का भी उपयोग करता है, जेन्स की टिप्पणी नीचे देखें।

  2. हां, एलएलवीएम हस्ताक्षरित और हस्ताक्षरित पूर्णांक प्रकार के बीच भेद नहीं करता है, इसलिए दोनों को i32 तक कम किया जाएगा। हस्ताक्षर किए गए पूर्णांक पर संचालन, हालांकि, मूल प्रकार के अनुसार अनुवाद किया जाएगा; जैसे हस्ताक्षरित पूर्णांक के बीच एक विभाजन udiv होगा जबकि हस्ताक्षरित के बीच sdiv होगा। चूंकि पूर्णांक two's complement के रूप में दर्शाए जाते हैं, हालांकि, कई संचालन (उदा। add) हस्ताक्षरित/हस्ताक्षरित के बारे में परवाह नहीं करते हैं और इसलिए केवल एक संस्करण है।

    क्यों कोई फर्क नहीं पर हस्ताक्षर किए और अहस्ताक्षरित के बीच LLVM में बनाया गया था के रूप में, the details on this enhancement request पढ़ा - संक्षेप में, दोनों पर हस्ताक्षर किए होने और इसलिए यह हटा दिया गया था अहस्ताक्षरित संस्करणों, एक बड़े आईआर ब्लोट करने के लिए नेतृत्व और कुछ अनुकूलन के लिए हानिकारक था।

    अंत में, आप पूछते हैं कि क्यों f32 - उत्तर यह है कि मुझे नहीं पता, शायद इसे मनमाने ढंग से आकार वाले पूर्णांक से कम उपयोगी माना जाता था। हालांकि, ध्यान दें कि f32 वास्तव में वर्णनात्मक नहीं है - यदि आप मनमाने ढंग से फ़्लोटिंग-पॉइंट प्रकार चाहते हैं तो आपको double के बजाय float और f52e11 की बजाय f23e8 जैसे एक्सपोनेंट के आकार और आकार के आकार को कम से कम निर्दिष्ट करने की आवश्यकता है। यदि आप मुझसे पूछें तो यह थोड़ा बोझिल है, हालांकि मुझे लगता है कि float और double उन लोगों के समानार्थी हो सकते थे।

+0

वास्तव में फ्लोटिंग पॉइंट नंबरों के लिए 'f32' मौजूद है। कारण मैंने यह पूछा था कि मैंने सोचा था कि यदि दोनों हस्ताक्षरित और हस्ताक्षरित पूर्णांक i32 द्वारा प्रदर्शित किए जा सकते हैं, तो शायद 32-बिट फ्लोट को भी इस तरह प्रदर्शित किया जा सकता है। मुझे लगता है कि यह एक विस्तृत डिजाइन निर्णय था जैसा कि आप उल्लेख करते हैं। –

+0

@AliJ मुझे 'f32' को फ्लोटिंग-पॉइंट प्रकारों पर लैंग रेफ सेक्शन] पर सूचीबद्ध नहीं किया गया है (http://llvm.org/docs/LangRef.html#floating-point-types) ... जब तक आप मतलब है कि उस नाम से जुड़े एक आम कार्यान्वयन है? – Oak

+3

इसके लिए धन्यवाद! जैसा कि होता है, मैं बस दो निर्देशों में भाग गया जो क्लैंग उत्पन्न हुआ: 'i576% bla, i576 * bitcast (% class.Foo * @_Global i576 *) को संरेखित करें, 8' और '% 11 = लोड i384 *% 10 संरेखित करें, 8' संरेखित करें। मुझे लगता है कि इन्हें सिम प्रकारों का उपयोग करके 'memcpy' कॉल या स्टोर/लोड निर्देशों का एक स्मार्ट अनुक्रम या कम किया गया है। – Jens