在D中如何64位mulhi
原文
Mulhi
是一条可在任何64
位CPU
上有效地使用如下操作的指令:
ulong mulhi(ulong a, ulong b) {
return (ucent(a) * ucent(b)) >> 64;
}
在C++
用__int128
实现它.
这种运算,因为允许一次完成大量移动和加法
,对快速哈希
很好用.你可能会问,这不就是传统
的乘法?不,它不是,因为它不会右移
,高位
不会影响低位
.
LDC
可用inline-(LLVM-)IR
:
ulong mulhi(ulong a, ulong b)
{
import ldc.llvmasm;
return __ir!(`
%a = zext i64 %0 to i128
%b = zext i64 %1 to i128
%r = mul i128 %a, %b
%r2 = lshr i128 %r, 64
%r3 = trunc i128 %r2 to i64
ret i64 %r3`, ulong)(a, b);
}
为了完整,GDC
的x86
后端有内置
函数:
import gcc.builtins;
ulong mulhi(ulong a, ulong b)
{
alias __m64 = __vector(short[4]);
__m64 res = __builtin_ia32_pmulhw(*cast(__m64*)&a, *cast(__m64*)&b);
return *cast(ulong*)&res;
}
__EOF__
_D3vec5mulhiFmmZm:
.cfi_startproc
movq %rdi, %xmm0
movq %rsi, %xmm1
pmulhw %xmm1, %xmm0
movq %xmm0, %rax
ret
.cfi_endproc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现