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,28 @@
1
+ module AArch64
2
+ module Instructions
3
+ # STRH (immediate) -- A64
4
+ # Store Register Halfword (immediate)
5
+ # STRH <Wt>, [<Xn|SP>{, #<pimm>}]
6
+ class STRH_imm_unsigned
7
+ def initialize rt, rn, imm12
8
+ @rt = rt
9
+ @rn = rn
10
+ @imm12 = imm12
11
+ end
12
+
13
+ def encode
14
+ self.STRH_imm_unsigned(@imm12, @rn.to_i, @rt.to_i)
15
+ end
16
+
17
+ private
18
+
19
+ def STRH_imm_unsigned imm12, rn, rt
20
+ insn = 0b01_111_0_01_00_0_000000000_00_00000_00000
21
+ insn |= ((imm12 & 0xfff) << 10)
22
+ insn |= ((rn & 0x1f) << 5)
23
+ insn |= (rt & 0x1f)
24
+ insn
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ module AArch64
2
+ module Instructions
3
+ # STRH (register) -- A64
4
+ # Store Register Halfword (register)
5
+ # STRH <Wt>, [<Xn|SP>, (<Wm>|<Xm>){, <extend> {<amount>}}]
6
+ class STRH_reg
7
+ def initialize rt, rn, rm, option, s
8
+ @rt = rt
9
+ @rn = rn
10
+ @rm = rm
11
+ @option = option
12
+ @s = s
13
+ end
14
+
15
+ def encode
16
+ self.STRH_reg(@rm.to_i, @option, @s, @rn.to_i, @rt.to_i)
17
+ end
18
+
19
+ private
20
+
21
+ def STRH_reg rm, option, s, rn, rt
22
+ insn = 0b01_111_0_00_00_1_00000_000_0_10_00000_00000
23
+ insn |= ((rm & 0x1f) << 16)
24
+ insn |= ((option & 0x7) << 13)
25
+ insn |= ((s & 0x1) << 12)
26
+ insn |= ((rn & 0x1f) << 5)
27
+ insn |= (rt & 0x1f)
28
+ insn
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,31 @@
1
+ module AArch64
2
+ module Instructions
3
+ # STTR -- A64
4
+ # Store Register (unprivileged)
5
+ # STTR <Wt>, [<Xn|SP>{, #<simm>}]
6
+ # STTR <Xt>, [<Xn|SP>{, #<simm>}]
7
+ class STTR
8
+ def initialize rt, rn, imm9, size
9
+ @rt = rt
10
+ @rn = rn
11
+ @imm9 = imm9
12
+ @size = size
13
+ end
14
+
15
+ def encode
16
+ self.STTR(@size, @imm9, @rn.to_i, @rt.to_i)
17
+ end
18
+
19
+ private
20
+
21
+ def STTR size, imm9, rn, rt
22
+ insn = 0b00_111_0_00_00_0_000000000_10_00000_00000
23
+ insn |= ((size & 0x3) << 30)
24
+ insn |= ((imm9 & 0x1ff) << 12)
25
+ insn |= ((rn & 0x1f) << 5)
26
+ insn |= (rt & 0x1f)
27
+ insn
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ module AArch64
2
+ module Instructions
3
+ # STUR -- A64
4
+ # Store Register (unscaled)
5
+ # STUR <Wt>, [<Xn|SP>{, #<simm>}]
6
+ # STUR <Xt>, [<Xn|SP>{, #<simm>}]
7
+ class STUR_gen
8
+ def initialize rt, rn, imm9, size
9
+ @rt = rt
10
+ @rn = rn
11
+ @imm9 = imm9
12
+ @size = size
13
+ end
14
+
15
+ def encode
16
+ self.STUR_gen(@size, @imm9, @rn.to_i, @rt.to_i)
17
+ end
18
+
19
+ private
20
+
21
+ def STUR_gen size, imm9, rn, rt
22
+ insn = 0b00_111_0_00_00_0_000000000_00_00000_00000
23
+ insn |= ((size & 0x3) << 30)
24
+ insn |= ((imm9 & 0x1ff) << 12)
25
+ insn |= ((rn & 0x1f) << 5)
26
+ insn |= (rt & 0x1f)
27
+ insn
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,33 @@
1
+ module AArch64
2
+ module Instructions
3
+ # STXP -- A64
4
+ # Store Exclusive Pair of registers
5
+ # STXP <Ws>, <Wt1>, <Wt2>, [<Xn|SP>{,#0}]
6
+ # STXP <Ws>, <Xt1>, <Xt2>, [<Xn|SP>{,#0}]
7
+ class STXP
8
+ def initialize rs, rt1, rt2, rn, sf
9
+ @rs = rs
10
+ @rt1 = rt1
11
+ @rt2 = rt2
12
+ @rn = rn
13
+ @sf = sf
14
+ end
15
+
16
+ def encode
17
+ self.STXP(@sf, @rs.to_i, @rt2.to_i, @rn.to_i, @rt1.to_i)
18
+ end
19
+
20
+ private
21
+
22
+ def STXP sz, rs, rt2, rn, rt
23
+ insn = 0b1_0_001000_0_0_1_00000_0_00000_00000_00000
24
+ insn |= ((sz & 0x1) << 30)
25
+ insn |= ((rs & 0x1f) << 16)
26
+ insn |= ((rt2 & 0x1f) << 10)
27
+ insn |= ((rn & 0x1f) << 5)
28
+ insn |= (rt & 0x1f)
29
+ insn
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,31 @@
1
+ module AArch64
2
+ module Instructions
3
+ # STXR -- A64
4
+ # Store Exclusive Register
5
+ # STXR <Ws>, <Wt>, [<Xn|SP>{,#0}]
6
+ # STXR <Ws>, <Xt>, [<Xn|SP>{,#0}]
7
+ class STXR
8
+ def initialize rs, rt, rn, size
9
+ @rs = rs
10
+ @rt = rt
11
+ @rn = rn
12
+ @size = size
13
+ end
14
+
15
+ def encode
16
+ self.STXR(@size, @rs.to_i, @rn.to_i, @rt.to_i)
17
+ end
18
+
19
+ private
20
+
21
+ def STXR size, rs, rn, rt
22
+ insn = 0b00_001000_0_0_0_00000_0_11111_00000_00000
23
+ insn |= ((size & 0x3) << 30)
24
+ insn |= ((rs & 0x1f) << 16)
25
+ insn |= ((rn & 0x1f) << 5)
26
+ insn |= (rt & 0x1f)
27
+ insn
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ module AArch64
2
+ module Instructions
3
+ # STXRB -- A64
4
+ # Store Exclusive Register Byte
5
+ # STXRB <Ws>, <Wt>, [<Xn|SP>{,#0}]
6
+ class STXRB
7
+ def initialize rs, rt, rn
8
+ @rs = rs
9
+ @rt = rt
10
+ @rn = rn
11
+ end
12
+
13
+ def encode
14
+ self.STXRB(@rs.to_i, @rn.to_i, @rt.to_i)
15
+ end
16
+
17
+ private
18
+
19
+ def STXRB rs, rn, rt
20
+ insn = 0b00_001000_0_0_0_00000_0_11111_00000_00000
21
+ insn |= ((rs & 0x1f) << 16)
22
+ insn |= ((rn & 0x1f) << 5)
23
+ insn |= (rt & 0x1f)
24
+ insn
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ module AArch64
2
+ module Instructions
3
+ # STXRH -- A64
4
+ # Store Exclusive Register Halfword
5
+ # STXRH <Ws>, <Wt>, [<Xn|SP>{,#0}]
6
+ class STXRH
7
+ def initialize rs, rt, rn
8
+ @rs = rs
9
+ @rt = rt
10
+ @rn = rn
11
+ end
12
+
13
+ def encode
14
+ self.STXRH(@rs.to_i, @rn.to_i, @rt.to_i)
15
+ end
16
+
17
+ private
18
+
19
+ def STXRH rs, rn, rt
20
+ insn = 0b01_001000_0_0_0_00000_0_11111_00000_00000
21
+ insn |= ((rs & 0x1f) << 16)
22
+ insn |= ((rn & 0x1f) << 5)
23
+ insn |= (rt & 0x1f)
24
+ insn
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ module AArch64
2
+ module Instructions
3
+ # STZ2G -- A64
4
+ # Store Allocation Tags, Zeroing
5
+ # STZ2G <Xt|SP>, [<Xn|SP>], #<simm>
6
+ # STZ2G <Xt|SP>, [<Xn|SP>, #<simm>]!
7
+ # STZ2G <Xt|SP>, [<Xn|SP>{, #<simm>}]
8
+ class STZ2G
9
+ def initialize xt, xn, imm9, opt
10
+ @xt = xt
11
+ @xn = xn
12
+ @imm9 = imm9
13
+ @opt = opt
14
+ end
15
+
16
+ def encode
17
+ self.STZ2G(@imm9, @opt, @xn.to_i, @xt.to_i)
18
+ end
19
+
20
+ private
21
+
22
+ def STZ2G imm9, opt, xn, xt
23
+ insn = 0b11011001_1_1_1_000000000_00_00000_00000
24
+ insn |= ((imm9 & 0x1ff) << 12)
25
+ insn |= ((opt & 0x3) << 10)
26
+ insn |= ((xn & 0x1f) << 5)
27
+ insn |= (xt & 0x1f)
28
+ insn
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ module AArch64
2
+ module Instructions
3
+ # STZG -- A64
4
+ # Store Allocation Tag, Zeroing
5
+ # STZG <Xt|SP>, [<Xn|SP>], #<simm>
6
+ # STZG <Xt|SP>, [<Xn|SP>, #<simm>]!
7
+ # STZG <Xt|SP>, [<Xn|SP>{, #<simm>}]
8
+ class STZG
9
+ def initialize xt, xn, imm9, opt
10
+ @xt = xt
11
+ @xn = xn
12
+ @imm9 = imm9
13
+ @opt = opt
14
+ end
15
+
16
+ def encode
17
+ self.STZG(@imm9, @opt, @xn.to_i, @xt.to_i)
18
+ end
19
+
20
+ private
21
+
22
+ def STZG imm9, opt, xn, xt
23
+ insn = 0b11011001_0_1_1_000000000_00_00000_00000
24
+ insn |= ((imm9 & 0x1ff) << 12)
25
+ insn |= ((opt & 0x3) << 10)
26
+ insn |= ((xn & 0x1f) << 5)
27
+ insn |= (xt & 0x1f)
28
+ insn
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,26 @@
1
+ module AArch64
2
+ module Instructions
3
+ # STZGM -- A64
4
+ # Store Tag and Zero Multiple
5
+ # STZGM <Xt>, [<Xn|SP>]
6
+ class STZGM
7
+ def initialize rt, rn
8
+ @rt = rt
9
+ @rn = rn
10
+ end
11
+
12
+ def encode
13
+ self.STZGM(@rn.to_i, @rt.to_i)
14
+ end
15
+
16
+ private
17
+
18
+ def STZGM xn, xt
19
+ insn = 0b11011001_0_0_1_0_0_0_0_0_0_0_0_0_0_0_00000_00000
20
+ insn |= ((xn & 0x1f) << 5)
21
+ insn |= (xt & 0x1f)
22
+ insn
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,35 @@
1
+ module AArch64
2
+ module Instructions
3
+ # SUB (extended register) -- A64
4
+ # Subtract (extended register)
5
+ # SUB <Wd|WSP>, <Wn|WSP>, <Wm>{, <extend> {#<amount>}}
6
+ # SUB <Xd|SP>, <Xn|SP>, <R><m>{, <extend> {#<amount>}}
7
+ class SUB_addsub_ext
8
+ def initialize rd, rn, rm, extend, amount, sf
9
+ @rd = rd
10
+ @rn = rn
11
+ @rm = rm
12
+ @extend = extend
13
+ @amount = amount
14
+ @sf = sf
15
+ end
16
+
17
+ def encode
18
+ self.SUB_addsub_ext(@sf, @rm.to_i, @extend, @amount, @rn.to_i, @rd.to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def SUB_addsub_ext sf, rm, option, imm3, rn, rd
24
+ insn = 0b0_1_0_01011_00_1_00000_000_000_00000_00000
25
+ insn |= ((sf & 0x1) << 31)
26
+ insn |= ((rm & 0x1f) << 16)
27
+ insn |= ((option & 0x7) << 13)
28
+ insn |= ((imm3 & 0x7) << 10)
29
+ insn |= ((rn & 0x1f) << 5)
30
+ insn |= (rd & 0x1f)
31
+ insn
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,33 @@
1
+ module AArch64
2
+ module Instructions
3
+ # SUB (immediate) -- A64
4
+ # Subtract (immediate)
5
+ # SUB <Wd|WSP>, <Wn|WSP>, #<imm>{, <shift>}
6
+ # SUB <Xd|SP>, <Xn|SP>, #<imm>{, <shift>}
7
+ class SUB_addsub_imm
8
+ def initialize rd, rn, imm, shift, sf
9
+ @rd = rd
10
+ @rn = rn
11
+ @imm = imm
12
+ @shift = shift
13
+ @sf = sf
14
+ end
15
+
16
+ def encode
17
+ self.SUB_addsub_imm(@sf, @shift, @imm, @rn.to_i, @rd.to_i)
18
+ end
19
+
20
+ private
21
+
22
+ def SUB_addsub_imm sf, sh, imm12, rn, rd
23
+ insn = 0b0_1_0_100010_0_000000000000_00000_00000
24
+ insn |= ((sf & 0x1) << 31)
25
+ insn |= ((sh & 0x1) << 22)
26
+ insn |= ((imm12 & 0xfff) << 10)
27
+ insn |= ((rn & 0x1f) << 5)
28
+ insn |= (rd & 0x1f)
29
+ insn
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,35 @@
1
+ module AArch64
2
+ module Instructions
3
+ # SUB (shifted register) -- A64
4
+ # Subtract (shifted register)
5
+ # SUB <Wd>, <Wn>, <Wm>{, <shift> #<amount>}
6
+ # SUB <Xd>, <Xn>, <Xm>{, <shift> #<amount>}
7
+ class SUB_addsub_shift
8
+ def initialize rd, rn, rm, shift, amount, sf
9
+ @rd = rd
10
+ @rn = rn
11
+ @rm = rm
12
+ @shift = shift
13
+ @amount = amount
14
+ @sf = sf
15
+ end
16
+
17
+ def encode
18
+ self.SUB_addsub_shift(@sf, @shift, @rm.to_i, @amount, @rn.to_i, @rd.to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def SUB_addsub_shift sf, shift, rm, imm6, rn, rd
24
+ insn = 0b0_1_0_01011_00_0_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,30 @@
1
+ module AArch64
2
+ module Instructions
3
+ # SUBG -- A64
4
+ # Subtract with Tag
5
+ # SUBG <Xd|SP>, <Xn|SP>, #<uimm6>, #<uimm4>
6
+ class SUBG
7
+ def initialize xd, xn, uimm6, uimm4
8
+ @xd = xd
9
+ @xn = xn
10
+ @uimm6 = uimm6
11
+ @uimm4 = uimm4
12
+ end
13
+
14
+ def encode
15
+ self.SUBG(@uimm6, @uimm4, @xn.to_i, @xd.to_i)
16
+ end
17
+
18
+ private
19
+
20
+ def SUBG uimm6, uimm4, xn, xd
21
+ insn = 0b1_1_0_100011_0_000000_00_0000_00000_00000
22
+ insn |= ((uimm6 & 0x3f) << 16)
23
+ insn |= ((uimm4 & 0xf) << 10)
24
+ insn |= ((xn & 0x1f) << 5)
25
+ insn |= (xd & 0x1f)
26
+ insn
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ module AArch64
2
+ module Instructions
3
+ # SUBP -- A64
4
+ # Subtract Pointer
5
+ # SUBP <Xd>, <Xn|SP>, <Xm|SP>
6
+ class SUBP
7
+ def initialize xd, xn, xm
8
+ @xd = xd
9
+ @xn = xn
10
+ @xm = xm
11
+ end
12
+
13
+ def encode
14
+ self.SUBP(@xm.to_i, @xn.to_i, @xm.to_i)
15
+ end
16
+
17
+ private
18
+
19
+ def SUBP xm, xn, xd
20
+ insn = 0b1_0_0_11010110_00000_0_0_0_0_0_0_00000_00000
21
+ insn |= ((xm & 0x1f) << 16)
22
+ insn |= ((xn & 0x1f) << 5)
23
+ insn |= (xd & 0x1f)
24
+ insn
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ module AArch64
2
+ module Instructions
3
+ # SUBPS -- A64
4
+ # Subtract Pointer, setting Flags
5
+ # SUBPS <Xd>, <Xn|SP>, <Xm|SP>
6
+ class SUBPS
7
+ def initialize xd, xn, xm
8
+ @xd = xd
9
+ @xn = xn
10
+ @xm = xm
11
+ end
12
+
13
+ def encode
14
+ self.SUBPS(@xm.to_i, @xn.to_i, @xd.to_i)
15
+ end
16
+
17
+ private
18
+
19
+ def SUBPS xm, xn, xd
20
+ insn = 0b1_0_1_11010110_00000_0_0_0_0_0_0_00000_00000
21
+ insn |= ((xm & 0x1f) << 16)
22
+ insn |= ((xn & 0x1f) << 5)
23
+ insn |= (xd & 0x1f)
24
+ insn
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+ module AArch64
2
+ module Instructions
3
+ # SUBS (extended register) -- A64
4
+ # Subtract (extended register), setting flags
5
+ # SUBS <Wd>, <Wn|WSP>, <Wm>{, <extend> {#<amount>}}
6
+ # SUBS <Xd>, <Xn|SP>, <R><m>{, <extend> {#<amount>}}
7
+ class SUBS_addsub_ext
8
+ def initialize rd, rn, rm, extend, amount, sf
9
+ @rd = rd
10
+ @rn = rn
11
+ @rm = rm
12
+ @extend = extend
13
+ @amount = amount
14
+ @sf = sf
15
+ end
16
+
17
+ def encode
18
+ SUBS_addsub_ext(@sf, @rm.to_i, @extend, @amount, @rn.to_i, @rd.to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def SUBS_addsub_ext sf, rm, option, imm3, rn, rd
24
+ insn = 0b0_1_1_01011_00_1_00000_000_000_00000_00000
25
+ insn |= ((sf & 0x1) << 31)
26
+ insn |= ((rm & 0x1f) << 16)
27
+ insn |= ((option & 0x7) << 13)
28
+ insn |= ((imm3 & 0x7) << 10)
29
+ insn |= ((rn & 0x1f) << 5)
30
+ insn |= (rd & 0x1f)
31
+ insn
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,33 @@
1
+ module AArch64
2
+ module Instructions
3
+ # SUBS (immediate) -- A64
4
+ # Subtract (immediate), setting flags
5
+ # SUBS <Wd>, <Wn|WSP>, #<imm>{, <shift>}
6
+ # SUBS <Xd>, <Xn|SP>, #<imm>{, <shift>}
7
+ class SUBS_addsub_imm
8
+ def initialize rd, rn, imm, shift, sf
9
+ @rd = rd
10
+ @rn = rn
11
+ @imm = imm
12
+ @shift = shift
13
+ @sf = sf
14
+ end
15
+
16
+ def encode
17
+ SUBS_addsub_imm(@sf, @shift, @imm, @rn.to_i, @rd.to_i)
18
+ end
19
+
20
+ private
21
+
22
+ def SUBS_addsub_imm sf, sh, imm12, rn, rd
23
+ insn = 0b0_1_1_100010_0_000000000000_00000_00000
24
+ insn |= ((sf & 0x1) << 31)
25
+ insn |= ((sh & 0x1) << 22)
26
+ insn |= ((imm12 & 0xfff) << 10)
27
+ insn |= ((rn & 0x1f) << 5)
28
+ insn |= (rd & 0x1f)
29
+ insn
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,35 @@
1
+ module AArch64
2
+ module Instructions
3
+ # SUBS (shifted register) -- A64
4
+ # Subtract (shifted register), setting flags
5
+ # SUBS <Wd>, <Wn>, <Wm>{, <shift> #<amount>}
6
+ # SUBS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}
7
+ class SUBS_addsub_shift
8
+ def initialize rd, rn, rm, shift, amount, sf
9
+ @rd = rd
10
+ @rn = rn
11
+ @rm = rm
12
+ @shift = shift
13
+ @amount = amount
14
+ @sf = sf
15
+ end
16
+
17
+ def encode
18
+ SUBS_addsub_shift(@sf, @shift, @rm.to_i, @amount, @rn.to_i, @rd.to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def SUBS_addsub_shift sf, shift, rm, imm6, rn, rd
24
+ insn = 0b0_1_1_01011_00_0_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
+ # SVC -- A64
4
+ # Supervisor Call
5
+ # SVC #<imm>
6
+ class SVC
7
+ def initialize imm
8
+ @imm = imm
9
+ end
10
+
11
+ def encode
12
+ self.SVC(@imm)
13
+ end
14
+
15
+ private
16
+
17
+ def SVC imm16
18
+ insn = 0b11010100_000_0000000000000000_000_01
19
+ insn |= ((imm16 & 0xffff) << 5)
20
+ insn
21
+ end
22
+ end
23
+ end
24
+ end