一年前我参加了一个计算机组织课程,现在我已经跟进了它,计算机体系结构' ,我正在使用John Hennessy的第3版“计算机体系结构的定量方法”,我通过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(无符号)?
请详细了解这一点,以便我可以按照其他主题进行操作。 感谢
答案 0 :(得分:4)
对addesses执行内存访问,并按源代码中的循环指定的顺序执行。
daddiu
指令足以执行此类地址算术。 “负”值在二进制补码中完成减法。地址既不是消极也不是积极的;它们只是位模式。请参阅ISA reference以了解有关MIPS和说明的更多信息。
16位带符号立即数被添加到GPR rs和中的64位值 64位算术结果放入GPR rt。没有整数 在任何情况下都会发生溢出异常。
...
指令名称中的“无符号”一词用词不当;这个操作是64位模运算,但没有 陷阱溢出。它适用于无符号算术,如地址算术或忽略溢出的整数算术环境,如C语言算术。
示例未优化或展开。它只是源的字面翻译。