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

标签 c assembly division 68000

我正在使用 vbcc 编译器将我的 C 代码翻译成 Motorola 68000 ASM。

无论出于何种原因,每次我在代码中使用除法(只是整数,而不是 float )时,编译器只会将以下 stub 插入 ASM 输出(我在每次重新编译时生成):

public  __ldivs
jsr __ldivs

我明确搜索了 DIVS/DIVU 的所有变体,但每次都只有上面那个 stub 。代码本身有效(我在目标设备上对其进行了调试),因此最终代码确实包含 DIV 指令,只是没有中间输出。

因为这是最昂贵的指令并且它在一个内部循环中,我真的必须尝试调整代码以获得它的最大性能。

但是,如果我没有看到生成的 ASM 代码,我将无法执行此操作。任何想法如何启用它?编译器手册没有指定任何类似的东西,所以显然必须有一些其他的 - 可能是常见的 - 更高的原则在起作用?

最佳答案

来自vbcc compiler system Volker Barthelmann 的手册:

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 e ffects:
...
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 位除法指令。

关于c - 如何在 C 编译器的 ASM 输出中启用 DIV 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32853039/

相关文章:

c++ - 无符号与有符号整数的性能

c - Linux 中 PTR_ALIGN 的用法

c - 错误的 TCP 客户端实现

c - 舍入为整数 - 舍入控制字段?

assembly - JMP 对堆栈和帧指针执行什么操作?

汇编快速除以2

c - gcc -nostdlib 和 mudflap

C 为什么 3 除以 2 在一个 int 中等于 0,而在另一个 int 中等于 1?

algorithm - brainfuck中的divmod算法

c++ - 使用带有嵌套结构的模板化 lambda 时的类型推导 + 分析可能未使用的程序集输出