================================================================================
  ____  _ _   _____    _ _ _
 | __ )(_| |_| ____|__| (_| |_ ___
 |  _ \| | __|  _| / _` | | __/ __|
 | |_) | | |_| |__| (_| | | |_\__ \
 |____/|_|\__|_____\__,_|_|\__|___/

 AArch64 Hacker's Manual

 Name: AArch64.txt
 Copyright: (c) 2025 Namdak Tonpa, BitEdits Corporation.
 Version: 2025-07-15
 Size: 64KB

================================================================================

Побудова дизасемблера зазвичай підпорядковується наступному сценарію:
спочатку ми ретельно екстрагуємо з офіційної документації на архітектуру
опкодів з ISA PDF та розкладаємо біти по групах, які допоможуть нам в
подальшому вручну групувати інструкції. Загальний формат інструкції наступний:

ASCII Графіка 1. Загальний формат ARM64 інструкції
+---------------------= 32/64-bit
|
|     0 0 0 0 --------= SME
|     0 0 1 0 --------= SVE
|     1 0 0 x --------= Data Processing Immediate (done)
|     1 0 1 x --------= Branching, System, Exceptions (done)
|     x 1 x 0 --------= Loads and Stores (done)
|     x 1 0 1 --------= Data Processing Register (done)
|     1 1 1 1 --------= NEON Scalar (FPU) (done)
|     0 1 1 1 --------= NEON Vector
|     | | | |
|     | | | |
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+-------------+ +-------------+ +-------------+ +-------------+
|     MSB     | |             | |             | |     LSB     |
+-------------+ +-------------+ +-------------+ +-------------+

Післія документування алфавітного показчика 6.A64.LST ми групуємо
інструкції по групах, та візуально визначаємо кількість типів інструкції,
яких добре аби було найменше, в нашому випадку 16, тобто на тип по 4 біти,
і якшо робити діспатч по першому байту то для таблиці першого діспатча
потрібно 128 байт. У файлі 6.A64.GROUPS показані типи інструкцій:

ASCII Графіка 2.6. Загальний формат ARM64 інструкції
|                31-21  | 20-16: Rm | F | 14-10: Ra | 9-5: Rn   | 4-0: Rd   | Description
+-----------------------+-----------+---+-----------+-----------+-----------+--------------------------
| s q x t t t t z a r w | x x x x x | x | x x x x x | x x x x x | x x x x x | % 0-way PURE:
| s q x t t t t z a r w | x x o o o | x | x x x x x | x x o o o | Rd        | % 1-way REG:
| s q x t t t t z a r w | Rm        | c | c c c x x | Rn        | x n z c v | % 2-way REG RIGHT:
| s q x t t t t z a r w | x x x x x | x | x Z x x M | Rn        | Rd        | % 2-way REG LEFT:
| s q x t t t t z a r w | Rm        | x | x x x x x | Rn        | Rd        | % 3-way REG:
| s q x t t t t z a r w | Rm        | x | Ra        | Rn        | Rd        | % 4-way REG:
| s q x t t t | imm26                                                       | % 0-way BRA:
| s q x t t t t z a r w | imm5      | c | c c c x x | Rn        | x n z c v | % 1-way REG IMM:
| s q x t t t t z a r w | imm16                                 | Rd        | % 1-way REG BIG IMM:
| s q x t t t t z | imm19                                       | Rd        | % 1-way REG LARGE IMM:
| s q x t t t t z a r w | imm9                | x x | Rn        | Rd        | % 2-way REG IMM:
| s q x t t t t z a r | imm12                       | Rn        | Rd        | % 2-way REG BIG IMM:
| s q x t t t t z a r | immr        | imms          | Rn        | Rd        | % 2-way REG PAIR IMM:
| s q x t t t t z a r w | Rm        | imm6          | Rn        | Rd        | % 3-way REG RIGHT IMM:
| s q x t t t t z a r | imm7            | Ra        | Rn        | Rd        | % 3-way REG LEFT IMM:

ASCII Графіка 2.7. Загальний формат FPU/SIMD aka NEON інструкції
|                31-21  | 20-16: Rm | F | 14-10: Ra | 9-5: Rn   | 4-0: Rd   | Description
+-----------------------+-----------+---+-----------+-----------+-----------+-------------------
| s q x t t t t z a r w | Rm        | x | x x x x x | Rn        | Rd        | % 3-way REG:
| s q x t t t t z a r w | a b c d e | x | x x x x x | f g h i j | Rd        | % 1-way REG:
| s q x t t t t z a r w | imm5      | x | x x x x x | Rn        | Rd        | % 2-way REG IMM:
| s a x t t t t z a r w | Rm        | 0 | Ra        | Rn        | Rd        | % 4-way REG:
| s q x t t t t z a r w | Rm        | 0 | imm4  | 0 | Rn        | Rd        | % 3-way REG IMM:

ASCII Графіка 2.8. Загальний формат SVE інструкції
|                31-21  | 20-16: Rm | F | 14-10: Ra | 9-5: Rn   | 4-0: Rd   | Description
+-----------------------+-----------+---+-----------+-----------+-----------+-------------------
| s q x t t t t z a r w | Zm        | x | x x x x x | Zn        | Zd        | % 3-Way REG:
| s q x t t t t z a r w | x x x x x | x | x x | imm8            | Zd        | % 1-Way REG IMM:

ASCII Графіка 2.9. Загальний формат SME інструкції

|                31-21  | 20-16: Rm | F | 14-10: Ra | 9-5: Rn   | 4-0: Rd   | Description
+-----------------------+-----------+---+-----------+-----------+-----------+-------------------
| s q x t t t t z a r w | x x x x x | x | y y z z z | a b c d e | f g h i j | % 0-Way PURE:
| s q x t t t t z a r w | x x x x x | x | y y z z z | Zn        | a b c d e | % 1-Way REG LEFT:
| s q x t t t t z a r w | x x x x x | x | y y z z z | a b c d e | Zd        | % 1-Way REG RIGHT:
| s q x t t t t z a r w | Zm        | x | y y z z z | Zn        | a b c d e | % 2-Way REG:
| s q x t t t t z a r w | Rn        | x | y y z z | imm6        | Rd        | % 2-Way REG IMM:

Всього ARM64 має 4 головних розширення (по главам):
6) Скалярне ядро A64;
7) FPU/SIMD ядро яке називається NEON;
8) Векторне SVE ядро з 2048-бітними регістрами;
9) Матричне ядро SME.

ASCII Графіка 3. Основні регістри головних розширень ARM64

A64:  R0-R30     -- general purpose registers (63..0: Xn, 31..0: Wn)
      R31        -- zero register (63..0)
      SP         -- stack pointer (63..0)
      PC         -- program counter (63..0)

NEON: V0-V31     -- FPU/SIMD registers (127..0: Qn, 63..0: Dn, 31..0: Sn, 15..0: Hn, 7..0: Bn)
      FPCR,FPSR  -- FPU/SIMD status registers (63..0)

SVE:  P0-P15     -- SVE predicate registers (255..0, ..., 15..0)
      FFR        -- SVE first fault register (63..0)
      Z0-Z31     -- SVE registers (2047..0, ..., 127..0: Qn)
                                  (63..0: Dn, 31..0: Sn, 15..0: Hn, 7..0: Bn)

Інструкції цих розширень знаходяться у відповідних файлах:
6.A64.LST, 7.FPU.LST, 8.SVE.LST, 9.SME.LST.

ASCII Графіка 4. Спеціальні регістри ARM32

  31...28   27...24   23...20   19...16   15...12   11...08   07...05   04...00
+---------+---------+---------+---------+---------+---------+---------+---------+
|   RAS   |   DIT   |   AMU   |   CSV2  |  STATE3 |  STATE2 |  STATE1 |  STATE0 | PFR #0
+---------+---------+---------+---------+---------+---------+---------+---------+
|   GIC   |   VIRT  |   SEC   | GenTimer|  VIRT   | MProgMod|   SEC   | ProgMod | PFR #1
+---------+---------+---------+---------+---------+---------+---------+---------+
|                                                 |   RAS   |  SSBS   |  CSV3   | PFR #2
+---------+---------+---------+---------+---------+---------+---------+---------+
|  Implementer      | Variant |  Arch   |   Primary Part Number       | Revision| MIDR
+---------+---------+---------+---------+---------+---------+---------+---------+
| FPround | FPshVec | FPsqrt  | FPdiv   | FPtrap  |  FPDP   |  FPSP   | SIMDreg | MVFR #0
+---------+---------+---------+---------+---------+---------+---------+---------+
| SIMDmac |  FPHP   |  SIMDHP | SIMDHP  | SIMDint | SIMDLS  | FPDNaN  | FPFtZ   | MVFR #1
+---------+---------+---------+---------+---------+---------+---------+---------+
|                                                           | FPmisc  | SIMDmisc| MVFR #2
+---------+---------+---------+---------+---------+---------+---------+---------+
|         | Divide  |  Debug  |  Coproc | CmpBr   | BitField| BitCount|   Swap  | ISAR #0
+---------+---------+---------+---------+---------+---------+---------+---------+
| Jazelle |Interwork|Immediate| IfThen  |  Extend | ExceptAR|  Except | Endian  | ISAR #1
+---------+---------+---------+---------+---------+---------+---------+---------+
| Reversal| PSR_AR  |  MultU  |  MultS  |  Mult   |   MAI   | MemHint |LoadStore| ISAR #2
+---------+---------+---------+---------+---------+---------+---------+---------+
|  T32EE  | TrueNOP | T32Copy |  TabBr  | SynPrim |   SVC   |  SIMD   | Saturate| ISAR #3
+---------+---------+---------+---------+---------+---------+---------+---------+
|  SWP    | PSR_M   | SynPrim | Barrier |   SMC   |   WB    |   WS    |  Unpriv | ISAR #4
+---------+---------+---------+---------+---------+---------+---------+---------+
|  VCMA   |  RDM    |         |  CRC32  |  SHA2   |  SHA1   |   AES   |   SEVL  | ISAR #5
+---------+---------+---------+---------+---------+---------+---------+---------+
|         |  I8MM   |   BF16  | SPECRES |   SB    |   FHM   |   DP    |  JSCVT  | ISAR #6
+---------+---------+---------+---------+---------+---------+---------+---------+
| InnerShr|  FCSE   |  AuxReg |   TCM   | ShareLvl| OuterShr|  PMSA   |  VMSA   | MMFR #0
+---------+---------+---------+---------+---------+---------+---------+---------+
| BPred   | L1TstCln| L1Uni   | L1Hvd   | L1UniSW | L1HvdSW | L1UniVA | L1HvdVA | MMFR #1
+---------+---------+---------+---------+---------+---------+---------+---------+
| HWAccFlg| WFIStall| MemBarr | UniTLB  | HvdTLB  | L1HvdRng| L1HvdBG | L1HvdFG | MMFR #2
+---------+---------+---------+---------+---------+---------+---------+---------+

ASCII Графіка 6. Спеціальні регістри ARM64
  63...60   59...56   55...52   51...48   47...44   43...40   39...36   35...32   31...28   27...24   23...20   19...16   15...12   11...08   07...05   04...00
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+
|  CSV3   |   CSV2  |   RME   |   DIT   |   AMU   |   MPAM  |   SEL2  |   SVE   |   RAS   |   GIC   | AdvSIMD |    FP   |   EL3   |   EL2  |    EL1   |   EL0   | PFR #0
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+
|                                                           |   NMI   |   CSV2  | RNDRtrap|   SME   |         |  MPAM   |   RAS   |   MTE   |   SSBS  |   BT    | PFR #1
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+
|  RNDR   |   TLB   |   TS    |   FHM   |   DP    |   SM4   |   SM3   |   SHA3  |   RDM   |   TME   |  ATOMIC |  CRC32  |  SHA2   |   SHA1  |   AES   |   RES0  | ISAR #0
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+
|  LS64   |   XS    |   I8MM  |   DGH   |   BF16  | SPECRES |    SB   | FRINTTS |   GPI   |   GPA   |  LRCPC  |  FCMA   |  JCVT   |   API   |   APA   |   DPB   | ISAR #1
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+
|                                                                               |  RES0   |   PAC   |   HBC   |  MOPS   |  APA3   |   GPA3  |  RPRES  |  WFxT   | ISAR #2
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+

Регістри архітектури ARM64 розширюють регістри ARM32 і відповідають
за визначення імплементації певних секцій інструкцій різної гранулярності.
Деякі бітові секції відповідають за конкретні інструкції, а деякі за архітектурні розширення.

ASCII Графіка 5. Приклад документування регістрів ISAR

A32 ISAR #2 LoadStore:

0000 No additional load/store instructions implemented.
0001 Adds the LDRD and STRD instructions.
0010 Adds Load Acquire (LDAB, LDAH, LDA, LDAEXB, LDAEXH, LDAEX, LDAEXD) and
     Adds Store Release (STLB, STLH, STL, STLEXB, STLEXH, STLEX, STLEXD) instructions.

A32 ISAR #0 Divide:

0000 None implemented.
0001 Adds SDIV and UDIV in the T32 instruction set.
0010 Adds SDIV and UDIV in the A32 instruction set.

Для визначення розширень на поточному процесорі використовується інструкція MSR.
Передбачається, що редактор BE, який буде використовувати бібліотеку DASM-ARM,
зможе визначати на ARM процесорах доступний набір розширень.

ASCII Графіка 7. Приклад HELP по інструкції MSR

  MSR #sysreg, Xt
  MSR Xt, #sysreg

  Інструкція доступу до відлагоджувальних та трасувальних системних регістрів.

  o: {0,3,4} — відлагоджувальні системні регістри.
  o: {1} — трасувальні системні регістри.

  +----+-----------------------+-----------+---+-----------+-----------+-----------+
  | No |                31-21  | 20-16: Rm | F | 14-10: Ra | 9-5: Rn   | 4-0: Rd   |
  +----+-----------------------+-----------+---+-----------+-----------+-----------+
  |    | 1 1 0 1 0 1 0 1 0 0 L | 1 0 o o o | n | n n n m m | m m o o o | Rt        |
  +----+---------------------------------------------------------------------------+

Також хочеться, аби BE, як і оригінальний AsmEdit мав подібний вбудований довідних
по всім інструкціям, але тут вже йдеться про переклад великої книжки на 1600
інструкцій, цю роботу потрібно розділити між студентами.
