visual-c++x86floating-pointlong-doubleextended-precision

Convert extended precision float (80-bit) to double (64-bit) in MSVC


What is the most portable and "right" way to do conversion from extended precision float (80-bit value, also known as long double in some compilers) to double (64-bit) in MSVC win32/win64?

MSVC currently (as of 2010) assumes that long double is double synonym.

I could probably write fld/fstp assembler pair in inline asm, but inline asm is not available for win64 code in MSVC. Do I need to move this assembler code to separate .asm file? Is that really so there are no good solution?


Solution

  • Just did this in x86 code...

        .686P
        .XMM
    
    _TEXT   SEGMENT
    
    EXTRN   __fltused:DWORD
    
    PUBLIC  _cvt80to64
    PUBLIC  _cvt64to80
    
    _cvt80to64 PROC
    
        mov eax, dword ptr [esp+4]
        fld TBYTE PTR [eax]
    
        ret 0
    _cvt80to64 ENDP
    
    
    _cvt64to80 PROC
        mov eax, DWORD PTR [esp+12]
        fld QWORD PTR [esp+4]
        fstp    TBYTE PTR [eax]
        ret 0
    _cvt64to80 ENDP
    
    ENDIF
    
    _TEXT   ENDS
        END