[fpc-pascal] Converting 32bit intel asm to Pascal or 64bit at&t asm

Andrew Haines AndrewD207 at aol.com
Fri Mar 11 00:17:25 CET 2011


On 03/09/11 14:18, Thomas Schatzl wrote:
> On Wed, 09 Mar 2011 13:23:55 -0500, Andrew Haines wrote:
>> On 03/09/11 12:26, Thomas Schatzl wrote:
>>>
>>> FYL2X calculates the log to the base 2 of tmp, not log to the base e of
>>> tmp? Just a guess.
>>>
>>
>> I originally used log2(Tmp) but switched to ln to check if it was
>> correct. Thanks for noticing that, I changed it back to log2.
>>
>
> 
> Suffixes for gas for floating point are (from
> http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax)
> 
> -s 32 bit/single
> -l 64 bit/double
> -t 80 bit/extended

Thank you this is useful!

> 
> I will write a bug report.


Thank you for writing that bug report.

I finally got the plain pascal version to work properly! My major
problem was I accidentally used the sqr function instead of sqrt. Here's
the final product:


  var
    LogBase  : Double;
    i: Integer;
    Tmp: Double;
  begin
    SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide,
exOverflow, exUnderflow, exPrecision]);

    LogBase:=1.0/(ln(10)/ln(2));

    for i := DataSize-1 downto 0 do
    begin
      Tmp := sqrt(sqr(InData[i].Im) + sqr(InData[i].Re));
      if Tmp > 0.0 then
        Tmp := (ln(Tmp)/ln(2))*LogBase+Shift
      else
        Tmp := 0.0;

      OutData[i] := Tmp;
    end;
  end;

In case anyone is interested, this generates 45 lines of assembly. The
handwritten asm code is 40 lines. (not including the procedure pre and
post asm for either method) I cheated a little and copied the log2 code
directly to avoid the function calls, this resulted in the compiler
doing the math ahead of time.

Regards,

Andrew Haines



More information about the fpc-pascal mailing list