| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- using ChocolArm64.Instructions;
- namespace ChocolArm64.Decoders
- {
- class OpCodeSimdMemSs64 : OpCodeMemReg64, IOpCodeSimd64
- {
- public int SElems { get; private set; }
- public int Index { get; private set; }
- public bool Replicate { get; private set; }
- public bool WBack { get; private set; }
- public OpCodeSimdMemSs64(Inst inst, long position, int opCode) : base(inst, position, opCode)
- {
- int size = (opCode >> 10) & 3;
- int s = (opCode >> 12) & 1;
- int sElems = (opCode >> 12) & 2;
- int scale = (opCode >> 14) & 3;
- int l = (opCode >> 22) & 1;
- int q = (opCode >> 30) & 1;
- sElems |= (opCode >> 21) & 1;
- sElems++;
- int index = (q << 3) | (s << 2) | size;
- switch (scale)
- {
- case 1:
- {
- if ((size & 1) != 0)
- {
- inst = Inst.Undefined;
- return;
- }
- index >>= 1;
- break;
- }
- case 2:
- {
- if ((size & 2) != 0 ||
- ((size & 1) != 0 && s != 0))
- {
- inst = Inst.Undefined;
- return;
- }
- if ((size & 1) != 0)
- {
- index >>= 3;
- scale = 3;
- }
- else
- {
- index >>= 2;
- }
- break;
- }
- case 3:
- {
- if (l == 0 || s != 0)
- {
- inst = Inst.Undefined;
- return;
- }
- scale = size;
- Replicate = true;
- break;
- }
- }
- Index = index;
- SElems = sElems;
- Size = scale;
- Extend64 = false;
- WBack = ((opCode >> 23) & 1) != 0;
- RegisterSize = q != 0
- ? State.RegisterSize.Simd128
- : State.RegisterSize.Simd64;
- }
- }
- }
|