aarch64 1.0.1 → 2.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 (277) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/Rakefile +37 -0
  4. data/aarch64.gemspec +1 -0
  5. data/lib/aarch64/instructions/adc.rb +10 -10
  6. data/lib/aarch64/instructions/adcs.rb +10 -10
  7. data/lib/aarch64/instructions/add_addsub_ext.rb +14 -14
  8. data/lib/aarch64/instructions/add_addsub_imm.rb +12 -12
  9. data/lib/aarch64/instructions/add_addsub_shift.rb +14 -14
  10. data/lib/aarch64/instructions/addg.rb +10 -10
  11. data/lib/aarch64/instructions/adds_addsub_ext.rb +14 -14
  12. data/lib/aarch64/instructions/adds_addsub_imm.rb +12 -12
  13. data/lib/aarch64/instructions/adds_addsub_shift.rb +14 -14
  14. data/lib/aarch64/instructions/adr.rb +7 -7
  15. data/lib/aarch64/instructions/adrp.rb +7 -7
  16. data/lib/aarch64/instructions/and_log_imm.rb +14 -14
  17. data/lib/aarch64/instructions/and_log_shift.rb +14 -14
  18. data/lib/aarch64/instructions/ands_log_imm.rb +14 -14
  19. data/lib/aarch64/instructions/ands_log_shift.rb +14 -14
  20. data/lib/aarch64/instructions/asrv.rb +10 -10
  21. data/lib/aarch64/instructions/autda.rb +9 -12
  22. data/lib/aarch64/instructions/autdb.rb +9 -12
  23. data/lib/aarch64/instructions/autia.rb +9 -12
  24. data/lib/aarch64/instructions/autib.rb +9 -12
  25. data/lib/aarch64/instructions/axflag.rb +1 -1
  26. data/lib/aarch64/instructions/b_cond.rb +5 -5
  27. data/lib/aarch64/instructions/b_uncond.rb +3 -3
  28. data/lib/aarch64/instructions/bc_cond.rb +5 -5
  29. data/lib/aarch64/instructions/bfm.rb +13 -13
  30. data/lib/aarch64/instructions/bic_log_shift.rb +14 -14
  31. data/lib/aarch64/instructions/bics.rb +14 -14
  32. data/lib/aarch64/instructions/bl.rb +3 -3
  33. data/lib/aarch64/instructions/blr.rb +4 -4
  34. data/lib/aarch64/instructions/blra.rb +10 -10
  35. data/lib/aarch64/instructions/br.rb +4 -4
  36. data/lib/aarch64/instructions/bra.rb +10 -10
  37. data/lib/aarch64/instructions/brk.rb +3 -3
  38. data/lib/aarch64/instructions/bti.rb +3 -3
  39. data/lib/aarch64/instructions/cas.rb +14 -14
  40. data/lib/aarch64/instructions/casb.rb +12 -12
  41. data/lib/aarch64/instructions/cash.rb +12 -12
  42. data/lib/aarch64/instructions/casp.rb +14 -14
  43. data/lib/aarch64/instructions/cbnz.rb +7 -7
  44. data/lib/aarch64/instructions/cbz.rb +7 -7
  45. data/lib/aarch64/instructions/ccmn_imm.rb +12 -12
  46. data/lib/aarch64/instructions/ccmn_reg.rb +12 -12
  47. data/lib/aarch64/instructions/ccmp_imm.rb +12 -12
  48. data/lib/aarch64/instructions/ccmp_reg.rb +12 -12
  49. data/lib/aarch64/instructions/cfinv.rb +2 -9
  50. data/lib/aarch64/instructions/clrex.rb +3 -3
  51. data/lib/aarch64/instructions/cls_int.rb +8 -8
  52. data/lib/aarch64/instructions/clz_int.rb +8 -8
  53. data/lib/aarch64/instructions/crc32.rb +12 -12
  54. data/lib/aarch64/instructions/crc32c.rb +12 -12
  55. data/lib/aarch64/instructions/csdb.rb +1 -1
  56. data/lib/aarch64/instructions/csel.rb +12 -12
  57. data/lib/aarch64/instructions/csinc.rb +12 -12
  58. data/lib/aarch64/instructions/csinv.rb +12 -12
  59. data/lib/aarch64/instructions/csneg.rb +12 -12
  60. data/lib/aarch64/instructions/dcps.rb +5 -5
  61. data/lib/aarch64/instructions/dgh.rb +1 -1
  62. data/lib/aarch64/instructions/dmb.rb +3 -3
  63. data/lib/aarch64/instructions/drps.rb +2 -9
  64. data/lib/aarch64/instructions/dsb.rb +3 -3
  65. data/lib/aarch64/instructions/eon.rb +14 -14
  66. data/lib/aarch64/instructions/eor_log_imm.rb +14 -14
  67. data/lib/aarch64/instructions/eor_log_shift.rb +14 -14
  68. data/lib/aarch64/instructions/eret.rb +2 -9
  69. data/lib/aarch64/instructions/ereta.rb +3 -3
  70. data/lib/aarch64/instructions/esb.rb +1 -1
  71. data/lib/aarch64/instructions/extr.rb +13 -13
  72. data/lib/aarch64/instructions/gmi.rb +8 -8
  73. data/lib/aarch64/instructions/hint.rb +5 -5
  74. data/lib/aarch64/instructions/hlt.rb +3 -3
  75. data/lib/aarch64/instructions/hvc.rb +3 -3
  76. data/lib/aarch64/instructions/irg.rb +8 -8
  77. data/lib/aarch64/instructions/isb.rb +3 -3
  78. data/lib/aarch64/instructions/ld64b.rb +6 -6
  79. data/lib/aarch64/instructions/ldadd.rb +14 -14
  80. data/lib/aarch64/instructions/ldaddb.rb +12 -12
  81. data/lib/aarch64/instructions/ldaddh.rb +12 -12
  82. data/lib/aarch64/instructions/ldapr.rb +8 -8
  83. data/lib/aarch64/instructions/ldaprb.rb +6 -6
  84. data/lib/aarch64/instructions/ldaprh.rb +6 -6
  85. data/lib/aarch64/instructions/ldapur_gen.rb +12 -12
  86. data/lib/aarch64/instructions/ldar.rb +8 -8
  87. data/lib/aarch64/instructions/ldaxp.rb +10 -10
  88. data/lib/aarch64/instructions/ldaxr.rb +8 -8
  89. data/lib/aarch64/instructions/ldclr.rb +14 -14
  90. data/lib/aarch64/instructions/ldclrb.rb +14 -14
  91. data/lib/aarch64/instructions/ldeor.rb +14 -14
  92. data/lib/aarch64/instructions/ldg.rb +8 -8
  93. data/lib/aarch64/instructions/ldgm.rb +6 -6
  94. data/lib/aarch64/instructions/ldlar.rb +8 -8
  95. data/lib/aarch64/instructions/ldnp_gen.rb +12 -12
  96. data/lib/aarch64/instructions/ldp_gen.rb +14 -14
  97. data/lib/aarch64/instructions/ldpsw.rb +12 -12
  98. data/lib/aarch64/instructions/ldr_imm_gen.rb +12 -12
  99. data/lib/aarch64/instructions/ldr_imm_unsigned.rb +10 -10
  100. data/lib/aarch64/instructions/ldr_lit_gen.rb +7 -7
  101. data/lib/aarch64/instructions/ldr_reg_gen.rb +14 -14
  102. data/lib/aarch64/instructions/ldra.rb +14 -14
  103. data/lib/aarch64/instructions/ldrb_imm.rb +10 -10
  104. data/lib/aarch64/instructions/ldrb_reg.rb +12 -12
  105. data/lib/aarch64/instructions/ldrb_unsigned.rb +8 -8
  106. data/lib/aarch64/instructions/ldrh_imm.rb +10 -10
  107. data/lib/aarch64/instructions/ldrh_reg.rb +12 -12
  108. data/lib/aarch64/instructions/ldrh_unsigned.rb +8 -8
  109. data/lib/aarch64/instructions/ldrsb_imm.rb +12 -12
  110. data/lib/aarch64/instructions/ldrsb_reg.rb +14 -14
  111. data/lib/aarch64/instructions/ldrsb_unsigned.rb +10 -10
  112. data/lib/aarch64/instructions/ldrsh_imm.rb +12 -12
  113. data/lib/aarch64/instructions/ldrsh_reg.rb +14 -14
  114. data/lib/aarch64/instructions/ldrsh_unsigned.rb +10 -10
  115. data/lib/aarch64/instructions/ldrsw_imm.rb +10 -10
  116. data/lib/aarch64/instructions/ldrsw_lit.rb +5 -5
  117. data/lib/aarch64/instructions/ldrsw_reg.rb +12 -12
  118. data/lib/aarch64/instructions/ldrsw_unsigned.rb +8 -8
  119. data/lib/aarch64/instructions/ldset.rb +14 -14
  120. data/lib/aarch64/instructions/ldsetb.rb +12 -12
  121. data/lib/aarch64/instructions/ldseth.rb +12 -12
  122. data/lib/aarch64/instructions/ldsmax.rb +14 -14
  123. data/lib/aarch64/instructions/ldsmaxb.rb +12 -12
  124. data/lib/aarch64/instructions/ldsmaxh.rb +12 -12
  125. data/lib/aarch64/instructions/ldsmin.rb +14 -14
  126. data/lib/aarch64/instructions/ldsminb.rb +12 -12
  127. data/lib/aarch64/instructions/ldsminh.rb +12 -12
  128. data/lib/aarch64/instructions/ldtr.rb +10 -10
  129. data/lib/aarch64/instructions/ldtrb.rb +8 -8
  130. data/lib/aarch64/instructions/ldtrh.rb +8 -8
  131. data/lib/aarch64/instructions/ldtrsb.rb +10 -10
  132. data/lib/aarch64/instructions/ldtrsh.rb +10 -10
  133. data/lib/aarch64/instructions/ldtrsw.rb +8 -8
  134. data/lib/aarch64/instructions/ldumax.rb +14 -14
  135. data/lib/aarch64/instructions/ldumaxb.rb +12 -12
  136. data/lib/aarch64/instructions/ldumaxh.rb +12 -12
  137. data/lib/aarch64/instructions/ldumin.rb +14 -14
  138. data/lib/aarch64/instructions/lduminb.rb +12 -12
  139. data/lib/aarch64/instructions/lduminh.rb +12 -12
  140. data/lib/aarch64/instructions/ldur_gen.rb +10 -10
  141. data/lib/aarch64/instructions/ldursb.rb +10 -10
  142. data/lib/aarch64/instructions/ldursh.rb +10 -10
  143. data/lib/aarch64/instructions/ldursw.rb +8 -8
  144. data/lib/aarch64/instructions/ldxp.rb +10 -10
  145. data/lib/aarch64/instructions/ldxr.rb +8 -8
  146. data/lib/aarch64/instructions/lslv.rb +10 -10
  147. data/lib/aarch64/instructions/lsrv.rb +10 -10
  148. data/lib/aarch64/instructions/madd.rb +12 -12
  149. data/lib/aarch64/instructions/movk.rb +10 -10
  150. data/lib/aarch64/instructions/movn.rb +10 -10
  151. data/lib/aarch64/instructions/movz.rb +10 -10
  152. data/lib/aarch64/instructions/mrs.rb +14 -14
  153. data/lib/aarch64/instructions/msr_imm.rb +7 -7
  154. data/lib/aarch64/instructions/msr_reg.rb +14 -14
  155. data/lib/aarch64/instructions/msub.rb +12 -12
  156. data/lib/aarch64/instructions/nop.rb +1 -1
  157. data/lib/aarch64/instructions/orn_log_shift.rb +14 -14
  158. data/lib/aarch64/instructions/orr_log_imm.rb +14 -14
  159. data/lib/aarch64/instructions/orr_log_shift.rb +14 -14
  160. data/lib/aarch64/instructions/pacda.rb +8 -8
  161. data/lib/aarch64/instructions/pacdb.rb +8 -8
  162. data/lib/aarch64/instructions/pacga.rb +8 -8
  163. data/lib/aarch64/instructions/pacia.rb +8 -8
  164. data/lib/aarch64/instructions/pacia2.rb +5 -5
  165. data/lib/aarch64/instructions/pacib.rb +8 -8
  166. data/lib/aarch64/instructions/prfm_imm.rb +8 -8
  167. data/lib/aarch64/instructions/prfm_lit.rb +8 -8
  168. data/lib/aarch64/instructions/prfm_reg.rb +12 -12
  169. data/lib/aarch64/instructions/prfum.rb +8 -8
  170. data/lib/aarch64/instructions/psb.rb +2 -9
  171. data/lib/aarch64/instructions/rbit_int.rb +8 -8
  172. data/lib/aarch64/instructions/ret.rb +4 -4
  173. data/lib/aarch64/instructions/reta.rb +3 -3
  174. data/lib/aarch64/instructions/rev.rb +10 -10
  175. data/lib/aarch64/instructions/rmif.rb +8 -8
  176. data/lib/aarch64/instructions/rorv.rb +10 -10
  177. data/lib/aarch64/instructions/sb.rb +1 -1
  178. data/lib/aarch64/instructions/sbc.rb +10 -10
  179. data/lib/aarch64/instructions/sbcs.rb +10 -10
  180. data/lib/aarch64/instructions/sbfm.rb +13 -13
  181. data/lib/aarch64/instructions/sdiv.rb +10 -10
  182. data/lib/aarch64/instructions/setf.rb +6 -6
  183. data/lib/aarch64/instructions/sev.rb +1 -7
  184. data/lib/aarch64/instructions/sevl.rb +1 -1
  185. data/lib/aarch64/instructions/smaddl.rb +10 -10
  186. data/lib/aarch64/instructions/smc.rb +3 -3
  187. data/lib/aarch64/instructions/smsubl.rb +10 -10
  188. data/lib/aarch64/instructions/smulh.rb +8 -8
  189. data/lib/aarch64/instructions/st2g.rb +10 -10
  190. data/lib/aarch64/instructions/st64b.rb +6 -6
  191. data/lib/aarch64/instructions/st64bv.rb +8 -8
  192. data/lib/aarch64/instructions/st64bv0.rb +8 -8
  193. data/lib/aarch64/instructions/stg.rb +10 -10
  194. data/lib/aarch64/instructions/stgm.rb +6 -6
  195. data/lib/aarch64/instructions/stgp.rb +12 -12
  196. data/lib/aarch64/instructions/stllr.rb +8 -8
  197. data/lib/aarch64/instructions/stllrb.rb +6 -6
  198. data/lib/aarch64/instructions/stllrh.rb +6 -6
  199. data/lib/aarch64/instructions/stlr.rb +8 -8
  200. data/lib/aarch64/instructions/stlrb.rb +6 -6
  201. data/lib/aarch64/instructions/stlrh.rb +6 -6
  202. data/lib/aarch64/instructions/stlur_gen.rb +10 -10
  203. data/lib/aarch64/instructions/stlxp.rb +12 -12
  204. data/lib/aarch64/instructions/stlxr.rb +10 -10
  205. data/lib/aarch64/instructions/stlxrb.rb +8 -8
  206. data/lib/aarch64/instructions/stlxrh.rb +8 -8
  207. data/lib/aarch64/instructions/stnp_gen.rb +12 -12
  208. data/lib/aarch64/instructions/stp_gen.rb +14 -14
  209. data/lib/aarch64/instructions/str_imm_gen.rb +12 -12
  210. data/lib/aarch64/instructions/str_imm_unsigned.rb +10 -10
  211. data/lib/aarch64/instructions/str_reg_gen.rb +14 -14
  212. data/lib/aarch64/instructions/strb_imm.rb +10 -10
  213. data/lib/aarch64/instructions/strb_imm_unsigned.rb +8 -8
  214. data/lib/aarch64/instructions/strb_reg.rb +12 -12
  215. data/lib/aarch64/instructions/strh_imm.rb +10 -10
  216. data/lib/aarch64/instructions/strh_imm_unsigned.rb +8 -8
  217. data/lib/aarch64/instructions/strh_reg.rb +12 -12
  218. data/lib/aarch64/instructions/sttr.rb +10 -10
  219. data/lib/aarch64/instructions/stur_gen.rb +10 -10
  220. data/lib/aarch64/instructions/stxp.rb +12 -12
  221. data/lib/aarch64/instructions/stxr.rb +10 -10
  222. data/lib/aarch64/instructions/stxrb.rb +8 -8
  223. data/lib/aarch64/instructions/stxrh.rb +8 -8
  224. data/lib/aarch64/instructions/stz2g.rb +10 -10
  225. data/lib/aarch64/instructions/stzg.rb +10 -10
  226. data/lib/aarch64/instructions/stzgm.rb +6 -6
  227. data/lib/aarch64/instructions/sub_addsub_ext.rb +14 -14
  228. data/lib/aarch64/instructions/sub_addsub_imm.rb +12 -12
  229. data/lib/aarch64/instructions/sub_addsub_shift.rb +14 -14
  230. data/lib/aarch64/instructions/subg.rb +10 -10
  231. data/lib/aarch64/instructions/subp.rb +8 -8
  232. data/lib/aarch64/instructions/subps.rb +8 -8
  233. data/lib/aarch64/instructions/subs_addsub_ext.rb +14 -14
  234. data/lib/aarch64/instructions/subs_addsub_imm.rb +12 -12
  235. data/lib/aarch64/instructions/subs_addsub_shift.rb +14 -14
  236. data/lib/aarch64/instructions/svc.rb +3 -3
  237. data/lib/aarch64/instructions/swp.rb +14 -14
  238. data/lib/aarch64/instructions/swpb.rb +12 -12
  239. data/lib/aarch64/instructions/swph.rb +12 -12
  240. data/lib/aarch64/instructions/sys.rb +12 -12
  241. data/lib/aarch64/instructions/sysl.rb +12 -12
  242. data/lib/aarch64/instructions/tbnz.rb +9 -9
  243. data/lib/aarch64/instructions/tbz.rb +9 -9
  244. data/lib/aarch64/instructions/tsb.rb +1 -7
  245. data/lib/aarch64/instructions/ubfm.rb +13 -13
  246. data/lib/aarch64/instructions/udf_perm_undef.rb +3 -3
  247. data/lib/aarch64/instructions/udiv.rb +10 -10
  248. data/lib/aarch64/instructions/umaddl.rb +10 -10
  249. data/lib/aarch64/instructions/umsubl.rb +10 -10
  250. data/lib/aarch64/instructions/umulh.rb +8 -8
  251. data/lib/aarch64/instructions/wfe.rb +2 -9
  252. data/lib/aarch64/instructions/wfet.rb +4 -4
  253. data/lib/aarch64/instructions/wfi.rb +1 -1
  254. data/lib/aarch64/instructions/wfit.rb +4 -4
  255. data/lib/aarch64/instructions/xaflag.rb +1 -1
  256. data/lib/aarch64/instructions/xpac.rb +6 -6
  257. data/lib/aarch64/instructions/xpaclri.rb +1 -1
  258. data/lib/aarch64/instructions/yield.rb +2 -9
  259. data/lib/aarch64/instructions.rb +26 -8
  260. data/lib/aarch64/parser.rb +227 -0
  261. data/lib/aarch64/parser.tab.rb +6534 -0
  262. data/lib/aarch64/parser.y +1394 -0
  263. data/lib/aarch64/utils.rb +34 -0
  264. data/lib/aarch64/version.rb +1 -1
  265. data/lib/aarch64.rb +128 -58
  266. data/test/base_instructions_test.rb +34 -4
  267. data/test/helper.rb +48 -8
  268. data/test/parser_test.rb +1820 -0
  269. metadata +25 -14
  270. data/lib/aarch64/instructions/setgp.rb +0 -25
  271. data/lib/aarch64/instructions/setgpn.rb +0 -25
  272. data/lib/aarch64/instructions/setgpt.rb +0 -25
  273. data/lib/aarch64/instructions/setgptn.rb +0 -25
  274. data/lib/aarch64/instructions/setp.rb +0 -25
  275. data/lib/aarch64/instructions/setpn.rb +0 -25
  276. data/lib/aarch64/instructions/setpt.rb +0 -25
  277. data/lib/aarch64/instructions/setptn.rb +0 -25
