diff -r 000000000000 -r 818e61de6cd1 crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianInstructionLib/Arm/Instructions/Thumb/DataTransfer/Bases/Thumb_LoadOrStore.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianInstructionLib/Arm/Instructions/Thumb/DataTransfer/Bases/Thumb_LoadOrStore.cs Thu Feb 11 15:50:58 2010 +0200 @@ -0,0 +1,112 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +using System; +using System.Collections.Generic; +using System.Text; +using SymbianUtils.BasicTypes; +using SymbianStructuresLib.Arm.Registers; +using SymbianStructuresLib.Arm.Instructions; +using SymbianInstructionLib.Arm.Instructions.Common; + +namespace SymbianInstructionLib.Arm.Instructions.Thumb.DataTransfer +{ + public abstract class Thumb_LoadOrStore : ThumbInstruction + { + #region Constructors + protected Thumb_LoadOrStore() + { + base.AIGroup = SymbianStructuresLib.Arm.Instructions.TArmInstructionGroup.EGroupDataTransfer; + } + #endregion + + #region From ArmBaseInstruction + protected override bool DoQueryInvolvementAsSource( TArmRegisterType aRegister ) + { + bool ret = false; + // + TArmDataTransferType type = this.DataTransferType; + if ( type == TArmDataTransferType.EStore ) + { + // STR , [, # * 4] + // Rd = dest, Rn is source + // + // Cannot test here, requires derived class to implement this check + } + else if ( type == TArmDataTransferType.ELoad ) + { + // LDR , [, # * 4] + // LDR , [, ] + // LDR , [PC, # * 4] + // LDR , [SP, # * 4] + TArmRegisterType reg = this.Rd; + ret = ( reg == aRegister ); + } + // + return ret; + } + + protected override bool DoQueryInvolvementAsDestination( TArmRegisterType aRegister ) + { + bool ret = false; + // + TArmDataTransferType type = this.DataTransferType; + if ( type == TArmDataTransferType.EStore ) + { + // STR , [, # * 4] + // Rd = dest, Rn is source + TArmRegisterType reg = this.Rd; + ret = ( reg == aRegister ); + } + else if ( type == TArmDataTransferType.ELoad ) + { + // LDR , [, # * 4] + // LDR , [, ] + // LDR , [PC, # * 4] + // LDR , [SP, # * 4] + // + // Cannot test here, requires derived class to implement this check + } + // + return ret; + } + #endregion + + #region Framework API + public abstract TArmDataTransferType DataTransferType + { + get; + } + + public abstract TArmRegisterType Rd + { + get; + } + #endregion + + #region Properties + #endregion + + #region Internal methods + protected static readonly SymMask KBits2To0 = new SymMask( 0x7 ); + protected static readonly SymMask KBits5To3 = new SymMask( 0x38 ); + #endregion + + #region Data members + #endregion + } +} +