X86: (Re)Implemented SHRD.
authorGabe Black <gblack@eecs.umich.edu>
Fri, 7 Aug 2009 17:13:33 +0000 (10:13 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Fri, 7 Aug 2009 17:13:33 +0000 (10:13 -0700)
src/arch/x86/isa/decoder/two_byte_opcodes.isa
src/arch/x86/isa/insts/general_purpose/rotate_and_shift/shift.py

index c47fb5184fb89e38adb191d49b6918ec40969e53..dbde17964d03aa1e21acd795a78bd95f8355ba0b 100644 (file)
                 0x2: rsm_smm();
                 0x3: Inst::BTS(Ev,Gv);
                 0x4: Inst::SHRD(Ev,Gv,Ib);
-                0x5: shrd_Ev_Gv_rCl();
+                0x5: Inst::SHRD(Ev,Gv);
                 //0x6: group16();
                 0x6: decode MODRM_REG {
                     0x0: fxsave();
index d2a579ecb3270d65bdd04794916b78e2edb59644..092fb4213a27d73a075eb6e043ad47a3b0af523f 100644 (file)
@@ -220,38 +220,49 @@ def macroop SHR_P_R
     st t1, seg, riprel, disp
 };
 
-# SHRD will not set OF correctly when the shift count is 1.
+def macroop SHRD_R_R
+{
+    mdbi regm, 0
+    srd reg, reg, rcx, flags=(CF,OF,SF,ZF,PF)
+};
+
+def macroop SHRD_M_R
+{
+    ldst t1, seg, sib, disp
+    mdbi reg, 0
+    srd t1, t1, rcx, flags=(CF,OF,SF,ZF,PF)
+    st t1, seg, sib, disp
+};
+
+def macroop SHRD_P_R
+{
+    rdip t7
+    ldst t1, seg, riprel, disp
+    mdbi reg, 0
+    srd t1, t1, rcx, flags=(CF,OF,SF,ZF,PF)
+    st t1, seg, riprel, disp
+};
+
 def macroop SHRD_R_R_I
 {
-    srli t1, reg, imm, flags=(CF,)
-    rori t2, regm, imm
-    srli t3, regm, imm
-    xor t2, t2, t3
-    or reg, t1, t2
+    mdbi regm, 0
+    srdi reg, reg, imm, flags=(CF,OF,SF,ZF,PF)
 };
 
-# SHRD will not set OF correctly when the shift count is 1.
 def macroop SHRD_M_R_I
 {
     ldst t1, seg, sib, disp
-    srli t1, t1, imm, flags=(CF,)
-    rori t2, reg, imm
-    srli t3, reg, imm
-    xor t2, t2, t3
-    or t1, t1, t2
+    mdbi reg, 0
+    srdi t1, t1, imm, flags=(CF,OF,SF,ZF,PF)
     st t1, seg, sib, disp
 };
 
-# SHRD will not set OF correctly when the shift count is 1.
 def macroop SHRD_P_R_I
 {
     rdip t7
     ldst t1, seg, riprel, disp
-    srli t1, t1, imm, flags=(CF,)
-    rori t2, reg, imm
-    srli t3, reg, imm
-    xor t2, t2, t3
-    or t1, t1, t2
+    mdbi reg, 0
+    srdi t1, t1, imm, flags=(CF,OF,SF,ZF,PF)
     st t1, seg, riprel, disp
 };