为什么GCC不使用1 ** imul **指令为C中的1次乘法生成汇编代码?

时间:2016-02-08 11:55:41

标签: performance gcc optimization

我正在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,但结果是相同的三次乘法指令。

0 个答案:

没有答案