ARM: Use custom read/write code to alias R15 with the PC.
authorGabe Black <gblack@eecs.umich.edu>
Thu, 9 Jul 2009 06:02:20 +0000 (23:02 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Thu, 9 Jul 2009 06:02:20 +0000 (23:02 -0700)
src/arch/arm/isa/operands.isa
src/arch/arm/regfile/regfile.hh

index c9df79e1eb25ee5cfc255b1d2d4b5e13d5f9a608..fa41918c153f19f21180a2ff1cfcba8b664a1260 100644 (file)
@@ -40,16 +40,27 @@ def operand_types {{
     'df' : ('float', 64)
 }};
 
+let {{
+    maybePCRead = '''
+        ((%(reg_idx)s == PCReg) ? (xc->readPC() + 8) :
+         xc->%(func)s(this, %(op_idx)s))
+    '''
+    maybePCWrite = '''
+        ((%(reg_idx)s == PCReg) ? xc->setNextPC(%(final_val)s) :
+         xc->%(func)s(this, %(op_idx)s, %(final_val)s))
+    '''
+}};
+
 def operands {{
     #General Purpose Integer Reg Operands
-    'Rd': ('IntReg', 'uw', 'RD', 'IsInteger', 1),
-    'Rm': ('IntReg', 'uw', 'RM', 'IsInteger', 2),
-    'Rs': ('IntReg', 'uw', 'RS', 'IsInteger', 3),
-    'Rn': ('IntReg', 'uw', 'RN', 'IsInteger', 4),
+    'Rd': ('IntReg', 'uw', 'RD', 'IsInteger', 1, maybePCRead, maybePCWrite),
+    'Rm': ('IntReg', 'uw', 'RM', 'IsInteger', 2, maybePCRead, maybePCWrite),
+    'Rs': ('IntReg', 'uw', 'RS', 'IsInteger', 3, maybePCRead, maybePCWrite),
+    'Rn': ('IntReg', 'uw', 'RN', 'IsInteger', 4, maybePCRead, maybePCWrite),
 
     #Destination register for load/store double instructions
-    'Rdo': ('IntReg', 'uw', '(RD & ~1)', 'IsInteger', 4),
-    'Rde': ('IntReg', 'uw', '(RD | 1)', 'IsInteger', 5),
+    'Rdo': ('IntReg', 'uw', '(RD & ~1)', 'IsInteger', 4, maybePCRead, maybePCWrite),
+    'Rde': ('IntReg', 'uw', '(RD | 1)', 'IsInteger', 5, maybePCRead, maybePCWrite),
 
     'Raddr': ('IntReg', 'uw', '17', 'IsInteger', 6),
     'Rhi': ('IntReg', 'uw', '18', 'IsInteger', 7),
@@ -57,8 +68,8 @@ def operands {{
     'LR': ('IntReg', 'uw', '14', 'IsInteger', 9),
 
     #Register fields for microops
-    'Ra' : ('IntReg', 'uw', 'ura', 'IsInteger', 11),
-    'Rb' : ('IntReg', 'uw', 'urb', 'IsInteger', 12),
+    'Ra' : ('IntReg', 'uw', 'ura', 'IsInteger', 11, maybePCRead, maybePCWrite),
+    'Rb' : ('IntReg', 'uw', 'urb', 'IsInteger', 12, maybePCRead, maybePCWrite),
 
     #General Purpose Floating Point Reg Operands
     'Fd': ('FloatReg', 'df', 'FD', 'IsFloating', 20),
index 7f4d2135396acbfa7b8d1fa954220b2ef62a4944..5a812fecfecbf6ebcd0613b1f35e7365e67da749 100644 (file)
@@ -122,22 +122,12 @@ namespace ArmISA
 
         IntReg readIntReg(int intReg)
         {
-            // In the Arm, reading from the PC for a generic instruction yields
-            // the current PC + 8, due to previous pipeline implementations
-            if (intReg == PCReg)
-                return intRegFile.readReg(intReg) + 8;
-                //return pc + 8;
-            else
-                return intRegFile.readReg(intReg);
+            return intRegFile.readReg(intReg);
         }
 
         void setIntReg(int intReg, const IntReg &val)
         {
-            // Have to trap writes to PC so that they update NPC instead
-            if (intReg == PCReg)
-                setNextPC(val);
-            else
-                intRegFile.setReg(intReg, val);
+            intRegFile.setReg(intReg, val);
         }
       protected: