2013-05-03 6 views
12

GCC와 Clang은 128 비트 정수 산술을위한 __int128_t__uint128_t 확장을 가지고 있습니다. (그것도 가능하다면) 내가 명시 적 SSE2 함수를 작성해야 할 것 같은 __m128i이 나에게 보이는 인텔 C 컴파일러에 대한 비슷한주고 있지만 것이라고인텔 C 컴파일러에서 +, -, *,/및 %를 지원하는 128 비트 정수입니까?

I was hopeful 내장 "를 사용하는 대신, __m128i를 사용하기 위해 호출 -in "연산자는 +, -, *, /%과 같습니다. 나는 (이 작동하지 않습니다)이 같은 뭔가를 기대했다 : 운영자 +, -는, *, /% 어딘가에 ICC에 묻혀 128 비트 정수 지원

#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 

있습니까?

+0

저는 ICC (ICC) 12.0.0 20101006을 사용하고 있습니다 만 ICC의 모든 버전에 관심이 있습니다. 나는 이것을지지하는 리눅스 용 다른 C 컴파일러에도 관심이있다. –

+0

이 답변은 거의 확실합니다. 나는 [Intel 개발자 포럼] (http://software.intel.com/en-us/forums/topic/392619)에 크로스 게시했습니다. –

+1

MMX, SSE 및 그 후속 제품은 128 비트가 아닌 한 번에 여러 값으로 사용됩니다. 256 비트 AVX/AVX2 또는 앞으로 AVX-512에 128 비트 수학 명령어가 있다고 생각하지 않습니다. 128 비트 수학이 필요하다면 라이브러리를 사용하거나 자신 만의 –

답변

8

내가 알 수있는 것부터, 적어도 icc 13.0.1+ 지원 __int128_t__uint128_t입니다. Matt 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가 icc 12.1.4에서 사용할 수 없음 *이지만 13.0.0, 14.0.4 및 15.0.0에서 * 사용할 수 있음을 확인했습니다. 그래서 전환은 버전 13에서 발생한 것으로 보입니다. –