128-разрядные целые числа, поддерживающие +, -, *, / и% в компиляторе Intel C?
GCC и Clang имеют __int128_t
а также __uint128_t
расширения для 128-битной целочисленной арифметики.
Я надеялся, что __m128i
дал бы что-то похожее для компилятора Intel C, но (если это вообще возможно) мне кажется, что я должен был бы написать явные вызовы функций 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-битного целого с операторами +
, -
, *
, /
, а также %
где-то похоронен в icc?
1 ответ
Решение
Из того, что я могу сказать, по крайней мере icc 13.0.1+
служба поддержки __int128_t
а также __uint128_t
, Предоставлено Исследователем Компилятора Мэтта Годболта:
__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;
}
компилируется в:
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
с icc 13.0.1
( http://goo.gl/UnxEFt).