当前位置: 首页 > 知识库问答 >
问题:

x86_64将64位寄存器减少到32位保持零或非零状态的最佳方法

孟花蜂
2023-03-14
// rax is either zero or non-zero
popcntq %rax, %rax
// eax will be zero if rax was zero, otherwise it will be non-zero

注意:如果rax被称为2^61eax的零/非零状态与rax不相同,那么直接使用32位eax是行不通的

目前,我一直在寻找比popcntq(1c tput、3c延迟、5字节代码大小)更好的方法,这些方法可以适用于所有值。

有没有更好更聪明的方法?

编辑:删除编辑,因为它们没有添加到问题中。

共有1个答案

曾皓
2023-03-14

一个选择是

neg rax         ; 48 F7 D8
sbb eax, eax    ; 19 C0

请记住,neg设置标志就像从零减去一样,所以它设置进位标志,如果rax是非零。而寄存器的SBB从自身生成0-1,这取决于进位是清除还是设置(感谢@prl在注释中建议)。

它仍然是5个字节,和2个uops而不是1。但是如果我的计算是正确的,在Skylake上,你得到2个周期的延迟而不是3,每个周期的吞吐量是2而不是1。

 类似资料:
  • 基本上指令有8->16、8->32、8->64、16->32和16->64。 32->64的转换在哪里?我必须使用签名版本吗? 如果是的话,您如何使用完整的64位来表示无符号整数?

  • 问题内容: 我有一个32位.so二进制库,我必须生成使用它的64位程序。有没有办法包装或转换它,使其可以与64位程序一起使用? 问题答案: 不能。您不能直接链接到64位程序内部的32位代码。 最好的选择是编译一个可以在64位平台上运行的32位(独立)程序(使用ia32),然后使用一种进程间通信的形式从64位程序与其进行通信。

  • 本文向大家介绍Intel x86 Assembly& Microarchitecture 32位寄存器,包括了Intel x86 Assembly& Microarchitecture 32位寄存器的使用技巧和注意事项,需要的朋友参考一下 示例 英特尔生产80386时,他们从16位处理器升级到了32位处理器。32位处理意味着两件事:要处理的数据都是32位,而要访问的内存地址是32位。为此,他们仍然

  • 问题内容: 我的Web应用程序使用会话来存储有关用户登录后的信息,并在用户在应用程序中逐页浏览时维护该信息。在这个特定的应用程序,我存储,和人的。 我想在登录时提供“保持登录状态”选项,该选项会将cookie在用户的计算机上放置两周,当他们返回应用程序时,将使用相同的详细信息重新开始会话。 这样做的最佳方法是什么?我不想将其存储在cookie中,因为这似乎会使一个用户更容易伪造另一位用户的身份。

  • 问题内容: 我已经使用Java一段时间了,而我典型的设置新开发机的习惯要求从Oracle站点下载并安装最新的JDK。 今天这引发了一个不寻常的问题, 回想起来,我已经安装了之前的两个版本,并且很高兴将普通的工具链插入(Eclipse)。在我的日常编程中,我不会回想起曾经因为使用64位JRE(或为此目的而针对64位JRE)而不得不以其他方式进行更改或思考的事情。 根据我对64位和32位的理解- 确实

  • 我试图比较Peter Cordes在回答“将CPU寄存器中的所有位设置为1”的问题时提到的方法。 因此,我编写了一个基准测试,将所有13个寄存器设置为除、和之外的所有位1。 代码如下所示<代码>乘以32 nop用于避免DSB和LSD影响。 我测试了他提到的以下方法,以及这里的完整代码 为了使这个问题更简洁,我将使用替换下表中的。 下表显示,从组1到组3,当使用64位寄存器时,每个循环多1个周期。