| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- using System;
- namespace ARMeilleure.Decoders
- {
- class OpCodeAluImm : OpCodeAlu, IOpCodeAluImm
- {
- public long Immediate { get; }
- public new static OpCode Create(InstDescriptor inst, ulong address, int opCode) => new OpCodeAluImm(inst, address, opCode);
- public OpCodeAluImm(InstDescriptor inst, ulong address, int opCode) : base(inst, address, opCode)
- {
- if (DataOp == DataOp.Arithmetic)
- {
- Immediate = (opCode >> 10) & 0xfff;
- int shift = (opCode >> 22) & 3;
- Immediate <<= shift * 12;
- }
- else if (DataOp == DataOp.Logical)
- {
- var bm = DecoderHelper.DecodeBitMask(opCode, true);
- if (bm.IsUndefined)
- {
- Instruction = InstDescriptor.Undefined;
- return;
- }
- Immediate = bm.WMask;
- }
- else
- {
- throw new ArgumentException(nameof(opCode));
- }
- }
- }
- }
|