x86: implements x87 add/sub instructions
authorNilay Vaish <nilay@cs.wisc.edu>
Tue, 28 Jan 2014 00:50:53 +0000 (18:50 -0600)
committerNilay Vaish <nilay@cs.wisc.edu>
Tue, 28 Jan 2014 00:50:53 +0000 (18:50 -0600)
src/arch/x86/isa/decoder/x87.isa
src/arch/x86/isa/insts/x87/arithmetic/addition.py
src/arch/x86/isa/insts/x87/arithmetic/subtraction.py

index 61f125e7c701ac19cb1ad47f461e0768ba88c3c7..b325728ba23fdb4ed11527d06681ff4809e9dc94 100644 (file)
 
 format WarnUnimpl {
     0x1B: decode OPCODE_OP_BOTTOM3 {
-        //0x0: esc0();
         0x0: decode MODRM_REG {
-            // ST(0) = ST(0) + 32-bit Mem
-            0x0: fadd();
+            0x0: decode MODRM_MOD {
+                0x3: Inst::FADD1(Eq);
+                // 32-bit memory operand
+                default: Inst::FADD1(Md);
+            }
             0x1: fmul();
             0x2: fcom();
             0x3: fcomp();
-            0x4: fsub();
+            0x4: decode MODRM_MOD {
+                0x3: Inst::FSUB1(Eq);
+                default: Inst::FSUB1(Md);
+            }
             0x5: fsubr();
             0x6: fdiv();
             0x7: fdivr();
         }
-        //0x1: esc1();
         0x1: decode MODRM_REG {
             0x0: decode MODRM_MOD {
                 0x3: Inst::FLD(Eq);
@@ -202,7 +206,10 @@ format WarnUnimpl {
         }
         //0x4: esc4();
         0x4: decode MODRM_REG {
-            0x0: fadd();
+            0x0: decode MODRM_MOD {
+                0x3: Inst::FADD2(Eq);
+                default: Inst::FADD2(Mq);
+            }
             0x1: fmul();
             0x2: decode MODRM_MOD {
                 0x3: Inst::UD2();
@@ -214,10 +221,10 @@ format WarnUnimpl {
             }
             0x4: decode MODRM_MOD {
                 0x3: fsubr();
-                default: fsub();
+                default: Inst::FSUB2(Mq);
             }
             0x5: decode MODRM_MOD {
-                0x3: fsub();
+                0x3: Inst::FSUB2(Eq);
                 default: fsubr();
             }
             0x6: decode MODRM_MOD {
@@ -268,7 +275,10 @@ format WarnUnimpl {
         //0x6: esc6();
         0x6: decode MODRM_REG {
             0x0: decode MODRM_MOD {
-                0x3: faddp();
+                0x3: decode MODRM_RM {
+                    0x1: Inst::FADDP();
+                    default: Inst::FADDP(Eq);
+                }
                 default: fiadd();
             }
             0x1: decode MODRM_MOD {
@@ -291,7 +301,10 @@ format WarnUnimpl {
                 default: fisub();
             }
             0x5: decode MODRM_MOD {
-                0x3: fsubp();
+                0x3: decode MODRM_RM {
+                    0x1: Inst::FSUBP();
+                    default: Inst::FSUBP(Eq);
+                }
                 default: fisubr();
             }
             0x6: decode MODRM_MOD {
index 62d1b0fcdf9b29b427936964e7b1ae2683e8461b..a7e427c629a60ebba2279c8c85e6209e03adbc7d 100644 (file)
 # Authors: Gabe Black
 
 microcode = '''
-# FADD
-# FADDP
+def macroop FADD1_R
+{
+    addfp st(0), sti, st(0)
+};
+
+
+def macroop FADD1_M
+{
+    ldfp ufp1, seg, sib, disp
+    addfp st(0), st(0), ufp1
+};
+
+def macroop FADD1_P
+{
+    rdip t7
+    ldfp ufp1, seg, riprel, disp
+    addfp st(0), st(0), ufp1
+};
+
+def macroop FADD2_R
+{
+    addfp sti, sti, st(0)
+};
+
+def macroop FADD2_M
+{
+    ldfp ufp1, seg, sib, disp
+    addfp st(0), st(0), ufp1
+};
+
+def macroop FADD2_P
+{
+    rdip t7
+    ldfp ufp1, seg, riprel, disp
+    addfp st(0), st(0), ufp1
+};
+
+def macroop FADDP
+{
+    addfp st(1), st(0), st(1), spm=1
+};
+
+def macroop FADDP_R
+{
+    addfp sti, sti, st(0), spm=1
+};
+
+def macroop FADDP_M
+{
+    fault "new UnimpInstFault"
+};
+
+def macroop FADDP_P
+{
+   fault "new UnimpInstFault"
+};
+
 # FIADD
 '''
index e6098ff1ff909285bc0a460b1ad795b1846eff04..77db1e47060ba9c6d4eddeae1ade199bc69a5690 100644 (file)
 # Authors: Gabe Black
 
 microcode = '''
-# FSUB
-# FSUBP
+def macroop FSUB1_R
+{
+    subfp st(0), st(0), sti
+};
+
+
+def macroop FSUB1_M
+{
+    ldfp ufp1, seg, sib, disp
+    subfp st(0), st(0), ufp1
+};
+
+def macroop FSUB1_P
+{
+    rdip t7
+    ldfp ufp1, seg, riprel, disp
+    subfp st(0), st(0), ufp1
+};
+
+def macroop FSUB2_R
+{
+    subfp sti, sti, st(0)
+};
+
+def macroop FSUB2_M
+{
+    ldfp ufp1, seg, sib, disp
+    subfp st(0), st(0), ufp1
+};
+
+def macroop FSUB2_P
+{
+    rdip t7
+    ldfp ufp1, seg, riprel, disp
+    subfp st(0), st(0), ufp1
+};
+
+def macroop FSUBP
+{
+    subfp st(1), st(1), st(0), spm=1
+};
+
+def macroop FSUBP_R
+{
+    subfp sti, sti, st(0), spm=1
+};
+
+def macroop FSUBP_M
+{
+    fault "new UnimpInstFault"
+};
+
+def macroop FSUBP_P
+{
+   fault "new UnimpInstFault"
+};
+
 # FISUB
 # FSUBR
 # FSUBRP