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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/Rakefile +37 -0
- data/aarch64.gemspec +1 -0
- data/lib/aarch64/instructions/adc.rb +10 -10
- data/lib/aarch64/instructions/adcs.rb +10 -10
- data/lib/aarch64/instructions/add_addsub_ext.rb +14 -14
- data/lib/aarch64/instructions/add_addsub_imm.rb +12 -12
- data/lib/aarch64/instructions/add_addsub_shift.rb +14 -14
- data/lib/aarch64/instructions/addg.rb +10 -10
- data/lib/aarch64/instructions/adds_addsub_ext.rb +14 -14
- data/lib/aarch64/instructions/adds_addsub_imm.rb +12 -12
- data/lib/aarch64/instructions/adds_addsub_shift.rb +14 -14
- data/lib/aarch64/instructions/adr.rb +7 -7
- data/lib/aarch64/instructions/adrp.rb +7 -7
- data/lib/aarch64/instructions/and_log_imm.rb +14 -14
- data/lib/aarch64/instructions/and_log_shift.rb +14 -14
- data/lib/aarch64/instructions/ands_log_imm.rb +14 -14
- data/lib/aarch64/instructions/ands_log_shift.rb +14 -14
- data/lib/aarch64/instructions/asrv.rb +10 -10
- data/lib/aarch64/instructions/autda.rb +9 -12
- data/lib/aarch64/instructions/autdb.rb +9 -12
- data/lib/aarch64/instructions/autia.rb +9 -12
- data/lib/aarch64/instructions/autib.rb +9 -12
- data/lib/aarch64/instructions/axflag.rb +1 -1
- data/lib/aarch64/instructions/b_cond.rb +5 -5
- data/lib/aarch64/instructions/b_uncond.rb +3 -3
- data/lib/aarch64/instructions/bc_cond.rb +5 -5
- data/lib/aarch64/instructions/bfm.rb +13 -13
- data/lib/aarch64/instructions/bic_log_shift.rb +14 -14
- data/lib/aarch64/instructions/bics.rb +14 -14
- data/lib/aarch64/instructions/bl.rb +3 -3
- data/lib/aarch64/instructions/blr.rb +4 -4
- data/lib/aarch64/instructions/blra.rb +10 -10
- data/lib/aarch64/instructions/br.rb +4 -4
- data/lib/aarch64/instructions/bra.rb +10 -10
- data/lib/aarch64/instructions/brk.rb +3 -3
- data/lib/aarch64/instructions/bti.rb +3 -3
- data/lib/aarch64/instructions/cas.rb +14 -14
- data/lib/aarch64/instructions/casb.rb +12 -12
- data/lib/aarch64/instructions/cash.rb +12 -12
- data/lib/aarch64/instructions/casp.rb +14 -14
- data/lib/aarch64/instructions/cbnz.rb +7 -7
- data/lib/aarch64/instructions/cbz.rb +7 -7
- data/lib/aarch64/instructions/ccmn_imm.rb +12 -12
- data/lib/aarch64/instructions/ccmn_reg.rb +12 -12
- data/lib/aarch64/instructions/ccmp_imm.rb +12 -12
- data/lib/aarch64/instructions/ccmp_reg.rb +12 -12
- data/lib/aarch64/instructions/cfinv.rb +2 -9
- data/lib/aarch64/instructions/clrex.rb +3 -3
- data/lib/aarch64/instructions/cls_int.rb +8 -8
- data/lib/aarch64/instructions/clz_int.rb +8 -8
- data/lib/aarch64/instructions/crc32.rb +12 -12
- data/lib/aarch64/instructions/crc32c.rb +12 -12
- data/lib/aarch64/instructions/csdb.rb +1 -1
- data/lib/aarch64/instructions/csel.rb +12 -12
- data/lib/aarch64/instructions/csinc.rb +12 -12
- data/lib/aarch64/instructions/csinv.rb +12 -12
- data/lib/aarch64/instructions/csneg.rb +12 -12
- data/lib/aarch64/instructions/dcps.rb +5 -5
- data/lib/aarch64/instructions/dgh.rb +1 -1
- data/lib/aarch64/instructions/dmb.rb +3 -3
- data/lib/aarch64/instructions/drps.rb +2 -9
- data/lib/aarch64/instructions/dsb.rb +3 -3
- data/lib/aarch64/instructions/eon.rb +14 -14
- data/lib/aarch64/instructions/eor_log_imm.rb +14 -14
- data/lib/aarch64/instructions/eor_log_shift.rb +14 -14
- data/lib/aarch64/instructions/eret.rb +2 -9
- data/lib/aarch64/instructions/ereta.rb +3 -3
- data/lib/aarch64/instructions/esb.rb +1 -1
- data/lib/aarch64/instructions/extr.rb +13 -13
- data/lib/aarch64/instructions/gmi.rb +8 -8
- data/lib/aarch64/instructions/hint.rb +5 -5
- data/lib/aarch64/instructions/hlt.rb +3 -3
- data/lib/aarch64/instructions/hvc.rb +3 -3
- data/lib/aarch64/instructions/irg.rb +8 -8
- data/lib/aarch64/instructions/isb.rb +3 -3
- data/lib/aarch64/instructions/ld64b.rb +6 -6
- data/lib/aarch64/instructions/ldadd.rb +14 -14
- data/lib/aarch64/instructions/ldaddb.rb +12 -12
- data/lib/aarch64/instructions/ldaddh.rb +12 -12
- data/lib/aarch64/instructions/ldapr.rb +8 -8
- data/lib/aarch64/instructions/ldaprb.rb +6 -6
- data/lib/aarch64/instructions/ldaprh.rb +6 -6
- data/lib/aarch64/instructions/ldapur_gen.rb +12 -12
- data/lib/aarch64/instructions/ldar.rb +8 -8
- data/lib/aarch64/instructions/ldaxp.rb +10 -10
- data/lib/aarch64/instructions/ldaxr.rb +8 -8
- data/lib/aarch64/instructions/ldclr.rb +14 -14
- data/lib/aarch64/instructions/ldclrb.rb +14 -14
- data/lib/aarch64/instructions/ldeor.rb +14 -14
- data/lib/aarch64/instructions/ldg.rb +8 -8
- data/lib/aarch64/instructions/ldgm.rb +6 -6
- data/lib/aarch64/instructions/ldlar.rb +8 -8
- data/lib/aarch64/instructions/ldnp_gen.rb +12 -12
- data/lib/aarch64/instructions/ldp_gen.rb +14 -14
- data/lib/aarch64/instructions/ldpsw.rb +12 -12
- data/lib/aarch64/instructions/ldr_imm_gen.rb +12 -12
- data/lib/aarch64/instructions/ldr_imm_unsigned.rb +10 -10
- data/lib/aarch64/instructions/ldr_lit_gen.rb +7 -7
- data/lib/aarch64/instructions/ldr_reg_gen.rb +14 -14
- data/lib/aarch64/instructions/ldra.rb +14 -14
- data/lib/aarch64/instructions/ldrb_imm.rb +10 -10
- data/lib/aarch64/instructions/ldrb_reg.rb +12 -12
- data/lib/aarch64/instructions/ldrb_unsigned.rb +8 -8
- data/lib/aarch64/instructions/ldrh_imm.rb +10 -10
- data/lib/aarch64/instructions/ldrh_reg.rb +12 -12
- data/lib/aarch64/instructions/ldrh_unsigned.rb +8 -8
- data/lib/aarch64/instructions/ldrsb_imm.rb +12 -12
- data/lib/aarch64/instructions/ldrsb_reg.rb +14 -14
- data/lib/aarch64/instructions/ldrsb_unsigned.rb +10 -10
- data/lib/aarch64/instructions/ldrsh_imm.rb +12 -12
- data/lib/aarch64/instructions/ldrsh_reg.rb +14 -14
- data/lib/aarch64/instructions/ldrsh_unsigned.rb +10 -10
- data/lib/aarch64/instructions/ldrsw_imm.rb +10 -10
- data/lib/aarch64/instructions/ldrsw_lit.rb +5 -5
- data/lib/aarch64/instructions/ldrsw_reg.rb +12 -12
- data/lib/aarch64/instructions/ldrsw_unsigned.rb +8 -8
- data/lib/aarch64/instructions/ldset.rb +14 -14
- data/lib/aarch64/instructions/ldsetb.rb +12 -12
- data/lib/aarch64/instructions/ldseth.rb +12 -12
- data/lib/aarch64/instructions/ldsmax.rb +14 -14
- data/lib/aarch64/instructions/ldsmaxb.rb +12 -12
- data/lib/aarch64/instructions/ldsmaxh.rb +12 -12
- data/lib/aarch64/instructions/ldsmin.rb +14 -14
- data/lib/aarch64/instructions/ldsminb.rb +12 -12
- data/lib/aarch64/instructions/ldsminh.rb +12 -12
- data/lib/aarch64/instructions/ldtr.rb +10 -10
- data/lib/aarch64/instructions/ldtrb.rb +8 -8
- data/lib/aarch64/instructions/ldtrh.rb +8 -8
- data/lib/aarch64/instructions/ldtrsb.rb +10 -10
- data/lib/aarch64/instructions/ldtrsh.rb +10 -10
- data/lib/aarch64/instructions/ldtrsw.rb +8 -8
- data/lib/aarch64/instructions/ldumax.rb +14 -14
- data/lib/aarch64/instructions/ldumaxb.rb +12 -12
- data/lib/aarch64/instructions/ldumaxh.rb +12 -12
- data/lib/aarch64/instructions/ldumin.rb +14 -14
- data/lib/aarch64/instructions/lduminb.rb +12 -12
- data/lib/aarch64/instructions/lduminh.rb +12 -12
- data/lib/aarch64/instructions/ldur_gen.rb +10 -10
- data/lib/aarch64/instructions/ldursb.rb +10 -10
- data/lib/aarch64/instructions/ldursh.rb +10 -10
- data/lib/aarch64/instructions/ldursw.rb +8 -8
- data/lib/aarch64/instructions/ldxp.rb +10 -10
- data/lib/aarch64/instructions/ldxr.rb +8 -8
- data/lib/aarch64/instructions/lslv.rb +10 -10
- data/lib/aarch64/instructions/lsrv.rb +10 -10
- data/lib/aarch64/instructions/madd.rb +12 -12
- data/lib/aarch64/instructions/movk.rb +10 -10
- data/lib/aarch64/instructions/movn.rb +10 -10
- data/lib/aarch64/instructions/movz.rb +10 -10
- data/lib/aarch64/instructions/mrs.rb +14 -14
- data/lib/aarch64/instructions/msr_imm.rb +7 -7
- data/lib/aarch64/instructions/msr_reg.rb +14 -14
- data/lib/aarch64/instructions/msub.rb +12 -12
- data/lib/aarch64/instructions/nop.rb +1 -1
- data/lib/aarch64/instructions/orn_log_shift.rb +14 -14
- data/lib/aarch64/instructions/orr_log_imm.rb +14 -14
- data/lib/aarch64/instructions/orr_log_shift.rb +14 -14
- data/lib/aarch64/instructions/pacda.rb +8 -8
- data/lib/aarch64/instructions/pacdb.rb +8 -8
- data/lib/aarch64/instructions/pacga.rb +8 -8
- data/lib/aarch64/instructions/pacia.rb +8 -8
- data/lib/aarch64/instructions/pacia2.rb +5 -5
- data/lib/aarch64/instructions/pacib.rb +8 -8
- data/lib/aarch64/instructions/prfm_imm.rb +8 -8
- data/lib/aarch64/instructions/prfm_lit.rb +8 -8
- data/lib/aarch64/instructions/prfm_reg.rb +12 -12
- data/lib/aarch64/instructions/prfum.rb +8 -8
- data/lib/aarch64/instructions/psb.rb +2 -9
- data/lib/aarch64/instructions/rbit_int.rb +8 -8
- data/lib/aarch64/instructions/ret.rb +4 -4
- data/lib/aarch64/instructions/reta.rb +3 -3
- data/lib/aarch64/instructions/rev.rb +10 -10
- data/lib/aarch64/instructions/rmif.rb +8 -8
- data/lib/aarch64/instructions/rorv.rb +10 -10
- data/lib/aarch64/instructions/sb.rb +1 -1
- data/lib/aarch64/instructions/sbc.rb +10 -10
- data/lib/aarch64/instructions/sbcs.rb +10 -10
- data/lib/aarch64/instructions/sbfm.rb +13 -13
- data/lib/aarch64/instructions/sdiv.rb +10 -10
- data/lib/aarch64/instructions/setf.rb +6 -6
- data/lib/aarch64/instructions/sev.rb +1 -7
- data/lib/aarch64/instructions/sevl.rb +1 -1
- data/lib/aarch64/instructions/smaddl.rb +10 -10
- data/lib/aarch64/instructions/smc.rb +3 -3
- data/lib/aarch64/instructions/smsubl.rb +10 -10
- data/lib/aarch64/instructions/smulh.rb +8 -8
- data/lib/aarch64/instructions/st2g.rb +10 -10
- data/lib/aarch64/instructions/st64b.rb +6 -6
- data/lib/aarch64/instructions/st64bv.rb +8 -8
- data/lib/aarch64/instructions/st64bv0.rb +8 -8
- data/lib/aarch64/instructions/stg.rb +10 -10
- data/lib/aarch64/instructions/stgm.rb +6 -6
- data/lib/aarch64/instructions/stgp.rb +12 -12
- data/lib/aarch64/instructions/stllr.rb +8 -8
- data/lib/aarch64/instructions/stllrb.rb +6 -6
- data/lib/aarch64/instructions/stllrh.rb +6 -6
- data/lib/aarch64/instructions/stlr.rb +8 -8
- data/lib/aarch64/instructions/stlrb.rb +6 -6
- data/lib/aarch64/instructions/stlrh.rb +6 -6
- data/lib/aarch64/instructions/stlur_gen.rb +10 -10
- data/lib/aarch64/instructions/stlxp.rb +12 -12
- data/lib/aarch64/instructions/stlxr.rb +10 -10
- data/lib/aarch64/instructions/stlxrb.rb +8 -8
- data/lib/aarch64/instructions/stlxrh.rb +8 -8
- data/lib/aarch64/instructions/stnp_gen.rb +12 -12
- data/lib/aarch64/instructions/stp_gen.rb +14 -14
- data/lib/aarch64/instructions/str_imm_gen.rb +12 -12
- data/lib/aarch64/instructions/str_imm_unsigned.rb +10 -10
- data/lib/aarch64/instructions/str_reg_gen.rb +14 -14
- data/lib/aarch64/instructions/strb_imm.rb +10 -10
- data/lib/aarch64/instructions/strb_imm_unsigned.rb +8 -8
- data/lib/aarch64/instructions/strb_reg.rb +12 -12
- data/lib/aarch64/instructions/strh_imm.rb +10 -10
- data/lib/aarch64/instructions/strh_imm_unsigned.rb +8 -8
- data/lib/aarch64/instructions/strh_reg.rb +12 -12
- data/lib/aarch64/instructions/sttr.rb +10 -10
- data/lib/aarch64/instructions/stur_gen.rb +10 -10
- data/lib/aarch64/instructions/stxp.rb +12 -12
- data/lib/aarch64/instructions/stxr.rb +10 -10
- data/lib/aarch64/instructions/stxrb.rb +8 -8
- data/lib/aarch64/instructions/stxrh.rb +8 -8
- data/lib/aarch64/instructions/stz2g.rb +10 -10
- data/lib/aarch64/instructions/stzg.rb +10 -10
- data/lib/aarch64/instructions/stzgm.rb +6 -6
- data/lib/aarch64/instructions/sub_addsub_ext.rb +14 -14
- data/lib/aarch64/instructions/sub_addsub_imm.rb +12 -12
- data/lib/aarch64/instructions/sub_addsub_shift.rb +14 -14
- data/lib/aarch64/instructions/subg.rb +10 -10
- data/lib/aarch64/instructions/subp.rb +8 -8
- data/lib/aarch64/instructions/subps.rb +8 -8
- data/lib/aarch64/instructions/subs_addsub_ext.rb +14 -14
- data/lib/aarch64/instructions/subs_addsub_imm.rb +12 -12
- data/lib/aarch64/instructions/subs_addsub_shift.rb +14 -14
- data/lib/aarch64/instructions/svc.rb +3 -3
- data/lib/aarch64/instructions/swp.rb +14 -14
- data/lib/aarch64/instructions/swpb.rb +12 -12
- data/lib/aarch64/instructions/swph.rb +12 -12
- data/lib/aarch64/instructions/sys.rb +12 -12
- data/lib/aarch64/instructions/sysl.rb +12 -12
- data/lib/aarch64/instructions/tbnz.rb +9 -9
- data/lib/aarch64/instructions/tbz.rb +9 -9
- data/lib/aarch64/instructions/tsb.rb +1 -7
- data/lib/aarch64/instructions/ubfm.rb +13 -13
- data/lib/aarch64/instructions/udf_perm_undef.rb +3 -3
- data/lib/aarch64/instructions/udiv.rb +10 -10
- data/lib/aarch64/instructions/umaddl.rb +10 -10
- data/lib/aarch64/instructions/umsubl.rb +10 -10
- data/lib/aarch64/instructions/umulh.rb +8 -8
- data/lib/aarch64/instructions/wfe.rb +2 -9
- data/lib/aarch64/instructions/wfet.rb +4 -4
- data/lib/aarch64/instructions/wfi.rb +1 -1
- data/lib/aarch64/instructions/wfit.rb +4 -4
- data/lib/aarch64/instructions/xaflag.rb +1 -1
- data/lib/aarch64/instructions/xpac.rb +6 -6
- data/lib/aarch64/instructions/xpaclri.rb +1 -1
- data/lib/aarch64/instructions/yield.rb +2 -9
- data/lib/aarch64/instructions.rb +26 -8
- data/lib/aarch64/parser.rb +227 -0
- data/lib/aarch64/parser.tab.rb +6534 -0
- data/lib/aarch64/parser.y +1394 -0
- data/lib/aarch64/utils.rb +34 -0
- data/lib/aarch64/version.rb +1 -1
- data/lib/aarch64.rb +128 -58
- data/test/base_instructions_test.rb +34 -4
- data/test/helper.rb +48 -8
- data/test/parser_test.rb +1820 -0
- metadata +25 -14
- data/lib/aarch64/instructions/setgp.rb +0 -25
- data/lib/aarch64/instructions/setgpn.rb +0 -25
- data/lib/aarch64/instructions/setgpt.rb +0 -25
- data/lib/aarch64/instructions/setgptn.rb +0 -25
- data/lib/aarch64/instructions/setp.rb +0 -25
- data/lib/aarch64/instructions/setpn.rb +0 -25
- data/lib/aarch64/instructions/setpt.rb +0 -25
- 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
|
data/lib/aarch64/version.rb
CHANGED
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
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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(
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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.
|
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 =
|
2487
|
-
|
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
|
-
|
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 =
|
2534
|
-
|
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
|
-
|
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
|
-
|
139
|
-
|
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
|
-
|
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 [
|
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
|
-
|
21
|
-
asm.write_to
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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:
|