【发布时间】:2018-11-19 20:35:46
【问题描述】:
我在一个假设的架构中,只有这些操作 (Y86)。不存在算术右移。我实际上是在尝试捕获最高位以确定该数字是否为负数,如果是,则将其添加到结果寄存器 rax。
编辑:
对不起,我忘了指定,我正在尝试避免条件分支,看看它是否提高了效率。我所在的版本中不存在 cmov。
我得到的最远的是:
andq $0x10000000, elem
subq $0x01111111, elem
addq elem, %rax
但是,对于 0 的结果,这不起作用。
【问题讨论】:
-
y86 确实有条件跳转。还有一些版本有 cmov。
-
可以使用条件分支吗?你可以使用循环吗?
-
没有
mov?或者您可以使用add作为负载,具有内存源和归零目标(来自异或归零)?如果是这样,您可以一次为 1 个字节创建一个查找表。也许是一个有用的构建块? (使用未对齐的存储到缓冲区+存储零,您应该能够隔离 qword 的 1 个字节)。但是,很难使用,并且无助于结果字节之间的进位。 LC3 Assembly Bitwise Right Shift 是关于另一个缺少右移的 ISA。 -
您如何定义“效率”?没有物理 y86 CPU。如果您指的是在解释器中运行时的性能,那么请记住,y86 代码中的控制依赖关系将成为解释器中的数据依赖关系,因此分支错误预测不是直接的事情。 (如果使用间接分支为每个操作码分派到处理程序,解释器中的分支未命中通常来自指令组合的变化。)或者您是否在想象具有预取 + 分支预测但仍然没有右移的假设物理 y86?
-
@phuclv
i是即时的。 y86 在助记符中对其进行编码,类似于 mips,mips 也有add、addi(顺便还有无符号版本addu和addiu,尽管它们仅在溢出信号方面有所不同)