x86: implement some of the x87 instructions
authorNilay Vaish <nilay@cs.wisc.edu>
Mon, 11 Mar 2013 18:15:46 +0000 (13:15 -0500)
committerNilay Vaish <nilay@cs.wisc.edu>
Mon, 11 Mar 2013 18:15:46 +0000 (13:15 -0500)
This patch implements ftan, fprem, fyl2x, fld* floating-point instructions.

src/arch/x86/isa/decoder/x87.isa
src/arch/x86/isa/insts/x87/arithmetic/partial_remainder.py
src/arch/x86/isa/insts/x87/control/save_and_restore_x87_control_word.py
src/arch/x86/isa/insts/x87/data_transfer_and_conversion/load_or_store_floating_point.py
src/arch/x86/isa/insts/x87/load_constants/load_0_1_or_pi.py
src/arch/x86/isa/insts/x87/load_constants/load_logarithm.py
src/arch/x86/isa/insts/x87/transcendental_functions/logarithmic_functions.py
src/arch/x86/isa/insts/x87/transcendental_functions/trigonometric_functions.py
src/arch/x86/isa/microops/fpop.isa
src/arch/x86/isa/operands.isa

index 704a6f6dd5990d939adbdbade98012023313ed8d..c29e8a334a612aad6a1d439229e70fc573eaba4c 100644 (file)
@@ -1,4 +1,5 @@
 // Copyright (c) 2007 The Hewlett-Packard Development Company
+// Copyright (c) 2012-13 Mark D. Hill and David A. Wood
 // All rights reserved.
 //
 // The license below extends only to copyright in the software and shall
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 //
 // Authors: Gabe Black
