changeset 9f23d01421de in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=9f23d01421de
description:
        ARM: Remove the saturating (Q) condition code from the renamed register.

        Move the saturating bit (which is also saturating) from the renamed 
register
        that holds the flags to the CPSR miscreg and adds a allows setting it 
in a
        similar way to the FP saturating registers. This removes a dependency in
        instructions that don't write, but need to preserve the Q bit.

diffstat:

 src/arch/arm/faults.cc              |   1 -
 src/arch/arm/intregs.hh             |   1 -
 src/arch/arm/isa.cc                 |   9 +++++++++
 src/arch/arm/isa/insts/data.isa     |   5 ++---
 src/arch/arm/isa/insts/ldr.isa      |   2 +-
 src/arch/arm/isa/insts/macromem.isa |   4 +---
 src/arch/arm/isa/insts/misc.isa     |  26 +++++++++-----------------
 src/arch/arm/isa/insts/mult.isa     |   2 +-
 src/arch/arm/isa/operands.isa       |   2 +-
 src/arch/arm/miscregs.hh            |   7 ++++---
 src/arch/arm/nativetrace.cc         |   1 -
 11 files changed, 28 insertions(+), 32 deletions(-)

diffs (277 lines):

diff -r 858384f3af1c -r 9f23d01421de 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
@@ -108,7 +108,6 @@
     CPSR cpsr = tc->readMiscReg(MISCREG_CPSR);
     CPSR saved_cpsr = tc->readMiscReg(MISCREG_CPSR) | 
                       tc->readIntReg(INTREG_CONDCODES_F) |
-                      tc->readIntReg(INTREG_CONDCODES_Q) |
                       tc->readIntReg(INTREG_CONDCODES_GE);
     Addr curPc M5_VAR_USED = tc->pcState().pc();
     ITSTATE it = tc->pcState().itstate();
diff -r 858384f3af1c -r 9f23d01421de 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
@@ -113,7 +113,6 @@
     INTREG_UREG1,
     INTREG_UREG2,
     INTREG_CONDCODES_F,
-    INTREG_CONDCODES_Q,
     INTREG_CONDCODES_GE,
     INTREG_FPCONDCODES,
 
diff -r 858384f3af1c -r 9f23d01421de src/arch/arm/isa.cc
--- a/src/arch/arm/isa.cc       Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/isa.cc       Fri May 13 17:27:01 2011 -0500
@@ -216,6 +216,8 @@
         warn("Not doing anything for read to miscreg %s\n",
                 miscRegName[misc_reg]);
         break;
+      case MISCREG_CPSR_Q:
+        panic("shouldn't be reading this register seperately\n");
       case MISCREG_FPSCR_QC:
         return readMiscRegNoEffect(MISCREG_FPSCR) & ~FpscrQcMask;
       case MISCREG_FPSCR_EXC:
@@ -316,6 +318,13 @@
                          (miscRegs[MISCREG_FPSCR] & ~(uint32_t)fpscrMask);
             }
             break;
