Example #1
0
            //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;
            }
Example #2
0
 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;
     });
 }
Example #3
0
        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;
            });
        }
Example #4
0
        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;
            });
        }