@@ -4,30 +4,30 @@ module AArch64
4
4
  # Bitwise AND (shifted register), setting flags
5
5
  # ANDS <Wd>, <Wn>, <Wm>{, <shift> #<amount>}
6
6
  # ANDS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}
7
- class ANDS_log_shift
7
+ class ANDS_log_shift < Instruction
8
8
  def initialize xd, xn, xm, shift, amount, sf
9
- @xd = xd
10
- @xn = xn
11
- @xm = xm
12
- @shift = shift
13
- @amount = amount
14
- @sf = sf
9
+ @xd = check_mask(xd, 0x1f)
10
+ @xn = check_mask(xn, 0x1f)
11
+ @xm = check_mask(xm, 0x1f)
12
+ @shift = check_mask(shift, 0x03)
13
+ @amount = check_mask(amount, 0x3f)
14
+ @sf = check_mask(sf, 0x01)
15
15
  end
16
16
 
17
17
  def encode
18
- ANDS_log_shift(@sf, @shift, @xm.to_i, @amount, @xn.to_i, @xd.to_i)
18
+ ANDS_log_shift(@sf, @shift, @xm, @amount, @xn, @xd)
19
19
  end
20
20
 
21
21
  private
22
22
 
23
23
  def ANDS_log_shift sf, shift, rm, imm6, rn, rd
