summaryrefslogtreecommitdiff
path: root/src/arch/x86/isa
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/x86/isa')
-rw-r--r--src/arch/x86/isa/insts/data_transfer/stack_operations.py19
-rw-r--r--src/arch/x86/isa/microops/limmop.isa6
2 files changed, 13 insertions, 12 deletions
diff --git a/src/arch/x86/isa/insts/data_transfer/stack_operations.py b/src/arch/x86/isa/insts/data_transfer/stack_operations.py
index 889e7b88b..1c13b44b4 100644
--- a/src/arch/x86/isa/insts/data_transfer/stack_operations.py
+++ b/src/arch/x86/isa/insts/data_transfer/stack_operations.py
@@ -85,8 +85,10 @@ 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
+ st reg, ss, [0, t0, rsp], "-env.dataSize"
subi rsp, rsp, dsz
- st reg, ss, [0, t0, rsp]
};
def macroop PUSH_I {
@@ -130,14 +132,13 @@ def macroop PUSHA {
};
def macroop POPA {
- st rdi, ss, [0, t0, rsp], "0 * env.dataSize"
- st rsi, ss, [0, t0, rsp], "1 * env.dataSize"
- st rbp, ss, [0, t0, rsp], "2 * env.dataSize"
- st rsp, ss, [0, t0, rsp], "3 * env.dataSize"
- st rbx, ss, [0, t0, rsp], "4 * env.dataSize"
- st rdx, ss, [0, t0, rsp], "5 * env.dataSize"
- st rcx, ss, [0, t0, rsp], "6 * env.dataSize"
- st rax, ss, [0, t0, rsp], "7 * env.dataSize"
+ ld rdi, ss, [0, t0, rsp], "0 * env.dataSize"
+ ld rsi, ss, [0, t0, rsp], "1 * env.dataSize"
+ ld rbp, ss, [0, t0, rsp], "2 * env.dataSize"
+ ld rbx, ss, [0, t0, rsp], "4 * env.dataSize"
+ ld rdx, ss, [0, t0, rsp], "5 * env.dataSize"
+ ld rcx, ss, [0, t0, rsp], "6 * env.dataSize"
+ ld rax, ss, [0, t0, rsp], "7 * env.dataSize"
addi rsp, rsp, "8 * env.dataSize"
};
'''
diff --git a/src/arch/x86/isa/microops/limmop.isa b/src/arch/x86/isa/microops/limmop.isa
index 37180d7fa..ec68c36dc 100644
--- a/src/arch/x86/isa/microops/limmop.isa
+++ b/src/arch/x86/isa/microops/limmop.isa
@@ -142,12 +142,12 @@ def template MicroLimmOpConstructor {{
let {{
class LimmOp(X86Microop):
- def __init__(self, dest, imm):
+ def __init__(self, dest, imm, dataSize="env.dataSize"):
self.className = "Limm"
self.mnemonic = "limm"
self.dest = dest
self.imm = imm
- self.dataSize = "env.dataSize"
+ self.dataSize = dataSize
def getAllocator(self, *microFlags):
allocator = '''new %(class_name)s(machInst, mnemonic
@@ -165,7 +165,7 @@ let {{
let {{
# Build up the all register version of this micro op
iop = InstObjParams("limm", "Limm", 'X86MicroopBase',
- {"code" : "DestReg = imm;"})
+ {"code" : "DestReg = merge(DestReg, imm, dataSize);"})
header_output += MicroLimmOpDeclare.subst(iop)
decoder_output += MicroLimmOpConstructor.subst(iop)
decoder_output += MicroLimmOpDisassembly.subst(iop)