| 1 | <?php |
| 2 | namespace Std\Lib\Syntax; |
| 3 | |
| 4 | /** |
| 5 | * AArch32(ARM・Thumb、GASのUAL記法) |
| 6 | */ |
| 7 | class AsmAarch32 extends Assembly { |
| 8 | protected array $comment = ['@', '//']; |
| 9 | protected ?array $multiline = ['/*', '*/']; |
| 10 | protected bool $dollarHex = false; |
| 11 | protected bool $percentBinary = false; |
| 12 | // 幅・型(.w, .f32)→ 条件コード(addeq)→ フラグ更新(adds)の順に外す |
| 13 | protected array $suffixes = [ |
| 14 | '/\.(?:w|n|[iusfp]?(?:8|16|32|64)|f16|f32|f64)$/', |
| 15 | '/(?:eq|ne|cs|hs|cc|lo|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al)$/', |
| 16 | '/s$/', |
| 17 | ]; |
| 18 | |
| 19 | protected array $tokens = [ |
| 20 | 'register' => [ |
| 21 | 'sp', 'lr', 'pc', 'fp', 'ip', 'sl', 'sb', 'apsr', 'cpsr', 'spsr', 'fpscr', 'fpexc', |
| 22 | ], |
| 23 | 'instruction' => [ |
| 24 | // データ処理 |
| 25 | 'add', 'adc', 'sub', 'sbc', 'rsb', 'rsc', 'mul', 'mla', 'mls', 'umull', 'umlal', 'smull', 'smlal', 'sdiv', 'udiv', |
| 26 | 'and', 'orr', 'orn', 'eor', 'bic', 'mvn', 'mov', 'movw', 'movt', 'lsl', 'lsr', 'asr', 'ror', 'rrx', |
| 27 | 'cmp', 'cmn', 'tst', 'teq', 'clz', 'rev', 'rev16', 'rbit', 'ubfx', 'sbfx', 'bfi', 'bfc', 'uxtb', 'uxth', 'sxtb', 'sxth', 'usat', 'ssat', |
| 28 | 'qadd', 'qsub', 'uadd8', 'usub8', 'sel', |
| 29 | // 分岐 |
| 30 | 'b', 'bl', 'bx', 'blx', 'cbz', 'cbnz', 'tbb', 'tbh', 'it', 'ite', 'itt', 'itte', 'ittt', 'itee', |
| 31 | // ロード・ストア |
| 32 | 'ldr', 'ldrb', 'ldrh', 'ldrsb', 'ldrsh', 'ldrd', 'str', 'strb', 'strh', 'strd', 'ldm', 'ldmia', 'ldmdb', 'stm', 'stmia', 'stmdb', |
| 33 | 'push', 'pop', 'ldrex', 'strex', 'clrex', 'pld', 'adr', |
| 34 | // システム |
| 35 | 'svc', 'swi', 'bkpt', 'nop', 'wfi', 'wfe', 'sev', 'dmb', 'dsb', 'isb', 'mrs', 'msr', 'cpsie', 'cpsid', 'mrc', 'mcr', |
| 36 | // VFP・NEON |
| 37 | 'vmov', 'vadd', 'vsub', 'vmul', 'vdiv', 'vmla', 'vmls', 'vfma', 'vneg', 'vabs', 'vsqrt', 'vcmp', 'vcvt', 'vldr', 'vstr', 'vldm', 'vstm', |
| 38 | 'vpush', 'vpop', 'vmrs', 'vmsr', 'vld1', 'vst1', 'vdup', 'vand', 'vorr', 'veor', 'vmax', 'vmin', |
| 39 | ], |
| 40 | 'keyword' => [ |
| 41 | 'eq', 'ne', 'cs', 'hs', 'cc', 'lo', 'mi', 'pl', 'vs', 'vc', 'hi', 'ls', 'ge', 'lt', 'gt', 'le', 'al', |
| 42 | ], |
| 43 | ]; |
| 44 | |
| 45 | public function prepare(string $code): void { |
| 46 | $tokens = $this->tokens; |
| 47 | foreach (self::numbered('r', 0, 15) as $r) $tokens['register'][] = $r; |
| 48 | foreach (['s', 'd'] as $p) foreach (self::numbered($p, 0, 31) as $r) $tokens['register'][] = $r; |
| 49 | foreach (self::numbered('q', 0, 15) as $r) $tokens['register'][] = $r; |
| 50 | $this->words = $this->buildWords($tokens); |
| 51 | } |
| 52 | } |