Question: assembly result of a long long variable divided by a long variable

gccfans ling_core@yahoo.com
Tue Nov 21 06:59:00 GMT 2006


My question is about the assembly result of a long long variable divided by a
long variable.

Assume two global variable declarations:

long long a1 = 3;
long a2 = 4;

I guess a1/a2 could be assembled to something like (on ia32/linux) :

movl a1, %eax
movl a1+4, %edx
idivl a2

Is  this correct ?

However the result compiled by GCC 4.1.1 is much more complicated. As a
matter of fact,
the following C program:

long long a1 = 15;
long a2 = 5;
int f() { return a1/a2; }

is compiled to a long assembly program below (gcc -O1 -S tmp1.c) . Why ?

	.file	"tmp1.c"
.globl __divdi3
	.text
.globl f
	.type	f, @function
f:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp
	movl	a2, %eax
	movl	%eax, 8(%esp)
	cltd
	movl	%edx, 12(%esp)
	movl	a1, %eax
	movl	a1+4, %edx
	movl	%eax, (%esp)
	movl	%edx, 4(%esp)
	call	__divdi3
	leave
	ret
	.size	f, .-f
.globl a1
	.data
	.align 8
	.type	a1, @object
	.size	a1, 8
a1:
	.long	15
	.long	0
.globl a2
	.align 4
	.type	a2, @object
	.size	a2, 4
a2:
	.long	5
	.ident	"GCC: (GNU) 4.1.1"
	.section	.note.GNU-stack,"",@progbits





-- 
View this message in context: http://www.nabble.com/Question%3A-assembly-result-of-a-long-long-variable-divided-by-a-long-variable-tf2677244.html#a7466698
Sent from the gcc - Help mailing list archive at Nabble.com.



More information about the Gcc-help mailing list