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