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
data/lib/aarch64/utils.rb CHANGED
@@ -321,5 +321,39 @@ module AArch64
321
321
  AT_TABLE.fetch at_op
322
322
  end
323
323
  module_function :at_op
324
+
325
+ def sub_decode_extend32 extend
326
+ case extend
327
+ when :uxtb then 0b000
328
+ when :uxth then 0b001
329
+ when :uxtw then 0b010
330
+ when :lsl then 0b010
331
+ when :uxtx then 0b011
332
+ when :sxtb then 0b100
333
+ when :sxth then 0b101
334
+ when :sxtw then 0b110
335
+ when :sxtx then 0b111
336
+ else
337
+ raise "Unknown extend #{extend}"
338
+ end
339
+ end
340
+ module_function :sub_decode_extend32
341
+
342
+ def sub_decode_extend64 extend
343
+ case extend
344
+ when :uxtb then 0b000
345
+ when :uxth then 0b001
346
+ when :uxtw then 0b011
347
+ when :lsl then 0b011
348
+ when :uxtx then 0b011
349
+ when :sxtb then 0b100
350
+ when :sxth then 0b101
351
+ when :sxtw then 0b110
352
+ when :sxtx then 0b111
353
+ else
354
+ raise "Unknown extend #{extend}"
355
+ end
356
+ end
357
+ module_function :sub_decode_extend64
324
358
  end
325
359
  end
@@ -1,3 +1,3 @@
1
1
  module AArch64
2
- VERSION = "1.0.1"
2
+ VERSION = "2.0.0"
3
3
  end
data/lib/aarch64.rb CHANGED
@@ -16,6 +16,7 @@ module AArch64
16
16
  def size; 64; end
17
17
  def sf; 1; end
18
18
  def sizeb; 0b11; end
19
+ def sz; 0b1; end
19
20
  def opc; 0b10; end
20
21
  def opc2; 0b11; end
21
22
  def opc3; 0b10; end
@@ -27,6 +28,7 @@ module AArch64
27
28
  def size; 32; end
28
29
  def sf; 0; end
29
30
  def sizeb; 0b10; end
31
+ def sz; 0b0; end
30
32
  def opc; 0b11; end
31
33
  def opc2; 0b10; end
32
34
  def opc3; 0b00; end
@@ -124,6 +126,8 @@ module AArch64
124
126
  include Registers
125
127
 
126
128
  class Label
129
+ attr_reader :offset
130
+
127
131
  def initialize name
128
132
  @name = name
129
133
  @offset = nil
@@ -134,9 +138,15 @@ module AArch64
134
138
  freeze
135
139
  end
136
140
 
141
+ def unwrap_label
142
+ to_i
143
+ end
144
+
137
145
  def to_i
138
- @offset * 4
146
+ @offset
139
147
  end
148
+
149
+ def integer?; false; end
140
150
  end
141
151
 
142
152
  def initialize
@@ -162,7 +172,8 @@ module AArch64
162
172
 
163
173
  # Puts the label at the current position. Labels can only be placed once.
164
174
  def put_label label
165
- label.set_offset @insns.length
175
+ label.set_offset(@insns.length * 4)
176
+ self
166
177
  end
167
178
 
168
179
  def adc d, n, m
@@ -179,6 +190,7 @@ module AArch64
179
190
  when :uxtb then 0b000
180
191
  when :uxth then 0b001
181
192
  when :uxtw then 0b010
193
+ when :lsl then 0b010
182
194
  when :uxtx then 0b011
183
195
  when :sxtb then 0b100
184
196
  when :sxth then 0b101
@@ -188,21 +200,11 @@ module AArch64
188
200
  raise "Unknown extend #{extend}"
189
201
  end
190
202
 
191
- if m.x?
192
- if (extend & 0x3 != 0x3)
193
- raise "Wrong extend"
194
- end
195
- else
196
- if (extend & 0x3 == 0x3)
197
- raise "Wrong extend"
198
- end
199
- end
200
-
201
203
  a ADD_addsub_ext.new(d, n, m, extend, amount, d.sf)
202
204
  else
203
205
  if m.integer?
204
206
  # add immediate
205
- a ADD_addsub_imm.new(d, n, m, lsl / 12, d.sf)
207
+ a ADD_addsub_imm.new(d, n, m, (lsl || 0) / 12, d.sf)
206
208
  else
207
209
  shift = [:lsl, :lsr, :asr].index(shift) || raise(NotImplementedError)
