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,28 +4,28 @@ module AArch64
4
4
  # Conditional Select Increment
5
5
  # CSINC <Wd>, <Wn>, <Wm>, <cond>
6
6
  # CSINC <Xd>, <Xn>, <Xm>, <cond>
7
- class CSINC
7
+ class CSINC < Instruction
8
8
  def initialize rd, rn, rm, cond, sf
9
- @rd = rd
10
- @rn = rn
11
- @rm = rm
12
- @cond = cond
13
- @sf = sf
9
+ @rd = check_mask(rd, 0x1f)
10
+ @rn = check_mask(rn, 0x1f)
11
+ @rm = check_mask(rm, 0x1f)
12
+ @cond = check_mask(cond, 0x0f)
13
+ @sf = check_mask(sf, 0x01)
14
14
  end
15
15
 
16
16
  def encode
17
- CSINC(@sf, @rm.to_i, @cond, @rn.to_i, @rd.to_i)
17
+ CSINC(@sf, @rm, @cond, @rn, @rd)
18
18
  end
19
19
 
20
20
  private
21
21
 
22
22
  def CSINC sf, rm, cond, rn, rd
23
23
  insn = 0b0_0_0_11010100_00000_0000_0_1_00000_00000
24
- insn |= ((sf & 0x1) << 31)
25
- insn |= ((rm & 0x1f) << 16)
26
- insn |= ((cond & 0xf) << 12)
27
- insn |= ((rn & 0x1f) << 5)
28
- insn |= (rd & 0x1f)
24
+ insn |= ((sf) << 31)
25
+ insn |= ((rm) << 16)
26
+ insn |= ((cond) << 12)
27
+ insn |= ((rn) << 5)
28
+ insn |= (rd)
29
29
  insn
30
30
  end
31
31
  end
@@ -4,28 +4,28 @@ module AArch64
4
4
  # Conditional Select Invert
5
5
  # CSINV <Wd>, <Wn>, <Wm>, <cond>
6
6
  # CSINV <Xd>, <Xn>, <Xm>, <cond>
7
- class CSINV
7
+ class CSINV < Instruction
8
8
  def initialize rd, rn, rm, cond, sf
9
- @rd = rd
10
- @rn = rn
11
- @rm = rm
12
- @cond = cond
13
- @sf = sf
9
+ @rd = check_mask(rd, 0x1f)
10
+ @rn = check_mask(rn, 0x1f)
11
+ @rm = check_mask(rm, 0x1f)
12
+ @cond = check_mask(cond, 0x0f)
13
+ @sf = check_mask(sf, 0x01)
14
14
  end
15
15
 
16
16
  def encode
17
- CSINV(@sf, @rm.to_i, @cond, @rn.to_i, @rd.to_i)
17
+ CSINV(@sf, @rm, @cond, @rn, @rd)
18
18
  end
19
19
 
20
20
  private
21
21
 
22
22
  def CSINV sf, rm, cond, rn, rd
23
23
  insn = 0b0_1_0_11010100_00000_0000_0_0_00000_00000
24
- insn |= ((sf & 0x1) << 31)
25
- insn |= ((rm & 0x1f) << 16)
26
- insn |= ((cond & 0xf) << 12)
27
- insn |= ((rn & 0x1f) << 5)
28
- insn |= (rd & 0x1f)
24
+ insn |= ((sf) << 31)
25
+ insn |= ((rm) << 16)
26
+ insn |= ((cond) << 12)
27
+ insn |= ((rn) << 5)
28
+ insn |= (rd)
29
29
  insn
30
30
  end
31
31
  end
@@ -4,28 +4,28 @@ module AArch64
4
4
  # Conditional Select Negation
5
5
  # CSNEG <Wd>, <Wn>, <Wm>, <cond>
6
6
  # CSNEG <Xd>, <Xn>, <Xm>, <cond>
7
- class CSNEG
7
+ class CSNEG < Instruction
8
8
  def initialize rd, rn, rm, cond, sf
9
- @rd = rd
10
- @rn = rn
11
- @rm = rm
12
- @cond = cond
13
- @sf = sf
9
+ @rd = check_mask(rd, 0x1f)
10
+ @rn = check_mask(rn, 0x1f)
11
+ @rm = check_mask(rm, 0x1f)
12
+ @cond = check_mask(cond, 0x0f)
13
+ @sf = check_mask(sf, 0x01)
14
14
  end
