Luiz Americo Pereira Camara wrote:
I'm evaluating the effect of passing function parameters by value or by reference.

Like stated in the documentation, passing as reference (const) or by value types with size equal to pointer size like Integer has no difference in the code output (they are passed by value).

Also as expected i noticed a difference in the generated assembler for types TRect (16bytes) or TPoint (8 bytes).

But for double (8 bytes) the generated assembler are equal for both types of parameters. Is this intentional? For double types, there's no difference in using const modifier?

I'm using a 32bit cpu.


I attached the source code of a small app and the asm output of the functions.

It seems that for double fpc pass by reference if the parameter is not assigned regardless of const modifier. Can someone confirm this?
.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-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to