ARM: Further break up condition code into NZ, C, V bits.
authorAli Saidi <Ali.Saidi@ARM.com>
Fri, 13 May 2011 22:27:01 +0000 (17:27 -0500)
committerAli Saidi <Ali.Saidi@ARM.com>
Fri, 13 May 2011 22:27:01 +0000 (17:27 -0500)
Break up the condition code bits into NZ, C, V registers. These are individually
written and this removes some incorrect dependencies between instructions.

18 files changed:
src/arch/arm/faults.cc
src/arch/arm/intregs.hh
src/arch/arm/isa/formats/fp.isa
src/arch/arm/isa/formats/pred.isa
src/arch/arm/isa/insts/data.isa
src/arch/arm/isa/insts/fp.isa
src/arch/arm/isa/insts/ldr.isa
src/arch/arm/isa/insts/macromem.isa
src/arch/arm/isa/insts/mem.isa
src/arch/arm/isa/insts/misc.isa
src/arch/arm/isa/insts/mult.isa
src/arch/arm/isa/insts/str.isa
src/arch/arm/isa/operands.isa
src/arch/arm/isa/templates/pred.isa
src/arch/arm/isa/templates/vfp.isa
src/arch/arm/miscregs.hh
src/arch/arm/nativetrace.cc
src/arch/arm/utility.hh

index e7e78e1780c9b04b8245842cc9083205e893da99..7dd81a68138cb6fa7caa0b64629de7aff5e49180 100644 (file)
@@ -106,9 +106,12 @@ ArmFault::invoke(ThreadContext *tc, StaticInstPtr inst)
 
     SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR);
     CPSR cpsr = tc->readMiscReg(MISCREG_CPSR);
-    CPSR saved_cpsr = tc->readMiscReg(MISCREG_CPSR) | 
-                      tc->readIntReg(INTREG_CONDCODES_F) |
-                      tc->readIntReg(INTREG_CONDCODES_GE);
+    CPSR saved_cpsr = tc->readMiscReg(MISCREG_CPSR);
+    saved_cpsr.nz = tc->readIntReg(INTREG_CONDCODES_NZ);
+    saved_cpsr.c = tc->readIntReg(INTREG_CONDCODES_C);
+    saved_cpsr.v = tc->readIntReg(INTREG_CONDCODES_V);
+    saved_cpsr.ge = tc->readIntReg(INTREG_CONDCODES_GE);
+
     Addr curPc M5_VAR_USED = tc->pcState().pc();
     ITSTATE it = tc->pcState().itstate();
     saved_cpsr.it2 = it.top6;
index 000c6306d2c9af0a3a3a003b8b4d9a2b2b5d0380..c26e362112a0d783c0ebac98facc6d3e70fa730c 100644 (file)
@@ -112,7 +112,9 @@ enum IntRegIndex
     INTREG_UREG0,
     INTREG_UREG1,
     INTREG_UREG2,
-    INTREG_CONDCODES_F,
+    INTREG_CONDCODES_NZ,
+    INTREG_CONDCODES_C,
+    INTREG_CONDCODES_V,
     INTREG_CONDCODES_GE,
     INTREG_FPCONDCODES,
 
