changeset 1302:a26b99b7e293

Translate fsub/fdiv correctly. See #256.
author Christian Kamm <kamm incasoftware de>
date Wed, 06 May 2009 18:08:44 +0200
parents 1e30cc395d2e
children c250e03d8a5b
files gen/asm-x86-32.h gen/asm-x86-64.h
diffstat 2 files changed, 46 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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 )
--- 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 )