<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">Hi,<br>
      <br>
      Στις 29/8/2012 10:05 πμ, ο/η Sven Barth έγραψε:<br>
    </div>
    <blockquote
cite="mid:CAFMUeB9YJAEAGcbONoJBzBe=vurEqzXYYxtR_fyEi6unBWVSDw@mail.gmail.com"
      type="cite">
      <p>Am 29.08.2012 01:23 schrieb "Hans-Peter Diettrich" <<a
          moz-do-not-send="true" href="mailto:DrDiettrich1@aol.com">DrDiettrich1@aol.com</a>>:<br>
      </p>
    </blockquote>
    <snip><br>
    <blockquote
cite="mid:CAFMUeB9YJAEAGcbONoJBzBe=vurEqzXYYxtR_fyEi6unBWVSDw@mail.gmail.com"
      type="cite">
      <p>
        > I wonder why Extended should not be supported in 64 bit
        mode. The FPU still exists, as it's required in 32 bit mode, and
        AFAIK it also is accessible in 64 bit code. Of course the FPU
        doesn't work together with the MMX/MMY registers, but for the
        few conversions required in a compiler this should not be a big
        problem?</p>
      <p>The FPU is used on every x86_64 platform except Win64, because
        Microsoft says that we (as in developers) should not use the FPU
        on Win64, because it is considered deprecated there. Technically
        it is definitely possible, but "if in Rome, do as the Romans
        do"...<br>
      </p>
    </blockquote>
    <br>
    Quoting from <a class="moz-txt-link-freetext" href="http://www.agner.org/optimize/calling_conventions.pdf">http://www.agner.org/optimize/calling_conventions.pdf</a> :<br>
    <br>
    "6.1 Can floating point registers be used in 64-bit Windows?<br>
    There has been widespread confusion about whether 64-bit Windows
    allows the use of the<br>
    floating point registers ST(0)-ST(7) and the MM0 - MM7 registers
    that are aliased upon<br>
    these. One early technical document found at Microsoft’s website
    says "x87/MMX registers<br>
    are unavailable to Native Windows64 applications" (Rich Brunner:
    Technical Details Of<br>
    Microsoft® Windows® For The AMD64 Platform, Dec. 2003). An AMD
    document says: "64-<br>
    bit Microsoft Windows does not strongly support MMX and 3Dnow!
    instruction sets in the<br>
    64-bit native mode" (Porting and Optimizing Multimedia Codecs for
    AMD64 architecture on<br>
    Microsoft® Windows®, July 21, 2004). A document in Microsoft’s MSDN
    says: "A caller<br>
    must also handle the following issues when calling a callee: [...]
    Legacy Floating-Point<br>
    Support: The MMX and floating-point stack registers
    (MM0-MM7/ST0-ST7) are volatile. That<br>
    is, these legacy floating-point stack registers do not have their
    state preserved across<br>
    context switches" (MSDN: Kernel-Mode Driver Architecture: Windows
    DDK: Other Calling<br>
    Convention Process Issues. Preliminary, June 14, 2004; February 18,
    2005). This<br>
    description is nonsense because it confuses saving registers across
    function calls and<br>
    saving registers across context switches. Some versions of the
    Microsoft assembler ml64<br>
    (e.g. v. 8.00.40310) gives the following message when attempts are
    made to use floating<br>
    point registers in 64 bit mode: "error A2222: x87 and MMX
    instructions disallowed; legacy<br>
    FP state not saved in Win64".<br>
    However, a public discussion forum quotes the following answers from
    Microsoft engineers<br>
    regarding this issue: "From: Program Manager in Visual C++ Group,
    Sent: Thursday, May<br>
    26, 2005 10:38 AM. It does preserve the state. It’s the DDK page
    that has stale information,<br>
    which I’ve requested it to be changed. Let them know that the OS
    does preserve state of<br>
    x87 and MMX registers on context switches." and "From: Software
    Engineer in Windows<br>
    Kernel Group, Sent: Thursday, May 26, 2005 11:06 AM. For user
    threads the state of legacy<br>
    floating point is preserved at context switch. But it is not true
    for kernel threads. Kernel<br>
    14<br>
    mode drivers can not use legacy floating point instructions."<br>
    (<a class="moz-txt-link-abbreviated" href="http://www.planetamd64.com/index.php?showtopic=3458&st=100">www.planetamd64.com/index.php?showtopic=3458&st=100</a>).<br>
    The issue has finally been resolved with the long overdue
    publication of a more detailed ABI<br>
    for x64 Windows in the form of a document entitled "x64 Software
    Conventions", well hidden<br>
    in the bin directory (not the help directory) of some compiler
    packages. This document says:<br>
    "The MMX and floating-point stack registers (MM0-MM7/ST0-ST7) are
    preserved across<br>
    context switches. There is no explicit calling convention for these
    registers. The use of<br>
    these registers is strictly prohibited in kernel mode code." The
    same text has later appeared<br>
    at the Microsoft website
    (msdn2.microsoft.com/en-us/library/a32tsf7t(VS.80).aspx).<br>
    My tests indicate that these registers are saved correctly during
    task switches and thread<br>
    switches in 64-bit mode, even in an early beta version of x64
    Windows.<br>
    The Microsoft C++ compiler version 14.0 never uses these registers
    in 64-bit mode, and<br>
    doesn’t support long double precision. The Intel C++ compiler for
    x64 Windows supports<br>
    long double precision and __m64 in version 9.0 and later, while
    earlier versions do not.<br>
    The conclusion is that it is safe to use floating point registers
    and MMX registers in 64-bit<br>
    Windows, except in kernel mode drivers."<br>
    <br>
    regards,<br>
    <br>
    -- <br>
    Dimitrios Chr. Ioannidis<br>
  </body>
</html>