index 5ec65c01be87eabafa0099bd3329e430ce901175..812338c301b514f93f317459bb05c9c2756ff1fb 100644 (file)
@@ -2068,14 +2068,8 @@ let {{
                     return new Unknown(machInst);
                 }
                 if (rt == 0xf) {
-                    CPSR cpsrMask = 0;
-                    cpsrMask.n = 1;
-                    cpsrMask.z = 1;
-                    cpsrMask.c = 1;
-                    cpsrMask.v = 1;
                     if (specReg == MISCREG_FPSCR) {
-                        return new VmrsApsrFpscr(machInst, INTREG_CONDCODES_F,
-                                (IntRegIndex)specReg, (uint32_t)cpsrMask);
+                        return new VmrsApsrFpscr(machInst);
                     } else {
                         return new Unknown(machInst);
                     }
index 89fcd9ca9ad24f71593c1a2a89e4dccf3ebafc24..bd6ccddd102caf85a441dbdd1d7073cc7aaa43d5 100644 (file)
@@ -53,7 +53,9 @@ let {{
             _iv = %(ivValue)s & 1;
             _ic = %(icValue)s & 1;
             
-            CondCodesF =  _in << 31 | _iz << 30 | _ic << 29 | _iv << 28;
+            CondCodesNZ =  (_in << 1) | (_iz);
+            CondCodesC  =  _ic;
+            CondCodesV  =  _iv;
 
             DPRINTF(Arm, "in = %%d\\n", _in);
             DPRINTF(Arm, "iz = %%d\\n", _iz);
@@ -70,11 +72,11 @@ let {{
         canOverflow = 'false'
 
         if flagtype == "none":
-            icReg = icImm = 'CondCodesF<29:>'
-            iv = 'CondCodesF<28:>'
+            icReg = icImm = 'CondCodesC'
+            iv = 'CondCodesV'
         elif flagtype == "llbit":
-            icReg = icImm = 'CondCodesF<29:>'
-            iv = 'CondCodesF<28:>'
+            icReg = icImm = 'CondCodesC'
+            iv = 'CondCodesV'
             negBit = 63
         elif flagtype == "overflow":
             canOverflow = "true" 
@@ -89,9 +91,9 @@ let {{
             icReg = icImm = 'findCarry(32, resTemp, op2, ~Rn)'
             iv = 'findOverflow(32, resTemp, op2, ~Rn)'
         else:
-            icReg = 'shift_carry_rs(Rm, Rs<7:0>, shift, CondCodesF<29:>)'
-            icImm = 'shift_carry_imm(Rm, shift_size, shift, CondCodesF<29:>)'
-            iv = 'CondCodesF<28:>'
+            icReg = 'shift_carry_rs(Rm, Rs<7:0>, shift, CondCodesC)'
+            icImm = 'shift_carry_imm(Rm, shift_size, shift, CondCodesC)'
+            iv = 'CondCodesV'
         return (calcCcCode % {"icValue" : icReg, 
                               "ivValue" : iv, 
                               "negBit" : negBit,
@@ -106,11 +108,11 @@ let {{
         negBit = 31
         canOverflow = 'false'
         if flagtype == "none":
-            icValue = 'CondCodesF<29:>'
-            ivValue = 'CondCodesF<28:>'
+            icValue = 'CondCodesC'
+            ivValue = 'CondCodesV'
         elif flagtype == "llbit":
-            icValue = 'CondCodesF<29:>'
-            ivValue = 'CondCodesF<28:>'
+            icValue = 'CondCodesC'
+            ivValue = 'CondCodesV'
             negBit = 63
         elif flagtype == "overflow":
             icVaule = ivValue = '0'
@@ -126,20 +128,20 @@ let {{
             ivValue = 'findOverflow(32, resTemp, rotated_imm, ~Rn)'
         elif flagtype == "modImm":
             icValue = 'rotated_carry'
-            ivValue = 'CondCodesF<28:>'
+            ivValue = 'CondCodesV'
         else:
-            icValue = '(rotate ? rotated_carry:CondCodesF<29:>)'
-            ivValue = 'CondCodesF<28:>'
+            icValue = '(rotate ? rotated_carry:CondCodesC)'
+            ivValue = 'CondCodesV'
         return calcCcCode % vars()
 }};
 
 def format DataOp(code, flagtype = logic) {{
     (regCcCode, immCcCode) = getCcCode(flagtype)
     regCode = '''uint32_t op2 = shift_rm_rs(Rm, Rs<7:0>,
-                                            shift, CondCodesF<29:>);
+                                            shift, CondCodesC);
                  op2 = op2;''' + code
     immCode = '''uint32_t op2 = shift_rm_imm(Rm, shift_size,
-                                             shift, CondCodesF<29:>);
+                                             shift, CondCodesC);
                  op2 = op2;''' + code
     regIop = InstObjParams(name, Name, 'PredIntOp',
                            {"code": regCode,
index 1a239f48ba9995e71d90b679bd636789b411f6ba..94693c8ef33dc682b0a4a77266c43665b1f8c791 100644 (file)
@@ -44,7 +44,7 @@ let {{
     exec_output = ""
 
     calcGECode = '''
-        CondCodesGE = insertBits(0, 19, 16, resTemp);
+        CondCodesGE = resTemp;
     '''
 
     calcQCode = '''
@@ -58,15 +58,17 @@ let {{
         _iv = %(ivValue)s & 1;
         _ic = %(icValue)s & 1;
 
-        CondCodesF =  _in << 31 | _iz << 30 | _ic << 29 | _iv << 28;
+        CondCodesNZ = (_in << 1) | _iz;
+        CondCodesC =  _ic;
+        CondCodesV =  _iv;
 
         DPRINTF(Arm, "(in, iz, ic, iv) = (%%d, %%d, %%d, %%d)\\n",
                      _in, _iz, _ic, _iv);
        '''
 
     # Dict of code to set the carry flag. (imm, reg, reg-reg)
-    oldC = 'CondCodesF<29:>'
-    oldV = 'CondCodesF<28:>'
+    oldC = 'CondCodesC'
+    oldV = 'CondCodesV'
     carryCode = {
         "none": (oldC, oldC, oldC),
         "llbit": (oldC, oldC, oldC),
@@ -101,8 +103,8 @@ let {{
 
     secondOpRe = re.compile("secondOp")
     immOp2 = "imm"
-    regOp2 = "shift_rm_imm(Op2, shiftAmt, shiftType, CondCodesF<29:>)"
-    regRegOp2 = "shift_rm_rs(Op2, Shift<7:0>, shiftType, CondCodesF<29:>)"
+    regOp2 = "shift_rm_imm(Op2, shiftAmt, shiftType, CondCodesC)"
+    regRegOp2 = "shift_rm_rs(Op2, Shift<7:0>, shiftType, CondCodesC)"
 
     def buildImmDataInst(mnem, code, flagType = "logic", suffix = "Imm", \
                          buildCc = True, buildNonCc = True, instFlags = []):
@@ -238,16 +240,24 @@ let {{
         if subsPcLr:
             code += '''
             SCTLR sctlr = Sctlr;
-            uint32_t newCpsr =
-                cpsrWriteByInstr(Cpsr | CondCodesF | CondCodesGE,
-                                 Spsr, 0xF, true, sctlr.nmfi);
-            Cpsr = ~CondCodesMask & newCpsr;
-            CondCodesF = CondCodesMaskF & newCpsr;
-            CondCodesGE = CondCodesMaskGE & newCpsr;
-            NextThumb = ((CPSR)newCpsr).t;
-            NextJazelle = ((CPSR)newCpsr).j;
-            NextItState = ((((CPSR)newCpsr).it2 << 2) & 0xFC)
-                | (((CPSR)newCpsr).it1 & 0x3);
+            CPSR old_cpsr = Cpsr;
+            old_cpsr.nz = CondCodesNZ;
+            old_cpsr.c = CondCodesC;
+            old_cpsr.v = CondCodesV;
+            old_cpsr.ge = CondCodesGE;
+
+            CPSR new_cpsr =
+                cpsrWriteByInstr(old_cpsr, Spsr, 0xF, true, sctlr.nmfi);
+            Cpsr = ~CondCodesMask & new_cpsr;
+            CondCodesNZ = new_cpsr.nz;
+            CondCodesC = new_cpsr.c;
+            CondCodesV = new_cpsr.v;
+            CondCodesGE = new_cpsr.ge;
+
+            NextThumb = (new_cpsr).t;
+            NextJazelle = (new_cpsr).j;
+            NextItState = (((new_cpsr).it2 << 2) & 0xFC)
+                | ((new_cpsr).it1 & 0x3);
             SevMailbox = 1;
             '''
             buildImmDataInst(mnem + 's', code, flagType,
index 53d0b3413b4a466a43563bf0583a3593844f755b..73b3aa50e862fa2ce2ac151f935766e1f3db2863 100644 (file)
@@ -235,16 +235,18 @@ let {{
     decoder_output += FpRegRegOpConstructor.subst(vmrsFpscrIop);
     exec_output += PredOpExecute.subst(vmrsFpscrIop);
 
-    vmrsApsrFpscrCode = vmrsEnabledCheckCode + '''
-        Dest = FpCondCodes & FpCondCodesMask;
+    vmrsApsrFpscrCode = vmrsApsrEnabledCheckCode + '''
+        FPSCR fpscr = FpCondCodes;
+        CondCodesNZ = (fpscr.n << 1) | fpscr.z;
+        CondCodesC = fpscr.c;
+        CondCodesV = fpscr.v;
     '''
-    vmrsApsrFpscrIop = InstObjParams("vmrs", "VmrsApsrFpscr", "FpRegRegImmOp",
+    vmrsApsrFpscrIop = InstObjParams("vmrs", "VmrsApsrFpscr", "PredOp",
                                      { "code": vmrsApsrFpscrCode,
                                        "predicate_test": predicateTest,
-                                       "op_class": "SimdFloatMiscOp" },
-                                     ["IsSerializeBefore"])
-    header_output += FpRegRegImmOpDeclare.subst(vmrsApsrFpscrIop);
-    decoder_output += FpRegRegImmOpConstructor.subst(vmrsApsrFpscrIop);
+                                       "op_class": "SimdFloatMiscOp" })
+    header_output += BasicDeclare.subst(vmrsApsrFpscrIop);
+    decoder_output += BasicConstructor.subst(vmrsApsrFpscrIop);
     exec_output += PredOpExecute.subst(vmrsApsrFpscrIop);
 
     vmovImmSCode = vfpEnabledCheckCode + '''
index 9211983d4010772018e35ea2eb96fc37e8135228..a346c495a875edd2dce07cb439753fa87d816a2c 100644 (file)
@@ -106,7 +106,11 @@ let {{
                 wbDiff = 8
             accCode = '''
             CPSR cpsr = Cpsr;
-            URc = cpsr | CondCodesF | CondCodesGE;
+            cpsr.nz = CondCodesNZ;
+            cpsr.c = CondCodesC;
+            cpsr.v = CondCodesV;
+            cpsr.ge = CondCodesGE;
+            URc = cpsr;
             URa = cSwap<uint32_t>(Mem.ud, cpsr.e);
             URb = cSwap<uint32_t>(Mem.ud >> 32, cpsr.e);
             '''
@@ -137,7 +141,7 @@ let {{
         def __init__(self, *args, **kargs):
             super(LoadRegInst, self).__init__(*args, **kargs)
             self.offset = self.op + " shift_rm_imm(Index, shiftAmt," + \
-                                    " shiftType, CondCodesF<29:>)"
+                                    " shiftType, CondCodesC)"
             if self.add:
                  self.wbDecl = '''
                      MicroAddUop(machInst, base, base, wbIndexReg, shiftAmt, shiftType);
index 8523b840ce61dddd3d1b484dc9bea002d97ab23d..31545d3a40d123cc566dbc68ca44971081735e7c 100644 (file)
@@ -87,15 +87,21 @@ let {{
                                       ['IsMicroop'])
 
     microRetUopCode = '''
-        CPSR cpsr = Cpsr;
+        CPSR old_cpsr = Cpsr;
         SCTLR sctlr = Sctlr;
-        uint32_t newCpsr =
-            cpsrWriteByInstr(cpsr | CondCodesF | CondCodesGE,
-                             Spsr, 0xF, true, sctlr.nmfi);
-        Cpsr = ~CondCodesMask & newCpsr;
-        CondCodesF = CondCodesMaskF & newCpsr;
-        CondCodesGE = CondCodesMaskGE & newCpsr;
-        IWNPC = cSwap(%s, cpsr.e) | ((Spsr & 0x20) ? 1 : 0);
+        old_cpsr.nz = CondCodesNZ;
+        old_cpsr.c = CondCodesC;
+        old_cpsr.v = CondCodesV;
+        old_cpsr.ge = CondCodesGE;
+
+        CPSR new_cpsr =
+            cpsrWriteByInstr(old_cpsr, Spsr, 0xF, true, sctlr.nmfi);
+        Cpsr = ~CondCodesMask & new_cpsr;
+        CondCodesNZ = new_cpsr.nz;
+        CondCodesC = new_cpsr.c;
+        CondCodesV = new_cpsr.v;
+        CondCodesGE = new_cpsr.ge;
+        IWNPC = cSwap(%s, old_cpsr.e) | ((Spsr & 0x20) ? 1 : 0);
         NextItState = ((((CPSR)Spsr).it2 << 2) & 0xFC)
                 | (((CPSR)Spsr).it1 & 0x3);
         SevMailbox = 1;
@@ -587,7 +593,7 @@ let {{
                                    {'code':
                                     '''URa = URb + shift_rm_imm(URc, shiftAmt,
                                                               shiftType,
-                                                              CondCodesF<29:>);
+                                                              CondCodesC);
                                     ''',
                                     'predicate_test': predicateTest},
                                    ['IsMicroop'])
@@ -603,7 +609,7 @@ let {{
                                    {'code':
                                     '''URa = URb - shift_rm_imm(URc, shiftAmt,
                                                               shiftType,
-                                                              CondCodesF<29:>);
+                                                              CondCodesC);
                                     ''',
                                     'predicate_test': predicateTest},
                                    ['IsMicroop'])
@@ -625,16 +631,18 @@ let {{
                     CPSR cpsrOrCondCodes = URc;
                     SCTLR sctlr = Sctlr;
                     pNPC = URa;
-                    uint32_t newCpsr =
+                    CPSR new_cpsr =
                     cpsrWriteByInstr(cpsrOrCondCodes, URb,
                                      0xF, true, sctlr.nmfi);
-                    Cpsr = ~CondCodesMask & newCpsr;
-                    NextThumb = ((CPSR)newCpsr).t;
-                    NextJazelle = ((CPSR)newCpsr).j;
+                    Cpsr = ~CondCodesMask & new_cpsr;
+                    NextThumb = new_cpsr.t;
+                    NextJazelle = new_cpsr.j;
                     NextItState = ((((CPSR)URb).it2 << 2) & 0xFC)
                                     | (((CPSR)URb).it1 & 0x3);
-                    CondCodesF = CondCodesMaskF & newCpsr;
-                    CondCodesGE = CondCodesMaskGE & newCpsr;
+                    CondCodesNZ = new_cpsr.nz;
+                    CondCodesC = new_cpsr.c;
+                    CondCodesV = new_cpsr.v;
+                    CondCodesGE = new_cpsr.ge;
                     '''
 
     microUopSetPCCPSRIop = InstObjParams('uopSet_uop', 'MicroUopSetPCCPSR',
index 0ebd34ad4ee56d98a3e3fc3b60bd8825f14b2db0..cad0b1589d359723909cb52dd2615a241c32e6fa 100644 (file)
@@ -119,10 +119,35 @@ let {{
             return (header_output, decoder_output, exec_output)
 
     def pickPredicate(blobs):
+        opt_nz = True
+        opt_c = True
+        opt_v = True
         for val in blobs.values():
-            if re.search('(?<!Opt)CondCodesF', val):
-                return condPredicateTest
-        return predicateTest
+            if re.search('(?<!Opt)CondCodesNZ', val):
+                opt_nz = False
+            if re.search('(?<!Opt)CondCodesC', val):
+                opt_c = False
+            if re.search('(?<!Opt)CondCodesV', val):
+                opt_v = False
+
+        # Build up the predicate piece by piece depending on which
+        # flags the instruction needs
+        predicate = 'testPredicate('
+        if opt_nz:
+            predicate += 'OptCondCodesNZ, '
+        else:
+            predicate += 'CondCodesNZ, '
+        if opt_c:
+            predicate += 'OptCondCodesC, '
+        else:
+            predicate += 'CondCodesC, '
+        if opt_v:
+            predicate += 'OptCondCodesV, '
+        else:
+            predicate += 'CondCodesV, '
+        predicate += 'condCode)'
+
+        return predicate
 
     def memClassName(base, post, add, writeback, \
                      size=4, sign=False, user=False):
index c223842127a2714db920b46aa653d16ad6d9df6b..c270db4993e5e4df275716190d306a5bfc8c5bec 100644 (file)
@@ -61,7 +61,12 @@ let {{
     header_output = decoder_output = exec_output = ""
 
     mrsCpsrCode = '''
-        Dest = (Cpsr | CondCodesF | CondCodesGE) & 0xF8FF03DF
+        CPSR cpsr = Cpsr;
+        cpsr.nz = CondCodesNZ;
+        cpsr.c = CondCodesC;
+        cpsr.v = CondCodesV;
+        cpsr.ge = CondCodesGE;
+        Dest = cpsr & 0xF8FF03DF
     '''
 
     mrsCpsrIop = InstObjParams("mrs", "MrsCpsr", "MrsOp",
@@ -83,12 +88,19 @@ let {{
 
     msrCpsrRegCode = '''
         SCTLR sctlr = Sctlr;
-        uint32_t newCpsr =
-            cpsrWriteByInstr(Cpsr | CondCodesF |  CondCodesGE, Op1,
-                             byteMask, false, sctlr.nmfi);
-        Cpsr = ~CondCodesMask & newCpsr;
-        CondCodesF = CondCodesMaskF & newCpsr;
-        CondCodesGE = CondCodesMaskGE & newCpsr;
+        CPSR old_cpsr = Cpsr;
+        old_cpsr.nz = CondCodesNZ;
+        old_cpsr.c = CondCodesC;
+        old_cpsr.v = CondCodesV;
+        old_cpsr.ge = CondCodesGE;
+
+        CPSR new_cpsr =
+            cpsrWriteByInstr(old_cpsr, Op1, byteMask, false, sctlr.nmfi);
+        Cpsr = ~CondCodesMask & new_cpsr;
+        CondCodesNZ = new_cpsr.nz;
+        CondCodesC = new_cpsr.c;
+        CondCodesV = new_cpsr.v;
+        CondCodesGE = new_cpsr.ge;
     '''
     msrCpsrRegIop = InstObjParams("msr", "MsrCpsrReg", "MsrRegOp",
                                   { "code": msrCpsrRegCode,
@@ -109,12 +121,18 @@ let {{
 
     msrCpsrImmCode = '''
         SCTLR sctlr = Sctlr;
-        uint32_t newCpsr =
-            cpsrWriteByInstr(Cpsr | CondCodesF | CondCodesGE, imm,
-                             byteMask, false, sctlr.nmfi);
-        Cpsr = ~CondCodesMask & newCpsr;
-        CondCodesF = CondCodesMaskF & newCpsr;
-        CondCodesGE = CondCodesMaskGE & newCpsr;
+        CPSR old_cpsr = Cpsr;
+        old_cpsr.nz = CondCodesNZ;
+        old_cpsr.c = CondCodesC;
+        old_cpsr.v = CondCodesV;
+        old_cpsr.ge = CondCodesGE;
+        CPSR new_cpsr =
+            cpsrWriteByInstr(old_cpsr, imm, byteMask, false, sctlr.nmfi);
+        Cpsr = ~CondCodesMask & new_cpsr;
+        CondCodesNZ = new_cpsr.nz;
+        CondCodesC = new_cpsr.c;
+        CondCodesV = new_cpsr.v;
+        CondCodesGE = new_cpsr.ge;
     '''
     msrCpsrImmIop = InstObjParams("msr", "MsrCpsrImm", "MsrImmOp",
                                   { "code": msrCpsrImmCode,
@@ -415,14 +433,14 @@ let {{
             int low = i * 8;
             int high = low + 7;
             replaceBits(resTemp, high, low,
-                        bits(CondCodesGE, 16 + i) ?
+                        bits(CondCodesGE, i) ?
                             bits(Op1, high, low) : bits(Op2, high, low));
         }
         Dest = resTemp;
     '''
     selIop = InstObjParams("sel", "Sel", "RegRegRegOp",
                            { "code": selCode,
-                             "predicate_test": condPredicateTest }, [])
+                             "predicate_test": predicateTest }, [])
     header_output += RegRegRegOpDeclare.subst(selIop)
     decoder_output += RegRegRegOpConstructor.subst(selIop)
     exec_output += PredOpExecute.subst(selIop)
index 31febe74700c8135c213170e1fb2db07cbe0f8e1..f4f8b867eef6fa7ef1a3a5de5a30b3bebd63dee6 100644 (file)
@@ -52,7 +52,7 @@ let {{
         _in = (resTemp >> %(negBit)d) & 1;
         _iz = ((%(zType)s)resTemp == 0);
 
-        CondCodesF =  _in << 31 | _iz << 30 | (CondCodesF & 0x3FFFFFFF);
+        CondCodesNZ = (_in << 1) | _iz;
 
         DPRINTF(Arm, "(in, iz) = (%%d, %%d)\\n", _in, _iz);
        '''
index 312bcac16f47c3b5aa310c4f00850a6fa9ec79dd..95ba4ad391a80db70ad010a6185da22994a65d32 100644 (file)
@@ -152,7 +152,7 @@ let {{
         def __init__(self, *args, **kargs):
             super(StoreRegInst, self).__init__(*args, **kargs)
             self.offset = self.op + " shift_rm_imm(Index, shiftAmt," + \
-                                    " shiftType, CondCodesF<29:>)"
+                                    " shiftType, CondCodesC)"
             if self.add:
                  self.wbDecl = '''
                      MicroAddUop(machInst, base, base, index, shiftAmt, shiftType);
index ead058b4c8596c7d3cdea90bdc0c3661364e9170..058cc94f3c64be6c052d7b4a16e3c80fc90ffb53 100644 (file)
@@ -156,11 +156,24 @@ def operands {{
     'R3': intRegNPC('3'),
 
     #Pseudo integer condition code registers
-    'CondCodesF': intRegCC('INTREG_CONDCODES_F'),
+    'CondCodesNZ': intRegCC('INTREG_CONDCODES_NZ'),
+    'CondCodesC': intRegCC('INTREG_CONDCODES_C'),
+    'CondCodesV': intRegCC('INTREG_CONDCODES_V'),
     'CondCodesGE': intRegCC('INTREG_CONDCODES_GE'),
-    'OptCondCodesF': intRegCC(
-            '''(condCode == COND_AL || condCode == COND_UC) ?
-               INTREG_ZERO : INTREG_CONDCODES_F'''),
+    'OptCondCodesNZ': intRegCC(
+            '''(condCode == COND_AL || condCode == COND_UC ||
+                condCode == COND_CC || condCode == COND_CS ||
+                condCode == COND_VS || condCode == COND_VC) ?
+               INTREG_ZERO : INTREG_CONDCODES_NZ'''),
+    'OptCondCodesC': intRegCC(
+            '''(condCode == COND_HI || condCode == COND_LS ||
+                condCode == COND_CS || condCode == COND_CC) ?
+               INTREG_CONDCODES_C : INTREG_ZERO'''),
+    'OptCondCodesV': intRegCC(
+            '''(condCode == COND_VS || condCode == COND_VC ||
+                condCode == COND_GE || condCode == COND_LT ||
+                condCode == COND_GT || condCode == COND_LE) ?
+               INTREG_CONDCODES_V : INTREG_ZERO'''),
     'FpCondCodes': intRegCC('INTREG_FPCONDCODES'),
 
     #Abstracted floating point reg operands
index a0f811f6de5313c538163972d25e18b5421e1555..04f253ca94bfc6e113d90d83470d7d975faee7e1 100644 (file)
@@ -46,8 +46,8 @@
 //
 
 let {{
-    predicateTest = 'testPredicate(OptCondCodesF, condCode)'
-    condPredicateTest = 'testPredicate(CondCodesF, condCode)'
+    predicateTest = 'testPredicate(OptCondCodesNZ, OptCondCodesC, OptCondCodesV, condCode)'
+    condPredicateTest = 'testPredicate(CondCodesNZ, CondCodesC, CondCodesV, condCode)'
 }};
 
 def template DataImmDeclare {{
index 8888dc0ae9d98fe35f3e94bba619d24d0dba0d40..90dd751ff828da7142b3921c15108c1164408729 100644 (file)
@@ -62,6 +62,10 @@ let {{
             if (op1 != (int)MISCREG_FPSCR)
                 return disabledFault();
     '''
+    vmrsApsrEnabledCheckCode = '''
+        if (!vfpEnabled(Cpacr, Cpsr))
+                return disabledFault();
+    '''
 }};
 
 def template FpRegRegOpDeclare {{
index 7f16924f259234dfb1bf8bfc61eabfbae8589a64..5fe762ebe7078147e668f6ee5b2778a7433e5012 100644 (file)
@@ -251,8 +251,7 @@ namespace ArmISA
     };
 
     BitUnion32(CPSR)
-        Bitfield<31> n;
-        Bitfield<30> z;
+        Bitfield<31,30> nz;
         Bitfield<29> c;
         Bitfield<28> v;
         Bitfield<27> q;
@@ -271,9 +270,7 @@ namespace ArmISA
     // This mask selects bits of the CPSR that actually go in the CondCodes
     // integer register to allow renaming.
     static const uint32_t CondCodesMask   = 0xF00F0000;
-    static const uint32_t CondCodesMaskF  = 0xF0000000;
     static const uint32_t CpsrMaskQ       = 0x08000000;
-    static const uint32_t CondCodesMaskGE = 0x000F0000;
 
     BitUnion32(SCTLR)
         Bitfield<31> ie;  // Instruction endianness
index bc42f8e9d02f6af5cb4bb9da44e893d2b6dcb8a8..e276833e237ff0847b7cbf74c8ca23e45906dead 100644 (file)
@@ -115,9 +115,13 @@ Trace::ArmNativeTrace::ThreadState::update(ThreadContext *tc)
     changed[STATE_PC] = (newState[STATE_PC] != oldState[STATE_PC]);
 
     //CPSR
-    newState[STATE_CPSR] = tc->readMiscReg(MISCREG_CPSR) |
-                           tc->readIntReg(INTREG_CONDCODES_F) |
-                           tc->readIntReg(INTREG_CONDCODES_GE);
+    CPSR cpsr = tc->readMiscReg(MISCREG_CPSR);
+    cpsr.nz = tc->readIntReg(INTREG_CONDCODES_NZ);
+    cpsr.c = tc->readIntReg(INTREG_CONDCODES_C);
+    cpsr.v = tc->readIntReg(INTREG_CONDCODES_V);
+    cpsr.ge = tc->readIntReg(INTREG_CONDCODES_GE);
+
+    newState[STATE_CPSR] = cpsr;
     changed[STATE_CPSR] = (newState[STATE_CPSR] != oldState[STATE_CPSR]);
 
     for (int i = 0; i < NumFloatArchRegs; i += 2) {
index 8ad3de66aa2a0049796949d3bea6600d392e1715..ffd41791c5cc82c175a8b05663f0fbf0c41a3b3b 100644 (file)
@@ -65,24 +65,27 @@ buildRetPC(const PCState &curPC, const PCState &callPC)
 }
 
 inline bool
-testPredicate(CPSR cpsr, ConditionCode code)
+testPredicate(uint32_t nz, uint32_t c, uint32_t v, ConditionCode code)
 {
+    bool n = (nz & 0x2);
+    bool z = (nz & 0x1);
+
     switch (code)
     {
-        case COND_EQ: return  cpsr.z;
-        case COND_NE: return !cpsr.z;
-        case COND_CS: return  cpsr.c;
-        case COND_CC: return !cpsr.c;
-        case COND_MI: return  cpsr.n;
-        case COND_PL: return !cpsr.n;
-        case COND_VS: return  cpsr.v;
-        case COND_VC: return !cpsr.v;
-        case COND_HI: return  (cpsr.c && !cpsr.z);
-        case COND_LS: return !(cpsr.c && !cpsr.z);
-        case COND_GE: return !(cpsr.n ^ cpsr.v);
-        case COND_LT: return  (cpsr.n ^ cpsr.v);
-        case COND_GT: return !(cpsr.n ^ cpsr.v || cpsr.z);
-        case COND_LE: return  (cpsr.n ^ cpsr.v || cpsr.z);
+        case COND_EQ: return  z;
+        case COND_NE: return !z;
+        case COND_CS: return  c;
+        case COND_CC: return !c;
+        case COND_MI: return  n;
+        case COND_PL: return !n;
+        case COND_VS: return  v;
+        case COND_VC: return !v;
+        case COND_HI: return  (c && !z);
+        case COND_LS: return !(c && !z);
+        case COND_GE: return !(n ^ v);
+        case COND_LT: return  (n ^ v);
+        case COND_GT: return !(n ^ v || z);
+        case COND_LE: return  (n ^ v || z);
         case COND_AL: return true;
         case COND_UC: return true;
         default: