我正在https://godbolt.org/使用参数-Wall -m32使用gcc 6.3检查以下简单程序的汇编代码,令我惊讶的是,生成的汇编代码需要三次乘法才能在C中执行一次乘法,如下所示。
#include<stdio.h>
#include<inttypes.h>
int main(void){
int32_t ax=-854763;
int32_t bx=586478;
int64_t cx= (int64_t)ax*bx;
printf("%lld\n", cx);
}
下面给出了语句 int64_t cx =(int64_t)ax * bx; 的生成汇编代码。有两个 imull 和一个 mull 指令。
movl -28(%ebp), %eax
movl %eax, %ecx
movl %eax, %ebx
sarl $31, %ebx
movl -32(%ebp), %eax
cltd
movl %ebx, %edi
imull %eax, %edi
movl %edx, %esi
imull %ecx, %esi
addl %edi, %esi
mull %ecx
leal (%esi,%edx), %ecx
movl %ecx, %edx
movl %eax, -40(%ebp)
movl %edx, -36(%ebp)
movl %eax, -40(%ebp)
movl %edx, -36(%ebp)`
是否可以强制gcc编译器/汇编器只使用一次乘法而不使用内联汇编?因为在原始代码中,我必须在语句和不同语句中执行许多这样的乘法。
为什么编译器不使用一个 imul 指令执行它?我还在https://godbolt.org/上检查了不同版本的gcc,但结果是相同的三次乘法指令。