15
15
 
16
16
  def encode
17
- CSNEG(@sf, @rm.to_i, @cond, @rn.to_i, @rd.to_i)
17
+ CSNEG(@sf, @rm, @cond, @rn, @rd)
18
18
  end
19
19
 
20
20
  private
21
21
 
22
22
  def CSNEG sf, rm, cond, rn, rd
23
23
  insn = 0b0_1_0_11010100_00000_0000_0_1_00000_00000
24
- insn |= ((sf & 0x1) << 31)
25
- insn |= ((rm & 0x1f) << 16)
26
- insn |= ((cond & 0xf) << 12)
27
- insn |= ((rn & 0x1f) << 5)
28
- insn |= (rd & 0x1f)
24
+ insn |= ((sf) << 31)
25
+ insn |= ((rm) << 16)
26
+ insn |= ((cond) << 12)
27
+ insn |= ((rn) << 5)
28
+ insn |= (rd)
29
29
  insn
30
30
  end
31
31
  end
@@ -3,10 +3,10 @@ module AArch64
3
3
  # DCPS1 -- A64
4
4
  # Debug Change PE State to EL1.
5
5
  # DCPS1 {#<imm>}
6
- class DCPS
6
+ class DCPS < Instruction
7
7
  def initialize imm, ll
8
- @imm = imm
9
- @ll = ll
8
+ @imm = check_mask(imm, 0xffff)
9
+ @ll = check_mask(ll, 0x03)
10
10
  end
11
11
 
12
12
  def encode
@@ -17,8 +17,8 @@ module AArch64
17
17
 
18
18
  def DCPS imm16, ll
19
19
  insn = 0b11010100_101_0000000000000000_000_00
20
- insn |= ((imm16 & 0xffff) << 5)
21
- insn |= (ll & 0x3)
20
+ insn |= ((imm16) << 5)
21
+ insn |= (ll)
22
22
  insn
23
23
  end
24
24
  end
@@ -3,7 +3,7 @@ module AArch64
3
3
  # DGH -- A64
4
4
  # Data Gathering Hint
5
5
  # DGH
6
- class DGH
6
+ class DGH < Instruction
7
7
  def encode
8
8
  0b1101010100_0_00_011_0010_0000_110_11111
9
9
  end
@@ -3,9 +3,9 @@ module AArch64
3
3
  # DMB -- A64
4
4
  # Data Memory Barrier
5
5
  # DMB <option>|#<imm>
6
- class DMB
6
+ class DMB < Instruction
7
7
  def initialize imm
8
- @imm = imm
8
+ @imm = check_mask(imm, 0x0f)
9
9
  end
10
10
 
11
11
  def encode
@@ -16,7 +16,7 @@ module AArch64
16
16
 
17
17
  def DMB crm
18
18
  insn = 0b1101010100_0_00_011_0011_0000_1_01_11111
19
- insn |= ((crm & 0xf) << 8)
19
+ insn |= ((crm) << 8)
20
20
  insn
21
21
  end
22
22
  end
@@ -3,16 +3,9 @@ module AArch64
3
3
  # DRPS -- A64
4
4
  # Debug restore process state
5
5
  # DRPS
6
- class DRPS
6
+ class DRPS < Instruction
7
7
  def encode
8
- DRPS()
9
- end
10
-
11
- private
12
-
13
- def DRPS
14
- insn = 0b1101011_0101_11111_000000_11111_00000
15
- insn
8
+ 0b1101011_0101_11111_000000_11111_00000
16
9
  end
17
10
  end
18
11
  end
@@ -4,9 +4,9 @@ module AArch64
4
4
  # Data Synchronization Barrier
5
5
  # DSB <option>|#<imm>
6
6
  # DSB <option>nXS|#<imm>
7
- class DSB
7
+ class DSB < Instruction
8
8
  def initialize imm
9
- @imm = imm
9
+ @imm = check_mask(imm, 0x0f)
10
10
  end
11
11
 
12
12
  def encode
@@ -17,7 +17,7 @@ module AArch64
17
17
 
18
18
  def DSB crm
19
19
  insn = 0b1101010100_0_00_011_0011_0000_1_00_11111
20
- insn |= ((crm & 0xf) << 8)
20
+ insn |= ((crm) << 8)
21
21
  insn
22
22
  end
23
23
  end
