master
ブランチ master
LittleBeast / src / Std / Lib / Syntax / AsmPower.php
2.9 KB、50行 生 Blame 履歴
1<?php
2namespace Std\Lib\Syntax;
3
4/**
5 * POWER・PowerPC(GAS)
6 * GASではレジスターをただの数字で書く事が多い(ld 2, 24(12))ので、「r2」「%r2」の形だけを色付けする
7 */
8class AsmPower extends Assembly {
9 protected array $comment = ['#'];
10 protected ?array $multiline = ['/*', '*/'];
11 protected bool $dollarHex = false;
12 protected bool $percentBinary = false;
13 protected string $immediatePrefix = '';
14 // add. → add(条件レジスターを更新する形)
15 protected array $suffixes = ['/\.$/'];
16
17 protected array $tokens = [
18 'register' => [
19 'lr', 'ctr', 'xer', 'msr', 'cr', 'fpscr', 'vrsave', 'vscr', 'sp', 'toc', 'rtoc',
20 ],
21 'instruction' => [
22 'li', 'lis', 'la', 'addi', 'addis', 'add', 'addc', 'adde', 'addze', 'addme', 'addic', 'subf', 'subfc', 'subfe', 'subfic', 'sub', 'subi', 'neg',
23 'mullw', 'mulld', 'mulhw', 'mulhwu', 'mulhd', 'mulhdu', 'mulli', 'divw', 'divwu', 'divd', 'divdu', 'modsw', 'moduw',
24 'and', 'andc', 'andi', 'andis', 'or', 'orc', 'ori', 'oris', 'xor', 'xori', 'xoris', 'nor', 'nand', 'eqv', 'not', 'mr',
25 'slw', 'srw', 'sraw', 'srawi', 'sld', 'srd', 'srad', 'sradi', 'rlwinm', 'rlwimi', 'rlwnm', 'rldicl', 'rldicr', 'rldic', 'rldimi',
26 'slwi', 'srwi', 'sldi', 'srdi', 'clrlwi', 'clrldi', 'extsb', 'extsh', 'extsw', 'cntlzw', 'cntlzd', 'popcntw', 'popcntd',
27 'lbz', 'lbzu', 'lbzx', 'lhz', 'lhzu', 'lha', 'lhax', 'lwz', 'lwzu', 'lwzx', 'lwa', 'lwax', 'ld', 'ldu', 'ldx', 'lmw', 'lwarx', 'ldarx',
28 'stb', 'stbu', 'stbx', 'sth', 'sthu', 'sthx', 'stw', 'stwu', 'stwx', 'std', 'stdu', 'stdx', 'stmw', 'stwcx', 'stdcx',
29 'lfs', 'lfd', 'stfs', 'stfd', 'fadd', 'fadds', 'fsub', 'fmul', 'fmuls', 'fdiv', 'fmadd', 'fmr', 'fneg', 'fabs', 'fsqrt', 'fcmpu', 'fctiwz', 'fcfid',
30 'cmpw', 'cmpwi', 'cmplw', 'cmplwi', 'cmpd', 'cmpdi', 'cmpld', 'cmpldi', 'cmp', 'cmpi', 'cmpl', 'cmpli',
31 'b', 'ba', 'bl', 'bla', 'bc', 'bcl', 'blr', 'blrl', 'bctr', 'bctrl', 'beq', 'bne', 'blt', 'bgt', 'ble', 'bge', 'bso', 'bns', 'bdnz', 'bdz',
32 'beqlr', 'bnelr', 'bltlr', 'bgtlr', 'blelr', 'bgelr',
33 'mflr', 'mtlr', 'mfctr', 'mtctr', 'mfcr', 'mtcrf', 'mfxer', 'mtxer', 'mfspr', 'mtspr', 'mfmsr', 'mtmsr',
34 'sc', 'nop', 'isync', 'sync', 'lwsync', 'eieio', 'dcbf', 'dcbst', 'icbi', 'trap', 'tw', 'twi', 'td', 'tdi',
35 'lvx', 'stvx', 'vaddfp', 'vmaddfp', 'vperm', 'lxvd2x', 'stxvd2x', 'xvadddp', 'xvmuldp',
36 ],
37 'keyword' => [
38 // シンボル修飾子(msg@toc、x@ha)
39 'ha', 'got', 'plt', 'tocbase', 'localentry',
40 ],
41 ];
42
43 public function prepare(string $code): void {
44 $tokens = $this->tokens;
45 foreach (['r', 'f', 'v'] as $p) foreach (self::numbered($p, 0, 31) as $r) $tokens['register'][] = $r;
46 foreach (self::numbered('vs', 0, 63) as $r) $tokens['register'][] = $r;
47 foreach (self::numbered('cr', 0, 7) as $r) $tokens['register'][] = $r;
48 $this->words = $this->buildWords($tokens);
49 }
50}