加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

我的MIPS编译器是疯了,还是我疯狂选择MIPS?

发布时间:2020-12-16 03:24:54 所属栏目:百科 来源:网络整理
导读:我在嵌入式项目中使用MIPS CPU(PIC32),但我开始质疑我的选择. 我知道像MIPS这样的RISC CPU会生成比预期更多的指令,但我不认为它会是这样的.以下是反汇编列表中的代码段: 225: LATDSET = 0x0040; sw s1,24808(s2) sw s4,24808(s2) sw s1,24808(s3) sw s4,248
我在嵌入式项目中使用MIPS CPU(PIC32),但我开始质疑我的选择.
我知道像MIPS这样的RISC CPU会生成比预期更多的指令,但我不认为它会是这样的.以下是反汇编列表中的代码段:
225:                         LATDSET = 0x0040;
    sw          s1,24808(s2)
    sw          s4,24808(s2)
    sw          s1,24808(s3)
    sw          s4,24808(s3)
    sw          s1,24808(s3)

226:                         {

227:                             porte = PORTE;
    lw          t1,24848(s4)
    andi        v0,t1,0xffff
    lw          v1,24848(s6)
    andi        ra,v1,0xffff
    lw          v0,24848(s6)
    andi        t2,v0,0xffff
    lw          a2,24848(s5)
    andi        v1,a2,0xffff
    lw          t2,t2,24848(s5)
    andi        t2,0xffff

228:                             if (porte & 0x0004)
    andi        t2,0x4
    andi        s8,ra,0x4
    andi        ra,0x4
    andi        a1,0x4
    andi        a2,0x4

229:                                 pst_bytes_somi[0] |= sliding_bit;
    or          t3,t4,s0
    xori        a3,0x0
    movz        t3,s0,a3
    addu        s0,t3,zero
    or          t3,s1
    xori        a3,s8,s1,a3
    addu        s1,zero
    or          v1,0x0
    movz        v1,zero
    or          a0,s2
    xori        a3,a1,0x0
    movz        a0,s2,a3
    addu        s2,a0,a3

这似乎是一个疯狂的指令,用于在固定地址进行简单的读/写和测试变量.在不同的CPU上,我可能会将每个C语句降低到大约1..3条指令,而不需要使用手写的asm.显然,时钟频率相当高,但它不比我在不同CPU(例如dsPIC)中的时钟频率高10倍.

我已将优化设置为最大值.我的C编译器很糟糕(这是gcc 3.4.4)?或者这是典型的MIPS?

解决方法

终于找到了答案.反汇编列表完全是误导性的.编译器正在进行循环展开,我们在每个C语句下看到的实际上是指令数量的8倍,因为它正在展开循环8x.说明不在连续的地址!在编译器选项中关闭循环展开会产生以下结果:
225:                         LATDSET = 0x0040;
    sw          s3,24808(s2)
226:                         {
227:                             porte = PORTE;
    lw          t1,24848(s5)
    andi        v0,0xffff
228:                             if (porte & 0x0004)
    andi        t2,0x4
229:                                 pst_bytes_somi[0] |= sliding_bit;
    or          t3,zero
230:

对每个人都很恐慌.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读