@@ -4,30 +4,30 @@ module AArch64
4
4
  # Bitwise Exclusive OR NOT (shifted register)
5
5
  # EON <Wd>, <Wn>, <Wm>{, <shift> #<amount>}
6
6
  # EON <Xd>, <Xn>, <Xm>{, <shift> #<amount>}
7
- class EON
7
+ class EON < Instruction
8
8
  def initialize rd, rn, rm, shift, imm, sf
9
- @rd = rd
10
- @rn = rn
11
- @rm = rm
12
- @shift = shift
13
- @imm = imm
14
- @sf = sf
9
+ @rd = check_mask(rd, 0x1f)
10
+ @rn = check_mask(rn, 0x1f)
11
+ @rm = check_mask(rm, 0x1f)
12
+ @shift = check_mask(shift, 0x03)
13
+ @imm = check_mask(imm, 0x3f)
14
+ @sf = check_mask(sf, 0x01)
15
15
  end
16
16
 
17
17
  def encode
18
- EON(@sf, @shift, @rm.to_i, @imm, @rn.to_i, @rd.to_i)
18
+ EON(@sf, @shift, @rm, @imm, @rn, @rd)
19
19
  end
20
20
 
21
21
  private
22
22
 
23
23
  def EON sf, shift, rm, imm6, rn, rd
24
24
  insn = 0b0_10_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 Exclusive OR (immediate)
5
5
  # EOR <Wd|WSP>, <Wn>, #<imm>
6
6
  # EOR <Xd|SP>, <Xn>, #<imm>
7
- class EOR_log_imm
7
+ class EOR_log_imm < Instruction
8
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
9
+ @rd = check_mask(rd, 0x1f)
10
+ @rn = check_mask(rn, 0x1f)
11
+ @n = check_mask(n, 0x01)
12
+ @immr = check_mask(immr, 0x3f)
13
+ @imms = check_mask(imms, 0x3f)
14
+ @sf = check_mask(sf, 0x01)
15
15
  end
16
16
 
17
17
  def encode
18
- EOR_log_imm(@sf, @n, @immr, @imms, @rn.to_i, @rd.to_i)
18
+ EOR_log_imm(@sf, @n, @immr, @imms, @rn, @rd)
19
19
  end
20
20
 
21
21
  private
22
22
 
23
23
  def EOR_log_imm sf, n, immr, imms, rn, rd
24
24
  insn = 0b0_10_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)
