master
ブランチ master
LittleBeast / src / Std / Lib / Syntax / AsmRiscv.php
2.7 KB、53行 生 Blame 履歴
1<?php
2namespace Std\Lib\Syntax;
3
4/**
5 * RISC-V(RV32/RV64、GAS)
6 */
7class AsmRiscv extends Assembly {
8 protected array $comment = ['#'];
9 protected ?array $multiline = ['/*', '*/'];
10 protected bool $dollarHex = false;
11 protected bool $percentBinary = false;
12 protected string $immediatePrefix = '';
13 // fcvt.w.s → fcvt.w → fcvt、lr.w.aq → lr、c.addi → addi
14 protected array $suffixes = ['/\.[a-z0-9]+$/', '/\.[a-z0-9]+$/', '/^c\./'];
15
16 protected array $tokens = [
17 'register' => [
18 'zero', 'ra', 'sp', 'gp', 'tp', 'fp', 'pc',
19 ],
20 'instruction' => [
21 // RV32I/RV64I
22 'lui', 'auipc', 'jal', 'jalr', 'beq', 'bne', 'blt', 'bge', 'bltu', 'bgeu', 'lb', 'lh', 'lw', 'lbu', 'lhu', 'lwu', 'ld', 'sb', 'sh', 'sw', 'sd',
23 'addi', 'slti', 'sltiu', 'xori', 'ori', 'andi', 'slli', 'srli', 'srai', 'add', 'sub', 'sll', 'slt', 'sltu', 'xor', 'srl', 'sra', 'or', 'and',
24 'addiw', 'slliw', 'srliw', 'sraiw', 'addw', 'subw', 'sllw', 'srlw', 'sraw', 'fence', 'ecall', 'ebreak',
25 // M・A
26 'mul', 'mulh', 'mulhsu', 'mulhu', 'div', 'divu', 'rem', 'remu', 'mulw', 'divw', 'divuw', 'remw', 'remuw',
27 'lr', 'sc', 'amoswap', 'amoadd', 'amoxor', 'amoand', 'amoor', 'amomin', 'amomax', 'amominu', 'amomaxu',
28 // F・D
29 'flw', 'fsw', 'fld', 'fsd', 'fadd', 'fsub', 'fmul', 'fdiv', 'fsqrt', 'fmin', 'fmax', 'fmadd', 'fmsub', 'fnmadd', 'fnmsub',
30 'fsgnj', 'fsgnjn', 'fsgnjx', 'fcvt', 'fmv', 'feq', 'flt', 'fle', 'fclass',
31 // Zicsr・特権
32 'csrrw', 'csrrs', 'csrrc', 'csrrwi', 'csrrsi', 'csrrci', 'csrr', 'csrw', 'csrs', 'csrc', 'mret', 'sret', 'wfi', 'sfence',
33 // B・V(よく使う物)
34 'andn', 'orn', 'xnor', 'clz', 'ctz', 'cpop', 'min', 'max', 'minu', 'maxu', 'rol', 'ror', 'rev8', 'sext', 'zext',
35 'vsetvli', 'vsetivli', 'vsetvl', 'vle8', 'vle16', 'vle32', 'vle64', 'vse8', 'vse16', 'vse32', 'vse64', 'vadd', 'vsub', 'vmul', 'vfadd', 'vfmul',
36 'vfmacc', 'vredsum', 'vfredusum', 'vmv',
37 // 疑似命令
38 'li', 'la', 'lla', 'mv', 'not', 'neg', 'negw', 'nop', 'j', 'jr', 'ret', 'call', 'tail', 'seqz', 'snez', 'sltz', 'sgtz',
39 'beqz', 'bnez', 'blez', 'bgez', 'bltz', 'bgtz', 'bgt', 'ble', 'bgtu', 'bleu', 'fabs', 'fneg',
40 ],
41 ];
42
43 public function prepare(string $code): void {
44 $tokens = $this->tokens;
45 $names = array_merge(
46 self::numbered('x', 0, 31), self::numbered('f', 0, 31), self::numbered('v', 0, 31),
47 self::numbered('t', 0, 6), self::numbered('s', 0, 11), self::numbered('a', 0, 7),
48 self::numbered('ft', 0, 11), self::numbered('fs', 0, 11), self::numbered('fa', 0, 7),
49 );
50 foreach ($names as $r) $tokens['register'][] = $r;
51 $this->words = $this->buildWords($tokens);
52 }
53}