24
24
  insn = 0b0_11_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)
25
+ insn |= ((sf) << 31)
26
+ insn |= ((shift) << 22)
27
+ insn |= ((rm) << 16)
28
+ insn |= ((imm6) << 10)
29
+ insn |= ((rn) << 5)
30
+ insn |= (rd)
31
31
  insn
32
32
  end
33
33
  end
@@ -4,26 +4,26 @@ module AArch64
4
4
  # Arithmetic Shift Right Variable
5
5
  # ASRV <Wd>, <Wn>, <Wm>
6
6
  # ASRV <Xd>, <Xn>, <Xm>
7
- class ASRV
7
+ class ASRV < Instruction
8
8
  def initialize rd, rn, rm, sf
9
- @rd = rd
10
- @rn = rn
11
- @rm = rm
12
- @sf = sf
9
+ @rd = check_mask(rd, 0x1f)
10
+ @rn = check_mask(rn, 0x1f)
11
+ @rm = check_mask(rm, 0x1f)
12
+ @sf = check_mask(sf, 0x01)
13
13
  end
14
14
 
15
15
  def encode
16
- ASRV(@sf, @rm.to_i, @rn.to_i, @rd.to_i)
16
+ ASRV(@sf, @rm, @rn, @rd)
17
17
  end
18
18
 
