[英]How to enable the DIV instruction in ASM output of C compiler
我正在使用vbcc编译器将C代码转换为Motorola 68000 ASM。
无论出于什么原因,每次我在代码中使用除法(只是整数,而不是浮点数)时,编译器都只会在ASM输出中插入以下存根(我在每次重新编译时都会生成):
public __ldivs
jsr __ldivs
我明确搜索了DIVS / DIVU的所有变体,但是每次都只有一个存根。 代码本身可以工作(我在目标设备上对其进行了调试),因此最终代码的确具有DIV指令,而没有中间输出。
由于这是最昂贵的指令,并且处于内部循环中,因此我真的必须尝试调整代码以使其发挥最大性能。
但是,如果看不到生成的ASM代码,则无法执行。 任何想法如何启用它? 编译器手册中未指定类似的内容,因此显然必须在起作用吗?
从Volker Barthelmann 撰写的vbcc编译器系统手册中:
4.1其他选项
该后端提供以下附加选项:...
-cpu=n
生成cpu n的代码(例如-cpu = 68020),默认值:68000。
4.5个CPU
-cpu=n
的值具有以下效果:
...
n>=68020
- 32位乘法/除法/模是通过mul?.l,div?.l和div?ll指令完成的。
原始的68000 CPU不支持32位除法,仅支持16位除法,因此默认情况下,vbcc不会生成32位除法指令。
基本上,您的问题甚至都不属于这里。 您是在问编译器的工作原理,而不是68K cpu系列的问题。
由于这是最昂贵的指令,并且处于内部循环中,因此我真的必须尝试调整代码以使其发挥最大性能。
那你已经在和风车战斗了。 选择晦涩难懂的C编译器,同时又希望获得最佳性能,这是相互矛盾的目标。
如果您确实需要MC68000代码兼容性,则选择C值得怀疑。 由于68000的缓存为零,简单的C编译器往往会大量产生存储/加载逻辑,因此会对性能产生巨大影响。 对于较高的成员,它会大大减少,并且在超标量流水线的成员(erm,其中之一; 68060)上可能会变得不可见。
如果目标平台允许,请切换到68020代码模型,如果对当前版本不满意,请切换到编译器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.