当gcc
看到硬件不支持的整数类型的乘法或除法时,它会生成对特殊库函数的调用。
http://gcc.gnu.org/onlinedocs/gccint/Integer-library-routines.html#Integer-library-routines
根据上面的链接,long __divdi3 (long a, long b)
用于长的划分。但是,这里http://gcc.gnu.org/onlinedocs/gcc-3.3/gccint/Library-Calls.html divdi 解释为“要求分割一个有符号双字”。当第一个源具有 di 后缀 -> 长参数的清晰映射时,第二个状态 divdi 表示双字, udivdi 表示全字(单个,对吗?)
当我编译简单的例子
int main(int argc, char *argv[]) {
long long t1, t2, tr;
t1 = 1;
t2 = 1;
tr = t1 / t2;
return tr;
}
with gcc -Wall -O0 -m32 -march=i386
(gcc ver. 4.7.2) dissamble 告诉我
080483cc <main>:
80483cc: 55 push %ebp
80483cd: 89 e5 mov %esp,%ebp
80483cf: 83 e4 f0 and $0xfffffff0,%esp
80483d2: 83 ec 30 sub $0x30,%esp
80483d5: c7 44 24 28 01 00 00 movl $0x1,0x28(%esp)
80483dc: 00
80483dd: c7 44 24 2c 00 00 00 movl $0x0,0x2c(%esp)
80483e4: 00
80483e5: c7 44 24 20 01 00 00 movl $0x1,0x20(%esp)
80483ec: 00
80483ed: c7 44 24 24 00 00 00 movl $0x0,0x24(%esp)
80483f4: 00
80483f5: 8b 44 24 20 mov 0x20(%esp),%eax
80483f9: 8b 54 24 24 mov 0x24(%esp),%edx
80483fd: 89 44 24 08 mov %eax,0x8(%esp)
8048401: 89 54 24 0c mov %edx,0xc(%esp)
8048405: 8b 44 24 28 mov 0x28(%esp),%eax
8048409: 8b 54 24 2c mov 0x2c(%esp),%edx
804840d: 89 04 24 mov %eax,(%esp)
8048410: 89 54 24 04 mov %edx,0x4(%esp)
8048414: e8 17 00 00 00 call 8048430 <__divdi3>
8048419: 89 44 24 18 mov %eax,0x18(%esp)
804841d: 89 54 24 1c mov %edx,0x1c(%esp)
8048421: 8b 44 24 18 mov 0x18(%esp),%eax
8048425: c9 leave
8048426: c3 ret
注意8048414: call 8048430 <__divdi3>
。
我的项目不能使用 gcc lib,它是多平台的。我希望不要__*
为所有平台编写所有函数(速度无关紧要),但现在我有点困惑。
有人可以解释一下,为什么__divdi3
(不)为(64 位)除法__divti3
生成调用?long long int