[Lazarus] AGG missing 3 asm conversions to work on 64-bit CPU's

Adrian Veith adrian at veith-system.de
Fri Mar 9 15:10:39 CET 2012


I use this for cross plattform:

function  shr_int32(i ,shift : longint ) : longint; inline;
begin
   Result:= i div (1 shl shift);
end;


Am 09.03.2012 08:46, schrieb Graeme Geldenhuys:
> Hi,
>
> Can anybody with Assembly knowledge help convert 3 methods in AggPas
> (<lcl>/components/aggpas/src) so that it could work under x86_64
> systems?
>
> The three methods are shr_int6(), shr_int16() and shr_int32() defined
> inside the agg_basics.pas unit.
>
> For example, here is a one method that is often called, but because
> there is no 64-bit x86_64 implementation, the agg output is not
> correct (compared to the 32-bit version of my program).
>
>
> function shr_int32;
> begin
> {$IFDEF AGG_CPU_386 }
>   asm
>    mov eax ,dword ptr [i ]
>    mov ecx ,dword ptr [shift ]
>    sar eax ,cl
>    mov dword ptr [result ] ,eax
>   end;
> {$ENDIF }
>
> {$IFDEF AGG_CPU_PPC }
>   asm
>    lwz  r3,i
>    lwz  r2,shift
>    sraw r3,r3,r2
>    stw  r3,result
>   end;
> {$ENDIF }
>
> end;
>
>
> I know FPC has built-in 'shr' functionality, but it seems Agg needs a
> specific implementation to be compatible with the C compilers. As
> noted by the code comment in the agg_basic.pas unit.
>
>
> // SHR for signed integers is differently implemented in pascal compilers
> // than in c++ compilers. On the assembler level, c++ is using the SAR and
> // pascal is using SHR. That gives completely different result, when the
> // number is negative. We have to be compatible with c++ implementation,
> // thus instead of directly using SHR we emulate c++ solution.
>
>
>
> Any help would be very much appreciated, thanks.
>
>




More information about the Lazarus mailing list