19
19
  private
20
20
 
21
21
  def ASRV sf, rm, rn, rd
22
22
  insn = 0b0_0_0_11010110_00000_0010_10_00000_00000
23
- insn |= ((sf & 0x1) << 31)
24
- insn |= ((rm & 0x1f) << 16)
25
- insn |= ((rn & 0x1f) << 5)
26
- insn |= (rd & 0x1f)
23
+ insn |= ((sf) << 31)
24
+ insn |= ((rm) << 16)
25
+ insn |= ((rn) << 5)
26
+ insn |= (rd)
27
27
  insn
28
28
  end
29
29
  end
@@ -4,27 +4,24 @@ module AArch64
4
4
  # Authenticate Data address, using key A
5
5
  # AUTDA <Xd>, <Xn|SP>
6
6
  # AUTDZA <Xd>
7
- class AUTDA
8
- def initialize d, n
9
- @d = d
10
- @n = n
7
+ class AUTDA < Instruction
8
+ def initialize z, rd, rn
9
+ @z = check_mask(z, 0x01)
10
+ @rd = check_mask(rd, 0x1f)
11
+ @rn = check_mask(rn, 0x1f)
11
12
  end
12
13
 
13
14
  def encode
14
- if @n.integer?
15
- AUTDA(1, @n.to_i, @d.to_i)
16
- else
17
- AUTDA(0, @n.to_i, @d.to_i)
18
- end
15
+ AUTDA(@z, @rn, @rd)
19
16
  end
