2013-05-03 11 views
12

GCC i Clang mają rozszerzenia __int128_t i __uint128_t dla 128-bitowej arytmetyki liczb całkowitych.128-bitowe liczby całkowite obsługujące +, -, *,/i% w kompilatorze Intel C?

I was hopeful że __m128i dałby coś podobnego dla Intel kompilatora C, ale (jeśli to w ogóle możliwe), to wygląda mi na to, że muszę napisać wyraźnej funkcji SSE2 wzywa, aby wykorzystać __m128i, zamiast używać „zbudowany -w "operatorach takich jak +, -, *, i %. Miałem nadzieję zrobić coś takiego (nie działa):

#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 

Czy istnieje 128-bitowego całkowitą z operatorami +, -, *, / i % gdzieś zakopane w MCK?

+0

Używam ICC (ICC) 12.0.0 20101006, ale byłbym zainteresowany jakąkolwiek wersją ICC. Byłbym także zainteresowany innymi kompilatorami C dla linuxa wspierającego to. –

+0

Odpowiedź na to prawie na pewno "nie". Właśnie przekierowałem się na forum programistów Intel (http://software.intel.com/en-us/forums/topic/392619). –

+1

MMX, SSE i ich następcy mają być używane dla wielu wartości naraz, a nie dla numeru 128-bitowego. Nie sądzę, że istnieje 128-bitowa instrukcja matematyczna w 256-bitowym AVX/AVX2 lub nawet w AVX-512 w przyszłości. Jeśli potrzebujesz 128-bitowej matematyki, skorzystaj z biblioteki lub zbuduj własną –

Odpowiedz

8

Z tego co wiem, przynajmniej icc 13.0.1+ obsługuje __int128_t i __uint128_t. Dzięki uprzejmości 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; 
} 

zestawia się:

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 

z icc 13.0.1 (http://goo.gl/UnxEFt).

+0

Tak, to działa! Właśnie sprawdziłem, że __uint128_t jest * nie * dostępne w icc 12.1.4, ale * jest * dostępne w 13.0.0, 14.0.4 i 15.0.0. Wygląda na to, że przełącznik pojawił się w wersji 13. –

Powiązane problemy