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

前端之家收集整理的这篇文章主要介绍了我的MIPS编译器是疯了,还是我疯狂选择MIPS?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在嵌入式项目中使用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:

对每个人都很恐慌.

猜你在找的C&C++相关文章