【发布时间】:2012-01-17 04:44:12
【问题描述】:
我想知道 Visual C++ 中是否真的没有 128 位除法内在函数?
有一个名为 _umul128() 的 64x64=128 位乘法内在函数,它与 MUL x64 汇编指令非常匹配。
当然,我假设也会有一个 128/64=64 位除法内在函数(模拟 DIV 指令),但令我惊讶的是,Visual C++ 和 Intel C++ 似乎都没有,至少它没有列出在 intrin.h 中。
有人可以确认吗?我尝试 grep'ing 编译器可执行文件中的函数名称,但一开始找不到 _umul128,所以我想我看错了位置。
更新:至少我现在在 Visual C++ 2010 的 c1.dll 中找到了模式 umul128(没有前导下划线)。所有其他内在函数都在它周围列出,但不幸的是没有“udiv128”等: (所以看起来他们真的“忘记了”去实现它。
澄清一下:我不仅在寻找 128 位数据类型,而且还在寻找一种在 C++ 中将 128 位标量 int 除以 64 位 int 的方法。 intrinsic function 或 native 128 位整数支持都可以解决我的问题。
编辑:答案是否定的,直到 2017 年 Visual Studio 2010 中都没有 _udiv128 内在函数,但它在 Visual Studio 2019 RTM 中可用
【问题讨论】:
-
它不是 CRT 的一部分。它是内在的,随处理器免费提供。但仅限于 64 位模式。除非您获得 128 位处理器,否则 div 没有免费赠品。鉴于 pow(2, 128) 的范围非常大,您应该寻找任意精度库。周围有很多人。
-
@TreeMonkie: VS 不支持 __int18,见stackoverflow.com/questions/6759592/…
-
@Hans:对不起,我不明白。它只是不是内在的,即使在 64 位模式下也是如此。我需要它来编写一个任意精度库:)
-
好吧,那么寻找盒装解决方案毫无意义。你从小学就知道如何用纸和铅笔做任意精确的数学。 128 位需要大量纸张,但计算机有很多。
-
@cxxl:我相信不直接支持 128 位 int ......但是您可以在使用 SSE 内在函数时使用它们。我相信——但不要引用我的话——它是__m128。对于 SSE 是否会在这种情况下使用的问题,我并不完全清楚......
标签: visual-c++ intrinsics integer-division 128-bit