mirror of
https://github.com/capstone-engine/capstone.git
synced 2025-03-03 03:55:38 +00:00

* Fix CID 508418 - Uninitialized struct * Fix CID 509089 - Fix OOB read and write * Fix CID 509088 - OOB. Also adds tests and to ensure no OOB access. * Fix CID 509085 - Resource leak. * Fix CID 508414 and companions - Using undefined values. * Fix CID 508405 - Use of uninitialized value * Remove unnecessary and badly implemented dev fuzz code. * Fix CID 508396 - Uninitialzied variable. * Fix CID 508393, 508365 -- OOB read. * Fix CID 432207 - OVerlapping memory access. * Remove unused functions * Fix CID 432170 - Overlapping memory access. * Fix CID 166022 - Check for negative index * Let strncat not depend n src operand. * Fix 509083 and 509084 - NULL dereference * Remove duplicated code. * Initialize sysop * Fix resource leak * Remove unreachable code. * Remove duplicate code. * Add assert to check return value of cmoack * Fixed: d should be a signed value, since it is checked against < 0 * Add missing break. * Add NULL check * Fix signs of binary search comparisons. * Add explicit cast of or result * Fix correct scope of case. * Handle invalid integer type. * Return UINT_MAX instead of implicitly casted -1 * Remove dead code * Fix type of im * Fix type of d * Remove duplicated code. * Add returns after CS_ASSERTS * Check for len == 0 case. * Ensure shift operates on uint64 * Replace strcpy with strncpy. * Handle edge cases for 32bit rotate * Fix some out of enum warnings * Replace a strcpy with strncpy. * Fix increment of address * Skip some linting * Fix: set instruction id * Remove unused enum * Replace the last usages of strcpy with SStream functions. * Increase number of allowed AArch64 operands. * Check safety of incrementing t the next operand. * Fix naming of operand * Update python constants * Fix option setup of CS_OPT_DETAIL_REAL * Document DETAIL_REAL has to be used with CS_OPT_ON. * Run Coverity scan every Monday. * Remove dead code * Fix OOB read * Rename macro to reflect it is only used with sstreams * Fix rebase issues
2662 lines
101 KiB
C
2662 lines
101 KiB
C
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|
|
|* *|
|
|
|* Assembly Writer Source Fragment *|
|
|
|* *|
|
|
|* Automatically generated file, do not edit! *|
|
|
|* *|
|
|
\*===----------------------------------------------------------------------===*/
|
|
|
|
/* Capstone Disassembly Engine */
|
|
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
|
|
|
|
#include <stdio.h> // debug
|
|
#include <capstone/platform.h>
|
|
#include <assert.h>
|
|
|
|
|
|
/// printInstruction - This method is automatically generated by tablegen
|
|
/// from the instruction set description.
|
|
static void printInstruction(MCInst *MI, SStream *O, MCRegisterInfo *MRI)
|
|
{
|
|
#ifndef CAPSTONE_DIET
|
|
static const char AsmStrs[] = {
|
|
/* 0 */ 'l', 'l', 'a', 9, 0,
|
|
/* 5 */ 's', 'f', 'e', 'n', 'c', 'e', '.', 'v', 'm', 'a', 9, 0,
|
|
/* 17 */ 's', 'r', 'a', 9, 0,
|
|
/* 22 */ 'l', 'b', 9, 0,
|
|
/* 26 */ 's', 'b', 9, 0,
|
|
/* 30 */ 'c', '.', 's', 'u', 'b', 9, 0,
|
|
/* 37 */ 'a', 'u', 'i', 'p', 'c', 9, 0,
|
|
/* 44 */ 'c', 's', 'r', 'r', 'c', 9, 0,
|
|
/* 51 */ 'f', 's', 'u', 'b', '.', 'd', 9, 0,
|
|
/* 59 */ 'f', 'm', 's', 'u', 'b', '.', 'd', 9, 0,
|
|
/* 68 */ 'f', 'n', 'm', 's', 'u', 'b', '.', 'd', 9, 0,
|
|
/* 78 */ 's', 'c', '.', 'd', 9, 0,
|
|
/* 84 */ 'f', 'a', 'd', 'd', '.', 'd', 9, 0,
|
|
/* 92 */ 'f', 'm', 'a', 'd', 'd', '.', 'd', 9, 0,
|
|
/* 101 */ 'f', 'n', 'm', 'a', 'd', 'd', '.', 'd', 9, 0,
|
|
/* 111 */ 'a', 'm', 'o', 'a', 'd', 'd', '.', 'd', 9, 0,
|
|
/* 121 */ 'a', 'm', 'o', 'a', 'n', 'd', '.', 'd', 9, 0,
|
|
/* 131 */ 'f', 'l', 'e', '.', 'd', 9, 0,
|
|
/* 138 */ 'f', 's', 'g', 'n', 'j', '.', 'd', 9, 0,
|
|
/* 147 */ 'f', 'c', 'v', 't', '.', 'l', '.', 'd', 9, 0,
|
|
/* 157 */ 'f', 'm', 'u', 'l', '.', 'd', 9, 0,
|
|
/* 165 */ 'f', 'm', 'i', 'n', '.', 'd', 9, 0,
|
|
/* 173 */ 'a', 'm', 'o', 'm', 'i', 'n', '.', 'd', 9, 0,
|
|
/* 183 */ 'f', 's', 'g', 'n', 'j', 'n', '.', 'd', 9, 0,
|
|
/* 193 */ 'a', 'm', 'o', 's', 'w', 'a', 'p', '.', 'd', 9, 0,
|
|
/* 204 */ 'f', 'e', 'q', '.', 'd', 9, 0,
|
|
/* 211 */ 'l', 'r', '.', 'd', 9, 0,
|
|
/* 217 */ 'a', 'm', 'o', 'o', 'r', '.', 'd', 9, 0,
|
|
/* 226 */ 'a', 'm', 'o', 'x', 'o', 'r', '.', 'd', 9, 0,
|
|
/* 236 */ 'f', 'c', 'v', 't', '.', 's', '.', 'd', 9, 0,
|
|
/* 246 */ 'f', 'c', 'l', 'a', 's', 's', '.', 'd', 9, 0,
|
|
/* 256 */ 'f', 'l', 't', '.', 'd', 9, 0,
|
|
/* 263 */ 'f', 's', 'q', 'r', 't', '.', 'd', 9, 0,
|
|
/* 272 */ 'f', 'c', 'v', 't', '.', 'l', 'u', '.', 'd', 9, 0,
|
|
/* 283 */ 'a', 'm', 'o', 'm', 'i', 'n', 'u', '.', 'd', 9, 0,
|
|
/* 294 */ 'f', 'c', 'v', 't', '.', 'w', 'u', '.', 'd', 9, 0,
|
|
/* 305 */ 'a', 'm', 'o', 'm', 'a', 'x', 'u', '.', 'd', 9, 0,
|
|
/* 316 */ 'f', 'd', 'i', 'v', '.', 'd', 9, 0,
|
|
/* 324 */ 'f', 'c', 'v', 't', '.', 'w', '.', 'd', 9, 0,
|
|
/* 334 */ 'f', 'm', 'v', '.', 'x', '.', 'd', 9, 0,
|
|
/* 343 */ 'f', 'm', 'a', 'x', '.', 'd', 9, 0,
|
|
/* 351 */ 'a', 'm', 'o', 'm', 'a', 'x', '.', 'd', 9, 0,
|
|
/* 361 */ 'f', 's', 'g', 'n', 'j', 'x', '.', 'd', 9, 0,
|
|
/* 371 */ 'c', '.', 'a', 'd', 'd', 9, 0,
|
|
/* 378 */ 'c', '.', 'l', 'd', 9, 0,
|
|
/* 384 */ 'c', '.', 'f', 'l', 'd', 9, 0,
|
|
/* 391 */ 'c', '.', 'a', 'n', 'd', 9, 0,
|
|
/* 398 */ 'c', '.', 's', 'd', 9, 0,
|
|
/* 404 */ 'c', '.', 'f', 's', 'd', 9, 0,
|
|
/* 411 */ 'f', 'e', 'n', 'c', 'e', 9, 0,
|
|
/* 418 */ 'b', 'g', 'e', 9, 0,
|
|
/* 423 */ 'b', 'n', 'e', 9, 0,
|
|
/* 428 */ 'm', 'u', 'l', 'h', 9, 0,
|
|
/* 434 */ 's', 'h', 9, 0,
|
|
/* 438 */ 'f', 'e', 'n', 'c', 'e', '.', 'i', 9, 0,
|
|
/* 447 */ 'c', '.', 's', 'r', 'a', 'i', 9, 0,
|
|
/* 455 */ 'c', 's', 'r', 'r', 'c', 'i', 9, 0,
|
|
/* 463 */ 'c', '.', 'a', 'd', 'd', 'i', 9, 0,
|
|
/* 471 */ 'c', '.', 'a', 'n', 'd', 'i', 9, 0,
|
|
/* 479 */ 'w', 'f', 'i', 9, 0,
|
|
/* 484 */ 'c', '.', 'l', 'i', 9, 0,
|
|
/* 490 */ 'c', '.', 's', 'l', 'l', 'i', 9, 0,
|
|
/* 498 */ 'c', '.', 's', 'r', 'l', 'i', 9, 0,
|
|
/* 506 */ 'x', 'o', 'r', 'i', 9, 0,
|
|
/* 512 */ 'c', 's', 'r', 'r', 's', 'i', 9, 0,
|
|
/* 520 */ 's', 'l', 't', 'i', 9, 0,
|
|
/* 526 */ 'c', '.', 'l', 'u', 'i', 9, 0,
|
|
/* 533 */ 'c', 's', 'r', 'r', 'w', 'i', 9, 0,
|
|
/* 541 */ 'c', '.', 'j', 9, 0,
|
|
/* 546 */ 'c', '.', 'e', 'b', 'r', 'e', 'a', 'k', 9, 0,
|
|
/* 556 */ 'f', 'c', 'v', 't', '.', 'd', '.', 'l', 9, 0,
|
|
/* 566 */ 'f', 'c', 'v', 't', '.', 's', '.', 'l', 9, 0,
|
|
/* 576 */ 'c', '.', 'j', 'a', 'l', 9, 0,
|
|
/* 583 */ 't', 'a', 'i', 'l', 9, 0,
|
|
/* 589 */ 'e', 'c', 'a', 'l', 'l', 9, 0,
|
|
/* 596 */ 's', 'l', 'l', 9, 0,
|
|
/* 601 */ 's', 'c', '.', 'd', '.', 'r', 'l', 9, 0,
|
|
/* 610 */ 'a', 'm', 'o', 'a', 'd', 'd', '.', 'd', '.', 'r', 'l', 9, 0,
|
|
/* 623 */ 'a', 'm', 'o', 'a', 'n', 'd', '.', 'd', '.', 'r', 'l', 9, 0,
|
|
/* 636 */ 'a', 'm', 'o', 'm', 'i', 'n', '.', 'd', '.', 'r', 'l', 9, 0,
|
|
/* 649 */ 'a', 'm', 'o', 's', 'w', 'a', 'p', '.', 'd', '.', 'r', 'l', 9, 0,
|
|
/* 663 */ 'l', 'r', '.', 'd', '.', 'r', 'l', 9, 0,
|
|
/* 672 */ 'a', 'm', 'o', 'o', 'r', '.', 'd', '.', 'r', 'l', 9, 0,
|
|
/* 684 */ 'a', 'm', 'o', 'x', 'o', 'r', '.', 'd', '.', 'r', 'l', 9, 0,
|
|
/* 697 */ 'a', 'm', 'o', 'm', 'i', 'n', 'u', '.', 'd', '.', 'r', 'l', 9, 0,
|
|
/* 711 */ 'a', 'm', 'o', 'm', 'a', 'x', 'u', '.', 'd', '.', 'r', 'l', 9, 0,
|
|
/* 725 */ 'a', 'm', 'o', 'm', 'a', 'x', '.', 'd', '.', 'r', 'l', 9, 0,
|
|
/* 738 */ 's', 'c', '.', 'w', '.', 'r', 'l', 9, 0,
|
|
/* 747 */ 'a', 'm', 'o', 'a', 'd', 'd', '.', 'w', '.', 'r', 'l', 9, 0,
|
|
/* 760 */ 'a', 'm', 'o', 'a', 'n', 'd', '.', 'w', '.', 'r', 'l', 9, 0,
|
|
/* 773 */ 'a', 'm', 'o', 'm', 'i', 'n', '.', 'w', '.', 'r', 'l', 9, 0,
|
|
/* 786 */ 'a', 'm', 'o', 's', 'w', 'a', 'p', '.', 'w', '.', 'r', 'l', 9, 0,
|
|
/* 800 */ 'l', 'r', '.', 'w', '.', 'r', 'l', 9, 0,
|
|
/* 809 */ 'a', 'm', 'o', 'o', 'r', '.', 'w', '.', 'r', 'l', 9, 0,
|
|
/* 821 */ 'a', 'm', 'o', 'x', 'o', 'r', '.', 'w', '.', 'r', 'l', 9, 0,
|
|
/* 834 */ 'a', 'm', 'o', 'm', 'i', 'n', 'u', '.', 'w', '.', 'r', 'l', 9, 0,
|
|
/* 848 */ 'a', 'm', 'o', 'm', 'a', 'x', 'u', '.', 'w', '.', 'r', 'l', 9, 0,
|
|
/* 862 */ 'a', 'm', 'o', 'm', 'a', 'x', '.', 'w', '.', 'r', 'l', 9, 0,
|
|
/* 875 */ 's', 'c', '.', 'd', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 886 */ 'a', 'm', 'o', 'a', 'd', 'd', '.', 'd', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 901 */ 'a', 'm', 'o', 'a', 'n', 'd', '.', 'd', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 916 */ 'a', 'm', 'o', 'm', 'i', 'n', '.', 'd', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 931 */ 'a', 'm', 'o', 's', 'w', 'a', 'p', '.', 'd', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 947 */ 'l', 'r', '.', 'd', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 958 */ 'a', 'm', 'o', 'o', 'r', '.', 'd', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 972 */ 'a', 'm', 'o', 'x', 'o', 'r', '.', 'd', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 987 */ 'a', 'm', 'o', 'm', 'i', 'n', 'u', '.', 'd', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1003 */ 'a', 'm', 'o', 'm', 'a', 'x', 'u', '.', 'd', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1019 */ 'a', 'm', 'o', 'm', 'a', 'x', '.', 'd', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1034 */ 's', 'c', '.', 'w', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1045 */ 'a', 'm', 'o', 'a', 'd', 'd', '.', 'w', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1060 */ 'a', 'm', 'o', 'a', 'n', 'd', '.', 'w', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1075 */ 'a', 'm', 'o', 'm', 'i', 'n', '.', 'w', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1090 */ 'a', 'm', 'o', 's', 'w', 'a', 'p', '.', 'w', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1106 */ 'l', 'r', '.', 'w', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1117 */ 'a', 'm', 'o', 'o', 'r', '.', 'w', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1131 */ 'a', 'm', 'o', 'x', 'o', 'r', '.', 'w', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1146 */ 'a', 'm', 'o', 'm', 'i', 'n', 'u', '.', 'w', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1162 */ 'a', 'm', 'o', 'm', 'a', 'x', 'u', '.', 'w', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1178 */ 'a', 'm', 'o', 'm', 'a', 'x', '.', 'w', '.', 'a', 'q', 'r', 'l', 9, 0,
|
|
/* 1193 */ 's', 'r', 'l', 9, 0,
|
|
/* 1198 */ 'm', 'u', 'l', 9, 0,
|
|
/* 1203 */ 'r', 'e', 'm', 9, 0,
|
|
/* 1208 */ 'c', '.', 'a', 'd', 'd', 'i', '4', 's', 'p', 'n', 9, 0,
|
|
/* 1220 */ 'f', 'e', 'n', 'c', 'e', '.', 't', 's', 'o', 9, 0,
|
|
/* 1231 */ 'c', '.', 'u', 'n', 'i', 'm', 'p', 9, 0,
|
|
/* 1240 */ 'c', '.', 'n', 'o', 'p', 9, 0,
|
|
/* 1247 */ 'c', '.', 'a', 'd', 'd', 'i', '1', '6', 's', 'p', 9, 0,
|
|
/* 1259 */ 'c', '.', 'l', 'd', 's', 'p', 9, 0,
|
|
/* 1267 */ 'c', '.', 'f', 'l', 'd', 's', 'p', 9, 0,
|
|
/* 1276 */ 'c', '.', 's', 'd', 's', 'p', 9, 0,
|
|
/* 1284 */ 'c', '.', 'f', 's', 'd', 's', 'p', 9, 0,
|
|
/* 1293 */ 'c', '.', 'l', 'w', 's', 'p', 9, 0,
|
|
/* 1301 */ 'c', '.', 'f', 'l', 'w', 's', 'p', 9, 0,
|
|
/* 1310 */ 'c', '.', 's', 'w', 's', 'p', 9, 0,
|
|
/* 1318 */ 'c', '.', 'f', 's', 'w', 's', 'p', 9, 0,
|
|
/* 1327 */ 's', 'c', '.', 'd', '.', 'a', 'q', 9, 0,
|
|
/* 1336 */ 'a', 'm', 'o', 'a', 'd', 'd', '.', 'd', '.', 'a', 'q', 9, 0,
|
|
/* 1349 */ 'a', 'm', 'o', 'a', 'n', 'd', '.', 'd', '.', 'a', 'q', 9, 0,
|
|
/* 1362 */ 'a', 'm', 'o', 'm', 'i', 'n', '.', 'd', '.', 'a', 'q', 9, 0,
|
|
/* 1375 */ 'a', 'm', 'o', 's', 'w', 'a', 'p', '.', 'd', '.', 'a', 'q', 9, 0,
|
|
/* 1389 */ 'l', 'r', '.', 'd', '.', 'a', 'q', 9, 0,
|
|
/* 1398 */ 'a', 'm', 'o', 'o', 'r', '.', 'd', '.', 'a', 'q', 9, 0,
|
|
/* 1410 */ 'a', 'm', 'o', 'x', 'o', 'r', '.', 'd', '.', 'a', 'q', 9, 0,
|
|
/* 1423 */ 'a', 'm', 'o', 'm', 'i', 'n', 'u', '.', 'd', '.', 'a', 'q', 9, 0,
|
|
/* 1437 */ 'a', 'm', 'o', 'm', 'a', 'x', 'u', '.', 'd', '.', 'a', 'q', 9, 0,
|
|
/* 1451 */ 'a', 'm', 'o', 'm', 'a', 'x', '.', 'd', '.', 'a', 'q', 9, 0,
|
|
/* 1464 */ 's', 'c', '.', 'w', '.', 'a', 'q', 9, 0,
|
|
/* 1473 */ 'a', 'm', 'o', 'a', 'd', 'd', '.', 'w', '.', 'a', 'q', 9, 0,
|
|
/* 1486 */ 'a', 'm', 'o', 'a', 'n', 'd', '.', 'w', '.', 'a', 'q', 9, 0,
|
|
/* 1499 */ 'a', 'm', 'o', 'm', 'i', 'n', '.', 'w', '.', 'a', 'q', 9, 0,
|
|
/* 1512 */ 'a', 'm', 'o', 's', 'w', 'a', 'p', '.', 'w', '.', 'a', 'q', 9, 0,
|
|
/* 1526 */ 'l', 'r', '.', 'w', '.', 'a', 'q', 9, 0,
|
|
/* 1535 */ 'a', 'm', 'o', 'o', 'r', '.', 'w', '.', 'a', 'q', 9, 0,
|
|
/* 1547 */ 'a', 'm', 'o', 'x', 'o', 'r', '.', 'w', '.', 'a', 'q', 9, 0,
|
|
/* 1560 */ 'a', 'm', 'o', 'm', 'i', 'n', 'u', '.', 'w', '.', 'a', 'q', 9, 0,
|
|
/* 1574 */ 'a', 'm', 'o', 'm', 'a', 'x', 'u', '.', 'w', '.', 'a', 'q', 9, 0,
|
|
/* 1588 */ 'a', 'm', 'o', 'm', 'a', 'x', '.', 'w', '.', 'a', 'q', 9, 0,
|
|
/* 1601 */ 'b', 'e', 'q', 9, 0,
|
|
/* 1606 */ 'c', '.', 'j', 'r', 9, 0,
|
|
/* 1612 */ 'c', '.', 'j', 'a', 'l', 'r', 9, 0,
|
|
/* 1620 */ 'c', '.', 'o', 'r', 9, 0,
|
|
/* 1626 */ 'c', '.', 'x', 'o', 'r', 9, 0,
|
|
/* 1633 */ 'f', 's', 'u', 'b', '.', 's', 9, 0,
|
|
/* 1641 */ 'f', 'm', 's', 'u', 'b', '.', 's', 9, 0,
|
|
/* 1650 */ 'f', 'n', 'm', 's', 'u', 'b', '.', 's', 9, 0,
|
|
/* 1660 */ 'f', 'c', 'v', 't', '.', 'd', '.', 's', 9, 0,
|
|
/* 1670 */ 'f', 'a', 'd', 'd', '.', 's', 9, 0,
|
|
/* 1678 */ 'f', 'm', 'a', 'd', 'd', '.', 's', 9, 0,
|
|
/* 1687 */ 'f', 'n', 'm', 'a', 'd', 'd', '.', 's', 9, 0,
|
|
/* 1697 */ 'f', 'l', 'e', '.', 's', 9, 0,
|
|
/* 1704 */ 'f', 's', 'g', 'n', 'j', '.', 's', 9, 0,
|
|
/* 1713 */ 'f', 'c', 'v', 't', '.', 'l', '.', 's', 9, 0,
|
|
/* 1723 */ 'f', 'm', 'u', 'l', '.', 's', 9, 0,
|
|
/* 1731 */ 'f', 'm', 'i', 'n', '.', 's', 9, 0,
|
|
/* 1739 */ 'f', 's', 'g', 'n', 'j', 'n', '.', 's', 9, 0,
|
|
/* 1749 */ 'f', 'e', 'q', '.', 's', 9, 0,
|
|
/* 1756 */ 'f', 'c', 'l', 'a', 's', 's', '.', 's', 9, 0,
|
|
/* 1766 */ 'f', 'l', 't', '.', 's', 9, 0,
|
|
/* 1773 */ 'f', 's', 'q', 'r', 't', '.', 's', 9, 0,
|
|
/* 1782 */ 'f', 'c', 'v', 't', '.', 'l', 'u', '.', 's', 9, 0,
|
|
/* 1793 */ 'f', 'c', 'v', 't', '.', 'w', 'u', '.', 's', 9, 0,
|
|
/* 1804 */ 'f', 'd', 'i', 'v', '.', 's', 9, 0,
|
|
/* 1812 */ 'f', 'c', 'v', 't', '.', 'w', '.', 's', 9, 0,
|
|
/* 1822 */ 'f', 'm', 'a', 'x', '.', 's', 9, 0,
|
|
/* 1830 */ 'f', 's', 'g', 'n', 'j', 'x', '.', 's', 9, 0,
|
|
/* 1840 */ 'c', 's', 'r', 'r', 's', 9, 0,
|
|
/* 1847 */ 'm', 'r', 'e', 't', 9, 0,
|
|
/* 1853 */ 's', 'r', 'e', 't', 9, 0,
|
|
/* 1859 */ 'u', 'r', 'e', 't', 9, 0,
|
|
/* 1865 */ 'b', 'l', 't', 9, 0,
|
|
/* 1870 */ 's', 'l', 't', 9, 0,
|
|
/* 1875 */ 'l', 'b', 'u', 9, 0,
|
|
/* 1880 */ 'b', 'g', 'e', 'u', 9, 0,
|
|
/* 1886 */ 'm', 'u', 'l', 'h', 'u', 9, 0,
|
|
/* 1893 */ 's', 'l', 't', 'i', 'u', 9, 0,
|
|
/* 1900 */ 'f', 'c', 'v', 't', '.', 'd', '.', 'l', 'u', 9, 0,
|
|
/* 1911 */ 'f', 'c', 'v', 't', '.', 's', '.', 'l', 'u', 9, 0,
|
|
/* 1922 */ 'r', 'e', 'm', 'u', 9, 0,
|
|
/* 1928 */ 'm', 'u', 'l', 'h', 's', 'u', 9, 0,
|
|
/* 1936 */ 'b', 'l', 't', 'u', 9, 0,
|
|
/* 1942 */ 's', 'l', 't', 'u', 9, 0,
|
|
/* 1948 */ 'd', 'i', 'v', 'u', 9, 0,
|
|
/* 1954 */ 'f', 'c', 'v', 't', '.', 'd', '.', 'w', 'u', 9, 0,
|
|
/* 1965 */ 'f', 'c', 'v', 't', '.', 's', '.', 'w', 'u', 9, 0,
|
|
/* 1976 */ 'l', 'w', 'u', 9, 0,
|
|
/* 1981 */ 'd', 'i', 'v', 9, 0,
|
|
/* 1986 */ 'c', '.', 'm', 'v', 9, 0,
|
|
/* 1992 */ 's', 'c', '.', 'w', 9, 0,
|
|
/* 1998 */ 'f', 'c', 'v', 't', '.', 'd', '.', 'w', 9, 0,
|
|
/* 2008 */ 'a', 'm', 'o', 'a', 'd', 'd', '.', 'w', 9, 0,
|
|
/* 2018 */ 'a', 'm', 'o', 'a', 'n', 'd', '.', 'w', 9, 0,
|
|
/* 2028 */ 'a', 'm', 'o', 'm', 'i', 'n', '.', 'w', 9, 0,
|
|
/* 2038 */ 'a', 'm', 'o', 's', 'w', 'a', 'p', '.', 'w', 9, 0,
|
|
/* 2049 */ 'l', 'r', '.', 'w', 9, 0,
|
|
/* 2055 */ 'a', 'm', 'o', 'o', 'r', '.', 'w', 9, 0,
|
|
/* 2064 */ 'a', 'm', 'o', 'x', 'o', 'r', '.', 'w', 9, 0,
|
|
/* 2074 */ 'f', 'c', 'v', 't', '.', 's', '.', 'w', 9, 0,
|
|
/* 2084 */ 'a', 'm', 'o', 'm', 'i', 'n', 'u', '.', 'w', 9, 0,
|
|
/* 2095 */ 'a', 'm', 'o', 'm', 'a', 'x', 'u', '.', 'w', 9, 0,
|
|
/* 2106 */ 'f', 'm', 'v', '.', 'x', '.', 'w', 9, 0,
|
|
/* 2115 */ 'a', 'm', 'o', 'm', 'a', 'x', '.', 'w', 9, 0,
|
|
/* 2125 */ 's', 'r', 'a', 'w', 9, 0,
|
|
/* 2131 */ 'c', '.', 's', 'u', 'b', 'w', 9, 0,
|
|
/* 2139 */ 'c', '.', 'a', 'd', 'd', 'w', 9, 0,
|
|
/* 2147 */ 's', 'r', 'a', 'i', 'w', 9, 0,
|
|
/* 2154 */ 'c', '.', 'a', 'd', 'd', 'i', 'w', 9, 0,
|
|
/* 2163 */ 's', 'l', 'l', 'i', 'w', 9, 0,
|
|
/* 2170 */ 's', 'r', 'l', 'i', 'w', 9, 0,
|
|
/* 2177 */ 'c', '.', 'l', 'w', 9, 0,
|
|
/* 2183 */ 'c', '.', 'f', 'l', 'w', 9, 0,
|
|
/* 2190 */ 's', 'l', 'l', 'w', 9, 0,
|
|
/* 2196 */ 's', 'r', 'l', 'w', 9, 0,
|
|
/* 2202 */ 'm', 'u', 'l', 'w', 9, 0,
|
|
/* 2208 */ 'r', 'e', 'm', 'w', 9, 0,
|
|
/* 2214 */ 'c', 's', 'r', 'r', 'w', 9, 0,
|
|
/* 2221 */ 'c', '.', 's', 'w', 9, 0,
|
|
/* 2227 */ 'c', '.', 'f', 's', 'w', 9, 0,
|
|
/* 2234 */ 'r', 'e', 'm', 'u', 'w', 9, 0,
|
|
/* 2241 */ 'd', 'i', 'v', 'u', 'w', 9, 0,
|
|
/* 2248 */ 'd', 'i', 'v', 'w', 9, 0,
|
|
/* 2254 */ 'f', 'm', 'v', '.', 'd', '.', 'x', 9, 0,
|
|
/* 2263 */ 'f', 'm', 'v', '.', 'w', '.', 'x', 9, 0,
|
|
/* 2272 */ 'c', '.', 'b', 'n', 'e', 'z', 9, 0,
|
|
/* 2280 */ 'c', '.', 'b', 'e', 'q', 'z', 9, 0,
|
|
/* 2288 */ '#', 32, 'X', 'R', 'a', 'y', 32, 'F', 'u', 'n', 'c', 't', 'i', 'o', 'n', 32, 'P', 'a', 't', 'c', 'h', 'a', 'b', 'l', 'e', 32, 'R', 'E', 'T', '.', 0,
|
|
/* 2319 */ '#', 32, 'X', 'R', 'a', 'y', 32, 'T', 'y', 'p', 'e', 'd', 32, 'E', 'v', 'e', 'n', 't', 32, 'L', 'o', 'g', '.', 0,
|
|
/* 2343 */ '#', 32, 'X', 'R', 'a', 'y', 32, 'C', 'u', 's', 't', 'o', 'm', 32, 'E', 'v', 'e', 'n', 't', 32, 'L', 'o', 'g', '.', 0,
|
|
/* 2368 */ '#', 32, 'X', 'R', 'a', 'y', 32, 'F', 'u', 'n', 'c', 't', 'i', 'o', 'n', 32, 'E', 'n', 't', 'e', 'r', '.', 0,
|
|
/* 2391 */ '#', 32, 'X', 'R', 'a', 'y', 32, 'T', 'a', 'i', 'l', 32, 'C', 'a', 'l', 'l', 32, 'E', 'x', 'i', 't', '.', 0,
|
|
/* 2414 */ '#', 32, 'X', 'R', 'a', 'y', 32, 'F', 'u', 'n', 'c', 't', 'i', 'o', 'n', 32, 'E', 'x', 'i', 't', '.', 0,
|
|
/* 2436 */ 'L', 'I', 'F', 'E', 'T', 'I', 'M', 'E', '_', 'E', 'N', 'D', 0,
|
|
/* 2449 */ 'B', 'U', 'N', 'D', 'L', 'E', 0,
|
|
/* 2456 */ 'D', 'B', 'G', '_', 'V', 'A', 'L', 'U', 'E', 0,
|
|
/* 2466 */ 'D', 'B', 'G', '_', 'L', 'A', 'B', 'E', 'L', 0,
|
|
/* 2476 */ 'L', 'I', 'F', 'E', 'T', 'I', 'M', 'E', '_', 'S', 'T', 'A', 'R', 'T', 0,
|
|
/* 2491 */ '#', 32, 'F', 'E', 'n', 't', 'r', 'y', 32, 'c', 'a', 'l', 'l', 0,
|
|
};
|
|
#endif
|
|
|
|
static const uint16_t OpInfo0[] = {
|
|
0U, // PHI
|
|
0U, // INLINEASM
|
|
0U, // INLINEASM_BR
|
|
0U, // CFI_INSTRUCTION
|
|
0U, // EH_LABEL
|
|
0U, // GC_LABEL
|
|
0U, // ANNOTATION_LABEL
|
|
0U, // KILL
|
|
0U, // EXTRACT_SUBREG
|
|
0U, // INSERT_SUBREG
|
|
0U, // IMPLICIT_DEF
|
|
0U, // SUBREG_TO_REG
|
|
0U, // COPY_TO_REGCLASS
|
|
2457U, // DBG_VALUE
|
|
2467U, // DBG_LABEL
|
|
0U, // REG_SEQUENCE
|
|
0U, // COPY
|
|
2450U, // BUNDLE
|
|
2477U, // LIFETIME_START
|
|
2437U, // LIFETIME_END
|
|
0U, // STACKMAP
|
|
2492U, // FENTRY_CALL
|
|
0U, // PATCHPOINT
|
|
0U, // LOAD_STACK_GUARD
|
|
0U, // STATEPOINT
|
|
0U, // LOCAL_ESCAPE
|
|
0U, // FAULTING_OP
|
|
0U, // PATCHABLE_OP
|
|
2369U, // PATCHABLE_FUNCTION_ENTER
|
|
2289U, // PATCHABLE_RET
|
|
2415U, // PATCHABLE_FUNCTION_EXIT
|
|
2392U, // PATCHABLE_TAIL_CALL
|
|
2344U, // PATCHABLE_EVENT_CALL
|
|
2320U, // PATCHABLE_TYPED_EVENT_CALL
|
|
0U, // ICALL_BRANCH_FUNNEL
|
|
0U, // G_ADD
|
|
0U, // G_SUB
|
|
0U, // G_MUL
|
|
0U, // G_SDIV
|
|
0U, // G_UDIV
|
|
0U, // G_SREM
|
|
0U, // G_UREM
|
|
0U, // G_AND
|
|
0U, // G_OR
|
|
0U, // G_XOR
|
|
0U, // G_IMPLICIT_DEF
|
|
0U, // G_PHI
|
|
0U, // G_FRAME_INDEX
|
|
0U, // G_GLOBAL_VALUE
|
|
0U, // G_EXTRACT
|
|
0U, // G_UNMERGE_VALUES
|
|
0U, // G_INSERT
|
|
0U, // G_MERGE_VALUES
|
|
0U, // G_BUILD_VECTOR
|
|
0U, // G_BUILD_VECTOR_TRUNC
|
|
0U, // G_CONCAT_VECTORS
|
|
0U, // G_PTRTOINT
|
|
0U, // G_INTTOPTR
|
|
0U, // G_BITCAST
|
|
0U, // G_INTRINSIC_TRUNC
|
|
0U, // G_INTRINSIC_ROUND
|
|
0U, // G_LOAD
|
|
0U, // G_SEXTLOAD
|
|
0U, // G_ZEXTLOAD
|
|
0U, // G_STORE
|
|
0U, // G_ATOMIC_CMPXCHG_WITH_SUCCESS
|
|
0U, // G_ATOMIC_CMPXCHG
|
|
0U, // G_ATOMICRMW_XCHG
|
|
0U, // G_ATOMICRMW_ADD
|
|
0U, // G_ATOMICRMW_SUB
|
|
0U, // G_ATOMICRMW_AND
|
|
0U, // G_ATOMICRMW_NAND
|
|
0U, // G_ATOMICRMW_OR
|
|
0U, // G_ATOMICRMW_XOR
|
|
0U, // G_ATOMICRMW_MAX
|
|
0U, // G_ATOMICRMW_MIN
|
|
0U, // G_ATOMICRMW_UMAX
|
|
0U, // G_ATOMICRMW_UMIN
|
|
0U, // G_BRCOND
|
|
0U, // G_BRINDIRECT
|
|
0U, // G_INTRINSIC
|
|
0U, // G_INTRINSIC_W_SIDE_EFFECTS
|
|
0U, // G_ANYEXT
|
|
0U, // G_TRUNC
|
|
0U, // G_CONSTANT
|
|
0U, // G_FCONSTANT
|
|
0U, // G_VASTART
|
|
0U, // G_VAARG
|
|
0U, // G_SEXT
|
|
0U, // G_ZEXT
|
|
0U, // G_SHL
|
|
0U, // G_LSHR
|
|
0U, // G_ASHR
|
|
0U, // G_ICMP
|
|
0U, // G_FCMP
|
|
0U, // G_SELECT
|
|
0U, // G_UADDO
|
|
0U, // G_UADDE
|
|
0U, // G_USUBO
|
|
0U, // G_USUBE
|
|
0U, // G_SADDO
|
|
0U, // G_SADDE
|
|
0U, // G_SSUBO
|
|
0U, // G_SSUBE
|
|
0U, // G_UMULO
|
|
0U, // G_SMULO
|
|
0U, // G_UMULH
|
|
0U, // G_SMULH
|
|
0U, // G_FADD
|
|
0U, // G_FSUB
|
|
0U, // G_FMUL
|
|
0U, // G_FMA
|
|
0U, // G_FDIV
|
|
0U, // G_FREM
|
|
0U, // G_FPOW
|
|
0U, // G_FEXP
|
|
0U, // G_FEXP2
|
|
0U, // G_FLOG
|
|
0U, // G_FLOG2
|
|
0U, // G_FLOG10
|
|
0U, // G_FNEG
|
|
0U, // G_FPEXT
|
|
0U, // G_FPTRUNC
|
|
0U, // G_FPTOSI
|
|
0U, // G_FPTOUI
|
|
0U, // G_SITOFP
|
|
0U, // G_UITOFP
|
|
0U, // G_FABS
|
|
0U, // G_FCANONICALIZE
|
|
0U, // G_GEP
|
|
0U, // G_PTR_MASK
|
|
0U, // G_BR
|
|
0U, // G_INSERT_VECTOR_ELT
|
|
0U, // G_EXTRACT_VECTOR_ELT
|
|
0U, // G_SHUFFLE_VECTOR
|
|
0U, // G_CTTZ
|
|
0U, // G_CTTZ_ZERO_UNDEF
|
|
0U, // G_CTLZ
|
|
0U, // G_CTLZ_ZERO_UNDEF
|
|
0U, // G_CTPOP
|
|
0U, // G_BSWAP
|
|
0U, // G_FCEIL
|
|
0U, // G_FCOS
|
|
0U, // G_FSIN
|
|
0U, // G_FSQRT
|
|
0U, // G_FFLOOR
|
|
0U, // G_ADDRSPACE_CAST
|
|
0U, // G_BLOCK_ADDR
|
|
4U, // ADJCALLSTACKDOWN
|
|
4U, // ADJCALLSTACKUP
|
|
4U, // BuildPairF64Pseudo
|
|
4U, // PseudoAtomicLoadNand32
|
|
4U, // PseudoAtomicLoadNand64
|
|
4U, // PseudoBR
|
|
4U, // PseudoBRIND
|
|
4687U, // PseudoCALL
|
|
4U, // PseudoCALLIndirect
|
|
4U, // PseudoCmpXchg32
|
|
4U, // PseudoCmpXchg64
|
|
20482U, // PseudoLA
|
|
20967U, // PseudoLI
|
|
20481U, // PseudoLLA
|
|
4U, // PseudoMaskedAtomicLoadAdd32
|
|
4U, // PseudoMaskedAtomicLoadMax32
|
|
4U, // PseudoMaskedAtomicLoadMin32
|
|
4U, // PseudoMaskedAtomicLoadNand32
|
|
4U, // PseudoMaskedAtomicLoadSub32
|
|
4U, // PseudoMaskedAtomicLoadUMax32
|
|
4U, // PseudoMaskedAtomicLoadUMin32
|
|
4U, // PseudoMaskedAtomicSwap32
|
|
4U, // PseudoMaskedCmpXchg32
|
|
4U, // PseudoRET
|
|
4680U, // PseudoTAIL
|
|
4U, // PseudoTAILIndirect
|
|
4U, // Select_FPR32_Using_CC_GPR
|
|
4U, // Select_FPR64_Using_CC_GPR
|
|
4U, // Select_GPR_Using_CC_GPR
|
|
4U, // SplitF64Pseudo
|
|
20854U, // ADD
|
|
20946U, // ADDI
|
|
22637U, // ADDIW
|
|
22622U, // ADDW
|
|
20592U, // AMOADD_D
|
|
21817U, // AMOADD_D_AQ
|
|
21367U, // AMOADD_D_AQ_RL
|
|
21091U, // AMOADD_D_RL
|
|
22489U, // AMOADD_W
|
|
21954U, // AMOADD_W_AQ
|
|
21526U, // AMOADD_W_AQ_RL
|
|
21228U, // AMOADD_W_RL
|
|
20602U, // AMOAND_D
|
|
21830U, // AMOAND_D_AQ
|
|
21382U, // AMOAND_D_AQ_RL
|
|
21104U, // AMOAND_D_RL
|
|
22499U, // AMOAND_W
|
|
21967U, // AMOAND_W_AQ
|
|
21541U, // AMOAND_W_AQ_RL
|
|
21241U, // AMOAND_W_RL
|
|
20786U, // AMOMAXU_D
|
|
21918U, // AMOMAXU_D_AQ
|
|
21484U, // AMOMAXU_D_AQ_RL
|
|
21192U, // AMOMAXU_D_RL
|
|
22576U, // AMOMAXU_W
|
|
22055U, // AMOMAXU_W_AQ
|
|
21643U, // AMOMAXU_W_AQ_RL
|
|
21329U, // AMOMAXU_W_RL
|
|
20832U, // AMOMAX_D
|
|
21932U, // AMOMAX_D_AQ
|
|
21500U, // AMOMAX_D_AQ_RL
|
|
21206U, // AMOMAX_D_RL
|
|
22596U, // AMOMAX_W
|
|
22069U, // AMOMAX_W_AQ
|
|
21659U, // AMOMAX_W_AQ_RL
|
|
21343U, // AMOMAX_W_RL
|
|
20764U, // AMOMINU_D
|
|
21904U, // AMOMINU_D_AQ
|
|
21468U, // AMOMINU_D_AQ_RL
|
|
21178U, // AMOMINU_D_RL
|
|
22565U, // AMOMINU_W
|
|
22041U, // AMOMINU_W_AQ
|
|
21627U, // AMOMINU_W_AQ_RL
|
|
21315U, // AMOMINU_W_RL
|
|
20654U, // AMOMIN_D
|
|
21843U, // AMOMIN_D_AQ
|
|
21397U, // AMOMIN_D_AQ_RL
|
|
21117U, // AMOMIN_D_RL
|
|
22509U, // AMOMIN_W
|
|
21980U, // AMOMIN_W_AQ
|
|
21556U, // AMOMIN_W_AQ_RL
|
|
21254U, // AMOMIN_W_RL
|
|
20698U, // AMOOR_D
|
|
21879U, // AMOOR_D_AQ
|
|
21439U, // AMOOR_D_AQ_RL
|
|
21153U, // AMOOR_D_RL
|
|
22536U, // AMOOR_W
|
|
22016U, // AMOOR_W_AQ
|
|
21598U, // AMOOR_W_AQ_RL
|
|
21290U, // AMOOR_W_RL
|
|
20674U, // AMOSWAP_D
|
|
21856U, // AMOSWAP_D_AQ
|
|
21412U, // AMOSWAP_D_AQ_RL
|
|
21130U, // AMOSWAP_D_RL
|
|
22519U, // AMOSWAP_W
|
|
21993U, // AMOSWAP_W_AQ
|
|
21571U, // AMOSWAP_W_AQ_RL
|
|
21267U, // AMOSWAP_W_RL
|
|
20707U, // AMOXOR_D
|
|
21891U, // AMOXOR_D_AQ
|
|
21453U, // AMOXOR_D_AQ_RL
|
|
21165U, // AMOXOR_D_RL
|
|
22545U, // AMOXOR_W
|
|
22028U, // AMOXOR_W_AQ
|
|
21612U, // AMOXOR_W_AQ_RL
|
|
21302U, // AMOXOR_W_RL
|
|
20874U, // AND
|
|
20954U, // ANDI
|
|
20518U, // AUIPC
|
|
22082U, // BEQ
|
|
20899U, // BGE
|
|
22361U, // BGEU
|
|
22346U, // BLT
|
|
22417U, // BLTU
|
|
20904U, // BNE
|
|
20525U, // CSRRC
|
|
20936U, // CSRRCI
|
|
22321U, // CSRRS
|
|
20993U, // CSRRSI
|
|
22695U, // CSRRW
|
|
21014U, // CSRRWI
|
|
8564U, // C_ADD
|
|
8656U, // C_ADDI
|
|
9440U, // C_ADDI16SP
|
|
21689U, // C_ADDI4SPN
|
|
10347U, // C_ADDIW
|
|
10332U, // C_ADDW
|
|
8584U, // C_AND
|
|
8664U, // C_ANDI
|
|
22761U, // C_BEQZ
|
|
22753U, // C_BNEZ
|
|
547U, // C_EBREAK
|
|
20865U, // C_FLD
|
|
21748U, // C_FLDSP
|
|
22664U, // C_FLW
|
|
21782U, // C_FLWSP
|
|
20885U, // C_FSD
|
|
21765U, // C_FSDSP
|
|
22708U, // C_FSW
|
|
21799U, // C_FSWSP
|
|
4638U, // C_J
|
|
4673U, // C_JAL
|
|
5709U, // C_JALR
|
|
5703U, // C_JR
|
|
20859U, // C_LD
|
|
21740U, // C_LDSP
|
|
20965U, // C_LI
|
|
21007U, // C_LUI
|
|
22658U, // C_LW
|
|
21774U, // C_LWSP
|
|
22467U, // C_MV
|
|
1241U, // C_NOP
|
|
9813U, // C_OR
|
|
20879U, // C_SD
|
|
21757U, // C_SDSP
|
|
8683U, // C_SLLI
|
|
8640U, // C_SRAI
|
|
8691U, // C_SRLI
|
|
8223U, // C_SUB
|
|
10324U, // C_SUBW
|
|
22702U, // C_SW
|
|
21791U, // C_SWSP
|
|
1232U, // C_UNIMP
|
|
9819U, // C_XOR
|
|
22462U, // DIV
|
|
22429U, // DIVU
|
|
22722U, // DIVUW
|
|
22729U, // DIVW
|
|
549U, // EBREAK
|
|
590U, // ECALL
|
|
20565U, // FADD_D
|
|
22151U, // FADD_S
|
|
20727U, // FCLASS_D
|
|
22237U, // FCLASS_S
|
|
21037U, // FCVT_D_L
|
|
22381U, // FCVT_D_LU
|
|
22141U, // FCVT_D_S
|
|
22479U, // FCVT_D_W
|
|
22435U, // FCVT_D_WU
|
|
20753U, // FCVT_LU_D
|
|
22263U, // FCVT_LU_S
|
|
20628U, // FCVT_L_D
|
|
22194U, // FCVT_L_S
|
|
20717U, // FCVT_S_D
|
|
21047U, // FCVT_S_L
|
|
22392U, // FCVT_S_LU
|
|
22555U, // FCVT_S_W
|
|
22446U, // FCVT_S_WU
|
|
20775U, // FCVT_WU_D
|
|
22274U, // FCVT_WU_S
|
|
20805U, // FCVT_W_D
|
|
22293U, // FCVT_W_S
|
|
20797U, // FDIV_D
|
|
22285U, // FDIV_S
|
|
12700U, // FENCE
|
|
439U, // FENCE_I
|
|
1221U, // FENCE_TSO
|
|
20685U, // FEQ_D
|
|
22230U, // FEQ_S
|
|
20867U, // FLD
|
|
20612U, // FLE_D
|
|
22178U, // FLE_S
|
|
20737U, // FLT_D
|
|
22247U, // FLT_S
|
|
22666U, // FLW
|
|
20573U, // FMADD_D
|
|
22159U, // FMADD_S
|
|
20824U, // FMAX_D
|
|
22303U, // FMAX_S
|
|
20646U, // FMIN_D
|
|
22212U, // FMIN_S
|
|
20540U, // FMSUB_D
|
|
22122U, // FMSUB_S
|
|
20638U, // FMUL_D
|
|
22204U, // FMUL_S
|
|
22735U, // FMV_D_X
|
|
22744U, // FMV_W_X
|
|
20815U, // FMV_X_D
|
|
22587U, // FMV_X_W
|
|
20582U, // FNMADD_D
|
|
22168U, // FNMADD_S
|
|
20549U, // FNMSUB_D
|
|
22131U, // FNMSUB_S
|
|
20887U, // FSD
|
|
20664U, // FSGNJN_D
|
|
22220U, // FSGNJN_S
|
|
20842U, // FSGNJX_D
|
|
22311U, // FSGNJX_S
|
|
20619U, // FSGNJ_D
|
|
22185U, // FSGNJ_S
|
|
20744U, // FSQRT_D
|
|
22254U, // FSQRT_S
|
|
20532U, // FSUB_D
|
|
22114U, // FSUB_S
|
|
22710U, // FSW
|
|
21059U, // JAL
|
|
22095U, // JALR
|
|
20503U, // LB
|
|
22356U, // LBU
|
|
20861U, // LD
|
|
20911U, // LH
|
|
22369U, // LHU
|
|
37076U, // LR_D
|
|
38254U, // LR_D_AQ
|
|
37812U, // LR_D_AQ_RL
|
|
37528U, // LR_D_RL
|
|
38914U, // LR_W
|
|
38391U, // LR_W_AQ
|
|
37971U, // LR_W_AQ_RL
|
|
37665U, // LR_W_RL
|
|
21009U, // LUI
|
|
22660U, // LW
|
|
22457U, // LWU
|
|
1848U, // MRET
|
|
21679U, // MUL
|
|
20909U, // MULH
|
|
22409U, // MULHSU
|
|
22367U, // MULHU
|
|
22683U, // MULW
|
|
22103U, // OR
|
|
20988U, // ORI
|
|
21684U, // REM
|
|
22403U, // REMU
|
|
22715U, // REMUW
|
|
22689U, // REMW
|
|
20507U, // SB
|
|
20559U, // SC_D
|
|
21808U, // SC_D_AQ
|
|
21356U, // SC_D_AQ_RL
|
|
21082U, // SC_D_RL
|
|
22473U, // SC_W
|
|
21945U, // SC_W_AQ
|
|
21515U, // SC_W_AQ_RL
|
|
21219U, // SC_W_RL
|
|
20881U, // SD
|
|
20486U, // SFENCE_VMA
|
|
20915U, // SH
|
|
21077U, // SLL
|
|
20973U, // SLLI
|
|
22644U, // SLLIW
|
|
22671U, // SLLW
|
|
22351U, // SLT
|
|
21001U, // SLTI
|
|
22374U, // SLTIU
|
|
22423U, // SLTU
|
|
20498U, // SRA
|
|
20930U, // SRAI
|
|
22628U, // SRAIW
|
|
22606U, // SRAW
|
|
1854U, // SRET
|
|
21674U, // SRL
|
|
20981U, // SRLI
|
|
22651U, // SRLIW
|
|
22677U, // SRLW
|
|
20513U, // SUB
|
|
22614U, // SUBW
|
|
22704U, // SW
|
|
1234U, // UNIMP
|
|
1860U, // URET
|
|
480U, // WFI
|
|
22109U, // XOR
|
|
20987U, // XORI
|
|
};
|
|
|
|
static const uint8_t OpInfo1[] = {
|
|
0U, // PHI
|
|
0U, // INLINEASM
|
|
0U, // INLINEASM_BR
|
|
0U, // CFI_INSTRUCTION
|
|
0U, // EH_LABEL
|
|
0U, // GC_LABEL
|
|
0U, // ANNOTATION_LABEL
|
|
0U, // KILL
|
|
0U, // EXTRACT_SUBREG
|
|
0U, // INSERT_SUBREG
|
|
0U, // IMPLICIT_DEF
|
|
0U, // SUBREG_TO_REG
|
|
0U, // COPY_TO_REGCLASS
|
|
0U, // DBG_VALUE
|
|
0U, // DBG_LABEL
|
|
0U, // REG_SEQUENCE
|
|
0U, // COPY
|
|
0U, // BUNDLE
|
|
0U, // LIFETIME_START
|
|
0U, // LIFETIME_END
|
|
0U, // STACKMAP
|
|
0U, // FENTRY_CALL
|
|
0U, // PATCHPOINT
|
|
0U, // LOAD_STACK_GUARD
|
|
0U, // STATEPOINT
|
|
0U, // LOCAL_ESCAPE
|
|
0U, // FAULTING_OP
|
|
0U, // PATCHABLE_OP
|
|
0U, // PATCHABLE_FUNCTION_ENTER
|
|
0U, // PATCHABLE_RET
|
|
0U, // PATCHABLE_FUNCTION_EXIT
|
|
0U, // PATCHABLE_TAIL_CALL
|
|
0U, // PATCHABLE_EVENT_CALL
|
|
0U, // PATCHABLE_TYPED_EVENT_CALL
|
|
0U, // ICALL_BRANCH_FUNNEL
|
|
0U, // G_ADD
|
|
0U, // G_SUB
|
|
0U, // G_MUL
|
|
0U, // G_SDIV
|
|
0U, // G_UDIV
|
|
0U, // G_SREM
|
|
0U, // G_UREM
|
|
0U, // G_AND
|
|
0U, // G_OR
|
|
0U, // G_XOR
|
|
0U, // G_IMPLICIT_DEF
|
|
0U, // G_PHI
|
|
0U, // G_FRAME_INDEX
|
|
0U, // G_GLOBAL_VALUE
|
|
0U, // G_EXTRACT
|
|
0U, // G_UNMERGE_VALUES
|
|
0U, // G_INSERT
|
|
0U, // G_MERGE_VALUES
|
|
0U, // G_BUILD_VECTOR
|
|
0U, // G_BUILD_VECTOR_TRUNC
|
|
0U, // G_CONCAT_VECTORS
|
|
0U, // G_PTRTOINT
|
|
0U, // G_INTTOPTR
|
|
0U, // G_BITCAST
|
|
0U, // G_INTRINSIC_TRUNC
|
|
0U, // G_INTRINSIC_ROUND
|
|
0U, // G_LOAD
|
|
0U, // G_SEXTLOAD
|
|
0U, // G_ZEXTLOAD
|
|
0U, // G_STORE
|
|
0U, // G_ATOMIC_CMPXCHG_WITH_SUCCESS
|
|
0U, // G_ATOMIC_CMPXCHG
|
|
0U, // G_ATOMICRMW_XCHG
|
|
0U, // G_ATOMICRMW_ADD
|
|
0U, // G_ATOMICRMW_SUB
|
|
0U, // G_ATOMICRMW_AND
|
|
0U, // G_ATOMICRMW_NAND
|
|
0U, // G_ATOMICRMW_OR
|
|
0U, // G_ATOMICRMW_XOR
|
|
0U, // G_ATOMICRMW_MAX
|
|
0U, // G_ATOMICRMW_MIN
|
|
0U, // G_ATOMICRMW_UMAX
|
|
0U, // G_ATOMICRMW_UMIN
|
|
0U, // G_BRCOND
|
|
0U, // G_BRINDIRECT
|
|
0U, // G_INTRINSIC
|
|
0U, // G_INTRINSIC_W_SIDE_EFFECTS
|
|
0U, // G_ANYEXT
|
|
0U, // G_TRUNC
|
|
0U, // G_CONSTANT
|
|
0U, // G_FCONSTANT
|
|
0U, // G_VASTART
|
|
0U, // G_VAARG
|
|
0U, // G_SEXT
|
|
0U, // G_ZEXT
|
|
0U, // G_SHL
|
|
0U, // G_LSHR
|
|
0U, // G_ASHR
|
|
0U, // G_ICMP
|
|
0U, // G_FCMP
|
|
0U, // G_SELECT
|
|
0U, // G_UADDO
|
|
0U, // G_UADDE
|
|
0U, // G_USUBO
|
|
0U, // G_USUBE
|
|
0U, // G_SADDO
|
|
0U, // G_SADDE
|
|
0U, // G_SSUBO
|
|
0U, // G_SSUBE
|
|
0U, // G_UMULO
|
|
0U, // G_SMULO
|
|
0U, // G_UMULH
|
|
0U, // G_SMULH
|
|
0U, // G_FADD
|
|
0U, // G_FSUB
|
|
0U, // G_FMUL
|
|
0U, // G_FMA
|
|
0U, // G_FDIV
|
|
0U, // G_FREM
|
|
0U, // G_FPOW
|
|
0U, // G_FEXP
|
|
0U, // G_FEXP2
|
|
0U, // G_FLOG
|
|
0U, // G_FLOG2
|
|
0U, // G_FLOG10
|
|
0U, // G_FNEG
|
|
0U, // G_FPEXT
|
|
0U, // G_FPTRUNC
|
|
0U, // G_FPTOSI
|
|
0U, // G_FPTOUI
|
|
0U, // G_SITOFP
|
|
0U, // G_UITOFP
|
|
0U, // G_FABS
|
|
0U, // G_FCANONICALIZE
|
|
0U, // G_GEP
|
|
0U, // G_PTR_MASK
|
|
0U, // G_BR
|
|
0U, // G_INSERT_VECTOR_ELT
|
|
0U, // G_EXTRACT_VECTOR_ELT
|
|
0U, // G_SHUFFLE_VECTOR
|
|
0U, // G_CTTZ
|
|
0U, // G_CTTZ_ZERO_UNDEF
|
|
0U, // G_CTLZ
|
|
0U, // G_CTLZ_ZERO_UNDEF
|
|
0U, // G_CTPOP
|
|
0U, // G_BSWAP
|
|
0U, // G_FCEIL
|
|
0U, // G_FCOS
|
|
0U, // G_FSIN
|
|
0U, // G_FSQRT
|
|
0U, // G_FFLOOR
|
|
0U, // G_ADDRSPACE_CAST
|
|
0U, // G_BLOCK_ADDR
|
|
0U, // ADJCALLSTACKDOWN
|
|
0U, // ADJCALLSTACKUP
|
|
0U, // BuildPairF64Pseudo
|
|
0U, // PseudoAtomicLoadNand32
|
|
0U, // PseudoAtomicLoadNand64
|
|
0U, // PseudoBR
|
|
0U, // PseudoBRIND
|
|
0U, // PseudoCALL
|
|
0U, // PseudoCALLIndirect
|
|
0U, // PseudoCmpXchg32
|
|
0U, // PseudoCmpXchg64
|
|
0U, // PseudoLA
|
|
0U, // PseudoLI
|
|
0U, // PseudoLLA
|
|
0U, // PseudoMaskedAtomicLoadAdd32
|
|
0U, // PseudoMaskedAtomicLoadMax32
|
|
0U, // PseudoMaskedAtomicLoadMin32
|
|
0U, // PseudoMaskedAtomicLoadNand32
|
|
0U, // PseudoMaskedAtomicLoadSub32
|
|
0U, // PseudoMaskedAtomicLoadUMax32
|
|
0U, // PseudoMaskedAtomicLoadUMin32
|
|
0U, // PseudoMaskedAtomicSwap32
|
|
0U, // PseudoMaskedCmpXchg32
|
|
0U, // PseudoRET
|
|
0U, // PseudoTAIL
|
|
0U, // PseudoTAILIndirect
|
|
0U, // Select_FPR32_Using_CC_GPR
|
|
0U, // Select_FPR64_Using_CC_GPR
|
|
0U, // Select_GPR_Using_CC_GPR
|
|
0U, // SplitF64Pseudo
|
|
4U, // ADD
|
|
4U, // ADDI
|
|
4U, // ADDIW
|
|
4U, // ADDW
|
|
9U, // AMOADD_D
|
|
9U, // AMOADD_D_AQ
|
|
9U, // AMOADD_D_AQ_RL
|
|
9U, // AMOADD_D_RL
|
|
9U, // AMOADD_W
|
|
9U, // AMOADD_W_AQ
|
|
9U, // AMOADD_W_AQ_RL
|
|
9U, // AMOADD_W_RL
|
|
9U, // AMOAND_D
|
|
9U, // AMOAND_D_AQ
|
|
9U, // AMOAND_D_AQ_RL
|
|
9U, // AMOAND_D_RL
|
|
9U, // AMOAND_W
|
|
9U, // AMOAND_W_AQ
|
|
9U, // AMOAND_W_AQ_RL
|
|
9U, // AMOAND_W_RL
|
|
9U, // AMOMAXU_D
|
|
9U, // AMOMAXU_D_AQ
|
|
9U, // AMOMAXU_D_AQ_RL
|
|
9U, // AMOMAXU_D_RL
|
|
9U, // AMOMAXU_W
|
|
9U, // AMOMAXU_W_AQ
|
|
9U, // AMOMAXU_W_AQ_RL
|
|
9U, // AMOMAXU_W_RL
|
|
9U, // AMOMAX_D
|
|
9U, // AMOMAX_D_AQ
|
|
9U, // AMOMAX_D_AQ_RL
|
|
9U, // AMOMAX_D_RL
|
|
9U, // AMOMAX_W
|
|
9U, // AMOMAX_W_AQ
|
|
9U, // AMOMAX_W_AQ_RL
|
|
9U, // AMOMAX_W_RL
|
|
9U, // AMOMINU_D
|
|
9U, // AMOMINU_D_AQ
|
|
9U, // AMOMINU_D_AQ_RL
|
|
9U, // AMOMINU_D_RL
|
|
9U, // AMOMINU_W
|
|
9U, // AMOMINU_W_AQ
|
|
9U, // AMOMINU_W_AQ_RL
|
|
9U, // AMOMINU_W_RL
|
|
9U, // AMOMIN_D
|
|
9U, // AMOMIN_D_AQ
|
|
9U, // AMOMIN_D_AQ_RL
|
|
9U, // AMOMIN_D_RL
|
|
9U, // AMOMIN_W
|
|
9U, // AMOMIN_W_AQ
|
|
9U, // AMOMIN_W_AQ_RL
|
|
9U, // AMOMIN_W_RL
|
|
9U, // AMOOR_D
|
|
9U, // AMOOR_D_AQ
|
|
9U, // AMOOR_D_AQ_RL
|
|
9U, // AMOOR_D_RL
|
|
9U, // AMOOR_W
|
|
9U, // AMOOR_W_AQ
|
|
9U, // AMOOR_W_AQ_RL
|
|
9U, // AMOOR_W_RL
|
|
9U, // AMOSWAP_D
|
|
9U, // AMOSWAP_D_AQ
|
|
9U, // AMOSWAP_D_AQ_RL
|
|
9U, // AMOSWAP_D_RL
|
|
9U, // AMOSWAP_W
|
|
9U, // AMOSWAP_W_AQ
|
|
9U, // AMOSWAP_W_AQ_RL
|
|
9U, // AMOSWAP_W_RL
|
|
9U, // AMOXOR_D
|
|
9U, // AMOXOR_D_AQ
|
|
9U, // AMOXOR_D_AQ_RL
|
|
9U, // AMOXOR_D_RL
|
|
9U, // AMOXOR_W
|
|
9U, // AMOXOR_W_AQ
|
|
9U, // AMOXOR_W_AQ_RL
|
|
9U, // AMOXOR_W_RL
|
|
4U, // AND
|
|
4U, // ANDI
|
|
0U, // AUIPC
|
|
4U, // BEQ
|
|
4U, // BGE
|
|
4U, // BGEU
|
|
4U, // BLT
|
|
4U, // BLTU
|
|
4U, // BNE
|
|
2U, // CSRRC
|
|
2U, // CSRRCI
|
|
2U, // CSRRS
|
|
2U, // CSRRSI
|
|
2U, // CSRRW
|
|
2U, // CSRRWI
|
|
0U, // C_ADD
|
|
0U, // C_ADDI
|
|
0U, // C_ADDI16SP
|
|
4U, // C_ADDI4SPN
|
|
0U, // C_ADDIW
|
|
0U, // C_ADDW
|
|
0U, // C_AND
|
|
0U, // C_ANDI
|
|
0U, // C_BEQZ
|
|
0U, // C_BNEZ
|
|
0U, // C_EBREAK
|
|
13U, // C_FLD
|
|
13U, // C_FLDSP
|
|
13U, // C_FLW
|
|
13U, // C_FLWSP
|
|
13U, // C_FSD
|
|
13U, // C_FSDSP
|
|
13U, // C_FSW
|
|
13U, // C_FSWSP
|
|
0U, // C_J
|
|
0U, // C_JAL
|
|
0U, // C_JALR
|
|
0U, // C_JR
|
|
13U, // C_LD
|
|
13U, // C_LDSP
|
|
0U, // C_LI
|
|
0U, // C_LUI
|
|
13U, // C_LW
|
|
13U, // C_LWSP
|
|
0U, // C_MV
|
|
0U, // C_NOP
|
|
0U, // C_OR
|
|
13U, // C_SD
|
|
13U, // C_SDSP
|
|
0U, // C_SLLI
|
|
0U, // C_SRAI
|
|
0U, // C_SRLI
|
|
0U, // C_SUB
|
|
0U, // C_SUBW
|
|
13U, // C_SW
|
|
13U, // C_SWSP
|
|
0U, // C_UNIMP
|
|
0U, // C_XOR
|
|
4U, // DIV
|
|
4U, // DIVU
|
|
4U, // DIVUW
|
|
4U, // DIVW
|
|
0U, // EBREAK
|
|
0U, // ECALL
|
|
36U, // FADD_D
|
|
36U, // FADD_S
|
|
0U, // FCLASS_D
|
|
0U, // FCLASS_S
|
|
20U, // FCVT_D_L
|
|
20U, // FCVT_D_LU
|
|
0U, // FCVT_D_S
|
|
0U, // FCVT_D_W
|
|
0U, // FCVT_D_WU
|
|
20U, // FCVT_LU_D
|
|
20U, // FCVT_LU_S
|
|
20U, // FCVT_L_D
|
|
20U, // FCVT_L_S
|
|
20U, // FCVT_S_D
|
|
20U, // FCVT_S_L
|
|
20U, // FCVT_S_LU
|
|
20U, // FCVT_S_W
|
|
20U, // FCVT_S_WU
|
|
20U, // FCVT_WU_D
|
|
20U, // FCVT_WU_S
|
|
20U, // FCVT_W_D
|
|
20U, // FCVT_W_S
|
|
36U, // FDIV_D
|
|
36U, // FDIV_S
|
|
0U, // FENCE
|
|
0U, // FENCE_I
|
|
0U, // FENCE_TSO
|
|
4U, // FEQ_D
|
|
4U, // FEQ_S
|
|
13U, // FLD
|
|
4U, // FLE_D
|
|
4U, // FLE_S
|
|
4U, // FLT_D
|
|
4U, // FLT_S
|
|
13U, // FLW
|
|
100U, // FMADD_D
|
|
100U, // FMADD_S
|
|
4U, // FMAX_D
|
|
4U, // FMAX_S
|
|
4U, // FMIN_D
|
|
4U, // FMIN_S
|
|
100U, // FMSUB_D
|
|
100U, // FMSUB_S
|
|
36U, // FMUL_D
|
|
36U, // FMUL_S
|
|
0U, // FMV_D_X
|
|
0U, // FMV_W_X
|
|
0U, // FMV_X_D
|
|
0U, // FMV_X_W
|
|
100U, // FNMADD_D
|
|
100U, // FNMADD_S
|
|
100U, // FNMSUB_D
|
|
100U, // FNMSUB_S
|
|
13U, // FSD
|
|
4U, // FSGNJN_D
|
|
4U, // FSGNJN_S
|
|
4U, // FSGNJX_D
|
|
4U, // FSGNJX_S
|
|
4U, // FSGNJ_D
|
|
4U, // FSGNJ_S
|
|
20U, // FSQRT_D
|
|
20U, // FSQRT_S
|
|
36U, // FSUB_D
|
|
36U, // FSUB_S
|
|
13U, // FSW
|
|
0U, // JAL
|
|
4U, // JALR
|
|
13U, // LB
|
|
13U, // LBU
|
|
13U, // LD
|
|
13U, // LH
|
|
13U, // LHU
|
|
0U, // LR_D
|
|
0U, // LR_D_AQ
|
|
0U, // LR_D_AQ_RL
|
|
0U, // LR_D_RL
|
|
0U, // LR_W
|
|
0U, // LR_W_AQ
|
|
0U, // LR_W_AQ_RL
|
|
0U, // LR_W_RL
|
|
0U, // LUI
|
|
13U, // LW
|
|
13U, // LWU
|
|
0U, // MRET
|
|
4U, // MUL
|
|
4U, // MULH
|
|
4U, // MULHSU
|
|
4U, // MULHU
|
|
4U, // MULW
|
|
4U, // OR
|
|
4U, // ORI
|
|
4U, // REM
|
|
4U, // REMU
|
|
4U, // REMUW
|
|
4U, // REMW
|
|
13U, // SB
|
|
9U, // SC_D
|
|
9U, // SC_D_AQ
|
|
9U, // SC_D_AQ_RL
|
|
9U, // SC_D_RL
|
|
9U, // SC_W
|
|
9U, // SC_W_AQ
|
|
9U, // SC_W_AQ_RL
|
|
9U, // SC_W_RL
|
|
13U, // SD
|
|
0U, // SFENCE_VMA
|
|
13U, // SH
|
|
4U, // SLL
|
|
4U, // SLLI
|
|
4U, // SLLIW
|
|
4U, // SLLW
|
|
4U, // SLT
|
|
4U, // SLTI
|
|
4U, // SLTIU
|
|
4U, // SLTU
|
|
4U, // SRA
|
|
4U, // SRAI
|
|
4U, // SRAIW
|
|
4U, // SRAW
|
|
0U, // SRET
|
|
4U, // SRL
|
|
4U, // SRLI
|
|
4U, // SRLIW
|
|
4U, // SRLW
|
|
4U, // SUB
|
|
4U, // SUBW
|
|
13U, // SW
|
|
0U, // UNIMP
|
|
0U, // URET
|
|
0U, // WFI
|
|
4U, // XOR
|
|
4U, // XORI
|
|
};
|
|
|
|
// Emit the opcode for the instruction.
|
|
uint32_t Bits = 0;
|
|
Bits |= OpInfo0[MCInst_getOpcode(MI)] << 0;
|
|
Bits |= OpInfo1[MCInst_getOpcode(MI)] << 16;
|
|
CS_ASSERT(Bits != 0 && "Cannot print this instruction.");
|
|
#ifndef CAPSTONE_DIET
|
|
SStream_concat0(O, AsmStrs+(Bits & 4095)-1);
|
|
#endif
|
|
|
|
|
|
// Fragment 0 encoded into 2 bits for 4 unique commands.
|
|
switch ((uint32_t)((Bits >> 12) & 3)) {
|
|
default:
|
|
CS_ASSERT(0 && "Invalid command number.");
|
|
return;
|
|
case 0:
|
|
// DBG_VALUE, DBG_LABEL, BUNDLE, LIFETIME_START, LIFETIME_END, FENTRY_CAL...
|
|
return;
|
|
break;
|
|
case 1:
|
|
// PseudoCALL, PseudoLA, PseudoLI, PseudoLLA, PseudoTAIL, ADD, ADDI, ADDI...
|
|
printOperand(MI, 0, O);
|
|
break;
|
|
case 2:
|
|
// C_ADD, C_ADDI, C_ADDI16SP, C_ADDIW, C_ADDW, C_AND, C_ANDI, C_OR, C_SLL...
|
|
printOperand(MI, 1, O);
|
|
SStream_concat0(O, ", ");
|
|
printOperand(MI, 2, O);
|
|
return;
|
|
break;
|
|
case 3:
|
|
// FENCE
|
|
printFenceArg(MI, 0, O);
|
|
SStream_concat0(O, ", ");
|
|
printFenceArg(MI, 1, O);
|
|
return;
|
|
break;
|
|
}
|
|
|
|
|
|
// Fragment 1 encoded into 2 bits for 3 unique commands.
|
|
switch ((uint32_t)((Bits >> 14) & 3)) {
|
|
default:
|
|
CS_ASSERT(0 && "Invalid command number.");
|
|
return;
|
|
case 0:
|
|
// PseudoCALL, PseudoTAIL, C_J, C_JAL, C_JALR, C_JR
|
|
return;
|
|
break;
|
|
case 1:
|
|
// PseudoLA, PseudoLI, PseudoLLA, ADD, ADDI, ADDIW, ADDW, AMOADD_D, AMOAD...
|
|
SStream_concat0(O, ", ");
|
|
break;
|
|
case 2:
|
|
// LR_D, LR_D_AQ, LR_D_AQ_RL, LR_D_RL, LR_W, LR_W_AQ, LR_W_AQ_RL, LR_W_RL
|
|
SStream_concat0(O, ", (");
|
|
printOperand(MI, 1, O);
|
|
SStream_concat0(O, ")");
|
|
return;
|
|
break;
|
|
}
|
|
|
|
|
|
// Fragment 2 encoded into 2 bits for 3 unique commands.
|
|
switch ((uint32_t)((Bits >> 16) & 3)) {
|
|
default:
|
|
CS_ASSERT(0 && "Invalid command number.");
|
|
return;
|
|
case 0:
|
|
// PseudoLA, PseudoLI, PseudoLLA, ADD, ADDI, ADDIW, ADDW, AND, ANDI, AUIP...
|
|
printOperand(MI, 1, O);
|
|
break;
|
|
case 1:
|
|
// AMOADD_D, AMOADD_D_AQ, AMOADD_D_AQ_RL, AMOADD_D_RL, AMOADD_W, AMOADD_W...
|
|
printOperand(MI, 2, O);
|
|
break;
|
|
case 2:
|
|
// CSRRC, CSRRCI, CSRRS, CSRRSI, CSRRW, CSRRWI
|
|
printCSRSystemRegister(MI, 1, O);
|
|
SStream_concat0(O, ", ");
|
|
printOperand(MI, 2, O);
|
|
return;
|
|
break;
|
|
}
|
|
|
|
|
|
// Fragment 3 encoded into 2 bits for 4 unique commands.
|
|
switch ((uint32_t)((Bits >> 18) & 3)) {
|
|
default:
|
|
CS_ASSERT(0 && "Invalid command number.");
|
|
return;
|
|
case 0:
|
|
// PseudoLA, PseudoLI, PseudoLLA, AUIPC, C_BEQZ, C_BNEZ, C_LI, C_LUI, C_M...
|
|
return;
|
|
break;
|
|
case 1:
|
|
// ADD, ADDI, ADDIW, ADDW, AND, ANDI, BEQ, BGE, BGEU, BLT, BLTU, BNE, C_A...
|
|
SStream_concat0(O, ", ");
|
|
break;
|
|
case 2:
|
|
// AMOADD_D, AMOADD_D_AQ, AMOADD_D_AQ_RL, AMOADD_D_RL, AMOADD_W, AMOADD_W...
|
|
SStream_concat0(O, ", (");
|
|
printOperand(MI, 1, O);
|
|
SStream_concat0(O, ")");
|
|
return;
|
|
break;
|
|
case 3:
|
|
// C_FLD, C_FLDSP, C_FLW, C_FLWSP, C_FSD, C_FSDSP, C_FSW, C_FSWSP, C_LD, ...
|
|
SStream_concat0(O, "(");
|
|
printOperand(MI, 1, O);
|
|
SStream_concat0(O, ")");
|
|
return;
|
|
break;
|
|
}
|
|
|
|
|
|
// Fragment 4 encoded into 1 bits for 2 unique commands.
|
|
if ((Bits >> 20) & 1) {
|
|
// FCVT_D_L, FCVT_D_LU, FCVT_LU_D, FCVT_LU_S, FCVT_L_D, FCVT_L_S, FCVT_S_...
|
|
printFRMArg(MI, 2, O);
|
|
return;
|
|
} else {
|
|
// ADD, ADDI, ADDIW, ADDW, AND, ANDI, BEQ, BGE, BGEU, BLT, BLTU, BNE, C_A...
|
|
printOperand(MI, 2, O);
|
|
}
|
|
|
|
|
|
// Fragment 5 encoded into 1 bits for 2 unique commands.
|
|
if ((Bits >> 21) & 1) {
|
|
// FADD_D, FADD_S, FDIV_D, FDIV_S, FMADD_D, FMADD_S, FMSUB_D, FMSUB_S, FM...
|
|
SStream_concat0(O, ", ");
|
|
} else {
|
|
// ADD, ADDI, ADDIW, ADDW, AND, ANDI, BEQ, BGE, BGEU, BLT, BLTU, BNE, C_A...
|
|
return;
|
|
}
|
|
|
|
|
|
// Fragment 6 encoded into 1 bits for 2 unique commands.
|
|
if ((Bits >> 22) & 1) {
|
|
// FMADD_D, FMADD_S, FMSUB_D, FMSUB_S, FNMADD_D, FNMADD_S, FNMSUB_D, FNMS...
|
|
printOperand(MI, 3, O);
|
|
SStream_concat0(O, ", ");
|
|
printFRMArg(MI, 4, O);
|
|
return;
|
|
} else {
|
|
// FADD_D, FADD_S, FDIV_D, FDIV_S, FMUL_D, FMUL_S, FSUB_D, FSUB_S
|
|
printFRMArg(MI, 3, O);
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/// getRegisterName - This method is automatically generated by tblgen
|
|
/// from the register set description. This returns the assembler name
|
|
/// for the specified register.
|
|
static const char *
|
|
getRegisterName(unsigned RegNo, unsigned AltIdx)
|
|
{
|
|
CS_ASSERT(RegNo && RegNo < 97 && "Invalid register number!");
|
|
|
|
#ifndef CAPSTONE_DIET
|
|
static const char AsmStrsABIRegAltName[] = {
|
|
/* 0 */ 'f', 's', '1', '0', 0,
|
|
/* 5 */ 'f', 't', '1', '0', 0,
|
|
/* 10 */ 'f', 'a', '0', 0,
|
|
/* 14 */ 'f', 's', '0', 0,
|
|
/* 18 */ 'f', 't', '0', 0,
|
|
/* 22 */ 'f', 's', '1', '1', 0,
|
|
/* 27 */ 'f', 't', '1', '1', 0,
|
|
/* 32 */ 'f', 'a', '1', 0,
|
|
/* 36 */ 'f', 's', '1', 0,
|
|
/* 40 */ 'f', 't', '1', 0,
|
|
/* 44 */ 'f', 'a', '2', 0,
|
|
/* 48 */ 'f', 's', '2', 0,
|
|
/* 52 */ 'f', 't', '2', 0,
|
|
/* 56 */ 'f', 'a', '3', 0,
|
|
/* 60 */ 'f', 's', '3', 0,
|
|
/* 64 */ 'f', 't', '3', 0,
|
|
/* 68 */ 'f', 'a', '4', 0,
|
|
/* 72 */ 'f', 's', '4', 0,
|
|
/* 76 */ 'f', 't', '4', 0,
|
|
/* 80 */ 'f', 'a', '5', 0,
|
|
/* 84 */ 'f', 's', '5', 0,
|
|
/* 88 */ 'f', 't', '5', 0,
|
|
/* 92 */ 'f', 'a', '6', 0,
|
|
/* 96 */ 'f', 's', '6', 0,
|
|
/* 100 */ 'f', 't', '6', 0,
|
|
/* 104 */ 'f', 'a', '7', 0,
|
|
/* 108 */ 'f', 's', '7', 0,
|
|
/* 112 */ 'f', 't', '7', 0,
|
|
/* 116 */ 'f', 's', '8', 0,
|
|
/* 120 */ 'f', 't', '8', 0,
|
|
/* 124 */ 'f', 's', '9', 0,
|
|
/* 128 */ 'f', 't', '9', 0,
|
|
/* 132 */ 'r', 'a', 0,
|
|
/* 135 */ 'z', 'e', 'r', 'o', 0,
|
|
/* 140 */ 'g', 'p', 0,
|
|
/* 143 */ 's', 'p', 0,
|
|
/* 146 */ 't', 'p', 0,
|
|
};
|
|
|
|
static const uint8_t RegAsmOffsetABIRegAltName[] = {
|
|
135, 132, 143, 140, 146, 19, 41, 53, 15, 37, 11, 33, 45, 57,
|
|
69, 81, 93, 105, 49, 61, 73, 85, 97, 109, 117, 125, 1, 23,
|
|
65, 77, 89, 101, 18, 18, 40, 40, 52, 52, 64, 64, 76, 76,
|
|
88, 88, 100, 100, 112, 112, 14, 14, 36, 36, 10, 10, 32, 32,
|
|
44, 44, 56, 56, 68, 68, 80, 80, 92, 92, 104, 104, 48, 48,
|
|
60, 60, 72, 72, 84, 84, 96, 96, 108, 108, 116, 116, 124, 124,
|
|
0, 0, 22, 22, 120, 120, 128, 128, 5, 5, 27, 27,
|
|
};
|
|
|
|
static const char AsmStrsNoRegAltName[] = {
|
|
/* 0 */ 'f', '1', '0', 0,
|
|
/* 4 */ 'x', '1', '0', 0,
|
|
/* 8 */ 'f', '2', '0', 0,
|
|
/* 12 */ 'x', '2', '0', 0,
|
|
/* 16 */ 'f', '3', '0', 0,
|
|
/* 20 */ 'x', '3', '0', 0,
|
|
/* 24 */ 'f', '0', 0,
|
|
/* 27 */ 'x', '0', 0,
|
|
/* 30 */ 'f', '1', '1', 0,
|
|
/* 34 */ 'x', '1', '1', 0,
|
|
/* 38 */ 'f', '2', '1', 0,
|
|
/* 42 */ 'x', '2', '1', 0,
|
|
/* 46 */ 'f', '3', '1', 0,
|
|
/* 50 */ 'x', '3', '1', 0,
|
|
/* 54 */ 'f', '1', 0,
|
|
/* 57 */ 'x', '1', 0,
|
|
/* 60 */ 'f', '1', '2', 0,
|
|
/* 64 */ 'x', '1', '2', 0,
|
|
/* 68 */ 'f', '2', '2', 0,
|
|
/* 72 */ 'x', '2', '2', 0,
|
|
/* 76 */ 'f', '2', 0,
|
|
/* 79 */ 'x', '2', 0,
|
|
/* 82 */ 'f', '1', '3', 0,
|
|
/* 86 */ 'x', '1', '3', 0,
|
|
/* 90 */ 'f', '2', '3', 0,
|
|
/* 94 */ 'x', '2', '3', 0,
|
|
/* 98 */ 'f', '3', 0,
|
|
/* 101 */ 'x', '3', 0,
|
|
/* 104 */ 'f', '1', '4', 0,
|
|
/* 108 */ 'x', '1', '4', 0,
|
|
/* 112 */ 'f', '2', '4', 0,
|
|
/* 116 */ 'x', '2', '4', 0,
|
|
/* 120 */ 'f', '4', 0,
|
|
/* 123 */ 'x', '4', 0,
|
|
/* 126 */ 'f', '1', '5', 0,
|
|
/* 130 */ 'x', '1', '5', 0,
|
|
/* 134 */ 'f', '2', '5', 0,
|
|
/* 138 */ 'x', '2', '5', 0,
|
|
/* 142 */ 'f', '5', 0,
|
|
/* 145 */ 'x', '5', 0,
|
|
/* 148 */ 'f', '1', '6', 0,
|
|
/* 152 */ 'x', '1', '6', 0,
|
|
/* 156 */ 'f', '2', '6', 0,
|
|
/* 160 */ 'x', '2', '6', 0,
|
|
/* 164 */ 'f', '6', 0,
|
|
/* 167 */ 'x', '6', 0,
|
|
/* 170 */ 'f', '1', '7', 0,
|
|
/* 174 */ 'x', '1', '7', 0,
|
|
/* 178 */ 'f', '2', '7', 0,
|
|
/* 182 */ 'x', '2', '7', 0,
|
|
/* 186 */ 'f', '7', 0,
|
|
/* 189 */ 'x', '7', 0,
|
|
/* 192 */ 'f', '1', '8', 0,
|
|
/* 196 */ 'x', '1', '8', 0,
|
|
/* 200 */ 'f', '2', '8', 0,
|
|
/* 204 */ 'x', '2', '8', 0,
|
|
/* 208 */ 'f', '8', 0,
|
|
/* 211 */ 'x', '8', 0,
|
|
/* 214 */ 'f', '1', '9', 0,
|
|
/* 218 */ 'x', '1', '9', 0,
|
|
/* 222 */ 'f', '2', '9', 0,
|
|
/* 226 */ 'x', '2', '9', 0,
|
|
/* 230 */ 'f', '9', 0,
|
|
/* 233 */ 'x', '9', 0,
|
|
};
|
|
|
|
static const uint8_t RegAsmOffsetNoRegAltName[] = {
|
|
27, 57, 79, 101, 123, 145, 167, 189, 211, 233, 4, 34, 64, 86,
|
|
108, 130, 152, 174, 196, 218, 12, 42, 72, 94, 116, 138, 160, 182,
|
|
204, 226, 20, 50, 24, 24, 54, 54, 76, 76, 98, 98, 120, 120,
|
|
142, 142, 164, 164, 186, 186, 208, 208, 230, 230, 0, 0, 30, 30,
|
|
60, 60, 82, 82, 104, 104, 126, 126, 148, 148, 170, 170, 192, 192,
|
|
214, 214, 8, 8, 38, 38, 68, 68, 90, 90, 112, 112, 134, 134,
|
|
156, 156, 178, 178, 200, 200, 222, 222, 16, 16, 46, 46,
|
|
};
|
|
|
|
switch(AltIdx) {
|
|
default:
|
|
CS_ASSERT(0 && "Invalid register alt name index!");
|
|
return 0;
|
|
case RISCV_ABIRegAltName:
|
|
CS_ASSERT(*(AsmStrsABIRegAltName+RegAsmOffsetABIRegAltName[RegNo-1]) &&
|
|
"Invalid alt name index for register!");
|
|
return AsmStrsABIRegAltName+RegAsmOffsetABIRegAltName[RegNo-1];
|
|
case RISCV_NoRegAltName:
|
|
CS_ASSERT(*(AsmStrsNoRegAltName+RegAsmOffsetNoRegAltName[RegNo-1]) &&
|
|
"Invalid alt name index for register!");
|
|
return AsmStrsNoRegAltName+RegAsmOffsetNoRegAltName[RegNo-1];
|
|
}
|
|
#else
|
|
return NULL;
|
|
#endif
|
|
}
|
|
|
|
#ifdef PRINT_ALIAS_INSTR
|
|
#undef PRINT_ALIAS_INSTR
|
|
|
|
static bool RISCVInstPrinterValidateMCOperand(MCOperand *MCOp,
|
|
unsigned PredicateIndex);
|
|
|
|
static bool printAliasInstr(MCInst *MI, SStream * OS, void *info)
|
|
{
|
|
MCRegisterInfo *MRI = (MCRegisterInfo *) info;
|
|
const char *AsmString;
|
|
unsigned I = 0;
|
|
#define ASMSTRING_CONTAIN_SIZE 64
|
|
unsigned AsmStringLen = 0;
|
|
char tmpString_[ASMSTRING_CONTAIN_SIZE];
|
|
char *tmpString = tmpString_;
|
|
switch (MCInst_getOpcode(MI)) {
|
|
default: return false;
|
|
case RISCV_ADDI:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0 &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0) {
|
|
// (ADDI X0, X0, 0)
|
|
AsmString = "nop";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0) {
|
|
// (ADDI GPR:$rd, GPR:$rs, 0)
|
|
AsmString = "mv $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_ADDIW:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0) {
|
|
// (ADDIW GPR:$rd, GPR:$rs, 0)
|
|
AsmString = "sext.w $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_BEQ:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0 &&
|
|
RISCVInstPrinterValidateMCOperand(MCInst_getOperand(MI, 2), 1)) {
|
|
// (BEQ GPR:$rs, X0, simm13_lsb0:$offset)
|
|
AsmString = "beqz $\x01, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_BGE:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
RISCVInstPrinterValidateMCOperand(MCInst_getOperand(MI, 2), 1)) {
|
|
// (BGE X0, GPR:$rs, simm13_lsb0:$offset)
|
|
AsmString = "blez $\x02, $\x03";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0 &&
|
|
RISCVInstPrinterValidateMCOperand(MCInst_getOperand(MI, 2), 1)) {
|
|
// (BGE GPR:$rs, X0, simm13_lsb0:$offset)
|
|
AsmString = "bgez $\x01, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_BLT:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0 &&
|
|
RISCVInstPrinterValidateMCOperand(MCInst_getOperand(MI, 2), 1)) {
|
|
// (BLT GPR:$rs, X0, simm13_lsb0:$offset)
|
|
AsmString = "bltz $\x01, $\x03";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
RISCVInstPrinterValidateMCOperand(MCInst_getOperand(MI, 2), 1)) {
|
|
// (BLT X0, GPR:$rs, simm13_lsb0:$offset)
|
|
AsmString = "bgtz $\x02, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_BNE:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0 &&
|
|
RISCVInstPrinterValidateMCOperand(MCInst_getOperand(MI, 2), 1)) {
|
|
// (BNE GPR:$rs, X0, simm13_lsb0:$offset)
|
|
AsmString = "bnez $\x01, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_CSRRC:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
|
|
// (CSRRC X0, csr_sysreg:$csr, GPR:$rs)
|
|
AsmString = "csrc $\xFF\x02\x01, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_CSRRCI:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0) {
|
|
// (CSRRCI X0, csr_sysreg:$csr, uimm5:$imm)
|
|
AsmString = "csrci $\xFF\x02\x01, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_CSRRS:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) {
|
|
// (CSRRS GPR:$rd, 3, X0)
|
|
AsmString = "frcsr $\x01";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 2 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) {
|
|
// (CSRRS GPR:$rd, 2, X0)
|
|
AsmString = "frrm $\x01";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 1 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) {
|
|
// (CSRRS GPR:$rd, 1, X0)
|
|
AsmString = "frflags $\x01";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 3074 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) {
|
|
// (CSRRS GPR:$rd, 3074, X0)
|
|
AsmString = "rdinstret $\x01";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 3072 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) {
|
|
// (CSRRS GPR:$rd, 3072, X0)
|
|
AsmString = "rdcycle $\x01";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 3073 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) {
|
|
// (CSRRS GPR:$rd, 3073, X0)
|
|
AsmString = "rdtime $\x01";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 3202 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) {
|
|
// (CSRRS GPR:$rd, 3202, X0)
|
|
AsmString = "rdinstreth $\x01";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 3200 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) {
|
|
// (CSRRS GPR:$rd, 3200, X0)
|
|
AsmString = "rdcycleh $\x01";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 3201 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) {
|
|
// (CSRRS GPR:$rd, 3201, X0)
|
|
AsmString = "rdtimeh $\x01";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) {
|
|
// (CSRRS GPR:$rd, csr_sysreg:$csr, X0)
|
|
AsmString = "csrr $\x01, $\xFF\x02\x01";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
|
|
// (CSRRS X0, csr_sysreg:$csr, GPR:$rs)
|
|
AsmString = "csrs $\xFF\x02\x01, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_CSRRSI:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0) {
|
|
// (CSRRSI X0, csr_sysreg:$csr, uimm5:$imm)
|
|
AsmString = "csrsi $\xFF\x02\x01, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_CSRRW:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
|
|
// (CSRRW X0, 3, GPR:$rs)
|
|
AsmString = "fscsr $\x03";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 2 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
|
|
// (CSRRW X0, 2, GPR:$rs)
|
|
AsmString = "fsrm $\x03";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 1 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
|
|
// (CSRRW X0, 1, GPR:$rs)
|
|
AsmString = "fsflags $\x03";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
|
|
// (CSRRW X0, csr_sysreg:$csr, GPR:$rs)
|
|
AsmString = "csrw $\xFF\x02\x01, $\x03";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
|
|
// (CSRRW GPR:$rd, 3, GPR:$rs)
|
|
AsmString = "fscsr $\x01, $\x03";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 2 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
|
|
// (CSRRW GPR:$rd, 2, GPR:$rs)
|
|
AsmString = "fsrm $\x01, $\x03";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 1 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
|
|
// (CSRRW GPR:$rd, 1, GPR:$rs)
|
|
AsmString = "fsflags $\x01, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_CSRRWI:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 2) {
|
|
// (CSRRWI X0, 2, uimm5:$imm)
|
|
AsmString = "fsrmi $\x03";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 1) {
|
|
// (CSRRWI X0, 1, uimm5:$imm)
|
|
AsmString = "fsflagsi $\x03";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0) {
|
|
// (CSRRWI X0, csr_sysreg:$csr, uimm5:$imm)
|
|
AsmString = "csrwi $\xFF\x02\x01, $\x03";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 2) {
|
|
// (CSRRWI GPR:$rd, 2, uimm5:$imm)
|
|
AsmString = "fsrmi $\x01, $\x03";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 1) {
|
|
// (CSRRWI GPR:$rd, 1, uimm5:$imm)
|
|
AsmString = "fsflagsi $\x01, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FADD_D:
|
|
if (MCInst_getNumOperands(MI) == 4 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 3)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 3)) == 7) {
|
|
// (FADD_D FPR64:$rd, FPR64:$rs1, FPR64:$rs2, { 1, 1, 1 })
|
|
AsmString = "fadd.d $\x01, $\x02, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FADD_S:
|
|
if (MCInst_getNumOperands(MI) == 4 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 3)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 3)) == 7) {
|
|
// (FADD_S FPR32:$rd, FPR32:$rs1, FPR32:$rs2, { 1, 1, 1 })
|
|
AsmString = "fadd.s $\x01, $\x02, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_D_L:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_D_L FPR64:$rd, GPR:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.d.l $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_D_LU:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_D_LU FPR64:$rd, GPR:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.d.lu $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_LU_D:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_LU_D GPR:$rd, FPR64:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.lu.d $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_LU_S:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_LU_S GPR:$rd, FPR32:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.lu.s $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_L_D:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_L_D GPR:$rd, FPR64:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.l.d $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_L_S:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_L_S GPR:$rd, FPR32:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.l.s $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_S_D:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_S_D FPR32:$rd, FPR64:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.s.d $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_S_L:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_S_L FPR32:$rd, GPR:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.s.l $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_S_LU:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_S_LU FPR32:$rd, GPR:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.s.lu $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_S_W:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_S_W FPR32:$rd, GPR:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.s.w $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_S_WU:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_S_WU FPR32:$rd, GPR:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.s.wu $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_WU_D:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_WU_D GPR:$rd, FPR64:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.wu.d $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_WU_S:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_WU_S GPR:$rd, FPR32:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.wu.s $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_W_D:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_W_D GPR:$rd, FPR64:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.w.d $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FCVT_W_S:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FCVT_W_S GPR:$rd, FPR32:$rs1, { 1, 1, 1 })
|
|
AsmString = "fcvt.w.s $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FDIV_D:
|
|
if (MCInst_getNumOperands(MI) == 4 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 3)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 3)) == 7) {
|
|
// (FDIV_D FPR64:$rd, FPR64:$rs1, FPR64:$rs2, { 1, 1, 1 })
|
|
AsmString = "fdiv.d $\x01, $\x02, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FDIV_S:
|
|
if (MCInst_getNumOperands(MI) == 4 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 3)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 3)) == 7) {
|
|
// (FDIV_S FPR32:$rd, FPR32:$rs1, FPR32:$rs2, { 1, 1, 1 })
|
|
AsmString = "fdiv.s $\x01, $\x02, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FENCE:
|
|
if (MCInst_getNumOperands(MI) == 2 &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 0)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 0)) == 15 &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 1)) == 15) {
|
|
// (FENCE 15, 15)
|
|
AsmString = "fence";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FMADD_D:
|
|
if (MCInst_getNumOperands(MI) == 5 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 3)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 3))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 4)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 4)) == 7) {
|
|
// (FMADD_D FPR64:$rd, FPR64:$rs1, FPR64:$rs2, FPR64:$rs3, { 1, 1, 1 })
|
|
AsmString = "fmadd.d $\x01, $\x02, $\x03, $\x04";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FMADD_S:
|
|
if (MCInst_getNumOperands(MI) == 5 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 3)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 3))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 4)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 4)) == 7) {
|
|
// (FMADD_S FPR32:$rd, FPR32:$rs1, FPR32:$rs2, FPR32:$rs3, { 1, 1, 1 })
|
|
AsmString = "fmadd.s $\x01, $\x02, $\x03, $\x04";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FMSUB_D:
|
|
if (MCInst_getNumOperands(MI) == 5 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 3)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 3))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 4)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 4)) == 7) {
|
|
// (FMSUB_D FPR64:$rd, FPR64:$rs1, FPR64:$rs2, FPR64:$rs3, { 1, 1, 1 })
|
|
AsmString = "fmsub.d $\x01, $\x02, $\x03, $\x04";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FMSUB_S:
|
|
if (MCInst_getNumOperands(MI) == 5 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 3)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 3))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 4)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 4)) == 7) {
|
|
// (FMSUB_S FPR32:$rd, FPR32:$rs1, FPR32:$rs2, FPR32:$rs3, { 1, 1, 1 })
|
|
AsmString = "fmsub.s $\x01, $\x02, $\x03, $\x04";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FMUL_D:
|
|
if (MCInst_getNumOperands(MI) == 4 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 3)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 3)) == 7) {
|
|
// (FMUL_D FPR64:$rd, FPR64:$rs1, FPR64:$rs2, { 1, 1, 1 })
|
|
AsmString = "fmul.d $\x01, $\x02, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FMUL_S:
|
|
if (MCInst_getNumOperands(MI) == 4 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 3)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 3)) == 7) {
|
|
// (FMUL_S FPR32:$rd, FPR32:$rs1, FPR32:$rs2, { 1, 1, 1 })
|
|
AsmString = "fmul.s $\x01, $\x02, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FNMADD_D:
|
|
if (MCInst_getNumOperands(MI) == 5 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 3)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 3))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 4)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 4)) == 7) {
|
|
// (FNMADD_D FPR64:$rd, FPR64:$rs1, FPR64:$rs2, FPR64:$rs3, { 1, 1, 1 })
|
|
AsmString = "fnmadd.d $\x01, $\x02, $\x03, $\x04";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FNMADD_S:
|
|
if (MCInst_getNumOperands(MI) == 5 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 3)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 3))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 4)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 4)) == 7) {
|
|
// (FNMADD_S FPR32:$rd, FPR32:$rs1, FPR32:$rs2, FPR32:$rs3, { 1, 1, 1 })
|
|
AsmString = "fnmadd.s $\x01, $\x02, $\x03, $\x04";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FNMSUB_D:
|
|
if (MCInst_getNumOperands(MI) == 5 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 3)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 3))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 4)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 4)) == 7) {
|
|
// (FNMSUB_D FPR64:$rd, FPR64:$rs1, FPR64:$rs2, FPR64:$rs3, { 1, 1, 1 })
|
|
AsmString = "fnmsub.d $\x01, $\x02, $\x03, $\x04";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FNMSUB_S:
|
|
if (MCInst_getNumOperands(MI) == 5 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 3)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 3))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 4)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 4)) == 7) {
|
|
// (FNMSUB_S FPR32:$rd, FPR32:$rs1, FPR32:$rs2, FPR32:$rs3, { 1, 1, 1 })
|
|
AsmString = "fnmsub.s $\x01, $\x02, $\x03, $\x04";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FSGNJN_D:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 1))) {
|
|
// (FSGNJN_D FPR64:$rd, FPR64:$rs, FPR64:$rs)
|
|
AsmString = "fneg.d $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FSGNJN_S:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 1))) {
|
|
// (FSGNJN_S FPR32:$rd, FPR32:$rs, FPR32:$rs)
|
|
AsmString = "fneg.s $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FSGNJX_D:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 1))) {
|
|
// (FSGNJX_D FPR64:$rd, FPR64:$rs, FPR64:$rs)
|
|
AsmString = "fabs.d $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FSGNJX_S:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 1))) {
|
|
// (FSGNJX_S FPR32:$rd, FPR32:$rs, FPR32:$rs)
|
|
AsmString = "fabs.s $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FSGNJ_D:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 1))) {
|
|
// (FSGNJ_D FPR64:$rd, FPR64:$rs, FPR64:$rs)
|
|
AsmString = "fmv.d $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FSGNJ_S:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 1))) {
|
|
// (FSGNJ_S FPR32:$rd, FPR32:$rs, FPR32:$rs)
|
|
AsmString = "fmv.s $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FSQRT_D:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FSQRT_D FPR64:$rd, FPR64:$rs1, { 1, 1, 1 })
|
|
AsmString = "fsqrt.d $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FSQRT_S:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 7) {
|
|
// (FSQRT_S FPR32:$rd, FPR32:$rs1, { 1, 1, 1 })
|
|
AsmString = "fsqrt.s $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FSUB_D:
|
|
if (MCInst_getNumOperands(MI) == 4 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR64RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 3)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 3)) == 7) {
|
|
// (FSUB_D FPR64:$rd, FPR64:$rs1, FPR64:$rs2, { 1, 1, 1 })
|
|
AsmString = "fsub.d $\x01, $\x02, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_FSUB_S:
|
|
if (MCInst_getNumOperands(MI) == 4 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_FPR32RegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 3)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 3)) == 7) {
|
|
// (FSUB_S FPR32:$rd, FPR32:$rs1, FPR32:$rs2, { 1, 1, 1 })
|
|
AsmString = "fsub.s $\x01, $\x02, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_JAL:
|
|
if (MCInst_getNumOperands(MI) == 2 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
RISCVInstPrinterValidateMCOperand(MCInst_getOperand(MI, 1), 2)) {
|
|
// (JAL X0, simm21_lsb0_jal:$offset)
|
|
AsmString = "j $\x02";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 2 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X1 &&
|
|
RISCVInstPrinterValidateMCOperand(MCInst_getOperand(MI, 1), 2)) {
|
|
// (JAL X1, simm21_lsb0_jal:$offset)
|
|
AsmString = "jal $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_JALR:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X1 &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0) {
|
|
// (JALR X0, X1, 0)
|
|
AsmString = "ret";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0) {
|
|
// (JALR X0, GPR:$rs, 0)
|
|
AsmString = "jr $\x02";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X1 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0) {
|
|
// (JALR X1, GPR:$rs, 0)
|
|
AsmString = "jalr $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_SFENCE_VMA:
|
|
if (MCInst_getNumOperands(MI) == 2 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0 &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) {
|
|
// (SFENCE_VMA X0, X0)
|
|
AsmString = "sfence.vma";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 2 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) {
|
|
// (SFENCE_VMA GPR:$rs, X0)
|
|
AsmString = "sfence.vma $\x01";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_SLT:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) {
|
|
// (SLT GPR:$rd, GPR:$rs, X0)
|
|
AsmString = "sltz $\x01, $\x02";
|
|
break;
|
|
}
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
|
|
// (SLT GPR:$rd, X0, GPR:$rs)
|
|
AsmString = "sgtz $\x01, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_SLTIU:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == 1) {
|
|
// (SLTIU GPR:$rd, GPR:$rs, 1)
|
|
AsmString = "seqz $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_SLTU:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
|
|
// (SLTU GPR:$rd, X0, GPR:$rs)
|
|
AsmString = "snez $\x01, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_SUB:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
|
|
// (SUB GPR:$rd, X0, GPR:$rs)
|
|
AsmString = "neg $\x01, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_SUBW:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
|
|
// (SUBW GPR:$rd, X0, GPR:$rs)
|
|
AsmString = "negw $\x01, $\x03";
|
|
break;
|
|
}
|
|
return false;
|
|
case RISCV_XORI:
|
|
if (MCInst_getNumOperands(MI) == 3 &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
|
|
MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
|
|
MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, RISCV_GPRRegClassID), MCOperand_getReg(MCInst_getOperand(MI, 1))) &&
|
|
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
|
|
MCOperand_getImm(MCInst_getOperand(MI, 2)) == -1) {
|
|
// (XORI GPR:$rd, GPR:$rs, -1)
|
|
AsmString = "not $\x01, $\x02";
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
AsmStringLen = strlen(AsmString);
|
|
if (ASMSTRING_CONTAIN_SIZE - 1 < AsmStringLen)
|
|
tmpString = cs_strdup(AsmString);
|
|
else
|
|
tmpString = memcpy(tmpString, AsmString, 1 + AsmStringLen);
|
|
|
|
while (AsmString[I] != ' ' && AsmString[I] != '\t' &&
|
|
AsmString[I] != '$' && AsmString[I] != '\0')
|
|
++I;
|
|
tmpString[I] = 0;
|
|
SStream_concat0(OS, tmpString);
|
|
if (ASMSTRING_CONTAIN_SIZE - 1 < AsmStringLen)
|
|
/* Free the possible cs_strdup() memory. PR#1424. */
|
|
cs_mem_free(tmpString);
|
|
#undef ASMSTRING_CONTAIN_SIZE
|
|
|
|
if (AsmString[I] != '\0') {
|
|
if (AsmString[I] == ' ' || AsmString[I] == '\t') {
|
|
SStream_concat0(OS, " ");
|
|
++I;
|
|
}
|
|
do {
|
|
if (AsmString[I] == '$') {
|
|
++I;
|
|
if (AsmString[I] == (char)0xff) {
|
|
++I;
|
|
int OpIdx = AsmString[I++] - 1;
|
|
int PrintMethodIdx = AsmString[I++] - 1;
|
|
printCustomAliasOperand(MI, OpIdx, PrintMethodIdx, OS);
|
|
} else
|
|
printOperand(MI, (unsigned)(AsmString[I++]) - 1, OS);
|
|
} else {
|
|
SStream_concat1(OS, AsmString[I++]);
|
|
}
|
|
} while (AsmString[I] != '\0');
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static void printCustomAliasOperand(
|
|
MCInst *MI, unsigned OpIdx,
|
|
unsigned PrintMethodIdx,
|
|
SStream *OS) {
|
|
switch (PrintMethodIdx) {
|
|
default:
|
|
CS_ASSERT(0 && "Unknown PrintMethod kind");
|
|
break;
|
|
case 0:
|
|
printCSRSystemRegister(MI, OpIdx, OS);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static bool RISCVInstPrinterValidateMCOperand(MCOperand *MCOp,
|
|
unsigned PredicateIndex) {
|
|
// TODO: need some constant untils operate the MCOperand,
|
|
// but current CAPSTONE doesn't have.
|
|
// So, We just return true
|
|
return true;
|
|
|
|
#if 0
|
|
switch (PredicateIndex) {
|
|
default:
|
|
llvm_unreachable("Unknown MCOperandPredicate kind");
|
|
break;
|
|
case 1: {
|
|
|
|
int64_t Imm;
|
|
if (MCOp.evaluateAsConstantImm(Imm))
|
|
return isShiftedInt<12, 1>(Imm);
|
|
return MCOp.isBareSymbolRef();
|
|
|
|
}
|
|
case 2: {
|
|
|
|
int64_t Imm;
|
|
if (MCOp.evaluateAsConstantImm(Imm))
|
|
return isShiftedInt<20, 1>(Imm);
|
|
return MCOp.isBareSymbolRef();
|
|
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#endif // PRINT_ALIAS_INSTR
|