From 4d15e4cf7b2c8eb1f2232e0cbcd09893e9cb9500 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Sun, 21 Oct 2007 18:44:50 -0700 Subject: X86: Implement the stupd microop ("store with update", not "stupid") and use it in ENTER. --HG-- extra : convert_revision : 9151f701162d31ef26298497467c42b7b0ed85d5 --- .../isa/insts/general_purpose/data_transfer/stack_operations.py | 9 +++------ src/arch/x86/isa/microops/ldstop.isa | 5 +++++ 2 files changed, 8 insertions(+), 6 deletions(-) (limited to 'src/arch') 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 4c4aec000..3ed9d8bff 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 @@ -169,8 +169,7 @@ def macroop ENTER_I_I { # t1 is now the masked nesting level, and t2 is the amount of storage. # Push rbp. - st rbp, ss, [1, t0, rsp], "-env.dataSize" - subi rsp, rsp, dsz + stupd rbp, ss, [1, t0, rsp], "-env.dataSize" # Save the stack pointer for later mov t6, t6, rsp @@ -186,8 +185,7 @@ def macroop ENTER_I_I { limm t4, "ULL(-1)", dataSize=8 topOfLoop: ld t5, ss, [dsz, t4, rbp] - st t5, ss, [1, t0, rsp], "-env.dataSize" - subi rsp, rsp, dsz + stupd t5, ss, [1, t0, rsp], "-env.dataSize" # If we're not done yet, loop subi t4, t4, 1, dataSize=8 @@ -196,8 +194,7 @@ topOfLoop: bottomOfLoop: # Push the old rbp onto the stack - st t6, ss, [1, t0, rsp], "-env.dataSize" - subi rsp, rsp, dsz + stupd t6, ss, [1, t0, rsp], "-env.dataSize" skipLoop: sub rsp, rsp, t2 diff --git a/src/arch/x86/isa/microops/ldstop.isa b/src/arch/x86/isa/microops/ldstop.isa index 32fefb5fa..c9ace4790 100644 --- a/src/arch/x86/isa/microops/ldstop.isa +++ b/src/arch/x86/isa/microops/ldstop.isa @@ -422,6 +422,11 @@ let {{ defineMicroStoreOp('St', 'Mem = Data;') defineMicroStoreOp('Stfp', 'Mem = FpData.uqw;') + defineMicroStoreOp('Stupd', ''' + Mem = Data; + Base = merge(Base, EA - SegBase, addressSize); + '''); + iop = InstObjParams("lea", "Lea", 'X86ISA::LdStOp', {"code": "Data = merge(Data, EA, dataSize);", -- cgit v1.2.3