changeset 5a95f1d2494e in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=5a95f1d2494e
description:
        ARM: Further break up condition code into NZ, C, V bits.

        Break up the condition code bits into NZ, C, V registers. These are 
individually
        written and this removes some incorrect dependencies between 
instructions.

diffstat:

 src/arch/arm/faults.cc              |   9 ++++--
 src/arch/arm/intregs.hh             |   4 ++-
 src/arch/arm/isa/formats/fp.isa     |   8 +-----
 src/arch/arm/isa/formats/pred.isa   |  36 ++++++++++++++-------------
 src/arch/arm/isa/insts/data.isa     |  42 ++++++++++++++++++++------------
 src/arch/arm/isa/insts/fp.isa       |  16 ++++++-----
 src/arch/arm/isa/insts/ldr.isa      |   8 ++++-
 src/arch/arm/isa/insts/macromem.isa |  40 ++++++++++++++++++------------
 src/arch/arm/isa/insts/mem.isa      |  31 +++++++++++++++++++++--
 src/arch/arm/isa/insts/misc.isa     |  48 +++++++++++++++++++++++++-----------
 src/arch/arm/isa/insts/mult.isa     |   2 +-
 src/arch/arm/isa/insts/str.isa      |   2 +-
 src/arch/arm/isa/operands.isa       |  21 +++++++++++++---
 src/arch/arm/isa/templates/pred.isa |   4 +-
 src/arch/arm/isa/templates/vfp.isa  |   4 +++
 src/arch/arm/miscregs.hh            |   5 +---
 src/arch/arm/nativetrace.cc         |  10 +++++--
 src/arch/arm/utility.hh             |  33 +++++++++++++-----------
 18 files changed, 206 insertions(+), 117 deletions(-)

diffs (truncated from 646 to 300 lines):

diff -r 9f23d01421de -r 5a95f1d2494e src/arch/arm/faults.cc
--- a/src/arch/arm/faults.cc    Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/faults.cc    Fri May 13 17:27:01 2011 -0500
@@ -106,9 +106,12 @@
 
     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;
diff -r 9f23d01421de -r 5a95f1d2494e src/arch/arm/intregs.hh
--- a/src/arch/arm/intregs.hh   Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/intregs.hh   Fri May 13 17:27:01 2011 -0500
@@ -112,7 +112,9 @@
     INTREG_UREG0,
     INTREG_UREG1,
     INTREG_UREG2,
-    INTREG_CONDCODES_F,
+    INTREG_CONDCODES_NZ,
+    INTREG_CONDCODES_C,
+    INTREG_CONDCODES_V,
     INTREG_CONDCODES_GE,
     INTREG_FPCONDCODES,
 
diff -r 9f23d01421de -r 5a95f1d2494e src/arch/arm/isa/formats/fp.isa
--- a/src/arch/arm/isa/formats/fp.isa   Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/isa/formats/fp.isa   Fri May 13 17:27:01 2011 -0500
@@ -2068,14 +2068,8 @@
                     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);
                     }
diff -r 9f23d01421de -r 5a95f1d2494e src/arch/arm/isa/formats/pred.isa
--- a/src/arch/arm/isa/formats/pred.isa Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/isa/formats/pred.isa Fri May 13 17:27:01 2011 -0500
@@ -53,7 +53,9 @@
             _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 @@
         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 @@
             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 @@
         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 @@
             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,
diff -r 9f23d01421de -r 5a95f1d2494e src/arch/arm/isa/insts/data.isa
--- a/src/arch/arm/isa/insts/data.isa   Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/isa/insts/data.isa   Fri May 13 17:27:01 2011 -0500
@@ -44,7 +44,7 @@
     exec_output = ""
 
     calcGECode = '''
-        CondCodesGE = insertBits(0, 19, 16, resTemp);
+        CondCodesGE = resTemp;
     '''
 
     calcQCode = '''
@@ -58,15 +58,17 @@
         _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 @@
 
     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 @@
         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,
diff -r 9f23d01421de -r 5a95f1d2494e src/arch/arm/isa/insts/fp.isa
--- a/src/arch/arm/isa/insts/fp.isa     Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/isa/insts/fp.isa     Fri May 13 17:27:01 2011 -0500
@@ -235,16 +235,18 @@
     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 + '''
diff -r 9f23d01421de -r 5a95f1d2494e src/arch/arm/isa/insts/ldr.isa
--- a/src/arch/arm/isa/insts/ldr.isa    Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/isa/insts/ldr.isa    Fri May 13 17:27:01 2011 -0500
@@ -106,7 +106,11 @@
                 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 @@
         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);
diff -r 9f23d01421de -r 5a95f1d2494e src/arch/arm/isa/insts/macromem.isa
--- a/src/arch/arm/isa/insts/macromem.isa       Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/isa/insts/macromem.isa       Fri May 13 17:27:01 2011 -0500
@@ -87,15 +87,21 @@
                                       ['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);
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to