summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2007-10-22 14:39:40 -0700
committerGabe Black <gblack@eecs.umich.edu>2007-10-22 14:39:40 -0700
commit7d396b1bf6f281c1bfae991e41d7e3c359d88854 (patch)
treede7b02e8980867af4ae433a89b660a9009a0c45b /src
parent421aea980f7cbc9495b9df36b6b4e76dc323d971 (diff)
downloadgem5-7d396b1bf6f281c1bfae991e41d7e3c359d88854.tar.xz
X86: Use the cda microop where appropriate. The ENTER instruction still needs these.
--HG-- extra : convert_revision : c5a1a6d66c454f252d3b798c38a6798e7dd486f0
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86/isa/insts/general_purpose/data_transfer/stack_operations.py23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/arch/x86/isa/insts/general_purpose/data_transfer/stack_operations.py b/src/arch/x86/isa/insts/general_purpose/data_transfer/stack_operations.py
index 5771242e6..5884d68c2 100644
--- a/src/arch/x86/isa/insts/general_purpose/data_transfer/stack_operations.py
+++ b/src/arch/x86/isa/insts/general_purpose/data_transfer/stack_operations.py
@@ -58,8 +58,9 @@ def macroop POP_R {
# Make the default data size of pops 64 bits in 64 bit mode
.adjust_env oszIn64Override
- ld reg, ss, [1, t0, rsp]
+ ld t1, ss, [1, t0, rsp]
addi rsp, rsp, dsz
+ mov reg, reg, t1
};
def macroop POP_M {
@@ -67,7 +68,7 @@ def macroop POP_M {
.adjust_env oszIn64Override
ld t1, ss, [1, t0, rsp]
- # Check stack address
+ cda seg, sib, disp
addi rsp, rsp, dsz
st t1, seg, sib, disp
};
@@ -78,7 +79,7 @@ def macroop POP_P {
rdip t7
ld t1, ss, [1, t0, rsp]
- # Check stack address
+ cda seg, sib, disp
addi rsp, rsp, dsz
st t1, seg, riprel, disp
};
@@ -87,8 +88,6 @@ def macroop PUSH_R {
# Make the default data size of pops 64 bits in 64 bit mode
.adjust_env oszIn64Override
- # This needs to work slightly differently from the other versions of push
- # because the -original- version of the stack pointer is what gets pushed
stupd reg, ss, [1, t0, rsp], "-env.dataSize"
};
@@ -118,7 +117,10 @@ def macroop PUSH_P {
};
def macroop PUSHA {
- # Check all the stack addresses.
+ # Check all the stack addresses. We'll assume that if the beginning and
+ # end are ok, then the stuff in the middle should be as well.
+ cda ss, [1, t0, rsp], "-env.dataSize"
+ cda ss, [1, t0, rsp], "-8 * env.dataSize"
stupd rax, ss, [1, t0, rsp], "-env.dataSize"
stupd rcx, ss, [1, t0, rsp], "-env.dataSize"
stupd rdx, ss, [1, t0, rsp], "-env.dataSize"
@@ -130,14 +132,17 @@ def macroop PUSHA {
};
def macroop POPA {
- # Check all the stack addresses.
- ld rdi, ss, [1, t0, rsp], "0 * env.dataSize"
+ # Check all the stack addresses. We'll assume that if the beginning and
+ # end are ok, then the stuff in the middle should be as well.
+ ld t1, ss, [1, t0, rsp], "0 * env.dataSize"
+ ld t2, ss, [1, t0, rsp], "7 * env.dataSize"
+ mov rdi, rdi, t1
ld rsi, ss, [1, t0, rsp], "1 * env.dataSize"
ld rbp, ss, [1, t0, rsp], "2 * env.dataSize"
ld rbx, ss, [1, t0, rsp], "4 * env.dataSize"
ld rdx, ss, [1, t0, rsp], "5 * env.dataSize"
ld rcx, ss, [1, t0, rsp], "6 * env.dataSize"
- ld rax, ss, [1, t0, rsp], "7 * env.dataSize"
+ mov rax, rax, t2
addi rsp, rsp, "8 * env.dataSize"
};