+          case MISCREG_CPSR_Q:
+            {
+                assert(!(newVal & ~CpsrMaskQ));
+                newVal = miscRegs[MISCREG_CPSR] | newVal;
+                misc_reg = MISCREG_CPSR;
+            }
+            break;
           case MISCREG_FPSCR_QC:
             {
                 newVal = miscRegs[MISCREG_FPSCR] | (newVal & FpscrQcMask);
diff -r 858384f3af1c -r 9f23d01421de 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
@@ -48,7 +48,7 @@
     '''
 
     calcQCode = '''
-        CondCodesQ = CondCodesQ | ((resTemp & 1) << 27);
+        CpsrQ = (resTemp & 1) << 27;
     '''
 
     calcCcCode = '''
@@ -239,11 +239,10 @@
             code += '''
             SCTLR sctlr = Sctlr;
             uint32_t newCpsr =
-                cpsrWriteByInstr(Cpsr | CondCodesF | CondCodesQ | CondCodesGE,
+                cpsrWriteByInstr(Cpsr | CondCodesF | CondCodesGE,
                                  Spsr, 0xF, true, sctlr.nmfi);
             Cpsr = ~CondCodesMask & newCpsr;
             CondCodesF = CondCodesMaskF & newCpsr;
-            CondCodesQ = CondCodesMaskQ & newCpsr;
             CondCodesGE = CondCodesMaskGE & newCpsr;
             NextThumb = ((CPSR)newCpsr).t;
             NextJazelle = ((CPSR)newCpsr).j;
diff -r 858384f3af1c -r 9f23d01421de 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,7 @@
                 wbDiff = 8
             accCode = '''
             CPSR cpsr = Cpsr;
-            URc = cpsr | CondCodesF | CondCodesQ | CondCodesGE;
+            URc = cpsr | CondCodesF | CondCodesGE;
             URa = cSwap<uint32_t>(Mem.ud, cpsr.e);
             URb = cSwap<uint32_t>(Mem.ud >> 32, cpsr.e);
             '''
diff -r 858384f3af1c -r 9f23d01421de 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
@@ -90,11 +90,10 @@
         CPSR cpsr = Cpsr;
         SCTLR sctlr = Sctlr;
         uint32_t newCpsr =
-            cpsrWriteByInstr(cpsr | CondCodesF | CondCodesQ | CondCodesGE,
+            cpsrWriteByInstr(cpsr | CondCodesF | CondCodesGE,
                              Spsr, 0xF, true, sctlr.nmfi);
         Cpsr = ~CondCodesMask & newCpsr;
         CondCodesF = CondCodesMaskF & newCpsr;
-        CondCodesQ = CondCodesMaskQ & newCpsr;
         CondCodesGE = CondCodesMaskGE & newCpsr;
         IWNPC = cSwap(%s, cpsr.e) | ((Spsr & 0x20) ? 1 : 0);
         NextItState = ((((CPSR)Spsr).it2 << 2) & 0xFC)
@@ -635,7 +634,6 @@
                     NextItState = ((((CPSR)URb).it2 << 2) & 0xFC)
                                     | (((CPSR)URb).it1 & 0x3);
                     CondCodesF = CondCodesMaskF & newCpsr;
-                    CondCodesQ = CondCodesMaskQ & newCpsr;
                     CondCodesGE = CondCodesMaskGE & newCpsr;
                     '''
 
diff -r 858384f3af1c -r 9f23d01421de src/arch/arm/isa/insts/misc.isa
--- a/src/arch/arm/isa/insts/misc.isa   Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/isa/insts/misc.isa   Fri May 13 17:27:01 2011 -0500
@@ -61,7 +61,7 @@
     header_output = decoder_output = exec_output = ""
 
     mrsCpsrCode = '''
-        Dest = (Cpsr | CondCodesF | CondCodesQ | CondCodesGE) & 0xF8FF03DF
+        Dest = (Cpsr | CondCodesF | CondCodesGE) & 0xF8FF03DF
     '''
 
     mrsCpsrIop = InstObjParams("mrs", "MrsCpsr", "MrsOp",
@@ -84,11 +84,10 @@
     msrCpsrRegCode = '''
         SCTLR sctlr = Sctlr;
         uint32_t newCpsr =
-            cpsrWriteByInstr(Cpsr | CondCodesF | CondCodesQ | CondCodesGE, Op1,
+            cpsrWriteByInstr(Cpsr | CondCodesF |  CondCodesGE, Op1,
                              byteMask, false, sctlr.nmfi);
         Cpsr = ~CondCodesMask & newCpsr;
         CondCodesF = CondCodesMaskF & newCpsr;
-        CondCodesQ = CondCodesMaskQ & newCpsr;
         CondCodesGE = CondCodesMaskGE & newCpsr;
     '''
     msrCpsrRegIop = InstObjParams("msr", "MsrCpsrReg", "MsrRegOp",
@@ -111,11 +110,10 @@
     msrCpsrImmCode = '''
         SCTLR sctlr = Sctlr;
         uint32_t newCpsr =
-            cpsrWriteByInstr(Cpsr | CondCodesF | CondCodesQ | CondCodesGE, imm,
+            cpsrWriteByInstr(Cpsr | CondCodesF | CondCodesGE, imm,
                              byteMask, false, sctlr.nmfi);
         Cpsr = ~CondCodesMask & newCpsr;
         CondCodesF = CondCodesMaskF & newCpsr;
-        CondCodesQ = CondCodesMaskQ & newCpsr;
         CondCodesGE = CondCodesMaskGE & newCpsr;
     '''
     msrCpsrImmIop = InstObjParams("msr", "MsrCpsrImm", "MsrImmOp",
@@ -205,9 +203,7 @@
         int32_t operand = shift_rm_imm(Op1, shiftAmt, shiftType, 0);
         int32_t res;
         if (satInt(res, operand, imm))
-            CondCodesQ = CondCodesQ | (1 << 27);
-        else
-            CondCodesQ = CondCodesQ;
+            CpsrQ = 1 << 27;
         Dest = res;
     '''
     ssatIop = InstObjParams("ssat", "Ssat", "RegImmRegShiftOp",
@@ -221,9 +217,7 @@
         int32_t operand = shift_rm_imm(Op1, shiftAmt, shiftType, 0);
         int32_t res;
         if (uSatInt(res, operand, imm))
-            CondCodesQ = CondCodesQ | (1 << 27);
-        else
-            CondCodesQ = CondCodesQ;
+            CpsrQ = 1 << 27;
         Dest = res;
     '''
     usatIop = InstObjParams("usat", "Usat", "RegImmRegShiftOp",
@@ -236,14 +230,13 @@
     ssat16Code = '''
         int32_t res;
         uint32_t resTemp = 0;
-        CondCodesQ = CondCodesQ;
         int32_t argLow = sext<16>(bits(Op1, 15, 0));
         int32_t argHigh = sext<16>(bits(Op1, 31, 16));
         if (satInt(res, argLow, imm))
-            CondCodesQ = CondCodesQ | (1 << 27);
+            CpsrQ = 1 << 27;
         replaceBits(resTemp, 15, 0, res);
         if (satInt(res, argHigh, imm))
-            CondCodesQ = CondCodesQ | (1 << 27);
+            CpsrQ = 1 << 27;
         replaceBits(resTemp, 31, 16, res);
         Dest = resTemp;
     '''
@@ -257,14 +250,13 @@
     usat16Code = '''
         int32_t res;
         uint32_t resTemp = 0;
-        CondCodesQ = CondCodesQ;
         int32_t argLow = sext<16>(bits(Op1, 15, 0));
         int32_t argHigh = sext<16>(bits(Op1, 31, 16));
         if (uSatInt(res, argLow, imm))
-            CondCodesQ = CondCodesQ | (1 << 27);
+            CpsrQ = 1 << 27;
         replaceBits(resTemp, 15, 0, res);
         if (uSatInt(res, argHigh, imm))
-            CondCodesQ = CondCodesQ | (1 << 27);
+            CpsrQ = 1 << 27;
         replaceBits(resTemp, 31, 16, res);
         Dest = resTemp;
     '''
diff -r 858384f3af1c -r 9f23d01421de src/arch/arm/isa/insts/mult.isa
--- a/src/arch/arm/isa/insts/mult.isa   Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/isa/insts/mult.isa   Fri May 13 17:27:01 2011 -0500
@@ -44,7 +44,7 @@
     exec_output = ""
 
     calcQCode = '''
-        CondCodesQ = CondCodesQ | ((resTemp & 1) << 27);
+        CpsrQ = (resTemp & 1) << 27;
     '''
 
     calcCcCode = '''
diff -r 858384f3af1c -r 9f23d01421de src/arch/arm/isa/operands.isa
--- a/src/arch/arm/isa/operands.isa     Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/isa/operands.isa     Fri May 13 17:27:01 2011 -0500
@@ -157,7 +157,6 @@
 
     #Pseudo integer condition code registers
     'CondCodesF': intRegCC('INTREG_CONDCODES_F'),
-    'CondCodesQ': intRegCC('INTREG_CONDCODES_Q'),
     'CondCodesGE': intRegCC('INTREG_CONDCODES_GE'),
     'OptCondCodesF': intRegCC(
             '''(condCode == COND_AL || condCode == COND_UC) ?
@@ -219,6 +218,7 @@
 
     #Fixed index control regs
     'Cpsr': cntrlReg('MISCREG_CPSR', srtCpsr),
+    'CpsrQ': cntrlReg('MISCREG_CPSR_Q', srtCpsr),
     'Spsr': cntrlRegNC('MISCREG_SPSR'),
     'Fpsr': cntrlRegNC('MISCREG_FPSR'),
     'Fpsid': cntrlRegNC('MISCREG_FPSID'),
diff -r 858384f3af1c -r 9f23d01421de src/arch/arm/miscregs.hh
--- a/src/arch/arm/miscregs.hh  Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/miscregs.hh  Fri May 13 17:27:01 2011 -0500
@@ -67,6 +67,7 @@
 
     enum MiscRegIndex {
         MISCREG_CPSR = 0,
+        MISCREG_CPSR_Q,
         MISCREG_SPSR,
         MISCREG_SPSR_FIQ,
         MISCREG_SPSR_IRQ,
@@ -209,7 +210,7 @@
                                unsigned crm, unsigned opc2);
 
     const char * const miscRegName[NUM_MISCREGS] = {
-        "cpsr", "spsr", "spsr_fiq", "spsr_irq", "spsr_svc",
+        "cpsr", "cpsr_q", "spsr", "spsr_fiq", "spsr_irq", "spsr_svc",
         "spsr_mon", "spsr_und", "spsr_abt",
         "fpsr", "fpsid", "fpscr", "fpscr_qc", "fpscr_exc", "fpexc",
         "mvfr0", "mvfr1",
@@ -269,9 +270,9 @@
 
     // This mask selects bits of the CPSR that actually go in the CondCodes
     // integer register to allow renaming.
-    static const uint32_t CondCodesMask   = 0xF80F0000;
+    static const uint32_t CondCodesMask   = 0xF00F0000;
     static const uint32_t CondCodesMaskF  = 0xF0000000;
-    static const uint32_t CondCodesMaskQ  = 0x08000000;
+    static const uint32_t CpsrMaskQ       = 0x08000000;
     static const uint32_t CondCodesMaskGE = 0x000F0000;
 
     BitUnion32(SCTLR)
diff -r 858384f3af1c -r 9f23d01421de src/arch/arm/nativetrace.cc
--- a/src/arch/arm/nativetrace.cc       Fri May 13 17:27:01 2011 -0500
+++ b/src/arch/arm/nativetrace.cc       Fri May 13 17:27:01 2011 -0500
@@ -117,7 +117,6 @@
     //CPSR
     newState[STATE_CPSR] = tc->readMiscReg(MISCREG_CPSR) |
                            tc->readIntReg(INTREG_CONDCODES_F) |
-                           tc->readIntReg(INTREG_CONDCODES_Q) |
                            tc->readIntReg(INTREG_CONDCODES_GE);
     changed[STATE_CPSR] = (newState[STATE_CPSR] != oldState[STATE_CPSR]);
 
_______________________________________________
m5-dev mailing list
m5-dev@m5sim.org
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to