20
17
 
21
18
  private
22
19
 
23
20
  def AUTDA z, rn, rd
24
21
  insn = 0b1_1_0_11010110_00001_0_0_0_110_00000_00000
25
- insn |= ((z & 0x1) << 13)
26
- insn |= ((rn & 0x1f) << 5)
27
- insn |= (rd & 0x1f)
22
+ insn |= ((z) << 13)
23
+ insn |= ((rn) << 5)
24
+ insn |= (rd)
28
25
  insn
29
26
  end
30
27
  end
@@ -4,27 +4,24 @@ module AArch64
4
4
  # Authenticate Data address, using key B
5
5
  # AUTDB <Xd>, <Xn|SP>
6
6
  # AUTDZB <Xd>
7
- class AUTDB
8
- def initialize d, n
9
- @d = d
10
- @n = n
7
+ class AUTDB < Instruction
8
+ def initialize z, rd, rn
9
+ @z = check_mask(z, 0x01)
10
+ @rd = check_mask(rd, 0x1f)
11
+ @rn = check_mask(rn, 0x1f)
11
12
  end
12
13
 
13
14
  def encode
14
- if @n.integer?
15
- AUTDB(1, @n.to_i, @d.to_i)
16
- else
17
- AUTDB(0, @n.to_i, @d.to_i)
18
- end
15
+ AUTDB(@z, @rn, @rd)
19
16
  end
20
17
 
21
18
  private
22
19
 
23
20
  def AUTDB z, rn, rd
24
21
  insn = 0b1_1_0_11010110_00001_0_0_0_111_00000_00000
25
- insn |= ((z & 0x1) << 13)
26
- insn |= ((rn & 0x1f) << 5)
27
- insn |= (rd & 0x1f)
22
+ insn |= ((z) << 13)
23
+ insn |= ((rn) << 5)
24
+ insn |= (rd)
28
25
  insn
29
26
  end
30
27
  end
@@ -7,27 +7,24 @@ module AArch64
7
7
  # AUTIA1716
