diff options
Diffstat (limited to 'src/arch/x86/isa/microops')
-rw-r--r-- | src/arch/x86/isa/microops/ldstop.isa | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/src/arch/x86/isa/microops/ldstop.isa b/src/arch/x86/isa/microops/ldstop.isa index 1bdc1d37a..106a8a0fe 100644 --- a/src/arch/x86/isa/microops/ldstop.isa +++ b/src/arch/x86/isa/microops/ldstop.isa @@ -123,7 +123,7 @@ def template MicroLoadExecute {{ %(ea_code)s; DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA); - fault = read(xc, EA, Mem, 0); + fault = read(xc, EA, Mem, (%(mem_flags)s) | (1 << segment)); if(fault == NoFault) { @@ -150,7 +150,7 @@ def template MicroLoadInitiateAcc {{ %(ea_code)s; DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA); - fault = read(xc, EA, Mem, 0); + fault = read(xc, EA, Mem, (%(mem_flags)s) | (1 << segment)); return fault; } @@ -197,7 +197,7 @@ def template MicroStoreExecute {{ if(fault == NoFault) { - fault = write(xc, Mem, EA, 0); + fault = write(xc, Mem, EA, (%(mem_flags)s) | (1 << segment)); if(fault == NoFault) { %(op_wb)s; @@ -224,7 +224,7 @@ def template MicroStoreInitiateAcc {{ if(fault == NoFault) { - fault = write(xc, Mem, EA, 0); + fault = write(xc, Mem, EA, (%(mem_flags)s) | (1 << segment)); if(fault == NoFault) { %(op_wb)s; @@ -358,7 +358,7 @@ let {{ calculateEA = "EA = SegBase + scale * Index + Base + disp;" - def defineMicroLoadOp(mnemonic, code): + def defineMicroLoadOp(mnemonic, code, mem_flags=0): global header_output global decoder_output global exec_output @@ -368,7 +368,9 @@ let {{ # Build up the all register version of this micro op iop = InstObjParams(name, Name, 'X86ISA::LdStOp', - {"code": code, "ea_code": calculateEA}) + {"code": code, + "ea_code": calculateEA, + "mem_flags": mem_flags}) header_output += MicroLdStOpDeclare.subst(iop) decoder_output += MicroLdStOpConstructor.subst(iop) exec_output += MicroLoadExecute.subst(iop) @@ -386,9 +388,10 @@ let {{ microopClasses[name] = LoadOp defineMicroLoadOp('Ld', 'Data = merge(Data, Mem, dataSize);') + defineMicroLoadOp('Ldst', 'Data = merge(Data, Mem, dataSize);', 'StoreCheck') defineMicroLoadOp('Ldfp', 'FpData.uqw = Mem;') - def defineMicroStoreOp(mnemonic, code): + def defineMicroStoreOp(mnemonic, code, mem_flags=0): global header_output global decoder_output global exec_output @@ -398,7 +401,9 @@ let {{ # Build up the all register version of this micro op iop = InstObjParams(name, Name, 'X86ISA::LdStOp', - {"code": code, "ea_code": calculateEA}) + {"code": code, + "ea_code": calculateEA, + "mem_flags": mem_flags}) header_output += MicroLdStOpDeclare.subst(iop) decoder_output += MicroLdStOpConstructor.subst(iop) exec_output += MicroStoreExecute.subst(iop) @@ -419,7 +424,9 @@ let {{ defineMicroStoreOp('Stfp', 'Mem = FpData.uqw;') iop = InstObjParams("lea", "Lea", 'X86ISA::LdStOp', - {"code": "Data = merge(Data, EA, dataSize);", "ea_code": calculateEA}) + {"code": "Data = merge(Data, EA, dataSize);", + "ea_code": calculateEA, + "mem_flags": 0}) header_output += MicroLeaDeclare.subst(iop) decoder_output += MicroLdStOpConstructor.subst(iop) exec_output += MicroLeaExecute.subst(iop) |