# HG changeset patch # User Christian Kamm # Date 1241626124 -7200 # Node ID a26b99b7e2931e8aa35d0c34ca02feb564f4a464 # Parent 1e30cc395d2ec0a11e8988afe12aa75655573d0e Translate fsub/fdiv correctly. See #256. diff -r 1e30cc395d2e -r a26b99b7e293 gen/asm-x86-32.h --- a/gen/asm-x86-32.h Tue May 05 11:51:00 2009 -0600 +++ b/gen/asm-x86-32.h Wed May 06 18:08:44 2009 +0200 @@ -1886,10 +1886,30 @@ } break; default: + // special case fdiv, fsub: see dmd 840, ldc 256 + if (strncmp(mnemonic, "fsub", 4) == 0 || + strncmp(mnemonic, "fdiv", 4) == 0) + { + // replace: + // f{sub,div}r{p,} <-> f{sub,div}{p,} + if (mnemonic[4] == 'r') + { + insnTemplate.write(mnemonic, 4); + insnTemplate.write(mnemonic+5, strlen(mnemonic)-5); + } + else + { + insnTemplate.write(mnemonic, 4) << "r"; + insnTemplate.write(mnemonic+4, strlen(mnemonic)-4); + } + } + else + { insnTemplate << mnemonic; - if ( type_char ) - insnTemplate << type_char; - break; + } + if ( type_char ) + insnTemplate << type_char; + break; } switch ( opInfo->implicitClobbers & Clb_DXAX_Mask ) diff -r 1e30cc395d2e -r a26b99b7e293 gen/asm-x86-64.h --- a/gen/asm-x86-64.h Tue May 05 11:51:00 2009 -0600 +++ b/gen/asm-x86-64.h Wed May 06 18:08:44 2009 +0200 @@ -2008,10 +2008,30 @@ } break; default: + // special case fdiv, fsub: see dmd 840, ldc 256 + if (strncmp(mnemonic, "fsub", 4) == 0 || + strncmp(mnemonic, "fdiv", 4) == 0) + { + // replace: + // f{sub,div}r{p,} <-> f{sub,div}{p,} + if (mnemonic[4] == 'r') + { + insnTemplate.write(mnemonic, 4); + insnTemplate.write(mnemonic+5, strlen(mnemonic)-5); + } + else + { + insnTemplate.write(mnemonic, 4) << "r"; + insnTemplate.write(mnemonic+4, strlen(mnemonic)-4); + } + } + else + { insnTemplate << mnemonic; - if ( type_char ) - insnTemplate << type_char; - break; + } + if ( type_char ) + insnTemplate << type_char; + break; } switch ( opInfo->implicitClobbers & Clb_DXAX_Mask )