8
8
  # AUTIASP
9
9
  # AUTIAZ
10
- class AUTIA
11
- def initialize d, n
12
- @d = d
13
- @n = n
10
+ class AUTIA < Instruction
11
+ def initialize z, rd, rn
12
+ @z = check_mask(z, 0x01)
13
+ @rd = check_mask(rd, 0x1f)
14
+ @rn = check_mask(rn, 0x1f)
14
15
  end
15
16
 
16
17
  def encode
17
- if @n.integer?
18
- AUTIA(1, @n.to_i, @d.to_i)
19
- else
20
- AUTIA(0, @n.to_i, @d.to_i)
21
- end
18
+ AUTIA(@z, @rn, @rd)
22
19
  end
23
20
 
24
21
  private
25
22
 
26
23
  def AUTIA z, rn, rd
27
24
  insn = 0b1_1_0_11010110_00001_0_0_0_100_00000_00000
28
- insn |= ((z & 0x1) << 13)
29
- insn |= ((rn & 0x1f) << 5)
30
- insn |= (rd & 0x1f)
25
+ insn |= ((z) << 13)
26
+ insn |= ((rn) << 5)
27
+ insn |= (rd)
31
28
  insn
32
29
  end
33
30
  end
@@ -7,27 +7,24 @@ module AArch64
7
7
  # AUTIB1716
8
8
  # AUTIBSP
9
9
  # AUTIBZ
10
- class AUTIB
11
- def initialize d, n
12
- @d = d
13
- @n = n
10
+ class AUTIB < Instruction
11
+ def initialize z, rd, rn
12
+ @z = check_mask(z, 0x01)
13
+ @rd = check_mask(rd, 0x1f)
14
+ @rn = check_mask(rn, 0x1f)
14
15
  end
15
16
 
16
17
  def encode
17
- if @n.integer?
18
- AUTIB(1, @n.to_i, @d.to_i)
19
- else
20
- AUTIB(0, @n.to_i, @d.to_i)
21
- end
18
+ AUTIB(@z, @rn, @rd)
22
19
  end
23
20
 
24
21
  private
25
22
 
26
23
  def AUTIB z, rn, rd
27
24
  insn = 0b1_1_0_11010110_00001_0_0_0_101_00000_00000
28
- insn |= ((z & 0x1) << 13)
29
- insn |= ((rn & 0x1f) << 5)
30
- insn |= (rd & 0x1f)
25
+ insn |= ((z) << 13)
26
+ insn |= ((rn) << 5)
27
+ insn |= (rd)
31
28
  insn
32
29
  end
33
30
  end
@@ -3,7 +3,7 @@ module AArch64
3
3
  # AXFLAG -- A64
4
4
  # Convert floating-point condition flags from Arm to external format
5
5
  # AXFLAG
6
- class AXFLAG
6
+ class AXFLAG < Instruction
7
7
  def encode
8
8
  0b1101010100_0_00_000_0100_0000_010_11111
9
9
  end
@@ -3,22 +3,22 @@ module AArch64
3
3
  # B.cond -- A64
4
4
  # Branch conditionally
5
5
  # B.<cond> <label>
6
- class B_cond
6
+ class B_cond < Instruction
7
7
  def initialize cond, label
8
- @cond = cond
8
+ @cond = check_mask(cond, 0xf)
9
9
  @label = label
10
10
  end
11
11
 
12
12
  def encode
13
- B_cond(@label.to_i / 4, Utils.cond2bin(@cond))
13
+ B_cond(check_mask(unwrap_label(@label), 0x7ffff), @cond)
14
14
  end
15
15
 
16
16
  private
17
17
 
18
18
  def B_cond imm19, cond
19
19
  insn = 0b0101010_0_0000000000000000000_0_0000
20
- insn |= ((imm19 & 0x7ffff) << 5)
21
- insn |= (cond & 0xf)
20
+ insn |= (imm19 << 5)
21
+ insn |= cond
22
22
  insn
23
23
  end
24
24
  end
@@ -3,20 +3,20 @@ module AArch64
3
3
  # B -- A64
4
4
  # Branch
5
5
  # B <label>
6
- class B_uncond
6
+ class B_uncond < Instruction
7
7
  def initialize label
8
8
  @label = label
9
9
  end
10
10
 
11
11
  def encode
12
- B_uncond(@label.to_i / 4)
12
+ B_uncond(check_mask(unwrap_label(@label), 0x3ffffff))
13
13
  end
14
14
 
15
15
  private
16
16
 
17
17
  def B_uncond imm26
18
18
  insn = 0b0_00101_00000000000000000000000000
19
- insn |= (imm26 & 0x3ffffff)
19
+ insn |= imm26
20
20
  insn
21
21
  end
22
22
  end
@@ -3,22 +3,22 @@ module AArch64
3
3
  # BC.cond -- A64
4
4
  # Branch Consistent conditionally
5
5
  # BC.<cond> <label>
6
- class BC_cond
6
+ class BC_cond < Instruction
7
7
  def initialize cond, label
8
- @cond = cond
8
+ @cond = check_mask(cond, 0xf)
9
9
  @label = label
10
10
  end
11
11
 
12
12
  def encode
13
- BC_cond(@label.to_i / 4, Utils.cond2bin(@cond))
13
+ BC_cond(check_mask(unwrap_label(@label), 0x7ffff), @cond)
14
14
  end
