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 from pyparsing import *
5 from miasm2.core.cpu import *
7 from collections import defaultdict
8 import miasm2.arch.sh4.regs as regs_module
9 from miasm2.arch.sh4.regs import *
10 from miasm2.core.asmbloc import asm_label
11 
12 jra = ExprId('jra')
13 jrb = ExprId('jrb')
14 jrc = ExprId('jrc')
15 
16 
17 # parser helper ###########
18 PLUS = Suppress("+")
19 MULT = Suppress("*")
20 MINUS = Suppress("-")
21 AND = Suppress("&")
22 LBRACK = Suppress("[")
23 RBRACK = Suppress("]")
24 DEREF = Suppress("@")
25 COMMA = Suppress(",")
26 LPARENT = Suppress("(")
27 RPARENT = Suppress(")")
28 
29 
31  t = t[0]
32  return t[0] + t[1]
33 
34 
36  t = t[0]
37  return (t[0] & t[1]) + t[2]
38 
39 def ast_id2expr(t):
40  if not t in mn_sh4.regs.all_regs_ids_byname:
41  r = ExprId(asm_label(t))
42  else:
43  r = mn_sh4.regs.all_regs_ids_byname[t]
44  return r
45 
46 def ast_int2expr(a):
47  return ExprInt32(a)
48 
49 
50 my_var_parser = parse_ast(ast_id2expr, ast_int2expr)
51 base_expr.setParseAction(my_var_parser)
52 
53 int_or_expr = base_expr
54 
55 ref_pc = Group(LPARENT + regi_pc.parser + COMMA +
56  int_or_expr + RPARENT).setParseAction(parse_deref_pcimm)
57 ref_pcandimm = Group(
58  LPARENT + regi_pc.parser + AND + int_or_expr +
59  COMMA + int_or_expr + RPARENT).setParseAction(parse_pcandimmimm)
60 
61 
62 pcdisp = Group(regi_pc.parser + AND + int_or_expr +
63  PLUS + int_or_expr).setParseAction(parse_pcandimmimm)
64 
65 PTR = Suppress('PTR')
66 
67 
68 def parse_deref_mem(s, l, t):
69  t = t[0]
70  e = ExprMem(t[0], 32)
71  return e
72 
73 
74 def parse_predec(s, l, t):
75  t = t[0]
76  e = ExprMem(ExprOp('predec', t[0]))
77  return e
78 
79 
80 def parse_postinc(s, l, t):
81  t = t[0]
82  e = ExprMem(ExprOp('postinc', t[0]))
83  return e
84 
85 
87  t = t[0]
88  e = ExprMem(t[0] + t[1])
89  return e
90 
91 
92 def parse_regreg(t):
93  t = t[0]
94  e = ExprMem(t[0] + t[1])
95  return e
96 
97 
98 deref_pc = Group(DEREF + ref_pc).setParseAction(parse_deref_mem)
99 deref_pcimm = Group(DEREF + ref_pcandimm).setParseAction(parse_deref_mem)
100 
101 dgpregs_base = Group(DEREF + gpregs.parser).setParseAction(parse_deref_mem)
102 dgpregs_predec = Group(
103  DEREF + MINUS + gpregs.parser).setParseAction(parse_predec)
104 dgpregs_postinc = Group(
105  DEREF + gpregs.parser + PLUS).setParseAction(parse_postinc)
106 
107 dgpregs = dgpregs_base | dgpregs_predec | dgpregs_postinc
108 
109 d_gpreg_gpreg = Group(DEREF +
110  LPARENT + gpregs.parser + COMMA + gpregs.parser + RPARENT
111  ).setParseAction(parse_regdisp)
112 dgpregs_p = dgpregs_predec | dgpregs_postinc
113 
114 
115 dgpregs_ir = Group(DEREF + LPARENT + gpregs.parser +
116  COMMA + int_or_expr + RPARENT).setParseAction(parse_regdisp)
117 dgpregs_ir |= d_gpreg_gpreg
118 
119 dgbr_imm = Group(DEREF + LPARENT + regi_gbr.parser +
120  COMMA + int_or_expr + RPARENT).setParseAction(parse_regdisp)
121 
122 dgbr_reg = Group(DEREF + LPARENT + regi_gbr.parser +
123  COMMA + gpregs.parser + RPARENT).setParseAction(parse_regreg)
124 
125 
127  pass
128 
129 
130 class sh4_gpreg(sh4_reg):
131  reg_info = gpregs
132  parser = reg_info.parser
133 
134 
136  reg_info = dregs
137  parser = reg_info.parser
138 
139 
141  reg_info = bgpregs
142  parser = reg_info.parser
143 
144 
146  reg_info = gpregs
147  parser = reg_info.parser
148 
149 
151  reg_info = fregs
152  parser = reg_info.parser
153 
154 
156  parser = dgpregs_base
157 
158  def fromstring(self, s, parser_result=None):
159  start, stop = super(sh4_dgpreg, self).fromstring(s, parser_result)
160  if start is None:
161  return start, stop
162  self.expr = ExprMem(self.expr.arg, self.sz)
163  return start, stop
164 
165  def decode(self, v):
166  r = gpregs.expr[v]
167  self.expr = ExprMem(r, self.sz)
168  return True
169 
170  def encode(self):
171  e = self.expr
172  if not isinstance(e, ExprMem):
173  return False
174  if not isinstance(e.arg, ExprId):
175  return False
176  v = gpregs.expr.index(e.arg)
177  self.value = v
178  return True
179 
180 
182  parser = dgpregs_p
183 
184  def fromstring(self, s, parser_result=None):
185  start, stop = super(sh4_dgpregpinc, self).fromstring(s, parser_result)
186  if self.expr is None:
187  return None, None
188  if not isinstance(self.expr.arg, ExprOp):
189  return None, None
190  if self.expr.arg.op != self.op:
191  return None, None
192  return start, stop
193 
194  def decode(self, v):
195  r = gpregs.expr[v]
196  e = ExprOp(self.op, r)
197  self.expr = ExprMem(e, self.sz)
198  return True
199 
200  def encode(self):
201  e = self.expr
202  if not isinstance(e, ExprMem):
203  return False
204  e = e.arg
205  res = MatchExpr(e, ExprOp(self.op, jra), [jra])
206  if not res:
207  return False
208  r = res[jra]
209  if not r in gpregs.expr:
210  return False
211  v = gpregs.expr.index(r)
212  self.value = v
213  return True
214 
215 
217  parser = dgpregs_postinc
218  op = "preinc"
219 
220 
222  parser = dgpregs_ir
223 
224  def decode(self, v):
225  p = self.parent
226  r = gpregs.expr[v]
227  s = self.sz
228  d = ExprInt32(p.disp.value * s / 8)
229  e = ExprMem(r + d, s)
230  self.expr = e
231  return True
232 
233  def encode(self):
234  e = self.expr
235  p = self.parent
236  s = self.sz
237  if not isinstance(e, ExprMem):
238  return False
239  if isinstance(e.arg, ExprId):
240  v = gpregs.expr.index(e.arg)
241  p.disp.value = 0
242  elif isinstance(e.arg, ExprOp):
243  res = MatchExpr(e, ExprMem(jra + jrb, self.sz), [jra, jrb])
244  if not res:
245  return False
246  if not isinstance(res[jra], ExprId):
247  return False
248  if not isinstance(res[jrb], ExprInt):
249  return False
250  d = int(res[jrb].arg)
251  p.disp.value = d / (s / 8)
252  if not res[jra] in gpregs.expr:
253  return False
254  v = gpregs.expr.index(res[jra])
255  else:
256  return False
257  self.value = v
258  return True
259 
260 
262  parser = base_expr
263  pass
264 
265 
267  parser = base_expr
268 
269  def decode(self, v):
270  v = sign_ext(v, self.l, 32)
271  v = self.decodeval(v)
272  self.expr = ExprInt32(v)
273  return True
274 
275  def encode(self):
276  if not isinstance(self.expr, ExprInt):
277  return False
278  v = int(self.expr.arg)
279  if (1 << (self.l - 1)) & v:
280  v = -((0xffffffff ^ v) + 1)
281  v = self.encodeval(v)
282  self.value = (v & 0xffffffff) & self.lmask
283  return True
284 
285 
287  parser = deref_pc
288 
289  def decode(self, v):
290  self.expr = ExprMem(PC + ExprInt32(v * 2 + 4), 16)
291  return True
292 
293  def calcdisp(self, v):
294  v = (int(v.arg) - 4) / 2
295  if not 0 < v <= 0xff:
296  return None
297  return v
298 
299  def encode(self):
300  res = MatchExpr(self.expr, ExprMem(PC + jra, 16), [jra])
301  if not res:
302  return False
303  if not isinstance(res[jra], ExprInt):
304  return False
305  v = self.calcdisp(res[jra])
306  if v is None:
307  return False
308  self.value = v
309  return True
310 
311 
313  parser = dgbr_imm
314 
315  def decode(self, v):
316  s = self.sz
317  self.expr = ExprMem(GBR + ExprInt32(v * s / 8), s)
318  return True
319 
320  def encode(self):
321  e = self.expr
322  s = self.sz
323  if e == ExprMem(GBR):
324  self.value = 0
325  return True
326  res = MatchExpr(self.expr, ExprMem(GBR + jra, s), [jra])
327  if not res:
328  return False
329  if not isinstance(res[jra], ExprInt):
330  return False
331  self.value = int(res[jra].arg) / (s / 8)
332  return True
333 
334 
336  parser = deref_pcimm
337 
338  def decode(self, v):
339  self.expr = ExprMem(
340  (PC & ExprInt32(0xfffffffc)) + ExprInt32(v * 4 + 4))
341  return True
342 
343  def calcdisp(self, v):
344  v = (int(v.arg) - 4) / 4
345  if not 0 < v <= 0xff:
346  return None
347  return v
348 
349  def encode(self):
350  res = MatchExpr(
351  self.expr, ExprMem((PC & ExprInt32(0xFFFFFFFC)) + jra, 32), [jra])
352  if not res:
353  return False
354  if not isinstance(res[jra], ExprInt):
355  return False
356  v = self.calcdisp(res[jra])
357  if v is None:
358  return False
359  self.value = v
360  return True
361 
362 
364  parser = pcdisp
365 
366  def decode(self, v):
367  self.expr = (PC & ExprInt32(0xfffffffc)) + ExprInt32(v * 4 + 4)
368  return True
369 
370  def encode(self):
371  res = MatchExpr(self.expr, (PC & ExprInt32(0xfffffffc)) + jra, [jra])
372  if not res:
373  return False
374  if not isinstance(res[jra], ExprInt):
375  return False
376  v = (int(res[jra].arg) - 4) / 4
377  if v is None:
378  return False
379  self.value = v
380  return True
381 
383 
384  def __init__(self):
385  self.except_on_instr = False
386 
387 
389  delayslot = 0
390 
391  def __init__(self, *args, **kargs):
392  super(instruction_sh4, self).__init__(*args, **kargs)
393 
394  def dstflow(self):
395  return self.name.startswith('J')
396 
397  @staticmethod
398  def arg2str(e, pos = None):
399  if isinstance(e, ExprId) or isinstance(e, ExprInt):
400  return str(e)
401  assert(isinstance(e, ExprMem))
402  e = e.arg
403 
404  if isinstance(e, ExprOp):
405  if e.op == "predec":
406  s = '-%s' % e.args[0]
407  elif e.op == "postinc":
408  s = '%s+' % e.args[0]
409  else:
410  s = ','.join([str(x).replace('(', '').replace(')', '')
411  for x in e.args])
412  s = "(%s)"%s
413  s = "@%s" % s
414  elif isinstance(e, ExprId):
415  s = "@%s" % e
416  else:
417  raise NotImplementedError('zarb arg2str')
418  return s
419 
420 
421  """
422  def dstflow2label(self, symbol_pool):
423  e = self.args[0]
424  if not isinstance(e, ExprInt):
425  return
426  if self.name == 'BLX':
427  ad = e.arg+8+self.offset
428  else:
429  ad = e.arg+8+self.offset
430  l = symbol_pool.getby_offset_create(ad)
431  s = ExprId(l, e.size)
432  self.args[0] = s
433  """
434 
435  def breakflow(self):
436  if self.name.startswith('J'):
437  return True
438  return False
439 
440  def is_subcall(self):
441  return self.name == 'JSR'
442 
443  def getdstflow(self, symbol_pool):
444  return [self.args[0]]
445 
446  def splitflow(self):
447  return self.name == 'JSR'
448 
449  def get_symbol_size(self, symbol, symbol_pool):
450  return 32
451 
452  def fixDstOffset(self):
453  e = self.args[0]
454  if self.offset is None:
455  raise ValueError('symbol not resolved %s' % l)
456  if not isinstance(e, ExprInt):
457  log.debug('dyn dst %r', e)
458  return
459  off = e.arg - (self.offset + 4 + self.l)
460  print hex(off)
461  if int(off % 4):
462  raise ValueError('strange offset! %r' % off)
463  self.args[0] = ExprInt32(off)
464  print 'final', self.args[0]
465 
466  def get_args_expr(self):
467  args = [a for a in self.args]
468  return args
469 
470 
471 class mn_sh4(cls_mn):
472  bintree = {}
473  regs = regs_module
474  num = 0
475  all_mn = []
476  all_mn_mode = defaultdict(list)
477  all_mn_name = defaultdict(list)
478  all_mn_inst = defaultdict(list)
479  pc = PC
480  # delayslot:
481  # http://resource.renesas.com/lib/eng/e_learnig/sh4/13/index.html
482  delayslot = 0 # unit is instruction instruction
483  instruction = instruction_sh4
484 
485  def additional_info(self):
486  info = additional_info()
487  return info
488 
489  @classmethod
490  def getbits(cls, bs, attrib, start, n):
491  if not n:
492  return 0
493  o = 0
494  if n > bs.getlen() * 8:
495  raise ValueError('not enought bits %r %r' % (n, len(bs.bin) * 8))
496  while n:
497  i = start / 8
498  c = cls.getbytes(bs, i)
499  if not c:
500  raise IOError
501  c = ord(c)
502  r = 8 - start % 8
503  c &= (1 << r) - 1
504  l = min(r, n)
505  c >>= (r - l)
506  o <<= l
507  o |= c
508  n -= l
509  start += l
510  return o
511 
512  @classmethod
513  def getbytes(cls, bs, offset, l=1):
514  out = ""
515  for _ in xrange(l):
516  n_offset = (offset & ~1) + 1 - offset % 2
517  out += bs.getbytes(n_offset, 1)
518  offset += 1
519  return out
520 
521  @classmethod
522  def check_mnemo(cls, fields):
523  l = sum([x.l for x in fields])
524  assert l == 16, "len %r" % l
525 
526  @classmethod
527  def getmn(cls, name):
528  return name.upper().replace('_', '.')
529 
530  @classmethod
531  def gen_modes(cls, subcls, name, bases, dct, fields):
532  dct['mode'] = None
533  return [(subcls, name, bases, dct, fields)]
534 
535  def value(self, mode):
536  v = super(mn_sh4, self).value(mode)
537  return [x[::-1] for x in v]
538 
539 
541  parser = dgbr_reg
542 
543  def decode(self, v):
544  self.expr = ExprMem(GBR + R0, 8)
545  return True
546 
547  def encode(self):
548  return self.expr == ExprMem(GBR + R0, 8)
549 
550 
552  parser = d_gpreg_gpreg
553 
554  def decode(self, v):
555  self.expr = ExprMem(gpregs.expr[v] + R0, self.sz)
556  return True
557 
558  def encode(self):
559  res = MatchExpr(self.expr, ExprMem(R0 + jra, self.sz), [jra])
560  if not res:
561  return False
562  r = res[jra]
563  if not r in gpregs.expr:
564  return False
565  self.value = gpregs.expr.index(r)
566  return True
567 
568 
570  parser = dgpregs_base
571 
572 
573 rn = bs(l=4, cls=(sh4_gpreg,), fname="rn")
574 rm = bs(l=4, cls=(sh4_gpreg,), fname="rm")
575 
576 
577 d08_rn = bs(l=4, cls=(sh4_dgpreg,), fname="rn", sz = 8)
578 d16_rn = bs(l=4, cls=(sh4_dgpreg,), fname="rn", sz = 16)
579 d32_rn = bs(l=4, cls=(sh4_dgpreg,), fname="rn", sz = 32)
580 d08_rm = bs(l=4, cls=(sh4_dgpreg,), fname="rm", sz = 8)
581 d16_rm = bs(l=4, cls=(sh4_dgpreg,), fname="rm", sz = 16)
582 d32_rm = bs(l=4, cls=(sh4_dgpreg,), fname="rm", sz = 32)
583 
584 
585 brm = bs(l=3, cls=(sh4_bgpreg,), fname="brm")
586 brn = bs(l=3, cls=(sh4_bgpreg,), fname="brn")
587 
588 d08rnimm = bs(l=4, fname="rn", cls=(sh4_dgpreg_imm,), sz = 8)
589 d16rnimm = bs(l=4, fname="rn", cls=(sh4_dgpreg_imm,), sz = 16)
590 d32rnimm = bs(l=4, fname="rn", cls=(sh4_dgpreg_imm,), sz = 32)
591 
592 d08rmimm = bs(l=4, fname="rm", cls=(sh4_dgpreg_imm,), sz = 8)
593 d16rmimm = bs(l=4, fname="rm", cls=(sh4_dgpreg_imm,), sz = 16)
594 d32rmimm = bs(l=4, fname="rm", cls=(sh4_dgpreg_imm,), sz = 32)
595 
596 btype = bs(l=4, fname="btype", order=-1)
597 
598 s08imm = bs(l=8, cls=(sh4_simm,), fname="imm")
599 s12imm = bs(l=12, cls=(sh4_simm,), fname="imm")
600 dpc16imm = bs(l=8, cls=(sh4_dpc16imm,), fname="pcimm", sz=16)
601 dpc32imm = bs(l=8, cls=(sh4_dpc32imm,), fname="pcimm", sz=32)
602 dimm4 = bs(l=4, fname='disp', order=-1)
603 d08gbrimm8 = bs(l=8, cls=(sh4_dgbrimm8,), fname='disp', sz=8)
604 d16gbrimm8 = bs(l=8, cls=(sh4_dgbrimm8,), fname='disp', sz=16)
605 d32gbrimm8 = bs(l=8, cls=(sh4_dgbrimm8,), fname='disp', sz=32)
606 
607 pc32imm = bs(l=8, cls=(sh4_pc32imm,), fname="pcimm")
608 
609 d08rnpinc = bs(l=4, cls=(sh4_dgpregpinc,), op='postinc', sz=8, fname="rn")
610 d08rmpinc = bs(l=4, cls=(sh4_dgpregpinc,), op='postinc', sz=8, fname="rm")
611 
612 d16rnpinc = bs(l=4, cls=(sh4_dgpregpinc,), op='postinc', sz=16, fname="rn")
613 d16rmpinc = bs(l=4, cls=(sh4_dgpregpinc,), op='postinc', sz=16, fname="rm")
614 
615 d32rnpinc = bs(l=4, cls=(sh4_dgpregpinc,), op='postinc', sz=32, fname="rn")
616 d32rmpinc = bs(l=4, cls=(sh4_dgpregpinc,), op='postinc', sz=32, fname="rm")
617 
618 d08rnpdec = bs(l=4, cls=(sh4_dgpregpinc,), op='predec', sz=8, fname="rn")
619 d08rmpdec = bs(l=4, cls=(sh4_dgpregpinc,), op='predec', sz=8, fname="rm")
620 
621 d16rnpdec = bs(l=4, cls=(sh4_dgpregpinc,), op='predec', sz=16, fname="rn")
622 d16rmpdec = bs(l=4, cls=(sh4_dgpregpinc,), op='predec', sz=16, fname="rm")
623 
624 d32rnpdec = bs(l=4, cls=(sh4_dgpregpinc,), op='predec', sz=32, fname="rn")
625 d32rmpdec = bs(l=4, cls=(sh4_dgpregpinc,), op='predec', sz=32, fname="rm")
626 
627 
628 u08imm = bs(l=8, cls=(sh4_imm,), fname="imm")
629 dr0gbr = bs(l=0, cls=(bs_dr0gbr,), sz=8)
630 
631 d08gpreg = bs(l=4, cls=(bs_dgpreg,), sz=8)
632 d32gpreg = bs(l=4, cls=(bs_dgpreg,), sz=32)
633 
634 frn = bs(l=4, cls=(sh4_freg,), fname="frn")
635 frm = bs(l=4, cls=(sh4_freg,), fname="frm")
636 
637 bd08r0gp = bs(l=4, cls=(bs_dr0gp,), sz=8)
638 bd16r0gp = bs(l=4, cls=(bs_dr0gp,), sz=16)
639 bd32r0gp = bs(l=4, cls=(bs_dr0gp,), sz=32)
640 
641 drn = bs(l=3, cls=(sh4_dr,), fname="drn")
642 drm = bs(l=3, cls=(sh4_dr,), fname="drm")
643 
644 
645 def addop(name, fields, args=None, alias=False):
646  dct = {"fields": fields}
647  dct["alias"] = alias
648  if args is not None:
649  dct['args'] = args
650  type(name, (mn_sh4,), dct)
651 
652 addop("mov", [bs('1110'), rn, s08imm], [s08imm, rn])
653 addop("mov_w", [bs('1001'), rn, dpc16imm], [dpc16imm, rn])
654 addop("mov_l", [bs('1101'), rn, dpc32imm], [dpc32imm, rn])
655 addop("mov", [bs('0110', fname="opc"), rn, rm, bs('0011')], [rm, rn])
656 addop("mov_b", [bs('0010', fname="opc"), d08_rn, rm, bs('0000')], [rm, d08_rn])
657 addop("mov_w", [bs('0010', fname="opc"), d16_rn, rm, bs('0001')], [rm, d16_rn])
658 addop("mov_l", [bs('0010', fname="opc"), d32_rn, rm, bs('0010')], [rm, d32_rn])
659 addop("mov_b", [bs('0110', fname="opc"), rn, d08_rm, bs('0000')], [d08_rm, rn])
660 addop("mov_w", [bs('0110', fname="opc"), rn, d16_rm, bs('0001')], [d16_rm, rn])
661 addop("mov_l", [bs('0110', fname="opc"), rn, d32_rm, bs('0010')], [d32_rm, rn])
662 addop("mov_b",
663  [bs('0010', fname="opc"), d08rnpdec, rm, bs('0100')], [rm, d08rnpdec])
664 addop("mov_w",
665  [bs('0010', fname="opc"), d16rnpdec, rm, bs('0101')], [rm, d16rnpdec])
666 addop("mov_l",
667  [bs('0010', fname="opc"), d32rnpdec, rm, bs('0110')], [rm, d32rnpdec])
668 addop("mov_b",
669  [bs('0110', fname="opc"), rn, d08rmpinc, bs('0100')], [rm, d08rnpinc])
670 addop("mov_w",
671  [bs('0110', fname="opc"), rn, d16rmpinc, bs('0101')], [d16rmpinc, rn])
672 addop("mov_l",
673  [bs('0110', fname="opc"), rn, d32rmpinc, bs('0110')], [d32rmpinc, rn])
674 addop("mov_b", [bs('10000000', fname='opc'), bsr0, d08rnimm, dimm4])
675 addop("mov_w", [bs('10000001', fname='opc'), bsr0, d16rnimm, dimm4])
676 addop("mov_l", [bs('0001', fname='opc'), d32rnimm, rm, dimm4], [rm, d32rnimm])
677 addop("mov_b", [bs('10000100', fname='opc'), d08rmimm, dimm4, bsr0])
678 addop("mov_w", [bs('10000101', fname='opc'), d16rmimm, dimm4, bsr0])
679 addop("mov_l", [bs('0101', fname='opc'), rn, d32rmimm, dimm4], [d32rmimm, rn])
680 addop("mov_b",
681  [bs('0000', fname='opc'), bd08r0gp, rm, bs('0100')], [rm, bd08r0gp])
682 addop("mov_w",
683  [bs('0000', fname='opc'), bd16r0gp, rm, bs('0101')], [rm, bd16r0gp])
684 addop("mov_l",
685  [bs('0000', fname='opc'), bd32r0gp, rm, bs('0110')], [rm, bd32r0gp])
686 addop("mov_b",
687  [bs('0000', fname='opc'), rn, bd08r0gp, bs('1100')], [bd08r0gp, rn])
688 addop("mov_w",
689  [bs('0000', fname='opc'), rn, bd16r0gp, bs('1101')], [bd16r0gp, rn])
690 addop("mov_l",
691  [bs('0000', fname='opc'), rn, bd32r0gp, bs('1110')], [bd32r0gp, rn])
692 
693 addop("mov_b", [bs('11000000'), bsr0, d08gbrimm8])
694 addop("mov_w", [bs('11000001'), bsr0, d16gbrimm8])
695 addop("mov_l", [bs('11000010'), bsr0, d32gbrimm8])
696 
697 addop("mov_b", [bs('11000100'), d08gbrimm8, bsr0])
698 addop("mov_w", [bs('11000101'), d16gbrimm8, bsr0])
699 addop("mov_l", [bs('11000110'), d32gbrimm8, bsr0])
700 
701 addop("mov", [bs('11000111'), pc32imm, bsr0])
702 
703 addop("swapb", [bs('0110'), rn, rm, bs('1000')], [rm, rn])
704 addop("swapw", [bs('0110'), rn, rm, bs('1001')], [rm, rn])
705 addop("xtrct", [bs('0010'), rn, rm, bs('1101')], [rm, rn])
706 
707 
708 addop("add", [bs('0011'), rn, rm, bs('1100')], [rm, rn])
709 addop("add", [bs('0111'), rn, s08imm], [s08imm, rn])
710 addop("addc", [bs('0011'), rn, rm, bs('1110')], [rm, rn])
711 addop("addv", [bs('0011'), rn, rm, bs('1111')], [rm, rn])
712 
713 
714 addop("cmpeq", [bs('10001000'), s08imm, bsr0])
715 
716 
717 addop("cmpeq", [bs('0011'), rn, rm, bs('0000')], [rm, rn])
718 addop("cmphs", [bs('0011'), rn, rm, bs('0010')], [rm, rn])
719 addop("cmpge", [bs('0011'), rn, rm, bs('0011')], [rm, rn])
720 addop("cmphi", [bs('0011'), rn, rm, bs('0110')], [rm, rn])
721 addop("cmpgt", [bs('0011'), rn, rm, bs('0111')], [rm, rn])
722 
723 
724 addop("cmppz", [bs('0100'), rn, bs('00010001')])
725 addop("cmppl", [bs('0100'), rn, bs('00010101')])
726 addop("cmpstr", [bs('0010'), rn, rm, bs('1100')], [rm, rn])
727 
728 
729 addop("div1", [bs('0011'), rn, rm, bs('0100')], [rm, rn])
730 
731 addop("div0s", [bs('0010'), rn, rm, bs('0111')], [rm, rn])
732 addop("div0u", [bs('0000000000011001')])
733 
734 addop("dmuls", [bs('0011'), rn, rm, bs('1101')], [rm, rn])
735 addop("dmulu", [bs('0011'), rn, rm, bs('0101')], [rm, rn])
736 
737 addop("dt", [bs('0100'), rn, bs('00010000')])
738 
739 
740 addop("extsb", [bs('0110'), rn, rm, bs('1110')], [rm, rn])
741 addop("extsw", [bs('0110'), rn, rm, bs('1111')], [rm, rn])
742 addop("extub", [bs('0110'), rn, rm, bs('1100')], [rm, rn])
743 addop("extuw", [bs('0110'), rn, rm, bs('1101')], [rm, rn])
744 
745 addop("mac_l", [bs('0000', fname='opc'), d32rnpinc,
746  d32rmpinc, bs('1111')], [d32rmpinc, d32rnpinc])
747 addop("mac_w", [bs('0100', fname='opc'), d16rnpinc,
748  d16rmpinc, bs('1111')], [d16rmpinc, d16rnpinc])
749 
750 addop("mull", [bs('0000'), rn, rm, bs('0111')], [rm, rn])
751 addop("mulsw", [bs('0010'), rn, rm, bs('1111')], [rm, rn])
752 addop("muluw", [bs('0010'), rn, rm, bs('1110')], [rm, rn])
753 
754 addop("neg", [bs('0110'), rn, rm, bs('1011')], [rm, rn])
755 addop("negc", [bs('0110'), rn, rm, bs('1010')], [rm, rn])
756 
757 addop("sub", [bs('0011'), rn, rm, bs('1000')], [rm, rn])
758 addop("subc", [bs('0011'), rn, rm, bs('1010')], [rm, rn])
759 addop("subv", [bs('0011'), rn, rm, bs('1011')], [rm, rn])
760 
761 addop("and", [bs('0010'), rn, rm, bs('1001')], [rm, rn])
762 addop("and", [bs('11001001'), u08imm, bsr0])
763 addop("and_b", [bs('11001101'), u08imm, dr0gbr])
764 
765 addop("not", [bs('0110'), rn, rm, bs('0111')], [rm, rn])
766 
767 addop("or", [bs('0010'), rn, rm, bs('1011')], [rm, rn])
768 
769 addop("or", [bs('11001011'), u08imm, bsr0])
770 addop("or_b", [bs('11001111'), u08imm, dr0gbr])
771 
772 addop("tas_b", [bs('0100'), d08gpreg, bs('00011011')])
773 addop("tst", [bs('0010'), rn, rm, bs('1000')], [rm, rn])
774 addop("tst", [bs('11001000'), u08imm, bsr0])
775 addop("tst_b", [bs('11001100'), u08imm, dr0gbr])
776 
777 
778 addop("xor", [bs('0010'), rn, rm, bs('1010')], [rm, rn])
779 addop("xor", [bs('11001010'), u08imm, bsr0])
780 addop("xor_b", [bs('11001110'), u08imm, dr0gbr])
781 
782 addop("rotl", [bs('0100'), rn, bs('00000100')])
783 addop("rotr", [bs('0100'), rn, bs('00000101')])
784 addop("rotcl", [bs('0100'), rn, bs('00100100')])
785 addop("rotcr", [bs('0100'), rn, bs('00100101')])
786 
787 addop("shad", [bs('0100'), rn, rm, bs('1100')], [rm, rn])
788 addop("shal", [bs('0100'), rn, bs('00100000')])
789 addop("shar", [bs('0100'), rn, bs('00100001')])
790 addop("shld", [bs('0100'), rn, rm, bs('1101')], [rm, rn])
791 
792 addop("shll", [bs('0100'), rn, bs('00000000')])
793 addop("shlr", [bs('0100'), rn, bs('00000001')])
794 addop("shll2", [bs('0100'), rn, bs('00001000')])
795 addop("shlr2", [bs('0100'), rn, bs('00001001')])
796 addop("shll8", [bs('0100'), rn, bs('00011000')])
797 addop("shlr8", [bs('0100'), rn, bs('00011001')])
798 addop("shll16", [bs('0100'), rn, bs('00101000')])
799 addop("shlr16", [bs('0100'), rn, bs('00101001')])
800 
801 
802 addop("bf", [bs('10001011'), s08imm])
803 """
804  def splitflow(self):
805  return True
806  def breakflow(self):
807  return True
808  def dstflow(self):
809  return True
810  def dstflow2label(self, symbol_pool):
811  e = self.args[0].expr
812  ad = e.arg*2+4+self.offset
813  l = symbol_pool.getby_offset_create(ad)
814  s = ExprId(l, e.size)
815  self.args[0].expr = s
816 """
817 
818 addop("bfs", [bs('10001111'), s08imm])
819 """
820  delayslot = 1
821 """
822 addop("bt", [bs('10001001'), s08imm])
823 
824 addop("bts", [bs('10001101'), s08imm])
825 
826 addop("bra", [bs('1010'), s12imm])
827 """
828  delayslot = 1
829  def breakflow(self):
830  return True
831  def dstflow(self):
832  return True
833  def dstflow2label(self, symbol_pool):
834  e = self.args[0].expr
835  ad = e.arg*2+4+self.offset
836  l = symbol_pool.getby_offset_create(ad)
837  s = ExprId(l, e.size)
838  self.args[0].expr = s
839 """
840 
841 addop("braf", [bs('0000'), rn, bs('00100011')])
842 """
843  delayslot = 1
844  def breakflow(self):
845  return True
846  def dstflow(self):
847  return True
848 """
849 addop("bsr", [bs('1011'), s12imm])
850 
851 addop("bsrf", [bs('0000'), rn, bs('00000011')])
852 """
853  delayslot = 1
854  def breakflow(self):
855  return True
856  def is_subcall(self):
857  return True
858  def splitflow(self):
859  return True
860 """
861 
862 addop("jmp_l", [bs('0100'), d32gpreg, bs('00101011')])
863 """
864  delayslot = 1
865  def breakflow(self):
866  return True
867 """
868 
869 addop("jsr_l", [bs('0100'), d32gpreg, bs('00001011')])
870 """
871  delayslot = 1
872  def breakflow(self):
873  return True
874  def is_subcall(self):
875  return True
876  def splitflow(self):
877  return True
878 """
879 
880 addop("rts", [bs('0000000000001011')])
881 """
882  delayslot = 1
883  def breakflow(self):
884  return True
885 """
886 addop("clrmac", [bs('0000000000101000')])
887 addop("clrs", [bs('0000000001001000')])
888 addop("clrt", [bs('0000000000001000')])
889 
890 
891 addop("ldc", [bs('0100'), rm, bssr, bs('00001110')])
892 addop("ldc", [bs('0100'), rm, bsgbr, bs('00011110')])
893 addop("ldc", [bs('0100'), rm, bsvbr, bs('00101110')])
894 addop("ldc", [bs('0100'), rm, bsssr, bs('00111110')])
895 addop("ldc", [bs('0100'), rm, bsspc, bs('01001110')])
896 addop("ldc", [bs('0100'), rm, bsdbr, bs('11111010')])
897 addop("ldc", [bs('0100'), rm, bs('1'), brn, bs('1110')], [rm, brn])
898 addop("ldc_l", [bs('0100'), d32rmpinc, bssr, bs('00000111')])
899 addop("ldc_l", [bs('0100'), d32rmpinc, bsgbr, bs('00010111')])
900 addop("ldc_l", [bs('0100'), d32rmpinc, bsvbr, bs('00100111')])
901 addop("ldc_l", [bs('0100'), d32rmpinc, bsssr, bs('00110111')])
902 addop("ldc_l", [bs('0100'), d32rmpinc, bsspc, bs('01000111')])
903 addop("ldc_l", [bs('0100'), d32rmpinc, bsdbr, bs('11110110')])
904 addop("ldc_l", [bs('0100'), d32rmpinc, bs('1'), brn, bs('0111')])
905 addop("lds", [bs('0100'), rm, bsmach, bs('00001010')])
906 addop("lds", [bs('0100'), rm, bsmacl, bs('00011010')])
907 addop("lds", [bs('0100'), rm, bspr, bs('00101010')])
908 addop("lds_l", [bs('0100'), d32rmpinc, bsmach, bs('00000110')])
909 addop("lds_l", [bs('0100'), d32rmpinc, bsmacl, bs('00010110')])
910 addop("lds_l", [bs('0100'), d32rmpinc, bspr, bs('00100110')])
911 addop("ldtlb", [bs('0000000000111000')])
912 
913 addop("movca_l", [bs('0000'), bsr0, d32gpreg, bs('11000011')])
914 addop("nop", [bs('0000000000001001')])
915 addop("ocbi_l", [bs('0000'), d32gpreg, bs('10010011')])
916 addop("ocbp_l", [bs('0000'), d32gpreg, bs('10100011')])
917 addop("ocbwb_l", [bs('0000'), d32gpreg, bs('10110011')])
918 addop("pref_l", [bs('0000'), d32gpreg, bs('10000011')])
919 
920 
921 addop("rte", [bs('0000000000101011')])
922 addop("sets", [bs('0000000001011000')])
923 addop("sett", [bs('0000000000011000')])
924 addop("sleep", [bs('0000000000011011')])
925 addop("stc", [bs('0000'), bssr, rn, bs('00000010')])
926 addop("stc", [bs('0000'), bsgbr, rn, bs('00010010')])
927 addop("stc", [bs('0000'), bsvbr, rn, bs('00100010')])
928 addop("stc", [bs('0000'), bsssr, rn, bs('00110010')])
929 addop("stc", [bs('0000'), bsspc, rn, bs('01000010')])
930 addop("stc", [bs('0000'), bssgr, rn, bs('00111010')])
931 addop("stc", [bs('0000'), bsdbr, rn, bs('11111010')])
932 addop("stc", [bs('0000'), rn, bs('1'), brm, bs('0010')], [brm, rn])
933 
934 addop("stc_l", [bs('0100'), bssr, d32rmpdec, bs('00000011')])
935 addop("stc_l", [bs('0100'), bsgbr, d32rmpdec, bs('00010011')])
936 addop("stc_l", [bs('0100'), bsvbr, d32rmpdec, bs('00100011')])
937 addop("stc_l", [bs('0100'), bsssr, d32rmpdec, bs('00110011')])
938 addop("stc_l", [bs('0100'), bsspc, d32rmpdec, bs('01000011')])
939 addop("stc_l", [bs('0100'), bssgr, d32rmpdec, bs('00110010')])
940 addop("stc_l", [bs('0100'), bsdbr, d32rmpdec, bs('11110010')])
941 addop("stc_l",
942  [bs('0100'), d32rnpdec, bs('1'), brm, bs('0011')], [brm, d32rnpdec])
943 
944 # float
945 addop("sts", [bs('0000'), bsmach, rm, bs('00001010')])
946 addop("sts", [bs('0000'), bsmacl, rm, bs('00011010')])
947 addop("sts", [bs('0000'), bspr, rm, bs('00101010')])
948 addop("sts_l", [bs('0100'), bsmach, d32rmpdec, bs('00000010')])
949 addop("sts_l", [bs('0100'), bsmacl, d32rmpdec, bs('00010010')])
950 addop("sts_l",
951  [bs('0100'), d32rnpdec, bspr, bs('00100010')], [bspr, d32rnpdec])
952 addop("trapa", [bs('11000011'), u08imm])
953 
954 addop("fldi0", [bs('1111'), frn, bs('10001101')])
955 addop("fldi1", [bs('1111'), frn, bs('10011101')])
956 addop("fmov", [bs('1111'), frn, frm, bs('1100')], [frm, frn])
957 addop("fmov_s", [bs('1111'), frn, d32gpreg, bs('1000')], [d32gpreg, frn])
958 addop("fmov_s", [bs('1111'), frn, bd32r0gp, bs('0110')], [bd32r0gp, frn])
959 addop("fmov_s", [bs('1111'), frn, d32rmpinc, bs('1001')], [d32rmpinc, frn])
960 addop("fmov_s", [bs('1111'), d32gpreg, frm, bs('1010')], [frm, d32gpreg])
961 addop("fmov_s", [bs('1111'), d32rnpdec, frm, bs('1011')], [frm, d32rnpdec])
962 addop("fmov_s", [bs('1111'), bd32r0gp, frm, bs('0111')], [frm, bd32r0gp])
963 
964 addop("flds", [bs('1111'), frm, bsfpul, bs('00011101')])
965 addop("fsts", [bs('1111'), bsfpul, frm, bs('00001101')])
966 addop("fabs", [bs('1111'), frn, bs('01011101')])
967 addop("fadd", [bs('1111'), frn, frm, bs('0000')], [frm, frn])
968 addop("fcmpeq", [bs('1111'), frn, frm, bs('0100')], [frm, frn])
969 addop("fcmpgt", [bs('1111'), frn, frm, bs('0101')], [frm, frn])
970 addop("fdiv", [bs('1111'), frn, frm, bs('0011')], [frm, frn])
971 
972 addop("float", [bs('1111'), bsfpul, frn, bs('00101101')])
973 addop("fmac", [bs('1111'), bsfr0, frn, frm, bs('1110')], [bsfr0, frm, frn])
974 addop("fmul", [bs('1111'), frn, frm, bs('0010')], [frm, frn])
975 addop("fneg", [bs('1111'), frn, bs('01001101')])
976 addop("fsqrt", [bs('1111'), frn, bs('01101101')])
977 addop("fsub", [bs('1111'), frn, frm, bs('0001')], [frm, frn])
978 addop("ftrc", [bs('1111'), frm, bsfpul, bs('00111101')])
def parse_deref_mem
Definition: arch.py:68
def parse_deref_pcimm
Definition: arch.py:30
def sign_ext
Definition: cpu.py:1602
def parse_pcandimmimm
Definition: arch.py:35