+//          Nilay Vaish
 
 format WarnUnimpl {
     0x1B: decode OPCODE_OP_BOTTOM3 {
         //0x0: esc0();
         0x0: decode MODRM_REG {
+            // ST(0) = ST(0) + 32-bit Mem
             0x0: fadd();
             0x1: fmul();
             0x2: fcom();
@@ -50,7 +53,11 @@ format WarnUnimpl {
         }
         //0x1: esc1();
         0x1: decode MODRM_REG {
-            0x0: fld();
+            0x0: decode MODRM_MOD {
+                0x3: Inst::FLD(Eq);
+                // 32-bit load
+                default: Inst::FLD(Md);
+            }
             0x1: decode MODRM_MOD {
                 0x3: fxch();
                 default: Inst::UD2();
@@ -78,24 +85,24 @@ format WarnUnimpl {
             }
             0x5: decode MODRM_MOD {
                 0x3: decode MODRM_RM {
-                    0x0: fld1();
-                    0x1: fldl2t();
-                    0x2: fldl2e();
-                    0x3: fldpi();
-                    0x4: fldlg2();
-                    0x5: fldln2();
-                    0x6: fldz();
+                    0x0: Inst::FLD1();
+                    0x1: Inst::FLDL2T();
+                    0x2: Inst::FLDL2E();
+                    0x3: Inst::FLDPI();
+                    0x4: Inst::FLDLG2();
+                    0x5: Inst::FLDLN2();
+                    0x6: Inst::FLDZ();
                 }
-                default: fldcw_Mw();
+                default: Inst::FLDCW(Mw);
             }
             0x6: decode MODRM_MOD {
                 0x3: decode MODRM_RM {
                     0x0: f2xm1();
-                    0x1: fyl2x();
-                    0x2: fptan();
+                    0x1: Inst::FYL2X();
+                    0x2: Inst::FPTAN();
                     0x3: fpatan();
                     0x4: fxtract();
-                    0x5: fprem1();
+                    0x5: Inst::FPREM1();
                     0x6: fdecstp();
                     0x7: fincstp();
                 }
@@ -103,7 +110,7 @@ format WarnUnimpl {
             }
             0x7: decode MODRM_MOD {
                 0x3: decode MODRM_RM {
-                    0x0: fprem();
+                    0x0: Inst::FPREM();
                     0x1: fyl2xp1();
                     0x2: fsqrt();
                     0x3: Inst::FSINCOS();
@@ -181,6 +188,7 @@ format WarnUnimpl {
             }
             0x5: decode MODRM_MOD {
                 0x3: fucomi();
+                // 80-bit load
                 default: fld();
             }
             0x6: decode MODRM_MOD {
@@ -225,6 +233,7 @@ format WarnUnimpl {
         0x5: decode MODRM_REG {
             0x0: decode MODRM_MOD {
                 0x3: ffree();
+                // 64-bit load
                 default: Inst::FLD(Mq);
             }
             0x1: decode MODRM_MOD {
index 5a4959973f1f8d49900dc1c9cbd3e17682145e3b..b02184e1a1291c1d933cd27b6146beadd8fa8f19 100644 (file)
 # Authors: Gabe Black
 
 microcode = '''
-# FPREM
-# FPREM1
+def macroop FPREM {
+    premfp st(0), st(1), st(0)
+};
+
+def macroop FPREM1 {
+    premfp st(0), st(1), st(0)
+};
 '''
index 5657c8d47b6c8d91da0e19d4bdcfa288d97a5c7f..af465f014a600498fafa45342c564c72fe06fbcf 100644 (file)
 # Authors: Gabe Black
 
 microcode = '''
-# FLDCW
+
+def macroop FLDCW_M {
+    ld t1, seg, sib, disp, dataSize=2
+    wrval fcw, t1
+};
+
+def macroop FLDCW_P {
+    ld t1, seg, sib, disp, dataSize=2
+    wrval fcw, t1
+};
+
 # FSTCW
 
 def macroop FNSTCW_M {
index 679c2050e9c3c8525275dd04b3fe39831d5ad208..4e230513c0abd09422d2330d7e2e75924364e689 100644 (file)
@@ -47,6 +47,10 @@ def macroop FLD_P {
     movfp st(-1), ufp1, spm=-1
 };
 
+def macroop FLD_R {
+    movfp st(-1), sti, spm=-1
+};
+
 def macroop FST_R {
     movfp sti, st(0)
 };
index 2e63f2593cffeaf210f2efc8d25dd2433d569ee4..cb894731242b7b33d06d0b614729201ee008e186 100644 (file)
@@ -1,4 +1,5 @@
 # Copyright (c) 2007 The Hewlett-Packard Development Company
+# Copyright (c) 2013 Mark D. Hill and David A. Wood
 # All rights reserved.
 #
 # The license below extends only to copyright in the software and shall
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
 # Authors: Gabe Black
+#          Nilay Vaish
 
 microcode = '''
-# FLDZ
-# FLD1
-# FLDPI
+
+def macroop FLDZ {
+    limm ufp1, "double(0)"
+    movfp st(-1), ufp1, spm=-1
+};
+
+def macroop FLD1 {
+    limm ufp1, "double(1)"
+    movfp st(-1), ufp1, spm=-1
+};
+
+def macroop FLDPI {
+    limm ufp1, "double(3.14159265359)"
+    movfp st(-1), ufp1, spm=-1
+};
+
 '''
index 939ab754343830655d4a0f2f11b392c58d7ed734..7e71c4006c636fc9dacc98ea6adf366e32c781e3 100644 (file)
@@ -1,4 +1,5 @@
 # Copyright (c) 2007 The Hewlett-Packard Development Company
+# Copyright (c) 2013 Mark D. Hill and David A. Wood
 # All rights reserved.
 #
 # The license below extends only to copyright in the software and shall
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
 # Authors: Gabe Black
+#          Nilay Vaish
 
 microcode = '''
-# FLDL2E
-# FLDL2T
-# FLDLG2
-# FLDLN2
+
+def macroop FLDL2E {
+    limm ufp1, "double(1.44269504089)"
+    movfp st(-1), ufp1, spm=-1
+};
+
+def macroop FLDL2T {
+    limm ufp1, "double(3.32192809489)"
+    movfp st(-1), ufp1, spm=-1
+};
+
+def macroop FLDLG2 {
+    limm ufp1, "double(0.30102999566)"
+    movfp st(-1), ufp1, spm=-1
+};
+
+def macroop FLDLN2 {
+    limm ufp1, "double(0.69314718056)"
+    movfp st(-1), ufp1, spm=-1
+};
+
 '''
index 5be460232a37cae8a57c188f18f994456f511539..1078c491f4c7a0e659313e97a60e194f48e2bba9 100644 (file)
 microcode = '''
 # F2XM1
 # FSCALE
-# FYL2X
+
+def macroop FYL2X {
+    yl2xfp st(1), st(0), st(1), spm=1
+};
+
 # FYL2XP1
 '''
index ffdbcf15023ebe32daa252a5c6b568024761bbd0..cc2ae606b08b521a51844cc214f3721d2d18f690 100644 (file)
@@ -1,4 +1,5 @@
 # Copyright (c) 2007 The Hewlett-Packard Development Company
+# Copyright (c) 2012-13 Mark D. Hill and David A. Wood
 # All rights reserved.
 #
 # The license below extends only to copyright in the software and shall
@@ -34,6 +35,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
 # Authors: Gabe Black
+#          Nilay Vaish
 
 microcode = '''
 def macroop FSIN {
@@ -51,6 +53,11 @@ def macroop FSINCOS {
     movfp st(-1), ufp2, spm=-1
 };
 
-# FPTAN
+def macroop FPTAN {
+    tanfp st(0), st(0)
+    limm ufp1, "double(1)"
+    movfp st(-1), ufp1, spm=-1
+};
+
 # FPATAN
 '''
index b9aceea0972a05f0c022dba90a00a930d1c00c60..d5a39817a8ed86bbaa32eeb2db528f0868d458ae 100644 (file)
@@ -1,4 +1,5 @@
 // Copyright (c) 2007 The Hewlett-Packard Development Company
+// Copyright (c) 2012-2013 Mark D. Hill and David A. Wood
 // All rights reserved.
 //
 // The license below extends only to copyright in the software and shall
@@ -34,6 +35,7 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 //
 // Authors: Gabe Black
+//          Nilay Vaish
 
 //////////////////////////////////////////////////////////////////////////
 //
@@ -258,6 +260,9 @@ let {{
     class Sinfp(FpUnaryOp):
         code = 'FpDestReg = sin(FpSrcReg1);'
 
+    class Tanfp(FpUnaryOp):
+        code = 'FpDestReg = tan(FpSrcReg1);'
+
 
     # Conversion microops
     class ConvOp(FpBinaryOp):
@@ -305,6 +310,17 @@ let {{
     class subfp(FpBinaryOp):
         code = 'FpDestReg = FpSrcReg1 - FpSrcReg2;'
 
+    class Yl2xFp(FpBinaryOp):
+        code = '''
+            FpDestReg = FpSrcReg2 * (log(FpSrcReg1) / log(2));
+        '''
+
+    class PremFp(FpBinaryOp):
+        code = '''
+            FpDestReg = fmod(FpSrcReg1, FpSrcReg2);
+            DPRINTF(X86, "src1: %lf, src2: %lf, dest: %lf\\n", FpSrcReg1, FpSrcReg2, FpDestReg);
+        '''
+
     class Compfp(FpBinaryOp):
         def __init__(self, src1, src2, spm=0, setStatus=False, \
                 dataSize="env.dataSize"):
index b3607417b67495d570fad1d9b4d94fe910fcd525..79b59dbc37eb9828fef27a9051d7b207aa9f5a96 100644 (file)
@@ -163,6 +163,7 @@ def operands {{
         'TOP':           controlReg('MISCREG_X87_TOP', 66, ctype='ub'),
         'FSW':           controlReg('MISCREG_FSW', 67, ctype='uw'),
         'FTW':           controlReg('MISCREG_FTW', 68, ctype='uw'),
+        'FCW':           controlReg('MISCREG_FCW', 69, ctype='uw'),
 
         # The segment base as used by memory instructions.
         'SegBase':       controlReg('MISCREG_SEG_EFF_BASE(segment)', 70),