[fpc-pascal] ++ and -- ( and +=, -=, ...)
Sven Barth
pascaldragon at googlemail.com
Wed Jul 31 11:33:04 CEST 2013
Am 31.07.2013 04:46, schrieb Gerhard Scholz:
> I tried it now with locals and globals, but with the same results.
Yes, currently there is only a difference if the left side is a call
(e.g. a function that returns a record or something like that).
>> From my common sense thinking, i would have expected something like:
>
> a[incg ( i )] += 3 ;
>
> translates to
>
> P := @ a[incg ( i )] ;
> P^ := P^ + 3 ;
>
Technically it would be simple to change that as the corresponding code
is already available for the above mentioned situation, but it would
definitely change the semantics if the left side is e.g. an array with a
function as index accessor (as the function is then only called once)...
The code generated on i386 for this example:
=== code begin ===
i := 0;
arr[i] := arr[i] + 1;
arr[i] += 1;
arr[MyInc(i)] += 1;
=== code end ===
will look like this without optimizations:
=== code begin ===
# Temps allocated between ebp-28 and ebp-24
# [15] begin
pushl %ebp
movl %esp,%ebp
leal -28(%esp),%esp
# Var arr located at ebp-20
# Var i located at ebp-24
# [16] i := 0;
movl $0,-24(%ebp)
# [17] arr[i] := arr[i] + 1;
movl -24(%ebp),%eax
movl -20(%ebp,%eax,4),%edx
addl $1,%edx
movl -24(%ebp),%eax
movl %edx,-20(%ebp,%eax,4)
# [18] arr[i] += 1;
movl -24(%ebp),%eax
leal -20(%ebp,%eax,4),%eax
movl %eax,-28(%ebp)
movl -28(%ebp),%eax
movl (%eax),%edx
addl $1,%edx
movl -28(%ebp),%eax
movl %edx,(%eax)
# [19] arr[MyInc(i)] += 1;
leal -24(%ebp),%eax
call P$OPTEST_$$_MYINC$LONGINT$$LONGINT
leal -20(%ebp,%eax,4),%eax
movl %eax,-28(%ebp)
movl -28(%ebp),%eax
movl (%eax),%eax
addl $1,%eax
movl -28(%ebp),%edx
movl %eax,(%edx)
=== code end ===
and like this with O2:
=== code begin ===
# Temps allocated between esp+24 and esp+28
# [15] begin
addl $-28,%esp
# Var arr located at esp+0
# Var i located at esp+20
# [16] i := 0;
movl $0,%edx
movl %edx,20(%esp)
# [17] arr[i] := arr[i] + 1;
addl $1,(%esp,%edx,4)
# [18] arr[i] += 1;
movl 20(%esp),%eax
leal (%esp,%eax,4),%eax
movl %eax,24(%esp)
movl (%eax),%edx
addl $1,%edx
movl 24(%esp),%eax
movl %edx,(%eax)
# [19] arr[MyInc(i)] += 1;
leal 20(%esp),%eax
call P$OPTEST_$$_MYINC$LONGINT$$LONGINT
leal (%esp,%eax,4),%eax
movl %eax,24(%esp)
movl (%eax),%eax
addl $1,%eax
movl 24(%esp),%edx
movl %eax,(%edx)
=== code end ===
What bugs me a bit is that temporary variable at 24(%esp), but that
might be a result of FPC's current temp var system...
Regards,
Sven
More information about the fpc-pascal
mailing list