summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2007-09-04 23:23:13 -0700
committerGabe Black <gblack@eecs.umich.edu>2007-09-04 23:23:13 -0700
commitaaee21afdb39ed1fe02546acfca780881e07d813 (patch)
treeab6e0f04af881c23cbcc0e7e552a83f786fcc1cb /src/arch
parentb0b4038ee985bcd1d677f464d71812fb9827c9ce (diff)
downloadgem5-aaee21afdb39ed1fe02546acfca780881e07d813.tar.xz
X86: Implement idiv and propogate the mul corner case fix.
--HG-- extra : convert_revision : 348aa081067728afa14dc5b609fc7e26dbc5fad5
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86/isa/decoder/one_byte_opcodes.isa46
-rw-r--r--src/arch/x86/isa/insts/arithmetic/multiply_and_divide.py32
2 files changed, 54 insertions, 24 deletions
diff --git a/src/arch/x86/isa/decoder/one_byte_opcodes.isa b/src/arch/x86/isa/decoder/one_byte_opcodes.isa
index d8db47063..ecb92947f 100644
--- a/src/arch/x86/isa/decoder/one_byte_opcodes.isa
+++ b/src/arch/x86/isa/decoder/one_byte_opcodes.isa
@@ -504,28 +504,30 @@
{{"Tried to execute the rep/repe prefix!"}});
0x4: hlt();
0x5: cmc();
- //0x6: group3_Eb();
- 0x6: decode MODRM_REG {
- 0x0: Inst::TEST(Eb,Iz);
- 0x1: Inst::TEST(Eb,Iz);
- 0x2: Inst::NOT(Eb);
- 0x3: Inst::NEG(Eb);
- 0x4: Inst::MUL_B(Eb);
- 0x5: Inst::IMUL_B(Eb);
- //This should be Eb, but it access the entire word value ax.
- 0x6: Inst::DIV_B(Ew);
- 0x7: idiv_Eb();
- }
- //0x7: group3_Ev();
- 0x7: decode MODRM_REG {
- 0x0: Inst::TEST(Ev,Iz);
- 0x1: Inst::TEST(Ev,Iz);
- 0x2: Inst::NOT(Ev);
- 0x3: Inst::NEG(Ev);
- 0x4: Inst::MUL(Ev);
- 0x5: Inst::IMUL(Ev);
- 0x6: Inst::DIV(Ev);
- 0x7: idiv_Ev();
+ format Inst {
+ //0x6: group3_Eb();
+ 0x6: decode MODRM_REG {
+ 0x0: TEST(Eb,Iz);
+ 0x1: TEST(Eb,Iz);
+ 0x2: NOT(Eb);
+ 0x3: NEG(Eb);
+ 0x4: MUL_B(Eb);
+ 0x5: IMUL_B(Eb);
+ //This should be Eb, but it access the entire word value ax.
+ 0x6: DIV_B(Ew);
+ 0x7: IDIV(Eb);
+ }
+ //0x7: group3_Ev();
+ 0x7: decode MODRM_REG {
+ 0x0: TEST(Ev,Iz);
+ 0x1: TEST(Ev,Iz);
+ 0x2: NOT(Ev);
+ 0x3: NEG(Ev);
+ 0x4: MUL(Ev);
+ 0x5: IMUL(Ev);
+ 0x6: DIV(Ev);
+ 0x7: IDIV(Ev);
+ }
}
}
0x1F: decode OPCODE_OP_BOTTOM3 {
diff --git a/src/arch/x86/isa/insts/arithmetic/multiply_and_divide.py b/src/arch/x86/isa/insts/arithmetic/multiply_and_divide.py
index c28b2567c..f498a10e0 100644
--- a/src/arch/x86/isa/insts/arithmetic/multiply_and_divide.py
+++ b/src/arch/x86/isa/insts/arithmetic/multiply_and_divide.py
@@ -134,8 +134,9 @@ def macroop IMUL_B_P
def macroop IMUL_R
{
- muleh rdx, rax, reg
+ muleh t1, rax, reg
mulel rax, rax, reg
+ mov rdx, rdx, t1
};
def macroop IMUL_M
@@ -229,8 +230,9 @@ def macroop DIV_B_P
def macroop DIV_R
{
- divr rdx, rax, reg
+ divr t1, rax, reg
divq rax, rax, reg
+ mov rdx, rdx, t1
};
def macroop DIV_M
@@ -247,6 +249,32 @@ def macroop DIV_P
divr rdx, rax, t1
divq rax, rax, t1
};
+
+#
+# Signed division
+#
+
+def macroop IDIV_R
+{
+ divr t1, rax, reg
+ divq rax, rax, reg
+ mov rdx, rdx, t1
+};
+
+def macroop IDIV_M
+{
+ ld t1, seg, sib, disp
+ divr rdx, rax, t1
+ divq rax, rax, t1
+};
+
+def macroop IDIV_P
+{
+ rdip t7
+ ld t1, seg, riprel, disp
+ divr rdx, rax, t1
+ divq rax, rax, t1
+};
'''
#let {{
# class IDIV(Inst):