arch-power: Add TAR and associated instructions
authorSandipan Das <sandipan@linux.ibm.com>
Sat, 6 Feb 2021 11:46:50 +0000 (17:16 +0530)
committerSandipan Das <sandipan@linux.ibm.com>
Mon, 15 Feb 2021 08:32:38 +0000 (14:02 +0530)
This adds the definition of the Target Address Register (TAR)
and the following instructions that are associated with it.
  * Move To Target Address Register (mttar)
  * Move From Target Address Register (mftar)
  * Branch Conditional to Branch Target Address Register (bctar[l])

Change-Id: I30f54ebd38b503fb6c9ba9dd74d00ccbbc0f8318
Signed-off-by: Sandipan Das <sandipan@linux.ibm.com>
src/arch/power/insts/integer.cc
src/arch/power/isa/decoder.isa
src/arch/power/isa/operands.isa
src/arch/power/miscregs.hh

index 9355198c7a2405152f30f8ad8e4b9849947b5c86..5ecb8ccd8df342486cb04e4ba87e872b32d6fe11 100644 (file)
@@ -49,12 +49,14 @@ IntOp::generateDisassembly(Addr pc, const Loader::SymbolTable *symtab) const
                !myMnemonic.compare("mtxer") ||
                !myMnemonic.compare("mtlr")  ||
                !myMnemonic.compare("mtctr") ||
-               !myMnemonic.compare("cmpi")) {
+               !myMnemonic.compare("cmpi")  ||
+               !myMnemonic.compare("mttar")) {
         printDest = false;
     } else if (!myMnemonic.compare("mfcr")  ||
                !myMnemonic.compare("mfxer") ||
                !myMnemonic.compare("mflr")  ||
-               !myMnemonic.compare("mfctr")) {
+               !myMnemonic.compare("mfctr") ||
+               !myMnemonic.compare("mftar")) {
         printSrcs = false;
     }
 
index a58e947f9cb05496b23636360a60935a0faeba82..4005da8d63169556006258c20d3e683f72f2614b 100644 (file)
@@ -56,6 +56,7 @@ decode PO default Unknown::unknown() {
         format BranchRegCondOp {
             16: bclr({{ NIA = LR & -4ULL; }}, true, [ IsReturn ]);
             528: bcctr({{ NIA = CTR & -4ULL; }});
+            560: bctar({{ NIA = TAR & -4ULL; }}, true);
         }
 
         // Condition register manipulation instructions.
@@ -518,12 +519,14 @@ decode PO default Unknown::unknown() {
                         0x20: mfxer({{ Rt = XER; }});
                         0x100: mflr({{ Rt = LR; }});
                         0x120: mfctr({{ Rt = CTR; }});
+                        0x1f9: mftar({{ Rt = TAR; }});
                     }
 
                     467: decode SPR {
                         0x20: mtxer({{ XER = Rs; }});
                         0x100: mtlr({{ LR = Rs; }});
                         0x120: mtctr({{ CTR = Rs; }});
+                        0x1f9: mttar({{ TAR = Rs; }});
                     }
 
                     144: mtcrf({{
index 4ca4d2433e1e2581f56a498bf63407deb14324b1..af89a625b9f1ad90a0e1507f047df683ca51e18e 100644 (file)
@@ -65,6 +65,7 @@ def operands {{
     'XER': ('ControlReg', 'uw', 'MISCREG_XER', 'IsInteger', 9),
     'LR': ('ControlReg', 'ud', 'MISCREG_LR', 'IsInteger', 9),
     'CTR': ('ControlReg', 'ud', 'MISCREG_CTR', 'IsInteger', 9),
+    'TAR': ('ControlReg', 'ud', 'MISCREG_TAR', 'IsInteger', 9),
 
     # Setting as ControlReg so things are stored as an integer, not double
     'FPSCR': ('ControlReg', 'uw', 'MISCREG_FPSCR', 'IsFloating', 9),
index 9d366b206e5d555f4d4c552b52f5c82064afed4d..dc9e9afa135a9eaf4d5adba07c092180d9e862a0 100644 (file)
@@ -40,6 +40,7 @@ enum MiscRegIndex {
     MISCREG_XER,
     MISCREG_LR,
     MISCREG_CTR,
+    MISCREG_TAR,
     NUM_MISCREGS
 };
 
@@ -49,6 +50,7 @@ const char * const miscRegName[NUM_MISCREGS] = {
     "XER",
     "LR",
     "CTR",
+    "TAR"
 };
 
 BitUnion32(Cr)