Roc*_*net 6 c compiler-construction gcc mips pic
我在嵌入式项目中使用MIPS CPU(PIC32),但我开始质疑我的选择.我知道像MIPS这样的RISC CPU会生成比预期更多的指令,但我不认为它会是这样的.以下是反汇编列表中的代码段:
225: LATDSET = 0x0040;
sw s1,24808(s2)
sw s4,24808(s2)
sw s4,24808(s2)
sw s1,24808(s2)
sw s4,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 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,24848(s5)
andi v1,t2,0xffff
lw v0,24848(s5)
andi t2,v0,0xffff
228: if (porte & 0x0004)
andi t2,v0,0x4
andi s8,ra,0x4
andi s8,ra,0x4
andi ra,t2,0x4
andi a1,v1,0x4
andi a2,v1,0x4
andi a2,t2,0x4
229: pst_bytes_somi[0] |= sliding_bit;
or t3,t4,s0
xori a3,t2,0x0
movz t3,s0,a3
addu s0,t3,zero
or t3,t4,s1
xori a3,s8,0x0
movz t3,s1,a3
addu s1,t3,zero
or t3,t4,s1
xori a3,s8,0x0
movz t3,s1,a3
addu s1,t3,zero
or v1,t4,s0
xori a3,ra,0x0
movz v1,s0,a3
addu s0,v1,zero
or a0,t4,s2
xori a3,a1,0x0
movz a0,s2,a3
addu s2,a0,zero
or t3,t4,s2
xori a3,a2,0x0
movz t3,s2,a3
addu s2,t3,zero
or v1,t4,s0
xori a3,a2,0x0
movz v1,s0,a3
Run Code Online (Sandbox Code Playgroud)
这似乎是一个疯狂的指令,用于在固定地址进行简单的读/写和测试变量.在不同的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,t1,0xffff
228: if (porte & 0x0004)
andi t2,v0,0x4
229: pst_bytes_somi[0] |= sliding_bit;
or t3,t4,s0
xori a3,t2,0x0
movz t3,s0,a3
addu s0,t3,zero
230:
Run Code Online (Sandbox Code Playgroud)
对每个人都很恐慌.
| 归档时间: |
|
| 查看次数: |
1071 次 |
| 最近记录: |