繁体   English   中英

如何在C编译器的ASM输出中启用DIV指令

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM