- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在Y86-64上执行右移
要进行左移,我知道我需要乘以2 ^ n,其中n是我们想要的位数,例如,如果我们想移4,则为2 ^ 4 = 16并执行加法循环以执行乘法对此,但我不确定该如何做正确的调整,我想我需要进行除法,但不确定如何处理
pcount_do:
movq $0, %rax
.L2: movq %rdi, %rdx
shrq %rdi
ret
最佳答案
就像Matteo展示的那样,您可以一次循环一位,在一个位置读取,而在另一位置写入。
Matteo的答案通过移动掩码来在可变位置读取,并从寄存器的底部开始(在另一个掩码上移动)以锁定步长移动的位置进行写入。
读取输入的MSB比较容易,然后使用add same,same
将输入左移并重复输入。因此,我们从最高位开始读取位,并从其MSB开始构造结果。 (我们一次向目标位置左移了1位,而ADD向左移,并且有条件加法设置是否设置新的位。)
我们可以使用2的补码符号比较来读取寄存器的高位。如果已设置,则为x < 0
,否则未设置。
x86和y86具有一个称为SF的标志,该标志根据结果(ALU操作)的MSB设置。 x86具有js
/ cmovs
/ sets
指令,这些指令直接检查SF
条件。 y86仅具有jl
/ jge
和其他检查SF!=OF
的带符号比较条件,因此我们需要对零进行额外的比较以清除OF(x - 0
不能溢出)。
或者从语义上讲,实际上是与零进行比较,而不仅仅是读取SF。 (除了我们can optimize compare-against-zero into andl %eax,%eax
or andq %rax,%rax
,如果您使用的是不具有次立即性的y86版本,这会很有帮助。y86还会丢失x86的无损test
和cmp
指令,例如and
和< cc>,但只写标志。)
在https://www.simn.me/js-y86/上测试的32位y86版本
移植到y86-64应该很简单。 (更改注册表名称,并且32变为64)。
测试案例:sub
。 (我没有找到一种方法来永久链接该站点上的代码,就像Godbolt编译器浏览器所允许的那样。)
# constant input test case
irmovl 0x12345, %eax
# irmovl 3, %ecx # this could trivial handle variable counts, but doesn't.
# start of right-shift block:
# input: EAX = number to be shifted
# output: EDX = number >> 1
# clobbers: EAX, ECX, EDI. (EDI=1 to work around lack of add-immediate)
xorl %edx, %edx # dst = 0. like # irmovl $0, %edx
irmovl 1, %edi # y86 is missing immediate add?
# shift 32-n bits from EAX into the bottom of EDX
# one at a time using SF to read them from the MSB
irmovl 31, %ecx # hard code count = 32 - 31
# or calculate this as 32 - count with neg / add or equivalent
rshift: # do {
addl %edx, %edx # dst <<= 1
andl %eax, %eax # compare against zero because y86 is missing js / cmovs that tests just SF
jge MSB_zero # jge = jnl = not lower
xorl %edi, %edx # edx ^= 1. y86 is missing OR? low bit = 0 so we can ADD or XOR to set it
MSB_zero:
addl %eax, %eax # src <<= 1
subl %edi, %ecx
jne rshift # }while(--ecx); # semantically jnz
halt # result in EDX
#shr $1, %eax
0x12345 >> 1 = 0x000091a2
效率较低)。
# loop body:
addl %edx, %edx # dst <<= 1
xorl %esi, %esi # esi = 0
sub %esi, %eax # src -= 0 to set flags
cmovl %edi, %esi # esi = (src<0) ? 1 : 0 = MSB of EAX
addl %esi, %edx # copy the bit into EDX (can't carry to higher bits)
addl %eax, %eax # src <<= 1
irmovl 0, %edx
与AND进行模拟,以在寄存器底部隔离该字节。
0x00...0FF
作为字节偏移量,因为一个字节中有8位。但是数量很少,因此我们可以使用重复减法循环。 (您可能希望使用0x3f或0x1f(取决于操作数大小)
count / 8
将计数换行为64或32,就像x86硬件移位一样。这将避免索引过大而超出正确范围的索引存储方式。)
关于assembly - 如何在Y86-64(或其他具有ADD + AND但没有 native 右移的玩具ISA)中执行右移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55539625/
I have a question about adding files in git. I have found multiple stackoverflow questions about
我是 visual studio 的新手,来自 Delphi。 我有一个充满 .cs 文件的目录树(根是\Common)。 我还有一个充满应用程序的目录树(根目录是\Applications) 最后,
这个问题在这里已经有了答案: Array's lookup time complexity vs. how it is stored (4 个答案) Time complexity for java
谁能告诉我这两者有什么区别: ALTER TABLE x1 ADD INDEX(a); ALTER TABLE x1 ADD INDEX(b); 和 ALTER TABLE x1 ADD INDEX(
为什么有时我们使用 getChildren() add() 而其他时候我们直接使用 add() es: https://docs.oracle.com/javafx/2/get_started/for
如何使用 bootstrap css 在输入下方添加跨度?我需要做这样的事情: 最佳答案 是这样的吗? http://jsfiddle.net/swm53ran/205/ 您可以使用纯 CSS 来实现
问题 np.add(X, 2*Y, out=X) 比 np.add(X, Y, out=X); np.add(X, Y, out=X).使用 np.add(X, Y, out=X); 是一种实际做法吗
当我跑 git add --intent-to-add .所有未跟踪的文件将其状态从“未跟踪的文件”( git status -s 显示 ?? )更改为“未暂存以进行提交的更改”( git statu
我不知道 .add 之间有什么区别和 .sink.add ? 例子: StreamController myStreamController = StreamController(); stream
getContentPane().add() 和 add() 的意思一样吗? public class TestFrame extends JFrame{ public TestFrame()
git add . 和 git add * 会完成完全相同的事情吗? 最佳答案 不,不会。 * 是一个 glob 模式,不会匹配以 开头的文件。 例如,假设这是当前目录,我有 2 个新文件要添加 fo
git的分支与合并的两种方法 git add -A和 git add . git add -u在功能上看似很相近,但还是存在一点差别 git add . :他会
git add [--all | -A] 之间有什么区别?和 git add . ? 最佳答案 此答案仅适用于 Git 版本 1.x。对于 Git 版本 2.x,请参阅其他答案。 总结: git ad
我刚刚安装了最新的 Wix v3.7。我创建了一个 VS 2010“Excel 2010 加载项”项目,并在同一个解决方案中创建了一个 Wix“安装项目”。 问题是,当我尝试从 Wix 项目中引用 A
YUI.add 和 YUI().add 有什么区别? 最佳答案 在第一种情况下,您要注册一个模块可以加载到 YUI 沙箱中,在第二种情况下,您要构建一个沙箱,然后进行注册(这是一种非常不典型的用法)。
测试代码时,任何输入到列表中的值在按下“enter”后都会消失。 我对编程和网络开发非常陌生。请具体一点,以便我理解。 function addItem(){ var item = documen
我正在浏览 python 的 dis 包。我尝试了代码以查看它是如何工作的 >>> def get(): ... x=4 ... y=x+3 ............ this lin
我已经对我的文件夹进行了版本控制 git init git add . git commit -m 'Initial commit' 我应该怎么做 git add 对于我在 .? 中创建的每个新文件
当我执行 $ git add * 时,有时我意识到 git 不会将已删除的文件添加到舞台上,如果删除或添加它,我需要手动指示,但我想不通找出 $ git add --all 有什么区别。因此,如果星号
这个问题在这里已经有了答案: Difference between "git add -A" and "git add ." (12 个答案) 关闭 6 年前。 目前,当我想提交并将内容推送到远程
我是一名优秀的程序员,十分优秀!