208
210
  a ADD_addsub_shift.new(d, n, m, shift, amount, d.sf)
@@ -242,6 +244,7 @@ module AArch64
242
244
  when :uxtb then 0b000
243
245
  when :uxth then 0b001
244
246
  when :uxtw then 0b010
247
+ when :lsl then 0b010
245
248
  when :uxtx then 0b011
246
249
  when :sxtb then 0b100
247
250
  when :sxth then 0b101
@@ -262,6 +265,9 @@ module AArch64
262
265
  end
263
266
 
264
267
  def adr xd, label
268
+ if label.integer?
269
+ label = wrap_offset_with_label label
270
+ end
265
271
  a ADR.new(xd, label)
266
272
  end
267
273
 
@@ -274,7 +280,7 @@ module AArch64
274
280
  enc = Utils.encode_mask(m, d.size) || raise("Can't encode mask #{m}")
275
281
  a AND_log_imm.new(d, n, enc.immr, enc.imms, enc.n, d.sf)
276
282
  else
277
- shift = [:lsl, :lsr, :asr].index(shift) || raise(NotImplementedError)
283
+ shift = [:lsl, :lsr, :asr, :ror].index(shift) || raise(NotImplementedError)
278
284
  a AND_log_shift.new(d, n, m, shift, amount, d.sf)
279
285
  end
280
286
  end
@@ -284,7 +290,7 @@ module AArch64
284
290
  enc = Utils.encode_mask(m, d.size) || raise("Can't encode mask #{m}")
285
291
  a ANDS_log_imm.new(d, n, enc.immr, enc.imms, enc.n, d.sf)
286
292
  else
287
- shift = [:lsl, :lsr, :asr].index(shift) || raise(NotImplementedError)
293
+ shift = [:lsl, :lsr, :asr, :ror].index(shift) || raise(NotImplementedError)
288
294
  a ANDS_log_shift.new(d, n, m, shift, amount, d.sf)
289
295
  end
290
296
  end
@@ -307,27 +313,39 @@ module AArch64
307
313
  end
308
314
 
309
315
  def autda d, n
310
- a AUTDA.new(d, n)
316
+ if n.integer?
317
+ a AUTDA.new(1, d, n)
318
+ else
319
+ a AUTDA.new(0, d, n)
320
+ end
311
321
  end
312
322
 
313
323
  def autdza d
314
- a AUTDA.new(d, 0b11111)
324
+ a AUTDA.new(1, d, 0b11111)
315
325
  end
316
326
 
317
327
  def autdb d, n
318
- a AUTDB.new(d, n)
328
+ if n.integer?
329
+ a AUTDB.new(1, d, n)
330
+ else
331
+ a AUTDB.new(0, d, n)
332
+ end
319
333
  end
320
334
 
321
335
  def autdzb d
322
- a AUTDB.new(d, 0b11111)
336
+ a AUTDB.new(1, d, 0b11111)
323
337
  end
324
338
 
325
339
  def autia d, n
326
- a AUTIA.new(d, n)
340
+ if n.integer?
341
+ a AUTIA.new(1, d, n)
342
+ else
343
+ a AUTIA.new(0, d, n)
344
+ end
327
345
  end
328
346
 
329
347
  def autiza d
330
- a AUTIA.new(d, 0b11111)
348
+ a AUTIA.new(1, d, 0b11111)
331
349
  end
332
350
 
333
351
  def autia1716
@@ -343,11 +361,15 @@ module AArch64
343
361
  end
344
362
 
345
363
  def autib d, n
346
- a AUTIB.new(d, n)
364
+ if n.integer?
365
+ a AUTIB.new(1, d, n)
366
+ else
367
+ a AUTIB.new(0, d, n)
368
+ end
347
369
  end
348
370
 
349
371
  def autizb d
350
- a AUTIB.new(d, 0b11111)
372
+ a AUTIB.new(1, d, 0b11111)
351
373
  end
352
374
 
353
375
  def autib1716
@@ -367,15 +389,22 @@ module AArch64
367
389
  end
368
390
 
369
391
  def b label, cond: nil
392
+ if label.integer?
393
+ label = wrap_offset_with_label label
394
+ end
395
+
370
396
  if cond
371
- a B_cond.new(cond, label)
397
+ a B_cond.new(Utils.cond2bin(cond), label)
372
398
  else
373
399
  a B_uncond.new(label)
374
400
  end
375
401
  end
376
402
 
377
403
  def bc label, cond:
378
- a BC_cond.new(cond, label)
404
+ if label.integer?
405
+ label = wrap_offset_with_label label
406
+ end
407
+ a BC_cond.new(Utils.cond2bin(cond), label)
379
408
  end
380
409
 
381
410
  def bfc rd, lsb, width
@@ -415,6 +444,10 @@ module AArch64
415
444
  end
416
445
 
417
446
  def bl label
447
+ if label.integer?
448
+ label = wrap_offset_with_label label
449
+ end
450
+
418
451
  a BL.new(label)
419
452
  end
420
453
 
@@ -528,10 +561,16 @@ module AArch64
528
561
  end
529
562
 
530
563
  def cbnz rt, label
564
+ if label.integer?
565
+ label = wrap_offset_with_label label
566
+ end
531
567
  a CBNZ.new(rt, label, rt.sf)
532
568
  end
533
569
 
534
570
  def cbz rt, label
571
+ if label.integer?
572
+ label = wrap_offset_with_label label
573
+ end
535
574
  a CBZ.new(rt, label, rt.sf)
536
575
  end
537
576
 
@@ -759,7 +798,7 @@ module AArch64
759
798
  end
760
799
 
761
800
  def hint imm
762
- a HINT.new(31, imm)
801
+ a HINT.new(imm >> 3, imm & 0b111)
763
802
  end
764
803
 
765
804
  def hlt imm
@@ -1083,7 +1122,7 @@ module AArch64
1083
1122
  when :sxtw then 0b110
1084
1123
  when :sxtx then 0b111
1085
1124
  else
1086
- raise
1125
+ raise option.name
1087
1126
  end
1088
1127
 
1089
1128
  amount = if rt.x?
@@ -1103,6 +1142,9 @@ module AArch64
1103
1142
  a LDR_reg_gen.new(rt, rn, rm, size, extend, amount)
1104
1143
  end
1105
1144
  else
1145
+ if rn.integer?
1146
+ rn = wrap_offset_with_label rn
1147
+ end
1106
1148
  a LDR_lit_gen.new(rt, rn, rt.sf)
1107
1149
  end
1108
1150
  end
@@ -1144,7 +1186,12 @@ module AArch64
1144
1186
  when :sxtx then 0b111
1145
1187
  end
1146
1188
 
1147
- a LDRB_reg.new(wt, xn, imm, option.shift? ? 1 : 0, val)
1189
+ s = if option.shift?
1190
+ !!option.amount
1191
+ else
1192
+ false
1193
+ end
1194
+ a LDRB_reg.new(wt, xn, imm, s ? 1 : 0, val)
1148
1195
  else
1149
1196
  a LDRB_reg.new(wt, xn, imm, 0, 0b11)
1150
1197
  end
@@ -1176,7 +1223,12 @@ module AArch64
1176
1223
  when :sxtx then 0b111
1177
1224
  end
1178
1225
 
1179
- a LDRH_reg.new(wt, xn, imm, option.shift? ? 1 : 0, val)
1226
+ s = if option.shift?
1227
+ !!option.amount
1228
+ else
1229
+ false
1230
+ end
1231
+ a LDRH_reg.new(wt, xn, imm, s ? 1 : 0, val)
1180
1232
  else
1181
1233
  a LDRH_reg.new(wt, xn, imm, 0, 0b11)
1182
1234
  end
@@ -1273,12 +1325,15 @@ module AArch64
1273
1325
  when :sxtx then 0b111
1274
1326
  end
1275
1327
 
1276
- a LDRSW_reg.new(xt, xn, imm, option.amount / 2, val)
1328
+ a LDRSW_reg.new(xt, xn, imm, (option.amount || 0) / 2, val)
1277
1329
  else
1278
1330
  a LDRSW_reg.new(xt, xn, imm, 0, 0b11)
1279
1331
  end
1280
1332
  end
1281
1333
  else
1334
+ if xn.integer?
1335
+ xn = wrap_offset_with_label xn
1336
+ end
1282
1337
  a LDRSW_lit.new(xt, xn)
1283
1338
  end
1284
1339
  end
@@ -1673,14 +1728,27 @@ module AArch64
1673
1728
  end
1674
1729
 
1675
1730
  def mrs rt, reg
1676
- a MRS.new(reg.op0, reg.op1, reg.CRn, reg.CRm, reg.op2, rt)
1731
+ o0 = case reg.op0
1732
+ when 2 then 0
1733
+ when 3 then 1
1734
+ else
1735
+ raise
1736
+ end
1737
+ a MRS.new(o0, reg.op1, reg.CRn, reg.CRm, reg.op2, rt)
1677
1738
  end
