【问题标题】:128-bit integers supporting +, -, *, /, and % in the Intel C Compiler?英特尔 C 编译器中支持 +、-、*、/ 和 % 的 128 位整数?
【发布时间】:2013-04-28 06:23:12
【问题描述】:

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

I was hopeful__m128i 会为英特尔 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 的某个地方?

【问题讨论】:

  • 我正在使用 icc (ICC) 12.0.0 20101006,但我会对任何版本的 icc 感兴趣。我也对其他支持此功能的 linux 的 C 编译器感兴趣。
  • 这个问题的答案几乎肯定是“不”。我只是cross-posted to the Intel Developer Forum
  • MMX、SSE 及其后继者旨在一次用于多个值,而不是用于 128 位数字。我认为未来 256 位 AVX/AVX2 甚至 AVX-512 中都没有 128 位数学指令。如果您需要 128 位数学,请使用库或自己构建
  • @LưuVĩnhPhúc,是的,你是对的。我去年问过a question。此外,there is no C compiler besides GCC 似乎支持 OpenMP,并且可以直接替代 __int128_t__uint128_t

标签: c icc int128


【解决方案1】:

据我所知,至少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.1 (http://goo.gl/UnxEFt)。

【讨论】:

  • 是的,它有效!我刚刚验证了 __uint128_t 在 icc 12.1.4 中 可用,但 在 13.0.0、14.0.4 和 15.0.0 中可用。所以切换似乎发生在版本 13 上。
猜你喜欢
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 2013-11-11
  • 2010-11-21
相关资源
最近更新 更多