master
ブランチ master
LittleBeast / src / Std / Lib / Syntax / AsmAarch32.php
2.5 KB、52行 生 Blame 履歴
1<?php
2namespace Std\Lib\Syntax;
3
4/**
5 * AArch32(ARM・Thumb、GASのUAL記法)
6 */
7class 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}