ciccint128

128-bit integers supporting +, -, *, /, and % in the Intel C Compiler?


GCC and Clang have the __int128_t and __uint128_t extensions for 128-bit integer arithmetic.

I was hopeful that __m128i would give something similar for the Intel C Compiler, but (if it's even possible) it looks to me like I'd have to write explicit SSE2 function calls in order to use __m128i, instead of using "built-in" operators like +, -, *, /, and %. I was hoping to do something like this (this doesn't work):

#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

Is there 128-bit integer support with the operators +, -, *, /, and % somewhere buried in icc?


Solution

  • From what I can tell, at least icc 13.0.1+ support __int128_t and __uint128_t. Courtesy of 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;
    }
    

    compiles to:

    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
    

    with icc 13.0.1.