//Phase 3, calls FinishBuild(); protected virtual void BuildOperand2() { opcode &= ~imm_mask; wildcard_mask &= ~imm_mask; //Clear bits 7-4 opcode &= 0xffffff0f; System.Diagnostics.Debug.Assert((wildcard_mask & 0x00000090) == 0); //Register version //There are exactly two forms of the register version: //Immediate shift (bits 7-4 = xxx0) and Register shift (bits 7-4 = 0xx1) //Immediate shift wildcard_mask |= 0x000000e0; EvaluateOperand2 = owner.DataOpEvaluateOperand2_Register; FinishBuild(); opcode &= 0xffffff0f; wildcard_mask &= 0xffffff0f; //Register shift wildcard_mask |= 0x00000060; opcode |= 0x00000010; EvaluateOperand2 = owner.DataOpEvaluateOperand2_Register; FinishBuild(); opcode &= 0xffffff0f; wildcard_mask &= 0xffffff0f; //Immediate version opcode |= imm_mask; wildcard_mask |= 0x000000f0; EvaluateOperand2 = owner.DataOpEvaluateOperand2_Immediate; FinishBuild(); wildcard_mask &= 0xffffff0f; opcode &= ~imm_mask; }
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; }); }
internal InstructionFunc GenerateAWCDataOp(DataOpEvaluateOperand2Func EvaluateOperand2, DataOpAWCOperation AWCOp, DataOpSaveResultFunc SaveResult, DataOpHandleSetFlagsAWCFunc 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); AWCResult awcResult = AWCOp(a, b); SaveResult(Rd, awcResult.result); SetFlags(opcode, Rd, awcResult); return 1; }); }
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; }); }