aarch64 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. checksums.yaml +7 -0
  2. data/CODE_OF_CONDUCT.md +77 -0
  3. data/Gemfile +3 -0
  4. data/LICENSE +201 -0
  5. data/README.md +77 -0
  6. data/Rakefile +168 -0
  7. data/aarch64.gemspec +21 -0
  8. data/bin/build_instructions.rb +102 -0
  9. data/lib/aarch64/instructions/adc.rb +31 -0
  10. data/lib/aarch64/instructions/adcs.rb +30 -0
  11. data/lib/aarch64/instructions/add_addsub_ext.rb +35 -0
  12. data/lib/aarch64/instructions/add_addsub_imm.rb +32 -0
  13. data/lib/aarch64/instructions/add_addsub_shift.rb +35 -0
  14. data/lib/aarch64/instructions/addg.rb +30 -0
  15. data/lib/aarch64/instructions/adds_addsub_ext.rb +35 -0
  16. data/lib/aarch64/instructions/adds_addsub_imm.rb +33 -0
  17. data/lib/aarch64/instructions/adds_addsub_shift.rb +35 -0
  18. data/lib/aarch64/instructions/adr.rb +28 -0
  19. data/lib/aarch64/instructions/adrp.rb +28 -0
  20. data/lib/aarch64/instructions/and_log_imm.rb +35 -0
  21. data/lib/aarch64/instructions/and_log_shift.rb +35 -0
  22. data/lib/aarch64/instructions/ands_log_imm.rb +35 -0
  23. data/lib/aarch64/instructions/ands_log_shift.rb +35 -0
  24. data/lib/aarch64/instructions/asrv.rb +31 -0
  25. data/lib/aarch64/instructions/autda.rb +32 -0
  26. data/lib/aarch64/instructions/autdb.rb +32 -0
  27. data/lib/aarch64/instructions/autia.rb +35 -0
  28. data/lib/aarch64/instructions/autib.rb +35 -0
  29. data/lib/aarch64/instructions/axflag.rb +18 -0
  30. data/lib/aarch64/instructions/b_cond.rb +26 -0
  31. data/lib/aarch64/instructions/b_uncond.rb +24 -0
  32. data/lib/aarch64/instructions/bc_cond.rb +26 -0
  33. data/lib/aarch64/instructions/bfm.rb +34 -0
  34. data/lib/aarch64/instructions/bic_log_shift.rb +35 -0
  35. data/lib/aarch64/instructions/bics.rb +35 -0
  36. data/lib/aarch64/instructions/bl.rb +24 -0
  37. data/lib/aarch64/instructions/blr.rb +24 -0
  38. data/lib/aarch64/instructions/blra.rb +33 -0
  39. data/lib/aarch64/instructions/br.rb +24 -0
  40. data/lib/aarch64/instructions/bra.rb +33 -0
  41. data/lib/aarch64/instructions/brk.rb +24 -0
  42. data/lib/aarch64/instructions/bti.rb +24 -0
  43. data/lib/aarch64/instructions/cas.rb +41 -0
  44. data/lib/aarch64/instructions/casb.rb +35 -0
  45. data/lib/aarch64/instructions/cash.rb +35 -0
  46. data/lib/aarch64/instructions/casp.rb +41 -0
  47. data/lib/aarch64/instructions/cbnz.rb +29 -0
  48. data/lib/aarch64/instructions/cbz.rb +29 -0
  49. data/lib/aarch64/instructions/ccmn_imm.rb +33 -0
  50. data/lib/aarch64/instructions/ccmn_reg.rb +33 -0
  51. data/lib/aarch64/instructions/ccmp_imm.rb +33 -0
  52. data/lib/aarch64/instructions/ccmp_reg.rb +33 -0
  53. data/lib/aarch64/instructions/cfinv.rb +19 -0
  54. data/lib/aarch64/instructions/clrex.rb +24 -0
  55. data/lib/aarch64/instructions/cls_int.rb +29 -0
  56. data/lib/aarch64/instructions/clz_int.rb +29 -0
  57. data/lib/aarch64/instructions/crc32.rb +35 -0
  58. data/lib/aarch64/instructions/crc32c.rb +35 -0
  59. data/lib/aarch64/instructions/csdb.rb +19 -0
  60. data/lib/aarch64/instructions/csel.rb +33 -0
  61. data/lib/aarch64/instructions/csinc.rb +33 -0
  62. data/lib/aarch64/instructions/csinv.rb +33 -0
  63. data/lib/aarch64/instructions/csneg.rb +33 -0
  64. data/lib/aarch64/instructions/dcps.rb +26 -0
  65. data/lib/aarch64/instructions/dgh.rb +19 -0
  66. data/lib/aarch64/instructions/dmb.rb +24 -0
  67. data/lib/aarch64/instructions/drps.rb +19 -0
  68. data/lib/aarch64/instructions/dsb.rb +25 -0
  69. data/lib/aarch64/instructions/eon.rb +35 -0
  70. data/lib/aarch64/instructions/eor_log_imm.rb +35 -0
  71. data/lib/aarch64/instructions/eor_log_shift.rb +35 -0
  72. data/lib/aarch64/instructions/eret.rb +19 -0
  73. data/lib/aarch64/instructions/ereta.rb +25 -0
  74. data/lib/aarch64/instructions/esb.rb +19 -0
  75. data/lib/aarch64/instructions/extr.rb +34 -0
  76. data/lib/aarch64/instructions/gmi.rb +28 -0
  77. data/lib/aarch64/instructions/hint.rb +26 -0
  78. data/lib/aarch64/instructions/hlt.rb +24 -0
  79. data/lib/aarch64/instructions/hvc.rb +24 -0
  80. data/lib/aarch64/instructions/irg.rb +28 -0
  81. data/lib/aarch64/instructions/isb.rb +24 -0
  82. data/lib/aarch64/instructions/ld64b.rb +26 -0
  83. data/lib/aarch64/instructions/ldadd.rb +41 -0
  84. data/lib/aarch64/instructions/ldaddb.rb +35 -0
  85. data/lib/aarch64/instructions/ldaddh.rb +35 -0
  86. data/lib/aarch64/instructions/ldapr.rb +29 -0
  87. data/lib/aarch64/instructions/ldaprb.rb +26 -0
  88. data/lib/aarch64/instructions/ldaprh.rb +26 -0
  89. data/lib/aarch64/instructions/ldapur_gen.rb +33 -0
  90. data/lib/aarch64/instructions/ldar.rb +29 -0
  91. data/lib/aarch64/instructions/ldaxp.rb +31 -0
  92. data/lib/aarch64/instructions/ldaxr.rb +29 -0
  93. data/lib/aarch64/instructions/ldclr.rb +41 -0
  94. data/lib/aarch64/instructions/ldclrb.rb +37 -0
  95. data/lib/aarch64/instructions/ldeor.rb +41 -0
  96. data/lib/aarch64/instructions/ldg.rb +28 -0
  97. data/lib/aarch64/instructions/ldgm.rb +26 -0
  98. data/lib/aarch64/instructions/ldlar.rb +29 -0
  99. data/lib/aarch64/instructions/ldnp_gen.rb +33 -0
  100. data/lib/aarch64/instructions/ldp_gen.rb +39 -0
  101. data/lib/aarch64/instructions/ldpsw.rb +34 -0
  102. data/lib/aarch64/instructions/ldr_imm_gen.rb +35 -0
  103. data/lib/aarch64/instructions/ldr_imm_unsigned.rb +31 -0
  104. data/lib/aarch64/instructions/ldr_lit_gen.rb +29 -0
  105. data/lib/aarch64/instructions/ldr_reg_gen.rb +35 -0
  106. data/lib/aarch64/instructions/ldra.rb +37 -0
  107. data/lib/aarch64/instructions/ldrb_imm.rb +32 -0
  108. data/lib/aarch64/instructions/ldrb_reg.rb +33 -0
  109. data/lib/aarch64/instructions/ldrb_unsigned.rb +28 -0
  110. data/lib/aarch64/instructions/ldrh_imm.rb +32 -0
  111. data/lib/aarch64/instructions/ldrh_reg.rb +32 -0
  112. data/lib/aarch64/instructions/ldrh_unsigned.rb +28 -0
  113. data/lib/aarch64/instructions/ldrsb_imm.rb +37 -0
  114. data/lib/aarch64/instructions/ldrsb_reg.rb +37 -0
  115. data/lib/aarch64/instructions/ldrsb_unsigned.rb +35 -0
  116. data/lib/aarch64/instructions/ldrsh_imm.rb +37 -0
  117. data/lib/aarch64/instructions/ldrsh_reg.rb +35 -0
  118. data/lib/aarch64/instructions/ldrsh_unsigned.rb +31 -0
  119. data/lib/aarch64/instructions/ldrsw_imm.rb +32 -0
  120. data/lib/aarch64/instructions/ldrsw_lit.rb +26 -0
  121. data/lib/aarch64/instructions/ldrsw_reg.rb +32 -0
  122. data/lib/aarch64/instructions/ldrsw_unsigned.rb +30 -0
  123. data/lib/aarch64/instructions/ldset.rb +41 -0
  124. data/lib/aarch64/instructions/ldsetb.rb +35 -0
  125. data/lib/aarch64/instructions/ldseth.rb +35 -0
  126. data/lib/aarch64/instructions/ldsmax.rb +41 -0
  127. data/lib/aarch64/instructions/ldsmaxb.rb +35 -0
  128. data/lib/aarch64/instructions/ldsmaxh.rb +35 -0
  129. data/lib/aarch64/instructions/ldsmin.rb +41 -0
  130. data/lib/aarch64/instructions/ldsminb.rb +35 -0
  131. data/lib/aarch64/instructions/ldsminh.rb +35 -0
  132. data/lib/aarch64/instructions/ldtr.rb +31 -0
  133. data/lib/aarch64/instructions/ldtrb.rb +28 -0
  134. data/lib/aarch64/instructions/ldtrh.rb +28 -0
  135. data/lib/aarch64/instructions/ldtrsb.rb +31 -0
  136. data/lib/aarch64/instructions/ldtrsh.rb +31 -0
  137. data/lib/aarch64/instructions/ldtrsw.rb +28 -0
  138. data/lib/aarch64/instructions/ldumax.rb +41 -0
  139. data/lib/aarch64/instructions/ldumaxb.rb +35 -0
  140. data/lib/aarch64/instructions/ldumaxh.rb +35 -0
  141. data/lib/aarch64/instructions/ldumin.rb +41 -0
  142. data/lib/aarch64/instructions/lduminb.rb +35 -0
  143. data/lib/aarch64/instructions/lduminh.rb +35 -0
  144. data/lib/aarch64/instructions/ldur_gen.rb +31 -0
  145. data/lib/aarch64/instructions/ldursb.rb +31 -0
  146. data/lib/aarch64/instructions/ldursh.rb +31 -0
  147. data/lib/aarch64/instructions/ldursw.rb +28 -0
  148. data/lib/aarch64/instructions/ldxp.rb +31 -0
  149. data/lib/aarch64/instructions/ldxr.rb +29 -0
  150. data/lib/aarch64/instructions/lslv.rb +31 -0
  151. data/lib/aarch64/instructions/lsrv.rb +31 -0
  152. data/lib/aarch64/instructions/madd.rb +33 -0
  153. data/lib/aarch64/instructions/movk.rb +31 -0
  154. data/lib/aarch64/instructions/movn.rb +31 -0
  155. data/lib/aarch64/instructions/movz.rb +31 -0
  156. data/lib/aarch64/instructions/mrs.rb +34 -0
  157. data/lib/aarch64/instructions/msr_imm.rb +28 -0
  158. data/lib/aarch64/instructions/msr_reg.rb +34 -0
  159. data/lib/aarch64/instructions/msub.rb +33 -0
  160. data/lib/aarch64/instructions/nop.rb +19 -0
  161. data/lib/aarch64/instructions/orn_log_shift.rb +35 -0
  162. data/lib/aarch64/instructions/orr_log_imm.rb +35 -0
  163. data/lib/aarch64/instructions/orr_log_shift.rb +35 -0
  164. data/lib/aarch64/instructions/pacda.rb +29 -0
  165. data/lib/aarch64/instructions/pacdb.rb +29 -0
  166. data/lib/aarch64/instructions/pacga.rb +28 -0
  167. data/lib/aarch64/instructions/pacia.rb +32 -0
  168. data/lib/aarch64/instructions/pacia2.rb +28 -0
  169. data/lib/aarch64/instructions/pacib.rb +32 -0
  170. data/lib/aarch64/instructions/prfm_imm.rb +28 -0
  171. data/lib/aarch64/instructions/prfm_lit.rb +26 -0
  172. data/lib/aarch64/instructions/prfm_reg.rb +32 -0
  173. data/lib/aarch64/instructions/prfum.rb +28 -0
  174. data/lib/aarch64/instructions/psb.rb +19 -0
  175. data/lib/aarch64/instructions/rbit_int.rb +29 -0
  176. data/lib/aarch64/instructions/ret.rb +24 -0
  177. data/lib/aarch64/instructions/reta.rb +25 -0
  178. data/lib/aarch64/instructions/rev.rb +31 -0
  179. data/lib/aarch64/instructions/rmif.rb +28 -0
  180. data/lib/aarch64/instructions/rorv.rb +31 -0
  181. data/lib/aarch64/instructions/sb.rb +19 -0
  182. data/lib/aarch64/instructions/sbc.rb +31 -0
  183. data/lib/aarch64/instructions/sbcs.rb +31 -0
  184. data/lib/aarch64/instructions/sbfm.rb +34 -0
  185. data/lib/aarch64/instructions/sdiv.rb +31 -0
  186. data/lib/aarch64/instructions/setf.rb +27 -0
  187. data/lib/aarch64/instructions/setgp.rb +25 -0
  188. data/lib/aarch64/instructions/setgpn.rb +25 -0
  189. data/lib/aarch64/instructions/setgpt.rb +25 -0
  190. data/lib/aarch64/instructions/setgptn.rb +25 -0
  191. data/lib/aarch64/instructions/setp.rb +25 -0
  192. data/lib/aarch64/instructions/setpn.rb +25 -0
  193. data/lib/aarch64/instructions/setpt.rb +25 -0
  194. data/lib/aarch64/instructions/setptn.rb +25 -0
  195. data/lib/aarch64/instructions/sev.rb +18 -0
  196. data/lib/aarch64/instructions/sevl.rb +18 -0
  197. data/lib/aarch64/instructions/smaddl.rb +30 -0
  198. data/lib/aarch64/instructions/smc.rb +24 -0
  199. data/lib/aarch64/instructions/smsubl.rb +30 -0
  200. data/lib/aarch64/instructions/smulh.rb +28 -0
  201. data/lib/aarch64/instructions/st2g.rb +32 -0
  202. data/lib/aarch64/instructions/st64b.rb +26 -0
  203. data/lib/aarch64/instructions/st64bv.rb +28 -0
  204. data/lib/aarch64/instructions/st64bv0.rb +28 -0
  205. data/lib/aarch64/instructions/stg.rb +32 -0
  206. data/lib/aarch64/instructions/stgm.rb +26 -0
  207. data/lib/aarch64/instructions/stgp.rb +34 -0
  208. data/lib/aarch64/instructions/stllr.rb +29 -0
  209. data/lib/aarch64/instructions/stllrb.rb +26 -0
  210. data/lib/aarch64/instructions/stllrh.rb +26 -0
  211. data/lib/aarch64/instructions/stlr.rb +29 -0
  212. data/lib/aarch64/instructions/stlrb.rb +26 -0
  213. data/lib/aarch64/instructions/stlrh.rb +26 -0
  214. data/lib/aarch64/instructions/stlur_gen.rb +31 -0
  215. data/lib/aarch64/instructions/stlxp.rb +33 -0
  216. data/lib/aarch64/instructions/stlxr.rb +31 -0
  217. data/lib/aarch64/instructions/stlxrb.rb +28 -0
  218. data/lib/aarch64/instructions/stlxrh.rb +28 -0
  219. data/lib/aarch64/instructions/stnp_gen.rb +33 -0
  220. data/lib/aarch64/instructions/stp_gen.rb +39 -0
  221. data/lib/aarch64/instructions/str_imm_gen.rb +37 -0
  222. data/lib/aarch64/instructions/str_imm_unsigned.rb +31 -0
  223. data/lib/aarch64/instructions/str_reg_gen.rb +35 -0
  224. data/lib/aarch64/instructions/strb_imm.rb +32 -0
  225. data/lib/aarch64/instructions/strb_imm_unsigned.rb +28 -0
  226. data/lib/aarch64/instructions/strb_reg.rb +33 -0
  227. data/lib/aarch64/instructions/strh_imm.rb +32 -0
  228. data/lib/aarch64/instructions/strh_imm_unsigned.rb +28 -0
  229. data/lib/aarch64/instructions/strh_reg.rb +32 -0
  230. data/lib/aarch64/instructions/sttr.rb +31 -0
  231. data/lib/aarch64/instructions/stur_gen.rb +31 -0
  232. data/lib/aarch64/instructions/stxp.rb +33 -0
  233. data/lib/aarch64/instructions/stxr.rb +31 -0
  234. data/lib/aarch64/instructions/stxrb.rb +28 -0
  235. data/lib/aarch64/instructions/stxrh.rb +28 -0
  236. data/lib/aarch64/instructions/stz2g.rb +32 -0
  237. data/lib/aarch64/instructions/stzg.rb +32 -0
  238. data/lib/aarch64/instructions/stzgm.rb +26 -0
  239. data/lib/aarch64/instructions/sub_addsub_ext.rb +35 -0
  240. data/lib/aarch64/instructions/sub_addsub_imm.rb +33 -0
  241. data/lib/aarch64/instructions/sub_addsub_shift.rb +35 -0
  242. data/lib/aarch64/instructions/subg.rb +30 -0
  243. data/lib/aarch64/instructions/subp.rb +28 -0
  244. data/lib/aarch64/instructions/subps.rb +28 -0
  245. data/lib/aarch64/instructions/subs_addsub_ext.rb +35 -0
  246. data/lib/aarch64/instructions/subs_addsub_imm.rb +33 -0
  247. data/lib/aarch64/instructions/subs_addsub_shift.rb +35 -0
  248. data/lib/aarch64/instructions/svc.rb +24 -0
  249. data/lib/aarch64/instructions/swp.rb +41 -0
  250. data/lib/aarch64/instructions/swpb.rb +35 -0
  251. data/lib/aarch64/instructions/swph.rb +35 -0
  252. data/lib/aarch64/instructions/sys.rb +32 -0
  253. data/lib/aarch64/instructions/sysl.rb +32 -0
  254. data/lib/aarch64/instructions/tbnz.rb +30 -0
  255. data/lib/aarch64/instructions/tbz.rb +30 -0
  256. data/lib/aarch64/instructions/tsb.rb +18 -0
  257. data/lib/aarch64/instructions/ubfm.rb +34 -0
  258. data/lib/aarch64/instructions/udf_perm_undef.rb +24 -0
  259. data/lib/aarch64/instructions/udiv.rb +31 -0
  260. data/lib/aarch64/instructions/umaddl.rb +30 -0
  261. data/lib/aarch64/instructions/umsubl.rb +30 -0
  262. data/lib/aarch64/instructions/umulh.rb +28 -0
  263. data/lib/aarch64/instructions/wfe.rb +19 -0
  264. data/lib/aarch64/instructions/wfet.rb +24 -0
  265. data/lib/aarch64/instructions/wfi.rb +19 -0
  266. data/lib/aarch64/instructions/wfit.rb +24 -0
  267. data/lib/aarch64/instructions/xaflag.rb +19 -0
  268. data/lib/aarch64/instructions/xpac.rb +28 -0
  269. data/lib/aarch64/instructions/xpaclri.rb +18 -0
  270. data/lib/aarch64/instructions/yield.rb +19 -0
  271. data/lib/aarch64/instructions.rb +266 -0
  272. data/lib/aarch64/system_registers/mrs_msr_64.rb +395 -0
  273. data/lib/aarch64/utils.rb +325 -0
  274. data/lib/aarch64/version.rb +3 -0
  275. data/lib/aarch64.rb +2857 -0
  276. data/test/all_adds_test.rb +129 -0
  277. data/test/base_instructions_test.rb +9263 -0
  278. data/test/dsl_test.rb +11 -0
  279. data/test/helper.rb +51 -0
  280. data/test/not_supported_yet_test.rb +55 -0
  281. metadata +382 -0
