arch-power: Add fixed-point arithmetic add instructions
authorSandipan Das <sandipan@linux.vnet.ibm.com>
Thu, 7 Jun 2018 06:13:04 +0000 (11:43 +0530)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sun, 24 Jan 2021 03:21:10 +0000 (03:21 +0000)
This adds the following arithmetic instructions:
  * Add PC Immediate Shifted (addpcis)

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

index 89d1530c205fef245b448dcf32782c42158eff45..638634972776dcdc286d3e623244702e62ad995e 100644 (file)
@@ -213,6 +213,58 @@ IntImmArithOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
 }
 
 
+string
+IntDispArithOp::generateDisassembly(
+        Addr pc, const Loader::SymbolTable *symtab) const
+{
+    stringstream ss;
+    bool printSrcs = true;
+    bool printDisp = true;
+    bool negateDisp = false;
+
+    // Generate the correct mnemonic
+    string myMnemonic(mnemonic);
+
+    // Special cases
+    if (!myMnemonic.compare("addpcis")) {
+        printSrcs = false;
+        if (disp == 0) {
+            myMnemonic = "lnia";
+            printDisp = false;
+        } else if (disp < 0) {
+            myMnemonic = "subpcis";
+            negateDisp = true;
+        }
+    }
+
+    ccprintf(ss, "%-10s ", myMnemonic);
+
+    // Print the first destination only
+    if (_numDestRegs > 0) {
+        printReg(ss, _destRegIdx[0]);
+    }
+
+    // Print the source register
+    if (_numSrcRegs > 0 && printSrcs) {
+        if (_numDestRegs > 0) {
+            ss << ", ";
+        }
+        printReg(ss, _srcRegIdx[0]);
+    }
+
+    // Print the displacement
+    if (printDisp) {
+        if (negateDisp) {
+            ss << ", " << -disp;
+        } else {
+            ss << ", " << disp;
+        }
+    }
+
+    return ss.str();
+}
+
+
 string
 IntShiftOp::generateDisassembly(
         Addr pc, const Loader::SymbolTable *symtab) const
index 652352cb0a9d79082ff07a0716158585d6fcb0a2..60996efea560a8ed24ea07f82965a3585a035474 100644 (file)
@@ -180,6 +180,27 @@ class IntImmArithOp : public IntArithOp
 };
 
 
+/**
+ * Class for integer arithmetic operations with displacement.
+ */
+class IntDispArithOp : public IntArithOp
+{
+  protected:
+
+    int32_t disp;
+
+    /// Constructor
+    IntDispArithOp(const char *mnem, MachInst _machInst, OpClass __opClass)
+      : IntArithOp(mnem, _machInst, __opClass),
+        disp((int16_t)((machInst.d0 << 6) | (machInst.d1 << 1) | machInst.d2))
+    {
+    }
+
+    std::string generateDisassembly(
+            Addr pc, const SymbolTable *symtab) const override;
+};
+
+
 /**
  * Class for integer operations with a shift.
  */
index 052d68c83d7d97c7dea0d8a9d4aafa4b9932cbd9..a96e8d614509d40d72e4b9d5c787e57cf56f7232 100644 (file)
@@ -135,6 +135,12 @@ decode PO default Unknown::unknown() {
         format MiscOp {
             150: isync({{ }}, [ IsSerializeAfter ]);
         }
+
+        default: decode DX_XO {
+            format IntDispArithOp {
+                2: addpcis({{ Rt = NIA + (disp << 16); }});
+            }
+        }
     }
 
     17: IntOp::sc({{ xc->syscall(R0, &fault); }},
index ca679c2678dbc0d8f122a799187b2a3cf2c8fa63..d4a60604f362ff02929faaea0a8653ff97b589b3 100644 (file)
@@ -210,6 +210,17 @@ def format IntImmLogicOp(code, computeCR0 = 0, inst_flags = []) {{
 }};
 
 
+// Integer instructions with displacement that perform arithmetic.
+// There are no control flags to set.
+def format IntDispArithOp(code, inst_flags = []) {{
+
+    # Generate the class
+    (header_output, decoder_output, decode_block, exec_output) = \
+        GenAluOp(name, Name, 'IntDispArithOp', code, inst_flags, BasicDecode,
+                 BasicConstructor)
+}};
+
+
 // Integer instructions that perform logic operations. The result is
 // always written into Ra. All instructions have 2 versions depending on
 // whether the Rc bit is set to compute the CR0 code. This is determined