Miasm2
 All Classes Namespaces Files Functions Variables Typedefs Properties Macros
arch.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 
4 import logging
5 from pyparsing import *
6 from miasm2.expression import expression as m2_expr
7 from miasm2.core.cpu import *
8 from collections import defaultdict
9 from miasm2.core.bin_stream import bin_stream
10 import regs as regs_module
11 from regs import *
12 from miasm2.core.asmbloc import asm_label
13 from miasm2.core.cpu import log as log_cpu
14 from miasm2.expression.modint import uint32, uint64
15 import math
16 
17 log = logging.getLogger("aarch64dis")
18 console_handler = logging.StreamHandler()
19 console_handler.setFormatter(logging.Formatter("%(levelname)-5s: %(message)s"))
20 log.addHandler(console_handler)
21 log.setLevel(logging.DEBUG)
22 
23 # refs from A_e_armv8_arm.pdf
24 
25 # log_cpu.setLevel(logging.DEBUG)
26 
27 
28 replace_regs = {
29  W0: X0[:32],
30  W1: X1[:32],
31  W2: X2[:32],
32  W3: X3[:32],
33  W4: X4[:32],
34  W5: X5[:32],
35  W6: X6[:32],
36  W7: X7[:32],
37  W8: X8[:32],
38  W9: X9[:32],
39 
40  W10: X10[:32],
41  W11: X11[:32],
42  W12: X12[:32],
43  W13: X13[:32],
44  W14: X14[:32],
45  W15: X15[:32],
46  W16: X16[:32],
47  W17: X17[:32],
48  W18: X18[:32],
49  W19: X19[:32],
50 
51  W20: X20[:32],
52  W21: X21[:32],
53  W22: X22[:32],
54  W23: X23[:32],
55  W24: X24[:32],
56  W25: X25[:32],
57  W26: X26[:32],
58  W27: X27[:32],
59  W28: X28[:32],
60  W29: X29[:32],
61 
62  W30: LR[:32],
63 
64  WSP: SP[:32],
65 
66  WZR: m2_expr.ExprInt32(0),
67  XZR: m2_expr.ExprInt64(0),
68 
69 }
70 
71 
72 variable, operand, base_expr = gen_base_expr()
73 _, _, base_expr32 = gen_base_expr()
74 _, _, base_expr64 = gen_base_expr()
75 
76 
78  if not t in mn_aarch64.regs.all_regs_ids_byname:
79  r = m2_expr.ExprId(asm_label(t))
80  else:
81  r = mn_aarch64.regs.all_regs_ids_byname[t]
82  if not r.size == 32:
83  raise StopIteration
84  return r
85 
86 
88  return m2_expr.ExprInt32(a)
89 
90 
92  if not t in mn_aarch64.regs.all_regs_ids_byname:
93  r = m2_expr.ExprId(asm_label(t))
94  else:
95  r = mn_aarch64.regs.all_regs_ids_byname[t]
96  if not r.size == 64:
97  raise StopIteration
98  return r
99 
100 
102  return m2_expr.ExprInt64(a)
103 
104 my_var_parser32 = parse_ast(ast_id2expr32, ast_int2expr32)
105 my_var_parser64 = parse_ast(ast_id2expr64, ast_int2expr64)
106 
107 base_expr32.setParseAction(my_var_parser32)
108 base_expr64.setParseAction(my_var_parser64)
109 
110 
111 int_or_expr = base_expr
112 int_or_expr32 = base_expr32
113 int_or_expr64 = base_expr64
114 
115 
116 shift2expr_dct = {'LSL': '<<', 'LSR': '>>', 'ASR': 'a>>', 'ROR': '>>>'}
117 shift_str = ["LSL", "LSR", "ASR", "ROR"]
118 shift_expr = ["<<", ">>", "a>>", '>>>']
119 
120 
121 def op_shift2expr(s, l, t):
122  return shift2expr_dct[t[0]]
123 
124 
126  return "slice_at"
127 
128 
129 def op_ext_reg(s, l, t):
130  return t[0]
131 
132 
133 def shift2expr(t):
134  if len(t) == 1:
135  return t[0]
136  elif len(t) == 3:
137  if t[0].size == 32 and isinstance(t[2], m2_expr.ExprInt):
138  t[2] = m2_expr.ExprInt32(t[2].arg)
139  return m2_expr.ExprOp(t[1], t[0], t[2])
140  else:
141  raise ValueError('bad string')
142 
143 
145  if len(t) == 1:
146  return t[0]
147  elif len(t) == 3:
148  if t[0].size == 32 and isinstance(t[2], m2_expr.ExprInt):
149  t[2] = m2_expr.ExprInt32(t[2].arg)
150  if t[1] != '<<':
151  raise ValueError('bad op')
152  return m2_expr.ExprOp("slice_at", t[0], t[2])
153  else:
154  raise ValueError('bad string')
155 
156 
157 def extend2expr(t):
158  if len(t) == 1:
159  return t[0]
160  return m2_expr.ExprOp(t[1], t[0], t[2])
161 
162 
164  if len(t) == 1:
165  return t[0]
166  else:
167  return m2_expr.ExprOp(t[1], t[0], t[2])
168 
169 all_binaryop_lsl_t = literal_list(
170  shift_str).setParseAction(op_shift2expr)
171 
172 all_binaryop_shiftleft_t = literal_list(
173  ["LSL"]).setParseAction(op_shift2expr)
174 
175 extend_lst = ['UXTB', 'UXTH', 'UXTW', 'UXTX', 'SXTB', 'SXTH', 'SXTW', 'SXTX']
176 extend2_lst = ['UXTW', 'LSL', 'SXTW', 'SXTX']
177 
178 all_extend_t = literal_list(extend_lst).setParseAction(op_ext_reg)
179 all_extend2_t = literal_list(extend2_lst).setParseAction(op_ext_reg)
180 
181 
182 gpregz32_extend = (gpregsz32_info.parser + Optional(
183  all_extend_t + int_or_expr32)).setParseAction(extend2expr)
184 gpregz64_extend = (gpregsz64_info.parser + Optional(
185  all_extend_t + int_or_expr64)).setParseAction(extend2expr)
186 
187 
188 shift32_off = (gpregsz32_info.parser + Optional(all_binaryop_lsl_t +
189  (gpregs32_info.parser | int_or_expr))).setParseAction(shift2expr)
190 shift64_off = (gpregsz64_info.parser + Optional(all_binaryop_lsl_t +
191  (gpregs64_info.parser | int_or_expr))).setParseAction(shift2expr)
192 
193 
194 shiftimm_imm_sc = (int_or_expr + all_binaryop_shiftleft_t +
195  int_or_expr).setParseAction(shift2expr_sc)
196 
197 shiftimm_off_sc = shiftimm_imm_sc | int_or_expr
198 
199 
200 shift_off = (shift32_off | shift64_off)
201 reg_ext_off = (gpregz32_extend | gpregz64_extend)
202 
203 gpregs_32_64 = (gpregs32_info.parser | gpregs64_info.parser)
204 gpregsz_32_64 = (gpregsz32_info.parser | gpregsz64_info.parser | int_or_expr)
205 
206 simdregs = (simd08_info.parser | simd16_info.parser |
207  simd32_info.parser | simd64_info.parser)
208 simdregs_h = (simd32_info.parser | simd64_info.parser | simd128_info.parser)
209 
210 simdregs_h_zero = (simd32_info.parser |
211  simd64_info.parser | simd128_info.parser | int_or_expr)
212 
213 
214 def ast_id2expr(t):
215  if not t in mn_aarch64.regs.all_regs_ids_byname:
216  r = m2_expr.ExprId(asm_label(t))
217  else:
218  r = mn_aarch64.regs.all_regs_ids_byname[t]
219  return r
220 
221 
223  return m2_expr.ExprInt64(a)
224 
225 gpregs_info = {32: gpregs32_info,
226  64: gpregs64_info}
227 gpregsz_info = {32: gpregsz32_info,
228  64: gpregsz64_info}
229 
230 
231 simds_info = {8: simd08_info,
232  16: simd16_info,
233  32: simd32_info,
234  64: simd64_info,
235  128: simd128_info}
236 
237 
238 my_var_parser = parse_ast(ast_id2expr, ast_int2expr)
239 base_expr.setParseAction(my_var_parser)
240 
241 
243  t = t[0]
244  # XXX default
245  return m2_expr.ExprOp("preinc", t[0], m2_expr.ExprInt64(0))
246 
247 
249  t = t[0]
250  if t[1] in regs_module.all_regs_ids:
251  raise StopIteration
252  return m2_expr.ExprOp("postinc", t[0], t[1])
253 
254 
256  t = t[0]
257  if t[1] in regs_module.all_regs_ids:
258  raise StopIteration
259  return m2_expr.ExprOp("preinc", t[0], t[1])
260 
261 
263  t = t[0]
264  if t[1] in regs_module.all_regs_ids:
265  raise StopIteration
266  return m2_expr.ExprOp("preinc_wb", t[0], t[1])
267 
268 LBRACK = Suppress("[")
269 RBRACK = Suppress("]")
270 COMMA = Suppress(",")
271 POSTINC = Suppress("!")
272 
273 deref_nooff = Group(
274  LBRACK + gpregs64_info.parser + RBRACK).setParseAction(deref2expr_nooff)
275 deref_off_post = Group(LBRACK + gpregs64_info.parser +
276  RBRACK + COMMA + int_or_expr64).setParseAction(deref2expr_post)
277 deref_off_pre = Group(LBRACK + gpregs64_info.parser +
278  COMMA + int_or_expr64 + RBRACK).setParseAction(deref2expr_pre)
279 deref_off_pre_wb = Group(LBRACK + gpregs64_info.parser + COMMA +
280  int_or_expr64 + RBRACK + POSTINC).setParseAction(deref2expr_pre_wb)
281 
282 deref = (deref_off_post | deref_off_pre_wb | deref_off_pre | deref_nooff)
283 
284 
286  t = t[0]
287  if len(t) == 4:
288  expr = set_imm_to_size(t[1].size, t[3])
289  if expr is None:
290  raise StopIteration
291  return m2_expr.ExprOp('segm', t[0], m2_expr.ExprOp(t[2], t[1], expr))
292  elif len(t) == 2:
293  return m2_expr.ExprOp('segm', t[0], t[1])
294 
295  raise ValueError("cad deref")
296 
297 deref_ext2 = Group(LBRACK + gpregs_32_64 + COMMA + gpregs_32_64 +
298  Optional(all_extend2_t + int_or_expr) + RBRACK).setParseAction(deref_ext2op)
299 
300 
302 
303  def __init__(self):
304  self.except_on_instr = False
305  self.lnk = None
306  self.cond = None
307 
308 CONDS = [
309  'EQ', 'NE', 'CS', 'CC',
310  'MI', 'PL', 'VS', 'VC',
311  'HI', 'LS', 'GE', 'LT',
312  'GT', 'LE', 'AL', 'NV']
313 
314 CONDS_INV = [
315  'NE', 'EQ', 'CC', 'CS',
316  'PL', 'MI', 'VC', 'VS',
317  'LS', 'HI', 'LT', 'GE',
318  'LE', 'GT', 'NV', 'AL']
319 
320 BRCOND = ['B.' + cond for cond in CONDS] + ['CBZ', 'CBNZ', 'TBZ', 'TBNZ']
321 
322 # for conditional selec
323 conds_expr, _, conds_info = gen_regs(CONDS, {})
324 conds_inv_expr, _, conds_inv_info = gen_regs(CONDS_INV, {})
325 
326 
328  delayslot = 0
329 
330  def __init__(self, *args, **kargs):
331  super(instruction_aarch64, self).__init__(*args, **kargs)
332 
333  @staticmethod
334  def arg2str(e, pos=None):
335  wb = False
336  if isinstance(e, m2_expr.ExprId) or isinstance(e, m2_expr.ExprInt):
337  return str(e)
338  elif isinstance(e, m2_expr.ExprOp) and e.op in shift_expr:
339  op_str = shift_str[shift_expr.index(e.op)]
340  return "%s %s %s" % (e.args[0], op_str, e.args[1])
341  elif isinstance(e, m2_expr.ExprOp) and e.op == "slice_at":
342  return "%s LSL %s" % (e.args[0], e.args[1])
343  elif isinstance(e, m2_expr.ExprOp) and e.op in extend_lst:
344  op_str = e.op
345  return "%s %s %s" % (e.args[0], op_str, e.args[1])
346  elif isinstance(e, m2_expr.ExprOp) and e.op == "postinc":
347  if e.args[1].arg != 0:
348  return "[%s], %s" % (e.args[0], e.args[1])
349  else:
350  return "[%s]" % (e.args[0])
351  elif isinstance(e, m2_expr.ExprOp) and e.op == "preinc_wb":
352  if e.args[1].arg != 0:
353  return "[%s, %s]!" % (e.args[0], e.args[1])
354  else:
355  return "[%s]" % (e.args[0])
356  elif isinstance(e, m2_expr.ExprOp) and e.op == "preinc":
357  if len(e.args) == 1:
358  return "[%s]" % (e.args[0])
359  elif not isinstance(e.args[1], m2_expr.ExprInt) or e.args[1].arg != 0:
360  return "[%s, %s]" % (e.args[0], e.args[1])
361  else:
362  return "[%s]" % (e.args[0])
363  elif isinstance(e, m2_expr.ExprOp) and e.op == 'segm':
364  arg = e.args[1]
365  if isinstance(arg, m2_expr.ExprId):
366  arg = str(arg)
367  elif arg.op == 'LSL' and arg.args[1].arg == 0:
368  arg = str(arg.args[0])
369  else:
370  arg = "%s %s %s" % (arg.args[0], arg.op, arg.args[1])
371  return '[%s, %s]' % (e.args[0], arg)
372 
373  else:
374  raise NotImplementedError("bad op")
375 
376  def dstflow(self):
377  return self.name in self.name in BRCOND + ["B", "BL"]
378 
379  def mnemo_flow_to_dst_index(self, name):
380  if self.name in ['CBZ', 'CBNZ']:
381  return 1
382  elif self.name in ['TBZ', 'TBNZ']:
383  return 2
384  else:
385  return 0
386 
387  def dstflow2label(self, symbol_pool):
388  index = self.mnemo_flow_to_dst_index(self.name)
389  e = self.args[index]
390  if not isinstance(e, m2_expr.ExprInt):
391  return
392  ad = e.arg + self.offset
393  l = symbol_pool.getby_offset_create(ad)
394  s = m2_expr.ExprId(l, e.size)
395  self.args[index] = s
396 
397  def breakflow(self):
398  return self.name in BRCOND + ["BR", "BLR", "RET", "ERET", "DRPS", "B", "BL"]
399 
400  def is_subcall(self):
401  return self.name in ["BLR", "BL"]
402 
403  def getdstflow(self, symbol_pool):
404  index = self.mnemo_flow_to_dst_index(self.name)
405  return [self.args[index]]
406 
407  def splitflow(self):
408  return self.name in BRCOND + ["BLR", "BL"]
409 
410  def get_symbol_size(self, symbol, symbol_pool):
411  return 64
412 
413  def fixDstOffset(self):
414  index = self.mnemo_flow_to_dst_index(self.name)
415  e = self.args[index]
416  if self.offset is None:
417  raise ValueError('symbol not resolved %s' % l)
418  if not isinstance(e, m2_expr.ExprInt):
419  log.debug('dyn dst %r', e)
420  return
421  off = e.arg - self.offset
422  if int(off % 4):
423  raise ValueError('strange offset! %r' % off)
424  self.args[index] = m2_expr.ExprInt64(off)
425 
426 
427 
429  delayslot = 0
430  name = "aarch64"
431  regs = regs_module
432  bintree = {}
433  num = 0
434  all_mn = []
435  all_mn_mode = defaultdict(list)
436  all_mn_name = defaultdict(list)
437  all_mn_inst = defaultdict(list)
438  pc = {'l': PC, 'b': PC}
439  sp = {'l': SP, 'b': SP}
440  instruction = instruction_aarch64
441  max_instruction_len = 4
442  alignment = 4
443 
444  @classmethod
445  def getpc(cls, attrib=None):
446  return PC
447 
448  @classmethod
449  def getsp(cls, attrib=None):
450  return SP
451 
452  def additional_info(self):
453  info = additional_info()
454  info.lnk = False
455  if hasattr(self, "lnk"):
456  info.lnk = self.lnk.value != 0
457  return info
458 
459  @classmethod
460  def getbits(cls, bs, attrib, start, n):
461  if not n:
462  return 0
463  o = 0
464  if n > bs.getlen() * 8:
465  raise ValueError('not enought bits %r %r' % (n, len(bs.bin) * 8))
466  while n:
467  offset = start / 8
468  n_offset = cls.endian_offset(attrib, offset)
469  c = cls.getbytes(bs, n_offset, 1)
470  if not c:
471  raise IOError
472  c = ord(c)
473  r = 8 - start % 8
474  c &= (1 << r) - 1
475  l = min(r, n)
476  c >>= (r - l)
477  o <<= l
478  o |= c
479  n -= l
480  start += l
481  return o
482 
483  @classmethod
484  def endian_offset(cls, attrib, offset):
485  if attrib == "l":
486  return (offset & ~3) + 3 - offset % 4
487  elif attrib == "b":
488  return offset
489  else:
490  raise NotImplementedError('bad attrib')
491 
492  @classmethod
493  def check_mnemo(cls, fields):
494  l = sum([x.l for x in fields])
495  assert l == 32, "len %r" % l
496 
497  @classmethod
498  def getmn(cls, name):
499  return name.upper()
500 
501  @classmethod
502  def mod_fields(cls, fields):
503  l = sum([x.l for x in fields])
504  if l == 32:
505  return fields
506  return fields
507 
508  @classmethod
509  def gen_modes(cls, subcls, name, bases, dct, fields):
510  dct['mode'] = None
511  return [(subcls, name, bases, dct, fields)]
512 
513  def value(self, mode):
514  v = super(mn_aarch64, self).value(mode)
515  if mode == 'l':
516  return [x[::-1] for x in v]
517  elif mode == 'b':
518  return [x for x in v]
519  else:
520  raise NotImplementedError('bad attrib')
521 
522  def get_symbol_size(self, symbol, symbol_pool, mode):
523  return 32
524 
525  def reset_class(self):
526  super(mn_aarch64, self).reset_class()
527  if hasattr(self, "sf"):
528  self.sf.value = None
529 
530 
531 def aarch64op(name, fields, args=None, alias=False):
532  dct = {"fields": fields, "alias":alias}
533  if args is not None:
534  dct['args'] = args
535  type(name, (mn_aarch64,), dct)
536 
537 
539  parser = gpregs_32_64
540  gpregs_info = gpregs_info
541 
542  def decode(self, v):
543  size = 64 if self.parent.sf.value else 32
544  self.expr = self.gpregs_info[size].expr[v]
545  return True
546 
547  def encode(self):
548  if not test_set_sf(self.parent, self.expr.size):
549  return False
550  if not self.expr.size in self.gpregs_info:
551  return False
552  if not self.expr in self.gpregs_info[self.expr.size].expr:
553  return False
554  self.value = self.gpregs_info[self.expr.size].expr.index(self.expr)
555  return True
556 
557 
559  parser = simdregs
560  simd_size = [8, 16, 32, 64]
561 
562  def decode(self, v):
563  if self.parent.size.value > len(self.simd_size):
564  return False
565  size = self.simd_size[self.parent.size.value]
566  self.expr = simds_info[size].expr[v]
567  return True
568 
569  def encode(self):
570  if not self.expr.size in self.simd_size:
571  return False
572  if not self.expr in simds_info[self.expr.size].expr:
573  return False
574  self.value = simds_info[self.expr.size].expr.index(self.expr)
575  self.parent.size.value = self.simd_size.index(self.expr.size)
576  return True
577 
578 
580  parser = simdregs_h
581  simd_size = [32, 64, 128]
582 
583 
585  parser = simdregs_h
586  simd_size = [32, 64]
587 
588 
590  parser = simdregs_h_zero
591 
592  def decode(self, v):
593  if v == 0 and self.parent.opc.value == 1:
594  size = 64 if self.parent.size.value else 32
595  self.expr = m2_expr.ExprInt(0, size)
596  return True
597  else:
598  return super(aarch64_simdreg_32_64_zero, self).decode(v)
599 
600  def encode(self):
601  if isinstance(self.expr, m2_expr.ExprInt):
602  self.parent.opc.value = 1
603  self.value = 0
604  return True
605  else:
606  self.parent.opc.value = 0
607  return super(aarch64_simdreg_32_64_zero, self).encode()
608 
609 
611  parser = gpregs_32_64
612 
613  def decode(self, v):
614  size = 32 if self.parent.sf.value else 64
615  self.expr = gpregs_info[size].expr[v]
616  return True
617 
618  def encode(self):
619  if not self.expr in gpregs_info[self.expr.size].expr:
620  return False
621  self.value = gpregs_info[self.expr.size].expr.index(self.expr)
622  self.parent.sf.value = 1 if self.expr.size == 32 else 0
623  return True
624 
625 
627  pass
628 
629 
630 class aarch64_gpreg_n1(aarch64_gpreg):
631 
632  def decode(self, v):
633  if v == 0b11111:
634  return False
635  return super(aarch64_gpreg_n1, self).decode(v)
636 
637  def encode(self):
638  super(aarch64_gpreg_n1, self).encode()
639  return self.value != 0b11111
640 
641 
643  parser = gpregsz_32_64
644  gpregs_info = gpregsz_info
645 
646 
648  parser = gpregsz_32_64
649  gpregs_info = gpregsz_info
650 
651  def decode(self, v):
652  size = 64 if self.parent.sf.value else 32
653  if v == 0x1F:
654  self.expr = m2_expr.ExprInt(0, size)
655  else:
656  self.expr = self.gpregs_info[size].expr[v]
657  return True
658 
659  def encode(self):
660  if isinstance(self.expr, m2_expr.ExprInt):
661  if self.expr.arg == 0:
662  self.value = 0x1F
663  return True
664  return False
665  if not self.expr.size in self.gpregs_info:
666  return False
667  if not test_set_sf(self.parent, self.expr.size):
668  return False
669  if not self.expr in self.gpregs_info[self.expr.size].expr:
670  return False
671  self.value = self.gpregs_info[self.expr.size].expr.index(self.expr)
672  return True
673 
674 
676  reg_info = cr_info
677  parser = reg_info.parser
678 
679 
681  reg_info = gpregs32_info
682 
683 
685  reg_info = gpregs64_info
686 
687 
689  reg_info = gpregs32_info
690  parser = reg_info.parser
691 
692 
694  reg_info = gpregs32_info
695  parser = reg_info.parser
696 
697 
699  reg_info = gpregs64_info
700  parser = reg_info.parser
701 
702 
704  reg_info = gpregs64_info
705  parser = reg_info.parser
706 
707 
709  reg_info = gpregsz32_info
710  parser = reg_info.parser
711 
712 
714  reg_info = gpregsz32_info
715  parser = reg_info.parser
716 
717 
719  reg_info = gpregsz64_info
720  parser = reg_info.parser
721 
722 
724  reg_info = gpregsz64_info
725  parser = reg_info.parser
726 
727 
729  reg_info = simd08_info
730  parser = reg_info.parser
731 
732 
734  reg_info = simd08_info
735  parser = reg_info.parser
736 
737 
739  reg_info = simd16_info
740  parser = reg_info.parser
741 
742 
744  reg_info = simd16_info
745  parser = reg_info.parser
746 
747 
749  reg_info = simd32_info
750  parser = reg_info.parser
751 
752 
754  reg_info = simd32_info
755  parser = reg_info.parser
756 
757 
759  reg_info = simd64_info
760  parser = reg_info.parser
761 
762 
764  reg_info = simd64_info
765  parser = reg_info.parser
766 
767 
769  reg_info = simd128_info
770  parser = reg_info.parser
771 
772 
774  reg_info = simd128_info
775  parser = reg_info.parser
776 
777 
779  parser = base_expr
780 
781 
783  parser = base_expr
784 
785 
787  parser = base_expr
788  intsize = 64
789  intmask = (1 << intsize) - 1
790  int2expr = lambda self, x: m2_expr.ExprInt64(
791  sign_ext(x, self.l, self.intsize))
792 
793 
795  parser = base_expr
796  intsize = 64
797  intmask = (1 << intsize) - 1
798  int2expr = lambda self, x: m2_expr.ExprInt64(x)
799 
800 
802  parser = base_expr
803 
804 
805 def set_imm_to_size(size, expr):
806  if size == expr.size:
807  return expr
808  if size > expr.size:
809  expr = m2_expr.ExprInt(int(expr.arg), size)
810  else:
811  if expr.arg > (1 << size) - 1:
812  return None
813  expr = m2_expr.ExprInt(int(expr.arg), size)
814  return expr
815 
816 
818  parser = base_expr
819 
820  def fromstring(self, s, parser_result=None):
821  start, stop = super(aarch64_imm_sf, self).fromstring(s, parser_result)
822  if start is None:
823  return start, stop
824  size = self.parent.args[0].expr.size
825  if self.expr in gpregs64_info.expr + gpregs32_info.expr:
826  return None, None
827  if isinstance(self.expr, m2_expr.ExprOp):
828  return False
829  expr = set_imm_to_size(size, self.expr)
830  if expr is None:
831  return None, None
832  self.expr = expr
833  return start, stop
834 
835  def encode(self):
836  if not isinstance(self.expr, m2_expr.ExprInt):
837  return False
838  if not test_set_sf(self.parent, self.expr.size):
839  return False
840  value = int(self.expr.arg)
841  if value >= 1 << self.l:
842  return False
843  self.value = value
844  return True
845 
846  def decode(self, v):
847  size = 64 if self.parent.sf.value else 32
848  self.expr = m2_expr.ExprInt(v, size)
849  return True
850 
851 
853 
854  def encode(self):
855  if not isinstance(self.expr, m2_expr.ExprInt):
856  return False
857  if not test_set_sf(self.parent, self.expr.size):
858  return False
859  value = int(self.expr.arg)
860  if value < 1 << self.l:
861  self.parent.shift.value = 0
862  else:
863  if value & 0xFFF:
864  return False
865  value >>= 12
866  if value >= 1 << self.l:
867  return False
868  self.parent.shift.value = 1
869  self.value = value
870  return True
871 
872  def decode(self, v):
873  size = 64 if self.parent.sf.value else 32
874  if self.parent.shift.value == 0:
875  self.expr = m2_expr.ExprInt(v, size)
876  elif self.parent.shift.value == 1:
877  self.expr = m2_expr.ExprInt(v << 12, size)
878  else:
879  return False
880  return True
881 
882 OPTION2SIZE = [32, 32, 32, 64,
883  32, 32, 32, 64]
884 
885 
887  parser = reg_ext_off
888 
889  def encode(self):
890  if not isinstance(self.expr, m2_expr.ExprOp):
891  return False
892  if self.expr.op not in extend_lst:
893  return False
894  reg, amount = self.expr.args
895 
896  if not reg in gpregsz_info[self.expr.size].expr:
897  return False
898  self.value = gpregsz_info[self.expr.size].expr.index(reg)
899  option = extend_lst.index(self.expr.op)
900  if self.expr.size != OPTION2SIZE[option]:
901  if not test_set_sf(self.parent, self.expr.size):
902  return False
903  self.parent.option.value = option
904  self.parent.imm.value = int(amount.arg)
905  return True
906 
907  def decode(self, v):
908  if self.parent.sf.value == 0:
909  size = 64 if self.parent.sf.value else 32
910  else:
911  size = OPTION2SIZE[self.parent.option.value]
912  reg = gpregsz_info[size].expr[v]
913 
914  self.expr = m2_expr.ExprOp(extend_lst[self.parent.option.value],
915  reg, m2_expr.ExprInt_from(reg, self.parent.imm.value))
916  return True
917 
918 EXT2_OP = {0b010: 'UXTW',
919  0b011: 'LSL',
920  0b110: 'SXTW',
921  0b111: 'SXTX'}
922 EXT2_OP_INV = dict([(items[1], items[0]) for items in EXT2_OP.items()])
923 
924 
926  parser = deref_ext2
927 
928  def get_size(self):
929  return self.parent.size.value
930 
931  def encode(self):
932  if not isinstance(self.expr, m2_expr.ExprOp):
933  return False
934  arg0, arg1 = self.expr.args
935  if not (isinstance(self.expr, m2_expr.ExprOp) and self.expr.op == 'segm'):
936  return False
937  if not arg0 in self.parent.rn.reg_info.expr:
938  return False
939  self.parent.rn.value = self.parent.rn.reg_info.expr.index(arg0)
940  is_reg = False
941  self.parent.shift.value = 0
942  if isinstance(arg1, m2_expr.ExprId):
943  reg = arg1
944  self.parent.option.value = 0b011
945  is_reg = True
946  elif isinstance(arg1, m2_expr.ExprOp) and arg1.op in EXT2_OP.values():
947  reg = arg1.args[0]
948  else:
949  return False
950  if not (reg.size in gpregs_info and
951  reg in gpregs_info[reg.size].expr):
952  return False
953  self.value = gpregs_info[reg.size].expr.index(reg)
954  if is_reg:
955  return True
956  if not (isinstance(arg1.args[1], m2_expr.ExprInt)):
957  return False
958  if arg1.op not in EXT2_OP_INV:
959  return False
960  self.parent.option.value = EXT2_OP_INV[arg1.op]
961  if arg1.args[1].arg == 0:
962  self.parent.shift.value = 0
963  return True
964 
965  if arg1.args[1].arg != self.get_size():
966  return False
967 
968  self.parent.shift.value = 1
969 
970  return True
971 
972  def decode(self, v):
973  opt = self.parent.option.value
974  if opt in [0, 1, 4, 5]:
975  return False
976  elif opt in [2, 6]:
977  reg_expr = gpregsz32_info.expr
978  elif opt in [3, 7]:
979  reg_expr = gpregsz64_info.expr
980  arg = reg_expr[v]
981 
982  if opt in EXT2_OP:
983  if self.parent.shift.value == 1:
984  arg = m2_expr.ExprOp(EXT2_OP[opt], arg,
985  m2_expr.ExprInt_from(arg, self.get_size()))
986  else:
987  arg = m2_expr.ExprOp(EXT2_OP[opt], arg,
988  m2_expr.ExprInt_from(arg, 0))
989 
990  reg = self.parent.rn.reg_info.expr[self.parent.rn.value]
991  self.expr = m2_expr.ExprOp('segm', reg, arg)
992  return True
993 
994 
996 
997  def get_size(self):
998  return 4
999 
1000 
1001 def test_set_sf(parent, size):
1002  if not hasattr(parent, 'sf'):
1003  return False
1004  if parent.sf.value == None:
1005  parent.sf.value = 1 if size == 64 else 0
1006  return True
1007  psize = 64 if parent.sf.value else 32
1008  return psize == size
1009 
1010 
1012  reg_info = gpregsz_info
1013  parser = shift_off
1014 
1015  def encode(self):
1016  size = self.expr.size
1017  if not test_set_sf(self.parent, size):
1018  return False
1019  if isinstance(self.expr, m2_expr.ExprId):
1020  if not size in gpregs_info:
1021  return False
1022  if not self.expr in self.reg_info[size].expr:
1023  return False
1024  self.parent.shift.value = 0
1025  self.parent.imm.value = 0
1026  self.value = self.reg_info[size].expr.index(self.expr)
1027  return True
1028 
1029  if not isinstance(self.expr, m2_expr.ExprOp):
1030  return False
1031  if not self.expr.op in shift_expr:
1032  return False
1033  args = self.expr.args
1034  if not args[0] in self.reg_info[size].expr:
1035  return False
1036  if not isinstance(args[1], m2_expr.ExprInt):
1037  return False
1038  self.parent.shift.value = shift_expr.index(self.expr.op)
1039  self.parent.imm.value = int(args[1].arg)
1040  self.value = self.reg_info[size].expr.index(args[0])
1041  return True
1042 
1043  def decode(self, v):
1044  size = 64 if self.parent.sf.value else 32
1045  e = self.reg_info[size].expr[v]
1046  amount = self.parent.imm.value
1047  if amount != 0:
1048  e = m2_expr.ExprOp(
1049  shift_expr[self.parent.shift.value], e, m2_expr.ExprInt_from(e, amount))
1050  self.expr = e
1051  return True
1052 
1053 
1054 def ror(value, amount, size):
1055  return (value >> amount) | (value << (size - amount))
1056 
1057 
1058 def rol(value, amount, size):
1059  return (value << amount) | (value >> (size - amount))
1060 
1061 UINTS = {32: uint32, 64: uint64}
1062 
1063 
1064 def imm_to_imm_rot_form(value, size):
1065  for i in xrange(0, size):
1066  mod_value = int(rol(value, i, size))
1067  if (mod_value + 1) & mod_value == 0:
1068  return i
1069  return None
1070 
1071 
1073  parser = base_expr
1074 
1075  def decode(self, v):
1076  size = 64 if self.parent.sf.value else 32
1077  mask = UINTS[size]((1 << (v + 1)) - 1)
1078  mask = ror(mask, self.parent.immr.value, size)
1079  self.expr = m2_expr.ExprInt(mask, size)
1080  return True
1081 
1082  def encode(self):
1083  if not isinstance(self.expr, m2_expr.ExprInt):
1084  return False
1085  if not test_set_sf(self.parent, self.expr.size):
1086  return False
1087  value = self.expr.arg
1088  if value == 0:
1089  return False
1090 
1091  index = imm_to_imm_rot_form(value, self.expr.size)
1092  if index == None:
1093  return False
1094  power = int(rol(value, index, self.expr.size)) + 1
1095  length = None
1096  for i in xrange(self.expr.size):
1097  if 1 << i == power:
1098  length = i
1099  break
1100  if length is None:
1101  return False
1102  self.parent.immr.value = index
1103  self.value = length - 1
1104  self.parent.immn.value = 1 if self.expr.size == 64 else 0
1105  return True
1106 
1107 
1109  parser = base_expr
1110 
1111 
1113  parser = base_expr
1114 
1115  def decode(self, v):
1116  v = ((v << 2) | self.parent.immlo.value) << 12
1117  v = sign_ext(v, 33, 64)
1118  self.expr = m2_expr.ExprInt64(v)
1119  return True
1120 
1121  def encode(self):
1122  v = int(self.expr.arg)
1123  if v & (1 << 63):
1124  v &= (1 << 33) - 1
1125  if v & 0xfff:
1126  return False
1127  v >>= 12
1128  self.parent.immlo.value = v & 3
1129  v >>= 2
1130  self.value = v
1131  return True
1132 
1133 
1135  parser = base_expr
1136 
1137  def decode(self, v):
1138  v = ((v << 2) | self.parent.immlo.value)
1139  v = sign_ext(v, 21, 64)
1140  self.expr = m2_expr.ExprInt64(v)
1141  return True
1142 
1143  def encode(self):
1144  v = int(self.expr.arg)
1145  if v & (1 << 63):
1146  v &= (1 << 33) - 1
1147  self.parent.immlo.value = v & 3
1148  v >>= 2
1149  if v > (1 << 19) - 1:
1150  return False
1151  self.value = v & ((1 << 19) - 1)
1152  return True
1153 
1154 
1156  parser = base_expr
1157  shift_op = '<<'
1158 
1159  def decode(self, v):
1160  size = 64 if self.parent.sf.value else 32
1161  self.expr = m2_expr.ExprInt(v << (16 * self.parent.hw.value), size)
1162  return True
1163 
1164  def encode(self):
1165  if not isinstance(self.expr, m2_expr.ExprInt):
1166  return False
1167  size = self.parent.args[0].expr.size
1168  if set_imm_to_size(size, self.expr) is None:
1169  return False
1170  value = int(self.expr.arg)
1171  mask = (1 << size) - 1
1172  for i in xrange(size / 16):
1173  if ((0xffff << (i * 16)) ^ mask) & value:
1174  continue
1175  self.parent.hw.value = i
1176  self.value = value >> (i * 16)
1177  return True
1178  return False
1179 
1180 
1182  parser = shiftimm_off_sc
1183  shift_op = 'slice_at'
1184 
1185  def decode(self, v):
1186  size = 64 if self.parent.sf.value else 32
1187  expr = m2_expr.ExprInt(v, size)
1188  amount = m2_expr.ExprInt(16 * self.parent.hw.value, size)
1189  if self.parent.hw.value:
1190  self.expr = m2_expr.ExprOp(self.shift_op, expr, amount)
1191  else:
1192  self.expr = expr
1193  return True
1194 
1195  def encode(self):
1196  if isinstance(self.expr, m2_expr.ExprInt):
1197  if self.expr.arg > 0xFFFF:
1198  return False
1199  self.value = int(self.expr.arg)
1200  self.parent.hw.value = 0
1201  return True
1202 
1203  if not (isinstance(self.expr, m2_expr.ExprOp) and
1204  self.expr.op == self.shift_op and
1205  len(self.expr.args) == 2 and
1206  isinstance(self.expr.args[0], m2_expr.ExprInt) and
1207  isinstance(self.expr.args[1], m2_expr.ExprInt)):
1208  return False
1209  if set_imm_to_size(self.parent.args[0].expr.size, self.expr.args[0]) is None:
1210  return False
1211  if set_imm_to_size(self.parent.args[0].expr.size, self.expr.args[1]) is None:
1212  return False
1213  arg, amount = [int(arg.arg) for arg in self.expr.args]
1214  if arg > 0xFFFF:
1215  return False
1216  if amount % 16 or amount / 16 > 4:
1217  return False
1218  self.value = arg
1219  self.parent.hw.value = amount / 16
1220  return True
1221 
1222 
1224  parser = base_expr
1225 
1226  def decode(self, v):
1227  v = v & self.lmask
1228  v = (v << 2)
1229  v = sign_ext(v, (self.l + 2), 64)
1230  self.expr = m2_expr.ExprInt64(v)
1231  return True
1232 
1233  def encode(self):
1234  if not isinstance(self.expr, m2_expr.ExprInt):
1235  return False
1236  v = int(self.expr.arg)
1237  if v & (1 << 63):
1238  v &= (1 << (self.l + 2)) - 1
1239  self.value = v >> 2
1240  return True
1241 
1242 
1243 def set_mem_off(parent, imm):
1244  if hasattr(parent, 'simm'):
1245  mask = (1 << parent.simm.l) - 1
1246  if imm != sign_ext(imm & mask, parent.simm.l, 64):
1247  return False
1248  parent.simm.value = imm & mask
1249  elif hasattr(parent, 'uimm'):
1250  mask = (1 << parent.uimm.l) - 1
1251  if imm > mask:
1252  return False
1253  parent.uimm.value = imm
1254  else:
1255  raise ValueError('unknown imm')
1256  return True
1257 
1258 
1259 def get_size(parent):
1260  if not hasattr(parent, "size"):
1261  return 0
1262  if hasattr(parent.size, "amount"):
1263  size = parent.size.amount
1264  else:
1265  size = parent.size.value
1266  return size
1267 
1268 
1270  parser = deref
1271 
1272  def decode_w_size(self, off):
1273  return off
1274 
1275  def encode_w_size(self, off):
1276  return off
1277 
1278  def get_postpre(self, parent):
1279  if hasattr(self.parent, "postpre"):
1280  if self.parent.postpre.value == 0:
1281  op = 'postinc'
1282  else:
1283  op = 'preinc_wb'
1284  else:
1285  op = 'preinc'
1286  return op
1287 
1288  def decode(self, v):
1289  reg = gpregs64_info.expr[v]
1290  off = self.parent.imm.expr.arg
1291  op = self.get_postpre(self.parent)
1292  off = self.decode_w_size(off)
1293  self.expr = m2_expr.ExprOp(op, reg, m2_expr.ExprInt64(off))
1294  return True
1295 
1296  def encode(self):
1297  expr = self.expr
1298  if not isinstance(expr, m2_expr.ExprOp):
1299  return False
1300  if not expr.op in ['postinc', 'preinc_wb', 'preinc']:
1301  return False
1302  if hasattr(self.parent, "postpre"):
1303  if expr.op == 'postinc':
1304  self.parent.postpre.value = 0
1305  else:
1306  self.parent.postpre.value = 1
1307  reg, off = expr.args
1308  if not reg in gpregs64_info.expr:
1309  return False
1310  if not isinstance(off, m2_expr.ExprInt):
1311  return False
1312  imm = int(off.arg)
1313  imm = self.encode_w_size(imm)
1314  if imm is False:
1315  return False
1316  self.parent.imm.expr = m2_expr.ExprInt64(imm)
1317  if not self.parent.imm.encode():
1318  return False
1319  self.value = gpregs64_info.expr.index(reg)
1320  return True
1321 
1322 
1324 
1325  def decode_w_size(self, off):
1326  size = get_size(self.parent)
1327  return off << size
1328 
1329  def encode_w_size(self, off):
1330  size = get_size(self.parent)
1331  if size:
1332  if off & ((1 << size) - 1):
1333  return False
1334  off >>= size
1335  return off
1336 
1337 
1339  parser = deref_nooff
1340 
1341  def decode(self, v):
1342  reg = gpregs64_info.expr[v]
1343  self.expr = m2_expr.ExprOp('preinc', reg)
1344  return True
1345 
1346  def encode(self):
1347  expr = self.expr
1348  if not isinstance(expr, m2_expr.ExprOp):
1349  return False
1350  if expr.op != 'preinc':
1351  return False
1352  if len(expr.args) == 1:
1353  reg = expr.args[0]
1354  elif len(expr.args) == 2:
1355  reg, off = expr.args
1356  if not isinstance(off, m2_expr.ExprInt):
1357  return False
1358  if off.arg != 0:
1359  return False
1360  else:
1361  return False
1362 
1363  if not reg in gpregs64_info.expr:
1364  return False
1365  self.value = gpregs64_info.expr.index(reg)
1366  return True
1367 
1368 
1370  size2scale = {32: 2, 64: 3}
1371 
1372  def decode_w_size(self, off):
1373  size = 2 + self.parent.sf.value
1374  return off << size
1375 
1376  def encode_w_size(self, off):
1377  size = self.parent.args[0].expr.size
1378  if not size in self.size2scale:
1379  return False
1380  scale = self.size2scale[size]
1381  off = int(mod_size2int[size](off) >> scale)
1382  return off
1383 
1384 
1386  size2scale = {32: 2, 64: 3, 128: 4}
1387 
1388  def decode_w_size(self, off):
1389  size = 2 + self.parent.size.value
1390  return off << size
1391 
1392 
1394 
1395  def decode(self, v):
1396  return getattr(self.parent, self.ref).value == v
1397 
1398  def encode(self):
1399  self.value = getattr(self.parent, self.ref).value
1400  return True
1401 modf = bs_mod_name(l=1, fname='modf', mn_mod=['', 'S'])
1402 sf = bs(l=1, fname='sf', order=-1)
1403 
1404 
1406  reg_info = conds_info
1407  parser = reg_info.parser
1408 
1409 
1411  reg_info = conds_inv_info
1412  parser = reg_info.parser
1413 
1414 
1416  parser = base_expr
1417 
1418  def decode(self, v):
1419  self.expr = m2_expr.ExprInt_from(
1420  self.parent.rt.expr, (self.parent.sf.value << self.l) | v)
1421  return True
1422 
1423  def encode(self):
1424  if not isinstance(self.expr, m2_expr.ExprInt):
1425  return False
1426  size = self.parent.args[0].expr.size
1427  value = int(self.expr.arg)
1428  self.value = value & self.lmask
1429  if self.parent.sf.value is None:
1430  self.parent.sf.value = value >> self.l
1431  return True
1432  else:
1433  return value >> self.l == self.parent.sf.value
1434 
1435 
1436 shift = bs(l=2, fname='shift')
1437 
1438 shiftb = bs(l=1, fname='shift', order=-1)
1439 
1440 
1441 rn64_v = bs(l=5, cls=(aarch64_gpreg64_nodec,), fname='rn', order=-1)
1442 
1443 rn = bs(l=5, cls=(aarch64_gpreg,), fname="rn")
1444 rs = bs(l=5, cls=(aarch64_gpreg,), fname="rs")
1445 rm = bs(l=5, cls=(aarch64_gpreg,), fname="rm")
1446 rd = bs(l=5, cls=(aarch64_gpreg,), fname="rd")
1447 ra = bs(l=5, cls=(aarch64_gpregz,), fname="ra")
1448 rt = bs(l=5, cls=(aarch64_gpregz,), fname="rt")
1449 rt2 = bs(l=5, cls=(aarch64_gpregz,), fname="rt2")
1450 rn0 = bs(l=5, cls=(aarch64_gpreg0,), fname="rn")
1451 
1452 rmz = bs(l=5, cls=(aarch64_gpregz,), fname="rm")
1453 rnz = bs(l=5, cls=(aarch64_gpregz,), fname="rn")
1454 rdz = bs(l=5, cls=(aarch64_gpregz,), fname="rd")
1455 
1456 
1457 rn_n1 = bs(l=5, cls=(aarch64_gpreg_n1,), fname="rn")
1458 rm_n1 = bs(l=5, cls=(aarch64_gpreg_n1,), fname="rm")
1459 
1460 
1461 rn_na = bs(l=5, cls=(aarch64_gpreg_noarg,), fname="rn", order=-1)
1462 rn32_na = bs(l=5, cls=(aarch64_gpreg32_noarg,), fname="rn", order=-1)
1463 rn64_na = bs(l=5, cls=(aarch64_gpreg64_noarg,), fname="rn", order=-1)
1464 
1465 sd1 = bs(l=5, cls=(aarch64_simdreg_h,), fname="rt")
1466 sd2 = bs(l=5, cls=(aarch64_simdreg_h,), fname="rt2")
1467 
1468 sdn_32_64 = bs(l=5, cls=(aarch64_simdreg_32_64,), fname="rn")
1469 sdd_32_64 = bs(l=5, cls=(aarch64_simdreg_32_64,), fname="rd")
1470 sdm_32_64 = bs(l=5, cls=(aarch64_simdreg_32_64,), fname="rm")
1471 sda_32_64 = bs(l=5, cls=(aarch64_simdreg_32_64,), fname="ra")
1472 
1473 
1474 sdm_32_64_zero = bs(l=5, cls=(aarch64_simdreg_32_64_zero,), fname="rm")
1475 
1476 crn = bs(l=4, cls=(aarch64_crreg,), fname="crn")
1477 crm = bs(l=4, cls=(aarch64_crreg,), fname="crm")
1478 
1479 
1480 rn64 = bs(l=5, cls=(aarch64_gpreg64,), fname="rn")
1481 rs64 = bs(l=5, cls=(aarch64_gpreg64,), fname="rs")
1482 rm64 = bs(l=5, cls=(aarch64_gpreg64,), fname="rm")
1483 rd64 = bs(l=5, cls=(aarch64_gpreg64,), fname="rd")
1484 rt64 = bs(l=5, cls=(aarch64_gpregz64,), fname="rt")
1485 ra64 = bs(l=5, cls=(aarch64_gpregz64,), fname="ra")
1486 
1487 rn32 = bs(l=5, cls=(aarch64_gpreg32,), fname="rn")
1488 rm32 = bs(l=5, cls=(aarch64_gpreg32,), fname="rm")
1489 rd32 = bs(l=5, cls=(aarch64_gpreg32,), fname="rd")
1490 rs32 = bs(l=5, cls=(aarch64_gpreg32,), fname="rs")
1491 
1492 sd08 = bs(l=5, cls=(aarch64_simd08,), fname="rd")
1493 sd16 = bs(l=5, cls=(aarch64_simd16,), fname="rd")
1494 sd32 = bs(l=5, cls=(aarch64_simd32,), fname="rd")
1495 sd64 = bs(l=5, cls=(aarch64_simd64,), fname="rd")
1496 sd128 = bs(l=5, cls=(aarch64_simd128,), fname="rd")
1497 
1498 sn08 = bs(l=5, cls=(aarch64_simd08,), fname="rn")
1499 sn16 = bs(l=5, cls=(aarch64_simd16,), fname="rn")
1500 sn32 = bs(l=5, cls=(aarch64_simd32,), fname="rn")
1501 sn64 = bs(l=5, cls=(aarch64_simd64,), fname="rn")
1502 sn128 = bs(l=5, cls=(aarch64_simd128,), fname="rn")
1503 
1504 
1505 rt32 = bs(l=5, cls=(aarch64_gpregz32,), fname="rt")
1506 
1507 rt_isf = bs(l=5, cls=(aarch64_gpreg_isf,), fname="rt")
1508 
1509 rn64_deref = bs(l=5, cls=(aarch64_deref,), fname="rn")
1510 rn64_deref_sz = bs(l=5, cls=(aarch64_deref_size,), fname="rn")
1511 rn64_deref_sf = bs(l=5, cls=(aarch64_sf_scale,), fname="rn")
1512 rn64_deref_sd = bs(l=5, cls=(aarch64_sd_scale,), fname="rn")
1513 
1514 rn64_deref_nooff = bs(l=5, cls=(aarch64_deref_nooff,), fname="rn")
1515 
1516 imm_sft_12 = bs(l=12, cls=(aarch64_imm_sft,))
1517 
1518 # imm32_3 = bs(l=3, cls=(aarch64_imm_32,))
1519 imm32_3 = bs(l=3, fname="imm")
1520 imm6 = bs(l=6, fname="imm", order=-1)
1521 imm3 = bs(l=3, fname="imm", order=-1)
1522 simm6 = bs(l=6, cls=(aarch64_int64_noarg, m_arg), fname="imm", order=-1)
1523 simm9 = bs(l=9, cls=(aarch64_int64_noarg,), fname="imm", order=-1)
1524 simm7 = bs(l=7, cls=(aarch64_int64_noarg,), fname="imm", order=-1)
1525 nzcv = bs(l=4, cls=(aarch64_uint64_noarg, m_arg), fname="nzcv", order=-1)
1526 uimm5 = bs(l=5, cls=(aarch64_uint64_noarg, m_arg), fname="imm", order=-1)
1527 uimm12 = bs(l=12, cls=(aarch64_uint64_noarg,), fname="imm", order=-1)
1528 uimm16 = bs(l=16, cls=(aarch64_uint64_noarg, m_arg), fname="imm", order=-1)
1529 uimm7 = bs(l=7, cls=(aarch64_uint64_noarg,), fname="imm", order=-1)
1530 
1531 uimm8 = bs(l=8, cls=(aarch64_uint64,), fname="imm", order=-1)
1532 
1533 op1 = bs(l=3, cls=(aarch64_uint64, m_arg), fname="op1")
1534 op2 = bs(l=3, cls=(aarch64_uint64, m_arg), fname="op2")
1535 
1536 
1537 imm16 = bs(l=16, fname="imm", order=-1)
1538 
1539 
1540 immlo = bs(l=2, fname='immlo')
1541 immhip = bs(l=19, cls=(aarch64_immhip_page,))
1542 immhi = bs(l=19, cls=(aarch64_immhi_page,))
1543 
1544 option = bs(l=3, fname='option', order=-1)
1545 
1546 
1547 rm_ext = bs(l=5, cls=(aarch64_gpreg_ext,), fname="rm")
1548 rm_sft = bs(l=5, cls=(aarch64_gpreg_sftimm,), fname="rm")
1549 
1550 rm_ext2 = bs(l=5, cls=(aarch64_gpreg_ext2,), fname="rm")
1551 rm_ext2_128 = bs(l=5, cls=(aarch64_gpreg_ext2_128,), fname="rm")
1552 
1553 
1554 imms = bs(l=6, cls=(aarch64_imm_nsr,), fname='imms')
1555 immr = bs(l=6, fname='immr')
1556 immn = bs(l=1, fname='immn')
1557 
1558 
1559 imm16_hw = bs(l=16, cls=(aarch64_imm_hw,), fname='imm')
1560 imm16_hw_sc = bs(l=16, cls=(aarch64_imm_hw_sc,), fname='imm')
1561 hw = bs(l=2, fname='hw')
1562 
1563 
1564 a_imms = bs(l=6, cls=(aarch64_imm_sf, m_arg), fname="imm1", order=-1)
1565 a_immr = bs(l=6, cls=(aarch64_imm_sf, m_arg), fname="imm1", order=-1)
1566 
1567 
1568 
1569 adsu_name = {'ADD': 0, 'SUB': 1}
1570 bs_adsu_name = bs_name(l=1, name=adsu_name)
1571 
1572 
1573 offs19 = bs(l=19, cls=(aarch64_offs,), fname='off')
1574 offs26 = bs(l=26, cls=(aarch64_offs,), fname='off')
1575 offs14 = bs(l=14, cls=(aarch64_offs,), fname='off')
1576 
1577 b40 = bs(l=5, cls=(aarch64_b40,), fname='b40', order=1)
1578 
1579 sdsize1 = bs(l=1, fname="size")
1580 
1581 sdsize = bs(l=2, fname="size")
1582 opsize = bs(l=2, fname="size")
1583 sd = bs(l=5, cls=(aarch64_simdreg,), fname='sd')
1584 
1585 opc = bs(l=1, fname='opc', order=-1)
1586 
1587 # add/sub (imm)
1588 aarch64op("addsub", [sf, bs_adsu_name, modf, bs('10001'), shift, imm_sft_12, rn, rd], [rd, rn, imm_sft_12])
1589 aarch64op("cmp", [sf, bs('1'), bs('1'), bs('10001'), shift, imm_sft_12, rn, bs('11111')], [rn, imm_sft_12], alias=True)
1590 aarch64op("cmn", [sf, bs('0'), bs('1'), bs('10001'), shift, imm_sft_12, rn, bs('11111')], [rn, imm_sft_12], alias=True)
1591 
1592 aarch64op("adrp", [bs('1'), immlo, bs('10000'), immhip, rd64], [rd64, immhip])
1593 aarch64op("adr", [bs('0'), immlo, bs('10000'), immhi, rd64], [rd64, immhi])
1594 
1595 # add/sub (reg shift)
1596 aarch64op("addsub", [sf, bs_adsu_name, modf, bs('01011'), shift, bs('0'), rm_sft, imm6, rn, rd], [rd, rn, rm_sft])
1597 aarch64op("cmp", [sf, bs('1'), bs('1'), bs('01011'), shift, bs('0'), rm_sft, imm6, rn, bs('11111')], [rn, rm_sft], alias=True)
1598 # add/sub (reg ext)
1599 aarch64op("addsub", [sf, bs_adsu_name, modf, bs('01011'), bs('00'), bs('1'), rm_ext, option, imm3, rn, rd], [rd, rn, rm_ext])
1600 #aarch64op("cmp", [sf, bs('1'), bs('1'), bs('01011'), bs('00'), bs('1'), rm_ext, option, imm3, rn, bs('11111')], [rn, rm_ext], alias=True)
1601 
1602 
1603 aarch64op("neg", [sf, bs('1'), modf, bs('01011'), shift, bs('0'), rm_sft, imm6, bs('11111'), rd], [rd, rm_sft], alias=True)
1604 
1605 
1606 logic_name = {'AND': 0, 'ORR': 1, 'EOR': 2}
1607 bs_logic_name = bs_name(l=2, name=logic_name)
1608 # logical (imm)
1609 aarch64op("logic", [sf, bs_logic_name, bs('100100'), immn, immr, imms, rn0, rd], [rd, rn0, imms])
1610 # ANDS
1611 aarch64op("ands", [sf, bs('11'), bs('100100'), immn, immr, imms, rn0, rdz], [rdz, rn0, imms])
1612 aarch64op("tst", [sf, bs('11'), bs('100100'), immn, immr, imms, rn0, bs('11111')], [rn0, imms], alias=True)
1613 
1614 
1615 # bitfield move p.149
1616 logicbf_name = {'SBFM': 0b00, 'BFM': 0b01, 'UBFM': 0b10}
1617 bs_logicbf_name = bs_name(l=2, name=logicbf_name)
1618 aarch64op("logic", [sf, bs_logicbf_name, bs('100110'), bs(l=1, cls=(aarch64_eq,), ref="sf"), a_immr, a_imms, rn, rd], [rd, rn, a_immr, a_imms])
1619 
1620 
1621 # logical (reg shift)
1622 aarch64op("and", [sf, bs('00'), bs('01010'), shift, bs('0'), rm_sft, imm6, rn, rd], [rd, rn, rm_sft])
1623 aarch64op("bic", [sf, bs('00'), bs('01010'), shift, bs('1'), rm_sft, imm6, rn, rd], [rd, rn, rm_sft])
1624 aarch64op("orr", [sf, bs('01'), bs('01010'), shift, bs('0'), rm_sft, imm6, rn, rd], [rd, rn, rm_sft])
1625 aarch64op("orn", [sf, bs('01'), bs('01010'), shift, bs('1'), rm_sft, imm6, rn, rd], [rd, rn, rm_sft])
1626 aarch64op("mvn", [sf, bs('01'), bs('01010'), shift, bs('1'), rm_sft, imm6, bs('11111'), rd], [rd, rm_sft], alias=True)
1627 aarch64op("eor", [sf, bs('10'), bs('01010'), shift, bs('0'), rm_sft, imm6, rn, rd], [rd, rn, rm_sft])
1628 aarch64op("eon", [sf, bs('10'), bs('01010'), shift, bs('1'), rm_sft, imm6, rn, rd], [rd, rn, rm_sft])
1629 aarch64op("ands", [sf, bs('11'), bs('01010'), shift, bs('0'), rm_sft, imm6, rn, rd], [rd, rn, rm_sft])
1630 aarch64op("tst", [sf, bs('11'), bs('01010'), shift, bs('0'), rm_sft, imm6, rn, bs('11111')], [rn, rm_sft], alias=True)
1631 aarch64op("bics", [sf, bs('11'), bs('01010'), shift, bs('1'), rm_sft, imm6, rn, rd], [rd, rn, rm_sft])
1632 
1633 # move reg
1634 aarch64op("mov", [sf, bs('01'), bs('01010'), bs('00'), bs('0'), rmz, bs('000000'), bs('11111'), rd], [rd, rmz], alias=True)
1635 
1636 
1637 
1638 bcond = bs_mod_name(l=4, fname='cond', mn_mod=['EQ', 'NE', 'CS', 'CC',
1639  'MI', 'PL', 'VS', 'VC',
1640  'HI', 'LS', 'GE', 'LT',
1641  'GT', 'LE', 'AL', 'NV'])
1642 
1643 cond_arg = bs(l=4, cls=(aarch64_cond_arg,), fname=cond)
1644 cond_inv_arg = bs(l=4, cls=(aarch64_cond_inv_arg,), fname=cond)
1645 # unconditional branch (ret)
1646 aarch64op("br", [bs('1101011'), bs('0000'), bs('11111'), bs('000000'), rn64, bs('00000')], [rn64])
1647 aarch64op("blr", [bs('1101011'), bs('0001'), bs('11111'), bs('000000'), rn64, bs('00000')], [rn64])
1648 aarch64op("ret", [bs('1101011'), bs('0010'), bs('11111'), bs('000000'), rn64, bs('00000')], [rn64])
1649 aarch64op("eret", [bs('1101011'), bs('0100'), bs('11111'), bs('000000'), bs('11111'), bs('00000')])
1650 aarch64op("drps", [bs('1101011'), bs('0101'), bs('11111'), bs('000000'), bs('11111'), bs('00000')])
1651 
1652 # unconditional branch (imm)
1653 aarch64op("b", [bs('0'), bs('00101'), offs26], [offs26])
1654 aarch64op("bl", [bs('1'), bs('00101'), offs26], [offs26])
1655 
1656 
1657 post_pre = bs(l=1, order=-1, fname='postpre')
1658 
1659 # conditional compare (imm) p.158
1660 ccmp_name = {'CCMN': 0, 'CCMP': 1}
1661 bs_ccmp_name = bs_name(l=1, name=ccmp_name)
1662 aarch64op("condcmp", [sf, bs_ccmp_name, bs('1'), bs('11010010'), uimm5, cond_arg, bs('1'), bs('0'), rn, bs('0'), nzcv], [rn, uimm5, nzcv, cond_arg])
1663 aarch64op("condcmp", [sf, bs_ccmp_name, bs('1'), bs('11010010'), rm, cond_arg, bs('0'), bs('0'), rn, bs('0'), nzcv], [rn, rm, nzcv, cond_arg])
1664 
1665 ldst_b_name = {'STRB': 0, 'LDRB': 1}
1666 bs_ldst_b_name = bs_name(l=1, name=ldst_b_name)
1667 ldst_name = {'STR': 0, 'LDR': 1}
1668 bs_ldst_name = bs_name(l=1, name=ldst_name)
1669 ldst_h_name = {'STRH': 0, 'LDRH': 1}
1670 bs_ldst_h_name = bs_name(l=1, name=ldst_h_name)
1671 
1672 ldst_tb_name = {'STTRB': 0, 'LDTRB': 1}
1673 bs_ldst_tb_name = bs_name(l=1, name=ldst_tb_name)
1674 
1675 ldst_th_name = {'STTRH': 0, 'LDTRH': 1}
1676 bs_ldst_th_name = bs_name(l=1, name=ldst_th_name)
1677 
1678 ldst_ub_name = {'STURB': 0, 'LDURB': 1}
1679 bs_ldst_ub_name = bs_name(l=1, name=ldst_ub_name)
1680 ldst_u_name = {'STUR': 0, 'LDUR': 1}
1681 bs_ldst_u_name = bs_name(l=1, name=ldst_u_name)
1682 
1683 ldst_t_name = {'STTR': 0, 'LDTR': 1}
1684 bs_ldst_st_name = bs_name(l=1, name=ldst_t_name)
1685 
1686 ldst_1u_name = {'STUR': 0b0, 'LDUR': 0b1}
1687 bs_ldst_1u_name = bs_name(l=1, name=ldst_1u_name)
1688 
1689 ldst_uh_name = {'STURH': 0, 'LDURH': 1}
1690 bs_ldst_uh_name = bs_name(l=1, name=ldst_uh_name)
1691 
1692 
1693 ldst_sw_name = {'STRSW': 0, 'LDRSW': 1}
1694 bs_ldst_sw_name = bs_name(l=1, name=ldst_sw_name)
1695 
1696 # load/store register (imm post index)
1697 aarch64op("ldst", [bs('00'), bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_b_name, bs('0'), simm9, post_pre, bs('1'), rn64_deref, rt32], [rt32, rn64_deref ])
1698 aarch64op("ldrsb", [bs('00'), bs('111'), bs('0'), bs('00'), bs('1'), sf, bs('0'), simm9, post_pre, bs('1'), rn64_deref, rt_isf], [rt_isf, rn64_deref ])
1699 aarch64op("ldrsh", [bs('01'), bs('111'), bs('0'), bs('00'), bs('1'), sf, bs('0'), simm9, post_pre, bs('1'), rn64_deref, rt_isf], [rt_isf, rn64_deref ])
1700 aarch64op("ldst", [bs('01'), bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_h_name, bs('0'), simm9, post_pre, bs('1'), rn64_deref, rt32], [rt32, rn64_deref ])
1701 aarch64op("ldst", [bs('10'), bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_name, bs('0'), simm9, post_pre, bs('1'), rn64_deref, rt32], [rt32, rn64_deref ])
1702 aarch64op("ldrsw", [bs('10'), bs('111'), bs('0'), bs('00'), bs('10'), bs('0'), simm9, post_pre, bs('1'), rn64_deref, rt64], [rt64, rn64_deref ])
1703 aarch64op("ldst", [bs('11'), bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_name, bs('0'), simm9, post_pre, bs('1'), rn64_deref, rt64], [rt64, rn64_deref ])
1704 
1705 aarch64op("ldst", [sdsize, bs('111'), bs('1'), bs('00'), bs('0'), bs_ldst_name, bs('0'), simm9, post_pre, bs('1'), rn64_deref, sd], [sd, rn64_deref ])
1706 aarch64op("ldst", [bs('00'), bs('111'), bs('1'), bs('00'), bs('1'), bs_ldst_name, bs('0'), simm9, post_pre, bs('1'), rn64_deref, sd128], [sd128, rn64_deref ])
1707 
1708 # load/store register (unsigned imm)
1709 aarch64op("ldst", [bs('00', fname="size"), bs('111'), bs('0'), bs('01'), bs('0'), bs_ldst_b_name, uimm12, rn64_deref_sz, rt32], [rt32, rn64_deref_sz ])
1710 aarch64op("ldrsb", [bs('00', fname="size"), bs('111'), bs('0'), bs('01'), bs('1'), sf, uimm12, rn64_deref_sz, rt_isf], [rt_isf, rn64_deref_sz ])
1711 aarch64op("ldrsh", [bs('01', fname="size"), bs('111'), bs('0'), bs('01'), bs('1'), sf, uimm12, rn64_deref_sz, rt_isf], [rt_isf, rn64_deref_sz ])
1712 aarch64op("ldst", [bs('01', fname="size"), bs('111'), bs('0'), bs('01'), bs('0'), bs_ldst_h_name, uimm12, rn64_deref_sz, rt32], [rt32, rn64_deref_sz ])
1713 aarch64op("ldst", [bs('10', fname="size"), bs('111'), bs('0'), bs('01'), bs('0'), bs_ldst_name, uimm12, rn64_deref_sz, rt32], [rt32, rn64_deref_sz ])
1714 aarch64op("ldrsw", [bs('10', fname="size"), bs('111'), bs('0'), bs('01'), bs('10'), uimm12, rn64_deref_sz, rt64], [rt64, rn64_deref_sz ])
1715 aarch64op("ldst", [bs('11', fname="size"), bs('111'), bs('0'), bs('01'), bs('0'), bs_ldst_name, uimm12, rn64_deref_sz, rt64], [rt64, rn64_deref_sz ])
1716 
1717 aarch64op("ldst", [sdsize, bs('111'), bs('1'), bs('01'), bs('0'), bs_ldst_name, uimm12, rn64_deref_sz, sd], [sd, rn64_deref_sz ])
1718 aarch64op("ldst", [bs('00'), bs('111'), bs('1'), bs('01'), bs('1', fname='size', amount=4), bs_ldst_name, uimm12, rn64_deref_sz, sd128], [sd128, rn64_deref_sz ])
1719 
1720 # load/store register (unp)
1721 aarch64op("ldst", [bs('00'), bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_tb_name, bs('0'), simm9, bs('10'), rn64_deref, rt32], [rt32, rn64_deref ])
1722 aarch64op("ldtrsb", [bs('00'), bs('111'), bs('0'), bs('00'), bs('1'), sf, bs('0'), simm9, bs('10'), rn64_deref, rt_isf], [rt_isf, rn64_deref ])
1723 aarch64op("ldtrsh", [bs('01'), bs('111'), bs('0'), bs('00'), bs('1'), sf, bs('0'), simm9, bs('10'), rn64_deref, rt_isf], [rt_isf, rn64_deref ])
1724 aarch64op("ldsttrh",[bs('01'), bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_th_name, bs('0'), simm9, bs('10'), rn64_deref, rt32], [rt32, rn64_deref ])
1725 aarch64op("ldtrsw", [bs('10'), bs('111'), bs('0'), bs('00'), bs('10'), bs('0'), simm9, bs('10'), rn64_deref, rt64], [rt64, rn64_deref ])
1726 aarch64op("ldstt", [bs('1'), sf, bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_st_name, bs('0'), simm9, bs('10'), rn64_deref, rt], [rt, rn64_deref ])
1727 
1728 aarch64op("ldstt", [sdsize, bs('111'), bs('1'), bs('00'), bs('0'), bs_ldst_st_name, bs('0'), simm9, bs('10'), rn64_deref, sd], [sd, rn64_deref ])
1729 aarch64op("ldst", [bs('00'), bs('111'), bs('1'), bs('00'), bs('1'), bs_ldst_st_name, bs('0'), simm9, bs('10'), rn64_deref, sd128], [sd128, rn64_deref ])
1730 
1731 # load/store register (unscaled imm)
1732 aarch64op("ldst", [bs('00'), bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_ub_name, bs('0'), simm9, bs('00'), rn64_deref, rt32], [rt32, rn64_deref ])
1733 aarch64op("ldursb", [bs('00'), bs('111'), bs('0'), bs('00'), bs('1'), sf, bs('0'), simm9, bs('00'), rn64_deref, rt_isf], [rt_isf, rn64_deref ])
1734 aarch64op("ldstuh", [bs('01'), bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_uh_name, bs('0'), simm9, bs('00'), rn64_deref, rt32], [rt32, rn64_deref ])
1735 aarch64op("ldursh", [bs('01'), bs('111'), bs('0'), bs('00'), bs('1'), sf, bs('0'), simm9, bs('00'), rn64_deref, rt_isf], [rt_isf, rn64_deref ])
1736 aarch64op("ldursw", [bs('10'), bs('111'), bs('0'), bs('00'), bs('10'), bs('0'), simm9, bs('00'), rn64_deref, rt64], [rt64, rn64_deref ])
1737 aarch64op("ldst", [bs('1'), sf, bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_u_name, bs('0'), simm9, bs('00'), rn64_deref, rt], [rt, rn64_deref ])
1738 
1739 aarch64op("ldstu", [sdsize, bs('111'), bs('1'), bs('00'), bs('0'), bs_ldst_u_name, bs('0'), simm9, bs('00'), rn64_deref, sd], [sd, rn64_deref ])
1740 aarch64op("ldst", [bs('00'), bs('111'), bs('1'), bs('00'), bs('1'), bs_ldst_1u_name, bs('0'), simm9, bs('00'), rn64_deref, sd128], [sd128, rn64_deref ])
1741 
1742 # load/store (register) p.728
1743 
1744 aarch64op("ldstrb",[bs('00', fname="size"), bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_b_name, bs('1'), rm_ext2, option, shiftb, bs('10'), rn64_v, rt32], [rt32, rm_ext2])
1745 
1746 aarch64op("ldstrh",[bs('01', fname="size"), bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_h_name, bs('1'), rm_ext2, option, shiftb, bs('10'), rn64_v, rt32], [rt32, rm_ext2])
1747 
1748 aarch64op("ldrsb", [bs('00', fname="size"), bs('111'), bs('0'), bs('00'), bs('1'), sf, bs('1'), rm_ext2, option, shiftb, bs('10'), rn64_v, rt_isf], [rt_isf, rm_ext2])
1749 
1750 aarch64op("ldrsh", [bs('01', fname="size"), bs('111'), bs('0'), bs('00'), bs('1'), sf, bs('1'), rm_ext2, option, shiftb, bs('10'), rn64_v, rt_isf], [rt_isf, rm_ext2])
1751 
1752 aarch64op("ldst", [sdsize, bs('111'), bs('1'), bs('00'), bs('0'), bs_ldst_name, bs('1'), rm_ext2, option, shiftb, bs('10'), rn64_v, sd], [sd, rm_ext2])
1753 aarch64op("ldst", [bs('00', fname="size"), bs('111'), bs('1'), bs('00'), bs('1'), bs_ldst_name, bs('1'), rm_ext2_128, option, shiftb, bs('10'), rn64_v, sd128], [sd128, rm_ext2_128])
1754 
1755 aarch64op("str", [bs('10', fname="size"), bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_name, bs('1'), rm_ext2, option, shiftb, bs('10'), rn64_v, rt32], [rt32, rm_ext2])
1756 
1757 aarch64op("ldrsw", [bs('10', fname="size"), bs('111'), bs('0'), bs('00'), bs('10'), bs('1'), rm_ext2, option, shiftb, bs('10'), rn64_v, rt64], [rt64, rm_ext2])
1758 
1759 aarch64op("ldst", [bs('11', fname="size"), bs('111'), bs('0'), bs('00'), bs('0'), bs_ldst_name, bs('1'), rm_ext2, option, shiftb, bs('10'), rn64_v, rt64], [rt64, rm_ext2])
1760 
1761 # load/store literal p.137
1762 aarch64op("ldr", [bs('0'), sf, bs('011'), bs('0'), bs('00'), offs19, rt], [rt, offs19])
1763 aarch64op("ldr", [bs('10'), bs('011'), bs('0'), bs('00'), offs19, rt64], [rt64, offs19])
1764 
1765 # load/store simd literal p.142
1766 aarch64op("ldr", [sdsize, bs('011'), bs('1'), bs('00'), offs19, sd1], [sd1, offs19])
1767 
1768 
1769 # move wide p.203
1770 movwide_name = {'MOVN': 0b00, 'MOVZ': 0b10}
1771 bs_movwide_name = bs_name(l=2, name=movwide_name)
1772 # mov wide (imm)
1773 aarch64op("mov", [sf, bs_movwide_name, bs('100101'), hw, imm16_hw, rd], [rd, imm16_hw])
1774 aarch64op("movk", [sf, bs('11'), bs('100101'), hw, imm16_hw_sc, rd], [rd, imm16_hw_sc])
1775 
1776 # stp/ldp p.139
1777 ldstp_name = {'STP': 0b0, 'LDP': 0b1}
1778 bs_ldstp_name = bs_name(l=1, name=ldstp_name)
1779 aarch64op("ldstp", [sf, bs('0'), bs('101'), bs('0'), bs('0'), post_pre, bs('1'), bs_ldstp_name, simm7, rt2, rn64_deref_sf, rt], [rt, rt2, rn64_deref_sf])
1780 aarch64op("ldstp", [sf, bs('0'), bs('101'), bs('0'), bs('0'), bs('1'), bs('0'), bs_ldstp_name, simm7, rt2, rn64_deref_sf, rt], [rt, rt2, rn64_deref_sf])
1781 
1782 aarch64op("ldstp", [sdsize, bs('101'), bs('1'), bs('0'), post_pre, bs('1'), bs_ldstp_name, uimm7, sd2, rn64_deref_sd, sd1], [sd1, sd2, rn64_deref_sd])
1783 aarch64op("ldstp", [sdsize, bs('101'), bs('1'), bs('0'), bs('1'), bs('0'), bs_ldstp_name, uimm7, sd2, rn64_deref_sd, sd1], [sd1, sd2, rn64_deref_sd])
1784 
1785 
1786 # data process p.207
1787 datap0_name = {'RBIT': 0b000000, 'REV16': 0b000001,
1788  'REV': 0b000010,
1789  'CLZ': 0b000100, 'CLS': 0b000101}
1790 bs_datap0_name = bs_name(l=6, name=datap0_name)
1791 aarch64op("ldstp", [bs('0', fname='sf'), bs('1'), modf, bs('11010110'), bs('00000'), bs_datap0_name, rn, rd])
1792 datap1_name = {'RBIT': 0b000000, 'REV16': 0b000001,
1793  'REV32': 0b000010, 'REV': 0b000011,
1794  'CLZ': 0b000100, 'CLS': 0b000101}
1795 bs_datap1_name = bs_name(l=6, name=datap1_name)
1796 aarch64op("ldstp", [bs('1', fname='sf'), bs('1'), modf, bs('11010110'), bs('00000'), bs_datap1_name, rn, rd])
1797 
1798 
1799 # conditional branch p.132
1800 aarch64op("b.", [bs('0101010'), bs('0'), offs19, bs('0'), bcond], [offs19])
1801 aarch64op("cbnz", [sf, bs('011010'), bs('1'), offs19, rt], [rt, offs19])
1802 aarch64op("cbz", [sf, bs('011010'), bs('0'), offs19, rt], [rt, offs19])
1803 aarch64op("tbnz", [sf, bs('011011'), bs('1'), b40, offs14, rt], [rt, b40, offs14])
1804 aarch64op("tbz", [sf, bs('011011'), bs('0'), b40, offs14, rt], [rt, b40, offs14])
1805 
1806 
1807 # fmov register p.160
1808 aarch64op("fmov", [bs('000'), bs('11110'), bs('0'), sdsize1, bs('1'), bs('0000'), bs('00'), bs('10000'), sdn_32_64, sdd_32_64], [sdd_32_64, sdn_32_64])
1809 # fmov scalar imm p.160
1810 aarch64op("fmov", [bs('000'), bs('11110'), bs('0'), sdsize1, bs('1'), uimm8, bs('100'), bs('00000'), sdd_32_64], [sdd_32_64, uimm8])
1811 # floating point comparison p.164
1812 aarch64op("fcmp", [bs('000'), bs('11110'), bs('0'), sdsize1, bs('1'), sdm_32_64_zero, bs('00'), bs('1000'), sdn_32_64, bs('0'), opc, bs('000')], [sdn_32_64, sdm_32_64_zero])
1813 aarch64op("fcmpe", [bs('000'), bs('11110'), bs('0'), sdsize1, bs('1'), sdm_32_64_zero, bs('00'), bs('1000'), sdn_32_64, bs('1'), opc, bs('000')], [sdn_32_64, sdm_32_64_zero])
1814 # floating point convert p.161
1815 aarch64op("fcvtas",[sf, bs('00'), bs('11110'), bs('0'), sdsize1, bs('1'), bs('00'), bs('100'), bs('000000'), sdn_32_64, rd], [rd, sdn_32_64])
1816 aarch64op("fcvtzu",[sf, bs('00'), bs('11110'), bs('0'), sdsize1, bs('1'), bs('11'), bs('001'), bs('000000'), sdn_32_64, rd], [rd, sdn_32_64])
1817 aarch64op("fcvtzs",[sf, bs('00'), bs('11110'), bs('0'), sdsize1, bs('1'), bs('11'), bs('000'), bs('000000'), sdn_32_64, rd], [rd, sdn_32_64])
1818 
1819 aarch64op("fcvt", [bs('000'), bs('11110'), bs('11'), bs('1'), bs('0001'), bs('00'), bs('10000'), sn16, sd32], [sd32, sn16])
1820 aarch64op("fcvt", [bs('000'), bs('11110'), bs('11'), bs('1'), bs('0001'), bs('01'), bs('10000'), sn16, sd64], [sd64, sn16])
1821 aarch64op("fcvt", [bs('000'), bs('11110'), bs('00'), bs('1'), bs('0001'), bs('11'), bs('10000'), sn32, sd16], [sd16, sn32])
1822 aarch64op("fcvt", [bs('000'), bs('11110'), bs('00'), bs('1'), bs('0001'), bs('01'), bs('10000'), sn32, sd64], [sd64, sn32])
1823 aarch64op("fcvt", [bs('000'), bs('11110'), bs('01'), bs('1'), bs('0001'), bs('11'), bs('10000'), sn64, sd16], [sd16, sn64])
1824 aarch64op("fcvt", [bs('000'), bs('11110'), bs('01'), bs('1'), bs('0001'), bs('00'), bs('10000'), sn64, sd32], [sd32, sn64])
1825 
1826 
1827 
1828 swapargs = bs_swapargs(l=1, fname="swap", mn_mod=range(1 << 1))
1829 
1830 aarch64op("fmov", [bs('0'), bs('00'), bs('11110'), bs('00'), bs('1'), bs('00'), bs('110'), bs('000000'), sn32, rd32], [rd32, sn32])
1831 aarch64op("fmov", [bs('0'), bs('00'), bs('11110'), bs('00'), bs('1'), bs('00'), bs('111'), bs('000000'), rn32, sd32], [sd32, rn32])
1832 aarch64op("fmov", [bs('1'), bs('00'), bs('11110'), bs('00'), bs('1'), bs('00'), bs('110'), bs('000000'), sd32, rd32], [rd32, sd32])
1833 aarch64op("fmov", [bs('1'), bs('00'), bs('11110'), bs('01'), bs('1'), bs('00'), bs('111'), bs('000000'), rd64, sd64], [sd64, rd64])
1834 aarch64op("fmov", [bs('1'), bs('00'), bs('11110'), bs('01'), bs('1'), bs('00'), bs('110'), bs('000000'), sd64, rd64], [rd64, sd64])
1835 
1836 
1837 
1838 # floating point arith p.163
1839 aarch64op("fsub", [bs('0'), bs('00'), bs('11110'), bs('0'), sdsize1, bs('1'), sdm_32_64, bs('001'), bs('1'), bs('10'), sdn_32_64, sdd_32_64], [sdd_32_64, sdn_32_64, sdm_32_64])
1840 aarch64op("fadd", [bs('0'), bs('00'), bs('11110'), bs('0'), sdsize1, bs('1'), sdm_32_64, bs('001'), bs('0'), bs('10'), sdn_32_64, sdd_32_64], [sdd_32_64, sdn_32_64, sdm_32_64])
1841 aarch64op("fdiv", [bs('0'), bs('00'), bs('11110'), bs('0'), sdsize1, bs('1'), sdm_32_64, bs('000'), bs('1'), bs('10'), sdn_32_64, sdd_32_64], [sdd_32_64, sdn_32_64, sdm_32_64])
1842 aarch64op("fmul", [bs('0'), bs('00'), bs('11110'), bs('0'), sdsize1, bs('1'), sdm_32_64, bs('000'), bs('0'), bs('10'), sdn_32_64, sdd_32_64], [sdd_32_64, sdn_32_64, sdm_32_64])
1843 aarch64op("fnmul", [bs('0'), bs('00'), bs('11110'), bs('0'), sdsize1, bs('1'), sdm_32_64, bs('100'), bs('0'), bs('10'), sdn_32_64, sdd_32_64], [sdd_32_64, sdn_32_64, sdm_32_64])
1844 
1845 aarch64op("fabs", [bs('0'), bs('00'), bs('11110'), bs('0'), sdsize1, bs('1'), bs('0000'), bs('01'), bs('10000'), sdn_32_64, sdd_32_64], [sdd_32_64, sdn_32_64])
1846 aarch64op("fneg", [bs('0'), bs('00'), bs('11110'), bs('0'), sdsize1, bs('1'), bs('0000'), bs('10'), bs('10000'), sdn_32_64, sdd_32_64], [sdd_32_64, sdn_32_64])
1847 aarch64op("fsqrt", [bs('0'), bs('00'), bs('11110'), bs('0'), sdsize1, bs('1'), bs('0000'), bs('11'), bs('10000'), sdn_32_64, sdd_32_64], [sdd_32_64, sdn_32_64])
1848 
1849 
1850 # floating point multiply add p.163
1851 aarch64op("fmadd", [bs('0'), bs('00'), bs('11111'), bs('0'), sdsize1, bs('0'), sdm_32_64, bs('0'), sda_32_64, sdn_32_64, sdd_32_64], [sdd_32_64, sdn_32_64, sdm_32_64, sda_32_64])
1852 aarch64op("fmsub", [bs('0'), bs('00'), bs('11111'), bs('0'), sdsize1, bs('0'), sdm_32_64, bs('1'), sda_32_64, sdn_32_64, sdd_32_64], [sdd_32_64, sdn_32_64, sdm_32_64, sda_32_64])
1853 aarch64op("fnmadd",[bs('0'), bs('00'), bs('11111'), bs('0'), sdsize1, bs('1'), sdm_32_64, bs('0'), sda_32_64, sdn_32_64, sdd_32_64], [sdd_32_64, sdn_32_64, sdm_32_64, sda_32_64])
1854 aarch64op("fnmsub",[bs('0'), bs('00'), bs('11111'), bs('0'), sdsize1, bs('1'), sdm_32_64, bs('1'), sda_32_64, sdn_32_64, sdd_32_64], [sdd_32_64, sdn_32_64, sdm_32_64, sda_32_64])
1855 
1856 # convertion float integer p.235
1857 aarch64op("scvtf", [sf, bs('0'), bs('0'), bs('11110'), bs('0'), sdsize1, bs('1'), bs('00'), bs('010'), bs('000000'), rn, sdd_32_64], [sdd_32_64, rn])
1858 aarch64op("ucvtf", [sf, bs('0'), bs('0'), bs('11110'), bs('0'), sdsize1, bs('1'), bs('00'), bs('011'), bs('000000'), rn, sdd_32_64], [sdd_32_64, rn])
1859 
1860 
1861 
1862 # conditional select p.158
1863 aarch64op("csel", [sf, bs('0'), bs('0'), bs('11010100'), rmz, cond_arg, bs('00'), rnz, rd], [rd, rnz, rmz, cond_arg])
1864 aarch64op("csinc", [sf, bs('0'), bs('0'), bs('11010100'), rmz, cond_arg, bs('01'), rnz, rd], [rd, rnz, rmz, cond_arg])
1865 aarch64op("csinv", [sf, bs('1'), bs('0'), bs('11010100'), rmz, cond_arg, bs('00'), rnz, rd], [rd, rnz, rmz, cond_arg])
1866 aarch64op("csneg", [sf, bs('1'), bs('0'), bs('11010100'), rmz, cond_arg, bs('01'), rnz, rd], [rd, rnz, rmz, cond_arg])
1867 aarch64op("cset", [sf, bs('0'), bs('0'), bs('11010100'), bs('11111'), cond_inv_arg, bs('01'), bs('11111'), rd], [rd, cond_inv_arg], alias=True)
1868 aarch64op("csetm", [sf, bs('1'), bs('0'), bs('11010100'), bs('11111'), cond_inv_arg, bs('00'), bs('11111'), rd], [rd, cond_inv_arg], alias=True)
1869 
1870 
1871 # multiply p.156
1872 aarch64op("madd", [sf, bs('00'), bs('11011'), bs('000'), rm, bs('0'), ra, rn, rd], [rd, rn, rm, ra])
1873 aarch64op("msub", [sf, bs('00'), bs('11011'), bs('000'), rm, bs('1'), ra, rn, rd], [rd, rn, rm, ra])
1874 
1875 aarch64op("umulh", [bs('1'), bs('00'), bs('11011'), bs('110'), rm64, bs('0'), bs('11111'), rn64, rd64], [rd64, rn64, rm64])
1876 aarch64op("smulh", [bs('1'), bs('00'), bs('11011'), bs('010'), rm64, bs('0'), bs('11111'), rn64, rd64], [rd64, rn64, rm64])
1877 aarch64op("umsubh",[bs('1'), bs('00'), bs('11011'), bs('101'), rm32, bs('1'), ra64, rn32, rd64], [rd64, rn32, rm32, ra64])
1878 
1879 
1880 aarch64op("smaddl",[bs('1'), bs('00'), bs('11011'), bs('001'), rm32, bs('0'), ra64, rn32, rd64], [rd64, rn32, rm32, ra64])
1881 aarch64op("umaddl",[bs('1'), bs('00'), bs('11011'), bs('101'), rm32, bs('0'), ra64, rn32, rd64], [rd64, rn32, rm32, ra64])
1882 
1883 aarch64op("smsubl",[bs('1'), bs('00'), bs('11011'), bs('001'), rm32, bs('1'), ra64, rn32, rd64], [rd64, rn32, rm32, ra64])
1884 aarch64op("umsubl",[bs('1'), bs('00'), bs('11011'), bs('101'), rm32, bs('1'), ra64, rn32, rd64], [rd64, rn32, rm32, ra64])
1885 
1886 # division p.156
1887 aarch64op("sdiv", [sf, bs('0'), bs('0'), bs('11010110'), rm, bs('00001'), bs('1'), rn, rd], [rd, rn, rm])
1888 aarch64op("udiv", [sf, bs('0'), bs('0'), bs('11010110'), rm, bs('00001'), bs('0'), rn, rd], [rd, rn, rm])
1889 
1890 
1891 # extract register p.150
1892 aarch64op("extr", [sf, bs('00100111'), bs(l=1, cls=(aarch64_eq,), ref="sf"), bs('0'), rm, simm6, rn, rd], [rd, rn, rm, simm6])
1893 
1894 # shift reg p.155
1895 shiftr_name = {'LSL': 0b00, 'LSR': 0b01, 'ASR': 0b10, 'ROR': 0b11}
1896 bs_shiftr_name = bs_name(l=2, name=shiftr_name)
1897 
1898 aarch64op("shiftr", [sf, bs('0'), bs('0'), bs('11010110'), rm, bs('0010'), bs_shiftr_name, rn, rd], [rd, rn, rm])
1899 
1900 #
1901 aarch64op("NOP", [bs('11010101000000110010000000011111')])
1902 
1903 # exception p.133
1904 aarch64op("brk", [bs('11010100'), bs('001'), uimm16, bs('000'), bs('00')], [uimm16])
1905 aarch64op("hlt", [bs('11010100'), bs('010'), uimm16, bs('000'), bs('00')], [uimm16])
1906 aarch64op("svc", [bs('11010100'), bs('000'), uimm16, bs('000'), bs('01')], [uimm16])
1907 aarch64op("hvc", [bs('11010100'), bs('000'), uimm16, bs('000'), bs('10')], [uimm16])
1908 aarch64op("smc", [bs('11010100'), bs('000'), uimm16, bs('000'), bs('11')], [uimm16])
1909 
1910 # msr p.631
1911 msr_name = {'MSR': 0b0, 'MRS': 0b1}
1912 bs_msr_name = bs_name(l=1, name=msr_name)
1913 aarch64op("mrs", [bs('1101010100'), bs('1'), bs('1'), bs('1'), op1, crn, crm, op2, rt64], [rt64, op1, crn, crm, op2])
1914 aarch64op("msr", [bs('1101010100'), bs('0'), bs('1'), bs('1'), op1, crn, crm, op2, rt64], [op1, crn, crm, op2, rt64])
1915 
1916 # load/store exclusive p.140
1917 aarch64op("stxr", [bs('1'), sf, bs('001000'), bs('0'), bs('0'), bs('0'), rs32, bs('0'), bs('11111'), rn64_deref_nooff, rt], [rs32, rt, rn64_deref_nooff])
1918 aarch64op("ldxr", [bs('1'), sf, bs('001000'), bs('0'), bs('1'), bs('0'), bs('11111'), bs('0'), bs('11111'), rn64_deref_nooff, rt], [rt, rn64_deref_nooff])
1919 
1920 
1921 aarch64op("stxrb", [bs('0'), bs('0'), bs('001000'), bs('0'), bs('0'), bs('0'), rs32, bs('0'), bs('11111'), rn64_deref_nooff, rt32], [rs32, rt32, rn64_deref_nooff])
1922 aarch64op("ldxrb", [bs('0'), bs('0'), bs('001000'), bs('0'), bs('1'), bs('0'), bs('11111'), bs('0'), bs('11111'), rn64_deref_nooff, rt32], [rt32, rn64_deref_nooff])
1923 
1924 aarch64op("stxrb", [bs('0'), bs('1'), bs('001000'), bs('0'), bs('0'), bs('0'), rs32, bs('0'), bs('11111'), rn64_deref_nooff, rt32], [rs32, rt32, rn64_deref_nooff])
1925 aarch64op("ldxrh", [bs('0'), bs('1'), bs('001000'), bs('0'), bs('1'), bs('0'), bs('11111'), bs('0'), bs('11111'), rn64_deref_nooff, rt32], [rt32, rn64_deref_nooff])
1926 
1927 aarch64op("stxp", [bs('1'), sf, bs('001000'), bs('0'), bs('0'), bs('1'), rs32, bs('0'), rt2, rn64_deref_nooff, rt], [rs32, rt, rt2, rn64_deref_nooff])
1928 aarch64op("ldxp", [bs('1'), sf, bs('001000'), bs('0'), bs('1'), bs('1'), bs('11111'), bs('0'), rt2, rn64_deref_nooff, rt], [rt, rt2, rn64_deref_nooff])
1929 
1930 # load acquire/store release p.141
1931 aarch64op("ldar", [bs('1'), sf, bs('001000'), bs('1'), bs('1'), bs('0'), bs('11111'), bs('1'), bs('11111'), rn64_deref_nooff, rt], [rt, rn64_deref_nooff])
1932 aarch64op("ldarb",[bs('0'), bs('0'), bs('001000'), bs('1'), bs('1'), bs('0'), bs('11111'), bs('1'), bs('11111'), rn64_deref_nooff, rt], [rt, rn64_deref_nooff])
1933 aarch64op("ldarh",[bs('0'), bs('1'), bs('001000'), bs('0'), bs('1'), bs('0'), bs('11111'), bs('1'), bs('11111'), rn64_deref_nooff, rt], [rt, rn64_deref_nooff])
1934 aarch64op("ldaxp",[bs('1'), sf, bs('001000'), bs('0'), bs('1'), bs('1'), bs('11111'), bs('1'), bs('11111'), rn64_deref_nooff, rt], [rt, rn64_deref_nooff])
1935 aarch64op("ldaxr",[bs('1'), sf, bs('001000'), bs('0'), bs('1'), bs('0'), bs('11111'), bs('1'), bs('11111'), rn64_deref_nooff, rt], [rt, rn64_deref_nooff])
1936 
1937 aarch64op("stlxr", [bs('1'), sf, bs('001000'), bs('0'), bs('0'), bs('0'), rs32, bs('1'), bs('11111'), rn64_deref_nooff, rt], [rs32, rt, rn64_deref_nooff])
1938 aarch64op("stlxrb",[bs('0'), bs('0'), bs('001000'), bs('0'), bs('0'), bs('0'), rs32, bs('1'), bs('11111'), rn64_deref_nooff, rt32], [rs32, rt32, rn64_deref_nooff])
1939 aarch64op("stlxrh",[bs('0'), bs('1'), bs('001000'), bs('0'), bs('0'), bs('0'), rs32, bs('1'), bs('11111'), rn64_deref_nooff, rt32], [rs32, rt32, rn64_deref_nooff])
1940 aarch64op("stlxp", [bs('1'), sf, bs('001000'), bs('0'), bs('0'), bs('1'), rs32, bs('1'), rt2, rn64_deref_nooff, rt], [rs32, rt, rt2, rn64_deref_nooff])
1941 
1942 # barriers p.135
1943 aarch64op("dsb", [bs('1101010100'), bs('0000110011'), crm, bs('1'), bs('00'), bs('11111')], [crm])
1944 aarch64op("dmb", [bs('1101010100'), bs('0000110011'), crm, bs('1'), bs('01'), bs('11111')], [crm])
1945 aarch64op("isb", [bs('1101010100'), bs('0000110011'), crm, bs('1'), bs('10'), bs('11111')], [crm])
def gen_base_expr
Definition: cpu.py:309
def gen_regs
Definition: cpu.py:135
def literal_list
Definition: cpu.py:80
def sign_ext
Definition: cpu.py:1602