25
+ insn |= ((sf) << 31)
26
+ insn |= ((n) << 22)
27
+ insn |= ((immr) << 16)
28
+ insn |= ((imms) << 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 Exclusive OR (shifted register)
5
5
  # EOR <Wd>, <Wn>, <Wm>{, <shift> #<amount>}
6
6
  # EOR <Xd>, <Xn>, <Xm>{, <shift> #<amount>}
7
- class EOR_log_shift
7
+ class EOR_log_shift < Instruction
8
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
9
+ @rd = check_mask(rd, 0x1f)
10
+ @rn = check_mask(rn, 0x1f)
11
+ @rm = check_mask(rm, 0x1f)
12
+ @shift = check_mask(shift, 0x03)
13
+ @imm6 = check_mask(imm6, 0x3f)
14
+ @sf = check_mask(sf, 0x01)
15
15
  end
16
16
 
17
17
  def encode
18
- EOR_log_shift(@sf, @shift, @rm.to_i, @imm6, @rn.to_i, @rd.to_i)
18
+ EOR_log_shift(@sf, @shift, @rm, @imm6, @rn, @rd)
19
19
  end
20
20
 
21
21
  private
22
22
 
23
23
  def EOR_log_shift sf, shift, rm, imm6, rn, rd
24
24
  insn = 0b0_10_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
@@ -3,16 +3,9 @@ module AArch64
3
3
  # ERET -- A64
4
4
  # Exception Return
5
5
  # ERET
6
- class ERET
6
+ class ERET < Instruction
7
7
  def encode
8
- ERET()
9
- end
10
-
11
- private
12
-
13
- def ERET
14
- insn = 0b1101011_0_100_11111_0000_0_0_11111_00000
15
- insn
8
+ 0b1101011_0_100_11111_0000_0_0_11111_00000
16
9
  end
17
10
  end
18
11
  end
@@ -4,9 +4,9 @@ module AArch64
4
4
  # Exception Return, with pointer authentication
5
5
  # ERETAA
6
6
  # ERETAB
7
- class ERETA
7
+ class ERETA < Instruction
8
8
  def initialize m
9
- @m = m
9
+ @m = check_mask(m, 0x01)
10
10
  end
11
11
 
12
12
  def encode
@@ -17,7 +17,7 @@ module AArch64
17
17
 
18
18
  def ERETA m
19
19
  insn = 0b1101011_0_100_11111_0000_1_0_11111_11111
20
- insn |= ((m & 0x1) << 10)
20
+ insn |= ((m) << 10)
21
21
  insn
22
22
  end
23
23
  end
@@ -3,7 +3,7 @@ module AArch64
3
3
  # ESB -- A64
4
4
  # Error Synchronization Barrier
5
5
  # ESB
6
- class ESB
6
+ class ESB < Instruction
7
7
  def encode
8
8
  0b1101010100_0_00_011_0010_0010_000_11111
9
9
  end
@@ -4,29 +4,29 @@ module AArch64
4
4
  # Extract register
5
5
  # EXTR <Wd>, <Wn>, <Wm>, #<lsb>
6
6
  # EXTR <Xd>, <Xn>, <Xm>, #<lsb>
7
- class EXTR
7
+ class EXTR < Instruction
8
8
  def initialize rd, rn, rm, lsb, sf
9
- @rd = rd
10
- @rn = rn
11
- @rm = rm
12
- @lsb = lsb
13
- @sf = sf
9
+ @rd = check_mask(rd, 0x1f)
10
+ @rn = check_mask(rn, 0x1f)
11
+ @rm = check_mask(rm, 0x1f)
12
+ @lsb = check_mask(lsb, 0x3f)
13
+ @sf = check_mask(sf, 0x01)
14
14
  end
15
15
 
16
16
  def encode
17
- EXTR(@sf, @sf, @rm.to_i, @lsb, @rn.to_i, @rd.to_i)
17
+ EXTR(@sf, @sf, @rm, @lsb, @rn, @rd)
18
18
  end
19
19
 
20
20
  private
21
21
 
22
22
  def EXTR sf, n, rm, imms, rn, rd
23
23
  insn = 0b0_00_100111_0_0_00000_000000_00000_00000
24
- insn |= ((sf & 0x1) << 31)
25
- insn |= ((n & 0x1) << 22)
26
- insn |= ((rm & 0x1f) << 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 |= ((rm) << 16)
27
+ insn |= ((imms) << 10)
28
+ insn |= ((rn) << 5)
29
+ insn |= (rd)
30
30
  insn
31
31
  end
32
32
  end
@@ -3,24 +3,24 @@ module AArch64
3
3
  # GMI -- A64
4
4
  # Tag Mask Insert
5
5
  # GMI <Xd>, <Xn|SP>, <Xm>
6
- class GMI
6
+ class GMI < Instruction
7
7
  def initialize rd, rn, rm
8
- @rd = rd
9
- @rn = rn
10
- @rm = rm
8
+ @rd = check_mask(rd, 0x1f)
9
+ @rn = check_mask(rn, 0x1f)
10
+ @rm = check_mask(rm, 0x1f)
11
11
  end
12
12
 
13
13
  def encode
14
- GMI(@rm.to_i, @rn.to_i, @rd.to_i)
14
+ GMI(@rm, @rn, @rd)
15
15
  end
16
16
 
17
17
  private
18
18
 
19
19
  def GMI xm, xn, xd
20
20
  insn = 0b1_0_0_11010110_00000_0_0_0_1_0_1_00000_00000
21
- insn |= ((xm & 0x1f) << 16)
22
- insn |= ((xn & 0x1f) << 5)
23
- insn |= (xd & 0x1f)
21
+ insn |= ((xm) << 16)
22
+ insn |= ((xn) << 5)
23
+ insn |= (xd)
24
24
  insn
25
25
  end
26
26
  end
@@ -3,10 +3,10 @@ module AArch64
3
3
  # HINT -- A64
4
4
  # Hint instruction
5
5
  # HINT #<imm>
6
- class HINT
6
+ class HINT < Instruction
7
7
  def initialize crm, op2
8
- @crm = crm
9
- @op2 = op2
8
+ @crm = check_mask(crm, 0x0f)
9
+ @op2 = check_mask(op2, 0x07)
10
10
  end
11
11
 
12
12
  def encode
@@ -17,8 +17,8 @@ module AArch64
17
17
 
18
18
  def HINT crm, op2
19
19
  insn = 0b1101010100_0_00_011_0010_0000_000_11111
20
- insn |= ((crm & 0xf) << 8)
21
- insn |= ((op2 & 0x7) << 5)
20
+ insn |= ((crm) << 8)
21
+ insn |= ((op2) << 5)
22
22
  insn
23
23
  end
24
24
  end
@@ -3,9 +3,9 @@ module AArch64
3
3
  # HLT -- A64
4
4
  # Halt instruction
5
5
  # HLT #<imm>
6
- class HLT
6
+ class HLT < 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 HLT imm16
18
18
  insn = 0b11010100_010_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
  # HVC -- A64
4
4
  # Hypervisor Call
5
5
  # HVC #<imm>
6
- class HVC
6
+ class HVC < 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 HVC imm16
18
18
  insn = 0b11010100_000_0000000000000000_000_10
19
- insn |= ((imm16 & 0xffff) << 5)
19
+ insn |= ((imm16) << 5)
20
20
  insn
21
21
  end
22
22
  end
@@ -3,24 +3,24 @@ module AArch64
3
3
  # IRG -- A64
4
4
  # Insert Random Tag
5
5
  # IRG <Xd|SP>, <Xn|SP>{, <Xm>}
6
- class IRG
6
+ class IRG < Instruction
7
7
  def initialize rd, rn, rm
8
- @rd = rd
9
- @rn = rn
10
- @rm = rm
8
+ @rd = check_mask(rd, 0x1f)
9
+ @rn = check_mask(rn, 0x1f)
10
+ @rm = check_mask(rm, 0x1f)
11
11
  end
12
12
 
13
13
  def encode
14
- IRG(@rm.to_i, @rn.to_i, @rd.to_i)
14
+ IRG(@rm, @rn, @rd)
15
15
  end
16
16
 
17
17
  private
18
18
 
19
19
  def IRG xm, xn, xd
20
20
  insn = 0b1_0_0_11010110_00000_0_0_0_1_0_0_00000_00000
21
- insn |= ((xm & 0x1f) << 16)
22
- insn |= ((xn & 0x1f) << 5)
23
- insn |= (xd & 0x1f)
21
+ insn |= ((xm) << 16)
22
+ insn |= ((xn) << 5)
23
+ insn |= (xd)
24
24
  insn
25
25
  end
26
26
  end
@@ -3,9 +3,9 @@ module AArch64
3
3
  # ISB -- A64
4
4
  # Instruction Synchronization Barrier
5
5
  # ISB {<option>|#<imm>}
6
- class ISB
6
+ class ISB < Instruction
7
7
  def initialize imm
8
- @imm = imm
8
+ @imm = check_mask(imm, 0x0f)
9
9
  end
10
10
 
11
11
  def encode
@@ -16,7 +16,7 @@ module AArch64
16
16
 
17
17
  def ISB crm
18
18
  insn = 0b1101010100_0_00_011_0011_0000_1_10_11111
19
- insn |= ((crm & 0xf) << 8)
19
+ insn |= ((crm) << 8)
20
20
  insn
21
21
  end
22
22
  end
@@ -3,22 +3,22 @@ module AArch64
3
3
  # LD64B -- A64
4
4
  # Single-copy Atomic 64-byte Load
5
5
  # LD64B <Xt>, [<Xn|SP> {,#0}]
6
- class LD64B
6
+ class LD64B < Instruction
7
7
  def initialize rt, rn
8
- @rt = rt
9
- @rn = rn
8
+ @rt = check_mask(rt, 0x1f)
9
+ @rn = check_mask(rn, 0x1f)
10
10
  end
11
11
 
12
12
  def encode
13
- LD64B(@rn.to_i, @rt.to_i)
13
+ LD64B(@rn, @rt)
14
14
  end
15
15
 
16
16
  private
17
17
 
18
18
  def LD64B rn, rt
19
19
  insn = 0b11_111_0_00_0_0_1_11111_1_101_00_00000_00000
20
- insn |= ((rn & 0x1f) << 5)
21
- insn |= (rt & 0x1f)
20
+ insn |= ((rn) << 5)
21
+ insn |= (rt)
22
22
  insn
23
23
  end
24
24
  end