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; }
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; }
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; }
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; }