https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=264590

Stefan Eßer <[email protected]> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |[email protected]
             Status|New                         |Open

--- Comment #2 from Stefan Eßer <[email protected]> ---
(In reply to Li-Wen Hsu from comment #1)

Just checked with clang-14 and gcc11 on -CURRENT/amd64: the result is identical
to the one reported (0.31...).

Disassembly of sd() with objdump:

00000000002018e0 <sd>:
  2018e0:       55                      push   %rbp
  2018e1:       48 89 e5                mov    %rsp,%rbp
  2018e4:       d9 eb                   fldpi  
  2018e6:       d9 e8                   fld1   
  2018e8:       de f1                   fdivp  %st,%st(1)
  2018ea:       db 7d f0                fstpt  -0x10(%rbp)
  2018ed:       db 6d f0                fldt   -0x10(%rbp)
  2018f0:       5d                      pop    %rbp
  2018f1:       c3                      ret

Intel Architecture Software Developer’s Manual - Volume 2: Instruction Set
Reference:

> Opcode   Instruction         Description
> D8 /6    FDIV m32real        Divide ST(0) by m32real and store result in ST(0)
> DC /6    FDIV m64real        Divide ST(0) by m64real and store result in ST(0)
> D8 F0+i  FDIV ST(0),ST(i)    Divide ST(0) by ST(i) and store result in ST(0)  
>   
> DC F8+i  FDIV ST(i),ST(0)    Divide ST(i) by ST(0) and store result in ST(i)
> DE F8+i  FDIVP ST(i),ST(0)   Divide ST(i) by ST(0), store result in ST(i), 
> and pop the register stack

The byte sequence "de f1" does not exist in the reference manual, but if it is
decoded by the processor, then the disassembled instruction "fdivp  %st,%st(1)"
might behave in this (undocumented) way:

> DE F0+i  FDIVP ST(0),ST(i)   Divide ST(0) by ST(i), store result in ST(i), 
> and pop the register stack

And that would explain the result obtained.

Maybe the assembler instruction "fdivp \n\t" is interpreted as if it was "fdivp
%st,st(1) \n\t", i.e. with operands reversed from what you'd expect?

-- 
You are receiving this mail because:
You are the assignee for the bug.

Reply via email to