c - __int128_t 算术是否被 GCC 模拟,即使使用 SSE?

标签 c gcc x86 sse int128

我听说 GCC 提供的 128 位整数数据类型,如 __int128_t 是模拟的,因此速度很慢。但是,据我所知,各种 SSE 指令集(SSE、SSE2、...、AVX)至少引入了一些用于 128 位寄存器的指令。我不太了解 SSE 或汇编/机器代码,所以我想知道是否有人可以向我解释是否使用现代版本的 GCC 模拟了 __int128_t 的算术。

我问这个问题的原因是因为我想知道在不同版本的 GCC 之间期望 __int128_t 性能有很大差异是否有意义,这取决于利用了哪些 SSE 指令。

那么,__int128_t 算术的哪些部分是 GCC 模拟的,哪些部分是用 SSE 指令(如果有的话)实现的?

最佳答案

我在问题中混淆了两个不同的东西。

首先,正如 PaulR 在评论中解释的那样:“SSE 或 AVX 中没有 128 位算术运算(除了按位运算)”。考虑到这一点,必须在基于 x86-64 的现代处理器(例如 AMD Family 10 或 Intel Core 架构)上模拟 128 位算法。这与 GCC 无关。

问题的第二部分是 GCC 中的 128 位算术仿真是否受益于 SSE/AVX 指令或寄存器。正如 PaulR 的评论所暗示的那样,SSE/AVX 中没有太多内容可以让您更轻松地进行 128 位算术;最有可能使用 x86-64 指令。我感兴趣的代码无法使用 -mno-sse 进行编译,但可以使用 -mno-sse2 -mno-sse3 -mno-ssse3 -mno-sse4 -mno 进行编译-sse4.1 -mno-sse4.2 -mno-avx -mno-avx2 并且性能不受影响。所以我的代码没有受益于现代 SSE 指令。

关于c - __int128_t 算术是否被 GCC 模拟,即使使用 SSE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16566437/

相关文章:

c - 初始化 char[] 失败,esi 包含错误值

c - 对主机使用免费会导致段错误

c - 为什么在释放指针后取消引用时会得到不同的结果?

windows - 检测另一个进程的位数(在 Windows 中)

c - 如何将一个字符串中的多个单词分配给各个自变量?

c - 分段故障归档 sleep 功能

c++ - GCC 4.9.2/GCC 4.8.1 - std::condition_variable::wait_until(...) 错误?

gcc - GCC 中的 OpenSSL 链接选项 -lssl 和 -lcrypto

c - 确定函数参数起始地址

assembly - execve shellcode 写段错误