0042-RISC-V-Define-pseudo-rev-orc-zip-unzip-as-alias-inst.patch 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. From 61090f05eb983ce302df091fb118103daa6dbb4e Mon Sep 17 00:00:00 2001
  2. From: Nelson Chu <nelson.chu@sifive.com>
  3. Date: Fri, 11 Dec 2020 12:42:36 +0800
  4. Subject: [PATCH 42/48] RISC-V: Define pseudo rev/orc/zip/unzip as alias
  5. instructions.
  6. Generally, we usually use INSN_MACRO to expand a pseudo into multiple
  7. instructions; But if the pseudos are one to one mapping, then they are
  8. more like alias instructions, and can use INSN_ALIAS to handle them.
  9. One of the benefits of INSN_ALIAS is that - we can dump the their pseudo
  10. names directly, and it is more friendly to users.
  11. ---
  12. gas/config/tc-riscv.c | 56 ----
  13. .../gas/riscv/bitmanip-insns-pseudo-32.d | 60 +++++
  14. .../gas/riscv/bitmanip-insns-pseudo-64.d | 82 ++++++
  15. .../riscv/bitmanip-insns-pseudo-noalias-32.d | 60 +++++
  16. .../riscv/bitmanip-insns-pseudo-noalias-64.d | 82 ++++++
  17. .../gas/riscv/bitmanip-insns-pseudo.s | 81 ++++++
  18. include/opcode/riscv.h | 1 -
  19. opcodes/riscv-opc.c | 249 ++++++++++++------
  20. 8 files changed, 537 insertions(+), 134 deletions(-)
  21. create mode 100644 gas/testsuite/gas/riscv/bitmanip-insns-pseudo-32.d
  22. create mode 100644 gas/testsuite/gas/riscv/bitmanip-insns-pseudo-64.d
  23. create mode 100644 gas/testsuite/gas/riscv/bitmanip-insns-pseudo-noalias-32.d
  24. create mode 100644 gas/testsuite/gas/riscv/bitmanip-insns-pseudo-noalias-64.d
  25. create mode 100644 gas/testsuite/gas/riscv/bitmanip-insns-pseudo.s
  26. diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
  27. index b1b86a7afb..2a5ac9c861 100644
  28. --- a/gas/config/tc-riscv.c
  29. +++ b/gas/config/tc-riscv.c
  30. @@ -1533,58 +1533,6 @@ funnel_left (int rd, int rs1, int rs3, unsigned shamt, unsigned this_xlen)
  31. as_fatal (_("internal error: bad left shift xlen %d"), this_xlen);
  32. }
  33. -static void
  34. -perm (int rd, int rs1, const char *op)
  35. -{
  36. - const char *insn = NULL;
  37. - const char *p = op;
  38. - int shamt = 0;
  39. - int shfl = 0;
  40. -
  41. - switch (p[0])
  42. - {
  43. - case 'r': insn = "grevi"; shamt = xlen-1; p += 3; break;
  44. - case 'o': insn = "gorci"; shamt = xlen-1; p += 3; break;
  45. - case 'z': insn = "shfli"; shamt = xlen/2-1; p += 3; shfl = 1; break;
  46. - case 'u': insn = "unshfli"; shamt = xlen/2-1; p += 5; shfl = 1; break;
  47. - default: as_fatal (_("internal error: bad permutation pseudo-instruction %s"), op);
  48. - }
  49. -
  50. - switch (p[0])
  51. - {
  52. - case '2': shamt &= shamt << 1; p += 1; break;
  53. - case '4': shamt &= shamt << 2; p += 1; break;
  54. - case '8': shamt &= shamt << 3; p += 1; break;
  55. - case '1': shamt &= shamt << 4; p += 2; break;
  56. - case '3': shamt &= shamt << 5; p += 2;
  57. - }
  58. -
  59. - if (p[0])
  60. - {
  61. - if (shfl)
  62. - switch (p[1])
  63. - {
  64. - case 'w': shamt &= 15; break;
  65. - case 'h': shamt &= 7; break;
  66. - case 'b': shamt &= 3; break;
  67. - case 'n': shamt &= 1; break;
  68. - default: as_fatal (_("internal error: bad permutation pseudo-instruction %s"), op);
  69. - }
  70. - else
  71. - switch (p[1])
  72. - {
  73. - case 'w': shamt &= 31; break;
  74. - case 'h': shamt &= 15; break;
  75. - case 'b': shamt &= 7; break;
  76. - case 'n': shamt &= 3; break;
  77. - case 'p': shamt &= 1; break;
  78. - default: as_fatal (_("internal error: bad permutation pseudo-instruction %s"), op);
  79. - }
  80. - }
  81. -
  82. - macro_build (NULL, insn, "d,s,>", rd, rs1, shamt);
  83. -}
  84. -
  85. /* Expand RISC-V Vector macros into one of more instructions. */
  86. static void
  87. @@ -1701,10 +1649,6 @@ macro (struct riscv_cl_insn *ip, expressionS *imm_expr,
  88. funnel_left (rd, rs1, rs3, shamt, ip->insn_mo->xlen_requirement ? ip->insn_mo->xlen_requirement/2 : xlen);
  89. break;
  90. - case M_PERM:
  91. - perm (rd, rs1, ip->insn_mo->name);
  92. - break;
  93. -
  94. case M_LA:
  95. case M_LLA:
  96. /* Load the address of a symbol into a register. */
  97. diff --git a/gas/testsuite/gas/riscv/bitmanip-insns-pseudo-32.d b/gas/testsuite/gas/riscv/bitmanip-insns-pseudo-32.d
  98. new file mode 100644
  99. index 0000000000..2f24a19efc
  100. --- /dev/null
  101. +++ b/gas/testsuite/gas/riscv/bitmanip-insns-pseudo-32.d
  102. @@ -0,0 +1,60 @@
  103. +#as: -march=rv32ib
  104. +#source: bitmanip-insns-pseudo.s
  105. +#objdump: -dr
  106. +
  107. +.*:[ ]+file format .*
  108. +
  109. +
  110. +Disassembly of section .text:
  111. +
  112. +0+000 <.text>:
  113. +[ ]+[0-9a-f]+:[ ]+6815d513[ ]+rev.p[ ]+a0,a1
  114. +[ ]+[0-9a-f]+:[ ]+6825d513[ ]+rev2.n[ ]+a0,a1
  115. +[ ]+[0-9a-f]+:[ ]+6835d513[ ]+rev.n[ ]+a0,a1
  116. +[ ]+[0-9a-f]+:[ ]+6845d513[ ]+rev4.b[ ]+a0,a1
  117. +[ ]+[0-9a-f]+:[ ]+6865d513[ ]+rev2.b[ ]+a0,a1
  118. +[ ]+[0-9a-f]+:[ ]+6875d513[ ]+rev.b[ ]+a0,a1
  119. +[ ]+[0-9a-f]+:[ ]+6885d513[ ]+rev8.h[ ]+a0,a1
  120. +[ ]+[0-9a-f]+:[ ]+68c5d513[ ]+rev4.h[ ]+a0,a1
  121. +[ ]+[0-9a-f]+:[ ]+68e5d513[ ]+rev2.h[ ]+a0,a1
  122. +[ ]+[0-9a-f]+:[ ]+68f5d513[ ]+rev.h[ ]+a0,a1
  123. +[ ]+[0-9a-f]+:[ ]+6905d513[ ]+rev16[ ]+a0,a1
  124. +[ ]+[0-9a-f]+:[ ]+6985d513[ ]+rev8[ ]+a0,a1
  125. +[ ]+[0-9a-f]+:[ ]+69c5d513[ ]+rev4[ ]+a0,a1
  126. +[ ]+[0-9a-f]+:[ ]+69e5d513[ ]+rev2[ ]+a0,a1
  127. +[ ]+[0-9a-f]+:[ ]+69f5d513[ ]+rev[ ]+a0,a1
  128. +[ ]+[0-9a-f]+:[ ]+2815d513[ ]+orc.p[ ]+a0,a1
  129. +[ ]+[0-9a-f]+:[ ]+2825d513[ ]+orc2.n[ ]+a0,a1
  130. +[ ]+[0-9a-f]+:[ ]+2835d513[ ]+orc.n[ ]+a0,a1
  131. +[ ]+[0-9a-f]+:[ ]+2845d513[ ]+orc4.b[ ]+a0,a1
  132. +[ ]+[0-9a-f]+:[ ]+2865d513[ ]+orc2.b[ ]+a0,a1
  133. +[ ]+[0-9a-f]+:[ ]+2875d513[ ]+orc.b[ ]+a0,a1
  134. +[ ]+[0-9a-f]+:[ ]+2885d513[ ]+orc8.h[ ]+a0,a1
  135. +[ ]+[0-9a-f]+:[ ]+28c5d513[ ]+orc4.h[ ]+a0,a1
  136. +[ ]+[0-9a-f]+:[ ]+28e5d513[ ]+orc2.h[ ]+a0,a1
  137. +[ ]+[0-9a-f]+:[ ]+28f5d513[ ]+orc.h[ ]+a0,a1
  138. +[ ]+[0-9a-f]+:[ ]+2905d513[ ]+orc16[ ]+a0,a1
  139. +[ ]+[0-9a-f]+:[ ]+2985d513[ ]+orc8[ ]+a0,a1
  140. +[ ]+[0-9a-f]+:[ ]+29c5d513[ ]+orc4[ ]+a0,a1
  141. +[ ]+[0-9a-f]+:[ ]+29e5d513[ ]+orc2[ ]+a0,a1
  142. +[ ]+[0-9a-f]+:[ ]+29f5d513[ ]+orc[ ]+a0,a1
  143. +[ ]+[0-9a-f]+:[ ]+08159513[ ]+zip.n[ ]+a0,a1
  144. +[ ]+[0-9a-f]+:[ ]+08259513[ ]+zip2.b[ ]+a0,a1
  145. +[ ]+[0-9a-f]+:[ ]+08359513[ ]+zip.b[ ]+a0,a1
  146. +[ ]+[0-9a-f]+:[ ]+08459513[ ]+zip4.h[ ]+a0,a1
  147. +[ ]+[0-9a-f]+:[ ]+08659513[ ]+zip2.h[ ]+a0,a1
  148. +[ ]+[0-9a-f]+:[ ]+08759513[ ]+zip.h[ ]+a0,a1
  149. +[ ]+[0-9a-f]+:[ ]+08859513[ ]+zip8[ ]+a0,a1
  150. +[ ]+[0-9a-f]+:[ ]+08c59513[ ]+zip4[ ]+a0,a1
  151. +[ ]+[0-9a-f]+:[ ]+08e59513[ ]+zip2[ ]+a0,a1
  152. +[ ]+[0-9a-f]+:[ ]+08f59513[ ]+zip[ ]+a0,a1
  153. +[ ]+[0-9a-f]+:[ ]+0815d513[ ]+unzip.n[ ]+a0,a1
  154. +[ ]+[0-9a-f]+:[ ]+0825d513[ ]+unzip2.b[ ]+a0,a1
  155. +[ ]+[0-9a-f]+:[ ]+0835d513[ ]+unzip.b[ ]+a0,a1
  156. +[ ]+[0-9a-f]+:[ ]+0845d513[ ]+unzip4.h[ ]+a0,a1
  157. +[ ]+[0-9a-f]+:[ ]+0865d513[ ]+unzip2.h[ ]+a0,a1
  158. +[ ]+[0-9a-f]+:[ ]+0875d513[ ]+unzip.h[ ]+a0,a1
  159. +[ ]+[0-9a-f]+:[ ]+0885d513[ ]+unzip8[ ]+a0,a1
  160. +[ ]+[0-9a-f]+:[ ]+08c5d513[ ]+unzip4[ ]+a0,a1
  161. +[ ]+[0-9a-f]+:[ ]+08e5d513[ ]+unzip2[ ]+a0,a1
  162. +[ ]+[0-9a-f]+:[ ]+08f5d513[ ]+unzip[ ]+a0,a1
  163. diff --git a/gas/testsuite/gas/riscv/bitmanip-insns-pseudo-64.d b/gas/testsuite/gas/riscv/bitmanip-insns-pseudo-64.d
  164. new file mode 100644
  165. index 0000000000..6c27edac80
  166. --- /dev/null
  167. +++ b/gas/testsuite/gas/riscv/bitmanip-insns-pseudo-64.d
  168. @@ -0,0 +1,82 @@
  169. +#as: -march=rv64ib -defsym __64_bit__=1
  170. +#source: bitmanip-insns-pseudo.s
  171. +#objdump: -dr
  172. +
  173. +.*:[ ]+file format .*
  174. +
  175. +
  176. +Disassembly of section .text:
  177. +
  178. +0+000 <.text>:
  179. +[ ]+[0-9a-f]+:[ ]+6815d513[ ]+rev.p[ ]+a0,a1
  180. +[ ]+[0-9a-f]+:[ ]+6825d513[ ]+rev2.n[ ]+a0,a1
  181. +[ ]+[0-9a-f]+:[ ]+6835d513[ ]+rev.n[ ]+a0,a1
  182. +[ ]+[0-9a-f]+:[ ]+6845d513[ ]+rev4.b[ ]+a0,a1
  183. +[ ]+[0-9a-f]+:[ ]+6865d513[ ]+rev2.b[ ]+a0,a1
  184. +[ ]+[0-9a-f]+:[ ]+6875d513[ ]+rev.b[ ]+a0,a1
  185. +[ ]+[0-9a-f]+:[ ]+6885d513[ ]+rev8.h[ ]+a0,a1
  186. +[ ]+[0-9a-f]+:[ ]+68c5d513[ ]+rev4.h[ ]+a0,a1
  187. +[ ]+[0-9a-f]+:[ ]+68e5d513[ ]+rev2.h[ ]+a0,a1
  188. +[ ]+[0-9a-f]+:[ ]+68f5d513[ ]+rev.h[ ]+a0,a1
  189. +[ ]+[0-9a-f]+:[ ]+6b05d513[ ]+rev16[ ]+a0,a1
  190. +[ ]+[0-9a-f]+:[ ]+6b85d513[ ]+rev8[ ]+a0,a1
  191. +[ ]+[0-9a-f]+:[ ]+6bc5d513[ ]+rev4[ ]+a0,a1
  192. +[ ]+[0-9a-f]+:[ ]+6be5d513[ ]+rev2[ ]+a0,a1
  193. +[ ]+[0-9a-f]+:[ ]+6bf5d513[ ]+rev[ ]+a0,a1
  194. +[ ]+[0-9a-f]+:[ ]+2815d513[ ]+orc.p[ ]+a0,a1
  195. +[ ]+[0-9a-f]+:[ ]+2825d513[ ]+orc2.n[ ]+a0,a1
  196. +[ ]+[0-9a-f]+:[ ]+2835d513[ ]+orc.n[ ]+a0,a1
  197. +[ ]+[0-9a-f]+:[ ]+2845d513[ ]+orc4.b[ ]+a0,a1
  198. +[ ]+[0-9a-f]+:[ ]+2865d513[ ]+orc2.b[ ]+a0,a1
  199. +[ ]+[0-9a-f]+:[ ]+2875d513[ ]+orc.b[ ]+a0,a1
  200. +[ ]+[0-9a-f]+:[ ]+2885d513[ ]+orc8.h[ ]+a0,a1
  201. +[ ]+[0-9a-f]+:[ ]+28c5d513[ ]+orc4.h[ ]+a0,a1
  202. +[ ]+[0-9a-f]+:[ ]+28e5d513[ ]+orc2.h[ ]+a0,a1
  203. +[ ]+[0-9a-f]+:[ ]+28f5d513[ ]+orc.h[ ]+a0,a1
  204. +[ ]+[0-9a-f]+:[ ]+2b05d513[ ]+orc16[ ]+a0,a1
  205. +[ ]+[0-9a-f]+:[ ]+2b85d513[ ]+orc8[ ]+a0,a1
  206. +[ ]+[0-9a-f]+:[ ]+2bc5d513[ ]+orc4[ ]+a0,a1
  207. +[ ]+[0-9a-f]+:[ ]+2be5d513[ ]+orc2[ ]+a0,a1
  208. +[ ]+[0-9a-f]+:[ ]+2bf5d513[ ]+orc[ ]+a0,a1
  209. +[ ]+[0-9a-f]+:[ ]+08159513[ ]+zip.n[ ]+a0,a1
  210. +[ ]+[0-9a-f]+:[ ]+08259513[ ]+zip2.b[ ]+a0,a1
  211. +[ ]+[0-9a-f]+:[ ]+08359513[ ]+zip.b[ ]+a0,a1
  212. +[ ]+[0-9a-f]+:[ ]+08459513[ ]+zip4.h[ ]+a0,a1
  213. +[ ]+[0-9a-f]+:[ ]+08659513[ ]+zip2.h[ ]+a0,a1
  214. +[ ]+[0-9a-f]+:[ ]+08759513[ ]+zip.h[ ]+a0,a1
  215. +[ ]+[0-9a-f]+:[ ]+09859513[ ]+zip8[ ]+a0,a1
  216. +[ ]+[0-9a-f]+:[ ]+09c59513[ ]+zip4[ ]+a0,a1
  217. +[ ]+[0-9a-f]+:[ ]+09e59513[ ]+zip2[ ]+a0,a1
  218. +[ ]+[0-9a-f]+:[ ]+09f59513[ ]+zip[ ]+a0,a1
  219. +[ ]+[0-9a-f]+:[ ]+0815d513[ ]+unzip.n[ ]+a0,a1
  220. +[ ]+[0-9a-f]+:[ ]+0825d513[ ]+unzip2.b[ ]+a0,a1
  221. +[ ]+[0-9a-f]+:[ ]+0835d513[ ]+unzip.b[ ]+a0,a1
  222. +[ ]+[0-9a-f]+:[ ]+0845d513[ ]+unzip4.h[ ]+a0,a1
  223. +[ ]+[0-9a-f]+:[ ]+0865d513[ ]+unzip2.h[ ]+a0,a1
  224. +[ ]+[0-9a-f]+:[ ]+0875d513[ ]+unzip.h[ ]+a0,a1
  225. +[ ]+[0-9a-f]+:[ ]+0985d513[ ]+unzip8[ ]+a0,a1
  226. +[ ]+[0-9a-f]+:[ ]+09c5d513[ ]+unzip4[ ]+a0,a1
  227. +[ ]+[0-9a-f]+:[ ]+09e5d513[ ]+unzip2[ ]+a0,a1
  228. +[ ]+[0-9a-f]+:[ ]+09f5d513[ ]+unzip[ ]+a0,a1
  229. +[ ]+[0-9a-f]+:[ ]+6905d513[ ]+rev16.w[ ]+a0,a1
  230. +[ ]+[0-9a-f]+:[ ]+6985d513[ ]+rev8.w[ ]+a0,a1
  231. +[ ]+[0-9a-f]+:[ ]+69c5d513[ ]+rev4.w[ ]+a0,a1
  232. +[ ]+[0-9a-f]+:[ ]+69e5d513[ ]+rev2.w[ ]+a0,a1
  233. +[ ]+[0-9a-f]+:[ ]+69f5d513[ ]+rev.w[ ]+a0,a1
  234. +[ ]+[0-9a-f]+:[ ]+6a05d513[ ]+rev32[ ]+a0,a1
  235. +[ ]+[0-9a-f]+:[ ]+2905d513[ ]+orc16.w[ ]+a0,a1
  236. +[ ]+[0-9a-f]+:[ ]+2985d513[ ]+orc8.w[ ]+a0,a1
  237. +[ ]+[0-9a-f]+:[ ]+29c5d513[ ]+orc4.w[ ]+a0,a1
  238. +[ ]+[0-9a-f]+:[ ]+29e5d513[ ]+orc2.w[ ]+a0,a1
  239. +[ ]+[0-9a-f]+:[ ]+29f5d513[ ]+orc.w[ ]+a0,a1
  240. +[ ]+[0-9a-f]+:[ ]+2a05d513[ ]+orc32[ ]+a0,a1
  241. +[ ]+[0-9a-f]+:[ ]+08859513[ ]+zip8.w[ ]+a0,a1
  242. +[ ]+[0-9a-f]+:[ ]+08c59513[ ]+zip4.w[ ]+a0,a1
  243. +[ ]+[0-9a-f]+:[ ]+08e59513[ ]+zip2.w[ ]+a0,a1
  244. +[ ]+[0-9a-f]+:[ ]+08f59513[ ]+zip.w[ ]+a0,a1
  245. +[ ]+[0-9a-f]+:[ ]+09059513[ ]+zip16[ ]+a0,a1
  246. +[ ]+[0-9a-f]+:[ ]+0885d513[ ]+unzip8.w[ ]+a0,a1
  247. +[ ]+[0-9a-f]+:[ ]+08c5d513[ ]+unzip4.w[ ]+a0,a1
  248. +[ ]+[0-9a-f]+:[ ]+08e5d513[ ]+unzip2.w[ ]+a0,a1
  249. +[ ]+[0-9a-f]+:[ ]+08f5d513[ ]+unzip.w[ ]+a0,a1
  250. +[ ]+[0-9a-f]+:[ ]+0905d513[ ]+unzip16[ ]+a0,a1
  251. diff --git a/gas/testsuite/gas/riscv/bitmanip-insns-pseudo-noalias-32.d b/gas/testsuite/gas/riscv/bitmanip-insns-pseudo-noalias-32.d
  252. new file mode 100644
  253. index 0000000000..c2dde4cfaa
  254. --- /dev/null
  255. +++ b/gas/testsuite/gas/riscv/bitmanip-insns-pseudo-noalias-32.d
  256. @@ -0,0 +1,60 @@
  257. +#as: -march=rv32ib
  258. +#source: bitmanip-insns-pseudo.s
  259. +#objdump: -dr -Mno-aliases
  260. +
  261. +.*:[ ]+file format .*
  262. +
  263. +
  264. +Disassembly of section .text:
  265. +
  266. +0+000 <.text>:
  267. +[ ]+[0-9a-f]+:[ ]+6815d513[ ]+grevi[ ]+a0,a1,0x1
  268. +[ ]+[0-9a-f]+:[ ]+6825d513[ ]+grevi[ ]+a0,a1,0x2
  269. +[ ]+[0-9a-f]+:[ ]+6835d513[ ]+grevi[ ]+a0,a1,0x3
  270. +[ ]+[0-9a-f]+:[ ]+6845d513[ ]+grevi[ ]+a0,a1,0x4
  271. +[ ]+[0-9a-f]+:[ ]+6865d513[ ]+grevi[ ]+a0,a1,0x6
  272. +[ ]+[0-9a-f]+:[ ]+6875d513[ ]+grevi[ ]+a0,a1,0x7
  273. +[ ]+[0-9a-f]+:[ ]+6885d513[ ]+grevi[ ]+a0,a1,0x8
  274. +[ ]+[0-9a-f]+:[ ]+68c5d513[ ]+grevi[ ]+a0,a1,0xc
  275. +[ ]+[0-9a-f]+:[ ]+68e5d513[ ]+grevi[ ]+a0,a1,0xe
  276. +[ ]+[0-9a-f]+:[ ]+68f5d513[ ]+grevi[ ]+a0,a1,0xf
  277. +[ ]+[0-9a-f]+:[ ]+6905d513[ ]+grevi[ ]+a0,a1,0x10
  278. +[ ]+[0-9a-f]+:[ ]+6985d513[ ]+grevi[ ]+a0,a1,0x18
  279. +[ ]+[0-9a-f]+:[ ]+69c5d513[ ]+grevi[ ]+a0,a1,0x1c
  280. +[ ]+[0-9a-f]+:[ ]+69e5d513[ ]+grevi[ ]+a0,a1,0x1e
  281. +[ ]+[0-9a-f]+:[ ]+69f5d513[ ]+grevi[ ]+a0,a1,0x1f
  282. +[ ]+[0-9a-f]+:[ ]+2815d513[ ]+gorci[ ]+a0,a1,0x1
  283. +[ ]+[0-9a-f]+:[ ]+2825d513[ ]+gorci[ ]+a0,a1,0x2
  284. +[ ]+[0-9a-f]+:[ ]+2835d513[ ]+gorci[ ]+a0,a1,0x3
  285. +[ ]+[0-9a-f]+:[ ]+2845d513[ ]+gorci[ ]+a0,a1,0x4
  286. +[ ]+[0-9a-f]+:[ ]+2865d513[ ]+gorci[ ]+a0,a1,0x6
  287. +[ ]+[0-9a-f]+:[ ]+2875d513[ ]+gorci[ ]+a0,a1,0x7
  288. +[ ]+[0-9a-f]+:[ ]+2885d513[ ]+gorci[ ]+a0,a1,0x8
  289. +[ ]+[0-9a-f]+:[ ]+28c5d513[ ]+gorci[ ]+a0,a1,0xc
  290. +[ ]+[0-9a-f]+:[ ]+28e5d513[ ]+gorci[ ]+a0,a1,0xe
  291. +[ ]+[0-9a-f]+:[ ]+28f5d513[ ]+gorci[ ]+a0,a1,0xf
  292. +[ ]+[0-9a-f]+:[ ]+2905d513[ ]+gorci[ ]+a0,a1,0x10
  293. +[ ]+[0-9a-f]+:[ ]+2985d513[ ]+gorci[ ]+a0,a1,0x18
  294. +[ ]+[0-9a-f]+:[ ]+29c5d513[ ]+gorci[ ]+a0,a1,0x1c
  295. +[ ]+[0-9a-f]+:[ ]+29e5d513[ ]+gorci[ ]+a0,a1,0x1e
  296. +[ ]+[0-9a-f]+:[ ]+29f5d513[ ]+gorci[ ]+a0,a1,0x1f
  297. +[ ]+[0-9a-f]+:[ ]+08159513[ ]+shfli[ ]+a0,a1,0x1
  298. +[ ]+[0-9a-f]+:[ ]+08259513[ ]+shfli[ ]+a0,a1,0x2
  299. +[ ]+[0-9a-f]+:[ ]+08359513[ ]+shfli[ ]+a0,a1,0x3
  300. +[ ]+[0-9a-f]+:[ ]+08459513[ ]+shfli[ ]+a0,a1,0x4
  301. +[ ]+[0-9a-f]+:[ ]+08659513[ ]+shfli[ ]+a0,a1,0x6
  302. +[ ]+[0-9a-f]+:[ ]+08759513[ ]+shfli[ ]+a0,a1,0x7
  303. +[ ]+[0-9a-f]+:[ ]+08859513[ ]+shfli[ ]+a0,a1,0x8
  304. +[ ]+[0-9a-f]+:[ ]+08c59513[ ]+shfli[ ]+a0,a1,0xc
  305. +[ ]+[0-9a-f]+:[ ]+08e59513[ ]+shfli[ ]+a0,a1,0xe
  306. +[ ]+[0-9a-f]+:[ ]+08f59513[ ]+shfli[ ]+a0,a1,0xf
  307. +[ ]+[0-9a-f]+:[ ]+0815d513[ ]+unshfli[ ]+a0,a1,0x1
  308. +[ ]+[0-9a-f]+:[ ]+0825d513[ ]+unshfli[ ]+a0,a1,0x2
  309. +[ ]+[0-9a-f]+:[ ]+0835d513[ ]+unshfli[ ]+a0,a1,0x3
  310. +[ ]+[0-9a-f]+:[ ]+0845d513[ ]+unshfli[ ]+a0,a1,0x4
  311. +[ ]+[0-9a-f]+:[ ]+0865d513[ ]+unshfli[ ]+a0,a1,0x6
  312. +[ ]+[0-9a-f]+:[ ]+0875d513[ ]+unshfli[ ]+a0,a1,0x7
  313. +[ ]+[0-9a-f]+:[ ]+0885d513[ ]+unshfli[ ]+a0,a1,0x8
  314. +[ ]+[0-9a-f]+:[ ]+08c5d513[ ]+unshfli[ ]+a0,a1,0xc
  315. +[ ]+[0-9a-f]+:[ ]+08e5d513[ ]+unshfli[ ]+a0,a1,0xe
  316. +[ ]+[0-9a-f]+:[ ]+08f5d513[ ]+unshfli[ ]+a0,a1,0xf
  317. diff --git a/gas/testsuite/gas/riscv/bitmanip-insns-pseudo-noalias-64.d b/gas/testsuite/gas/riscv/bitmanip-insns-pseudo-noalias-64.d
  318. new file mode 100644
  319. index 0000000000..abdbbcaed5
  320. --- /dev/null
  321. +++ b/gas/testsuite/gas/riscv/bitmanip-insns-pseudo-noalias-64.d
  322. @@ -0,0 +1,82 @@
  323. +#as: -march=rv64ib -defsym __64_bit__=1
  324. +#source: bitmanip-insns-pseudo.s
  325. +#objdump: -dr -Mno-aliases
  326. +
  327. +.*:[ ]+file format .*
  328. +
  329. +
  330. +Disassembly of section .text:
  331. +
  332. +0+000 <.text>:
  333. +[ ]+[0-9a-f]+:[ ]+6815d513[ ]+grevi[ ]+a0,a1,0x1
  334. +[ ]+[0-9a-f]+:[ ]+6825d513[ ]+grevi[ ]+a0,a1,0x2
  335. +[ ]+[0-9a-f]+:[ ]+6835d513[ ]+grevi[ ]+a0,a1,0x3
  336. +[ ]+[0-9a-f]+:[ ]+6845d513[ ]+grevi[ ]+a0,a1,0x4
  337. +[ ]+[0-9a-f]+:[ ]+6865d513[ ]+grevi[ ]+a0,a1,0x6
  338. +[ ]+[0-9a-f]+:[ ]+6875d513[ ]+grevi[ ]+a0,a1,0x7
  339. +[ ]+[0-9a-f]+:[ ]+6885d513[ ]+grevi[ ]+a0,a1,0x8
  340. +[ ]+[0-9a-f]+:[ ]+68c5d513[ ]+grevi[ ]+a0,a1,0xc
  341. +[ ]+[0-9a-f]+:[ ]+68e5d513[ ]+grevi[ ]+a0,a1,0xe
  342. +[ ]+[0-9a-f]+:[ ]+68f5d513[ ]+grevi[ ]+a0,a1,0xf
  343. +[ ]+[0-9a-f]+:[ ]+6b05d513[ ]+grevi[ ]+a0,a1,0x30
  344. +[ ]+[0-9a-f]+:[ ]+6b85d513[ ]+grevi[ ]+a0,a1,0x38
  345. +[ ]+[0-9a-f]+:[ ]+6bc5d513[ ]+grevi[ ]+a0,a1,0x3c
  346. +[ ]+[0-9a-f]+:[ ]+6be5d513[ ]+grevi[ ]+a0,a1,0x3e
  347. +[ ]+[0-9a-f]+:[ ]+6bf5d513[ ]+grevi[ ]+a0,a1,0x3f
  348. +[ ]+[0-9a-f]+:[ ]+2815d513[ ]+gorci[ ]+a0,a1,0x1
  349. +[ ]+[0-9a-f]+:[ ]+2825d513[ ]+gorci[ ]+a0,a1,0x2
  350. +[ ]+[0-9a-f]+:[ ]+2835d513[ ]+gorci[ ]+a0,a1,0x3
  351. +[ ]+[0-9a-f]+:[ ]+2845d513[ ]+gorci[ ]+a0,a1,0x4
  352. +[ ]+[0-9a-f]+:[ ]+2865d513[ ]+gorci[ ]+a0,a1,0x6
  353. +[ ]+[0-9a-f]+:[ ]+2875d513[ ]+gorci[ ]+a0,a1,0x7
  354. +[ ]+[0-9a-f]+:[ ]+2885d513[ ]+gorci[ ]+a0,a1,0x8
  355. +[ ]+[0-9a-f]+:[ ]+28c5d513[ ]+gorci[ ]+a0,a1,0xc
  356. +[ ]+[0-9a-f]+:[ ]+28e5d513[ ]+gorci[ ]+a0,a1,0xe
  357. +[ ]+[0-9a-f]+:[ ]+28f5d513[ ]+gorci[ ]+a0,a1,0xf
  358. +[ ]+[0-9a-f]+:[ ]+2b05d513[ ]+gorci[ ]+a0,a1,0x30
  359. +[ ]+[0-9a-f]+:[ ]+2b85d513[ ]+gorci[ ]+a0,a1,0x38
  360. +[ ]+[0-9a-f]+:[ ]+2bc5d513[ ]+gorci[ ]+a0,a1,0x3c
  361. +[ ]+[0-9a-f]+:[ ]+2be5d513[ ]+gorci[ ]+a0,a1,0x3e
  362. +[ ]+[0-9a-f]+:[ ]+2bf5d513[ ]+gorci[ ]+a0,a1,0x3f
  363. +[ ]+[0-9a-f]+:[ ]+08159513[ ]+shfli[ ]+a0,a1,0x1
  364. +[ ]+[0-9a-f]+:[ ]+08259513[ ]+shfli[ ]+a0,a1,0x2
  365. +[ ]+[0-9a-f]+:[ ]+08359513[ ]+shfli[ ]+a0,a1,0x3
  366. +[ ]+[0-9a-f]+:[ ]+08459513[ ]+shfli[ ]+a0,a1,0x4
  367. +[ ]+[0-9a-f]+:[ ]+08659513[ ]+shfli[ ]+a0,a1,0x6
  368. +[ ]+[0-9a-f]+:[ ]+08759513[ ]+shfli[ ]+a0,a1,0x7
  369. +[ ]+[0-9a-f]+:[ ]+09859513[ ]+shfli[ ]+a0,a1,0x18
  370. +[ ]+[0-9a-f]+:[ ]+09c59513[ ]+shfli[ ]+a0,a1,0x1c
  371. +[ ]+[0-9a-f]+:[ ]+09e59513[ ]+shfli[ ]+a0,a1,0x1e
  372. +[ ]+[0-9a-f]+:[ ]+09f59513[ ]+shfli[ ]+a0,a1,0x1f
  373. +[ ]+[0-9a-f]+:[ ]+0815d513[ ]+unshfli[ ]+a0,a1,0x1
  374. +[ ]+[0-9a-f]+:[ ]+0825d513[ ]+unshfli[ ]+a0,a1,0x2
  375. +[ ]+[0-9a-f]+:[ ]+0835d513[ ]+unshfli[ ]+a0,a1,0x3
  376. +[ ]+[0-9a-f]+:[ ]+0845d513[ ]+unshfli[ ]+a0,a1,0x4
  377. +[ ]+[0-9a-f]+:[ ]+0865d513[ ]+unshfli[ ]+a0,a1,0x6
  378. +[ ]+[0-9a-f]+:[ ]+0875d513[ ]+unshfli[ ]+a0,a1,0x7
  379. +[ ]+[0-9a-f]+:[ ]+0985d513[ ]+unshfli[ ]+a0,a1,0x18
  380. +[ ]+[0-9a-f]+:[ ]+09c5d513[ ]+unshfli[ ]+a0,a1,0x1c
  381. +[ ]+[0-9a-f]+:[ ]+09e5d513[ ]+unshfli[ ]+a0,a1,0x1e
  382. +[ ]+[0-9a-f]+:[ ]+09f5d513[ ]+unshfli[ ]+a0,a1,0x1f
  383. +[ ]+[0-9a-f]+:[ ]+6905d513[ ]+grevi[ ]+a0,a1,0x10
  384. +[ ]+[0-9a-f]+:[ ]+6985d513[ ]+grevi[ ]+a0,a1,0x18
  385. +[ ]+[0-9a-f]+:[ ]+69c5d513[ ]+grevi[ ]+a0,a1,0x1c
  386. +[ ]+[0-9a-f]+:[ ]+69e5d513[ ]+grevi[ ]+a0,a1,0x1e
  387. +[ ]+[0-9a-f]+:[ ]+69f5d513[ ]+grevi[ ]+a0,a1,0x1f
  388. +[ ]+[0-9a-f]+:[ ]+6a05d513[ ]+grevi[ ]+a0,a1,0x20
  389. +[ ]+[0-9a-f]+:[ ]+2905d513[ ]+gorci[ ]+a0,a1,0x10
  390. +[ ]+[0-9a-f]+:[ ]+2985d513[ ]+gorci[ ]+a0,a1,0x18
  391. +[ ]+[0-9a-f]+:[ ]+29c5d513[ ]+gorci[ ]+a0,a1,0x1c
  392. +[ ]+[0-9a-f]+:[ ]+29e5d513[ ]+gorci[ ]+a0,a1,0x1e
  393. +[ ]+[0-9a-f]+:[ ]+29f5d513[ ]+gorci[ ]+a0,a1,0x1f
  394. +[ ]+[0-9a-f]+:[ ]+2a05d513[ ]+gorci[ ]+a0,a1,0x20
  395. +[ ]+[0-9a-f]+:[ ]+08859513[ ]+shfli[ ]+a0,a1,0x8
  396. +[ ]+[0-9a-f]+:[ ]+08c59513[ ]+shfli[ ]+a0,a1,0xc
  397. +[ ]+[0-9a-f]+:[ ]+08e59513[ ]+shfli[ ]+a0,a1,0xe
  398. +[ ]+[0-9a-f]+:[ ]+08f59513[ ]+shfli[ ]+a0,a1,0xf
  399. +[ ]+[0-9a-f]+:[ ]+09059513[ ]+shfli[ ]+a0,a1,0x10
  400. +[ ]+[0-9a-f]+:[ ]+0885d513[ ]+unshfli[ ]+a0,a1,0x8
  401. +[ ]+[0-9a-f]+:[ ]+08c5d513[ ]+unshfli[ ]+a0,a1,0xc
  402. +[ ]+[0-9a-f]+:[ ]+08e5d513[ ]+unshfli[ ]+a0,a1,0xe
  403. +[ ]+[0-9a-f]+:[ ]+08f5d513[ ]+unshfli[ ]+a0,a1,0xf
  404. +[ ]+[0-9a-f]+:[ ]+0905d513[ ]+unshfli[ ]+a0,a1,0x10
  405. diff --git a/gas/testsuite/gas/riscv/bitmanip-insns-pseudo.s b/gas/testsuite/gas/riscv/bitmanip-insns-pseudo.s
  406. new file mode 100644
  407. index 0000000000..37adb96a77
  408. --- /dev/null
  409. +++ b/gas/testsuite/gas/riscv/bitmanip-insns-pseudo.s
  410. @@ -0,0 +1,81 @@
  411. + rev.p a0, a1
  412. + rev2.n a0, a1
  413. + rev.n a0, a1
  414. + rev4.b a0, a1
  415. + rev2.b a0, a1
  416. + rev.b a0, a1
  417. + rev8.h a0, a1
  418. + rev4.h a0, a1
  419. + rev2.h a0, a1
  420. + rev.h a0, a1
  421. + rev16 a0, a1
  422. + rev8 a0, a1
  423. + rev4 a0, a1
  424. + rev2 a0, a1
  425. + rev a0, a1
  426. +
  427. + orc.p a0, a1
  428. + orc2.n a0, a1
  429. + orc.n a0, a1
  430. + orc4.b a0, a1
  431. + orc2.b a0, a1
  432. + orc.b a0, a1
  433. + orc8.h a0, a1
  434. + orc4.h a0, a1
  435. + orc2.h a0, a1
  436. + orc.h a0, a1
  437. + orc16 a0, a1
  438. + orc8 a0, a1
  439. + orc4 a0, a1
  440. + orc2 a0, a1
  441. + orc a0, a1
  442. +
  443. + zip.n a0, a1
  444. + zip2.b a0, a1
  445. + zip.b a0, a1
  446. + zip4.h a0, a1
  447. + zip2.h a0, a1
  448. + zip.h a0, a1
  449. + zip8 a0, a1
  450. + zip4 a0, a1
  451. + zip2 a0, a1
  452. + zip a0, a1
  453. +
  454. + unzip.n a0, a1
  455. + unzip2.b a0, a1
  456. + unzip.b a0, a1
  457. + unzip4.h a0, a1
  458. + unzip2.h a0, a1
  459. + unzip.h a0, a1
  460. + unzip8 a0, a1
  461. + unzip4 a0, a1
  462. + unzip2 a0, a1
  463. + unzip a0, a1
  464. +
  465. +.ifdef __64_bit__
  466. + rev16.w a0, a1
  467. + rev8.w a0, a1
  468. + rev4.w a0, a1
  469. + rev2.w a0, a1
  470. + rev.w a0, a1
  471. + rev32 a0, a1
  472. +
  473. + orc16.w a0, a1
  474. + orc8.w a0, a1
  475. + orc4.w a0, a1
  476. + orc2.w a0, a1
  477. + orc.w a0, a1
  478. + orc32 a0, a1
  479. +
  480. + zip8.w a0, a1
  481. + zip4.w a0, a1
  482. + zip2.w a0, a1
  483. + zip.w a0, a1
  484. + zip16 a0, a1
  485. +
  486. + unzip8.w a0, a1
  487. + unzip4.w a0, a1
  488. + unzip2.w a0, a1
  489. + unzip.w a0, a1
  490. + unzip16 a0, a1
  491. +.endif
  492. diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h
  493. index a23a2a8002..9af4f6514c 100644
  494. --- a/include/opcode/riscv.h
  495. +++ b/include/opcode/riscv.h
  496. @@ -583,7 +583,6 @@ enum
  497. M_VMSGEU,
  498. M_RL,
  499. M_FL,
  500. - M_PERM,
  501. M_NUM_MACROS
  502. };
  503. diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
  504. index 86cfcabec9..5d49912e2e 100644
  505. --- a/opcodes/riscv-opc.c
  506. +++ b/opcodes/riscv-opc.c
  507. @@ -69,6 +69,51 @@ const char * const riscv_vecm_names_numeric[NVECM] =
  508. "v0.t"
  509. };
  510. +/* The MATCH/MASK immediate macros for rvb pseudo instructions. */
  511. +
  512. +#define MASK_RVB_IMM (OP_MASK_SHAMT << OP_SH_SHAMT)
  513. +
  514. +#define ENCODE_PERM_IMM(xlen, prefix, suffix) \
  515. + (ENCODE_ITYPE_IMM ((((xlen) - 1) & (((xlen) - 1) << (prefix)) & (suffix))))
  516. +
  517. +#define MATCH_PERM_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 0, -1))
  518. +#define MATCH_PERM2_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 1, -1))
  519. +#define MATCH_PERM4_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 2, -1))
  520. +#define MATCH_PERM8_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 3, -1))
  521. +#define MATCH_PERM16_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 4, -1))
  522. +#define MATCH_PERM32_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 5, -1))
  523. +#define MATCH_PERMP_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 0, 0x1))
  524. +#define MATCH_PERMN_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 0, 0x3))
  525. +#define MATCH_PERMB_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 0, 0x7))
  526. +#define MATCH_PERMH_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 0, 0xf))
  527. +#define MATCH_PERMW_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 0, 0x1f))
  528. +#define MATCH_PERM2N_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 1, 0x3))
  529. +#define MATCH_PERM2B_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 1, 0x7))
  530. +#define MATCH_PERM4B_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 2, 0x7))
  531. +#define MATCH_PERM2H_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 1, 0xf))
  532. +#define MATCH_PERM4H_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 2, 0xf))
  533. +#define MATCH_PERM8H_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 3, 0xf))
  534. +#define MATCH_PERM2W_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 1, 0x1f))
  535. +#define MATCH_PERM4W_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 2, 0x1f))
  536. +#define MATCH_PERM8W_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 3, 0x1f))
  537. +#define MATCH_PERM16W_IMM(xlen) (ENCODE_PERM_IMM ((xlen), 4, 0x1f))
  538. +
  539. +#define MATCH_PERM_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 0, -1))
  540. +#define MATCH_PERM2_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 1, -1))
  541. +#define MATCH_PERM4_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 2, -1))
  542. +#define MATCH_PERM8_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 3, -1))
  543. +#define MATCH_PERM16_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 4, -1))
  544. +#define MATCH_PERMN_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 0, 0x1))
  545. +#define MATCH_PERMB_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 0, 0x3))
  546. +#define MATCH_PERMH_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 0, 0x7))
  547. +#define MATCH_PERMW_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 0, 0xf))
  548. +#define MATCH_PERM2B_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 1, 0x3))
  549. +#define MATCH_PERM2H_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 1, 0x7))
  550. +#define MATCH_PERM4H_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 2, 0x7))
  551. +#define MATCH_PERM2W_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 1, 0xf))
  552. +#define MATCH_PERM4W_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 2, 0xf))
  553. +#define MATCH_PERM8W_SHFL_IMM(xlen) (ENCODE_PERM_IMM ((xlen/2), 3, 0xf))
  554. +
  555. /* The order of overloaded instructions matters. Label arguments and
  556. register arguments look the same. Instructions that can have either
  557. for arguments must apear in the correct order in this table for the
  558. @@ -984,6 +1029,133 @@ const struct riscv_opcode riscv_opcodes[] =
  559. {"fcvt.h.lu", 64, INSN_CLASS_F_AND_ZFH, "D,s", MATCH_FCVT_H_LU | MASK_RM, MASK_FCVT_H_L | MASK_RM, match_opcode, 0 },
  560. {"fcvt.h.lu", 64, INSN_CLASS_F_AND_ZFH, "D,s,m", MATCH_FCVT_H_LU, MASK_FCVT_H_LU, match_opcode, 0 },
  561. +/* Bitmanip pseudo-instructions. */
  562. +{"rev.p", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERMP_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  563. +{"rev.p", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERMP_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  564. +{"rev2.n", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM2N_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  565. +{"rev2.n", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM2N_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  566. +{"rev.n", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERMN_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  567. +{"rev.n", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERMN_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  568. +{"rev4.b", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM4B_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  569. +{"rev4.b", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM4B_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  570. +{"rev2.b", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM2B_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  571. +{"rev2.b", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM2B_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  572. +{"rev.b", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERMB_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  573. +{"rev.b", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERMB_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  574. +{"rev8.h", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM8H_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  575. +{"rev8.h", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM8H_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  576. +{"rev4.h", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM4H_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  577. +{"rev4.h", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM4H_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  578. +{"rev2.h", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM2H_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  579. +{"rev2.h", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM2H_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  580. +{"rev.h", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERMH_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  581. +{"rev.h", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERMH_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  582. +{"rev16", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM16_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  583. +{"rev16", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM16_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  584. +{"rev8", 32, INSN_CLASS_B_OR_ZBB, "d,s", MATCH_GREVI | MATCH_PERM8_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  585. +{"rev8", 64, INSN_CLASS_B_OR_ZBB, "d,s", MATCH_GREVI | MATCH_PERM8_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  586. +{"rev4", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM4_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  587. +{"rev4", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM4_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  588. +{"rev2", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM2_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  589. +{"rev2", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM2_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  590. +{"rev", 32, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM_IMM (32), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  591. +{"rev", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  592. +{"rev16.w", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM16W_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  593. +{"rev8.w", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM8W_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  594. +{"rev4.w", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM4W_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  595. +{"rev2.w", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM2W_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  596. +{"rev.w", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERMW_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  597. +{"rev32", 64, INSN_CLASS_B, "d,s", MATCH_GREVI | MATCH_PERM32_IMM (64), MASK_GREVI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  598. +
  599. +{"orc.p", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERMP_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  600. +{"orc.p", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERMP_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  601. +{"orc2.n", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM2N_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  602. +{"orc2.n", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM2N_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  603. +{"orc.n", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERMN_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  604. +{"orc.n", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERMN_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  605. +{"orc4.b", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM4B_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  606. +{"orc4.b", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM4B_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  607. +{"orc2.b", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM2B_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  608. +{"orc2.b", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM2B_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  609. +{"orc.b", 32, INSN_CLASS_B_OR_ZBB, "d,s", MATCH_GORCI | MATCH_PERMB_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  610. +{"orc.b", 64, INSN_CLASS_B_OR_ZBB, "d,s", MATCH_GORCI | MATCH_PERMB_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  611. +{"orc8.h", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM8H_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  612. +{"orc8.h", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM8H_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  613. +{"orc4.h", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM4H_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  614. +{"orc4.h", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM4H_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  615. +{"orc2.h", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM2H_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  616. +{"orc2.h", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM2H_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  617. +{"orc.h", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERMH_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  618. +{"orc.h", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERMH_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  619. +{"orc16", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM16_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  620. +{"orc16", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM16_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  621. +{"orc8", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM8_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  622. +{"orc8", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM8_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  623. +{"orc4", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM4_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  624. +{"orc4", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM4_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  625. +{"orc2", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM2_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  626. +{"orc2", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM2_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  627. +{"orc", 32, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM_IMM (32), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  628. +{"orc", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  629. +{"orc16.w", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM16W_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  630. +{"orc8.w", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM8W_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  631. +{"orc4.w", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM4W_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  632. +{"orc2.w", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM2W_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  633. +{"orc.w", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERMW_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  634. +{"orc32", 64, INSN_CLASS_B, "d,s", MATCH_GORCI | MATCH_PERM32_IMM (64), MASK_GORCI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  635. +
  636. +{"zip.n", 32, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERMN_SHFL_IMM (32), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  637. +{"zip.n", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERMN_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  638. +{"zip2.b", 32, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM2B_SHFL_IMM (32), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  639. +{"zip2.b", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM2B_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  640. +{"zip.b", 32, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERMB_SHFL_IMM (32), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  641. +{"zip.b", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERMB_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  642. +{"zip4.h", 32, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM4H_SHFL_IMM (32), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  643. +{"zip4.h", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM4H_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  644. +{"zip2.h", 32, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM2H_SHFL_IMM (32), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  645. +{"zip2.h", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM2H_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  646. +{"zip.h", 32, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERMH_SHFL_IMM (32), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  647. +{"zip.h", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERMH_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  648. +{"zip8", 32, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM8_SHFL_IMM (32), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  649. +{"zip8", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM8_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  650. +{"zip4", 32, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM4_SHFL_IMM (32), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  651. +{"zip4", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM4_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  652. +{"zip2", 32, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM2_SHFL_IMM (32), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  653. +{"zip2", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM2_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  654. +{"zip", 32, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM_SHFL_IMM (32), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  655. +{"zip", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  656. +{"zip8.w", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM8W_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  657. +{"zip4.w", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM4W_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  658. +{"zip2.w", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM2W_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  659. +{"zip.w", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERMW_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  660. +{"zip16", 64, INSN_CLASS_B, "d,s", MATCH_SHFLI | MATCH_PERM16_SHFL_IMM (64), MASK_SHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  661. +
  662. +{"unzip.n", 32, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERMN_SHFL_IMM (32), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  663. +{"unzip.n", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERMN_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  664. +{"unzip2.b", 32, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM2B_SHFL_IMM (32), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  665. +{"unzip2.b", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM2B_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  666. +{"unzip.b", 32, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERMB_SHFL_IMM (32), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  667. +{"unzip.b", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERMB_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  668. +{"unzip4.h", 32, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM4H_SHFL_IMM (32), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  669. +{"unzip4.h", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM4H_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  670. +{"unzip2.h", 32, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM2H_SHFL_IMM (32), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  671. +{"unzip2.h", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM2H_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  672. +{"unzip.h", 32, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERMH_SHFL_IMM (32), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  673. +{"unzip.h", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERMH_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  674. +{"unzip8", 32, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM8_SHFL_IMM (32), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  675. +{"unzip8", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM8_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  676. +{"unzip4", 32, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM4_SHFL_IMM (32), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  677. +{"unzip4", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM4_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  678. +{"unzip2", 32, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM2_SHFL_IMM (32), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  679. +{"unzip2", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM2_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  680. +{"unzip", 32, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM_SHFL_IMM (32), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  681. +{"unzip", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  682. +{"unzip8.w", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM8W_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  683. +{"unzip4.w", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM4W_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  684. +{"unzip2.w", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM2W_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  685. +{"unzip.w", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERMW_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  686. +{"unzip16", 64, INSN_CLASS_B, "d,s", MATCH_UNSHFLI | MATCH_PERM16_SHFL_IMM (64), MASK_UNSHFLI | MASK_RVB_IMM, match_opcode, INSN_ALIAS },
  687. +
  688. /* Bitmanip instruction subset - for sure */
  689. {"sh1add", 0, INSN_CLASS_B_OR_ZBA, "d,s,t", MATCH_SH1ADD, MASK_SH1ADD, match_opcode, 0 },
  690. {"sh2add", 0, INSN_CLASS_B_OR_ZBA, "d,s,t", MATCH_SH2ADD, MASK_SH2ADD, match_opcode, 0 },
  691. @@ -1024,8 +1196,6 @@ const struct riscv_opcode riscv_opcodes[] =
  692. {"roriw", 64, INSN_CLASS_B_OR_ZBB, "d,s,<", MATCH_RORIW, MASK_RORIW, match_opcode, 0 },
  693. {"rorw", 64, INSN_CLASS_B_OR_ZBB, "d,s,t", MATCH_RORW, MASK_RORW, match_opcode, 0 },
  694. {"rorw", 64, INSN_CLASS_B_OR_ZBB, "d,s,<", MATCH_RORIW, MASK_RORIW, match_opcode, INSN_ALIAS },
  695. -{"rev8", 0, INSN_CLASS_B_OR_ZBB, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  696. -{"orc.b", 0, INSN_CLASS_B_OR_ZBB, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  697. {"clmul", 0, INSN_CLASS_B_OR_ZBC, "d,s,t", MATCH_CLMUL, MASK_CLMUL, match_opcode, 0 },
  698. {"clmulh", 0, INSN_CLASS_B_OR_ZBC, "d,s,t", MATCH_CLMULH, MASK_CLMULH, match_opcode, 0 },
  699. @@ -1131,81 +1301,6 @@ const struct riscv_opcode riscv_opcodes[] =
  700. {"crc32.d", 64, INSN_CLASS_ZBR, "d,s", MATCH_CRC32_D, MASK_CRC32_D, match_opcode, 0 },
  701. {"crc32c.d", 64, INSN_CLASS_ZBR, "d,s", MATCH_CRC32C_D, MASK_CRC32C_D, match_opcode, 0 },
  702. -/* Bitmanip pseudo-instructions */
  703. -{"rev.p", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  704. -{"rev2.n", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  705. -{"rev.n", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  706. -{"rev4.b", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  707. -{"rev2.b", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  708. -{"rev.b", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  709. -{"rev8.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  710. -{"rev4.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  711. -{"rev2.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  712. -{"rev.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  713. -{"rev16.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  714. -{"rev8.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  715. -{"rev4.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  716. -{"rev2.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  717. -{"rev.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  718. -{"rev32", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  719. -{"rev16", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  720. -{"rev4", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  721. -{"rev2", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  722. -{"rev", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  723. -
  724. -{"orc.p", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  725. -{"orc2.n", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  726. -{"orc.n", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  727. -{"orc4.b", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  728. -{"orc2.b", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  729. -{"orc8.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  730. -{"orc4.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  731. -{"orc2.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  732. -{"orc.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  733. -{"orc16.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  734. -{"orc8.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  735. -{"orc4.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  736. -{"orc2.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  737. -{"orc.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  738. -{"orc32", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  739. -{"orc16", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  740. -{"orc8", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  741. -{"orc4", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  742. -{"orc2", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  743. -{"orc", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  744. -
  745. -{"zip.n", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  746. -{"zip2.b", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  747. -{"zip.b", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  748. -{"zip4.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  749. -{"zip2.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  750. -{"zip.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  751. -{"zip8.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  752. -{"zip4.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  753. -{"zip2.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  754. -{"zip.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  755. -{"zip16", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  756. -{"zip8", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  757. -{"zip4", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  758. -{"zip2", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  759. -{"zip", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  760. -
  761. -{"unzip.n", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  762. -{"unzip2.b", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  763. -{"unzip.b", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  764. -{"unzip4.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  765. -{"unzip2.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  766. -{"unzip.h", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  767. -{"unzip8.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  768. -{"unzip4.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  769. -{"unzip2.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  770. -{"unzip.w", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  771. -{"unzip16", 64, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  772. -{"unzip8", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  773. -{"unzip4", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  774. -{"unzip2", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  775. -{"unzip", 0, INSN_CLASS_B, "d,s", 0, (int) M_PERM, match_never, INSN_MACRO },
  776. -
  777. /* Single-precision floating-point instruction subset */
  778. {"frcsr", 0, INSN_CLASS_F, "d", MATCH_FRCSR, MASK_FRCSR, match_opcode, INSN_ALIAS },
  779. {"frsr", 0, INSN_CLASS_F, "d", MATCH_FRCSR, MASK_FRCSR, match_opcode, INSN_ALIAS },
  780. --
  781. 2.33.0