While discussing if is worth using const parameters for string and
double types in a Lazarus bug report (
http://bugs.freepascal.org/view.php?id=12642 ), it was noticed that does
not make difference using constant parameters or not for double types.
So is this the expected behavior or a bug in fpc?
Bellow is the generated code (fpc222) and the test program.
Luiz
.section .text.n_p$asmconstparameter_byvalue$double
.balign 16,0x90
.globl P$ASMCONSTPARAMETER_BYVALUE$DOUBLE
P$ASMCONSTPARAMETER_BYVALUE$DOUBLE:
# Temps allocated between ebp-8 and ebp-8
# [17] begin
pushl %ebp
movl %esp,%ebp
subl $8,%esp
# Var V located at ebp+8
# Var i located at ebp-8
# [18] i := V;
movl 8(%ebp),%eax
movl %eax,-8(%ebp)
movl 12(%ebp),%eax
movl %eax,-4(%ebp)
# [19] DoIt(i);
subl $8,%esp
movl -8(%ebp),%eax
movl %eax,(%esp)
movl -4(%ebp),%eax
movl %eax,4(%esp)
call P$ASMCONSTPARAMETER_DOIT$DOUBLE
# [20] end;
leave
ret $8
.section .text.n_p$asmconstparameter_byreference$double
.balign 16,0x90
.globl P$ASMCONSTPARAMETER_BYREFERENCE$DOUBLE
P$ASMCONSTPARAMETER_BYREFERENCE$DOUBLE:
# Temps allocated between ebp-8 and ebp-8
# [25] begin
pushl %ebp
movl %esp,%ebp
subl $8,%esp
# Var V located at ebp+8
# Var i located at ebp-8
# [26] i := V;
movl 8(%ebp),%eax
movl %eax,-8(%ebp)
movl 12(%ebp),%eax
movl %eax,-4(%ebp)
# [27] DoIt(i);
subl $8,%esp
movl -8(%ebp),%eax
movl %eax,(%esp)
movl -4(%ebp),%eax
movl %eax,4(%esp)
call P$ASMCONSTPARAMETER_DOIT$DOUBLE
# [28] end;
leave
ret $8
program asmConstParameter;
{$Mode ObjFpc}
{$H+}
uses
SysUtils, Types;
procedure DoIt(V: Double);
begin
Write(V);
end;
procedure ByValue(V: Double);
var
i: Double;
begin
i := V;
DoIt(i);
end;
procedure ByReference(const V: Double);
var
i: Double;
begin
i := V;
DoIt(i);
end;
var
x: Double;
begin
x := 1.1;
ByValue(X);
ByReference(X);
end.
_______________________________________________
fpc-devel maillist - [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel