我的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: 对每个人都很恐慌. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |