diff -r 7100059f7bfd -r ab37376c0044 src/arch/x86/isa/microops/debug.isa --- a/src/arch/x86/isa/microops/debug.isa Mon May 14 20:31:33 2012 -0500 +++ b/src/arch/x86/isa/microops/debug.isa Wed May 16 18:39:36 2012 -0500 @@ -141,7 +141,7 @@ {"code": "", "func": func, "func_num": "GenericISA::M5DebugFault::%s" % func_num, - "cond_test": "checkCondition(ccFlagBits, cc)"}) + "cond_test": "checkCondition(ccFlagBits|uccBits, cc)"}) exec_output += MicroDebugExecute.subst(iop) header_output += MicroDebugDeclare.subst(iop) decoder_output += MicroDebugConstructor.subst(iop) diff -r 7100059f7bfd -r ab37376c0044 src/arch/x86/isa/microops/fpop.isa --- a/src/arch/x86/isa/microops/fpop.isa Mon May 14 20:31:33 2012 -0500 +++ b/src/arch/x86/isa/microops/fpop.isa Wed May 16 18:39:36 2012 -0500 @@ -215,7 +215,7 @@ spm, SetStatus, dataSize) code = 'FpDestReg_uqw = FpSrcReg1_uqw;' else_code = 'FpDestReg_uqw = FpDestReg_uqw;' - cond_check = "checkCondition(ccFlagBits, src2)" + cond_check = "checkCondition(ccFlagBits|uccBits, src2)" class Xorfp(FpOp): code = 'FpDestReg_uqw = FpSrcReg1_uqw ^ FpSrcReg2_uqw;' diff -r 7100059f7bfd -r ab37376c0044 src/arch/x86/isa/microops/regop.isa --- a/src/arch/x86/isa/microops/regop.isa Mon May 14 20:31:33 2012 -0500 +++ b/src/arch/x86/isa/microops/regop.isa Wed May 16 18:39:36 2012 -0500 @@ -438,26 +438,35 @@ flag_code = ''' //Don't have genFlags handle the OF or CF bits uint64_t mask = CFBit | ECFBit | OFBit; - ccFlagBits = genFlags(ccFlagBits, ext & ~mask, result, psrc1, op2); + ccFlagBits = genFlags(ccFlagBits|uccBits, ext & ~mask, result, psrc1, op2); + uccBits = ccFlagBits & 0x028; + ccFlagBits = ccFlagBits & 0xCD5; + //If a logic microop wants to set these, it wants to set them to 0. ccFlagBits &= ~(CFBit & ext); - ccFlagBits &= ~(ECFBit & ext); + uccBits &= ~(ECFBit & ext); ccFlagBits &= ~(OFBit & ext); ''' class FlagRegOp(RegOp): abstract = True - flag_code = \ - "ccFlagBits = genFlags(ccFlagBits, ext, result, psrc1, op2);" + flag_code = ''' + ccFlagBits = genFlags(ccFlagBits|uccBits, ext, result, psrc1, op2); + uccBits = ccFlagBits & 0x028; + ccFlagBits = ccFlagBits & 0xCD5; + ''' class SubRegOp(RegOp): abstract = True - flag_code = \ - "ccFlagBits = genFlags(ccFlagBits, ext, result, psrc1, ~op2, true);" + flag_code = ''' + ccFlagBits = genFlags(ccFlagBits|uccBits, ext, result, psrc1, ~op2, true); + uccBits = ccFlagBits & 0x028; + ccFlagBits = ccFlagBits & 0xCD5; + ''' class CondRegOp(RegOp): abstract = True - cond_check = "checkCondition(ccFlagBits, ext)" + cond_check = "checkCondition(ccFlagBits|uccBits, ext)" cond_control_flag_init = "flags[IsCondControl] = flags[IsControl];" class RdRegOp(RegOp): @@ -536,9 +545,11 @@ flag_code = ''' if ((-ProdHi & mask(dataSize * 8)) != bits(ProdLow, dataSize * 8 - 1)) { - ccFlagBits = ccFlagBits | (ext & (CFBit | OFBit | ECFBit)); + ccFlagBits = ccFlagBits | (ext & (CFBit | OFBit)); + uccBits = uccBits | (ext & (ECFBit)); } else { - ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit | ECFBit)); + ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit)); + uccBits = uccBits & ~(ext & (ECFBit)); } ''' @@ -557,9 +568,11 @@ ''' flag_code = ''' if (ProdHi) { - ccFlagBits = ccFlagBits | (ext & (CFBit | OFBit | ECFBit)); + ccFlagBits = ccFlagBits | (ext & (CFBit | OFBit)); + uccBits = uccBits | (ext & (ECFBit)); } else { - ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit | ECFBit)); + ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit)); + uccBits = uccBits & ~(ext & (ECFBit)); } ''' @@ -658,9 +671,9 @@ big_code = divCode % "DestReg = remaining & mask(dataSize * 8);" flag_code = ''' if (remaining == 0) - ccFlagBits = ccFlagBits | (ext & EZFBit); + uccBits = uccBits | (ext & EZFBit); else - ccFlagBits = ccFlagBits & ~(ext & EZFBit); + uccBits = uccBits & ~(ext & EZFBit); ''' class Divq(RdRegOp): @@ -691,7 +704,8 @@ if (shiftAmt) { //Zero out any flags we might modify. This way we only have to //worry about setting them. - ccFlagBits = ccFlagBits & ~(ext & (CFBit | ECFBit | OFBit)); + ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit)); + uccBits = uccBits & ~(ext & (ECFBit)); int CFBits = 0; //Figure out if we -would- set the CF bits if requested. if (shiftAmt <= dataSize * 8 && @@ -699,14 +713,18 @@ CFBits = 1; } //If some combination of the CF bits need to be set, set them. - if ((ext & (CFBit | ECFBit)) && CFBits) - ccFlagBits = ccFlagBits | (ext & (CFBit | ECFBit)); + if ((ext & (CFBit | ECFBit)) && CFBits) { + ccFlagBits = ccFlagBits | (ext & (CFBit)); + uccBits = uccBits | (ext & (ECFBit)); + } //Figure out what the OF bit should be. if ((ext & OFBit) && (CFBits ^ bits(DestReg, dataSize * 8 - 1))) ccFlagBits = ccFlagBits | OFBit; //Use the regular mechanisms to calculate the other flags. - ccFlagBits = genFlags(ccFlagBits, ext & ~(CFBit | ECFBit | OFBit), + ccFlagBits = genFlags(ccFlagBits|uccBits, ext & ~(CFBit | ECFBit | OFBit), DestReg, psrc1, op2); + uccBits = ccFlagBits & 0x028; + ccFlagBits = ccFlagBits & 0xCD5; } ''' @@ -729,19 +747,23 @@ if (shiftAmt) { //Zero out any flags we might modify. This way we only have to //worry about setting them. - ccFlagBits = ccFlagBits & ~(ext & (CFBit | ECFBit | OFBit)); + ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit)); + uccBits = uccBits & ~(ext & (ECFBit)); //If some combination of the CF bits need to be set, set them. if ((ext & (CFBit | ECFBit)) && shiftAmt <= dataSize * 8 && bits(SrcReg1, shiftAmt - 1)) { - ccFlagBits = ccFlagBits | (ext & (CFBit | ECFBit)); + ccFlagBits = ccFlagBits | (ext & (CFBit)); + uccBits = uccBits | (ext & (ECFBit)); } //Figure out what the OF bit should be. if ((ext & OFBit) && bits(SrcReg1, dataSize * 8 - 1)) ccFlagBits = ccFlagBits | OFBit; //Use the regular mechanisms to calculate the other flags. - ccFlagBits = genFlags(ccFlagBits, ext & ~(CFBit | ECFBit | OFBit), + ccFlagBits = genFlags(ccFlagBits|uccBits, ext & ~(CFBit | ECFBit | OFBit), DestReg, psrc1, op2); + uccBits = ccFlagBits & 0x028; + ccFlagBits = ccFlagBits & 0xCD5; } ''' @@ -766,17 +788,21 @@ if (shiftAmt) { //Zero out any flags we might modify. This way we only have to //worry about setting them. - ccFlagBits = ccFlagBits & ~(ext & (CFBit | ECFBit | OFBit)); + ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit)); + uccBits = uccBits & ~(ext & (ECFBit)); //If some combination of the CF bits need to be set, set them. uint8_t effectiveShift = (shiftAmt <= dataSize * 8) ? shiftAmt : (dataSize * 8); if ((ext & (CFBit | ECFBit)) && bits(SrcReg1, effectiveShift - 1)) { - ccFlagBits = ccFlagBits | (ext & (CFBit | ECFBit)); + ccFlagBits = ccFlagBits | (ext & (CFBit)); + uccBits = uccBits | (ext & (ECFBit)); } //Use the regular mechanisms to calculate the other flags. - ccFlagBits = genFlags(ccFlagBits, ext & ~(CFBit | ECFBit | OFBit), + ccFlagBits = genFlags(ccFlagBits|uccBits, ext & ~(CFBit | ECFBit | OFBit), DestReg, psrc1, op2); + uccBits = ccFlagBits & 0x028; + ccFlagBits = ccFlagBits & 0xCD5; } ''' @@ -797,19 +823,24 @@ if (shiftAmt) { //Zero out any flags we might modify. This way we only have to //worry about setting them. - ccFlagBits = ccFlagBits & ~(ext & (CFBit | ECFBit | OFBit)); + ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit)); + uccBits = uccBits & ~(ext & (ECFBit)); //Find the most and second most significant bits of the result. int msb = bits(DestReg, dataSize * 8 - 1); int smsb = bits(DestReg, dataSize * 8 - 2); //If some combination of the CF bits need to be set, set them. - if ((ext & (CFBit | ECFBit)) && msb) - ccFlagBits = ccFlagBits | (ext & (CFBit | ECFBit)); + if ((ext & (CFBit | ECFBit)) && msb) { + ccFlagBits = ccFlagBits | (ext & (CFBit)); + uccBits = uccBits | (ext & (ECFBit)); + } //Figure out what the OF bit should be. if ((ext & OFBit) && (msb ^ smsb)) ccFlagBits = ccFlagBits | OFBit; //Use the regular mechanisms to calculate the other flags. - ccFlagBits = genFlags(ccFlagBits, ext & ~(CFBit | ECFBit | OFBit), + ccFlagBits = genFlags(ccFlagBits|uccBits, ext & ~(CFBit | ECFBit | OFBit), DestReg, psrc1, op2); + uccBits = ccFlagBits & 0x028; + ccFlagBits = ccFlagBits & 0xCD5; } ''' @@ -834,7 +865,8 @@ int origCFBit = (ccFlagBits & CFBit) ? 1 : 0; //Zero out any flags we might modify. This way we only have to //worry about setting them. - ccFlagBits = ccFlagBits & ~(ext & (CFBit | ECFBit | OFBit)); + ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit)); + uccBits = uccBits & ~(ext & (ECFBit)); //Figure out what the OF bit should be. if ((ext & OFBit) && (origCFBit ^ bits(SrcReg1, dataSize * 8 - 1))) { @@ -844,11 +876,14 @@ if ((ext & (CFBit | ECFBit)) && (realShiftAmt == 0) ? origCFBit : bits(SrcReg1, realShiftAmt - 1)) { - ccFlagBits = ccFlagBits | (ext & (CFBit | ECFBit)); + ccFlagBits = ccFlagBits | (ext & (CFBit)); + uccBits = uccBits | (ext & (ECFBit)); } //Use the regular mechanisms to calculate the other flags. - ccFlagBits = genFlags(ccFlagBits, ext & ~(CFBit | ECFBit | OFBit), + ccFlagBits = genFlags(ccFlagBits|uccBits, ext & ~(CFBit | ECFBit | OFBit), DestReg, psrc1, op2); + uccBits = ccFlagBits & 0x028; + ccFlagBits = ccFlagBits & 0xCD5; } ''' @@ -870,19 +905,24 @@ if (shiftAmt) { //Zero out any flags we might modify. This way we only have to //worry about setting them. - ccFlagBits = ccFlagBits & ~(ext & (CFBit | ECFBit | OFBit)); + ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit)); + uccBits = uccBits & ~(ext & (ECFBit)); //The CF bits, if set, would be set to the lsb of the result. int lsb = DestReg & 0x1; int msb = bits(DestReg, dataSize * 8 - 1); //If some combination of the CF bits need to be set, set them. - if ((ext & (CFBit | ECFBit)) && lsb) - ccFlagBits = ccFlagBits | (ext & (CFBit | ECFBit)); + if ((ext & (CFBit | ECFBit)) && lsb) { + ccFlagBits = ccFlagBits | (ext & (CFBit)); + uccBits = uccBits | (ext & (ECFBit)); + } //Figure out what the OF bit should be. if ((ext & OFBit) && (msb ^ lsb)) ccFlagBits = ccFlagBits | OFBit; //Use the regular mechanisms to calculate the other flags. - ccFlagBits = genFlags(ccFlagBits, ext & ~(CFBit | ECFBit | OFBit), + ccFlagBits = genFlags(ccFlagBits|uccBits, ext & ~(CFBit | ECFBit | OFBit), DestReg, psrc1, op2); + uccBits = ccFlagBits & 0x028; + ccFlagBits = ccFlagBits & 0xCD5; } ''' @@ -909,19 +949,24 @@ int origCFBit = (ccFlagBits & CFBit) ? 1 : 0; //Zero out any flags we might modify. This way we only have to //worry about setting them. - ccFlagBits = ccFlagBits & ~(ext & (CFBit | ECFBit | OFBit)); + ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit)); + uccBits = uccBits & ~(ext & (ECFBit)); int msb = bits(DestReg, dataSize * 8 - 1); int CFBits = bits(SrcReg1, dataSize * 8 - realShiftAmt); //If some combination of the CF bits need to be set, set them. if ((ext & (CFBit | ECFBit)) && - (realShiftAmt == 0) ? origCFBit : CFBits) - ccFlagBits = ccFlagBits | (ext & (CFBit | ECFBit)); + (realShiftAmt == 0) ? origCFBit : CFBits) { + ccFlagBits = ccFlagBits | (ext & (CFBit)); + uccBits = uccBits | (ext & (ECFBit)); + } //Figure out what the OF bit should be. if ((ext & OFBit) && (msb ^ CFBits)) ccFlagBits = ccFlagBits | OFBit; //Use the regular mechanisms to calculate the other flags. - ccFlagBits = genFlags(ccFlagBits, ext & ~(CFBit | ECFBit | OFBit), + ccFlagBits = genFlags(ccFlagBits|uccBits, ext & ~(CFBit | ECFBit | OFBit), DestReg, psrc1, op2); + uccBits = ccFlagBits & 0x028; + ccFlagBits = ccFlagBits & 0xCD5; } ''' @@ -949,7 +994,8 @@ if (shiftAmt) { //Zero out any flags we might modify. This way we only have to //worry about setting them. - ccFlagBits = ccFlagBits & ~(ext & (CFBit | ECFBit | OFBit)); + ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit)); + uccBits = uccBits & ~(ext & (ECFBit)); int CFBits = 0; //Figure out if we -would- set the CF bits if requested. if ((realShiftAmt == 0 && @@ -961,15 +1007,19 @@ CFBits = 1; } //If some combination of the CF bits need to be set, set them. - if ((ext & (CFBit | ECFBit)) && CFBits) - ccFlagBits = ccFlagBits | (ext & (CFBit | ECFBit)); + if ((ext & (CFBit | ECFBit)) && CFBits) { + ccFlagBits = ccFlagBits | (ext & (CFBit)); + uccBits = uccBits | (ext & (ECFBit)); + } //Figure out what the OF bit should be. if ((ext & OFBit) && (bits(SrcReg1, dataBits - 1) ^ bits(result, dataBits - 1))) ccFlagBits = ccFlagBits | OFBit; //Use the regular mechanisms to calculate the other flags. - ccFlagBits = genFlags(ccFlagBits, ext & ~(CFBit | ECFBit | OFBit), + ccFlagBits = genFlags(ccFlagBits|uccBits, ext & ~(CFBit | ECFBit | OFBit), DestReg, psrc1, op2); + uccBits = ccFlagBits & 0x028; + ccFlagBits = ccFlagBits & 0xCD5; } ''' @@ -1003,7 +1053,8 @@ if (shiftAmt) { //Zero out any flags we might modify. This way we only have to //worry about setting them. - ccFlagBits = ccFlagBits & ~(ext & (CFBit | ECFBit | OFBit)); + ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit)); + uccBits = uccBits & ~(ext & (ECFBit)); int CFBits = 0; //If some combination of the CF bits need to be set, set them. if ((realShiftAmt == 0 && @@ -1015,15 +1066,19 @@ CFBits = 1; } //If some combination of the CF bits need to be set, set them. - if ((ext & (CFBit | ECFBit)) && CFBits) - ccFlagBits = ccFlagBits | (ext & (CFBit | ECFBit)); + if ((ext & (CFBit | ECFBit)) && CFBits) { + ccFlagBits = ccFlagBits | (ext & (CFBit)); + uccBits = uccBits | (ext & (ECFBit)); + } //Figure out what the OF bit should be. if ((ext & OFBit) && (bits(SrcReg1, dataBits - 1) ^ bits(result, dataBits - 1))) ccFlagBits = ccFlagBits | OFBit; //Use the regular mechanisms to calculate the other flags. - ccFlagBits = genFlags(ccFlagBits, ext & ~(CFBit | ECFBit | OFBit), + ccFlagBits = genFlags(ccFlagBits|uccBits, ext & ~(CFBit | ECFBit | OFBit), DestReg, psrc1, op2); + uccBits = ccFlagBits & 0x028; + ccFlagBits = ccFlagBits & 0xCD5; } ''' @@ -1035,7 +1090,9 @@ else_code = "NRIP = NRIP;" class Wruflags(WrRegOp): - code = 'ccFlagBits = psrc1 ^ op2' + code = ''' + ccFlagBits = psrc1 ^ op2; + ''' class Wrflags(WrRegOp): code = ''' @@ -1060,14 +1117,14 @@ code = ''' int flag = bits(ccFlagBits, imm8); DestReg = merge(DestReg, flag, dataSize); - ccFlagBits = (flag == 0) ? (ccFlagBits | EZFBit) : - (ccFlagBits & ~EZFBit); + uccBits = (flag == 0) ? (uccBits | EZFBit) : + (uccBits & ~EZFBit); ''' big_code = ''' int flag = bits(ccFlagBits, imm8); DestReg = flag & mask(dataSize * 8); - ccFlagBits = (flag == 0) ? (ccFlagBits | EZFBit) : - (ccFlagBits & ~EZFBit); + uccBits = (flag == 0) ? (uccBits | EZFBit) : + (uccBits & ~EZFBit); ''' def __init__(self, dest, imm, flags=None, \ dataSize="env.dataSize"): @@ -1080,16 +1137,16 @@ MiscReg flags = (nccFlagBits | ccFlagBits) & flagMask; int flag = bits(flags, imm8); DestReg = merge(DestReg, flag, dataSize); - ccFlagBits = (flag == 0) ? (ccFlagBits | EZFBit) : - (ccFlagBits & ~EZFBit); + uccBits = (flag == 0) ? (uccBits | EZFBit) : + (uccBits & ~EZFBit); ''' big_code = ''' MiscReg flagMask = 0x3F7FDD5; MiscReg flags = (nccFlagBits | ccFlagBits) & flagMask; int flag = bits(flags, imm8); DestReg = flag & mask(dataSize * 8); - ccFlagBits = (flag == 0) ? (ccFlagBits | EZFBit) : - (ccFlagBits & ~EZFBit); + uccBits = (flag == 0) ? (uccBits | EZFBit) : + (uccBits & ~EZFBit); ''' def __init__(self, dest, imm, flags=None, \ dataSize="env.dataSize"): @@ -1116,12 +1173,14 @@ DestReg = val & mask(dataSize * 8); ''' flag_code = ''' - if (!sign_bit) - ccFlagBits = ccFlagBits & - ~(ext & (CFBit | ECFBit | ZFBit | EZFBit)); - else - ccFlagBits = ccFlagBits | - (ext & (CFBit | ECFBit | ZFBit | EZFBit)); + if (!sign_bit) { + ccFlagBits = ccFlagBits & ~(ext & (CFBit | ZFBit)); + uccBits = uccBits & ~(ext & (ECFBit | EZFBit)); + } + else { + ccFlagBits = ccFlagBits | (ext & (CFBit | ZFBit)); + uccBits = uccBits | (ext & (ECFBit | EZFBit)); + } ''' class Zext(RegOp): @@ -1403,9 +1462,12 @@ ''' flag_code = ''' // Check for a NULL selector and set ZF,EZF appropriately. - ccFlagBits = ccFlagBits & ~(ext & (ZFBit | EZFBit)); - if (!selector.si && !selector.ti) - ccFlagBits = ccFlagBits | (ext & (ZFBit | EZFBit)); + ccFlagBits = ccFlagBits & ~(ext & (ZFBit)); + uccBits = uccBits & ~(ext & (EZFBit)); + if (!selector.si && !selector.ti) { + ccFlagBits = ccFlagBits | (ext & (ZFBit)); + uccBits = uccBits | (ext & (EZFBit)); + } ''' class Wrdh(RegOp): diff -r 7100059f7bfd -r ab37376c0044 src/arch/x86/isa/microops/seqop.isa --- a/src/arch/x86/isa/microops/seqop.isa Mon May 14 20:31:33 2012 -0500 +++ b/src/arch/x86/isa/microops/seqop.isa Wed May 16 18:39:36 2012 -0500 @@ -172,7 +172,7 @@ iop = InstObjParams("br", "MicroBranchFlags", "SeqOpBase", {"code": "nuIP = target;", "else_code": "nuIP = nuIP;", - "cond_test": "checkCondition(ccFlagBits, cc)", + "cond_test": "checkCondition(ccFlagBits|uccBits, cc)", "cond_control_flag_init": "flags[IsCondControl] = true"}) exec_output += SeqOpExecute.subst(iop) header_output += SeqOpDeclare.subst(iop) @@ -189,7 +189,7 @@ iop = InstObjParams("eret", "EretFlags", "SeqOpBase", {"code": "", "else_code": "", - "cond_test": "checkCondition(ccFlagBits, cc)", + "cond_test": "checkCondition(ccFlagBits|uccBits, cc)", "cond_control_flag_init": ""}) exec_output += SeqOpExecute.subst(iop) header_output += SeqOpDeclare.subst(iop) diff -r 7100059f7bfd -r ab37376c0044 src/arch/x86/isa/microops/specop.isa --- a/src/arch/x86/isa/microops/specop.isa Mon May 14 20:31:33 2012 -0500 +++ b/src/arch/x86/isa/microops/specop.isa Wed May 16 18:39:36 2012 -0500 @@ -181,7 +181,7 @@ iop = InstObjParams("fault", "MicroFaultFlags", "MicroFaultBase", {"code": "", - "cond_test": "checkCondition(ccFlagBits, cc)"}) + "cond_test": "checkCondition(ccFlagBits|uccBits, cc)"}) exec_output = MicroFaultExecute.subst(iop) header_output = MicroFaultDeclare.subst(iop) decoder_output = MicroFaultConstructor.subst(iop) diff -r 7100059f7bfd -r ab37376c0044 src/arch/x86/isa/operands.isa --- a/src/arch/x86/isa/operands.isa Mon May 14 20:31:33 2012 -0500 +++ b/src/arch/x86/isa/operands.isa Wed May 16 18:39:36 2012 -0500 @@ -119,10 +119,11 @@ # This holds the condition code portion of the flag register. The # nccFlagBits version holds the rest. 'ccFlagBits': intReg('INTREG_PSEUDO(0)', 60), + 'uccBits': intReg('INTREG_PSEUDO(1)', 61), # These register should needs to be more protected so that later # instructions don't map their indexes with an old value. - 'nccFlagBits': controlReg('MISCREG_RFLAGS', 61), - 'TOP': controlReg('MISCREG_X87_TOP', 62, ctype='ub'), + 'nccFlagBits': controlReg('MISCREG_RFLAGS', 62), + 'TOP': controlReg('MISCREG_X87_TOP', 63, ctype='ub'), # The segment base as used by memory instructions. 'SegBase': controlReg('MISCREG_SEG_EFF_BASE(segment)', 70), diff -r 7100059f7bfd -r ab37376c0044 src/arch/x86/x86_traits.hh --- a/src/arch/x86/x86_traits.hh Mon May 14 20:31:33 2012 -0500 +++ b/src/arch/x86/x86_traits.hh Wed May 16 18:39:36 2012 -0500 @@ -46,7 +46,7 @@ { const int NumMicroIntRegs = 16; - const int NumPseudoIntRegs = 1; + const int NumPseudoIntRegs = 2; //1. The condition code bits of the rflags register. const int NumImplicitIntRegs = 6; //1. The lower part of the result of multiplication.