1678
1739
 
1679
1740
  def msr reg, rt
1680
1741
  if rt.integer?
1681
1742
  raise NotImplementedError
1682
1743
  else
1683
- a MSR_reg.new(reg.op0, reg.op1, reg.CRn, reg.CRm, reg.op2, rt)
1744
+ o0 = case reg.op0
1745
+ when 2 then 0
1746
+ when 3 then 1
1747
+ else
1748
+ raise
1749
+ end
1750
+
1751
+ a MSR_reg.new(o0, reg.op1, reg.CRn, reg.CRm, reg.op2, rt)
1684
1752
  end
1685
1753
  end
1686
1754
 
@@ -1820,11 +1888,15 @@ module AArch64
1820
1888
  when :sxtw then 0b110
1821
1889
  when :sxtx then 0b111
1822
1890
  else
1823
- raise
1891
+ raise option.name
1824
1892
  end
1825
- a PRFM_reg.new(rt, xn, rm, shift, option.amount / 3)
1893
+ a PRFM_reg.new(rt, xn, rm, shift, (option.amount || 0) / 3)
1826
1894
  end
1827
1895
  else
1896
+ if xn.integer?
1897
+ xn = wrap_offset_with_label xn
1898
+ end
1899
+
1828
1900
  a PRFM_lit.new(rt, xn)
1829
1901
  end
1830
1902
  end
@@ -2132,7 +2204,7 @@ module AArch64
2132
2204
  end
2133
2205
 
2134
2206
  def stlxp rs, rt, rt2, rn
2135
- a STLXP.new(rs, rt, rt2, rn.first, rt.sizeb)
2207
+ a STLXP.new(rs, rt, rt2, rn.first, rt.sz)
2136
2208
  end
2137
2209
 
2138
2210
  def stlxr rs, rt, rn
@@ -2195,7 +2267,7 @@ module AArch64
2195
2267
  raise "Unknown type #{opt.name}"
2196
2268
  end
2197
2269
 
2198
- amount = opt.amount / (rt.x? ? 3 : 2)
2270
+ amount = (opt.amount || 0) / (rt.x? ? 3 : 2)
2199
2271
  a STR_reg_gen.new(rt, rn, rm, extend, amount, rt.sizeb)
2200
2272
  end
2201
2273
  end
@@ -2260,7 +2332,7 @@ module AArch64
2260
2332
  raise "Unknown type #{opt.name}"
2261
2333
  end
2262
2334
 
2263
- amount = opt.amount > 0 ? 1 : 0
2335
+ amount = (opt.amount || 0) > 0 ? 1 : 0
2264
2336
 
2265
2337
  a STRH_reg.new(rt, rn, rm, extend, amount)
2266
2338
  end
@@ -2483,17 +2555,10 @@ module AArch64
2483
2555
  end
2484
2556
 
2485
2557
  if extend
2486
- extend = case extend
2487
- when :uxtb then 0b000
2488
- when :uxth then 0b001
2489
- when :uxtw then 0b010
2490
- when :uxtx then 0b011
2491
- when :sxtb then 0b100
2492
- when :sxth then 0b101
2493
- when :sxtw then 0b110
2494
- when :sxtx then 0b111
2558
+ extend = if m.x?
2559
+ Utils.sub_decode_extend64(extend)
2495
2560
  else
2496
- raise "Unknown extend #{extend}"
2561
+ Utils.sub_decode_extend32(extend)
2497
2562
  end
2498
2563
  a SUBS_addsub_ext.new(d, n, m, extend, amount, d.sf)
2499
2564
  else
@@ -2530,22 +2595,15 @@ module AArch64
2530
2595
  end
2531
2596
 
2532
2597
  if extend
2533
- extend = case extend
2534
- when :uxtb then 0b000
2535
- when :uxth then 0b001
2536
- when :uxtw then 0b010
2537
- when :uxtx then 0b011
2538
- when :sxtb then 0b100
2539
- when :sxth then 0b101
2540
- when :sxtw then 0b110
2541
- when :sxtx then 0b111
2598
+ extend = if m.x?
2599
+ Utils.sub_decode_extend64(extend)
2542
2600
  else
2543
- raise "Unknown extend #{extend}"
2601
+ Utils.sub_decode_extend32(extend)
2544
2602
  end
2545
2603
  a SUB_addsub_ext.new(d, n, m, extend, amount, d.sf)
