%(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)
         {
         %(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;
     }
 
         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;
 
         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;
 
     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
 
         # 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)
         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
 
         # 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)
     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)