[fpc-pascal] generated assembler

Vincent Snijders vsnijders at quicknet.nl
Thu Sep 21 13:21:32 CEST 2006


Hi,

I am looking at some shootout benchmarks and I have the following 
question. Look at the following program:

program loop;

{$mode objfpc}

var
   d: array[0..$FFF] of double;
   di: PDouble;
   i: integer;
   c: double;

begin
   c := 125;
   i := low(d);
   repeat
     d[i] := c*c;
     inc(i);
   until i>high(d);
   di := @d[low(d)];
   repeat
     di^ := c*c;
     inc(di);
   until  di>@d[high(d)]
end.

I am interested at the way the until clause is generated.

The compiler creates this assembler file:
# [15] d[i] := c*c;
	fldl	U_P$LOOP_C
	fmul	%st,%st
	fstpl	U_P$LOOP_D(,%edx,8)
	fwait
# [16] inc(i);
	incl	%edx
# [17] until i>high(d);
	cmpl	$4095,%edx
	jng	.L9
# [18] di := @d[low(d)];
	movl	$U_P$LOOP_D,%ecx
	.balign 4
.L16:
# [20] di^ := c*c;
	fldl	U_P$LOOP_C
	fmul	%st,%st
	fstpl	(%ecx)
	fwait
# [21] inc(di);
	addl	$8,%ecx
# [22] until  di>@d[high(d)]
	movl	$U_P$LOOP_D+32760,%eax
	cmpl	%ecx,%eax
	jnb	.L16


Line 17 generates two assembler instructions. Line 22 generates three 
assembler instructions. As far as I can see both high(d) and @d[high(d)] 
are constants, because d is a global variable.

Is it possible that line 22 will generate 2 assembler instructions in 
the future? Or is this a limitation of the i386 assembler? Or do I make 
a mistake in my reasoning?

Vincent



More information about the fpc-pascal mailing list