2546
2604
  else
2547
2605
  if m.integer?
2548
- a SUB_addsub_imm.new(d, n, m, lsl / 12, d.sf)
2606
+ a SUB_addsub_imm.new(d, n, m, (lsl || 0) / 12, d.sf)
2549
2607
  else
2550
2608
  shift = [:lsl, :lsr, :asr].index(shift) || raise(NotImplementedError)
2551
2609
  a SUB_addsub_shift.new(d, n, m, shift, amount, d.sf)
@@ -2641,10 +2699,16 @@ module AArch64
2641
2699
  end
2642
2700
 
2643
2701
  def tbnz rt, imm, label
2702
+ if label.integer?
2703
+ label = wrap_offset_with_label label
2704
+ end
2644
2705
  a TBNZ.new(rt, imm, label, rt.sf)
2645
2706
  end
2646
2707
 
2647
2708
  def tbz rt, imm, label
2709
+ if label.integer?
2710
+ label = wrap_offset_with_label label
2711
+ end
2648
2712
  a TBZ.new(rt, imm, label, rt.sf)
2649
2713
  end
2650
2714
 
@@ -2764,5 +2828,11 @@ module AArch64
2764
2828
  @insns = @insns << insn
2765
2829
  self
2766
2830
  end
2831
+
2832
+ def wrap_offset_with_label offset
2833
+ label = Label.new :none
2834
+ label.set_offset offset
2835
+ label
2836
+ end
2767
2837
  end
2768
2838
  end
@@ -134,9 +134,16 @@ class BaseInstructionsTest < AArch64::Test
134
134
  assert_one_insn "adr x3, #4"
135
135
  end
136
136
 
137
+ def test_ADR_off
138
+ asm.adr X3, 4
139
+ assert_one_insn "adr x3, #4"
140
+ end
141
+
137
142
  def test_ADRP
138
- asm.adrp X3, 4000
139
- assert_one_insn "adrp x3, #0x4000"
143
+ # adrp x3, #0x4000
144
+ assert_bytes [0x23, 00, 00, 0x90] do |asm|
145
+ asm.adrp x3, 0x4000
146
+ end
140
147
  end
141
148
 
142
149
  def test_AND_log_imm
@@ -334,6 +341,13 @@ class BaseInstructionsTest < AArch64::Test
334
341
  end
335
342
  end
336
343
 
344
+ def test_hint
345
+ # hint #0xc
346
+ assert_bytes [0x9f, 0x21, 0x3, 0xd5] do |asm|
347
+ asm.hint 0xc
348
+ end
349
+ end
350
+
337
351
  def test_AUTIB
338
352
  # AUTIB <Xd>, <Xn|SP>
339
353
  assert_bytes [0x41, 0x14, 0xc1, 0xda] do |asm|
@@ -387,6 +401,10 @@ class BaseInstructionsTest < AArch64::Test
387
401
  asm.b label, cond: :pl
388
402
  asm.put_label label
389
403
  end
404
+
405
+ assert_one_insn "b.pl #4" do |asm|
406
+ asm.b 4, cond: :pl
407
+ end
390
408
  end
391
409
 
392
410
  def test_BC_cond
@@ -396,6 +414,10 @@ class BaseInstructionsTest < AArch64::Test
396
414
  asm.bc label, cond: :pl
397
415
  asm.put_label label
398
416
  end
417
+
418
+ assert_bytes [53, 0, 0, 84] do |asm|
419
+ asm.bc 4, cond: :pl
420
+ end
399
421
  end
400
422
 
401
423
  def test_BFC_BFM
@@ -2995,6 +3017,9 @@ class BaseInstructionsTest < AArch64::Test
2995
3017
  asm.ldr w1, label
2996
3018
  asm.put_label label
2997
3019
  end
3020
+ assert_one_insn "ldr x1, #4" do |asm|
3021
+ asm.ldr x1, 4
3022
+ end
2998
3023
  end
2999
3024
 
3000
3025
  def test_LDRA
@@ -3075,7 +3100,8 @@ class BaseInstructionsTest < AArch64::Test
3075
3100
  assert_bytes [0x69,0x7b,0x66,0x38] do |asm|
3076
3101
  asm.ldrb w9, [x27, x6, lsl(0)]
3077
3102
  end
3078
- assert_bytes [0xab,0xeb,0x63,0x38] do |asm|
3103
+ # ldrb w11, [x29, x3, sxtx]
3104
+ assert_bytes [0xab, 0xeb, 0x63, 0x38] do |asm|
3079
3105
  asm.ldrb w11, [x29, x3, sxtx]
