aarch64 1.0.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: