arch-power: Add PC-relative arithmetic instructions

This adds the following instructions.
  * Add PC Immediate Shifted (addpcis)

Change-Id: Ib88b8e123ffb328e6f692e0fddb237e420ce38a7
Signed-off-by: Sandipan Das <sandipan@linux.ibm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/40902
Reviewed-by: Boris Shingarov <shingarov@labware.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Sandipan Das
2021-02-06 17:17:42 +05:30
committed by Boris Shingarov
parent b43aa16535
commit e2f275dce9
4 changed files with 81 additions and 0 deletions

View File

@@ -218,6 +218,51 @@ IntImmArithOp::generateDisassembly(
}
std::string
IntDispArithOp::generateDisassembly(
Addr pc, const Loader::SymbolTable *symtab) const
{
std::stringstream ss;
bool printSrcs = true;
bool printDisp = true;
bool negateDisp = false;
// Generate the correct mnemonic
std::string myMnemonic(mnemonic);
// Special cases
if (myMnemonic == "addpcis") {
printSrcs = false;
if (d == 0) {
myMnemonic = "lnia";
printDisp = false;
} else if (d < 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)
ss << ", " << (negateDisp ? -d : d);
return ss.str();
}
std::string
IntShiftOp::generateDisassembly(
Addr pc, const loader::SymbolTable *symtab) const

View File

@@ -160,6 +160,27 @@ class IntImmArithOp : public IntArithOp
};
/**
* Class for integer arithmetic operations with displacement.
*/
class IntDispArithOp : public IntArithOp
{
protected:
int64_t d;
/// Constructor
IntDispArithOp(const char *mnem, MachInst _machInst, OpClass __opClass)
: IntArithOp(mnem, _machInst, __opClass),
d(sext<16>((machInst.d0 << 6) | (machInst.d1 << 1) | machInst.d2))
{
}
std::string generateDisassembly(
Addr pc, const Loader::SymbolTable *symtab) const override;
};
/**
* Class for integer operations with a shift.
*/

View File

@@ -163,6 +163,10 @@ decode PO default Unknown::unknown() {
528: bcctr({{ NIA = CTR & -4ULL; }});
560: bctar({{ NIA = TAR & -4ULL; }}, true);
}
default: decode DX_XO {
2: IntDispArithOp::addpcis({{ Rt = NIA + (d << 16); }});
}
}
format IntRotateOp {

View File

@@ -168,6 +168,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