about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAjax <commial@gmail.com>2015-04-23 18:29:23 +0200
committerAjax <commial@gmail.com>2015-04-23 18:29:23 +0200
commitd0fd34c341103d17c7f7a6409d23a34b7d362747 (patch)
tree725257ec699c3a40a4aca6e066730a0d2caf700d
parent2f37ae22fcbd173a5554aa3fba922e7f9713cf83 (diff)
downloadmiasm-d0fd34c341103d17c7f7a6409d23a34b7d362747.tar.gz
miasm-d0fd34c341103d17c7f7a6409d23a34b7d362747.zip
Mips32Sem: Update semantic according to SemBuilder
Diffstat (limited to '')
-rw-r--r--miasm2/arch/mips32/sem.py379
1 files changed, 160 insertions, 219 deletions
diff --git a/miasm2/arch/mips32/sem.py b/miasm2/arch/mips32/sem.py
index 0d62cc58..9589eb1e 100644
--- a/miasm2/arch/mips32/sem.py
+++ b/miasm2/arch/mips32/sem.py
@@ -130,52 +130,41 @@ def l_and(Arg1, Arg2, Arg3):
     a register @Arg1"""
     Arg1 = Arg2 & Arg3
 
-def ext(ir, instr, a, b, c, d):
-    e = []
+@sbuild.parse
+def ext(a, b, c, d):
     pos = int(c.arg)
     size = int(d.arg)
-    e.append(m2_expr.ExprAff(a, b[pos:pos+size].zeroExtend(32)))
-    return e, []
+    a = b[pos:pos + size].zeroExtend(32)
 
-def mul(ir, instr, a, b, c):
+@sbuild.parse
+def mul(a, b, c):
     """Multiplies @b by $c and stores the result in @a."""
-    e = []
-    e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('imul', b, c)))
-    return e, []
+    a = 'imul'(b, c)
 
-def sltu(ir, instr, a, x, y):
+@sbuild.parse
+def sltu(a, x, y):
     """If @y is less than @x (unsigned), @a is set to one. It gets zero
     otherwise."""
-    e = []
-    value = (((x - y) ^ ((x ^ y) & ((x - y) ^ x))) ^ x ^ y).msb().zeroExtend(32)
-    e.append(m2_expr.ExprAff(a, value))
-    return e, []
+    a = (((x - y) ^ ((x ^ y) & ((x - y) ^ x))) ^ x ^ y).msb().zeroExtend(32)
 
-def slt(ir, instr, a, x, y):
+@sbuild.parse
+def slt(a, x, y):
     """If @y is less than @x (signed), @a is set to one. It gets zero
     otherwise."""
-    e = []
-    value = ((x - y) ^ ((x ^ y) & ((x - y) ^ x))).zeroExtend(32)
-    e.append(m2_expr.ExprAff(a, value))
-    return e, []
+    a = ((x - y) ^ ((x ^ y) & ((x - y) ^ x))).zeroExtend(32)
 
-def l_sub(ir, instr, a, b, c):
-    e = []
-    e.append(m2_expr.ExprAff(a, b-c))
-    return e, []
+@sbuild.parse
+def l_sub(a, b, c):
+    a = b - c
 
-def sb(ir, instr, a, b):
+@sbuild.parse
+def sb(a, b):
     "The least significant byte of @a is stored at the specified address @b."
-    e = []
-    b = m2_expr.ExprMem(b.arg, 8)
-    e.append(m2_expr.ExprAff(b, a[:8]))
-    return e, []
+    mem8[b.arg] = a[:8]
 
-def sh(ir, instr, a, b):
-    e = []
-    b = m2_expr.ExprMem(b.arg, 16)
-    e.append(m2_expr.ExprAff(b, a[:16]))
-    return e, []
+@sbuild.parse
+def sh(a, b):
+    mem16[b.arg] = a[:16]
 
 def movn(ir, instr, a, b, c):
     lbl_do = m2_expr.ExprId(ir.gen_label(), 32)
@@ -199,167 +188,134 @@ def movz(ir, instr, a, b, c):
 
     return e, [irbloc(lbl_do.name, [e_do], [])]
 
-def srl(ir, instr, a, b, c):
+@sbuild.parse
+def srl(a, b, c):
     """Shifts a register value @b right by the shift amount @c and places the
     value in the destination register @a. Zeroes are shifted in."""
-    e = []
-    e.append(m2_expr.ExprAff(a, b >> c))
-    return e, []
+    a = b >> c
 
-def sra(ir, instr, a, b, c):
+@sbuild.parse
+def sra(a, b, c):
     """Shifts a register value @b right by the shift amount @c and places the
     value in the destination register @a. The sign bit is shifted in."""
-    e = []
-    e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('a>>', b, c)))
-    return e, []
+    a = 'a>>'(b, c)
 
-def srav(ir, instr, a, b, c):
-    e = []
-    value = m2_expr.ExprOp('a>>', b, c&m2_expr.ExprInt32(0x1F))
-    e.append(m2_expr.ExprAff(a, value))
-    return e, []
+@sbuild.parse
+def srav(a, b, c):
+    a = 'a>>'(b, c & i32(0x1F))
 
-def sll(ir, instr, a, b, c):
-    e = []
-    e.append(m2_expr.ExprAff(a, b<<c))
-    return e, []
+@sbuild.parse
+def sll(a, b, c):
+    a = b << c
 
-def srlv(ir, instr, a, b, c):
+@sbuild.parse
+def srlv(a, b, c):
     """Shifts a register value @b right by the amount specified in @c and places
     the value in the destination register @a. Zeroes are shifted in."""
-    e = []
-    e.append(m2_expr.ExprAff(a, b >> (c & m2_expr.ExprInt32(0x1F))))
-    return e, []
+    a = b >> (c & i32(0x1F))
 
-def sllv(ir, instr, a, b, c):
+@sbuild.parse
+def sllv(a, b, c):
     """Shifts a register value @b left by the amount specified in @c and places
     the value in the destination register @a. Zeroes are shifted in."""
-    e = []
-    e.append(m2_expr.ExprAff(a, b << (c & m2_expr.ExprInt32(0x1F))))
-    return e, []
+    a = b << (c & i32(0x1F))
 
-def l_xor(ir, instr, a, b, c):
+@sbuild.parse
+def l_xor(a, b, c):
     """Exclusive ors two registers @b, @c and stores the result in a register
     @c"""
-    e = []
-    e.append(m2_expr.ExprAff(a, b^c))
-    return e, []
+    a = b ^ c
 
-def seb(ir, instr, a, b):
-    e = []
-    e.append(m2_expr.ExprAff(a, b[:8].signExtend(32)))
-    return e, []
+@sbuild.parse
+def seb(a, b):
+    a = b[:8].signExtend(32)
 
-def seh(ir, instr, a, b):
-    e = []
-    e.append(m2_expr.ExprAff(a, b[:16].signExtend(32)))
-    return e, []
+@sbuild.parse
+def seh(a, b):
+    a = b[:16].signExtend(32)
 
-def bltz(ir, instr, a, b):
+@sbuild.parse
+def bltz(a, b):
     """Branches on @b if the register @a is less than zero"""
-    e = []
-    n = m2_expr.ExprId(ir.get_next_break_label(instr))
-    dst_o = m2_expr.ExprCond(a.msb(), b, n)
-    e = [m2_expr.ExprAff(PC, dst_o),
-         m2_expr.ExprAff(ir.IRDst, dst_o)
-    ]
-    return e, []
+    dst_o = b if a.msb() else ExprId(ir.get_next_break_label(instr))
+    PC = dst_o
+    ir.IRDst = dst_o
 
-def blez(ir, instr, a, b):
+@sbuild.parse
+def blez(a, b):
     """Branches on @b if the register @a is less than or equal to zero"""
-    e = []
-    n = m2_expr.ExprId(ir.get_next_break_label(instr))
-    cond = m2_expr.ExprCond(a, m2_expr.ExprInt1(1),
-                            m2_expr.ExprInt1(0)) | a.msb()
-    dst_o = m2_expr.ExprCond(cond, b, n)
-    e = [m2_expr.ExprAff(PC, dst_o),
-         m2_expr.ExprAff(ir.IRDst, dst_o)
-    ]
-    return e, []
+    cond = (i1(1) if a else i1(0)) | a.msb()
+    dst_o = b if cond else ExprId(ir.get_next_break_label(instr))
+    PC = dst_o
+    ir.IRDst = dst_o
 
-def bgtz(ir, instr, a, b):
+@sbuild.parse
+def bgtz(a, b):
     """Branches on @b if the register @a is greater than zero"""
-    e = []
-    n = m2_expr.ExprId(ir.get_next_break_label(instr))
-    cond = m2_expr.ExprCond(a, m2_expr.ExprInt1(1),
-                            m2_expr.ExprInt1(0)) | a.msb()
-    dst_o = m2_expr.ExprCond(cond, n, b)
-    e = [m2_expr.ExprAff(PC, dst_o),
-         m2_expr.ExprAff(ir.IRDst, dst_o)
-     ]
-    return e, []
+    cond = (i1(1) if a else i1(0)) | a.msb()
+    dst_o = ExprId(ir.get_next_break_label(instr)) if cond else b
+    PC = dst_o
+    ir.IRDst = dst_o
 
-def wsbh(ir, instr, a, b):
-    e = [m2_expr.ExprAff(a, m2_expr.ExprCompose([(b[8:16],  0, 8),
-                                 (b[0:8]  , 8, 16),
-                                 (b[24:32], 16, 24),
-                                 (b[16:24], 24, 32)]))]
-    return e, []
+@sbuild.parse
+def wsbh(a, b):
+    a = ExprCompose([(b[8:16],  0, 8),
+                     (b[0:8]  , 8, 16),
+                     (b[24:32], 16, 24),
+                     (b[16:24], 24, 32)])
 
-def rotr(ir, instr, a, b, c):
-    e = []
-    e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('>>>', b, c)))
-    return e, []
+@sbuild.parse
+def rotr(a, b, c):
+    a = '>>>'(b, c)
 
-def add_d(ir, instr, a, b, c):
+@sbuild.parse
+def add_d(a, b, c):
     # XXX TODO check
-    e = []
-    e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('fadd', b, c)))
-    return e, []
+    a = 'fadd'(b, c)
 
-def sub_d(ir, instr, a, b, c):
+@sbuild.parse
+def sub_d(a, b, c):
     # XXX TODO check
-    e = []
-    e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('fsub', b, c)))
-    return e, []
+    a = 'fsub'(b, c)
 
-def div_d(ir, instr, a, b, c):
+@sbuild.parse
+def div_d(a, b, c):
     # XXX TODO check
-    e = []
-    e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('fdiv', b, c)))
-    return e, []
+    a = 'fdiv'(b, c)
 
-def mul_d(ir, instr, a, b, c):
+@sbuild.parse
+def mul_d(a, b, c):
     # XXX TODO check
-    e = []
-    e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('fmul', b, c)))
-    return e, []
+    a = 'fmul'(b, c)
 
-def mov_d(ir, instr, a, b):
+@sbuild.parse
+def mov_d(a, b):
     # XXX TODO check
-    e = []
-    e.append(m2_expr.ExprAff(a, b))
-    return e, []
+    a = b
 
-def mfc0(ir, instr, a, b):
-    e = []
-    e.append(m2_expr.ExprAff(a, b))
-    return e, []
+@sbuild.parse
+def mfc0(a, b):
+    a = b
 
-def mfc1(ir, instr, a, b):
-    e = []
-    e.append(m2_expr.ExprAff(a, b))
-    return e, []
+@sbuild.parse
+def mfc1(a, b):
+    a = b
 
-def mtc0(ir, instr, a, b):
-    e = []
-    e.append(m2_expr.ExprAff(b, a))
-    return e, []
+@sbuild.parse
+def mtc0(a, b):
+    b = a
 
-def mtc1(ir, instr, a, b):
-    e = []
-    e.append(m2_expr.ExprAff(b, a))
-    return e, []
+@sbuild.parse
+def mtc1(a, b):
+    b = a
 
-def tlbwi(ir, instr):
-    # TODO XXX
-    e = []
-    return e, []
+@sbuild.parse
+def tlbwi():
+    "TODO XXX"
 
-def tlbp(ir, instr):
-    # TODO XXX
-    e = []
-    return e, []
+@sbuild.parse
+def tlbp():
+    "TODO XXX"
 
 def ins(ir, instr, a, b, c, d):
     e = []
@@ -378,95 +334,80 @@ def ins(ir, instr, a, b, c, d):
     return e, []
 
 
-def lwc1(ir, instr, a, b):
-    e = []
-    src = m2_expr.ExprOp('mem_%.2d_to_single' % b.size, b)
-    e.append(m2_expr.ExprAff(a, src))
-    return e, []
+@sbuild.parse
+def lwc1(a, b):
+    a = ('mem_%.2d_to_single' % b.size)(b)
 
-def swc1(ir, instr, a, b):
-    e = []
-    src = m2_expr.ExprOp('single_to_mem_%.2d' % a.size, a)
-    e.append(m2_expr.ExprAff(b, src))
-    return e, []
+@sbuild.parse
+def swc1(a, b):
+    b = ('single_to_mem_%.2d' % a.size)(a)
 
-def c_lt_d(ir, instr, a, b, c):
-    e = []
-    e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('fcomp_lt', b, c)))
-    return e, []
+@sbuild.parse
+def c_lt_d(a, b, c):
+    a = 'fcomp_lt'(b, c)
 
-def c_eq_d(ir, instr, a, b, c):
-    e = []
-    e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('fcomp_eq', b, c)))
-    return e, []
+@sbuild.parse
+def c_eq_d(a, b, c):
+    a = 'fcomp_eq'(b, c)
 
-def c_le_d(ir, instr, a, b, c):
-    e = []
-    e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('fcomp_le', b, c)))
-    return e, []
+@sbuild.parse
+def c_le_d(a, b, c):
+    a = 'fcomp_le'(b, c)
 
-def bc1t(ir, instr, a, b):
-    e = []
-    n = m2_expr.ExprId(ir.get_next_break_label(instr))
-    dst_o = m2_expr.ExprCond(a, b, n)
-    e = [m2_expr.ExprAff(PC, dst_o)]
-    e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
-    return e, []
+@sbuild.parse
+def bc1t(a, b):
+    dst_o = b if a else ExprId(ir.get_next_break_label(instr))
+    PC = dst_o
+    ir.IRDst = dst_o
 
-def bc1f(ir, instr, a, b):
-    e = []
-    n = m2_expr.ExprId(ir.get_next_break_label(instr))
-    dst_o = m2_expr.ExprCond(a, n, b)
-    e = [m2_expr.ExprAff(PC, dst_o)]
-    e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
-    return e, []
+@sbuild.parse
+def bc1f(a, b):
+    dst_o = ExprId(ir.get_next_break_label(instr)) if a else b
+    PC = dst_o
+    ir.IRDst = dst_o
 
-def cvt_d_w(ir, instr, a, b):
-    e = []
+@sbuild.parse
+def cvt_d_w(a, b):
     # TODO XXX
-    e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('flt_d_w', b)))
-    return e, []
+    a = 'flt_d_w'(b)
 
-def mult(ir, instr, a, b):
+@sbuild.parse
+def mult(a, b):
     """Multiplies (signed) @a by @b and stores the result in $R_HI:$R_LO"""
-    e = []
     size = a.size
-    r = a.signExtend(size * 2) * b.signExtend(size * 2)
+    result = a.signExtend(size * 2) * b.signExtend(size * 2)
+    R_LO = result[:32]
+    R_HI = result[32:]
 
-    e.append(m2_expr.ExprAff(R_LO, r[:32]))
-    e.append(m2_expr.ExprAff(R_HI, r[32:]))
-    return e, []
-
-def multu(ir, instr, a, b):
+@sbuild.parse
+def multu(a, b):
     """Multiplies (unsigned) @a by @b and stores the result in $R_HI:$R_LO"""
-    e = []
     size = a.size
-    r = a.zeroExtend(size * 2) * b.zeroExtend(size * 2)
-
-    e.append(m2_expr.ExprAff(R_LO, r[:32]))
-    e.append(m2_expr.ExprAff(R_HI, r[32:]))
-    return e, []
+    result = a.zeroExtend(size * 2) * b.zeroExtend(size * 2)
+    R_LO = result[:32]
+    R_HI = result[32:]
 
-def mfhi(ir, instr, a):
+@sbuild.parse
+def mfhi(a):
     "The contents of register $R_HI are moved to the specified register @a."
-    e = []
-    e.append(m2_expr.ExprAff(a, R_HI))
-    return e, []
+    a = R_HI
 
-def mflo(ir, instr, a):
+@sbuild.parse
+def mflo(a):
     "The contents of register R_LO are moved to the specified register @a."
-    e = []
-    e.append(m2_expr.ExprAff(a, R_LO))
-    return e, []
+    a = R_LO
 
-def di(ir, instr, a):
-    return [], []
+@sbuild.parse
+def di(a):
+    "NOP"
 
-def ei(ir, instr, a):
-    return [], []
+@sbuild.parse
+def ei(a):
+    "NOP"
 
-def ehb(ir, instr, a):
-    return [], []
+@sbuild.parse
+def ehb(a):
+    "NOP"
 
 mnemo_func = {
     "addiu": addiu,