支持英特尔C编译器中的+, - ,*,/和%的128位整数?

时间:2013-05-03 19:01:06

标签: c icc int128

GCC和Clang具有128位整数运算的__int128_t__uint128_t扩展名。

I was hopeful __m128i会为英特尔C编译器提供类似的东西,但是(如果它甚至可能)它在我看来就像我必须编写显式的SSE2函数调用才能使用__m128i,而不是使用“{1}},+-*/等”内置“运算符。我希望做这样的事情(这不起作用):

%

是否存在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 +-*/隐藏在icc中?

1 个答案:

答案 0 :(得分:10)

据我所知,至少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;
}

汇编为:

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.1http://goo.gl/UnxEFt)。