| 1 | <?php |
| 2 | namespace Std\Lib\Syntax; |
| 3 | |
| 4 | /** |
| 5 | * RISC-V(RV32/RV64、GAS) |
| 6 | */ |
| 7 | class 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 | } |