gpt4 book ai didi

c - 使用 GCC 中的内联汇编从 32 位 IMUL 返回 64 位结果

转载 作者:行者123 更新时间:2023-11-30 15:32:32 24 4
gpt4 key购买 nike

我试图从本质上得到以下结果......

Inputs EAX, EDX
IMUL EDX
Return EAX:EDX as full 64-bit result

我正在查看 https://gitorious.org/voxlap/voxlap/source/d467829d05294545ebb4cc088440421b57c7f38f:include/ksnippits.h#L281 中的这个示例

static inline long mulshr16 (long a, long d)
{
#if defined(__GNUC__) && defined(__i386__) && !defined(NOASM)
__asm__ __volatile__
(
"imul %[d]\n"
"shrd $16, %%edx, %[a]\n"
: [a] "+a" (a)
: [d] "r" (d)
: "edx"
);
return a;
#else // C Default
return (long)(((int64_t)a * (int64_t)d) >> 16);
#endif
}

我只是想要驻留在 EAX:EDX 中的完整 64 位结果,而不是移位结果,但我不确定如何使用内联汇编器将其传递回 GCC。

最佳答案

尝试一下,但要仔细测试:

#include <stdio.h>

static inline long long mul64 (long a, long d)
{
long long rtn;
__asm__ __volatile__("imull %[d]\n" :
[rtn] "=A" (rtn) : [a] "a" (a), [d] "rm" (d) );
return rtn;
}

int main(void)
{
printf("%lld should be -1524157875019052100.", mul64(-1234567890, 1234567890));
return 0;
}

正如其他人所说,以下定义生成几乎相同的代码:

static inline long long mul64 (long a, long d)
{
return (long long)a * d;
}

除了编译器会折叠常量并在可能的情况下使用移位而不是乘法指令。 IE。在许多情况下,它会生成更快代码。

所以我假设您总是希望发出 imull 指令是有原因的。这是经历内联汇编之苦的唯一明确原因。

关于c - 使用 GCC 中的内联汇编从 32 位 IMUL 返回 64 位结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24206153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com