protected override void BuildSetFlags() { string original_name = name; opcode &= ~s_mask; wildcard_mask &= ~s_mask; //non-S version SetFlags = owner.DataOpHandleSetFlagsLogical_NOP; BuildOperand2(); //S version SetFlags = owner.DataOpHandleSetFlagsLogical_NonCMP; opcode |= s_mask; name += "S"; BuildOperand2(); name = original_name; opcode &= ~s_mask; }
internal InstructionFunc GenerateLogicalDataOpBinary(DataOpEvaluateOperand2Func EvaluateOperand2, DataOpLogicalBinary BinaryOp, DataOpSaveResultFunc SaveResult, DataOpHandleSetFlagsFunc SetFlags) { return(delegate(uint opcode) { uint Rd = ((opcode & rd_mask) >> 12); uint Rn = ((opcode & rn_mask) >> 16); uint a = get_reg(Rn); bool shift_carry = false; uint b = EvaluateOperand2(opcode, ref shift_carry); uint result = BinaryOp(a, b); SaveResult(Rd, result); SetFlags(opcode, Rd, result, shift_carry); return 1; }); }
static internal InstructionFunc GenerateLogicalDataOpUnary( DataOpEvaluateOperand2Func EvaluateOperand2, DataOpLogicalUnary UnaryOp, DataOpSaveResultFunc SaveResult, DataOpHandleSetFlagsFunc SetFlags) { return(delegate(uint opcode) { uint Rd = ((opcode & rd_mask) >> 12); //Unary operations only have operand 2 (which is denoted by b everywhere else) bool shift_carry = false; uint operand = EvaluateOperand2(opcode, ref shift_carry); uint result = UnaryOp(operand); SaveResult(Rd, result); SetFlags(opcode, Rd, result, shift_carry); return 1; }); }