[英]Calculating cost of an instruction in assembly language
我正在阅读龙书中的代码生成。 它提供了一种将成本与每个目标语言关联相关联的简单方法。
我们假设每个目标语言指令都有相关的成本。 为简单起见,我们将指令的成本加上与操作数的寻址模式相关的成本加上一个。 该成本对应于指令的单词长度。 涉及寄存器的寻址模式具有零附加成本,而涉及存储器位置或其中的常量的那些具有额外成本1, 因为这些操作数必须存储在指令之后的字中。
一些例子:
我理解前两个例子的成本计算。 我没有得到第三个。 费用3怎么样? 另外,我不明白上面引用文字中的粗体部分。
在我部分理解的内容中,我认为BLTZ * R3的成本,R0为3,因为对于上面类似的第三个例子,它是如此。 但这个成本是1.如何?
注意如果寄存器r中的值小于零,则BLTZ r,L会跳转到标记L,如果不是,则允许控制传递到下一个机器指令。
我相信其他人可以更好地解释这一点。 但是,这里有一些灵感:
成本不是真实的,它们是根据龙书的定义来假设的。 要了解实际成本,您必须检查目标体系结构的表。 请参阅SO维基以获取相应的链接。
因此,通过与上述引用相关的三个示例:
我们把指令的成本作为一个
因此,假设每条指令的成本为1 !
涉及内存位置或常量的那些额外成本为1
所以例子1到3都有
存储器地址和常数分别在指令的附加字中被编码在指令OpCode中,该指令延长了要获取的影响CPU Op / microOp处理的OpCode字节。
我没有得到第三个。 费用3怎么样?
对于上面类似的第三个例子,BLTZ * R3的成本,R0为3。 但这个成本是1.如何?
因为: 涉及寄存器的寻址模式没有额外的成本 。
我不明白上面引用文字中的粗体部分。
显然,这种架构的机器代码使用一个字来指定操作码和寄存器操作数,如果需要一个常量则使用另一个字。
例如, LD R1,*100(R2)
需要2个字。 第一个指定操作(具有寄存器相对偏移的LD
)以及目标寄存器R1
和基址寄存器R2
。 这些是字中的位域。 然后第二个字包含cpu知道要获取的100
,因为第一个字中的操作码。
一些固定长度的体系结构将常量包装到第一个单词中,但显然它们只能具有有限的范围。 使用单独的单词允许全范围。
这本书是一个错误。
成本模型仅涉及指令长度
该长度对应于指令的字长
内存操作不会增加成本,例如LD R1, *R2
成本为1,因为
涉及寄存器的寻址模式没有额外的成本
并且没有涉及的常量(偏移或文字内存地址)。
由于指令访问存储器,因此没有提及额外的成本。
这也解释了为什么BLTZ *R3, R0
的成本是1:因为指令长度是一个字而寻址模式( *R3
)也不涉及常数。
相对而言,自龙书以来,情况发生了很大变化。 乘法从40个周期(int)下降到1/2个周期,从200-300个周期(浮动)到......好吧,我记不清了,但我认为不到10个。
然而,内存访问的成本已经超过了,因为处理器加速而内存与这些增加不匹配。 现在大量的优化工作是面向缓存行(确保具有相互位置的指令,如果可能的话,从单个缓存行中访问数据),并且因为您无法预测哪些内存访问将是缓存未命中,您可以不再容易从编译器中预测执行时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.