| 1 | <?php |
| 2 | namespace Std\Lib\Syntax; |
| 3 | |
| 4 | /** |
| 5 | * AArch64(GAS。Appleのアセンブラの「;」コメントも対応) |
| 6 | */ |
| 7 | class AsmAarch64 extends Assembly { |
| 8 | protected array $comment = ['//', ';']; |
| 9 | protected ?array $multiline = ['/*', '*/']; |
| 10 | protected bool $dollarHex = false; |
| 11 | protected bool $percentBinary = false; |
| 12 | // b.eq → b、v0.4s → v0、ld1.16b等 |
| 13 | protected array $suffixes = ['/\.[a-z0-9]+$/']; |
| 14 | |
| 15 | protected array $tokens = [ |
| 16 | 'register' => [ |
| 17 | 'sp', 'wsp', 'xzr', 'wzr', 'lr', 'fp', 'pc', 'nzcv', 'fpcr', 'fpsr', 'tpidr_el0', |
| 18 | ], |
| 19 | 'instruction' => [ |
| 20 | // データ処理 |
| 21 | 'add', 'adds', 'sub', 'subs', 'adc', 'adcs', 'sbc', 'sbcs', 'neg', 'negs', 'ngc', 'cmp', 'cmn', 'tst', |
| 22 | 'mul', 'madd', 'msub', 'mneg', 'smull', 'umull', 'smulh', 'umulh', 'smaddl', 'umaddl', 'sdiv', 'udiv', |
| 23 | 'and', 'ands', 'orr', 'orn', 'eor', 'eon', 'bic', 'bics', 'mvn', 'lsl', 'lsr', 'asr', 'ror', |
| 24 | 'mov', 'movz', 'movn', 'movk', 'adr', 'adrp', 'sxtb', 'sxth', 'sxtw', 'uxtb', 'uxth', 'ubfx', 'sbfx', 'ubfiz', 'sbfiz', 'bfi', 'bfxil', |
| 25 | 'ubfm', 'sbfm', 'bfm', 'extr', 'clz', 'cls', 'rbit', 'rev', 'rev16', 'rev32', |
| 26 | 'csel', 'csinc', 'csinv', 'csneg', 'cset', 'csetm', 'cinc', 'cinv', 'cneg', 'ccmp', 'ccmn', |
| 27 | // 分岐 |
| 28 | 'b', 'bl', 'br', 'blr', 'ret', 'cbz', 'cbnz', 'tbz', 'tbnz', 'braa', 'blraa', 'retaa', |
| 29 | // ロード・ストア |
| 30 | 'ldr', 'ldrb', 'ldrh', 'ldrsb', 'ldrsh', 'ldrsw', 'ldur', 'ldurb', 'ldurh', 'str', 'strb', 'strh', 'stur', 'sturb', 'sturh', |
| 31 | 'ldp', 'stp', 'ldnp', 'stnp', 'ldxr', 'stxr', 'ldaxr', 'stlxr', 'ldar', 'stlr', 'ldxp', 'stxp', 'prfm', |
| 32 | 'ldadd', 'ldadda', 'ldaddal', 'ldclr', 'ldset', 'ldeor', 'swp', 'swpal', 'cas', 'casal', |
| 33 | // システム |
| 34 | 'svc', 'hvc', 'smc', 'brk', 'hlt', 'nop', 'yield', 'wfe', 'wfi', 'sev', 'dmb', 'dsb', 'isb', 'mrs', 'msr', 'sys', 'paciasp', 'autiasp', 'bti', |
| 35 | // 浮動小数点・NEON |
| 36 | 'fmov', 'fadd', 'fsub', 'fmul', 'fdiv', 'fmadd', 'fmsub', 'fnmadd', 'fneg', 'fabs', 'fsqrt', 'fmin', 'fmax', 'fminnm', 'fmaxnm', 'fcmp', 'fcsel', |
| 37 | 'fcvt', 'fcvtzs', 'fcvtzu', 'fcvtns', 'scvtf', 'ucvtf', 'frintn', 'frintm', 'frintp', 'frintz', |
| 38 | 'fmla', 'fmls', 'addv', 'addp', 'faddp', 'umov', 'smov', 'ins', 'dup', 'movi', 'zip1', 'zip2', 'uzp1', 'uzp2', 'trn1', 'trn2', 'ext', 'tbl', |
| 39 | 'ld1', 'ld2', 'ld3', 'ld4', 'st1', 'st2', 'st3', 'st4', 'ld1r', 'cnt', 'uaddlv', 'saddlv', 'shl', 'sshr', 'ushr', 'xtn', 'sqxtn', 'uqxtn', |
| 40 | 'cmeq', 'cmgt', 'cmge', 'fcmeq', 'fcmgt', 'bsl', 'bit', 'bif', 'not', 'abs', 'mla', 'mls', 'smlal', 'umlal', 'sdot', 'udot', 'fmlal', |
| 41 | ], |
| 42 | 'keyword' => [ |
| 43 | // 条件コード・シフト・拡張 |
| 44 | 'eq', 'ne', 'cs', 'hs', 'cc', 'lo', 'mi', 'pl', 'vs', 'vc', 'hi', 'ls', 'ge', 'lt', 'gt', 'le', 'al', 'nv', |
| 45 | 'uxtw', 'sxtx', 'uxtx', 'msl', |
| 46 | ], |
| 47 | ]; |
| 48 | |
| 49 | public function prepare(string $code): void { |
| 50 | $tokens = $this->tokens; |
| 51 | foreach (['x', 'w'] as $p) foreach (self::numbered($p, 0, 30) as $r) $tokens['register'][] = $r; |
| 52 | foreach (['v', 'q', 'd', 's', 'h', 'b', 'z'] as $p) foreach (self::numbered($p, 0, 31) as $r) $tokens['register'][] = $r; |
| 53 | foreach (self::numbered('p', 0, 15) as $r) $tokens['register'][] = $r; |
| 54 | $this->words = $this->buildWords($tokens); |
| 55 | } |
| 56 | } |