On Wed, 09 Mar 2011 13:23:55 -0500, Andrew Haines wrote:
On 03/09/11 12:26, Thomas Schatzl wrote:
Hi,

On Wed, 09 Mar 2011 11:58:08 -0500, Andrew Haines wrote:
      if Tmp <> Im then
      begin
//Tmp := ln(Tmp)*LogBase+Shift; // same as the following asm
proc?
        asm
          FLD LogBase;
          FLD Tmp;
          FYL2X;

FYL2X calculates the log to the base 2 of tmp, not log to the base e of
tmp? Just a guess.

Thomas


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.

The current output with the pascal code looks like it did when FLDS was used instead of FLDL to load (%rdi). The intel code was "FLD QWORD[EDI]"
I changed this to "FLDQ (%edi)". on x32 it became FLDL and on x64 it
became FLDS. changing the line to "FLDL (%rdi)" on x86_64 fixed the last
problem I had with the asm translation.

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

With Intel syntax you can only hope that the compiler guesses correctly, or add an explicit override.

So you suggest that the assembler changes an inlined "fldq (%edi)" into "flds (%edi)" on x86-64? This looks like a bug if true - it should reject the "q" suffix for floating point operations. At least gas 2.19 on solaris x64 rejects "fldq"; actually the 2.4.2 release compiler transforms "fldq" into "fld" here, which gas rejects too :)

I will write a bug report.

Thomas

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to