diff options
| author | LDj3SNuD <35856442+LDj3SNuD@users.noreply.github.com> | 2018-09-08 19:23:07 +0200 |
|---|---|---|
| committer | gdkchan <gab.dark.100@gmail.com> | 2018-09-08 14:23:07 -0300 |
| commit | ca1e37a29553f97ecf574fb3678422dd93a2b91d (patch) | |
| tree | 3e082d2f30f60e7b94c263fc2b66cb037a055e6a /Ryujinx.Tests/Cpu/Tester | |
| parent | 76a3172f1784bcba209ce070503cfaeff3475449 (diff) | |
Remove old Tester, update Tests (some reworks). (#400)
* Delete Bits.cs
* Delete Integer.cs
* Delete Instructions.cs
* Delete Pseudocode.cs
* Add files via upload
* Add mnemonic.
* Literals all uppercase.
* Nit.
* Allow FPSR control.
* Allow FPSR control.
* Allow FPSR control.
Diffstat (limited to 'Ryujinx.Tests/Cpu/Tester')
| -rw-r--r-- | Ryujinx.Tests/Cpu/Tester/Instructions.cs | 7346 | ||||
| -rw-r--r-- | Ryujinx.Tests/Cpu/Tester/Pseudocode.cs | 1740 | ||||
| -rw-r--r-- | Ryujinx.Tests/Cpu/Tester/Types/Bits.cs | 282 | ||||
| -rw-r--r-- | Ryujinx.Tests/Cpu/Tester/Types/Integer.cs | 42 |
4 files changed, 0 insertions, 9410 deletions
diff --git a/Ryujinx.Tests/Cpu/Tester/Instructions.cs b/Ryujinx.Tests/Cpu/Tester/Instructions.cs deleted file mode 100644 index e3aa4e40..00000000 --- a/Ryujinx.Tests/Cpu/Tester/Instructions.cs +++ /dev/null @@ -1,7346 +0,0 @@ -// https://github.com/LDj3SNuD/ARM_v8-A_AArch64_Instructions_Tester/blob/master/Tester/Instructions.cs - -// https://developer.arm.com/products/architecture/a-profile/exploration-tools -// ..\A64_v83A_ISA_xml_00bet6.1\ISA_v83A_A64_xml_00bet6.1_OPT\xhtml\ - -using System.Numerics; - -namespace Ryujinx.Tests.Cpu.Tester -{ - using Types; - - using static AArch64; - using static Shared; - - // index.html - internal static class Base - { -#region "Alu" - // cls_int.html - public static void Cls(bool sf, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - Bits operand1 = X(datasize, n); - - BigInteger result = (BigInteger)CountLeadingSignBits(operand1); - - X(d, result.SubBigInteger(datasize - 1, 0)); - } - - // clz_int.html - public static void Clz(bool sf, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - Bits operand1 = X(datasize, n); - - BigInteger result = (BigInteger)CountLeadingZeroBits(operand1); - - X(d, result.SubBigInteger(datasize - 1, 0)); - } - - // rbit_int.html - public static void Rbit(bool sf, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - Bits result = new Bits(datasize); - Bits operand = X(datasize, n); - - for (int i = 0; i <= datasize - 1; i++) - { - result[datasize - 1 - i] = operand[i]; - } - - X(d, result); - } - - // rev16_int.html - public static void Rev16(bool sf, Bits Rn, Bits Rd) - { - /* Bits opc = "01"; */ - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - int container_size = 16; - - /* Operation */ - Bits result = new Bits(datasize); - Bits operand = X(datasize, n); - - int containers = datasize / container_size; - int elements_per_container = container_size / 8; - int index = 0; - int rev_index; - - for (int c = 0; c <= containers - 1; c++) - { - rev_index = index + ((elements_per_container - 1) * 8); - - for (int e = 0; e <= elements_per_container - 1; e++) - { - result[rev_index + 7, rev_index] = operand[index + 7, index]; - - index = index + 8; - rev_index = rev_index - 8; - } - } - - X(d, result); - } - - // rev32_int.html - // (rev.html) - public static void Rev32(bool sf, Bits Rn, Bits Rd) - { - /* Bits opc = "10"; */ - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - int container_size = 32; - - /* Operation */ - Bits result = new Bits(datasize); - Bits operand = X(datasize, n); - - int containers = datasize / container_size; - int elements_per_container = container_size / 8; - int index = 0; - int rev_index; - - for (int c = 0; c <= containers - 1; c++) - { - rev_index = index + ((elements_per_container - 1) * 8); - - for (int e = 0; e <= elements_per_container - 1; e++) - { - result[rev_index + 7, rev_index] = operand[index + 7, index]; - - index = index + 8; - rev_index = rev_index - 8; - } - } - - X(d, result); - } - - // rev64_rev.html - // (rev.html) - public static void Rev64(Bits Rn, Bits Rd) - { - /* Bits opc = "11"; */ - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int container_size = 64; - - /* Operation */ - Bits result = new Bits(64); - Bits operand = X(64, n); - - int containers = 64 / container_size; - int elements_per_container = container_size / 8; - int index = 0; - int rev_index; - - for (int c = 0; c <= containers - 1; c++) - { - rev_index = index + ((elements_per_container - 1) * 8); - - for (int e = 0; e <= elements_per_container - 1; e++) - { - result[rev_index + 7, rev_index] = operand[index + 7, index]; - - index = index + 8; - rev_index = rev_index - 8; - } - } - - X(d, result); - } -#endregion - -#region "AluImm" - // add_addsub_imm.html - public static void Add_Imm(bool sf, Bits shift, Bits imm12, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - Bits imm; - - switch (shift) - { - default: - case Bits bits when bits == "00": - imm = ZeroExtend(imm12, datasize); - break; - case Bits bits when bits == "01": - imm = ZeroExtend(Bits.Concat(imm12, Zeros(12)), datasize); - break; - /* when '1x' ReservedValue(); */ - } - - /* Operation */ - Bits result; - Bits operand1 = (n == 31 ? SP(datasize) : X(datasize, n)); - - (result, _) = AddWithCarry(datasize, operand1, imm, false); - - if (d == 31) - { - SP(result); - } - else - { - X(d, result); - } - } - - // adds_addsub_imm.html - public static void Adds_Imm(bool sf, Bits shift, Bits imm12, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - Bits imm; - - switch (shift) - { - default: - case Bits bits when bits == "00": - imm = ZeroExtend(imm12, datasize); - break; - case Bits bits when bits == "01": - imm = ZeroExtend(Bits.Concat(imm12, Zeros(12)), datasize); - break; - /* when '1x' ReservedValue(); */ - } - - /* Operation */ - Bits result; - Bits operand1 = (n == 31 ? SP(datasize) : X(datasize, n)); - Bits nzcv; - - (result, nzcv) = AddWithCarry(datasize, operand1, imm, false); - - PSTATE.NZCV(nzcv); - - X(d, result); - } - - // and_log_imm.html - public static void And_Imm(bool sf, bool N, Bits immr, Bits imms, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - Bits imm; - - /* if sf == '0' && N != '0' then ReservedValue(); */ - - (imm, _) = DecodeBitMasks(datasize, N, imms, immr, true); - - /* Operation */ - Bits operand1 = X(datasize, n); - - Bits result = AND(operand1, imm); - - if (d == 31) - { - SP(result); - } - else - { - X(d, result); - } - } - - // ands_log_imm.html - public static void Ands_Imm(bool sf, bool N, Bits immr, Bits imms, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - Bits imm; - - /* if sf == '0' && N != '0' then ReservedValue(); */ - - (imm, _) = DecodeBitMasks(datasize, N, imms, immr, true); - - /* Operation */ - Bits operand1 = X(datasize, n); - - Bits result = AND(operand1, imm); - - PSTATE.NZCV(result[datasize - 1], IsZeroBit(result), false, false); - - X(d, result); - } - - // eor_log_imm.html - public static void Eor_Imm(bool sf, bool N, Bits immr, Bits imms, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - Bits imm; - - /* if sf == '0' && N != '0' then ReservedValue(); */ - - (imm, _) = DecodeBitMasks(datasize, N, imms, immr, true); - - /* Operation */ - Bits operand1 = X(datasize, n); - - Bits result = EOR(operand1, imm); - - if (d == 31) - { - SP(result); - } - else - { - X(d, result); - } - } - - // orr_log_imm.html - public static void Orr_Imm(bool sf, bool N, Bits immr, Bits imms, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - Bits imm; - - /* if sf == '0' && N != '0' then ReservedValue(); */ - - (imm, _) = DecodeBitMasks(datasize, N, imms, immr, true); - - /* Operation */ - Bits operand1 = X(datasize, n); - - Bits result = OR(operand1, imm); - - if (d == 31) - { - SP(result); - } - else - { - X(d, result); - } - } - - // sub_addsub_imm.html - public static void Sub_Imm(bool sf, Bits shift, Bits imm12, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - Bits imm; - - switch (shift) - { - default: - case Bits bits when bits == "00": - imm = ZeroExtend(imm12, datasize); - break; - case Bits bits when bits == "01": - imm = ZeroExtend(Bits.Concat(imm12, Zeros(12)), datasize); - break; - /* when '1x' ReservedValue(); */ - } - - /* Operation */ - Bits result; - Bits operand1 = (n == 31 ? SP(datasize) : X(datasize, n)); - Bits operand2 = NOT(imm); - - (result, _) = AddWithCarry(datasize, operand1, operand2, true); - - if (d == 31) - { - SP(result); - } - else - { - X(d, result); - } - } - - // subs_addsub_imm.html - public static void Subs_Imm(bool sf, Bits shift, Bits imm12, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - Bits imm; - - switch (shift) - { - default: - case Bits bits when bits == "00": - imm = ZeroExtend(imm12, datasize); - break; - case Bits bits when bits == "01": - imm = ZeroExtend(Bits.Concat(imm12, Zeros(12)), datasize); - break; - /* when '1x' ReservedValue(); */ - } - - /* Operation */ - Bits result; - Bits operand1 = (n == 31 ? SP(datasize) : X(datasize, n)); - Bits operand2 = NOT(imm); - Bits nzcv; - - (result, nzcv) = AddWithCarry(datasize, operand1, operand2, true); - - PSTATE.NZCV(nzcv); - - X(d, result); - } -#endregion - -#region "AluRs" - // adc.html - public static void Adc(bool sf, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - Bits result; - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - - (result, _) = AddWithCarry(datasize, operand1, operand2, PSTATE.C); - - X(d, result); - } - - // adcs.html - public static void Adcs(bool sf, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - Bits result; - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - Bits nzcv; - - (result, nzcv) = AddWithCarry(datasize, operand1, operand2, PSTATE.C); - - PSTATE.NZCV(nzcv); - - X(d, result); - } - - // add_addsub_shift.html - public static void Add_Rs(bool sf, Bits shift, Bits Rm, Bits imm6, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* if shift == '11' then ReservedValue(); */ - /* if sf == '0' && imm6<5> == '1' then ReservedValue(); */ - - ShiftType shift_type = DecodeShift(shift); - int shift_amount = (int)UInt(imm6); - - /* Operation */ - Bits result; - Bits operand1 = X(datasize, n); - Bits operand2 = ShiftReg(datasize, m, shift_type, shift_amount); - - (result, _) = AddWithCarry(datasize, operand1, operand2, false); - - X(d, result); - } - - // adds_addsub_shift.html - public static void Adds_Rs(bool sf, Bits shift, Bits Rm, Bits imm6, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* if shift == '11' then ReservedValue(); */ - /* if sf == '0' && imm6<5> == '1' then ReservedValue(); */ - - ShiftType shift_type = DecodeShift(shift); - int shift_amount = (int)UInt(imm6); - - /* Operation */ - Bits result; - Bits operand1 = X(datasize, n); - Bits operand2 = ShiftReg(datasize, m, shift_type, shift_amount); - Bits nzcv; - - (result, nzcv) = AddWithCarry(datasize, operand1, operand2, false); - - PSTATE.NZCV(nzcv); - - X(d, result); - } - - // and_log_shift.html - public static void And_Rs(bool sf, Bits shift, Bits Rm, Bits imm6, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* if sf == '0' && imm6<5> == '1' then ReservedValue(); */ - - ShiftType shift_type = DecodeShift(shift); - int shift_amount = (int)UInt(imm6); - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2 = ShiftReg(datasize, m, shift_type, shift_amount); - - Bits result = AND(operand1, operand2); - - X(d, result); - } - - // ands_log_shift.html - public static void Ands_Rs(bool sf, Bits shift, Bits Rm, Bits imm6, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* if sf == '0' && imm6<5> == '1' then ReservedValue(); */ - - ShiftType shift_type = DecodeShift(shift); - int shift_amount = (int)UInt(imm6); - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2 = ShiftReg(datasize, m, shift_type, shift_amount); - - Bits result = AND(operand1, operand2); - - PSTATE.NZCV(result[datasize - 1], IsZeroBit(result), false, false); - - X(d, result); - } - - // asrv.html - public static void Asrv(bool sf, Bits Rm, Bits Rn, Bits Rd) - { - /*readonly */Bits op2 = "10"; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - ShiftType shift_type = DecodeShift(op2); - - /* Operation */ - Bits operand2 = X(datasize, m); - - Bits result = ShiftReg(datasize, n, shift_type, (int)(UInt(operand2) % datasize)); // BigInteger.Modulus Operator (BigInteger, BigInteger) - - X(d, result); - } - - // bic_log_shift.html - public static void Bic(bool sf, Bits shift, Bits Rm, Bits imm6, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* if sf == '0' && imm6<5> == '1' then ReservedValue(); */ - - ShiftType shift_type = DecodeShift(shift); - int shift_amount = (int)UInt(imm6); - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2 = ShiftReg(datasize, m, shift_type, shift_amount); - - operand2 = NOT(operand2); - - Bits result = AND(operand1, operand2); - - X(d, result); - } - - // bics.html - public static void Bics(bool sf, Bits shift, Bits Rm, Bits imm6, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* if sf == '0' && imm6<5> == '1' then ReservedValue(); */ - - ShiftType shift_type = DecodeShift(shift); - int shift_amount = (int)UInt(imm6); - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2 = ShiftReg(datasize, m, shift_type, shift_amount); - - operand2 = NOT(operand2); - - Bits result = AND(operand1, operand2); - - PSTATE.NZCV(result[datasize - 1], IsZeroBit(result), false, false); - - X(d, result); - } - - // crc32.html - public static void Crc32(bool sf, Bits Rm, Bits sz, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if sf == '1' && sz != '11' then UnallocatedEncoding(); */ - /* if sf == '0' && sz == '11' then UnallocatedEncoding(); */ - - int size = 8 << (int)UInt(sz); - - /* Operation */ - /* if !HaveCRCExt() then UnallocatedEncoding(); */ - - Bits acc = X(32, n); // accumulator - Bits val = X(size, m); // input value - Bits poly = new Bits(0x04C11DB7u); - - Bits tempacc = Bits.Concat(BitReverse(acc), Zeros(size)); - Bits tempval = Bits.Concat(BitReverse(val), Zeros(32)); - - // Poly32Mod2 on a bitstring does a polynomial Modulus over {0,1} operation - X(d, BitReverse(Poly32Mod2(EOR(tempacc, tempval), poly))); - } - - // crc32c.html - public static void Crc32c(bool sf, Bits Rm, Bits sz, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if sf == '1' && sz != '11' then UnallocatedEncoding(); */ - /* if sf == '0' && sz == '11' then UnallocatedEncoding(); */ - - int size = 8 << (int)UInt(sz); - - /* Operation */ - /* if !HaveCRCExt() then UnallocatedEncoding(); */ - - Bits acc = X(32, n); // accumulator - Bits val = X(size, m); // input value - Bits poly = new Bits(0x1EDC6F41u); - - Bits tempacc = Bits.Concat(BitReverse(acc), Zeros(size)); - Bits tempval = Bits.Concat(BitReverse(val), Zeros(32)); - - // Poly32Mod2 on a bitstring does a polynomial Modulus over {0,1} operation - X(d, BitReverse(Poly32Mod2(EOR(tempacc, tempval), poly))); - } - - // eon.html - public static void Eon(bool sf, Bits shift, Bits Rm, Bits imm6, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* if sf == '0' && imm6<5> == '1' then ReservedValue(); */ - - ShiftType shift_type = DecodeShift(shift); - int shift_amount = (int)UInt(imm6); - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2 = ShiftReg(datasize, m, shift_type, shift_amount); - - operand2 = NOT(operand2); - - Bits result = EOR(operand1, operand2); - - X(d, result); - } - - // eor_log_shift.html - public static void Eor_Rs(bool sf, Bits shift, Bits Rm, Bits imm6, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* if sf == '0' && imm6<5> == '1' then ReservedValue(); */ - - ShiftType shift_type = DecodeShift(shift); - int shift_amount = (int)UInt(imm6); - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2 = ShiftReg(datasize, m, shift_type, shift_amount); - - Bits result = EOR(operand1, operand2); - - X(d, result); - } - - // extr.html - public static void Extr(bool sf, bool N, Bits Rm, Bits imms, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* if N != sf then UnallocatedEncoding(); */ - /* if sf == '0' && imms<5> == '1' then ReservedValue(); */ - - int lsb = (int)UInt(imms); - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - Bits concat = Bits.Concat(operand1, operand2); - - Bits result = concat[lsb + datasize - 1, lsb]; - - X(d, result); - } - - // lslv.html - public static void Lslv(bool sf, Bits Rm, Bits Rn, Bits Rd) - { - /*readonly */Bits op2 = "00"; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - ShiftType shift_type = DecodeShift(op2); - - /* Operation */ - Bits operand2 = X(datasize, m); - - Bits result = ShiftReg(datasize, n, shift_type, (int)(UInt(operand2) % datasize)); // BigInteger.Modulus Operator (BigInteger, BigInteger) - - X(d, result); - } - - // lsrv.html - public static void Lsrv(bool sf, Bits Rm, Bits Rn, Bits Rd) - { - /*readonly */Bits op2 = "01"; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - ShiftType shift_type = DecodeShift(op2); - - /* Operation */ - Bits operand2 = X(datasize, m); - - Bits result = ShiftReg(datasize, n, shift_type, (int)(UInt(operand2) % datasize)); // BigInteger.Modulus Operator (BigInteger, BigInteger) - - X(d, result); - } - - // orn_log_shift.html - public static void Orn(bool sf, Bits shift, Bits Rm, Bits imm6, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* if sf == '0' && imm6<5> == '1' then ReservedValue(); */ - - ShiftType shift_type = DecodeShift(shift); - int shift_amount = (int)UInt(imm6); - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2 = ShiftReg(datasize, m, shift_type, shift_amount); - - operand2 = NOT(operand2); - - Bits result = OR(operand1, operand2); - - X(d, result); - } - - // orr_log_shift.html - public static void Orr_Rs(bool sf, Bits shift, Bits Rm, Bits imm6, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* if sf == '0' && imm6<5> == '1' then ReservedValue(); */ - - ShiftType shift_type = DecodeShift(shift); - int shift_amount = (int)UInt(imm6); - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2 = ShiftReg(datasize, m, shift_type, shift_amount); - - Bits result = OR(operand1, operand2); - - X(d, result); - } - - // rorv.html - public static void Rorv(bool sf, Bits Rm, Bits Rn, Bits Rd) - { - /*readonly */Bits op2 = "11"; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - ShiftType shift_type = DecodeShift(op2); - - /* Operation */ - Bits operand2 = X(datasize, m); - - Bits result = ShiftReg(datasize, n, shift_type, (int)(UInt(operand2) % datasize)); // BigInteger.Modulus Operator (BigInteger, BigInteger) - - X(d, result); - } - - // sbc.html - public static void Sbc(bool sf, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - Bits result; - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - - operand2 = NOT(operand2); - - (result, _) = AddWithCarry(datasize, operand1, operand2, PSTATE.C); - - X(d, result); - } - - // sbcs.html - public static void Sbcs(bool sf, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - Bits result; - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - Bits nzcv; - - operand2 = NOT(operand2); - - (result, nzcv) = AddWithCarry(datasize, operand1, operand2, PSTATE.C); - - PSTATE.NZCV(nzcv); - - X(d, result); - } - - // sdiv.html - public static void Sdiv(bool sf, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - BigInteger result; - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - - if (IsZero(operand2)) - { - result = (BigInteger)0m; - } - else - { - result = RoundTowardsZero(Real(Int(operand1, false)) / Real(Int(operand2, false))); - } - - X(d, result.SubBigInteger(datasize - 1, 0)); - } - - // sub_addsub_shift.html - public static void Sub_Rs(bool sf, Bits shift, Bits Rm, Bits imm6, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* if shift == '11' then ReservedValue(); */ - /* if sf == '0' && imm6<5> == '1' then ReservedValue(); */ - - ShiftType shift_type = DecodeShift(shift); - int shift_amount = (int)UInt(imm6); - - /* Operation */ - Bits result; - Bits operand1 = X(datasize, n); - Bits operand2 = ShiftReg(datasize, m, shift_type, shift_amount); - - operand2 = NOT(operand2); - - (result, _) = AddWithCarry(datasize, operand1, operand2, true); - - X(d, result); - } - - // subs_addsub_shift.html - public static void Subs_Rs(bool sf, Bits shift, Bits Rm, Bits imm6, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* if shift == '11' then ReservedValue(); */ - /* if sf == '0' && imm6<5> == '1' then ReservedValue(); */ - - ShiftType shift_type = DecodeShift(shift); - int shift_amount = (int)UInt(imm6); - - /* Operation */ - Bits result; - Bits operand1 = X(datasize, n); - Bits operand2 = ShiftReg(datasize, m, shift_type, shift_amount); - Bits nzcv; - - operand2 = NOT(operand2); - - (result, nzcv) = AddWithCarry(datasize, operand1, operand2, true); - - PSTATE.NZCV(nzcv); - - X(d, result); - } - - // udiv.html - public static void Udiv(bool sf, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - BigInteger result; - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - - if (IsZero(operand2)) - { - result = (BigInteger)0m; - } - else - { - result = RoundTowardsZero(Real(Int(operand1, true)) / Real(Int(operand2, true))); - } - - X(d, result.SubBigInteger(datasize - 1, 0)); - } -#endregion - -#region "AluRx" - // add_addsub_ext.html - public static void Add_Rx(bool sf, Bits Rm, Bits option, Bits imm3, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - ExtendType extend_type = DecodeRegExtend(option); - int shift = (int)UInt(imm3); - - /* if shift > 4 then ReservedValue(); */ - - /* Operation */ - Bits result; - Bits operand1 = (n == 31 ? SP(datasize) : X(datasize, n)); - Bits operand2 = ExtendReg(datasize, m, extend_type, shift); - - (result, _) = AddWithCarry(datasize, operand1, operand2, false); - - if (d == 31) - { - SP(result); - } - else - { - X(d, result); - } - } - - // adds_addsub_ext.html - public static void Adds_Rx(bool sf, Bits Rm, Bits option, Bits imm3, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - ExtendType extend_type = DecodeRegExtend(option); - int shift = (int)UInt(imm3); - - /* if shift > 4 then ReservedValue(); */ - - /* Operation */ - Bits result; - Bits operand1 = (n == 31 ? SP(datasize) : X(datasize, n)); - Bits operand2 = ExtendReg(datasize, m, extend_type, shift); - Bits nzcv; - - (result, nzcv) = AddWithCarry(datasize, operand1, operand2, false); - - PSTATE.NZCV(nzcv); - - X(d, result); - } - - // sub_addsub_ext.html - public static void Sub_Rx(bool sf, Bits Rm, Bits option, Bits imm3, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - ExtendType extend_type = DecodeRegExtend(option); - int shift = (int)UInt(imm3); - - /* if shift > 4 then ReservedValue(); */ - - /* Operation */ - Bits result; - Bits operand1 = (n == 31 ? SP(datasize) : X(datasize, n)); - Bits operand2 = ExtendReg(datasize, m, extend_type, shift); - - operand2 = NOT(operand2); - - (result, _) = AddWithCarry(datasize, operand1, operand2, true); - - if (d == 31) - { - SP(result); - } - else - { - X(d, result); - } - } - - // subs_addsub_ext.html - public static void Subs_Rx(bool sf, Bits Rm, Bits option, Bits imm3, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - ExtendType extend_type = DecodeRegExtend(option); - int shift = (int)UInt(imm3); - - /* if shift > 4 then ReservedValue(); */ - - /* Operation */ - Bits result; - Bits operand1 = (n == 31 ? SP(datasize) : X(datasize, n)); - Bits operand2 = ExtendReg(datasize, m, extend_type, shift); - Bits nzcv; - - operand2 = NOT(operand2); - - (result, nzcv) = AddWithCarry(datasize, operand1, operand2, true); - - PSTATE.NZCV(nzcv); - - X(d, result); - } -#endregion - -#region "Bfm" - // bfm.html - public static void Bfm(bool sf, bool N, Bits immr, Bits imms, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - int R; - Bits wmask; - Bits tmask; - - /* if sf == '1' && N != '1' then ReservedValue(); */ - /* if sf == '0' && (N != '0' || immr<5> != '0' || imms<5> != '0') then ReservedValue(); */ - - R = (int)UInt(immr); - (wmask, tmask) = DecodeBitMasks(datasize, N, imms, immr, false); - - /* Operation */ - Bits dst = X(datasize, d); - Bits src = X(datasize, n); - - // perform bitfield move on low bits - Bits bot = OR(AND(dst, NOT(wmask)), AND(ROR(src, R), wmask)); - - // combine extension bits and result bits - X(d, OR(AND(dst, NOT(tmask)), AND(bot, tmask))); - } - - // sbfm.html - public static void Sbfm(bool sf, bool N, Bits immr, Bits imms, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - int R; - int S; - Bits wmask; - Bits tmask; - - /* if sf == '1' && N != '1' then ReservedValue(); */ - /* if sf == '0' && (N != '0' || immr<5> != '0' || imms<5> != '0') then ReservedValue(); */ - - R = (int)UInt(immr); - S = (int)UInt(imms); - (wmask, tmask) = DecodeBitMasks(datasize, N, imms, immr, false); - - /* Operation */ - Bits src = X(datasize, n); - - // perform bitfield move on low bits - Bits bot = AND(ROR(src, R), wmask); - - // determine extension bits (sign, zero or dest register) - Bits top = Replicate(datasize, src[S]); - - // combine extension bits and result bits - X(d, OR(AND(top, NOT(tmask)), AND(bot, tmask))); - } - - // ubfm.html - public static void Ubfm(bool sf, bool N, Bits immr, Bits imms, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - int R; - Bits wmask; - Bits tmask; - - /* if sf == '1' && N != '1' then ReservedValue(); */ - /* if sf == '0' && (N != '0' || immr<5> != '0' || imms<5> != '0') then ReservedValue(); */ - - R = (int)UInt(immr); - (wmask, tmask) = DecodeBitMasks(datasize, N, imms, immr, false); - - /* Operation */ - Bits src = X(datasize, n); - - // perform bitfield move on low bits - Bits bot = AND(ROR(src, R), wmask); - - // combine extension bits and result bits - X(d, AND(bot, tmask)); - } -#endregion - -#region "CcmpImm" - // ccmn_imm.html - public static void Ccmn_Imm(bool sf, Bits imm5, Bits cond, Bits Rn, Bits nzcv) - { - /* Decode */ - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - Bits flags = nzcv; - Bits imm = ZeroExtend(imm5, datasize); - - /* Operation */ - Bits operand1 = X(datasize, n); - - if (ConditionHolds(cond)) - { - (_, flags) = AddWithCarry(datasize, operand1, imm, false); - } - - PSTATE.NZCV(flags); - } - - // ccmp_imm.html - public static void Ccmp_Imm(bool sf, Bits imm5, Bits cond, Bits Rn, Bits nzcv) - { - /* Decode */ - int n = (int)UInt(Rn); - - int datasize = (sf ? 64 : 32); - - Bits flags = nzcv; - Bits imm = ZeroExtend(imm5, datasize); - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2; - - if (ConditionHolds(cond)) - { - operand2 = NOT(imm); - (_, flags) = AddWithCarry(datasize, operand1, operand2, true); - } - - PSTATE.NZCV(flags); - } -#endregion - -#region "CcmpReg" - // ccmn_reg.html - public static void Ccmn_Reg(bool sf, Bits Rm, Bits cond, Bits Rn, Bits nzcv) - { - /* Decode */ - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - Bits flags = nzcv; - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - - if (ConditionHolds(cond)) - { - (_, flags) = AddWithCarry(datasize, operand1, operand2, false); - } - - PSTATE.NZCV(flags); - } - - // ccmp_reg.html - public static void Ccmp_Reg(bool sf, Bits Rm, Bits cond, Bits Rn, Bits nzcv) - { - /* Decode */ - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - Bits flags = nzcv; - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - - if (ConditionHolds(cond)) - { - operand2 = NOT(operand2); - (_, flags) = AddWithCarry(datasize, operand1, operand2, true); - } - - PSTATE.NZCV(flags); - } -#endregion - -#region "Csel" - // csel.html - public static void Csel(bool sf, Bits Rm, Bits cond, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - Bits result; - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - - if (ConditionHolds(cond)) - { - result = operand1; - } - else - { - result = operand2; - } - - X(d, result); - } - - // csinc.html - public static void Csinc(bool sf, Bits Rm, Bits cond, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - Bits result; - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - - if (ConditionHolds(cond)) - { - result = operand1; - } - else - { - result = operand2 + 1; - } - - X(d, result); - } - - // csinv.html - public static void Csinv(bool sf, Bits Rm, Bits cond, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - Bits result; - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - - if (ConditionHolds(cond)) - { - result = operand1; - } - else - { - result = NOT(operand2); - } - - X(d, result); - } - - // csneg.html - public static void Csneg(bool sf, Bits Rm, Bits cond, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - Bits result; - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - - if (ConditionHolds(cond)) - { - result = operand1; - } - else - { - result = NOT(operand2); - result = result + 1; - } - - X(d, result); - } -#endregion - -#region "Mov" - // movk.html - public static void Movk(bool sf, Bits hw, Bits imm16, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - - int datasize = (sf ? 64 : 32); - - /* if sf == '0' && hw<1> == '1' then UnallocatedEncoding(); */ - - int pos = (int)UInt(Bits.Concat(hw, "0000")); - - /* Operation */ - Bits result = X(datasize, d); - - result[pos + 15, pos] = imm16; - - X(d, result); - } - - // movn.html - public static void Movn(bool sf, Bits hw, Bits imm16, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - - int datasize = (sf ? 64 : 32); - - /* if sf == '0' && hw<1> == '1' then UnallocatedEncoding(); */ - - int pos = (int)UInt(Bits.Concat(hw, "0000")); - - /* Operation */ - Bits result = Zeros(datasize); - - result[pos + 15, pos] = imm16; - result = NOT(result); - - X(d, result); - } - - // movz.html - public static void Movz(bool sf, Bits hw, Bits imm16, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - - int datasize = (sf ? 64 : 32); - - /* if sf == '0' && hw<1> == '1' then UnallocatedEncoding(); */ - - int pos = (int)UInt(Bits.Concat(hw, "0000")); - - /* Operation */ - Bits result = Zeros(datasize); - - result[pos + 15, pos] = imm16; - - X(d, result); - } -#endregion - -#region "Mul" - // madd.html - public static void Madd(bool sf, Bits Rm, Bits Ra, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - int a = (int)UInt(Ra); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - Bits operand3 = X(datasize, a); - - BigInteger result = UInt(operand3) + (UInt(operand1) * UInt(operand2)); - - X(d, result.SubBigInteger(datasize - 1, 0)); - } - - // msub.html - public static void Msub(bool sf, Bits Rm, Bits Ra, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - int a = (int)UInt(Ra); - - int datasize = (sf ? 64 : 32); - - /* Operation */ - Bits operand1 = X(datasize, n); - Bits operand2 = X(datasize, m); - Bits operand3 = X(datasize, a); - - BigInteger result = UInt(operand3) - (UInt(operand1) * UInt(operand2)); - - X(d, result.SubBigInteger(datasize - 1, 0)); - } - - // smaddl.html - public static void Smaddl(Bits Rm, Bits Ra, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - int a = (int)UInt(Ra); - - /* Operation */ - Bits operand1 = X(32, n); - Bits operand2 = X(32, m); - Bits operand3 = X(64, a); - - BigInteger result = Int(operand3, false) + (Int(operand1, false) * Int(operand2, false)); - - X(d, result.SubBigInteger(63, 0)); - } - - // umaddl.html - public static void Umaddl(Bits Rm, Bits Ra, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - int a = (int)UInt(Ra); - - /* Operation */ - Bits operand1 = X(32, n); - Bits operand2 = X(32, m); - Bits operand3 = X(64, a); - - BigInteger result = Int(operand3, true) + (Int(operand1, true) * Int(operand2, true)); - - X(d, result.SubBigInteger(63, 0)); - } - - // smsubl.html - public static void Smsubl(Bits Rm, Bits Ra, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - int a = (int)UInt(Ra); - - /* Operation */ - Bits operand1 = X(32, n); - Bits operand2 = X(32, m); - Bits operand3 = X(64, a); - - BigInteger result = Int(operand3, false) - (Int(operand1, false) * Int(operand2, false)); - - X(d, result.SubBigInteger(63, 0)); - } - - // umsubl.html - public static void Umsubl(Bits Rm, Bits Ra, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - int a = (int)UInt(Ra); - - /* Operation */ - Bits operand1 = X(32, n); - Bits operand2 = X(32, m); - Bits operand3 = X(64, a); - - BigInteger result = Int(operand3, true) - (Int(operand1, true) * Int(operand2, true)); - - X(d, result.SubBigInteger(63, 0)); - } - - // smulh.html - public static void Smulh(Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* Operation */ - Bits operand1 = X(64, n); - Bits operand2 = X(64, m); - - BigInteger result = Int(operand1, false) * Int(operand2, false); - - X(d, result.SubBigInteger(127, 64)); - } - - // umulh.html - public static void Umulh(Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* Operation */ - Bits operand1 = X(64, n); - Bits operand2 = X(64, m); - - BigInteger result = Int(operand1, true) * Int(operand2, true); - - X(d, result.SubBigInteger(127, 64)); - } -#endregion - } - - // fpsimdindex.html - internal static class SimdFp - { -#region "Simd" - // abs_advsimd.html#ABS_asisdmisc_R - public static void Abs_S(Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool neg = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - - BigInteger element; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - if (neg) - { - element = -element; - } - else - { - element = Abs(element); - } - - Elem(result, e, esize, element.SubBigInteger(esize - 1, 0)); - } - - V(d, result); - } - - // abs_advsimd.html#ABS_asimdmisc_R - public static void Abs_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool neg = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - - BigInteger element; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - if (neg) - { - element = -element; - } - else - { - element = Abs(element); - } - - Elem(result, e, esize, element.SubBigInteger(esize - 1, 0)); - } - - V(d, result); - } - - // addp_advsimd_pair.html - public static void Addp_S(Bits size, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize * 2; - // int elements = 2; - - ReduceOp op = ReduceOp.ReduceOp_ADD; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand = V(datasize, n); - - V(d, Reduce(op, operand, esize)); - } - - // addv_advsimd.html - public static void Addv_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size:Q == '100' then ReservedValue(); */ - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - // int elements = datasize / esize; - - ReduceOp op = ReduceOp.ReduceOp_ADD; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand = V(datasize, n); - - V(d, Reduce(op, operand, esize)); - } - - // cls_advsimd.html - public static void Cls_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - CountOp countop = (U ? CountOp.CountOp_CLZ : CountOp.CountOp_CLS); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - - BigInteger count; - - for (int e = 0; e <= elements - 1; e++) - { - if (countop == CountOp.CountOp_CLS) - { - count = (BigInteger)CountLeadingSignBits(Elem(operand, e, esize)); - } - else - { - count = (BigInteger)CountLeadingZeroBits(Elem(operand, e, esize)); - } - - Elem(result, e, esize, count.SubBigInteger(esize - 1, 0)); - } - - V(d, result); - } - - // clz_advsimd.html - public static void Clz_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - CountOp countop = (U ? CountOp.CountOp_CLZ : CountOp.CountOp_CLS); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - - BigInteger count; - - for (int e = 0; e <= elements - 1; e++) - { - if (countop == CountOp.CountOp_CLS) - { - count = (BigInteger)CountLeadingSignBits(Elem(operand, e, esize)); - } - else - { - count = (BigInteger)CountLeadingZeroBits(Elem(operand, e, esize)); - } - - Elem(result, e, esize, count.SubBigInteger(esize - 1, 0)); - } - - V(d, result); - } - - // cmeq_advsimd_zero.html#CMEQ_asisdmisc_Z - public static void Cmeq_Zero_S(Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - const bool op = true; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - CompareOp comparison; - - switch (Bits.Concat(op, U)) - { - case Bits bits when bits == "00": - comparison = CompareOp.CompareOp_GT; - break; - case Bits bits when bits == "01": - comparison = CompareOp.CompareOp_GE; - break; - default: - case Bits bits when bits == "10": - comparison = CompareOp.CompareOp_EQ; - break; - case Bits bits when bits == "11": - comparison = CompareOp.CompareOp_LE; - break; - } - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - switch (comparison) - { - case CompareOp.CompareOp_GT: - test_passed = (element > (BigInteger)0); - break; - case CompareOp.CompareOp_GE: - test_passed = (element >= (BigInteger)0); - break; - default: - case CompareOp.CompareOp_EQ: - test_passed = (element == (BigInteger)0); - break; - case CompareOp.CompareOp_LE: - test_passed = (element <= (BigInteger)0); - break; - case CompareOp.CompareOp_LT: - test_passed = (element < (BigInteger)0); - break; - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmeq_advsimd_zero.html#CMEQ_asimdmisc_Z - public static void Cmeq_Zero_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - const bool op = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - CompareOp comparison; - - switch (Bits.Concat(op, U)) - { - case Bits bits when bits == "00": - comparison = CompareOp.CompareOp_GT; - break; - case Bits bits when bits == "01": - comparison = CompareOp.CompareOp_GE; - break; - default: - case Bits bits when bits == "10": - comparison = CompareOp.CompareOp_EQ; - break; - case Bits bits when bits == "11": - comparison = CompareOp.CompareOp_LE; - break; - } - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - switch (comparison) - { - case CompareOp.CompareOp_GT: - test_passed = (element > (BigInteger)0); - break; - case CompareOp.CompareOp_GE: - test_passed = (element >= (BigInteger)0); - break; - default: - case CompareOp.CompareOp_EQ: - test_passed = (element == (BigInteger)0); - break; - case CompareOp.CompareOp_LE: - test_passed = (element <= (BigInteger)0); - break; - case CompareOp.CompareOp_LT: - test_passed = (element < (BigInteger)0); - break; - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmge_advsimd_zero.html#CMGE_asisdmisc_Z - public static void Cmge_Zero_S(Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - const bool op = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - CompareOp comparison; - - switch (Bits.Concat(op, U)) - { - case Bits bits when bits == "00": - comparison = CompareOp.CompareOp_GT; - break; - default: - case Bits bits when bits == "01": - comparison = CompareOp.CompareOp_GE; - break; - case Bits bits when bits == "10": - comparison = CompareOp.CompareOp_EQ; - break; - case Bits bits when bits == "11": - comparison = CompareOp.CompareOp_LE; - break; - } - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - switch (comparison) - { - case CompareOp.CompareOp_GT: - test_passed = (element > (BigInteger)0); - break; - default: - case CompareOp.CompareOp_GE: - test_passed = (element >= (BigInteger)0); - break; - case CompareOp.CompareOp_EQ: - test_passed = (element == (BigInteger)0); - break; - case CompareOp.CompareOp_LE: - test_passed = (element <= (BigInteger)0); - break; - case CompareOp.CompareOp_LT: - test_passed = (element < (BigInteger)0); - break; - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmge_advsimd_zero.html#CMGE_asimdmisc_Z - public static void Cmge_Zero_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - const bool op = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - CompareOp comparison; - - switch (Bits.Concat(op, U)) - { - case Bits bits when bits == "00": - comparison = CompareOp.CompareOp_GT; - break; - default: - case Bits bits when bits == "01": - comparison = CompareOp.CompareOp_GE; - break; - case Bits bits when bits == "10": - comparison = CompareOp.CompareOp_EQ; - break; - case Bits bits when bits == "11": - comparison = CompareOp.CompareOp_LE; - break; - } - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - switch (comparison) - { - case CompareOp.CompareOp_GT: - test_passed = (element > (BigInteger)0); - break; - default: - case CompareOp.CompareOp_GE: - test_passed = (element >= (BigInteger)0); - break; - case CompareOp.CompareOp_EQ: - test_passed = (element == (BigInteger)0); - break; - case CompareOp.CompareOp_LE: - test_passed = (element <= (BigInteger)0); - break; - case CompareOp.CompareOp_LT: - test_passed = (element < (BigInteger)0); - break; - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmgt_advsimd_zero.html#CMGT_asisdmisc_Z - public static void Cmgt_Zero_S(Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - const bool op = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - CompareOp comparison; - - switch (Bits.Concat(op, U)) - { - default: - case Bits bits when bits == "00": - comparison = CompareOp.CompareOp_GT; - break; - case Bits bits when bits == "01": - comparison = CompareOp.CompareOp_GE; - break; - case Bits bits when bits == "10": - comparison = CompareOp.CompareOp_EQ; - break; - case Bits bits when bits == "11": - comparison = CompareOp.CompareOp_LE; - break; - } - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - switch (comparison) - { - default: - case CompareOp.CompareOp_GT: - test_passed = (element > (BigInteger)0); - break; - case CompareOp.CompareOp_GE: - test_passed = (element >= (BigInteger)0); - break; - case CompareOp.CompareOp_EQ: - test_passed = (element == (BigInteger)0); - break; - case CompareOp.CompareOp_LE: - test_passed = (element <= (BigInteger)0); - break; - case CompareOp.CompareOp_LT: - test_passed = (element < (BigInteger)0); - break; - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmgt_advsimd_zero.html#CMGT_asimdmisc_Z - public static void Cmgt_Zero_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - const bool op = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - CompareOp comparison; - - switch (Bits.Concat(op, U)) - { - default: - case Bits bits when bits == "00": - comparison = CompareOp.CompareOp_GT; - break; - case Bits bits when bits == "01": - comparison = CompareOp.CompareOp_GE; - break; - case Bits bits when bits == "10": - comparison = CompareOp.CompareOp_EQ; - break; - case Bits bits when bits == "11": - comparison = CompareOp.CompareOp_LE; - break; - } - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - switch (comparison) - { - default: - case CompareOp.CompareOp_GT: - test_passed = (element > (BigInteger)0); - break; - case CompareOp.CompareOp_GE: - test_passed = (element >= (BigInteger)0); - break; - case CompareOp.CompareOp_EQ: - test_passed = (element == (BigInteger)0); - break; - case CompareOp.CompareOp_LE: - test_passed = (element <= (BigInteger)0); - break; - case CompareOp.CompareOp_LT: - test_passed = (element < (BigInteger)0); - break; - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmle_advsimd.html#CMLE_asisdmisc_Z - public static void Cmle_S(Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - const bool op = true; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - CompareOp comparison; - - switch (Bits.Concat(op, U)) - { - case Bits bits when bits == "00": - comparison = CompareOp.CompareOp_GT; - break; - case Bits bits when bits == "01": - comparison = CompareOp.CompareOp_GE; - break; - case Bits bits when bits == "10": - comparison = CompareOp.CompareOp_EQ; - break; - default: - case Bits bits when bits == "11": - comparison = CompareOp.CompareOp_LE; - break; - } - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - switch (comparison) - { - case CompareOp.CompareOp_GT: - test_passed = (element > (BigInteger)0); - break; - case CompareOp.CompareOp_GE: - test_passed = (element >= (BigInteger)0); - break; - case CompareOp.CompareOp_EQ: - test_passed = (element == (BigInteger)0); - break; - default: - case CompareOp.CompareOp_LE: - test_passed = (element <= (BigInteger)0); - break; - case CompareOp.CompareOp_LT: - test_passed = (element < (BigInteger)0); - break; - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmle_advsimd.html#CMLE_asimdmisc_Z - public static void Cmle_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - const bool op = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - CompareOp comparison; - - switch (Bits.Concat(op, U)) - { - case Bits bits when bits == "00": - comparison = CompareOp.CompareOp_GT; - break; - case Bits bits when bits == "01": - comparison = CompareOp.CompareOp_GE; - break; - case Bits bits when bits == "10": - comparison = CompareOp.CompareOp_EQ; - break; - default: - case Bits bits when bits == "11": - comparison = CompareOp.CompareOp_LE; - break; - } - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - switch (comparison) - { - case CompareOp.CompareOp_GT: - test_passed = (element > (BigInteger)0); - break; - case CompareOp.CompareOp_GE: - test_passed = (element >= (BigInteger)0); - break; - case CompareOp.CompareOp_EQ: - test_passed = (element == (BigInteger)0); - break; - default: - case CompareOp.CompareOp_LE: - test_passed = (element <= (BigInteger)0); - break; - case CompareOp.CompareOp_LT: - test_passed = (element < (BigInteger)0); - break; - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmlt_advsimd.html#CMLT_asisdmisc_Z - public static void Cmlt_S(Bits size, Bits Rn, Bits Rd) - { - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - CompareOp comparison = CompareOp.CompareOp_LT; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - switch (comparison) - { - case CompareOp.CompareOp_GT: - test_passed = (element > (BigInteger)0); - break; - case CompareOp.CompareOp_GE: - test_passed = (element >= (BigInteger)0); - break; - case CompareOp.CompareOp_EQ: - test_passed = (element == (BigInteger)0); - break; - case CompareOp.CompareOp_LE: - test_passed = (element <= (BigInteger)0); - break; - default: - case CompareOp.CompareOp_LT: - test_passed = (element < (BigInteger)0); - break; - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmlt_advsimd.html#CMLT_asimdmisc_Z - public static void Cmlt_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - CompareOp comparison = CompareOp.CompareOp_LT; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - switch (comparison) - { - case CompareOp.CompareOp_GT: - test_passed = (element > (BigInteger)0); - break; - case CompareOp.CompareOp_GE: - test_passed = (element >= (BigInteger)0); - break; - case CompareOp.CompareOp_EQ: - test_passed = (element == (BigInteger)0); - break; - case CompareOp.CompareOp_LE: - test_passed = (element <= (BigInteger)0); - break; - default: - case CompareOp.CompareOp_LT: - test_passed = (element < (BigInteger)0); - break; - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cnt_advsimd.html - public static void Cnt_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size != '00' then ReservedValue(); */ - - int esize = 8; - int datasize = (Q ? 128 : 64); - int elements = datasize / 8; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - - BigInteger count; - - for (int e = 0; e <= elements - 1; e++) - { - count = (BigInteger)BitCount(Elem(operand, e, esize)); - - Elem(result, e, esize, count.SubBigInteger(esize - 1, 0)); - } - - V(d, result); - } - - // fcvtns_advsimd.html#FCVTNS_asisdmisc_R - public static void Fcvtns_S(Bits sz, Bits Rn, Bits Rd) - { - const bool U = false; - const bool o2 = false; - const bool o1 = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int esize = 32 << (int)UInt(sz); - int datasize = esize; - int elements = 1; - - FPRounding rounding = FPDecodeRounding(Bits.Concat(o1, o2)); - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - Bits element; - - for (int e = 0; e <= elements - 1; e++) - { - element = Elem(operand, e, esize); - - Elem(result, e, esize, FPToFixed(esize, element, 0, unsigned, FPCR, rounding)); - } - - V(d, result); - } - - // fcvtns_advsimd.html#FCVTNS_asimdmisc_R - public static void Fcvtns_V(bool Q, Bits sz, Bits Rn, Bits Rd) - { - const bool U = false; - const bool o2 = false; - const bool o1 = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if sz:Q == '10' then ReservedValue(); */ - - int esize = 32 << (int)UInt(sz); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - FPRounding rounding = FPDecodeRounding(Bits.Concat(o1, o2)); - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - Bits element; - - for (int e = 0; e <= elements - 1; e++) - { - element = Elem(operand, e, esize); - - Elem(result, e, esize, FPToFixed(esize, element, 0, unsigned, FPCR, rounding)); - } - - V(d, result); - } - - // fcvtnu_advsimd.html#FCVTNU_asisdmisc_R - public static void Fcvtnu_S(Bits sz, Bits Rn, Bits Rd) - { - const bool U = true; - const bool o2 = false; - const bool o1 = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int esize = 32 << (int)UInt(sz); - int datasize = esize; - int elements = 1; - - FPRounding rounding = FPDecodeRounding(Bits.Concat(o1, o2)); - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - Bits element; - - for (int e = 0; e <= elements - 1; e++) - { - element = Elem(operand, e, esize); - - Elem(result, e, esize, FPToFixed(esize, element, 0, unsigned, FPCR, rounding)); - } - - V(d, result); - } - - // fcvtnu_advsimd.html#FCVTNU_asimdmisc_R - public static void Fcvtnu_V(bool Q, Bits sz, Bits Rn, Bits Rd) - { - const bool U = true; - const bool o2 = false; - const bool o1 = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if sz:Q == '10' then ReservedValue(); */ - - int esize = 32 << (int)UInt(sz); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - FPRounding rounding = FPDecodeRounding(Bits.Concat(o1, o2)); - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - Bits element; - - for (int e = 0; e <= elements - 1; e++) - { - element = Elem(operand, e, esize); - - Elem(result, e, esize, FPToFixed(esize, element, 0, unsigned, FPCR, rounding)); - } - - V(d, result); - } - - // neg_advsimd.html#NEG_asisdmisc_R - public static void Neg_S(Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool neg = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - - BigInteger element; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - if (neg) - { - element = -element; - } - else - { - element = Abs(element); - } - - Elem(result, e, esize, element.SubBigInteger(esize - 1, 0)); - } - - V(d, result); - } - - // neg_advsimd.html#NEG_asimdmisc_R - public static void Neg_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool neg = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - - BigInteger element; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - if (neg) - { - element = -element; - } - else - { - element = Abs(element); - } - - Elem(result, e, esize, element.SubBigInteger(esize - 1, 0)); - } - - V(d, result); - } - - // not_advsimd.html - public static void Not_V(bool Q, Bits Rn, Bits Rd) - { - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int esize = 8; - int datasize = (Q ? 128 : 64); - int elements = datasize / 8; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - Bits element; - - for (int e = 0; e <= elements - 1; e++) - { - element = Elem(operand, e, esize); - - Elem(result, e, esize, NOT(element)); - } - - V(d, result); - } - - // rbit_advsimd.html - public static void Rbit_V(bool Q, Bits Rn, Bits Rd) - { - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int esize = 8; - int datasize = (Q ? 128 : 64); - int elements = datasize / 8; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - Bits element; - Bits rev = new Bits(esize); - - for (int e = 0; e <= elements - 1; e++) - { - element = Elem(operand, e, esize); - - for (int i = 0; i <= esize - 1; i++) - { - rev[esize - 1 - i] = element[i]; - } - - Elem(result, e, esize, rev); - } - - V(d, result); - } - - // rev16_advsimd.html - public static void Rev16_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - const bool o0 = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - // size=esize: B(0), H(1), S(1), D(S) - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - - // op=REVx: 64(0), 32(1), 16(2) - Bits op = Bits.Concat(o0, U); - - // => op+size: - // 64+B = 0, 64+H = 1, 64+S = 2, 64+D = X - // 32+B = 1, 32+H = 2, 32+S = X, 32+D = X - // 16+B = 2, 16+H = X, 16+S = X, 16+D = X - // 8+B = X, 8+H = X, 8+S = X, 8+D = X - // => 3-(op+size) (index bits in group) - // 64/B = 3, 64+H = 2, 64+S = 1, 64+D = X - // 32+B = 2, 32+H = 1, 32+S = X, 32+D = X - // 16+B = 1, 16+H = X, 16+S = X, 16+D = X - // 8+B = X, 8+H = X, 8+S = X, 8+D = X - - // index bits within group: 1, 2, 3 - /* if UInt(op) + UInt(size) >= 3 then UnallocatedEncoding(); */ - - int container_size; - - switch (op) - { - default: - case Bits bits when bits == "10": - container_size = 16; - break; - case Bits bits when bits == "01": - container_size = 32; - break; - case Bits bits when bits == "00": - container_size = 64; - break; - } - - int containers = datasize / container_size; - int elements_per_container = container_size / esize; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - - int element = 0; - int rev_element; - - for (int c = 0; c <= containers - 1; c++) - { - rev_element = element + elements_per_container - 1; - - for (int e = 0; e <= elements_per_container - 1; e++) - { - Elem(result, rev_element, esize, Elem(operand, element, esize)); - - element = element + 1; - rev_element = rev_element - 1; - } - } - - V(d, result); - } - - // rev32_advsimd.html - public static void Rev32_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - const bool o0 = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - // size=esize: B(0), H(1), S(1), D(S) - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - - // op=REVx: 64(0), 32(1), 16(2) - Bits op = Bits.Concat(o0, U); - - // => op+size: - // 64+B = 0, 64+H = 1, 64+S = 2, 64+D = X - // 32+B = 1, 32+H = 2, 32+S = X, 32+D = X - // 16+B = 2, 16+H = X, 16+S = X, 16+D = X - // 8+B = X, 8+H = X, 8+S = X, 8+D = X - // => 3-(op+size) (index bits in group) - // 64/B = 3, 64+H = 2, 64+S = 1, 64+D = X - // 32+B = 2, 32+H = 1, 32+S = X, 32+D = X - // 16+B = 1, 16+H = X, 16+S = X, 16+D = X - // 8+B = X, 8+H = X, 8+S = X, 8+D = X - - // index bits within group: 1, 2, 3 - /* if UInt(op) + UInt(size) >= 3 then UnallocatedEncoding(); */ - - int container_size; - - switch (op) - { - case Bits bits when bits == "10": - container_size = 16; - break; - default: - case Bits bits when bits == "01": - container_size = 32; - break; - case Bits bits when bits == "00": - container_size = 64; - break; - } - - int containers = datasize / container_size; - int elements_per_container = container_size / esize; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - - int element = 0; - int rev_element; - - for (int c = 0; c <= containers - 1; c++) - { - rev_element = element + elements_per_container - 1; - - for (int e = 0; e <= elements_per_container - 1; e++) - { - Elem(result, rev_element, esize, Elem(operand, element, esize)); - - element = element + 1; - rev_element = rev_element - 1; - } - } - - V(d, result); - } - - // rev64_advsimd.html - public static void Rev64_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - const bool o0 = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - // size=esize: B(0), H(1), S(1), D(S) - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - - // op=REVx: 64(0), 32(1), 16(2) - Bits op = Bits.Concat(o0, U); - - // => op+size: - // 64+B = 0, 64+H = 1, 64+S = 2, 64+D = X - // 32+B = 1, 32+H = 2, 32+S = X, 32+D = X - // 16+B = 2, 16+H = X, 16+S = X, 16+D = X - // 8+B = X, 8+H = X, 8+S = X, 8+D = X - // => 3-(op+size) (index bits in group) - // 64/B = 3, 64+H = 2, 64+S = 1, 64+D = X - // 32+B = 2, 32+H = 1, 32+S = X, 32+D = X - // 16+B = 1, 16+H = X, 16+S = X, 16+D = X - // 8+B = X, 8+H = X, 8+S = X, 8+D = X - - // index bits within group: 1, 2, 3 - /* if UInt(op) + UInt(size) >= 3 then UnallocatedEncoding(); */ - - int container_size; - - switch (op) - { - case Bits bits when bits == "10": - container_size = 16; - break; - case Bits bits when bits == "01": - container_size = 32; - break; - default: - case Bits bits when bits == "00": - container_size = 64; - break; - } - - int containers = datasize / container_size; - int elements_per_container = container_size / esize; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - - int element = 0; - int rev_element; - - for (int c = 0; c <= containers - 1; c++) - { - rev_element = element + elements_per_container - 1; - - for (int e = 0; e <= elements_per_container - 1; e++) - { - Elem(result, rev_element, esize, Elem(operand, element, esize)); - - element = element + 1; - rev_element = rev_element - 1; - } - } - - V(d, result); - } - - // sadalp_advsimd.html - public static void Sadalp_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - const bool op = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / (2 * esize); - - bool acc = (op == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand = V(datasize, n); - Bits sum; - BigInteger op1; - BigInteger op2; - - Bits result = (acc ? V(datasize, d) : Zeros(datasize)); - - for (int e = 0; e <= elements - 1; e++) - { - op1 = Int(Elem(operand, 2 * e + 0, esize), unsigned); - op2 = Int(Elem(operand, 2 * e + 1, esize), unsigned); - - sum = (op1 + op2).SubBigInteger(2 * esize - 1, 0); - - Elem(result, e, 2 * esize, Elem(result, e, 2 * esize) + sum); - } - - V(d, result); - } - - // saddlp_advsimd.html - public static void Saddlp_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - const bool op = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / (2 * esize); - - bool acc = (op == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand = V(datasize, n); - Bits sum; - BigInteger op1; - BigInteger op2; - - Bits result = (acc ? V(datasize, d) : Zeros(datasize)); - - for (int e = 0; e <= elements - 1; e++) - { - op1 = Int(Elem(operand, 2 * e + 0, esize), unsigned); - op2 = Int(Elem(operand, 2 * e + 1, esize), unsigned); - - sum = (op1 + op2).SubBigInteger(2 * esize - 1, 0); - - Elem(result, e, 2 * esize, Elem(result, e, 2 * esize) + sum); - } - - V(d, result); - } - - // sha256su0_advsimd.html - public static void Sha256su0_V(Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if !HaveCryptoExt() then UnallocatedEncoding(); */ - - /* Operation */ - /* CheckCryptoEnabled64(); */ - - Bits result = new Bits(128); - Bits operand1 = V(128, d); - Bits operand2 = V(128, n); - Bits T = Bits.Concat(operand2[31, 0], operand1[127, 32]); // bits(128) - Bits elt; // bits(32) - - for (int e = 0; e <= 3; e++) - { - elt = Elem(T, e, 32); - elt = EOR(EOR(ROR(elt, 7), ROR(elt, 18)), LSR(elt, 3)); - Elem(result, e, 32, elt + Elem(operand1, e, 32)); - } - - V(d, result); - } - - // sqabs_advsimd.html#SQABS_asisdmisc_R - public static void Sqabs_S(Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool neg = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - if (neg) - { - element = -element; - } - else - { - element = Abs(element); - } - - (Bits _result, bool _sat) = SignedSatQ(element, esize); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // sqabs_advsimd.html#SQABS_asimdmisc_R - public static void Sqabs_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool neg = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - if (neg) - { - element = -element; - } - else - { - element = Abs(element); - } - - (Bits _result, bool _sat) = SignedSatQ(element, esize); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // sqneg_advsimd.html#SQNEG_asisdmisc_R - public static void Sqneg_S(Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool neg = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - if (neg) - { - element = -element; - } - else - { - element = Abs(element); - } - - (Bits _result, bool _sat) = SignedSatQ(element, esize); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // sqneg_advsimd.html#SQNEG_asimdmisc_R - public static void Sqneg_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool neg = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - BigInteger element; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element = SInt(Elem(operand, e, esize)); - - if (neg) - { - element = -element; - } - else - { - element = Abs(element); - } - - (Bits _result, bool _sat) = SignedSatQ(element, esize); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // sqxtn_advsimd.html#SQXTN_asisdmisc_N - public static void Sqxtn_S(Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int part = 0; - int elements = 1; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(2 * datasize, n); - Bits element; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element = Elem(operand, e, 2 * esize); - - (Bits _result, bool _sat) = SatQ(Int(element, unsigned), esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - Vpart(d, part, result); - } - - // sqxtn_advsimd.html#SQXTN_asimdmisc_N - public static void Sqxtn_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(2 * datasize, n); - Bits element; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element = Elem(operand, e, 2 * esize); - - (Bits _result, bool _sat) = SatQ(Int(element, unsigned), esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - Vpart(d, part, result); - } - - // sqxtun_advsimd.html#SQXTUN_asisdmisc_N - public static void Sqxtun_S(Bits size, Bits Rn, Bits Rd) - { - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int part = 0; - int elements = 1; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(2 * datasize, n); - Bits element; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element = Elem(operand, e, 2 * esize); - - (Bits _result, bool _sat) = UnsignedSatQ(SInt(element), esize); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - Vpart(d, part, result); - } - - // sqxtun_advsimd.html#SQXTUN_asimdmisc_N - public static void Sqxtun_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(2 * datasize, n); - Bits element; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element = Elem(operand, e, 2 * esize); - - (Bits _result, bool _sat) = UnsignedSatQ(SInt(element), esize); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - Vpart(d, part, result); - } - - // suqadd_advsimd.html#SUQADD_asisdmisc_R - public static void Suqadd_S(Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - Bits operand2 = V(datasize, d); - BigInteger op1; - BigInteger op2; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - op1 = Int(Elem(operand, e, esize), !unsigned); - op2 = Int(Elem(operand2, e, esize), unsigned); - - (Bits _result, bool _sat) = SatQ(op1 + op2, esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // suqadd_advsimd.html#SUQADD_asimdmisc_R - public static void Suqadd_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - Bits operand2 = V(datasize, d); - BigInteger op1; - BigInteger op2; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - op1 = Int(Elem(operand, e, esize), !unsigned); - op2 = Int(Elem(operand2, e, esize), unsigned); - - (Bits _result, bool _sat) = SatQ(op1 + op2, esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // uadalp_advsimd.html - public static void Uadalp_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - const bool op = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / (2 * esize); - - bool acc = (op == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand = V(datasize, n); - Bits sum; - BigInteger op1; - BigInteger op2; - - Bits result = (acc ? V(datasize, d) : Zeros(datasize)); - - for (int e = 0; e <= elements - 1; e++) - { - op1 = Int(Elem(operand, 2 * e + 0, esize), unsigned); - op2 = Int(Elem(operand, 2 * e + 1, esize), unsigned); - - sum = (op1 + op2).SubBigInteger(2 * esize - 1, 0); - - Elem(result, e, 2 * esize, Elem(result, e, 2 * esize) + sum); - } - - V(d, result); - } - - // uaddlp_advsimd.html - public static void Uaddlp_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - const bool op = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / (2 * esize); - - bool acc = (op == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand = V(datasize, n); - Bits sum; - BigInteger op1; - BigInteger op2; - - Bits result = (acc ? V(datasize, d) : Zeros(datasize)); - - for (int e = 0; e <= elements - 1; e++) - { - op1 = Int(Elem(operand, 2 * e + 0, esize), unsigned); - op2 = Int(Elem(operand, 2 * e + 1, esize), unsigned); - - sum = (op1 + op2).SubBigInteger(2 * esize - 1, 0); - - Elem(result, e, 2 * esize, Elem(result, e, 2 * esize) + sum); - } - - V(d, result); - } - - // uqxtn_advsimd.html#UQXTN_asisdmisc_N - public static void Uqxtn_S(Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int part = 0; - int elements = 1; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(2 * datasize, n); - Bits element; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element = Elem(operand, e, 2 * esize); - - (Bits _result, bool _sat) = SatQ(Int(element, unsigned), esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - Vpart(d, part, result); - } - - // uqxtn_advsimd.html#UQXTN_asimdmisc_N - public static void Uqxtn_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(2 * datasize, n); - Bits element; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element = Elem(operand, e, 2 * esize); - - (Bits _result, bool _sat) = SatQ(Int(element, unsigned), esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - Vpart(d, part, result); - } - - // usqadd_advsimd.html#USQADD_asisdmisc_R - public static void Usqadd_S(Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - Bits operand2 = V(datasize, d); - BigInteger op1; - BigInteger op2; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - op1 = Int(Elem(operand, e, esize), !unsigned); - op2 = Int(Elem(operand2, e, esize), unsigned); - - (Bits _result, bool _sat) = SatQ(op1 + op2, esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // usqadd_advsimd.html#USQADD_asimdmisc_R - public static void Usqadd_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(datasize, n); - Bits operand2 = V(datasize, d); - BigInteger op1; - BigInteger op2; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - op1 = Int(Elem(operand, e, esize), !unsigned); - op2 = Int(Elem(operand2, e, esize), unsigned); - - (Bits _result, bool _sat) = SatQ(op1 + op2, esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // xtn_advsimd.html - public static void Xtn_V(bool Q, Bits size, Bits Rn, Bits Rd) - { - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand = V(2 * datasize, n); - Bits element; - - for (int e = 0; e <= elements - 1; e++) - { - element = Elem(operand, e, 2 * esize); - - Elem(result, e, esize, element[esize - 1, 0]); - } - - Vpart(d, part, result); - } -#endregion - -#region "SimdReg" - // add_advsimd.html#ADD_asisdsame_only - public static void Add_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool sub_op = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - Bits element1; - Bits element2; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Elem(operand1, e, esize); - element2 = Elem(operand2, e, esize); - - if (sub_op) - { - Elem(result, e, esize, element1 - element2); - } - else - { - Elem(result, e, esize, element1 + element2); - } - } - - V(d, result); - } - - // add_advsimd.html#ADD_asimdsame_only - public static void Add_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool sub_op = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - Bits element1; - Bits element2; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Elem(operand1, e, esize); - element2 = Elem(operand2, e, esize); - - if (sub_op) - { - Elem(result, e, esize, element1 - element2); - } - else - { - Elem(result, e, esize, element1 + element2); - } - } - - V(d, result); - } - - // addhn_advsimd.html - public static void Addhn_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool o1 = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool round = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(2 * datasize, n); - Bits operand2 = V(2 * datasize, m); - BigInteger round_const = (round ? (BigInteger)1 << (esize - 1) : 0); - Bits sum; - Bits element1; - Bits element2; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Elem(operand1, e, 2 * esize); - element2 = Elem(operand2, e, 2 * esize); - - if (sub_op) - { - sum = element1 - element2; - } - else - { - sum = element1 + element2; - } - - sum = sum + round_const; - - Elem(result, e, esize, sum[2 * esize - 1, esize]); - } - - Vpart(d, part, result); - } - - // addp_advsimd_vec.html - public static void Addp_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - Bits concat = Bits.Concat(operand2, operand1); - Bits element1; - Bits element2; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Elem(concat, 2 * e, esize); - element2 = Elem(concat, (2 * e) + 1, esize); - - Elem(result, e, esize, element1 + element2); - } - - V(d, result); - } - - // and_advsimd.html - public static void And_V(bool Q, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (Q ? 128 : 64); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - - Bits result = AND(operand1, operand2); - - V(d, result); - } - - // bic_advsimd_reg.html - public static void Bic_V(bool Q, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (Q ? 128 : 64); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - - operand2 = NOT(operand2); - - Bits result = AND(operand1, operand2); - - V(d, result); - } - - // bif_advsimd.html - public static void Bif_V(bool Q, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (Q ? 128 : 64); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1; - Bits operand3; - Bits operand4 = V(datasize, n); - - operand1 = V(datasize, d); - operand3 = NOT(V(datasize, m)); - - V(d, EOR(operand1, AND(EOR(operand1, operand4), operand3))); - } - - // bit_advsimd.html - public static void Bit_V(bool Q, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (Q ? 128 : 64); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1; - Bits operand3; - Bits operand4 = V(datasize, n); - - operand1 = V(datasize, d); - operand3 = V(datasize, m); - - V(d, EOR(operand1, AND(EOR(operand1, operand4), operand3))); - } - - // bsl_advsimd.html - public static void Bsl_V(bool Q, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (Q ? 128 : 64); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1; - Bits operand3; - Bits operand4 = V(datasize, n); - - operand1 = V(datasize, m); - operand3 = V(datasize, d); - - V(d, EOR(operand1, AND(EOR(operand1, operand4), operand3))); - } - - // cmeq_advsimd_reg.html#CMEQ_asisdsame_only - public static void Cmeq_Reg_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool and_test = (U == false); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - Bits element1; - Bits element2; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Elem(operand1, e, esize); - element2 = Elem(operand2, e, esize); - - if (and_test) - { - test_passed = !IsZero(AND(element1, element2)); - } - else - { - test_passed = (element1 == element2); - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmeq_advsimd_reg.html#CMEQ_asimdsame_only - public static void Cmeq_Reg_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool and_test = (U == false); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - Bits element1; - Bits element2; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Elem(operand1, e, esize); - element2 = Elem(operand2, e, esize); - - if (and_test) - { - test_passed = !IsZero(AND(element1, element2)); - } - else - { - test_passed = (element1 == element2); - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmge_advsimd_reg.html#CMGE_asisdsame_only - public static void Cmge_Reg_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool eq = true; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool unsigned = (U == true); - bool cmp_eq = (eq == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - test_passed = (cmp_eq ? element1 >= element2 : element1 > element2); - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmge_advsimd_reg.html#CMGE_asimdsame_only - public static void Cmge_Reg_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool eq = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - bool cmp_eq = (eq == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - test_passed = (cmp_eq ? element1 >= element2 : element1 > element2); - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmgt_advsimd_reg.html#CMGT_asisdsame_only - public static void Cmgt_Reg_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool eq = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool unsigned = (U == true); - bool cmp_eq = (eq == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - test_passed = (cmp_eq ? element1 >= element2 : element1 > element2); - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmgt_advsimd_reg.html#CMGT_asimdsame_only - public static void Cmgt_Reg_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool eq = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - bool cmp_eq = (eq == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - test_passed = (cmp_eq ? element1 >= element2 : element1 > element2); - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmhi_advsimd.html#CMHI_asisdsame_only - public static void Cmhi_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool eq = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool unsigned = (U == true); - bool cmp_eq = (eq == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - test_passed = (cmp_eq ? element1 >= element2 : element1 > element2); - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmhi_advsimd.html#CMHI_asimdsame_only - public static void Cmhi_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool eq = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - bool cmp_eq = (eq == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - test_passed = (cmp_eq ? element1 >= element2 : element1 > element2); - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmhs_advsimd.html#CMHS_asisdsame_only - public static void Cmhs_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool eq = true; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool unsigned = (U == true); - bool cmp_eq = (eq == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - test_passed = (cmp_eq ? element1 >= element2 : element1 > element2); - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmhs_advsimd.html#CMHS_asimdsame_only - public static void Cmhs_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool eq = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - bool cmp_eq = (eq == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - test_passed = (cmp_eq ? element1 >= element2 : element1 > element2); - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmtst_advsimd.html#CMTST_asisdsame_only - public static void Cmtst_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool and_test = (U == false); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - Bits element1; - Bits element2; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Elem(operand1, e, esize); - element2 = Elem(operand2, e, esize); - - if (and_test) - { - test_passed = !IsZero(AND(element1, element2)); - } - else - { - test_passed = (element1 == element2); - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // cmtst_advsimd.html#CMTST_asimdsame_only - public static void Cmtst_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool and_test = (U == false); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - Bits element1; - Bits element2; - - bool test_passed; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Elem(operand1, e, esize); - element2 = Elem(operand2, e, esize); - - if (and_test) - { - test_passed = !IsZero(AND(element1, element2)); - } - else - { - test_passed = (element1 == element2); - } - - Elem(result, e, esize, test_passed ? Ones(esize) : Zeros(esize)); - } - - V(d, result); - } - - // eor_advsimd.html - public static void Eor_V(bool Q, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (Q ? 128 : 64); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1 = V(datasize, m); - Bits operand2 = Zeros(datasize); - Bits operand3 = Ones(datasize); - Bits operand4 = V(datasize, n); - - Bits result = EOR(operand1, AND(EOR(operand2, operand4), operand3)); - - V(d, result); - } - - // orn_advsimd.html - public static void Orn_V(bool Q, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (Q ? 128 : 64); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - - operand2 = NOT(operand2); - - Bits result = OR(operand1, operand2); - - V(d, result); - } - - // orr_advsimd_reg.html - public static void Orr_V(bool Q, Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int datasize = (Q ? 128 : 64); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - - Bits result = OR(operand1, operand2); - - V(d, result); - } - - // raddhn_advsimd.html - public static void Raddhn_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool o1 = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool round = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(2 * datasize, n); - Bits operand2 = V(2 * datasize, m); - BigInteger round_const = (round ? (BigInteger)1 << (esize - 1) : 0); - Bits sum; - Bits element1; - Bits element2; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Elem(operand1, e, 2 * esize); - element2 = Elem(operand2, e, 2 * esize); - - if (sub_op) - { - sum = element1 - element2; - } - else - { - sum = element1 + element2; - } - - sum = sum + round_const; - - Elem(result, e, esize, sum[2 * esize - 1, esize]); - } - - Vpart(d, part, result); - } - - // rsubhn_advsimd.html - public static void Rsubhn_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool o1 = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool round = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(2 * datasize, n); - Bits operand2 = V(2 * datasize, m); - BigInteger round_const = (round ? (BigInteger)1 << (esize - 1) : 0); - Bits sum; - Bits element1; - Bits element2; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Elem(operand1, e, 2 * esize); - element2 = Elem(operand2, e, 2 * esize); - - if (sub_op) - { - sum = element1 - element2; - } - else - { - sum = element1 + element2; - } - - sum = sum + round_const; - - Elem(result, e, esize, sum[2 * esize - 1, esize]); - } - - Vpart(d, part, result); - } - - // saba_advsimd.html - public static void Saba_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool ac = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - bool accumulate = (ac == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - Bits absdiff; - - Bits result = (accumulate ? V(datasize, d) : Zeros(datasize)); - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - absdiff = Abs(element1 - element2).SubBigInteger(esize - 1, 0); - - Elem(result, e, esize, Elem(result, e, esize) + absdiff); - } - - V(d, result); - } - - // sabal_advsimd.html - public static void Sabal_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool op = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool accumulate = (op == false); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1 = Vpart(datasize, n, part); - Bits operand2 = Vpart(datasize, m, part); - BigInteger element1; - BigInteger element2; - Bits absdiff; - - Bits result = (accumulate ? V(2 * datasize, d) : Zeros(2 * datasize)); - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - absdiff = Abs(element1 - element2).SubBigInteger(2 * esize - 1, 0); - - Elem(result, e, 2 * esize, Elem(result, e, 2 * esize) + absdiff); - } - - V(d, result); - } - - // sabd_advsimd.html - public static void Sabd_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool ac = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - bool accumulate = (ac == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - Bits absdiff; - - Bits result = (accumulate ? V(datasize, d) : Zeros(datasize)); - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - absdiff = Abs(element1 - element2).SubBigInteger(esize - 1, 0); - - Elem(result, e, esize, Elem(result, e, esize) + absdiff); - } - - V(d, result); - } - - // sabdl_advsimd.html - public static void Sabdl_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool op = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool accumulate = (op == false); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1 = Vpart(datasize, n, part); - Bits operand2 = Vpart(datasize, m, part); - BigInteger element1; - BigInteger element2; - Bits absdiff; - - Bits result = (accumulate ? V(2 * datasize, d) : Zeros(2 * datasize)); - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - absdiff = Abs(element1 - element2).SubBigInteger(2 * esize - 1, 0); - - Elem(result, e, 2 * esize, Elem(result, e, 2 * esize) + absdiff); - } - - V(d, result); - } - - // saddl_advsimd.html - public static void Saddl_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool o1 = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(2 * datasize); - Bits operand1 = Vpart(datasize, n, part); - Bits operand2 = Vpart(datasize, m, part); - BigInteger element1; - BigInteger element2; - BigInteger sum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - if (sub_op) - { - sum = element1 - element2; - } - else - { - sum = element1 + element2; - } - - Elem(result, e, 2 * esize, sum.SubBigInteger(2 * esize - 1, 0)); - } - - V(d, result); - } - - // saddw_advsimd.html - public static void Saddw_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool o1 = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(2 * datasize); - Bits operand1 = V(2 * datasize, n); - Bits operand2 = Vpart(datasize, m, part); - BigInteger element1; - BigInteger element2; - BigInteger sum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, 2 * esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - if (sub_op) - { - sum = element1 - element2; - } - else - { - sum = element1 + element2; - } - - Elem(result, e, 2 * esize, sum.SubBigInteger(2 * esize - 1, 0)); - } - - V(d, result); - } - - // sha256h_advsimd.html - public static void Sha256h_V(Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if !HaveCryptoExt() then UnallocatedEncoding(); */ - - /* Operation */ - /* CheckCryptoEnabled64(); */ - - Bits result = SHA256hash(V(128, d), V(128, n), V(128, m), true); - - V(d, result); - } - - // sha256h2_advsimd.html - public static void Sha256h2_V(Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if !HaveCryptoExt() then UnallocatedEncoding(); */ - - /* Operation */ - /* CheckCryptoEnabled64(); */ - - Bits result = SHA256hash(V(128, n), V(128, d), V(128, m), false); - - V(d, result); - } - - // sha256su1_advsimd.html - public static void Sha256su1_V(Bits Rm, Bits Rn, Bits Rd) - { - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if !HaveCryptoExt() then UnallocatedEncoding(); */ - - /* Operation */ - /* CheckCryptoEnabled64(); */ - - Bits result = new Bits(128); - Bits operand1 = V(128, d); - Bits operand2 = V(128, n); - Bits operand3 = V(128, m); - Bits T0 = Bits.Concat(operand3[31, 0], operand2[127, 32]); // bits(128) - Bits T1; // bits(64) - Bits elt; // bits(32) - - T1 = operand3[127, 64]; - for (int e = 0; e <= 1; e++) - { - elt = Elem(T1, e, 32); - elt = EOR(EOR(ROR(elt, 17), ROR(elt, 19)), LSR(elt, 10)); - elt = elt + Elem(operand1, e, 32) + Elem(T0, e, 32); - Elem(result, e, 32, elt); - } - - T1 = result[63, 0]; - for (int e = 2; e <= 3; e++) - { - elt = Elem(T1, e - 2, 32); - elt = EOR(EOR(ROR(elt, 17), ROR(elt, 19)), LSR(elt, 10)); - elt = elt + Elem(operand1, e, 32) + Elem(T0, e, 32); - Elem(result, e, 32, elt); - } - - V(d, result); - } - - // shadd_advsimd.html - public static void Shadd_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - BigInteger sum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - sum = element1 + element2; - - Elem(result, e, esize, sum.SubBigInteger(esize, 1)); - } - - V(d, result); - } - - // shsub_advsimd.html - public static void Shsub_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - BigInteger diff; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - diff = element1 - element2; - - Elem(result, e, esize, diff.SubBigInteger(esize, 1)); - } - - V(d, result); - } - - // smlal_advsimd_vec.html - public static void Smlal_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool o1 = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(2 * datasize); - Bits operand1 = Vpart(datasize, n, part); - Bits operand2 = Vpart(datasize, m, part); - Bits operand3 = V(2 * datasize, d); - BigInteger element1; - BigInteger element2; - Bits product; - Bits accum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - product = (element1 * element2).SubBigInteger(2 * esize - 1, 0); - - if (sub_op) - { - accum = Elem(operand3, e, 2 * esize) - product; - } - else - { - accum = Elem(operand3, e, 2 * esize) + product; - } - - Elem(result, e, 2 * esize, accum); - } - - V(d, result); - } - - // smlsl_advsimd_vec.html - public static void Smlsl_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool o1 = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(2 * datasize); - Bits operand1 = Vpart(datasize, n, part); - Bits operand2 = Vpart(datasize, m, part); - Bits operand3 = V(2 * datasize, d); - BigInteger element1; - BigInteger element2; - Bits product; - Bits accum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - product = (element1 * element2).SubBigInteger(2 * esize - 1, 0); - - if (sub_op) - { - accum = Elem(operand3, e, 2 * esize) - product; - } - else - { - accum = Elem(operand3, e, 2 * esize) + product; - } - - Elem(result, e, 2 * esize, accum); - } - - V(d, result); - } - - // sqadd_advsimd.html#SQADD_asisdsame_only - public static void Sqadd_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - BigInteger sum; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - sum = element1 + element2; - - (Bits _result, bool _sat) = SatQ(sum, esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // sqadd_advsimd.html#SQADD_asimdsame_only - public static void Sqadd_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - BigInteger sum; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - sum = element1 + element2; - - (Bits _result, bool _sat) = SatQ(sum, esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // sqdmulh_advsimd_vec.html#SQDMULH_asisdsame_only - public static void Sqdmulh_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' || size == '00' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool rounding = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger round_const = (rounding ? (BigInteger)1 << (esize - 1) : 0); - BigInteger element1; - BigInteger element2; - BigInteger product; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = SInt(Elem(operand1, e, esize)); - element2 = SInt(Elem(operand2, e, esize)); - - product = (2 * element1 * element2) + round_const; - - (Bits _result, bool _sat) = SignedSatQ(product >> esize, esize); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // sqdmulh_advsimd_vec.html#SQDMULH_asimdsame_only - public static void Sqdmulh_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' || size == '00' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool rounding = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger round_const = (rounding ? (BigInteger)1 << (esize - 1) : 0); - BigInteger element1; - BigInteger element2; - BigInteger product; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = SInt(Elem(operand1, e, esize)); - element2 = SInt(Elem(operand2, e, esize)); - - product = (2 * element1 * element2) + round_const; - - (Bits _result, bool _sat) = SignedSatQ(product >> esize, esize); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // sqrdmulh_advsimd_vec.html#SQRDMULH_asisdsame_only - public static void Sqrdmulh_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' || size == '00' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool rounding = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger round_const = (rounding ? (BigInteger)1 << (esize - 1) : 0); - BigInteger element1; - BigInteger element2; - BigInteger product; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = SInt(Elem(operand1, e, esize)); - element2 = SInt(Elem(operand2, e, esize)); - - product = (2 * element1 * element2) + round_const; - - (Bits _result, bool _sat) = SignedSatQ(product >> esize, esize); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // sqrdmulh_advsimd_vec.html#SQRDMULH_asimdsame_only - public static void Sqrdmulh_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' || size == '00' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool rounding = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger round_const = (rounding ? (BigInteger)1 << (esize - 1) : 0); - BigInteger element1; - BigInteger element2; - BigInteger product; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = SInt(Elem(operand1, e, esize)); - element2 = SInt(Elem(operand2, e, esize)); - - product = (2 * element1 * element2) + round_const; - - (Bits _result, bool _sat) = SignedSatQ(product >> esize, esize); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // sqsub_advsimd.html#SQSUB_asisdsame_only - public static void Sqsub_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - BigInteger diff; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - diff = element1 - element2; - - (Bits _result, bool _sat) = SatQ(diff, esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // sqsub_advsimd.html#SQSUB_asimdsame_only - public static void Sqsub_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - BigInteger diff; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - diff = element1 - element2; - - (Bits _result, bool _sat) = SatQ(diff, esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // srhadd_advsimd.html - public static void Srhadd_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - Elem(result, e, esize, (element1 + element2 + 1).SubBigInteger(esize, 1)); - } - - V(d, result); - } - - // ssubl_advsimd.html - public static void Ssubl_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool o1 = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(2 * datasize); - Bits operand1 = Vpart(datasize, n, part); - Bits operand2 = Vpart(datasize, m, part); - BigInteger element1; - BigInteger element2; - BigInteger sum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - if (sub_op) - { - sum = element1 - element2; - } - else - { - sum = element1 + element2; - } - - Elem(result, e, 2 * esize, sum.SubBigInteger(2 * esize - 1, 0)); - } - - V(d, result); - } - - // ssubw_advsimd.html - public static void Ssubw_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool o1 = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(2 * datasize); - Bits operand1 = V(2 * datasize, n); - Bits operand2 = Vpart(datasize, m, part); - BigInteger element1; - BigInteger element2; - BigInteger sum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, 2 * esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - if (sub_op) - { - sum = element1 - element2; - } - else - { - sum = element1 + element2; - } - - Elem(result, e, 2 * esize, sum.SubBigInteger(2 * esize - 1, 0)); - } - - V(d, result); - } - - // sub_advsimd.html#SUB_asisdsame_only - public static void Sub_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size != '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool sub_op = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - Bits element1; - Bits element2; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Elem(operand1, e, esize); - element2 = Elem(operand2, e, esize); - - if (sub_op) - { - Elem(result, e, esize, element1 - element2); - } - else - { - Elem(result, e, esize, element1 + element2); - } - } - - V(d, result); - } - - // sub_advsimd.html#SUB_asimdsame_only - public static void Sub_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool sub_op = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - Bits element1; - Bits element2; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Elem(operand1, e, esize); - element2 = Elem(operand2, e, esize); - - if (sub_op) - { - Elem(result, e, esize, element1 - element2); - } - else - { - Elem(result, e, esize, element1 + element2); - } - } - - V(d, result); - } - - // subhn_advsimd.html - public static void Subhn_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = false; - const bool o1 = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool round = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(2 * datasize, n); - Bits operand2 = V(2 * datasize, m); - BigInteger round_const = (round ? (BigInteger)1 << (esize - 1) : 0); - Bits sum; - Bits element1; - Bits element2; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Elem(operand1, e, 2 * esize); - element2 = Elem(operand2, e, 2 * esize); - - if (sub_op) - { - sum = element1 - element2; - } - else - { - sum = element1 + element2; - } - - sum = sum + round_const; - - Elem(result, e, esize, sum[2 * esize - 1, esize]); - } - - Vpart(d, part, result); - } - - // trn1_advsimd.html - public static void Trn1_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool op = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - int part = (int)UInt(op); - int pairs = elements / 2; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - - for (int p = 0; p <= pairs - 1; p++) - { - Elem(result, 2 * p + 0, esize, Elem(operand1, 2 * p + part, esize)); - Elem(result, 2 * p + 1, esize, Elem(operand2, 2 * p + part, esize)); - } - - V(d, result); - } - - // trn2_advsimd.html - public static void Trn2_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool op = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - int part = (int)UInt(op); - int pairs = elements / 2; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - - for (int p = 0; p <= pairs - 1; p++) - { - Elem(result, 2 * p + 0, esize, Elem(operand1, 2 * p + part, esize)); - Elem(result, 2 * p + 1, esize, Elem(operand2, 2 * p + part, esize)); - } - - V(d, result); - } - - // uaba_advsimd.html - public static void Uaba_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool ac = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - bool accumulate = (ac == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - Bits absdiff; - - Bits result = (accumulate ? V(datasize, d) : Zeros(datasize)); - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - absdiff = Abs(element1 - element2).SubBigInteger(esize - 1, 0); - - Elem(result, e, esize, Elem(result, e, esize) + absdiff); - } - - V(d, result); - } - - // uabal_advsimd.html - public static void Uabal_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool op = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool accumulate = (op == false); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1 = Vpart(datasize, n, part); - Bits operand2 = Vpart(datasize, m, part); - BigInteger element1; - BigInteger element2; - Bits absdiff; - - Bits result = (accumulate ? V(2 * datasize, d) : Zeros(2 * datasize)); - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - absdiff = Abs(element1 - element2).SubBigInteger(2 * esize - 1, 0); - - Elem(result, e, 2 * esize, Elem(result, e, 2 * esize) + absdiff); - } - - V(d, result); - } - - // uabd_advsimd.html - public static void Uabd_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool ac = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - bool accumulate = (ac == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - Bits absdiff; - - Bits result = (accumulate ? V(datasize, d) : Zeros(datasize)); - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - absdiff = Abs(element1 - element2).SubBigInteger(esize - 1, 0); - - Elem(result, e, esize, Elem(result, e, esize) + absdiff); - } - - V(d, result); - } - - // uabdl_advsimd.html - public static void Uabdl_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool op = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool accumulate = (op == false); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits operand1 = Vpart(datasize, n, part); - Bits operand2 = Vpart(datasize, m, part); - BigInteger element1; - BigInteger element2; - Bits absdiff; - - Bits result = (accumulate ? V(2 * datasize, d) : Zeros(2 * datasize)); - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - absdiff = Abs(element1 - element2).SubBigInteger(2 * esize - 1, 0); - - Elem(result, e, 2 * esize, Elem(result, e, 2 * esize) + absdiff); - } - - V(d, result); - } - - // uaddl_advsimd.html - public static void Uaddl_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool o1 = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(2 * datasize); - Bits operand1 = Vpart(datasize, n, part); - Bits operand2 = Vpart(datasize, m, part); - BigInteger element1; - BigInteger element2; - BigInteger sum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - if (sub_op) - { - sum = element1 - element2; - } - else - { - sum = element1 + element2; - } - - Elem(result, e, 2 * esize, sum.SubBigInteger(2 * esize - 1, 0)); - } - - V(d, result); - } - - // uaddw_advsimd.html - public static void Uaddw_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool o1 = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(2 * datasize); - Bits operand1 = V(2 * datasize, n); - Bits operand2 = Vpart(datasize, m, part); - BigInteger element1; - BigInteger element2; - BigInteger sum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, 2 * esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - if (sub_op) - { - sum = element1 - element2; - } - else - { - sum = element1 + element2; - } - - Elem(result, e, 2 * esize, sum.SubBigInteger(2 * esize - 1, 0)); - } - - V(d, result); - } - - // uhadd_advsimd.html - public static void Uhadd_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - BigInteger sum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - sum = element1 + element2; - - Elem(result, e, esize, sum.SubBigInteger(esize, 1)); - } - - V(d, result); - } - - // uhsub_advsimd.html - public static void Uhsub_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - BigInteger diff; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - diff = element1 - element2; - - Elem(result, e, esize, diff.SubBigInteger(esize, 1)); - } - - V(d, result); - } - - // umlal_advsimd_vec.html - public static void Umlal_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool o1 = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(2 * datasize); - Bits operand1 = Vpart(datasize, n, part); - Bits operand2 = Vpart(datasize, m, part); - Bits operand3 = V(2 * datasize, d); - BigInteger element1; - BigInteger element2; - Bits product; - Bits accum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - product = (element1 * element2).SubBigInteger(2 * esize - 1, 0); - - if (sub_op) - { - accum = Elem(operand3, e, 2 * esize) - product; - } - else - { - accum = Elem(operand3, e, 2 * esize) + product; - } - - Elem(result, e, 2 * esize, accum); - } - - V(d, result); - } - - // umlsl_advsimd_vec.html - public static void Umlsl_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool o1 = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(2 * datasize); - Bits operand1 = Vpart(datasize, n, part); - Bits operand2 = Vpart(datasize, m, part); - Bits operand3 = V(2 * datasize, d); - BigInteger element1; - BigInteger element2; - Bits product; - Bits accum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - product = (element1 * element2).SubBigInteger(2 * esize - 1, 0); - - if (sub_op) - { - accum = Elem(operand3, e, 2 * esize) - product; - } - else - { - accum = Elem(operand3, e, 2 * esize) + product; - } - - Elem(result, e, 2 * esize, accum); - } - - V(d, result); - } - - // uqadd_advsimd.html#UQADD_asisdsame_only - public static void Uqadd_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - BigInteger sum; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - sum = element1 + element2; - - (Bits _result, bool _sat) = SatQ(sum, esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // uqadd_advsimd.html#UQADD_asimdsame_only - public static void Uqadd_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - BigInteger sum; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - sum = element1 + element2; - - (Bits _result, bool _sat) = SatQ(sum, esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // uqsub_advsimd.html#UQSUB_asisdsame_only - public static void Uqsub_S(Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Scalar */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - int esize = 8 << (int)UInt(size); - int datasize = esize; - int elements = 1; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - BigInteger diff; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - diff = element1 - element2; - - (Bits _result, bool _sat) = SatQ(diff, esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // uqsub_advsimd.html#UQSUB_asimdsame_only - public static void Uqsub_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode Vector */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - BigInteger diff; - bool sat; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - diff = element1 - element2; - - (Bits _result, bool _sat) = SatQ(diff, esize, unsigned); - Elem(result, e, esize, _result); - sat = _sat; - - if (sat) - { - /* FPSR.QC = '1'; */ - FPSR[27] = true; // TODO: Add named fields. - } - } - - V(d, result); - } - - // urhadd_advsimd.html - public static void Urhadd_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - BigInteger element1; - BigInteger element2; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - Elem(result, e, esize, (element1 + element2 + 1).SubBigInteger(esize, 1)); - } - - V(d, result); - } - - // usubl_advsimd.html - public static void Usubl_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool o1 = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(2 * datasize); - Bits operand1 = Vpart(datasize, n, part); - Bits operand2 = Vpart(datasize, m, part); - BigInteger element1; - BigInteger element2; - BigInteger sum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - if (sub_op) - { - sum = element1 - element2; - } - else - { - sum = element1 + element2; - } - - Elem(result, e, 2 * esize, sum.SubBigInteger(2 * esize - 1, 0)); - } - - V(d, result); - } - - // usubw_advsimd.html - public static void Usubw_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool U = true; - const bool o1 = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size == '11' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = 64; - int part = (int)UInt(Q); - int elements = datasize / esize; - - bool sub_op = (o1 == true); - bool unsigned = (U == true); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(2 * datasize); - Bits operand1 = V(2 * datasize, n); - Bits operand2 = Vpart(datasize, m, part); - BigInteger element1; - BigInteger element2; - BigInteger sum; - - for (int e = 0; e <= elements - 1; e++) - { - element1 = Int(Elem(operand1, e, 2 * esize), unsigned); - element2 = Int(Elem(operand2, e, esize), unsigned); - - if (sub_op) - { - sum = element1 - element2; - } - else - { - sum = element1 + element2; - } - - Elem(result, e, 2 * esize, sum.SubBigInteger(2 * esize - 1, 0)); - } - - V(d, result); - } - - // uzp1_advsimd.html - public static void Uzp1_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool op = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - int part = (int)UInt(op); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operandl = V(datasize, n); - Bits operandh = V(datasize, m); - - Bits zipped = Bits.Concat(operandh, operandl); - - for (int e = 0; e <= elements - 1; e++) - { - Elem(result, e, esize, Elem(zipped, 2 * e + part, esize)); - } - - V(d, result); - } - - // uzp2_advsimd.html - public static void Uzp2_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool op = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - int part = (int)UInt(op); - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operandl = V(datasize, n); - Bits operandh = V(datasize, m); - - Bits zipped = Bits.Concat(operandh, operandl); - - for (int e = 0; e <= elements - 1; e++) - { - Elem(result, e, esize, Elem(zipped, 2 * e + part, esize)); - } - - V(d, result); - } - - // zip1_advsimd.html - public static void Zip1_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool op = false; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - int part = (int)UInt(op); - int pairs = elements / 2; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - - int @base = part * pairs; - - for (int p = 0; p <= pairs - 1; p++) - { - Elem(result, 2 * p + 0, esize, Elem(operand1, @base + p, esize)); - Elem(result, 2 * p + 1, esize, Elem(operand2, @base + p, esize)); - } - - V(d, result); - } - - // zip2_advsimd.html - public static void Zip2_V(bool Q, Bits size, Bits Rm, Bits Rn, Bits Rd) - { - const bool op = true; - - /* Decode */ - int d = (int)UInt(Rd); - int n = (int)UInt(Rn); - int m = (int)UInt(Rm); - - /* if size:Q == '110' then ReservedValue(); */ - - int esize = 8 << (int)UInt(size); - int datasize = (Q ? 128 : 64); - int elements = datasize / esize; - int part = (int)UInt(op); - int pairs = elements / 2; - - /* Operation */ - /* CheckFPAdvSIMDEnabled64(); */ - - Bits result = new Bits(datasize); - Bits operand1 = V(datasize, n); - Bits operand2 = V(datasize, m); - - int @base = part * pairs; - - for (int p = 0; p <= pairs - 1; p++) - { - Elem(result, 2 * p + 0, esize, Elem(operand1, @base + p, esize)); - Elem(result, 2 * p + 1, esize, Elem(operand2, @base + p, esize)); - } - - V(d, result); - } -#endregion - } -} diff --git a/Ryujinx.Tests/Cpu/Tester/Pseudocode.cs b/Ryujinx.Tests/Cpu/Tester/Pseudocode.cs deleted file mode 100644 index f3777476..00000000 --- a/Ryujinx.Tests/Cpu/Tester/Pseudocode.cs +++ /dev/null @@ -1,1740 +0,0 @@ -// https://github.com/LDj3SNuD/ARM_v8-A_AArch64_Instructions_Tester/blob/master/Tester/Pseudocode.cs - -// https://developer.arm.com/products/architecture/a-profile/exploration-tools -// ..\A64_v83A_ISA_xml_00bet6.1\ISA_v83A_A64_xml_00bet6.1_OPT\xhtml\ - -// https://alastairreid.github.io/asl-lexical-syntax/ - -// | ------------------------|-------------------------------- | -// | ASL | C# | -// | ------------------------|-------------------------------- | -// | bit, bits(1); boolean | bool | -// | bits | Bits | -// | integer | BigInteger, int | -// | real | decimal; double, float | -// | ------------------------|-------------------------------- | -// | '0'; FALSE | false | -// | '1'; TRUE | true | -// | '010' | "010" | -// | DIV, MOD | /, % | -// | ------------------------|-------------------------------- | - -using System; -using System.Numerics; - -namespace Ryujinx.Tests.Cpu.Tester -{ - using Types; - - using static Shared; - - internal static class AArch64 - { -#region "exceptions/exceptions/" - /* shared_pseudocode.html#AArch64.ResetControlRegisters.1 */ - public static void ResetControlRegisters(bool cold_reset) - { - PSTATE.N = cold_reset; - PSTATE.Z = cold_reset; - PSTATE.C = cold_reset; - PSTATE.V = cold_reset; - } - - /* */ - public static void TakeReset(bool cold_reset) - { - /* assert !HighestELUsingAArch32(); */ - - // Enter the highest implemented Exception level in AArch64 state - if (HaveEL(EL3)) - { - PSTATE.EL = EL3; - } - else if (HaveEL(EL2)) - { - PSTATE.EL = EL2; - } - else - { - PSTATE.EL = EL1; - } - - // Reset the system registers and other system components - AArch64.ResetControlRegisters(cold_reset); - - // Reset all other PSTATE fields - PSTATE.SP = true; // Select stack pointer - - // All registers, bits and fields not reset by the above pseudocode or by the BranchTo() call - // below are UNKNOWN bitstrings after reset. In particular, the return information registers - // ELR_ELx and SPSR_ELx have UNKNOWN values, so that it - // is impossible to return from a reset in an architecturally defined way. - AArch64.ResetGeneralRegisters(); - AArch64.ResetSIMDFPRegisters(); - AArch64.ResetSpecialRegisters(); - } -#endregion - -#region "functions/registers/" - /* shared_pseudocode.html#AArch64.ResetGeneralRegisters.0 */ - public static void ResetGeneralRegisters() - { - for (int i = 0; i <= 30; i++) - { - /* X[i] = bits(64) UNKNOWN; */ - _R[i].SetAll(false); - } - } - - /* shared_pseudocode.html#AArch64.ResetSIMDFPRegisters.0 */ - public static void ResetSIMDFPRegisters() - { - for (int i = 0; i <= 31; i++) - { - /* V[i] = bits(128) UNKNOWN; */ - _V[i].SetAll(false); - } - } - - /* shared_pseudocode.html#AArch64.ResetSpecialRegisters.0 */ - public static void ResetSpecialRegisters() - { - // AArch64 special registers - /* SP_EL0 = bits(64) UNKNOWN; */ - SP_EL0.SetAll(false); - /* SP_EL1 = bits(64) UNKNOWN; */ - SP_EL1.SetAll(false); - - FPCR.SetAll(false); // TODO: Add named fields. - FPSR.SetAll(false); // TODO: Add named fields. - } - - // shared_pseudocode.html#impl-aarch64.SP.write.0 - public static void SP(Bits value) - { - /* int width = value.Count; */ - - /* assert width IN {32,64}; */ - - if (!PSTATE.SP) - { - SP_EL0 = ZeroExtend(64, value); - } - else - { - switch (PSTATE.EL) - { - case Bits bits when bits == EL0: - SP_EL0 = ZeroExtend(64, value); - break; - default: - case Bits bits when bits == EL1: - SP_EL1 = ZeroExtend(64, value); - break;/* - case Bits bits when bits == EL2: - SP_EL2 = ZeroExtend(64, value); - break; - case Bits bits when bits == EL3: - SP_EL3 = ZeroExtend(64, value); - break;*/ - } - } - } - - // shared_pseudocode.html#impl-aarch64.SP.read.0 - public static Bits SP(int width) - { - /* assert width IN {8,16,32,64}; */ - - if (!PSTATE.SP) - { - return SP_EL0[width - 1, 0]; - } - else - { - switch (PSTATE.EL) - { - case Bits bits when bits == EL0: - return SP_EL0[width - 1, 0]; - default: - case Bits bits when bits == EL1: - return SP_EL1[width - 1, 0];/* - case Bits bits when bits == EL2: - return SP_EL2[width - 1, 0]; - case Bits bits when bits == EL3: - return SP_EL3[width - 1, 0];*/ - } - } - } - - // shared_pseudocode.html#impl-aarch64.V.write.1 - public static void V(int n, Bits value) - { - /* int width = value.Count; */ - - /* assert n >= 0 && n <= 31; */ - /* assert width IN {8,16,32,64,128}; */ - - _V[n] = ZeroExtend(128, value); - } - - /* shared_pseudocode.html#impl-aarch64.V.read.1 */ - public static Bits V(int width, int n) - { - /* assert n >= 0 && n <= 31; */ - /* assert width IN {8,16,32,64,128}; */ - - return _V[n][width - 1, 0]; - } - - /* shared_pseudocode.html#impl-aarch64.Vpart.read.2 */ - public static Bits Vpart(int width, int n, int part) - { - /* assert n >= 0 && n <= 31; */ - /* assert part IN {0, 1}; */ - - if (part == 0) - { - /* assert width IN {8,16,32,64}; */ - return _V[n][width - 1, 0]; - } - else - { - /* assert width == 64; */ - return _V[n][(width * 2) - 1, width]; - } - } - - // shared_pseudocode.html#impl-aarch64.Vpart.write.2 - public static void Vpart(int n, int part, Bits value) - { - int width = value.Count; - - /* assert n >= 0 && n <= 31; */ - /* assert part IN {0, 1}; */ - - if (part == 0) - { - /* assert width IN {8,16,32,64}; */ - _V[n] = ZeroExtend(128, value); - } - else - { - /* assert width == 64; */ - _V[n][(width * 2) - 1, width] = value[width - 1, 0]; - } - } - - // shared_pseudocode.html#impl-aarch64.X.write.1 - public static void X(int n, Bits value) - { - /* int width = value.Count; */ - - /* assert n >= 0 && n <= 31; */ - /* assert width IN {32,64}; */ - - if (n != 31) - { - _R[n] = ZeroExtend(64, value); - } - } - - /* shared_pseudocode.html#impl-aarch64.X.read.1 */ - public static Bits X(int width, int n) - { - /* assert n >= 0 && n <= 31; */ - /* assert width IN {8,16,32,64}; */ - - if (n != 31) - { - return _R[n][width - 1, 0]; - } - else - { - return Zeros(width); - } - } -#endregion - -#region "instrs/countop/" - // shared_pseudocode.html#CountOp - public enum CountOp {CountOp_CLZ, CountOp_CLS, CountOp_CNT}; -#endregion - -#region "instrs/extendreg/" - /* shared_pseudocode.html#impl-aarch64.DecodeRegExtend.1 */ - public static ExtendType DecodeRegExtend(Bits op) - { - switch (op) - { - default: - case Bits bits when bits == "000": - return ExtendType.ExtendType_UXTB; - case Bits bits when bits == "001": - return ExtendType.ExtendType_UXTH; - case Bits bits when bits == "010": - return ExtendType.ExtendType_UXTW; - case Bits bits when bits == "011": - return ExtendType.ExtendType_UXTX; - case Bits bits when bits == "100": - return ExtendType.ExtendType_SXTB; - case Bits bits when bits == "101": - return ExtendType.ExtendType_SXTH; - case Bits bits when bits == "110": - return ExtendType.ExtendType_SXTW; - case Bits bits when bits == "111": - return ExtendType.ExtendType_SXTX; - } - } - - /* shared_pseudocode.html#impl-aarch64.ExtendReg.3 */ - public static Bits ExtendReg(int N, int reg, ExtendType type, int shift) - { - /* assert shift >= 0 && shift <= 4; */ - - Bits val = X(N, reg); - bool unsigned; - int len; - - switch (type) - { - default: - case ExtendType.ExtendType_SXTB: - unsigned = false; len = 8; - break; - case ExtendType.ExtendType_SXTH: - unsigned = false; len = 16; - break; - case ExtendType.ExtendType_SXTW: - unsigned = false; len = 32; - break; - case ExtendType.ExtendType_SXTX: - unsigned = false; len = 64; - break; - case ExtendType.ExtendType_UXTB: - unsigned = true; len = 8; - break; - case ExtendType.ExtendType_UXTH: - unsigned = true; len = 16; - break; - case ExtendType.ExtendType_UXTW: - unsigned = true; len = 32; - break; - case ExtendType.ExtendType_UXTX: - unsigned = true; len = 64; - break; - } - - // Note the extended width of the intermediate value and - // that sign extension occurs from bit <len+shift-1>, not - // from bit <len-1>. This is equivalent to the instruction - // [SU]BFIZ Rtmp, Rreg, #shift, #len - // It may also be seen as a sign/zero extend followed by a shift: - // LSL(Extend(val<len-1:0>, N, unsigned), shift); - - len = Min(len, N - shift); - return Extend(Bits.Concat(val[len - 1, 0], Zeros(shift)), N, unsigned); - } - - // shared_pseudocode.html#ExtendType - public enum ExtendType {ExtendType_SXTB, ExtendType_SXTH, ExtendType_SXTW, ExtendType_SXTX, - ExtendType_UXTB, ExtendType_UXTH, ExtendType_UXTW, ExtendType_UXTX}; -#endregion - -#region "instrs/integer/bitmasks/" - /* shared_pseudocode.html#impl-aarch64.DecodeBitMasks.4 */ - public static (Bits, Bits) DecodeBitMasks(int M, bool immN, Bits imms, Bits immr, bool immediate) - { - Bits tmask, wmask; - Bits tmask_and, wmask_and; - Bits tmask_or, wmask_or; - Bits levels; - - // Compute log2 of element size - // 2^len must be in range [2, M] - int len = HighestSetBit(Bits.Concat(immN, NOT(imms))); - /* if len < 1 then ReservedValue(); */ - /* assert M >= (1 << len); */ - - // Determine S, R and S - R parameters - levels = ZeroExtend(Ones(len), 6); - - // For logical immediates an all-ones value of S is reserved - // since it would generate a useless all-ones result (many times) - /* if immediate && (imms AND levels) == levels then ReservedValue(); */ - - BigInteger S = UInt(AND(imms, levels)); - BigInteger R = UInt(AND(immr, levels)); - BigInteger diff = S - R; // 6-bit subtract with borrow - - // Compute "top mask" - tmask_and = OR(diff.SubBigInteger(5, 0), NOT(levels)); - tmask_or = AND(diff.SubBigInteger(5, 0), levels); - - tmask = Ones(64); - tmask = OR(AND(tmask, Replicate(Bits.Concat(Replicate(tmask_and[0], 1), Ones( 1)), 32)), Replicate(Bits.Concat(Zeros( 1), Replicate(tmask_or[0], 1)), 32)); - tmask = OR(AND(tmask, Replicate(Bits.Concat(Replicate(tmask_and[1], 2), Ones( 2)), 16)), Replicate(Bits.Concat(Zeros( 2), Replicate(tmask_or[1], 2)), 16)); - tmask = OR(AND(tmask, Replicate(Bits.Concat(Replicate(tmask_and[2], 4), Ones( 4)), 8)), Replicate(Bits.Concat(Zeros( 4), Replicate(tmask_or[2], 4)), 8)); - tmask = OR(AND(tmask, Replicate(Bits.Concat(Replicate(tmask_and[3], 8), Ones( 8)), 4)), Replicate(Bits.Concat(Zeros( 8), Replicate(tmask_or[3], 8)), 4)); - tmask = OR(AND(tmask, Replicate(Bits.Concat(Replicate(tmask_and[4], 16), Ones(16)), 2)), Replicate(Bits.Concat(Zeros(16), Replicate(tmask_or[4], 16)), 2)); - tmask = OR(AND(tmask, Replicate(Bits.Concat(Replicate(tmask_and[5], 32), Ones(32)), 1)), Replicate(Bits.Concat(Zeros(32), Replicate(tmask_or[5], 32)), 1)); - - // Compute "wraparound mask" - wmask_and = OR(immr, NOT(levels)); - wmask_or = AND(immr, levels); - - wmask = Zeros(64); - wmask = OR(AND(wmask, Replicate(Bits.Concat(Ones( 1), Replicate(wmask_and[0], 1)), 32)), Replicate(Bits.Concat(Replicate(wmask_or[0], 1), Zeros( 1)), 32)); - wmask = OR(AND(wmask, Replicate(Bits.Concat(Ones( 2), Replicate(wmask_and[1], 2)), 16)), Replicate(Bits.Concat(Replicate(wmask_or[1], 2), Zeros( 2)), 16)); - wmask = OR(AND(wmask, Replicate(Bits.Concat(Ones( 4), Replicate(wmask_and[2], 4)), 8)), Replicate(Bits.Concat(Replicate(wmask_or[2], 4), Zeros( 4)), 8)); - wmask = OR(AND(wmask, Replicate(Bits.Concat(Ones( 8), Replicate(wmask_and[3], 8)), 4)), Replicate(Bits.Concat(Replicate(wmask_or[3], 8), Zeros( 8)), 4)); - wmask = OR(AND(wmask, Replicate(Bits.Concat(Ones(16), Replicate(wmask_and[4], 16)), 2)), Replicate(Bits.Concat(Replicate(wmask_or[4], 16), Zeros(16)), 2)); - wmask = OR(AND(wmask, Replicate(Bits.Concat(Ones(32), Replicate(wmask_and[5], 32)), 1)), Replicate(Bits.Concat(Replicate(wmask_or[5], 32), Zeros(32)), 1)); - - if (diff.SubBigInteger(6)) // borrow from S - R - { - wmask = AND(wmask, tmask); - } - else - { - wmask = OR(wmask, tmask); - } - - return (wmask[M - 1, 0], tmask[M - 1, 0]); - } -#endregion - -#region "instrs/integer/shiftreg/" - /* shared_pseudocode.html#impl-aarch64.DecodeShift.1 */ - public static ShiftType DecodeShift(Bits op) - { - switch (op) - { - default: - case Bits bits when bits == "00": - return ShiftType.ShiftType_LSL; - case Bits bits when bits == "01": - return ShiftType.ShiftType_LSR; - case Bits bits when bits == "10": - return ShiftType.ShiftType_ASR; - case Bits bits when bits == "11": - return ShiftType.ShiftType_ROR; - } - } - - /* shared_pseudocode.html#impl-aarch64.ShiftReg.3 */ - public static Bits ShiftReg(int N, int reg, ShiftType type, int amount) - { - Bits result = X(N, reg); - - switch (type) - { - default: - case ShiftType.ShiftType_LSL: - result = LSL(result, amount); - break; - case ShiftType.ShiftType_LSR: - result = LSR(result, amount); - break; - case ShiftType.ShiftType_ASR: - result = ASR(result, amount); - break; - case ShiftType.ShiftType_ROR: - result = ROR(result, amount); - break; - } - - return result; - } - - // shared_pseudocode.html#ShiftType - public enum ShiftType {ShiftType_LSL, ShiftType_LSR, ShiftType_ASR, ShiftType_ROR}; -#endregion - -#region "instrs/vector/arithmetic/unary/cmp/compareop/" - // shared_pseudocode.html#CompareOp - public enum CompareOp {CompareOp_GT, CompareOp_GE, CompareOp_EQ, CompareOp_LE, CompareOp_LT}; -#endregion - -#region "instrs/vector/reduce/reduceop/" - // shared_pseudocode.html#impl-aarch64.Reduce.3 - public static Bits Reduce(ReduceOp op, Bits input, int esize) - { - int N = input.Count; - - int half; - Bits hi; - Bits lo; - Bits result = new Bits(esize); - - if (N == esize) - { - return new Bits(input); // Clone. - } - - half = N / 2; - hi = Reduce(op, input[N - 1, half], esize); - lo = Reduce(op, input[half - 1, 0], esize); - - switch (op) - { - case ReduceOp.ReduceOp_FMINNUM: - /* result = FPMinNum(lo, hi, FPCR); */ - break; - case ReduceOp.ReduceOp_FMAXNUM: - /* result = FPMaxNum(lo, hi, FPCR); */ - break; - case ReduceOp.ReduceOp_FMIN: - /* result = FPMin(lo, hi, FPCR); */ - break; - case ReduceOp.ReduceOp_FMAX: - /* result = FPMax(lo, hi, FPCR); */ - break; - case ReduceOp.ReduceOp_FADD: - /* result = FPAdd(lo, hi, FPCR); */ - break; - default: - case ReduceOp.ReduceOp_ADD: - result = lo + hi; - break; - } - - return result; - } - - // shared_pseudocode.html#ReduceOp - public enum ReduceOp {ReduceOp_FMINNUM, ReduceOp_FMAXNUM, - ReduceOp_FMIN, ReduceOp_FMAX, - ReduceOp_FADD, ReduceOp_ADD}; -#endregion - } - - internal static class Shared - { - static Shared() - { - _R = new Bits[31]; - for (int i = 0; i <= 30; i++) - { - _R[i] = new Bits(64, false); - } - - _V = new Bits[32]; - for (int i = 0; i <= 31; i++) - { - _V[i] = new Bits(128, false); - } - - SP_EL0 = new Bits(64, false); - SP_EL1 = new Bits(64, false); - - FPCR = new Bits(32, false); // TODO: Add named fields. - FPSR = new Bits(32, false); // TODO: Add named fields. - - PSTATE.N = false; - PSTATE.Z = false; - PSTATE.C = false; - PSTATE.V = false; - PSTATE.EL = EL1; - PSTATE.SP = true; - } - -#region "functions/common/" - /* */ - public static Bits AND(Bits x, Bits y) - { - return x.And(y); - } - - // shared_pseudocode.html#impl-shared.ASR.2 - public static Bits ASR(Bits x, int shift) - { - int N = x.Count; - - /* assert shift >= 0; */ - - Bits result; - - if (shift == 0) - { - result = new Bits(x); // Clone. - } - else - { - (result, _) = ASR_C(x, shift); - } - - return result; - } - - // shared_pseudocode.html#impl-shared.ASR_C.2 - public static (Bits, bool) ASR_C(Bits x, int shift) - { - int N = x.Count; - - /* assert shift > 0; */ - - Bits extended_x = SignExtend(x, shift + N); - Bits result = extended_x[shift + N - 1, shift]; - bool carry_out = extended_x[shift - 1]; - - return (result, carry_out); - } - - // shared_pseudocode.html#impl-shared.Abs.1 - public static BigInteger Abs(BigInteger x) - { - return (x >= 0 ? x : -x); - } - - // shared_pseudocode.html#impl-shared.BitCount.1 - public static int BitCount(Bits x) - { - int N = x.Count; - - int result = 0; - - for (int i = 0; i <= N - 1; i++) - { - if (x[i]) - { - result = result + 1; - } - } - - return result; - } - - // shared_pseudocode.html#impl-shared.CountLeadingSignBits.1 - public static int CountLeadingSignBits(Bits x) - { - int N = x.Count; - - return CountLeadingZeroBits(EOR(x[N - 1, 1], x[N - 2, 0])); - } - - // shared_pseudocode.html#impl-shared.CountLeadingZeroBits.1 - public static int CountLeadingZeroBits(Bits x) - { - int N = x.Count; - - return (N - 1 - HighestSetBit(x)); - } - - // shared_pseudocode.html#impl-shared.Elem.read.3 - public static Bits Elem(/*in */Bits vector, int e, int size) - { - /* int N = vector.Count; */ - - /* assert e >= 0 && (e+1)*size <= N; */ - - return vector[e * size + size - 1, e * size]; - } - - // shared_pseudocode.html#impl-shared.Elem.write.3 - public static void Elem(/*out */Bits vector, int e, int size, Bits value) - { - /* int N = vector.Count; */ - - /* assert e >= 0 && (e+1)*size <= N; */ - - vector[(e + 1) * size - 1, e * size] = value; - } - - /* */ - public static Bits EOR(Bits x, Bits y) - { - return x.Xor(y); - } - - // shared_pseudocode.html#impl-shared.Extend.3 - public static Bits Extend(Bits x, int N, bool unsigned) - { - if (unsigned) - { - return ZeroExtend(x, N); - } - else - { - return SignExtend(x, N); - } - } - - /* shared_pseudocode.html#impl-shared.Extend.2 */ - public static Bits Extend(int N, Bits x, bool unsigned) - { - return Extend(x, N, unsigned); - } - - // shared_pseudocode.html#impl-shared.HighestSetBit.1 - public static int HighestSetBit(Bits x) - { - int N = x.Count; - - for (int i = N - 1; i >= 0; i--) - { - if (x[i]) - { - return i; - } - } - - return -1; - } - - // shared_pseudocode.html#impl-shared.Int.2 - public static BigInteger Int(Bits x, bool unsigned) - { - return (unsigned ? UInt(x) : SInt(x)); - } - - // shared_pseudocode.html#impl-shared.IsOnes.1 - public static bool IsOnes(Bits x) - { - int N = x.Count; - - return (x == Ones(N)); - } - - // shared_pseudocode.html#impl-shared.IsZero.1 - public static bool IsZero(Bits x) - { - int N = x.Count; - - return (x == Zeros(N)); - } - - // shared_pseudocode.html#impl-shared.IsZeroBit.1 - public static bool IsZeroBit(Bits x) - { - return IsZero(x); - } - - // shared_pseudocode.html#impl-shared.LSL.2 - public static Bits LSL(Bits x, int shift) - { - int N = x.Count; - - /* assert shift >= 0; */ - - Bits result; - - if (shift == 0) - { - result = new Bits(x); // Clone. - } - else - { - (result, _) = LSL_C(x, shift); - } - - return result; - } - - // shared_pseudocode.html#impl-shared.LSL_C.2 - public static (Bits, bool) LSL_C(Bits x, int shift) - { - int N = x.Count; - - /* assert shift > 0; */ - - Bits extended_x = Bits.Concat(x, Zeros(shift)); - Bits result = extended_x[N - 1, 0]; - bool carry_out = extended_x[N]; - - return (result, carry_out); - } - - // shared_pseudocode.html#impl-shared.LSR.2 - public static Bits LSR(Bits x, int shift) - { - int N = x.Count; - - /* assert shift >= 0; */ - - Bits result; - - if (shift == 0) - { - result = new Bits(x); // Clone. - } - else - { - (result, _) = LSR_C(x, shift); - } - - return result; - } - - // shared_pseudocode.html#impl-shared.LSR_C.2 - public static (Bits, bool) LSR_C(Bits x, int shift) - { - int N = x.Count; - - /* assert shift > 0; */ - - Bits extended_x = ZeroExtend(x, shift + N); - Bits result = extended_x[shift + N - 1, shift]; - bool carry_out = extended_x[shift - 1]; - - return (result, carry_out); - } - - // shared_pseudocode.html#impl-shared.Min.2 - public static int Min(int a, int b) - { - if (a <= b) - { - return a; - } - else - { - return b; - } - } - - /* shared_pseudocode.html#impl-shared.NOT.1 */ - public static Bits NOT(Bits x) - { - return x.Not(); - } - - // shared_pseudocode.html#impl-shared.Ones.1 - /* shared_pseudocode.html#impl-shared.Ones.0 */ - public static Bits Ones(int N) - { - return Replicate(true, N); - } - - /* */ - public static Bits OR(Bits x, Bits y) - { - return x.Or(y); - } - - /* */ - public static decimal Real(BigInteger value) - { - return (decimal)value; - } - - /* */ - public static float Real_32(BigInteger value) - { - if (value == BigInteger.Pow((BigInteger)2.0f, 1000)) - { - return float.PositiveInfinity; - } - if (value == -BigInteger.Pow((BigInteger)2.0f, 1000)) - { - return float.NegativeInfinity; - } - - return (float)value; - } - - /* */ - public static double Real_64(BigInteger value) - { - if (value == BigInteger.Pow((BigInteger)2.0, 10000)) - { - return double.PositiveInfinity; - } - if (value == -BigInteger.Pow((BigInteger)2.0, 10000)) - { - return double.NegativeInfinity; - } - - return (double)value; - } - - // shared_pseudocode.html#impl-shared.ROR.2 - public static Bits ROR(Bits x, int shift) - { - /* assert shift >= 0; */ - - Bits result; - - if (shift == 0) - { - result = new Bits(x); // Clone. - } - else - { - (result, _) = ROR_C(x, shift); - } - - return result; - } - - // shared_pseudocode.html#impl-shared.ROR_C.2 - public static (Bits, bool) ROR_C(Bits x, int shift) - { - int N = x.Count; - - /* assert shift != 0; */ - - int m = shift % N; - Bits result = OR(LSR(x, m), LSL(x, N - m)); - bool carry_out = result[N - 1]; - - return (result, carry_out); - } - - /* shared_pseudocode.html#impl-shared.Replicate.1 */ - public static Bits Replicate(int N, Bits x) - { - int M = x.Count; - - /* assert N MOD M == 0; */ - - return Replicate(x, N / M); - } - - /* shared_pseudocode.html#impl-shared.Replicate.2 */ - public static Bits Replicate(Bits x, int N) - { - int M = x.Count; - - bool[] dst = new bool[M * N]; - - for (int i = 0; i < N; i++) - { - x.CopyTo(dst, i * M); - } - - return new Bits(dst); - } - - /* shared_pseudocode.html#impl-shared.RoundDown.1 */ - public static BigInteger RoundDown(decimal x) - { - return (BigInteger)Decimal.Floor(x); - } - - /* */ - public static BigInteger RoundDown_32(float x) - { - if (float.IsPositiveInfinity(x)) - { - return BigInteger.Pow((BigInteger)2.0f, 1000); - } - if (float.IsNegativeInfinity(x)) - { - return -BigInteger.Pow((BigInteger)2.0f, 1000); - } - - return (BigInteger)MathF.Floor(x); - } - - /* */ - public static BigInteger RoundDown_64(double x) - { - if (double.IsPositiveInfinity(x)) - { - return BigInteger.Pow((BigInteger)2.0, 10000); - } - if (double.IsNegativeInfinity(x)) - { - return -BigInteger.Pow((BigInteger)2.0, 10000); - } - - return (BigInteger)Math.Floor(x); - } - - // shared_pseudocode.html#impl-shared.RoundTowardsZero.1 - public static BigInteger RoundTowardsZero(decimal x) - { - if (x == 0.0m) - { - return (BigInteger)0m; - } - else if (x >= 0.0m) - { - return RoundDown(x); - } - else - { - return RoundUp(x); - } - } - - /* shared_pseudocode.html#impl-shared.RoundUp.1 */ - public static BigInteger RoundUp(decimal x) - { - return (BigInteger)Decimal.Ceiling(x); - } - - // shared_pseudocode.html#impl-shared.SInt.1 - public static BigInteger SInt(Bits x) - { - int N = x.Count; - - BigInteger result = 0; - - for (int i = 0; i <= N - 1; i++) - { - if (x[i]) - { - result = result + BigInteger.Pow(2, i); - } - } - - if (x[N - 1]) - { - result = result - BigInteger.Pow(2, N); - } - - return result; - } - - // shared_pseudocode.html#impl-shared.SignExtend.2 - public static Bits SignExtend(Bits x, int N) - { - int M = x.Count; - - /* assert N >= M; */ - - return Bits.Concat(Replicate(x[M - 1], N - M), x); - } - - /* shared_pseudocode.html#impl-shared.SignExtend.1 */ - public static Bits SignExtend(int N, Bits x) - { - return SignExtend(x, N); - } - - // shared_pseudocode.html#impl-shared.UInt.1 - public static BigInteger UInt(Bits x) - { - int N = x.Count; - - BigInteger result = 0; - - for (int i = 0; i <= N - 1; i++) - { - if (x[i]) - { - result = result + BigInteger.Pow(2, i); - } - } - - return result; - } - - // shared_pseudocode.html#impl-shared.ZeroExtend.2 - public static Bits ZeroExtend(Bits x, int N) - { - int M = x.Count; - - /* assert N >= M; */ - - return Bits.Concat(Zeros(N - M), x); - } - - /* shared_pseudocode.html#impl-shared.ZeroExtend.1 */ - public static Bits ZeroExtend(int N, Bits x) - { - return ZeroExtend(x, N); - } - - // shared_pseudocode.html#impl-shared.Zeros.1 - /* shared_pseudocode.html#impl-shared.Zeros.0 */ - public static Bits Zeros(int N) - { - return Replicate(false, N); - } -#endregion - -#region "functions/crc/" - // shared_pseudocode.html#impl-shared.BitReverse.1 - public static Bits BitReverse(Bits data) - { - int N = data.Count; - - Bits result = new Bits(N); - - for (int i = 0; i <= N - 1; i++) - { - result[N - i - 1] = data[i]; - } - - return result; - } - - // shared_pseudocode.html#impl-shared.Poly32Mod2.2 - public static Bits Poly32Mod2(Bits _data, Bits poly) - { - int N = _data.Count; - - /* assert N > 32; */ - - Bits data = new Bits(_data); // Clone. - - for (int i = N - 1; i >= 32; i--) - { - if (data[i]) - { - data[i - 1, 0] = EOR(data[i - 1, 0], Bits.Concat(poly, Zeros(i - 32))); - } - } - - return data[31, 0]; - } -#endregion - -#region "functions/crypto/" - // shared_pseudocode.html#impl-shared.ROL.2 - public static Bits ROL(Bits x, int shift) - { - int N = x.Count; - - /* assert shift >= 0 && shift <= N; */ - - if (shift == 0) - { - return new Bits(x); // Clone. - } - - return ROR(x, N - shift); - } - - // shared_pseudocode.html#impl-shared.SHA256hash.4 - public static Bits SHA256hash(Bits _X, Bits _Y, Bits W, bool part1) - { - Bits X = new Bits(_X); // Clone. - Bits Y = new Bits(_Y); // Clone. - - Bits chs, maj, t; // bits(32) - - for (int e = 0; e <= 3; e++) - { - chs = SHAchoose(Y[31, 0], Y[63, 32], Y[95, 64]); - maj = SHAmajority(X[31, 0], X[63, 32], X[95, 64]); - - t = Y[127, 96] + SHAhashSIGMA1(Y[31, 0]) + chs + Elem(W, e, 32); - - X[127, 96] = t + X[127, 96]; - Y[127, 96] = t + SHAhashSIGMA0(X[31, 0]) + maj; - - // TODO: Implement ASL: "<,>" as C#: "Bits.Split()". - /* <Y, X> = ROL(Y : X, 32); */ - Bits YX = ROL(Bits.Concat(Y, X), 32); - Y = YX[255, 128]; - X = YX[127, 0]; - } - - return (part1 ? X : Y); - } - - // shared_pseudocode.html#impl-shared.SHAchoose.3 - public static Bits SHAchoose(Bits x, Bits y, Bits z) - { - return EOR(AND(EOR(y, z), x), z); - } - - // shared_pseudocode.html#impl-shared.SHAhashSIGMA0.1 - public static Bits SHAhashSIGMA0(Bits x) - { - return EOR(EOR(ROR(x, 2), ROR(x, 13)), ROR(x, 22)); - } - - // shared_pseudocode.html#impl-shared.SHAhashSIGMA1.1 - public static Bits SHAhashSIGMA1(Bits x) - { - return EOR(EOR(ROR(x, 6), ROR(x, 11)), ROR(x, 25)); - } - - // shared_pseudocode.html#impl-shared.SHAmajority.3 - public static Bits SHAmajority(Bits x, Bits y, Bits z) - { - return OR(AND(x, y), AND(OR(x, y), z)); - } -#endregion - -#region "functions/float/fpdecoderounding/" - /* shared_pseudocode.html#impl-shared.FPDecodeRounding.1 */ - public static FPRounding FPDecodeRounding(Bits rmode) - { - switch (rmode) - { - default: - case Bits bits when bits == "00": - return FPRounding.FPRounding_TIEEVEN; // N - case Bits bits when bits == "01": - return FPRounding.FPRounding_POSINF; // P - case Bits bits when bits == "10": - return FPRounding.FPRounding_NEGINF; // M - case Bits bits when bits == "11": - return FPRounding.FPRounding_ZERO; // Z - } - } -#endregion - -#region "functions/float/fpexc/" - // shared_pseudocode.html#FPExc - public enum FPExc {FPExc_InvalidOp, FPExc_DivideByZero, FPExc_Overflow, - FPExc_Underflow, FPExc_Inexact, FPExc_InputDenorm}; -#endregion - -#region "functions/float/fpprocessexception/" - // shared_pseudocode.html#impl-shared.FPProcessException.2 - public static void FPProcessException(FPExc exception, Bits _fpcr) - { - Bits fpcr = new Bits(_fpcr); // Clone. - - int cumul; - - // Determine the cumulative exception bit number - switch (exception) - { - default: - case FPExc.FPExc_InvalidOp: cumul = 0; break; - case FPExc.FPExc_DivideByZero: cumul = 1; break; - case FPExc.FPExc_Overflow: cumul = 2; break; - case FPExc.FPExc_Underflow: cumul = 3; break; - case FPExc.FPExc_Inexact: cumul = 4; break; - case FPExc.FPExc_InputDenorm: cumul = 7; break; - } - - int enable = cumul + 8; - - if (fpcr[enable]) - { - // Trapping of the exception enabled. - // It is IMPLEMENTATION DEFINED whether the enable bit may be set at all, and - // if so then how exceptions may be accumulated before calling FPTrapException() - /* IMPLEMENTATION_DEFINED "floating-point trap handling"; */ - - throw new NotImplementedException(); - }/* - else if (UsingAArch32()) - { - // Set the cumulative exception bit - FPSCR<cumul> = '1'; - }*/ - else - { - // Set the cumulative exception bit - FPSR[cumul] = true; - } - } -#endregion - -#region "functions/float/fprounding/" - // shared_pseudocode.html#FPRounding - public enum FPRounding {FPRounding_TIEEVEN, FPRounding_POSINF, - FPRounding_NEGINF, FPRounding_ZERO, - FPRounding_TIEAWAY, FPRounding_ODD}; -#endregion - -#region "functions/float/fptofixed/" - /* shared_pseudocode.html#impl-shared.FPToFixed.5 */ - public static Bits FPToFixed(int M, Bits op, int fbits, bool unsigned, Bits _fpcr, FPRounding rounding) - { - int N = op.Count; - - /* assert N IN {16,32,64}; */ - /* assert M IN {16,32,64}; */ - /* assert fbits >= 0; */ - /* assert rounding != FPRounding_ODD; */ - - Bits fpcr = new Bits(_fpcr); // Clone. - - if (N == 16) - { - throw new NotImplementedException(); - } - else if (N == 32) - { - // Unpack using fpcr to determine if subnormals are flushed-to-zero - (FPType type, bool sign, float value) = FPUnpack_32(op, fpcr); - - // If NaN, set cumulative flag or take exception - if (type == FPType.FPType_SNaN || type == FPType.FPType_QNaN) - { - FPProcessException(FPExc.FPExc_InvalidOp, fpcr); - } - - // Scale by fractional bits and produce integer rounded towards minus-infinity - value = value * MathF.Pow(2.0f, fbits); - BigInteger int_result = RoundDown_32(value); - float error = value - Real_32(int_result); - - if (float.IsNaN(error)) - { - error = 0.0f; - } - - // Determine whether supplied rounding mode requires an increment - bool round_up; - - switch (rounding) - { - default: - case FPRounding.FPRounding_TIEEVEN: - round_up = (error > 0.5f || (error == 0.5f && int_result.SubBigInteger(0))); - break; - case FPRounding.FPRounding_POSINF: - round_up = (error != 0.0f); - break; - case FPRounding.FPRounding_NEGINF: - round_up = false; - break; - case FPRounding.FPRounding_ZERO: - round_up = (error != 0.0f && int_result < (BigInteger)0); - break; - case FPRounding.FPRounding_TIEAWAY: - round_up = (error > 0.5f || (error == 0.5f && int_result >= (BigInteger)0)); - break; - } - - if (round_up) - { - int_result = int_result + 1; - } - - // Generate saturated result and exceptions - (Bits result, bool overflow) = SatQ(int_result, M, unsigned); - - if (overflow) - { - FPProcessException(FPExc.FPExc_InvalidOp, fpcr); - } - else if (error != 0.0f) - { - FPProcessException(FPExc.FPExc_Inexact, fpcr); - } - - return result; - } - else /* if (N == 64) */ - { - // Unpack using fpcr to determine if subnormals are flushed-to-zero - (FPType type, bool sign, double value) = FPUnpack_64(op, fpcr); - - // If NaN, set cumulative flag or take exception - if (type == FPType.FPType_SNaN || type == FPType.FPType_QNaN) - { - FPProcessException(FPExc.FPExc_InvalidOp, fpcr); - } - - // Scale by fractional bits and produce integer rounded towards minus-infinity - value = value * Math.Pow(2.0, fbits); - BigInteger int_result = RoundDown_64(value); - double error = value - Real_64(int_result); - - if (double.IsNaN(error)) - { - error = 0.0; - } - - // Determine whether supplied rounding mode requires an increment - bool round_up; - - switch (rounding) - { - default: - case FPRounding.FPRounding_TIEEVEN: - round_up = (error > 0.5 || (error == 0.5 && int_result.SubBigInteger(0))); - break; - case FPRounding.FPRounding_POSINF: - round_up = (error != 0.0); - break; - case FPRounding.FPRounding_NEGINF: - round_up = false; - break; - case FPRounding.FPRounding_ZERO: - round_up = (error != 0.0 && int_result < (BigInteger)0); - break; - case FPRounding.FPRounding_TIEAWAY: - round_up = (error > 0.5 || (error == 0.5 && int_result >= (BigInteger)0)); - break; - } - - if (round_up) - { - int_result = int_result + 1; - } - - // Generate saturated result and exceptions - (Bits result, bool overflow) = SatQ(int_result, M, unsigned); - - if (overflow) - { - FPProcessException(FPExc.FPExc_InvalidOp, fpcr); - } - else if (error != 0.0) - { - FPProcessException(FPExc.FPExc_Inexact, fpcr); - } - - return result; - } - } -#endregion - -#region "functions/float/fptype/" - // shared_pseudocode.html#FPType - public enum FPType {FPType_Nonzero, FPType_Zero, FPType_Infinity, - FPType_QNaN, FPType_SNaN}; -#endregion - -#region "functions/float/fpunpack/" - /* shared_pseudocode.html#impl-shared.FPUnpack.2 */ - /* shared_pseudocode.html#impl-shared.FPUnpackBase.2 */ - /*public static (FPType, bool, real) FPUnpack_16(Bits fpval, Bits _fpcr) - { - int N = fpval.Count; - - // assert N == 16; - - Bits fpcr = new Bits(_fpcr); // Clone. - - fpcr[26] = false; - - return FPUnpackBase_16(fpval, fpcr); - }*/ - public static (FPType, bool, float) FPUnpack_32(Bits fpval, Bits _fpcr) - { - int N = fpval.Count; - - /* assert N == 32; */ - - Bits fpcr = new Bits(_fpcr); // Clone. - - FPType type; - float value; - - bool sign = fpval[31]; - Bits exp32 = fpval[30, 23]; - Bits frac32 = fpval[22, 0]; - - if (IsZero(exp32)) - { - // Produce zero if value is zero or flush-to-zero is selected. - if (IsZero(frac32) || fpcr[24]) - { - type = FPType.FPType_Zero; - value = 0.0f; - - // Denormalized input flushed to zero - if (!IsZero(frac32)) - { - FPProcessException(FPExc.FPExc_InputDenorm, fpcr); - } - } - else - { - type = FPType.FPType_Nonzero; - value = MathF.Pow(2.0f, -126) * (Real_32(UInt(frac32)) * MathF.Pow(2.0f, -23)); - } - } - else if (IsOnes(exp32)) - { - if (IsZero(frac32)) - { - type = FPType.FPType_Infinity; - /* value = 2.0^1000000; */ - value = MathF.Pow(2.0f, 1000); - } - else - { - type = frac32[22] ? FPType.FPType_QNaN : FPType.FPType_SNaN; - value = 0.0f; - } - } - else - { - type = FPType.FPType_Nonzero; - value = MathF.Pow(2.0f, (int)UInt(exp32) - 127) * (1.0f + Real_32(UInt(frac32)) * MathF.Pow(2.0f, -23)); - } - - if (sign) - { - value = -value; - } - - return (type, sign, value); - } - public static (FPType, bool, double) FPUnpack_64(Bits fpval, Bits _fpcr) - { - int N = fpval.Count; - - /* assert N == 64; */ - - Bits fpcr = new Bits(_fpcr); // Clone. - - FPType type; - double value; - - bool sign = fpval[63]; - Bits exp64 = fpval[62, 52]; - Bits frac64 = fpval[51, 0]; - - if (IsZero(exp64)) - { - // Produce zero if value is zero or flush-to-zero is selected. - if (IsZero(frac64) || fpcr[24]) - { - type = FPType.FPType_Zero; - value = 0.0; - - // Denormalized input flushed to zero - if (!IsZero(frac64)) - { - FPProcessException(FPExc.FPExc_InputDenorm, fpcr); - } - } - else - { - type = FPType.FPType_Nonzero; - value = Math.Pow(2.0, -1022) * (Real_64(UInt(frac64)) * Math.Pow(2.0, -52)); - } - } - else if (IsOnes(exp64)) - { - if (IsZero(frac64)) - { - type = FPType.FPType_Infinity; - /* value = 2.0^1000000; */ - value = Math.Pow(2.0, 10000); - } - else - { - type = frac64[51] ? FPType.FPType_QNaN : FPType.FPType_SNaN; - value = 0.0; - } - } - else - { - type = FPType.FPType_Nonzero; - value = Math.Pow(2.0, (int)UInt(exp64) - 1023) * (1.0 + Real_64(UInt(frac64)) * Math.Pow(2.0, -52)); - } - - if (sign) - { - value = -value; - } - - return (type, sign, value); - } - - /* shared_pseudocode.html#impl-shared.FPUnpackCV.2 */ - /* shared_pseudocode.html#impl-shared.FPUnpackBase.2 */ - /*public static (FPType, bool, real) FPUnpackCV_16(Bits fpval, Bits _fpcr) - { - int N = fpval.Count; - - // assert N == 16; - - Bits fpcr = new Bits(_fpcr); // Clone. - - fpcr[19] = false; - - return FPUnpackBase_16(fpval, fpcr); - }*/ - public static (FPType, bool, float) FPUnpackCV_32(Bits fpval, Bits _fpcr) - { - return FPUnpack_32(fpval, _fpcr); - } - public static (FPType, bool, double) FPUnpackCV_64(Bits fpval, Bits _fpcr) - { - return FPUnpack_64(fpval, _fpcr); - } -#endregion - -#region "functions/integer/" - /* shared_pseudocode.html#impl-shared.AddWithCarry.3 */ - public static (Bits, Bits) AddWithCarry(int N, Bits x, Bits y, bool carry_in) - { - BigInteger unsigned_sum = UInt(x) + UInt(y) + UInt(carry_in); - BigInteger signed_sum = SInt(x) + SInt(y) + UInt(carry_in); - - Bits result = unsigned_sum.SubBigInteger(N - 1, 0); // same value as signed_sum<N-1:0> - - bool n = result[N - 1]; - bool z = IsZero(result); - bool c = !(UInt(result) == unsigned_sum); - bool v = !(SInt(result) == signed_sum); - - return (result, Bits.Concat(n, z, c, v)); - } -#endregion - -#region "functions/registers/" - public static readonly Bits[] _R; - - public static readonly Bits[] _V; - - public static Bits SP_EL0; - public static Bits SP_EL1; - - public static Bits FPCR; // TODO: Add named fields. - // [ 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 22 | 21 20 | 19 | 18 17 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 ] - // [ 0 | 0 | 0 | 0 | 0 | AHP | DN | FZ | RMode | Stride | FZ16 | Len | IDE | 0 | 0 | IXE | UFE | OFE | DZE | IOE | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 ] - public static Bits FPSR; // TODO: Add named fields. - // [ 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 ] - // [ N | Z | C | V | QC | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | IDC | 0 | 0 | IXC | UFC | OFC | DZC | IOC ] -#endregion - -#region "functions/system/" - // shared_pseudocode.html#impl-shared.ConditionHolds.1 - public static bool ConditionHolds(Bits cond) - { - bool result; - - // Evaluate base condition. - switch (cond[3, 1]) - { - case Bits bits when bits == "000": - result = (PSTATE.Z == true); // EQ or NE - break; - case Bits bits when bits == "001": - result = (PSTATE.C == true); // CS or CC - break; - case Bits bits when bits == "010": - result = (PSTATE.N == true); // MI or PL - break; - case Bits bits when bits == "011": - result = (PSTATE.V == true); // VS or VC - break; - case Bits bits when bits == "100": - result = (PSTATE.C == true && PSTATE.Z == false); // HI or LS - break; - case Bits bits when bits == "101": - result = (PSTATE.N == PSTATE.V); // GE or LT - break; - case Bits bits when bits == "110": - result = (PSTATE.N == PSTATE.V && PSTATE.Z == false); // GT or LE - break; - default: - case Bits bits when bits == "111": - result = true; // AL - break; - } - - // Condition flag values in the set '111x' indicate always true - // Otherwise, invert condition if necessary. - if (cond[0] == true && cond != "1111") - { - result = !result; - } - - return result; - } - - // shared_pseudocode.html#EL3 - public static readonly Bits EL3 = "11"; - // shared_pseudocode.html#EL2 - public static readonly Bits EL2 = "10"; - // shared_pseudocode.html#EL1 - public static readonly Bits EL1 = "01"; - // shared_pseudocode.html#EL0 - public static readonly Bits EL0 = "00"; - - /* shared_pseudocode.html#impl-shared.HaveEL.1 */ - public static bool HaveEL(Bits el) - { - // TODO: Implement ASL: "IN" as C#: "Bits.In()". - /* if el IN {EL1,EL0} then */ - if (el == EL1 || el == EL0) - { - return true; // EL1 and EL0 must exist - } - - /* return boolean IMPLEMENTATION_DEFINED; */ - return false; - } - - public static ProcState PSTATE; - - /* shared_pseudocode.html#ProcState */ - internal struct ProcState - { - public void NZCV(Bits nzcv) // ASL: ".<,,,>". - { - N = nzcv[3]; - Z = nzcv[2]; - C = nzcv[1]; - V = nzcv[0]; - } - - public void NZCV(bool n, bool z, bool c, bool v) // ASL: ".<,,,>". - { - N = n; - Z = z; - C = c; - V = v; - } - - public bool N; // Negative condition flag - public bool Z; // Zero condition flag - public bool C; // Carry condition flag - public bool V; // oVerflow condition flag - public Bits EL; // Exception Level - public bool SP; // Stack pointer select: 0=SP0, 1=SPx [AArch64 only] - } -#endregion - -#region "functions/vector/" - // shared_pseudocode.html#impl-shared.SatQ.3 - public static (Bits, bool) SatQ(BigInteger i, int N, bool unsigned) - { - (Bits result, bool sat) = (unsigned ? UnsignedSatQ(i, N) : SignedSatQ(i, N)); - - return (result, sat); - } - - // shared_pseudocode.html#impl-shared.SignedSatQ.2 - public static (Bits, bool) SignedSatQ(BigInteger i, int N) - { - BigInteger result; - bool saturated; - - if (i > BigInteger.Pow(2, N - 1) - 1) - { - result = BigInteger.Pow(2, N - 1) - 1; - saturated = true; - } - else if (i < -(BigInteger.Pow(2, N - 1))) - { - result = -(BigInteger.Pow(2, N - 1)); - saturated = true; - } - else - { - result = i; - saturated = false; - } - - return (result.SubBigInteger(N - 1, 0), saturated); - } - - // shared_pseudocode.html#impl-shared.UnsignedSatQ.2 - public static (Bits, bool) UnsignedSatQ(BigInteger i, int N) - { - BigInteger result; - bool saturated; - - if (i > BigInteger.Pow(2, N) - 1) - { - result = BigInteger.Pow(2, N) - 1; - saturated = true; - } - else if (i < (BigInteger)0) - { - result = (BigInteger)0; - saturated = true; - } - else - { - result = i; - saturated = false; - } - - return (result.SubBigInteger(N - 1, 0), saturated); - } -#endregion - } -} diff --git a/Ryujinx.Tests/Cpu/Tester/Types/Bits.cs b/Ryujinx.Tests/Cpu/Tester/Types/Bits.cs deleted file mode 100644 index 87cdfcd2..00000000 --- a/Ryujinx.Tests/Cpu/Tester/Types/Bits.cs +++ /dev/null @@ -1,282 +0,0 @@ -// https://github.com/LDj3SNuD/ARM_v8-A_AArch64_Instructions_Tester/blob/master/Tester/Types/Bits.cs - -// https://github.com/dotnet/corefx/blob/master/src/System.Collections/src/System/Collections/BitArray.cs - -using System; -using System.Collections; -using System.Numerics; - -namespace Ryujinx.Tests.Cpu.Tester.Types -{ - internal sealed class Bits : ICollection, IEnumerable, IEquatable<Bits> - { - private BitArray bits; - - public Bits(bool[] values) => bits = new BitArray(values); - public Bits(byte[] bytes) => bits = new BitArray(bytes); - public Bits(Bits bits) => this.bits = new BitArray(bits.bits); // Clone: deep copy. - public Bits(int length) => bits = new BitArray(length); - public Bits(int length, bool defaultValue) => bits = new BitArray(length, defaultValue); - private Bits(BitArray bitArray) => bits = new BitArray(bitArray); - public Bits(ulong value) => bits = new BitArray(BitConverter.GetBytes(value)); - public Bits(uint value) => bits = new BitArray(BitConverter.GetBytes(value)); - public Bits(BigInteger value) => bits = new BitArray(value.ToByteArray()); - - private BitArray ToBitArray() => new BitArray(bits); - public ulong ToUInt64() - { - byte[] dst = new byte[8]; - - bits.CopyTo(dst, 0); - - return BitConverter.ToUInt64(dst, 0); - } - public uint ToUInt32() - { - byte[] dst = new byte[4]; - - bits.CopyTo(dst, 0); - - return BitConverter.ToUInt32(dst, 0); - } - public BigInteger ToBigInteger() - { - if (bits.Count != 64 && - bits.Count != 32 && - bits.Count != 16 && - bits.Count != 8) - { - throw new InvalidOperationException(); - } - - byte[] dst = new byte[bits.Count / 8]; - - bits.CopyTo(dst, 0); - - return new BigInteger(dst); - } - - public bool this[int index] // ASL: "<>". - { - get - { - return bits.Get(index); - } - set - { - bits.Set(index, value); - } - } - public Bits this[int highIndex, int lowIndex] // ASL: "<:>". - { - get - { - if (highIndex < lowIndex) - { - throw new IndexOutOfRangeException(); - } - - bool[] dst = new bool[highIndex - lowIndex + 1]; - - for (int i = lowIndex, n = 0; i <= highIndex; i++, n++) - { - dst[n] = bits.Get(i); - } - - return new Bits(dst); - } - set - { - if (highIndex < lowIndex) - { - throw new IndexOutOfRangeException(); - } - - for (int i = lowIndex, n = 0; i <= highIndex; i++, n++) - { - bits.Set(i, value.Get(n)); - } - } - } - - public bool IsReadOnly { get => false; } // Mutable. - public int Count { get => bits.Count; } // Not resizable. - public bool IsSynchronized { get => bits.IsSynchronized; } - public object SyncRoot { get => bits.SyncRoot; } - public Bits And(Bits value) => new Bits(new BitArray(this.bits).And(value.bits)); // Immutable. - public void CopyTo(Array array, int index) => bits.CopyTo(array, index); - public bool Get(int index) => bits.Get(index); - public IEnumerator GetEnumerator() => bits.GetEnumerator(); - //public Bits LeftShift(int count) => new Bits(new BitArray(bits).LeftShift(count)); // Immutable. - public Bits Not() => new Bits(new BitArray(bits).Not()); // Immutable. - public Bits Or(Bits value) => new Bits(new BitArray(this.bits).Or(value.bits)); // Immutable. - //public Bits RightShift(int count) => new Bits(new BitArray(bits).RightShift(count)); // Immutable. - public void Set(int index, bool value) => bits.Set(index, value); - public void SetAll(bool value) => bits.SetAll(value); - public Bits Xor(Bits value) => new Bits(new BitArray(this.bits).Xor(value.bits)); // Immutable. - - public static Bits Concat(Bits highBits, Bits lowBits) // ASL: ":". - { - if (((object)lowBits == null) || ((object)highBits == null)) - { - throw new ArgumentNullException(); - } - - bool[] dst = new bool[lowBits.Count + highBits.Count]; - - lowBits.CopyTo(dst, 0); - highBits.CopyTo(dst, lowBits.Count); - - return new Bits(dst); - } - public static Bits Concat(bool bit3, bool bit2, bool bit1, bool bit0) // ASL: ":::". - { - return new Bits(new bool[] {bit0, bit1, bit2, bit3}); - } - - public static implicit operator Bits(bool value) => new Bits(1, value); - public static implicit operator Bits(string value) - { - if (String.IsNullOrEmpty(value)) - { - throw new InvalidCastException(); - } - - bool[] dst = new bool[value.Length]; - - for (int i = value.Length - 1, n = 0; i >= 0; i--, n++) - { - if (value[i] == '1') - { - dst[n] = true; - } - else if (value[i] == '0') - { - dst[n] = false; - } - else - { - throw new InvalidCastException(); - } - } - - return new Bits(dst); - } - public static explicit operator bool(Bits bit) - { - if (((object)bit == null) || (bit.Count != 1)) - { - throw new InvalidCastException(); - } - - return bit.Get(0); - } - - public static Bits operator +(Bits left, BigInteger right) // ASL: "+". - { - if (((object)left == null) || ((object)right == null)) - { - throw new ArgumentNullException(); - } - - BigInteger dst = left.ToBigInteger() + right; - - return dst.SubBigInteger(left.Count - 1, 0); - } - public static Bits operator +(Bits left, Bits right) // ASL: "+". - { - if (((object)left == null) || ((object)right == null)) - { - throw new ArgumentNullException(); - } - - if (left.Count != right.Count) - { - throw new InvalidOperationException(); - } - - BigInteger dst = left.ToBigInteger() + right.ToBigInteger(); - - return dst.SubBigInteger(left.Count - 1, 0); - } - public static Bits operator -(Bits left, Bits right) // ASL: "-". - { - if (((object)left == null) || ((object)right == null)) - { - throw new ArgumentNullException(); - } - - if (left.Count != right.Count) - { - throw new InvalidOperationException(); - } - - BigInteger dst = left.ToBigInteger() - right.ToBigInteger(); - - return dst.SubBigInteger(left.Count - 1, 0); - } - public static bool operator ==(Bits left, Bits right) // ASL: "==". - { - if (((object)left == null) || ((object)right == null)) - { - throw new ArgumentNullException(); - } - - if (left.Count != right.Count) - { - return false; - } - - for (int i = 0; i <= left.Count - 1; i++) - { - if (left.Get(i) != right.Get(i)) - { - return false; - } - } - - return true; - } - public static bool operator !=(Bits left, Bits right) // ASL: "!=". - { - return !(left == right); - } - - public bool Equals(Bits right) // ASL: "==". - { - if ((object)right == null) - { - throw new ArgumentNullException(); - } - - Bits left = this; - - if (left.Count != right.Count) - { - return false; - } - - for (int i = 0; i <= left.Count - 1; i++) - { - if (left.Get(i) != right.Get(i)) - { - return false; - } - } - - return true; - } - public override bool Equals(object obj) - { - if (obj == null) - { - throw new ArgumentNullException(); - } - - Bits right = obj as Bits; - - return Equals(right); - } - public override int GetHashCode() => bits.GetHashCode(); - } -} diff --git a/Ryujinx.Tests/Cpu/Tester/Types/Integer.cs b/Ryujinx.Tests/Cpu/Tester/Types/Integer.cs deleted file mode 100644 index 49ba260c..00000000 --- a/Ryujinx.Tests/Cpu/Tester/Types/Integer.cs +++ /dev/null @@ -1,42 +0,0 @@ -// https://github.com/LDj3SNuD/ARM_v8-A_AArch64_Instructions_Tester/blob/master/Tester/Types/Integer.cs - -using System; -using System.Numerics; - -namespace Ryujinx.Tests.Cpu.Tester.Types -{ - internal static class Integer - { - public static Bits SubBigInteger(this BigInteger x, int highIndex, int lowIndex) // ASL: "<:>". - { - if (highIndex < lowIndex) - { - throw new IndexOutOfRangeException(); - } - - Bits src = new Bits(x); - bool[] dst = new bool[highIndex - lowIndex + 1]; - - for (int i = lowIndex, n = 0; i <= highIndex; i++, n++) - { - if (i <= src.Count - 1) - { - dst[n] = src[i]; - } - else - { - dst[n] = (x.Sign != -1 ? false : true); // Zero / Sign Extension. - } - } - - return new Bits(dst); - } - - public static bool SubBigInteger(this BigInteger x, int index) // ASL: "<>". - { - Bits dst = x.SubBigInteger(index, index); - - return (bool)dst; - } - } -} |
