Example #1
0
 public Arithmetic(ECondition condition, EOpcode opcode, bool setConditionFlags, ERegister rn, ERegister rd, byte rotate, byte immediate)
 {
     Operand2          = EOperand2.RotateImmediate;
     Condition         = condition;
     Opcode            = opcode;
     SetConditionFlags = setConditionFlags;
     Rn        = rn;
     Rd        = rd;
     Rotate    = rotate;
     Immediate = immediate;
     Decoded   = true;
 }
Example #2
0
 public Arithmetic(ECondition condition, EOpcode opcode, bool setConditionFlags, ERegister rn, ERegister rd, ERegister rs, EShiftInstruction shiftInst, ERegister rm)
 {
     Operand2          = EOperand2.RsShiftRm;
     Condition         = condition;
     Opcode            = opcode;
     SetConditionFlags = setConditionFlags;
     Rn        = rn;
     Rd        = rd;
     Rs        = rs;
     ShiftInst = shiftInst;
     Rm        = rm;
     Decoded   = true;
 }
Example #3
0
 public Arithmetic(ECondition condition, EOpcode opcode, bool setConditionFlags, ERegister rn, ERegister rd, byte shiftCount, EShiftInstruction shiftInst, ERegister rm)
 {
     Operand2          = EOperand2.ImmediateShiftRm;
     Condition         = condition;
     Opcode            = opcode;
     SetConditionFlags = setConditionFlags;
     Rn         = rn;
     Rd         = rd;
     ShiftCount = shiftCount;
     ShiftInst  = shiftInst;
     Rm         = rm;
     Decoded    = true;
 }
Example #4
0
        public void Parse([NotNull] string parameterString)
        {
            if (Decoded)
            {
                throw new InvalidOperationException();
            }

            var parameters = Parser.ParseParameters(parameterString, new[] { ',' });

            switch (Opcode)
            {
            case EOpcode.Add:
            case EOpcode.Sub:
            case EOpcode.Rsb:
            case EOpcode.And:
            case EOpcode.Eor:
            case EOpcode.Orr:
            case EOpcode.Bic:
                if ((parameters.Length != 3) && (parameters.Length != 4))
                {
                    throw new TargetParameterCountException();
                }

                // Parse Rd, Rn
                Rd = Parser.ParseRegister(parameters[0]);
                Rn = Parser.ParseRegister(parameters[1]);

                Operand2 = ParseOperand2(parameters[2], parameters.Length == 4 ? parameters[3] : null);
                break;

            case EOpcode.Mov:
            case EOpcode.Mvn:
                // Check for valid parameter count
                if ((parameters.Length != 2) && (parameters.Length != 3))
                {
                    throw new TargetParameterCountException();
                }

                // Parse Rd
                Rd = Parser.ParseRegister(parameters[0]);

                Operand2 = ParseOperand2(parameters[1], parameters.Length == 3 ? parameters[2] : null);
                break;

            case EOpcode.Tst:
            case EOpcode.Teq:
            case EOpcode.Cmp:
            case EOpcode.Cmn:
                // Check for valid parameter count
                if ((parameters.Length != 2) && (parameters.Length != 3))
                {
                    throw new TargetParameterCountException();
                }

                // Parse Rn
                Rn = Parser.ParseRegister(parameters[0]);

                Operand2 = ParseOperand2(parameters[1], parameters.Length == 3 ? parameters[2] : null);
                break;
            }

            Decoded = true;
        }