15
15
 
16
16
  private
17
17
 
18
18
  def BC_cond imm19, cond
19
19
  insn = 0b0101010_0_0000000000000000000_1_0000
20
- insn |= ((imm19 & 0x7ffff) << 5)
21
- insn |= (cond & 0xf)
20
+ insn |= (imm19 << 5)
21
+ insn |= cond
22
22
  insn
23
23
  end
24
24
  end
@@ -4,29 +4,29 @@ module AArch64
4
4
  # Bitfield Move
5
5
  # BFM <Wd>, <Wn>, #<immr>, #<imms>
6
6
  # BFM <Xd>, <Xn>, #<immr>, #<imms>
7
- class BFM
7
+ class BFM < Instruction
8
8
  def initialize d, n, immr, imms, sf
9
- @d = d
10
- @n = n
11
- @immr = immr
12
- @imms = imms
13
- @sf = sf
9
+ @d = check_mask(d, 0x1f)
10
+ @n = check_mask(n, 0x1f)
11
+ @immr = check_mask(immr, 0x3f)
12
+ @imms = check_mask(imms, 0x3f)
13
+ @sf = check_mask(sf, 0x01)
14
14
  end
15
15
 
16
16
  def encode
17
- BFM(@sf, @sf, @immr, @imms, @n.to_i, @d.to_i)
17
+ BFM(@sf, @sf, @immr, @imms, @n, @d)
18
18
  end
19
19
 
20
20
  private
21
21
 
22
22
  def BFM sf, n, immr, imms, rn, rd
23
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)
24
+ insn |= ((sf) << 31)
25
+ insn |= ((n) << 22)
26
+ insn |= ((immr) << 16)
27
+ insn |= ((imms) << 10)
28
+ insn |= ((rn) << 5)
29
+ insn |= (rd)
30
30
  insn
31
31
  end
32
32
  end
@@ -4,30 +4,30 @@ module AArch64
4
4
  # Bitwise Bit Clear (shifted register)
5
5
  # BIC <Wd>, <Wn>, <Wm>{, <shift> #<amount>}
6
6
  # BIC <Xd>, <Xn>, <Xm>{, <shift> #<amount>}
7
- class BIC_log_shift
7
+ class BIC_log_shift < Instruction
8
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
9
+ @d = check_mask(d, 0x1f)
10
+ @n = check_mask(n, 0x1f)
11
+ @m = check_mask(m, 0x1f)
12
+ @shift = check_mask(shift, 0x03)
13
+ @amount = check_mask(amount, 0x3f)
14
+ @sf = check_mask(sf, 0x01)
15
15
  end
16
16
 
17
17
  def encode
18
- BIC_log_shift(@sf, @shift, @m.to_i, @amount, @n.to_i, @d.to_i)
18
+ BIC_log_shift(@sf, @shift, @m, @amount, @n, @d)
19
19
  end
20
20
 
21
21
  private
22
22
 
23
23
  def BIC_log_shift sf, shift, rm, imm6, rn, rd
24
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)
25
+ insn |= ((sf) << 31)
26
+ insn |= ((shift) << 22)
27
+ insn |= ((rm) << 16)
28
+ insn |= ((imm6) << 10)
29
+ insn |= ((rn) << 5)
30
+ insn |= (rd)
31
31
  insn
32
32
  end
33
33
  end
@@ -4,30 +4,30 @@ module AArch64
4
4
  # Bitwise Bit Clear (shifted register), setting flags
5
5
  # BICS <Wd>, <Wn>, <Wm>{, <shift> #<amount>}
6
6
  # BICS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}
7
- class BICS
7
+ class BICS < Instruction
8
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
9
+ @d = check_mask(d, 0x1f)
10
+ @n = check_mask(n, 0x1f)
11
+ @m = check_mask(m, 0x1f)
12
+ @shift = check_mask(shift, 0x03)
13
+ @amount = check_mask(amount, 0x3f)
14
+ @sf = check_mask(sf, 0x01)
15
15
  end
16
16
 
17
17
  def encode
18
- BICS(@sf, @shift, @m.to_i, @amount, @n.to_i, @d.to_i)
18
+ BICS(@sf, @shift, @m, @amount, @n, @d)
19
19
  end
20
20
 
21
21
  private
22
22
 
23
23
  def BICS sf, shift, rm, imm6, rn, rd
24
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)
25
+ insn |= ((sf) << 31)
26
+ insn |= ((shift) << 22)
27
+ insn |= ((rm) << 16)
28
+ insn |= ((imm6) << 10)
29
+ insn |= ((rn) << 5)
30
+ insn |= (rd)
31
31
  insn
32
32
  end
33
33
  end
@@ -3,20 +3,20 @@ module AArch64
3
3
  # BL -- A64
4
4
  # Branch with Link
5
5
  # BL <label>
6
- class BL
6
+ class BL < Instruction
7
7
  def initialize label
8
8
  @label = label
9
9
  end
10
10
 
11
11
  def encode
12
- BL(@label.to_i / 4)
12
+ BL(check_mask(unwrap_label(@label), 0x3ffffff))
13
13
  end
14
14
 
15
15
  private
16
16
 
17
17
  def BL imm26
18
18
  insn = 0b1_00101_00000000000000000000000000
19
- insn |= (imm26 & 0x3ffffff)
19
+ insn |= imm26
20
20
  insn
21
21
  end
