【问题标题】:MIPS Loop unrollingMIPS 循环展开
【发布时间】:2012-08-17 01:43:39
【问题描述】:
for (i=0, i<10000, i=i+2)
{

    A[i]=B[i]+C[i]
    A[i+1]=B[i+1]+C[i+1]

}

根据前面的代码,MIPS 程序集是什么样的?我正在尝试构建汇编代码,其中 R9 = A 的基地址,R9 = B 的基地址,R10 = C 的基地址

我知道这种展开 ONCE 的方法应该更有效,但很难看到 MIPS 的样子。

有人可以帮帮我吗?

【问题讨论】:

  • 编译器不会展开该大小的循环,可能会通过在每个循环中多次重复任务来节省分支,但不会完全展开循环。
  • 为什么不尝试编译,看看输出的至少一个版本是什么?
  • 你为什么不使用与stackoverflow.com/questions/11979788/arm-assembly-loop/…相同的技术?
  • 假设您使用的是 GCC,-S 选项将创建一个 .s 文件,该文件将向您显示生成的 MIPS 代码的样子。

标签: assembly for-loop mips


【解决方案1】:

循环体是这样的:

LW    r1, 0(r9)    // B[i]
LW    r2, 4(r9)    // B[i+1]
LW    r3, 0(r10)   // C[i]
LW    r4, 4(r10)   // C[i+1]
ADDU  r5, r1, r3   // B[i] + C[i]
ADDU  r6, r2, r4   // B[i+1] + C[i+1]
SW    r5, 0(r8)    // A[i] 
SW    r5, 4(r8)    // A[i+1]
ADDIU r9,  8
ADDIU r10, 8
ADDIU r8,  8

MIPS 有很多寄存器,因此可能值得再展开循环几次。

【讨论】:

    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多