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.
-- _______________________________________________ Lazarus mailing list Lazarus@lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus