一年前我上过一门计算机组织课程,现在我有了一个后续课程,叫做“计算机架构”,我正在使用约翰·轩尼诗的第三版《计算机架构的量化方法》,我已经读过MIPS ISA,但仍然需要一些帮助,你能更详细地解释一下这一行代码吗
源代码:
for(i=1000; i>0; i--)
x[i] = x[i] + s;
装配代号:
Loop: L.D F0, 0(R1) ; F0 = array element
ADD.D F4, F0, F2 ; add scalar
S.D F4, 0(R1) ; store result
DADDUI R1, R1,# -8 ; decrement address pointer
BNE R1, R2, Loop ; branch if R1 != R2
这是一个循环展开以利用ILP的例子,我有一些疑问。我确实知道这个数组从Mem[0+R1]开始,一直到Mem[R+8]为止(如文中所示),有什么原因吗,或者他们只是随机地取了这个位置?
另外,为什么在添加有符号数字(-8)时使用DADDUI(无符号)?
请对此做一个详细的概述,以便我可以继续学习其他主题。
谢谢
最佳答案
内存访问按源代码中循环指定的顺序执行。daddiu
指令足以执行这种地址运算。“负”值完成两个补码的减法运算。地址既不是负的也不是正的;它们只是位模式。请参阅ISA reference以了解有关MIPS和说明的更多信息。
16位带符号立即数被添加到GPR rs中的64位值中,并且
将64位运算结果放入GPR-rt。无整数
在任何情况下都会发生溢出异常。
…
指令名中的术语“unsigned”是一个误称;此操作是64位模运算,但它不
溢出时陷阱。它适用于无符号算术(如地址算术)或忽略溢出的整数算术环境(如C语言算术)。
示例未优化或展开。这只是原文的直译。
关于c - 谁能用更简单的方式解释一下?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29327043/