2013-05-03 5 views
12

जीसीसी और क्लैंग में __int128_t और 128-बिट पूर्णांक अंकगणितीय के लिए __uint128_t एक्सटेंशन हैं।128-बिट पूर्णांक इंटेल सी कंपाइलर में +, -, *, /, और% का समर्थन करते हैं?

I was hopeful कि __m128i इंटेल सी संकलक के लिए कुछ इसी तरह देना होगा, लेकिन (अगर यह भी संभव है) यह मेरे लिए लगता है जैसे मैं स्पष्ट SSE2 समारोह लिखने के लिए होगा आदेश उपयोग करने के बजाए, __m128i का उपयोग करने के कॉल "का निर्माण किया -इन "ऑपरेटरों जैसे +, -, *, /, और %। मैं (यह काम नहीं करता) इस तरह कुछ करने के लिए उम्मीद कर रहा था:

#if defined(__INTEL_COMPILER) && defined(__SSE2__) 
    #include "xmmintrin.h" 
    typedef __u128 uint128_t; 
#elif defined (__GNUC__) 
    typedef __uint128_t uint128_t; 
#else 
    #error For 128-bit arithmetic we need GCC or ICC, or uint128_t 
#endif 

वहाँ ऑपरेटरों +, -, *, /, और % कहीं आईसीसी में दफन के साथ 128 बिट पूर्णांक समर्थन है?

+0

मैं आईसीसी (आईसीसी) 12.0.0 20101006 का उपयोग कर रहा हूं लेकिन मुझे आईसीसी के किसी भी संस्करण में दिलचस्पी होगी। मुझे इसका समर्थन करने वाले लिनक्स के लिए अन्य सी कंपाइलर्स में दिलचस्पी होगी। –

+0

इसका उत्तर लगभग निश्चित रूप से 'नहीं' है। मैं बस [इंटेल डेवलपर फोरम पर क्रॉस-पोस्ट किया गया] (http://software.intel.com/en-us/forums/topic/392619)। –

+1

एमएमएक्स, एसएसई और उनके उत्तराधिकारी एक समय में कई मानों के लिए उपयोग किए जाने वाले हैं, न कि 128-बिट संख्या के लिए। मुझे नहीं लगता कि 256-बिट एवीएक्स/एवीएक्स 2 में या यहां तक ​​कि एवीएक्स -512 में भी 128 बिट गणित निर्देश हैं। यदि आपको 128 बिट गणित की आवश्यकता है, तो लाइब्रेरी का उपयोग करें या अपना खुद का –

उत्तर

8

जो मैं बता सकता हूं, कम से कम icc 13.0.1+ समर्थन __int128_t और __uint128_tMatt Godbolt's Compiler Explorer के सौजन्य:

__int128_t ai (__int128_t x, __int128_t y) { 
    return x + y; 
} 

__int128_t mi (__int128_t x, __int128_t y) { 
    return x * y; 
} 

__int128_t di (__int128_t x, __int128_t y) { 
    return x/y; 
} 

__int128_t ri (__int128_t x, __int128_t y) { 
    return x % y; 
} 

को संकलित करता है: icc 13.0.1 (http://goo.gl/UnxEFt) के साथ

L__routine_start_ai_0: 
ai: 
     add  rdi, rdx          #2.14 
     mov  rax, rdi          #2.14 
     adc  rsi, rcx          #2.14 
     mov  rdx, rsi          #2.14 
     ret              #2.14 
L__routine_start_mi_1: 
mi: 
     mov  rax, rdi          #6.14 
     imul  rsi, rdx          #6.14 
     imul  rcx, rdi          #6.14 
     mul  rdx           #6.14 
     add  rsi, rcx          #6.14 
     add  rdx, rsi          #6.14 
     ret              #6.14 
L__routine_start_di_2: 
di: 
     push  rsi           #9.44 
     call  __divti3          #10.14 
     pop  rcx           #10.14 
     ret              #10.14 
L__routine_start_ri_3: 
ri: 
     push  rsi           #13.44 
     call  __modti3          #14.14 
     pop  rcx           #14.14 
     ret              #14.14 

+0

हाँ, यह काम करता है! मैंने अभी सत्यापित किया है कि __uint128_t * आईसीसी 12.1.4 में उपलब्ध नहीं है, लेकिन * है * 13.0.0, 14.0.4, और 15.0.0 में उपलब्ध है। ऐसा लगता है कि संस्करण 13 संस्करण के साथ हुआ है। –

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