}
std::string
-PredImmOpBase::generateDisassembly(Addr pc, const SymbolTable *symtab) const
+PredImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
{
std::stringstream ss;
- unsigned rotate = machInst.rotate * 2;
- uint32_t imm = machInst.imm;
- imm = (imm << (32 - rotate)) | (imm >> rotate);
printDataInst(ss, true, machInst.opcode4 == 0, machInst.sField,
(IntRegIndex)(uint32_t)machInst.rd,
(IntRegIndex)(uint32_t)machInst.rn,
/**
* Base class for predicated immediate operations.
*/
-class PredImmOpBase : public PredOp
+class PredImmOp : public PredOp
{
protected:
uint32_t imm;
uint32_t rotated_imm;
uint32_t rotated_carry;
-
- /// Constructor
- PredImmOpBase(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
- PredOp(mnem, _machInst, __opClass),
- imm(machInst.imm), rotated_imm(0), rotated_carry(0)
- {
- }
-
- std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
-};
-
-/**
- * Base class for regular predicated immediate operations.
- */
-class PredImmOp : public PredImmOpBase
-{
- protected:
-
uint32_t rotate;
/// Constructor
PredImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
- PredImmOpBase(mnem, _machInst, __opClass),
+ PredOp(mnem, _machInst, __opClass),
+ imm(machInst.imm), rotated_imm(0), rotated_carry(0),
rotate(machInst.rotate << 1)
{
rotated_imm = rotate_imm(imm, rotate);
if (rotate != 0)
rotated_carry = bits(rotated_imm, 31);
}
-};
-
-/**
- * Base class for modified predicated immediate operations.
- */
-class PredModImmOp : public PredImmOpBase
-{
- protected:
- uint8_t ctrlImm;
- uint8_t dataImm;
-
-
- /// Constructor
- PredModImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
- PredImmOpBase(mnem, _machInst, __opClass),
- ctrlImm(bits(machInst.instBits, 26) << 3 |
- bits(machInst.instBits, 14, 12)),
- dataImm(bits(machInst.instBits, 7, 0))
- {
- rotated_imm = modified_imm(ctrlImm, dataImm);
- rotated_carry = bits(rotated_imm, 31);
- }
+ std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
};
/**
decode_block = DataImmDecode.subst(iop)
}};
-def format DataModImmOp(code, flagtype = modImm) {{
- code += "resTemp = resTemp;"
- iop = InstObjParams(name, Name + "ModImm", 'PredModImmOp',
- {"code": code,
- "predicate_test": predicateTest})
- ccIop = InstObjParams(name, Name + "ModImmCc", 'PredModImmOp',
- {"code": code + getImmCcCode(flagtype),
- "predicate_test": predicateTest})
- header_output = BasicDeclare.subst(iop) + \
- BasicDeclare.subst(ccIop)
- decoder_output = BasicConstructor.subst(iop) + \
- BasicConstructor.subst(ccIop)
- exec_output = PredOpExecute.subst(iop) + \
- PredOpExecute.subst(ccIop)
- decode_block = DataImmDecode.subst(iop)
-}};
-
def format PredOp(code, *opt_flags) {{
iop = InstObjParams(name, Name, 'PredOp',
{"code": code,
exec_output = PredOpExecute.subst(iop)
}};
-def format PredImmOpCc(code, icValue, ivValue, *opt_flags) {{
- ccCode = calcCcCode % vars()
- code += ccCode;
- iop = InstObjParams(name, Name, 'PredImmOp',
- {"code": code,
- "cc_code": ccCode,
- "predicate_test": predicateTest},
- opt_flags)
- header_output = BasicDeclare.subst(iop)
- decoder_output = BasicConstructor.subst(iop)
- decode_block = BasicDecode.subst(iop)
- exec_output = PredOpExecute.subst(iop)
-}};
-
-def format PredIntOp(code, *opt_flags) {{
- new_code = ArmGenericCodeSubs(code)
- iop = InstObjParams(name, Name, 'PredIntOp',
- {"code": new_code,
- "predicate_test": predicateTest},
- opt_flags)
- header_output = BasicDeclare.subst(iop)
- decoder_output = BasicConstructor.subst(iop)
- decode_block = BasicDecode.subst(iop)
- exec_output = PredOpExecute.subst(iop)
-}};
-
-def format PredIntOpCc(code, icValue, ivValue, *opt_flags) {{
- ccCode = calcCcCode % vars()
- code += ccCode;
- new_code = ArmGenericCodeSubs(code)
- iop = InstObjParams(name, Name, 'PredIntOp',
- {"code": new_code,
- "cc_code": ccCode,
- "predicate_test": predicateTest},
- opt_flags)
- header_output = BasicDeclare.subst(iop)
- decoder_output = BasicConstructor.subst(iop)
- decode_block = BasicDecode.subst(iop)
- exec_output = PredOpExecute.subst(iop)
-}};
-