7 "Translate a Miasm expression to an equivalent C code"
13 dct_shift = {
'a>>':
"right_arith",
18 dct_rot = {
'<<<':
'rot_left',
21 dct_div = {
'div8':
"div_op",
25 '<<<c_rez':
'rcl_rez_op',
26 '<<<c_cf':
'rcl_cf_op',
27 '>>>c_rez':
'rcr_rez_op',
28 '>>>c_cf':
'rcr_cf_op',
33 if isinstance(expr.name, asmbloc.asm_label):
34 return "0x%x" % expr.name.offset
38 return "0x%x" % expr.arg.arg
41 return "%s = %s" % tuple(map(self.
from_expr, (expr.dst, expr.src)))
44 return "(%s?%s:%s)" % tuple(map(self.
from_expr,
45 (expr.cond, expr.src1, expr.src2)))
48 return "MEM_LOOKUP_%.2d(jitcpu, %s)" % (expr.size,
52 if len(expr.args) == 1:
53 if expr.op ==
'parity':
54 return "parity(%s&0x%x)" % (self.
from_expr(expr.args[0]),
56 elif expr.op
in [
'bsr',
'bsf']:
57 return "x86_%s(%s, 0x%x)" % (expr.op,
61 return "(~ %s)&0x%x" % (self.
from_expr(expr.args[0]),
63 elif expr.op
in [
"hex2bcd",
"bcd2hex"]:
64 return "%s_%d(%s)" % (expr.op, expr.args[0].size,
66 elif (expr.op.startswith(
"double_to_")
or
67 expr.op.endswith(
"_to_double")
or
68 expr.op.startswith(
"access_")
or
69 expr.op.startswith(
"load_")
or
70 expr.op
in [
"-",
"ftan",
"frndint",
"f2xm1",
71 "fsin",
"fsqrt",
"fabs",
"fcos"]):
72 return "%s(%s)" % (expr.op, self.
from_expr(expr.args[0]))
74 raise NotImplementedError(
'Unknown op: %r' % expr.op)
76 elif len(expr.args) == 2:
78 return '(((%s&0x%x) == (%s&0x%x))?1:0)' % (
82 return 'shift_%s_%.2d(%s , %s)' % (self.
dct_shift[expr.op],
86 elif expr.is_associative()
or expr.op
in [
"%",
"/"]:
89 oper = str(expr.op).join(oper)
90 return "((%s)&0x%x)" % (oper,
size2mask(expr.args[0].size))
91 elif expr.op
in [
'-']:
92 return '(((%s&0x%x) %s (%s&0x%x))&0x%x)' % (
98 return '(%s(%s, %s, %s) &0x%x)' % (self.
dct_rot[expr.op],
103 elif (expr.op.startswith(
'cpuid')
or
104 expr.op.startswith(
"fcom")
or
105 expr.op
in [
"fadd",
"fsub",
"fdiv",
'fmul',
"fscale"]):
106 return "%s(%s, %s)" % (expr.op, self.
from_expr(expr.args[0]),
108 elif expr.op ==
"segm":
109 return "segm2addr(jitcpu, %s, %s)" % (
111 elif expr.op
in [
'udiv',
'umod',
'idiv',
'imod']:
112 return '%s%d((vm_cpu_t*)jitcpu->cpu, %s, %s)' % (expr.op,
116 elif expr.op
in [
"bcdadd",
"bcdadd_cf"]:
117 return "%s_%d(%s, %s)" % (expr.op, expr.args[0].size,
121 raise NotImplementedError(
'Unknown op: %r' % expr.op)
123 elif len(expr.args) == 3
and expr.op
in self.
dct_div:
124 return '(%s(%s, %s, %s, %s) &0x%x)' % (self.
dct_div[expr.op],
131 elif len(expr.args) >= 3
and expr.is_associative():
133 for arg
in expr.args]
134 oper = str(expr.op).join(oper)
135 return "((%s)&0x%x)" % (oper,
size2mask(expr.args[0].size))
138 raise NotImplementedError(
'Unknown op: %s' % expr.op)
142 return "((%s>>%d) & 0x%X)" % (self.
from_expr(expr.arg),
144 (1 << (expr.stop - expr.start)) - 1)
149 dst_cast =
"uint%d_t" % expr.size
151 out.append(
"(((%s)(%s & 0x%X)) << %d)" % (dst_cast,
153 (1 << (x[2] - x[1])) - 1,
155 out =
' | '.join(out)
156 return '(' + out +
')'
160 Translator.register(TranslatorC)