22
22
  end
@@ -3,20 +3,20 @@ module AArch64
3
3
  # BLR -- A64
4
4
  # Branch with Link to Register
5
5
  # BLR <Xn>
6
- class BLR
6
+ class BLR < Instruction
7
7
  def initialize n
8
- @n = n
8
+ @n = check_mask(n, 0x1f)
9
9
  end
10
10
 
11
11
  def encode
12
- BLR(@n.to_i)
12
+ BLR(@n)
13
13
  end
14
14
 
15
15
  private
16
16
 
17
17
  def BLR rn
18
18
  insn = 0b1101011_0_0_01_11111_0000_0_0_00000_00000
19
- insn |= ((rn & 0x1f) << 5)
19
+ insn |= ((rn) << 5)
20
20
  insn
21
21
  end
22
22
  end
@@ -6,26 +6,26 @@ module AArch64
6
6
  # BLRAA <Xn>, <Xm|SP>
7
7
  # BLRABZ <Xn>
8
8
  # BLRAB <Xn>, <Xm|SP>
9
- class BLRA
9
+ class BLRA < Instruction
10
10
  def initialize rn, rm, z, m
11
- @rn = rn
12
- @rm = rm
13
- @z = z
14
- @m = m
11
+ @rn = check_mask(rn, 0x1f)
12
+ @rm = check_mask(rm, 0x1f)
13
+ @z = check_mask(z, 0x01)
14
+ @m = check_mask(m, 0x01)
15
15
  end
16
16
 
17
17
  def encode
18
- BLRA(@z, @m, @rn.to_i, @rm.to_i)
18
+ BLRA(@z, @m, @rn, @rm)
19
19
  end
20
20
 
21
21
  private
22
22
 
23
23
  def BLRA z, m, rn, rm
24
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)
25
+ insn |= ((z) << 24)
26
+ insn |= ((m) << 10)
27
+ insn |= ((rn) << 5)
28
+ insn |= (rm)
29
29
  insn
30
30
  end
31
31
  end
@@ -3,20 +3,20 @@ module AArch64
3
3
  # BR -- A64
4
4
  # Branch to Register
5
5
  # BR <Xn>
6
- class BR
6
+ class BR < Instruction
7
7
  def initialize rn
8
- @rn = rn
8
+ @rn = check_mask(rn, 0x1f)
9
9
  end
10
10
 
11
11
  def encode
12
- BR(@rn.to_i)
12
+ BR(@rn)
13
13
  end
14
14
 
15
15
  private
16
16
 
17
17
  def BR rn
18
18
  insn = 0b1101011_0_0_00_11111_0000_0_0_00000_00000
19
- insn |= ((rn & 0x1f) << 5)
19
+ insn |= ((rn) << 5)
20
20
  insn
21
21
  end
22
22
  end
@@ -6,26 +6,26 @@ module AArch64
6
6
  # BRAA <Xn>, <Xm|SP>
7
7
  # BRABZ <Xn>
8
8
  # BRAB <Xn>, <Xm|SP>
9
- class BRA
9
+ class BRA < Instruction
10
10
  def initialize rn, rm, z, m
11
- @rn = rn
12
- @rm = rm
13
- @z = z
14
- @m = m
11
+ @rn = check_mask(rn, 0x1f)
12
+ @rm = check_mask(rm, 0x1f)
13
+ @z = check_mask(z, 0x01)
14
+ @m = check_mask(m, 0x01)
15
15
  end
16
16
 
17
17
  def encode
18
- BRA(@z, @m, @rn.to_i, @rm.to_i)
18
+ BRA(@z, @m, @rn, @rm)
19
19
  end
20
20
 
21
21
  private
22
22
 
23
23
  def BRA z, m, rn, rm
24
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)
25
+ insn |= ((z) << 24)
26
+ insn |= ((m) << 10)
27
+ insn |= ((rn) << 5)
28
+ insn |= (rm)
29
29
  insn
30
30
  end
31
31
  end
@@ -3,9 +3,9 @@ module AArch64
3
3
  # BRK -- A64
4
4
  # Breakpoint instruction
5
5
  # BRK #<imm>
6
- class BRK
6
+ class BRK < Instruction
7
7
  def initialize imm
8
- @imm = imm
8
+ @imm = check_mask(imm, 0xffff)
9
9
  end
10
10
 
11
11
  def encode
@@ -16,7 +16,7 @@ module AArch64
16
16
 
17
17
  def BRK imm16
18
18
  insn = 0b11010100_001_0000000000000000_000_00
19
- insn |= ((imm16 & 0xffff) << 5)
19
+ insn |= ((imm16) << 5)
20
20
  insn
21
21
  end
22
22
  end
@@ -3,9 +3,9 @@ module AArch64
3
3
  # BTI -- A64
4
4
  # Branch Target Identification
5
5
  # BTI {<targets>}
6
- class BTI
6
+ class BTI < Instruction
7
7
  def initialize target
8
- @target = target
8
+ @target = check_mask(target, 0x03)
9
9
  end
10
10
 
11
11
  def encode
@@ -16,7 +16,7 @@ module AArch64
16
16
 
17
17
  def BTI target
18
18
  insn = 0b1101010100_0_00_011_0010_0100_000_11111
19
- insn |= ((target & 0x3) << 5)
19
+ insn |= ((target) << 5)
20
20
  insn
21
21
  end
22
22
  end