@@ -0,0 +1,26 @@
1
+ module AArch64
2
+ module Instructions
3
+ # B.cond -- A64
4
+ # Branch conditionally
5
+ # B.<cond> <label>
6
+ class B_cond
7
+ def initialize cond, label
8
+ @cond = cond
9
+ @label = label
10
+ end
11
+
12
+ def encode
13
+ B_cond(@label.to_i / 4, Utils.cond2bin(@cond))
14
+ end
15
+
16
+ private
17
+
18
+ def B_cond imm19, cond
19
+ insn = 0b0101010_0_0000000000000000000_0_0000
20
+ insn |= ((imm19 & 0x7ffff) << 5)
21
+ insn |= (cond & 0xf)
22
+ insn
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ module AArch64
2
+ module Instructions
3
+ # B -- A64
4
+ # Branch
5
+ # B <label>
6
+ class B_uncond
7
+ def initialize label
8
+ @label = label
9
+ end
10
+
11
+ def encode
12
+ B_uncond(@label.to_i / 4)
13
+ end
14
+
15
+ private
16
+
17
+ def B_uncond imm26
18
+ insn = 0b0_00101_00000000000000000000000000
19
+ insn |= (imm26 & 0x3ffffff)
20
+ insn
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,26 @@
1
+ module AArch64
2
+ module Instructions
3
+ # BC.cond -- A64
4
+ # Branch Consistent conditionally
5
+ # BC.<cond> <label>
6
+ class BC_cond
7
+ def initialize cond, label
8
+ @cond = cond
9
+ @label = label
10
+ end
11
+
12
+ def encode
13
+ BC_cond(@label.to_i / 4, Utils.cond2bin(@cond))
14
+ end
15
+
16
+ private
17
+
18
+ def BC_cond imm19, cond
19
+ insn = 0b0101010_0_0000000000000000000_1_0000
20
+ insn |= ((imm19 & 0x7ffff) << 5)
21
+ insn |= (cond & 0xf)
22
+ insn
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,34 @@
1
+ module AArch64
2
+ module Instructions
3
+ # BFM -- A64
4
+ # Bitfield Move
5
+ # BFM <Wd>, <Wn>, #<immr>, #<imms>
6
+ # BFM <Xd>, <Xn>, #<immr>, #<imms>
7
+ class BFM
8
+ def initialize d, n, immr, imms, sf
9
+ @d = d
10
+ @n = n
11
+ @immr = immr
12
+ @imms = imms
13
+ @sf = sf
14
+ end
15
+
16
+ def encode
17
+ BFM(@sf, @sf, @immr, @imms, @n.to_i, @d.to_i)
18
+ end
19
+
20
+ private
21
+
22
+ def BFM sf, n, immr, imms, rn, rd
23
+ insn = 0b0_01_100110_0_000000_000000_00000_00000
24
+ insn |= ((sf & 0x1) << 31)
25
+ insn |= ((n & 0x1) << 22)
26
+ insn |= ((immr & 0x3f) << 16)
27
+ insn |= ((imms & 0x3f) << 10)
28
+ insn |= ((rn & 0x1f) << 5)
29
+ insn |= (rd & 0x1f)
30
+ insn
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,35 @@
1
+ module AArch64
2
+ module Instructions
3
+ # BIC (shifted register) -- A64
4
+ # Bitwise Bit Clear (shifted register)
5
+ # BIC <Wd>, <Wn>, <Wm>{, <shift> #<amount>}
6
+ # BIC <Xd>, <Xn>, <Xm>{, <shift> #<amount>}
7
+ class BIC_log_shift
8
+ def initialize d, n, m, shift, amount, sf
9
+ @d = d
10
+ @n = n
11
+ @m = m
12
+ @shift = shift
13
+ @amount = amount
14
+ @sf = sf
15
+ end
16
+
17
+ def encode
18
+ BIC_log_shift(@sf, @shift, @m.to_i, @amount, @n.to_i, @d.to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def BIC_log_shift sf, shift, rm, imm6, rn, rd
24
+ insn = 0b0_00_01010_00_1_00000_000000_00000_00000
25
+ insn |= ((sf & 0x1) << 31)
26
+ insn |= ((shift & 0x3) << 22)
27
+ insn |= ((rm & 0x1f) << 16)
28
+ insn |= ((imm6 & 0x3f) << 10)
29
+ insn |= ((rn & 0x1f) << 5)
30
+ insn |= (rd & 0x1f)
31
+ insn
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,35 @@
1
+ module AArch64
2
+ module Instructions
3
+ # BICS (shifted register) -- A64
4
+ # Bitwise Bit Clear (shifted register), setting flags
5
+ # BICS <Wd>, <Wn>, <Wm>{, <shift> #<amount>}
6
+ # BICS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}
7
+ class BICS
8
+ def initialize d, n, m, shift, amount, sf
9
+ @d = d
10
+ @n = n
11
+ @m = m
12
+ @shift = shift
13
+ @amount = amount
14
+ @sf = sf
15
+ end
16
+
17
+ def encode
18
+ BICS(@sf, @shift, @m.to_i, @amount, @n.to_i, @d.to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def BICS sf, shift, rm, imm6, rn, rd
24
+ insn = 0b0_11_01010_00_1_00000_000000_00000_00000
25
+ insn |= ((sf & 0x1) << 31)
26
+ insn |= ((shift & 0x3) << 22)
27
+ insn |= ((rm & 0x1f) << 16)
28
+ insn |= ((imm6 & 0x3f) << 10)
29
+ insn |= ((rn & 0x1f) << 5)
30
+ insn |= (rd & 0x1f)
31
+ insn
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,24 @@
1
+ module AArch64
2
+ module Instructions
3
+ # BL -- A64
4
+ # Branch with Link
5
+ # BL <label>
6
+ class BL
7
+ def initialize label
8
+ @label = label
9
+ end
10
+
11
+ def encode
12
+ BL(@label.to_i / 4)
13
+ end
14
+
15
+ private
16
+
17
+ def BL imm26
18
+ insn = 0b1_00101_00000000000000000000000000
19
+ insn |= (imm26 & 0x3ffffff)
20
+ insn
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module AArch64
2
+ module Instructions
3
+ # BLR -- A64
4
+ # Branch with Link to Register
5
+ # BLR <Xn>
6
+ class BLR
7
+ def initialize n
8
+ @n = n
9
+ end
10
+
11
+ def encode
12
+ BLR(@n.to_i)
13
+ end
14
+
15
+ private
16
+
17
+ def BLR rn
18
+ insn = 0b1101011_0_0_01_11111_0000_0_0_00000_00000
19
+ insn |= ((rn & 0x1f) << 5)
20
+ insn
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ module AArch64
2
+ module Instructions
3
+ # BLRAA, BLRAAZ, BLRAB, BLRABZ -- A64
4
+ # Branch with Link to Register, with pointer authentication
5
+ # BLRAAZ <Xn>
6
+ # BLRAA <Xn>, <Xm|SP>
7
+ # BLRABZ <Xn>
8
+ # BLRAB <Xn>, <Xm|SP>
9
+ class BLRA
10
+ def initialize rn, rm, z, m
11
+ @rn = rn
12
+ @rm = rm
13
+ @z = z
14
+ @m = m
15
+ end
16
+
17
+ def encode
18
+ BLRA(@z, @m, @rn.to_i, @rm.to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def BLRA z, m, rn, rm
24
+ insn = 0b1101011_0_0_01_11111_0000_1_0_00000_00000
25
+ insn |= ((z & 0x1) << 24)
26
+ insn |= ((m & 0x1) << 10)
27
+ insn |= ((rn & 0x1f) << 5)
28
+ insn |= (rm & 0x1f)
29
+ insn
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,24 @@
1
+ module AArch64
2
+ module Instructions
3
+ # BR -- A64
4
+ # Branch to Register
5
+ # BR <Xn>
6
+ class BR
7
+ def initialize rn
8
+ @rn = rn
9
+ end
10
+
11
+ def encode
12
+ BR(@rn.to_i)
13
+ end
14
+
15
+ private
16
+
17
+ def BR rn
18
+ insn = 0b1101011_0_0_00_11111_0000_0_0_00000_00000
19
+ insn |= ((rn & 0x1f) << 5)
20
+ insn
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ module AArch64
2
+ module Instructions
3
+ # BRAA, BRAAZ, BRAB, BRABZ -- A64
4
+ # Branch to Register, with pointer authentication
5
+ # BRAAZ <Xn>
6
+ # BRAA <Xn>, <Xm|SP>
7
+ # BRABZ <Xn>
8
+ # BRAB <Xn>, <Xm|SP>
9
+ class BRA
10
+ def initialize rn, rm, z, m
11
+ @rn = rn
12
+ @rm = rm
13
+ @z = z
14
+ @m = m
15
+ end
16
+
17
+ def encode
18
+ BRA(@z, @m, @rn.to_i, @rm.to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def BRA z, m, rn, rm
24
+ insn = 0b1101011_0_0_00_11111_0000_1_0_00000_00000
25
+ insn |= ((z & 0x1) << 24)
26
+ insn |= ((m & 0x1) << 10)
27
+ insn |= ((rn & 0x1f) << 5)
28
+ insn |= (rm & 0x1f)
29
+ insn
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,24 @@
1
+ module AArch64
2
+ module Instructions
3
+ # BRK -- A64
4
+ # Breakpoint instruction
5
+ # BRK #<imm>
6
+ class BRK
7
+ def initialize imm
8
+ @imm = imm
9
+ end
10
+
11
+ def encode
12
+ BRK(@imm)
13
+ end
14
+
15
+ private
16
+
17
+ def BRK imm16
18
+ insn = 0b11010100_001_0000000000000000_000_00
19
+ insn |= ((imm16 & 0xffff) << 5)
20
+ insn
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module AArch64
2
+ module Instructions
3
+ # BTI -- A64
4
+ # Branch Target Identification
5
+ # BTI {<targets>}
6
+ class BTI
7
+ def initialize target
8
+ @target = target
9
+ end
10
+
11
+ def encode
12
+ BTI(@target)
13
+ end
14
+
15
+ private
16
+
17
+ def BTI target
18
+ insn = 0b1101010100_0_00_011_0010_0100_000_11111
19
+ insn |= ((target & 0x3) << 5)
20
+ insn
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,41 @@
1
+ module AArch64
2
+ module Instructions
3
+ # CAS, CASA, CASAL, CASL -- A64
4
+ # Compare and Swap word or doubleword in memory
5
+ # CAS <Ws>, <Wt>, [<Xn|SP>{,#0}]
6
+ # CASA <Ws>, <Wt>, [<Xn|SP>{,#0}]
7
+ # CASAL <Ws>, <Wt>, [<Xn|SP>{,#0}]
8
+ # CASL <Ws>, <Wt>, [<Xn|SP>{,#0}]
9
+ # CAS <Xs>, <Xt>, [<Xn|SP>{,#0}]
10
+ # CASA <Xs>, <Xt>, [<Xn|SP>{,#0}]
11
+ # CASAL <Xs>, <Xt>, [<Xn|SP>{,#0}]
12
+ # CASL <Xs>, <Xt>, [<Xn|SP>{,#0}]
13
+ class CAS
14
+ def initialize s, t, n, l, o0, sf
15
+ @s = s
16
+ @t = t
17
+ @n = n
18
+ @l = l
19
+ @o0 = o0
20
+ @sf = sf
21
+ end
22
+
23
+ def encode
24
+ CAS(@sf, @l, @s.to_i, @o0, @n.to_i, @t.to_i)
25
+ end
26
+
27
+ private
28
+
29
+ def CAS x, l, rs, o0, rn, rt
30
+ insn = 0b10_0010001_0_1_00000_0_11111_00000_00000
31
+ insn |= ((x & 0x1) << 30)
32
+ insn |= ((l & 0x1) << 22)
33
+ insn |= ((rs & 0x1f) << 16)
34
+ insn |= ((o0 & 0x1) << 15)
35
+ insn |= ((rn & 0x1f) << 5)
36
+ insn |= (rt & 0x1f)
37
+ insn
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,35 @@
1
+ module AArch64
2
+ module Instructions
3
+ # CASB, CASAB, CASALB, CASLB -- A64
4
+ # Compare and Swap byte in memory
5
+ # CASAB <Ws>, <Wt>, [<Xn|SP>{,#0}]
6
+ # CASALB <Ws>, <Wt>, [<Xn|SP>{,#0}]
7
+ # CASB <Ws>, <Wt>, [<Xn|SP>{,#0}]
8
+ # CASLB <Ws>, <Wt>, [<Xn|SP>{,#0}]
9
+ class CASB
10
+ def initialize rs, rt, rn, l, o0
11
+ @rs = rs
12
+ @rt = rt
13
+ @rn = rn
14
+ @l = l
15
+ @o0 = o0
16
+ end
17
+
18
+ def encode
19
+ CASB(@l, @rs.to_i, @o0, @rn.to_i, @rt.to_i)
20
+ end
21
+
22
+ private
23
+
24
+ def CASB l, rs, o0, rn, rt
25
+ insn = 0b00_0010001_0_1_00000_0_11111_00000_00000
26
+ insn |= ((l & 0x1) << 22)
27
+ insn |= ((rs & 0x1f) << 16)
28
+ insn |= ((o0 & 0x1) << 15)
29
+ insn |= ((rn & 0x1f) << 5)
30
+ insn |= (rt & 0x1f)
31
+ insn
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,35 @@
1
+ module AArch64
2
+ module Instructions
3
+ # CASH, CASAH, CASALH, CASLH -- A64
4
+ # Compare and Swap halfword in memory
5
+ # CASAH <Ws>, <Wt>, [<Xn|SP>{,#0}]
6
+ # CASALH <Ws>, <Wt>, [<Xn|SP>{,#0}]
7
+ # CASH <Ws>, <Wt>, [<Xn|SP>{,#0}]
8
+ # CASLH <Ws>, <Wt>, [<Xn|SP>{,#0}]
9
+ class CASH
10
+ def initialize rs, rt, rn, l, o0
11
+ @rs = rs
12
+ @rt = rt
13
+ @rn = rn
14
+ @l = l
15
+ @o0 = o0
16
+ end
17
+
18
+ def encode
19
+ CASH(@l, @rs.to_i, @o0, @rn.to_i, @rt.to_i)
20
+ end
21
+
22
+ private
23
+
24
+ def CASH l, rs, o0, rn, rt
25
+ insn = 0b01_0010001_0_1_00000_0_11111_00000_00000
26
+ insn |= ((l & 0x1) << 22)
27
+ insn |= ((rs & 0x1f) << 16)
28
+ insn |= ((o0 & 0x1) << 15)
29
+ insn |= ((rn & 0x1f) << 5)
30
+ insn |= (rt & 0x1f)
31
+ insn
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,41 @@
1
+ module AArch64
2
+ module Instructions
3
+ # CASP, CASPA, CASPAL, CASPL -- A64
4
+ # Compare and Swap Pair of words or doublewords in memory
5
+ # CASP <Ws>, <W(s+1)>, <Wt>, <W(t+1)>, [<Xn|SP>{,#0}]
6
+ # CASPA <Ws>, <W(s+1)>, <Wt>, <W(t+1)>, [<Xn|SP>{,#0}]
7
+ # CASPAL <Ws>, <W(s+1)>, <Wt>, <W(t+1)>, [<Xn|SP>{,#0}]
8
+ # CASPL <Ws>, <W(s+1)>, <Wt>, <W(t+1)>, [<Xn|SP>{,#0}]
9
+ # CASP <Xs>, <X(s+1)>, <Xt>, <X(t+1)>, [<Xn|SP>{,#0}]
10
+ # CASPA <Xs>, <X(s+1)>, <Xt>, <X(t+1)>, [<Xn|SP>{,#0}]
11
+ # CASPAL <Xs>, <X(s+1)>, <Xt>, <X(t+1)>, [<Xn|SP>{,#0}]
12
+ # CASPL <Xs>, <X(s+1)>, <Xt>, <X(t+1)>, [<Xn|SP>{,#0}]
13
+ class CASP
14
+ def initialize rs, rt, rn, l, o0, sf
15
+ @rs = rs
16
+ @rt = rt
17
+ @rn = rn
18
+ @l = l
19
+ @o0 = o0
20
+ @sf = sf
21
+ end
22
+
23
+ def encode
24
+ CASP(@sf, @l, @rs.to_i, @o0, @rn.to_i, @rt.to_i)
25
+ end
26
+
27
+ private
28
+
29
+ def CASP sz, l, rs, o0, rn, rt
30
+ insn = 0b0_0_001000_0_0_1_00000_0_11111_00000_00000
31
+ insn |= ((sz & 0x1) << 30)
32
+ insn |= ((l & 0x1) << 22)
33
+ insn |= ((rs & 0x1f) << 16)
34
+ insn |= ((o0 & 0x1) << 15)
35
+ insn |= ((rn & 0x1f) << 5)
36
+ insn |= (rt & 0x1f)
37
+ insn
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,29 @@
1
+ module AArch64
2
+ module Instructions
3
+ # CBNZ -- A64
4
+ # Compare and Branch on Nonzero
5
+ # CBNZ <Wt>, <label>
6
+ # CBNZ <Xt>, <label>
7
+ class CBNZ
8
+ def initialize rt, label, sf
9
+ @rt = rt
10
+ @label = label
11
+ @sf = sf
12
+ end
13
+
14
+ def encode
15
+ CBNZ(@sf, @label.to_i / 4, @rt.to_i)
16
+ end
17
+
18
+ private
19
+
20
+ def CBNZ sf, imm19, rt
21
+ insn = 0b0_011010_1_0000000000000000000_00000
22
+ insn |= ((sf & 0x1) << 31)
23
+ insn |= ((imm19 & 0x7ffff) << 5)
24
+ insn |= (rt & 0x1f)
25
+ insn
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ module AArch64
2
+ module Instructions
3
+ # CBZ -- A64
4
+ # Compare and Branch on Zero
5
+ # CBZ <Wt>, <label>
6
+ # CBZ <Xt>, <label>
7
+ class CBZ
8
+ def initialize rt, label, sf
9
+ @rt = rt
10
+ @label = label
11
+ @sf = sf
12
+ end
13
+
14
+ def encode
15
+ CBZ(@sf, @label.to_i / 4, @rt.to_i)
16
+ end
17
+
18
+ private
19
+
20
+ def CBZ sf, imm19, rt
21
+ insn = 0b0_011010_0_0000000000000000000_00000
22
+ insn |= ((sf & 0x1) << 31)
23
+ insn |= ((imm19 & 0x7ffff) << 5)
24
+ insn |= (rt & 0x1f)
25
+ insn
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,33 @@
1
+ module AArch64
2
+ module Instructions
3
+ # CCMN (immediate) -- A64
4
+ # Conditional Compare Negative (immediate)
5
+ # CCMN <Wn>, #<imm>, #<nzcv>, <cond>
6
+ # CCMN <Xn>, #<imm>, #<nzcv>, <cond>
7
+ class CCMN_imm
8
+ def initialize rn, imm, nzcv, cond, sf
9
+ @rn = rn
10
+ @imm = imm
11
+ @nzcv = nzcv
12
+ @cond = cond
13
+ @sf = sf
14
+ end
15
+
16
+ def encode
17
+ CCMN_imm(@sf, @imm, @cond, @rn.to_i, @nzcv)
18
+ end
19
+
20
+ private
21
+
22
+ def CCMN_imm sf, imm5, cond, rn, nzcv
23
+ insn = 0b0_0_1_11010010_00000_0000_1_0_00000_0_0000
24
+ insn |= ((sf & 0x1) << 31)
25
+ insn |= ((imm5 & 0x1f) << 16)
26
+ insn |= ((cond & 0xf) << 12)
27
+ insn |= ((rn & 0x1f) << 5)
28
+ insn |= (nzcv & 0xf)
29
+ insn
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ module AArch64
2
+ module Instructions
3
+ # CCMN (register) -- A64
4
+ # Conditional Compare Negative (register)
5
+ # CCMN <Wn>, <Wm>, #<nzcv>, <cond>
6
+ # CCMN <Xn>, <Xm>, #<nzcv>, <cond>
7
+ class CCMN_reg
8
+ def initialize rn, rm, nzcv, cond, sf
9
+ @rn = rn
10
+ @rm = rm
11
+ @nzcv = nzcv
12
+ @cond = cond
13
+ @sf = sf
14
+ end
15
+
16
+ def encode
17
+ CCMN_reg(@sf, @rm.to_i, @cond, @rn.to_i, @nzcv)
18
+ end
19
+
20
+ private
21
+
22
+ def CCMN_reg sf, rm, cond, rn, nzcv
23
+ insn = 0b0_0_1_11010010_00000_0000_0_0_00000_0_0000
24
+ insn |= ((sf & 0x1) << 31)
25
+ insn |= ((rm & 0x1f) << 16)
26
+ insn |= ((cond & 0xf) << 12)
27
+ insn |= ((rn & 0x1f) << 5)
28
+ insn |= (nzcv & 0xf)
29
+ insn
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ module AArch64
2
+ module Instructions
3
+ # CCMP (immediate) -- A64
4
+ # Conditional Compare (immediate)
5
+ # CCMP <Wn>, #<imm>, #<nzcv>, <cond>
6
+ # CCMP <Xn>, #<imm>, #<nzcv>, <cond>
7
+ class CCMP_imm
8
+ def initialize rn, imm, nzcv, cond, sf
9
+ @rn = rn
10
+ @imm = imm
11
+ @nzcv = nzcv
12
+ @cond = cond
13
+ @sf = sf
14
+ end
15
+
16
+ def encode
17
+ CCMP_imm(@sf, @imm, @cond, @rn.to_i, @nzcv)
18
+ end
19
+
20
+ private
21
+
22
+ def CCMP_imm sf, imm5, cond, rn, nzcv
23
+ insn = 0b0_1_1_11010010_00000_0000_1_0_00000_0_0000
24
+ insn |= ((sf & 0x1) << 31)
25
+ insn |= ((imm5 & 0x1f) << 16)
26
+ insn |= ((cond & 0xf) << 12)
27
+ insn |= ((rn & 0x1f) << 5)
28
+ insn |= (nzcv & 0xf)
29
+ insn
30
+ end
31
+ end
32
+ end
33
+ end