3080
3106
  end
3081
3107
  assert_bytes [0x4e,0x4b,0x66,0x38] do |asm|
@@ -8299,6 +8325,10 @@ class BaseInstructionsTest < AArch64::Test
8299
8325
  end
8300
8326
 
8301
8327
  def test_SUB_all
8328
+ # FIXME
8329
+ #assert_bytes [0x7f,0x70,0x27,0xcb] do |asm|
8330
+ # asm.sub sp, x3, x7, extend: :uxtx, amount: 4
8331
+ #end
8302
8332
  assert_bytes [0x82,0x08,0x25,0xcb] do |asm|
8303
8333
  asm.sub x2, x4, w5, uxtb(2)
8304
8334
  end
@@ -8445,7 +8475,7 @@ class BaseInstructionsTest < AArch64::Test
8445
8475
 
8446
8476
  def test_SUBP
8447
8477
  # SUBP <Xd>, <Xn|SP>, <Xm|SP>
8448
- assert_bytes [0x43, 0, 0xc3, 0x9a] do |asm|
8478
+ assert_bytes [65, 0, 0xc3, 0x9a] do |asm|
8449
8479
  asm.subp x1, x2, x3
8450
8480
  end
8451
8481
  end
data/test/helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "aarch64"
2
+ require "aarch64/parser"
2
3
  require "minitest/autorun"
3
4
  require "hatstone"
4
5
  require "stringio"
@@ -14,17 +15,56 @@ module AArch64
14
15
  str.split(" ").map { |x| x.to_i(16) }
15
16
  end
16
17
 
18
+ def color_diff expected, actual
19
+ len = expected.bytesize
20
+ raise unless actual.bytesize == len
21
+
22
+ exp_out = ''
23
+ act_out = ''
24
+ len.times do |i|
25
+ if expected[i] == actual[i]
26
+ exp_out << expected[i]
27
+ act_out << actual[i]
28
+ else
29
+ exp_out << "\e[32m"
30
+ exp_out << expected[i]
31
+ exp_out << "\e[30m"
32
+ act_out << "\e[31m"
33
+ act_out << actual[i]
34
+ act_out << "\e[30m"
35
+ end
36
+ end
37
+
38
+ [exp_out, act_out]
39
+ end
40
+
41
+ def try_parse asm_str, bytes
42
+ parser = AArch64::Parser.new
43
+ parser.parse asm_str
44
+ rescue Racc::ParseError, ArgumentError, NameError
45
+ bytes = "[" + bytes.map { |x| sprintf("%#04x", x) }.join(", ") + "]"
46
+ puts "assert_bytes #{asm_str.dump}, #{bytes}"
47
+ end
48
+
17
49
  def assert_bytes bytes
18
50
  asm = Assembler.new
19
51
  yield asm
20
- jit_buffer = StringIO.new
21
- asm.write_to jit_buffer
22
- if false
23
- actual_bin = sprintf("%032b", jit_buffer.string.unpack1("L<")).gsub(/([01]{4})/, '\1_').sub(/_$/, '')
24
- expected_bin = sprintf("%032b", bytes.pack("C4").unpack1("L<")).gsub(/([01]{4})/, '\1_').sub(/_$/, '')
25
- assert_equal expected_bin, actual_bin
26
- end
27
- assert_equal bytes, jit_buffer.string.bytes
52
+ io = StringIO.new
53
+ asm.write_to io
54
+ assert_equal bytes, io.string.bytes, ->() {
55
+ pos = 32.times.map { |i| (i % 0x10).to_s(16) }.join.reverse
56
+ actual_bin = sprintf("%032b", io.string.unpack1("L<"))
57
+ expected_bin = sprintf("%032b", bytes.pack("C4").unpack1("L<"))
58
+ broken = []
59
+ actual_bin.bytes.zip(expected_bin.bytes).each_with_index { |(a, b), i|
60
+ broken << (31 - i) unless a == b
61
+ }
62
+ input = nil
63
+ expected_bin, actual_bin = color_diff(expected_bin, actual_bin)
64
+ "idx: #{pos}\nexp: #{expected_bin}\nact: #{actual_bin}\n" +
65
+ broken.reverse.map { |idx| "Bit #{idx} differs" }.join("\n") +
66
+ "\n#{input}"
67
+ }
28
68
  end
29
69
 
30
70
  def assert_insn binary, asm: