From af91d272711632e63514d5d5866e0f60bf7974d6 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Wed, 2 Jun 2010 12:58:00 -0500 Subject: ARM: Add a base class for 32 bit thumb data processing immediate instructions. --- src/arch/arm/insts/pred_inst.cc | 17 +++++++++-- src/arch/arm/insts/pred_inst.hh | 67 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 74 insertions(+), 10 deletions(-) (limited to 'src/arch/arm/insts') diff --git a/src/arch/arm/insts/pred_inst.cc b/src/arch/arm/insts/pred_inst.cc index f98db1c8e..b1b21677c 100644 --- a/src/arch/arm/insts/pred_inst.cc +++ b/src/arch/arm/insts/pred_inst.cc @@ -1,4 +1,17 @@ -/* Copyright (c) 2007-2008 The Florida State University +/* + * Copyright (c) 2010 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Copyright (c) 2007-2008 The Florida State University * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -40,7 +53,7 @@ PredIntOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const } std::string -PredImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const +PredImmOpBase::generateDisassembly(Addr pc, const SymbolTable *symtab) const { std::stringstream ss; printDataInst(ss, true); diff --git a/src/arch/arm/insts/pred_inst.hh b/src/arch/arm/insts/pred_inst.hh index 76b5a4cff..817ed44f5 100644 --- a/src/arch/arm/insts/pred_inst.hh +++ b/src/arch/arm/insts/pred_inst.hh @@ -1,4 +1,17 @@ -/* Copyright (c) 2007-2008 The Florida State University +/* + * Copyright (c) 2010 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Copyright (c) 2007-2008 The Florida State University * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -61,27 +74,65 @@ class PredOp : public ArmStaticInst /** * Base class for predicated immediate operations. */ -class PredImmOp : public PredOp +class PredImmOpBase : public PredOp { protected: uint32_t imm; - uint32_t rotate; 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) : - PredOp(mnem, _machInst, __opClass), - imm(machInst.imm), rotate(machInst.rotate << 1), - rotated_imm(0), rotated_carry(0) + PredImmOpBase(mnem, _machInst, __opClass), + rotate(machInst.rotate << 1) { rotated_imm = rotate_imm(imm, rotate); if (rotate != 0) - rotated_carry = (rotated_imm >> 31) & 1; + rotated_carry = bits(rotated_imm, 31); } +}; - std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; +/** + * 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); + } }; /** -- cgit v1.2.3