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,34 @@
1
+ module AArch64
2
+ module Instructions
3
+ # MSR (register) -- A64
4
+ # Move general-purpose register to System Register
5
+ # MSR (<systemreg>|S<op0>_<op1>_<Cn>_<Cm>_<op2>), <Xt>
6
+ class MSR_reg
7
+ def initialize o0, op1, crn, crm, op2, rt
8
+ @o0 = o0
9
+ @op1 = op1
10
+ @crn = crn
11
+ @crm = crm
12
+ @op2 = op2
13
+ @rt = rt
14
+ end
15
+
16
+ def encode
17
+ self.MSR_reg(@o0, @op1, @crn, @crm, @op2, @rt.to_i)
18
+ end
19
+
20
+ private
21
+
22
+ def MSR_reg o0, op1, crn, crm, op2, rt
23
+ insn = 0b1101010100_0_1_0_000_0000_0000_000_00000
24
+ insn |= ((o0 & 0x1) << 19)
25
+ insn |= ((op1 & 0x7) << 16)
26
+ insn |= ((crn & 0xf) << 12)
27
+ insn |= ((crm & 0xf) << 8)
28
+ insn |= ((op2 & 0x7) << 5)
29
+ insn |= (rt & 0x1f)
30
+ insn
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,33 @@
1
+ module AArch64
2
+ module Instructions
3
+ # MSUB -- A64
4
+ # Multiply-Subtract
5
+ # MSUB <Wd>, <Wn>, <Wm>, <Wa>
6
+ # MSUB <Xd>, <Xn>, <Xm>, <Xa>
7
+ class MSUB
8
+ def initialize rd, rn, rm, ra, sf
9
+ @rd = rd
10
+ @rn = rn
11
+ @rm = rm
12
+ @ra = ra
13
+ @sf = sf
14
+ end
15
+
16
+ def encode
17
+ self.MSUB(@sf, @rm.to_i, @ra.to_i, @rn.to_i, @rd.to_i)
18
+ end
19
+
20
+ private
21
+
22
+ def MSUB sf, rm, ra, rn, rd
23
+ insn = 0b0_00_11011_000_00000_1_00000_00000_00000
24
+ insn |= ((sf & 0x1) << 31)
25
+ insn |= ((rm & 0x1f) << 16)
26
+ insn |= ((ra & 0x1f) << 10)
27
+ insn |= ((rn & 0x1f) << 5)
28
+ insn |= (rd & 0x1f)
29
+ insn
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,19 @@
1
+ module AArch64
2
+ module Instructions
3
+ # NOP -- A64
4
+ # No Operation
5
+ # NOP
6
+ class NOP
7
+ def encode
8
+ self.NOP
9
+ end
10
+
11
+ private
12
+
13
+ def NOP
14
+ insn = 0b1101010100_0_00_011_0010_0000_000_11111
15
+ insn
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,35 @@
1
+ module AArch64
2
+ module Instructions
3
+ # ORN (shifted register) -- A64
4
+ # Bitwise OR NOT (shifted register)
5
+ # ORN <Wd>, <Wn>, <Wm>{, <shift> #<amount>}
6
+ # ORN <Xd>, <Xn>, <Xm>{, <shift> #<amount>}
7
+ class ORN_log_shift
8
+ def initialize rd, rn, rm, shift, imm6, sf
9
+ @rd = rd
10
+ @rn = rn
11
+ @rm = rm
12
+ @shift = shift
13
+ @imm6 = imm6
14
+ @sf = sf
15
+ end
16
+
17
+ def encode
18
+ self.ORN_log_shift(@sf, @shift, @rm.to_i, @imm6, @rn.to_i, @rd.to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def ORN_log_shift sf, shift, rm, imm6, rn, rd
24
+ insn = 0b0_01_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
+ # ORR (immediate) -- A64
4
+ # Bitwise OR (immediate)
5
+ # ORR <Wd|WSP>, <Wn>, #<imm>
6
+ # ORR <Xd|SP>, <Xn>, #<imm>
7
+ class ORR_log_imm
8
+ def initialize rd, rn, n, immr, imms, sf
9
+ @rd = rd
10
+ @rn = rn
11
+ @n = n
12
+ @immr = immr
13
+ @imms = imms
14
+ @sf = sf
15
+ end
16
+
17
+ def encode
18
+ self.ORR_log_imm(@sf, @n, @immr, @imms, @rn.to_i, @rd.to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def ORR_log_imm sf, n, immr, imms, rn, rd
24
+ insn = 0b0_01_100100_0_000000_000000_00000_00000
25
+ insn |= ((sf & 0x1) << 31)
26
+ insn |= ((n & 0x1) << 22)
27
+ insn |= ((immr & 0x3f) << 16)
28
+ insn |= ((imms & 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
+ # ORR (shifted register) -- A64
4
+ # Bitwise OR (shifted register)
5
+ # ORR <Wd>, <Wn>, <Wm>{, <shift> #<amount>}
6
+ # ORR <Xd>, <Xn>, <Xm>{, <shift> #<amount>}
7
+ class ORR_log_shift
8
+ def initialize rd, rn, rm, shift, imm6, sf
9
+ @rd = rd
10
+ @rn = rn
11
+ @rm = rm
12
+ @shift = shift
13
+ @imm6 = imm6
14
+ @sf = sf
15
+ end
16
+
17
+ def encode
18
+ self.ORR_log_shift(@sf, @shift, @rm.to_i, @imm6, @rn.to_i, @rd.to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def ORR_log_shift sf, shift, rm, imm6, rn, rd
24
+ insn = 0b0_01_01010_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,29 @@
1
+ module AArch64
2
+ module Instructions
3
+ # PACDA, PACDZA -- A64
4
+ # Pointer Authentication Code for Data address, using key A
5
+ # PACDA <Xd>, <Xn|SP>
6
+ # PACDZA <Xd>
7
+ class PACDA
8
+ def initialize rd, rn, z
9
+ @rd = rd
10
+ @rn = rn
11
+ @z = z
12
+ end
13
+
14
+ def encode
15
+ self.PACDA(@z, @rn.to_i, @rd.to_i)
16
+ end
17
+
18
+ private
19
+
20
+ def PACDA z, rn, rd
21
+ insn = 0b1_1_0_11010110_00001_0_0_0_010_00000_00000
22
+ insn |= ((z & 0x1) << 13)
23
+ insn |= ((rn & 0x1f) << 5)
24
+ insn |= (rd & 0x1f)
25
+ insn
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ module AArch64
2
+ module Instructions
3
+ # PACDB, PACDZB -- A64
4
+ # Pointer Authentication Code for Data address, using key B
5
+ # PACDB <Xd>, <Xn|SP>
6
+ # PACDZB <Xd>
7
+ class PACDB
8
+ def initialize rd, rn, z
9
+ @rd = rd
10
+ @rn = rn
11
+ @z = z
12
+ end
13
+
14
+ def encode
15
+ self.PACDB(@z, @rn.to_i, @rd.to_i)
16
+ end
17
+
18
+ private
19
+
20
+ def PACDB z, rn, rd
21
+ insn = 0b1_1_0_11010110_00001_0_0_0_011_00000_00000
22
+ insn |= ((z & 0x1) << 13)
23
+ insn |= ((rn & 0x1f) << 5)
24
+ insn |= (rd & 0x1f)
25
+ insn
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,28 @@
1
+ module AArch64
2
+ module Instructions
3
+ # PACGA -- A64
4
+ # Pointer Authentication Code, using Generic key
5
+ # PACGA <Xd>, <Xn>, <Xm|SP>
6
+ class PACGA
7
+ def initialize rd, rn, rm
8
+ @rd = rd
9
+ @rn = rn
10
+ @rm = rm
11
+ end
12
+
13
+ def encode
14
+ self.PACGA(@rm.to_i, @rn.to_i, @rd.to_i)
15
+ end
16
+
17
+ private
18
+
19
+ def PACGA rm, rn, rd
20
+ insn = 0b1_0_0_11010110_00000_001100_00000_00000
21
+ insn |= ((rm & 0x1f) << 16)
22
+ insn |= ((rn & 0x1f) << 5)
23
+ insn |= (rd & 0x1f)
24
+ insn
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ module AArch64
2
+ module Instructions
3
+ # PACIA, PACIA1716, PACIASP, PACIAZ, PACIZA -- A64
4
+ # Pointer Authentication Code for Instruction address, using key A
5
+ # PACIA <Xd>, <Xn|SP>
6
+ # PACIZA <Xd>
7
+ # PACIA1716
8
+ # PACIASP
9
+ # PACIAZ
10
+ class PACIA
11
+ def initialize rd, rn, z
12
+ @rd = rd
13
+ @rn = rn
14
+ @z = z
15
+ end
16
+
17
+ def encode
18
+ self.PACIA(@z, @rn.to_i, @rd.to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def PACIA z, rn, rd
24
+ insn = 0b1_1_0_11010110_00001_0_0_0_000_00000_00000
25
+ insn |= ((z & 0x1) << 13)
26
+ insn |= ((rn & 0x1f) << 5)
27
+ insn |= (rd & 0x1f)
28
+ insn
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+ module AArch64
2
+ module Instructions
3
+ # PACIA, PACIA1716, PACIASP, PACIAZ, PACIZA -- A64
4
+ # Pointer Authentication Code for Instruction address, using key A
5
+ # PACIA1716
6
+ # PACIASP
7
+ # PACIAZ
8
+ class PACIA2
9
+ def initialize crm, op2
10
+ @crm = crm
11
+ @op2 = op2
12
+ end
13
+
14
+ def encode
15
+ self.PACIA2(@crm, @op2)
16
+ end
17
+
18
+ private
19
+
20
+ def PACIA2 crm, op2
21
+ insn = 0b11010101000000110010_0000_000_11111
22
+ insn |= ((crm & 0xf) << 8)
23
+ insn |= ((op2 & 0x7) << 5)
24
+ insn
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ module AArch64
2
+ module Instructions
3
+ # PACIB, PACIB1716, PACIBSP, PACIBZ, PACIZB -- A64
4
+ # Pointer Authentication Code for Instruction address, using key B
5
+ # PACIB <Xd>, <Xn|SP>
6
+ # PACIZB <Xd>
7
+ # PACIB1716
8
+ # PACIBSP
9
+ # PACIBZ
10
+ class PACIB
11
+ def initialize rd, rn, z
12
+ @rd = rd
13
+ @rn = rn
14
+ @z = z
15
+ end
16
+
17
+ def encode
18
+ self.PACIB(@z, @rn.to_i, @rd.to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def PACIB z, rn, rd
24
+ insn = 0b1_1_0_11010110_00001_0_0_0_001_00000_00000
25
+ insn |= ((z & 0x1) << 13)
26
+ insn |= ((rn & 0x1f) << 5)
27
+ insn |= (rd & 0x1f)
28
+ insn
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+ module AArch64
2
+ module Instructions
3
+ # PRFM (immediate) -- A64
4
+ # Prefetch Memory (immediate)
5
+ # PRFM (<prfop>|#<imm5>), [<Xn|SP>{, #<pimm>}]
6
+ class PRFM_imm
7
+ def initialize rt, rn, imm12
8
+ @rt = rt
9
+ @rn = rn
10
+ @imm12 = imm12
11
+ end
12
+
13
+ def encode
14
+ self.PRFM_imm(@imm12, @rn.to_i, @rt.to_i)
15
+ end
16
+
17
+ private
18
+
19
+ def PRFM_imm imm12, rn, rt
20
+ insn = 0b11_111_0_01_10_000000000000_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,26 @@
1
+ module AArch64
2
+ module Instructions
3
+ # PRFM (literal) -- A64
4
+ # Prefetch Memory (literal)
5
+ # PRFM (<prfop>|#<imm5>), <label>
6
+ class PRFM_lit
7
+ def initialize rt, imm19
8
+ @imm19 = imm19
9
+ @rt = rt
10
+ end
11
+
12
+ def encode
13
+ self.PRFM_lit(@imm19.to_i / 4, @rt.to_i)
14
+ end
15
+
16
+ private
17
+
18
+ def PRFM_lit imm19, rt
19
+ insn = 0b11_011_0_00_0000000000000000000_00000
20
+ insn |= ((imm19 & 0x7ffff) << 5)
21
+ insn |= (rt & 0x1f)
22
+ insn
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,32 @@
1
+ module AArch64
2
+ module Instructions
3
+ # PRFM (register) -- A64
4
+ # Prefetch Memory (register)
5
+ # PRFM (<prfop>|#<imm5>), [<Xn|SP>, (<Wm>|<Xm>){, <extend> {<amount>}}]
6
+ class PRFM_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.PRFM_reg(@rm.to_i, @option, @s, @rn.to_i, @rt.to_i)
17
+ end
18
+
19
+ private
20
+
21
+ def PRFM_reg rm, option, s, rn, rt
22
+ insn = 0b11_111_0_00_10_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,28 @@
1
+ module AArch64
2
+ module Instructions
3
+ # PRFUM -- A64
4
+ # Prefetch Memory (unscaled offset)
5
+ # PRFUM (<prfop>|#<imm5>), [<Xn|SP>{, #<simm>}]
6
+ class PRFUM
7
+ def initialize rt, rn, imm9
8
+ @rt = rt
9
+ @rn = rn
10
+ @imm9 = imm9
11
+ end
12
+
13
+ def encode
14
+ self.PRFUM(@imm9, @rn.to_i, @rt.to_i)
15
+ end
16
+
17
+ private
18
+
19
+ def PRFUM imm9, rn, rt
20
+ insn = 0b11_111_0_00_10_0_000000000_00_00000_00000
21
+ insn |= ((imm9 & 0x1ff) << 12)
22
+ insn |= ((rn & 0x1f) << 5)
23
+ insn |= (rt & 0x1f)
24
+ insn
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ module AArch64
2
+ module Instructions
3
+ # PSB CSYNC -- A64
4
+ # Profiling Synchronization Barrier
5
+ # PSB CSYNC
6
+ class PSB
7
+ def encode
8
+ self.PSB
9
+ end
10
+
11
+ private
12
+
13
+ def PSB
14
+ insn = 0b1101010100_0_00_011_0010_0010_001_11111
15
+ insn
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ module AArch64
2
+ module Instructions
3
+ # RBIT -- A64
4
+ # Reverse Bits
5
+ # RBIT <Wd>, <Wn>
6
+ # RBIT <Xd>, <Xn>
7
+ class RBIT_int
8
+ def initialize rd, rn, sf
9
+ @rd = rd
10
+ @rn = rn
11
+ @sf = sf
12
+ end
13
+
14
+ def encode
15
+ self.RBIT_int(@sf, @rn.to_i, @rd.to_i)
16
+ end
17
+
18
+ private
19
+
20
+ def RBIT_int sf, rn, rd
21
+ insn = 0b0_1_0_11010110_00000_0000_00_00000_00000
22
+ insn |= ((sf & 0x1) << 31)
23
+ insn |= ((rn & 0x1f) << 5)
24
+ insn |= (rd & 0x1f)
25
+ insn
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ module AArch64
2
+ module Instructions
3
+ # RET -- A64
4
+ # Return from subroutine
5
+ # RET {<Xn>}
6
+ class RET
7
+ def initialize reg
8
+ @reg = reg
9
+ end
10
+
11
+ def encode
12
+ RET(@reg.to_i)
13
+ end
14
+
15
+ private
16
+
17
+ def RET rn
18
+ insn = 0b1101011_0_0_10_11111_0000_0_0_00000_00000
19
+ insn |= ((rn & 0x1f) << 5)
20
+ insn
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,25 @@
1
+ module AArch64
2
+ module Instructions
3
+ # RETAA, RETAB -- A64
4
+ # Return from subroutine, with pointer authentication
5
+ # RETAA
6
+ # RETAB
7
+ class RETA
8
+ def initialize m
9
+ @m = m
10
+ end
11
+
12
+ def encode
13
+ self.RETA(@m)
14
+ end
15
+
16
+ private
17
+
18
+ def RETA m
19
+ insn = 0b1101011_0_0_10_11111_0000_1_0_11111_11111
20
+ insn |= ((m & 0x1) << 10)
21
+ insn
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,31 @@
1
+ module AArch64
2
+ module Instructions
3
+ # REV -- A64
4
+ # Reverse Bytes
5
+ # REV <Wd>, <Wn>
6
+ # REV <Xd>, <Xn>
7
+ class REV
8
+ def initialize rd, rn, sf, opc
9
+ @rd = rd
10
+ @rn = rn
11
+ @sf = sf
12
+ @opc = opc
13
+ end
14
+
15
+ def encode
16
+ self.REV(@sf, @rn.to_i, @rd.to_i, @opc)
17
+ end
18
+
19
+ private
20
+
21
+ def REV sf, rn, rd, opc
22
+ insn = 0b0_1_0_11010110_00000_0000_00_00000_00000
23
+ insn |= ((sf & 0x1) << 31)
24
+ insn |= ((opc & 0x3) << 10)
25
+ insn |= ((rn & 0x1f) << 5)
26
+ insn |= (rd & 0x1f)
27
+ insn
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ module AArch64
2
+ module Instructions
3
+ # RMIF -- A64
4
+ # Rotate, Mask Insert Flags
5
+ # RMIF <Xn>, #<shift>, #<mask>
6
+ class RMIF
7
+ def initialize rn, imm6, mask
8
+ @rn = rn
9
+ @imm6 = imm6
10
+ @mask = mask
11
+ end
12
+
13
+ def encode
14
+ self.RMIF(@imm6, @rn.to_i, @mask)
15
+ end
16
+
17
+ private
18
+
19
+ def RMIF imm6, rn, mask
20
+ insn = 0b1_0_1_11010000_000000_00001_00000_0_0000
21
+ insn |= ((imm6 & 0x3f) << 15)
22
+ insn |= ((rn & 0x1f) << 5)
23
+ insn |= (mask & 0xf)
24
+ insn
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,31 @@
1
+ module AArch64
2
+ module Instructions
3
+ # RORV -- A64
4
+ # Rotate Right Variable
5
+ # RORV <Wd>, <Wn>, <Wm>
6
+ # RORV <Xd>, <Xn>, <Xm>
7
+ class RORV
8
+ def initialize rd, rn, rm, sf
9
+ @rd = rd
10
+ @rn = rn
11
+ @rm = rm
12
+ @sf = sf
13
+ end
14
+
15
+ def encode
16
+ self.RORV(@sf, @rm.to_i, @rn.to_i, @rd.to_i)
17
+ end
18
+
19
+ private
20
+
21
+ def RORV sf, rm, rn, rd
22
+ insn = 0b0_0_0_11010110_00000_0010_11_00000_00000
23
+ insn |= ((sf & 0x1) << 31)
24
+ insn |= ((rm & 0x1f) << 16)
25
+ insn |= ((rn & 0x1f) << 5)
26
+ insn |= (rd & 0x1f)
27
+ insn
28
+ end
29
+ end
30
+ end
31
+ end