如何在 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 compiler system 手册:

4.1 Additional options

This backend provides the following additional options:
  • -cpu=n Generate code for cpu n (e.g. -cpu=68020), default: 68000.
...

4.5 CPUs

The values of -cpu=n have those effects:
...
n>=68020
  • 32bit multiplication/division/modulo is done with the mul?.l, div?.l and div?l.l instructions.

原来的 68000 CPU 不支持 32 位除法,只支持 16 位除法,所以默认情况下 vbcc 不生成 32 位除法指令。

基本上你的问题甚至不属于这里。您问的是编译器的工作原理,而不是 68K cpu 系列。

Since this is the most expensive instruction and it's in an inner loop, I really gotta experiment with tweaking the code to get the max performance of it.

那你已经在和风车打架了。选择一个不起眼的 C 编译器,同时又希望获得最佳性能是相互矛盾的目标。

如果真的需要MC68000的代码兼容性,选C值得商榷。由于 68000 的缓存为零,store/load 简单的 C 编译器往往会大量产生狂欢,从而对性能产生巨大影响。对于更高的成员,它会大大减少,并且可能在超标量流水线成员(呃,一个;68060)上变得不可见。

如果目标平台允许,请切换到 68020 代码模型,如果您对当前的编译器不满意,请切换编译器。