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).

Другие вопросы по тегам