| 1 | <?php |
| 2 | namespace Std\Lib\Syntax; |
| 3 | |
| 4 | /** |
| 5 | * POWER・PowerPC(GAS) |
| 6 | * GASではレジスターをただの数字で書く事が多い(ld 2, 24(12))ので、「r2」「%r2」の形だけを色付けする |
| 7 | */ |
| 8 | class 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 | } |