about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2018-09-20 07:53:13 +0200
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2018-10-01 06:55:22 +0200
commit9c4c548e372311f6d685647b3cfed35e1579ad54 (patch)
treee29e888313ab79d5150ecd517c0fe3d8ada8e977
parent9c8596646ba6150694deb984f25aaad73d2c7125 (diff)
downloadmiasm-9c4c548e372311f6d685647b3cfed35e1579ad54.tar.gz
miasm-9c4c548e372311f6d685647b3cfed35e1579ad54.zip
Expresion: use ExprAssign instead of ExprAff
ExprAff stands for (in french) "Expression affectation"
We will now use ExprAssign (for Expression Assignment)
(instead of ExprAss)
-rw-r--r--example/expression/solve_condition_stp.py4
-rw-r--r--example/ida/ctype_propagation.py10
-rw-r--r--example/ida/symbol_exec.py4
-rw-r--r--example/ida/utils.py2
-rw-r--r--example/symbol_exec/dse_strategies.py4
-rw-r--r--miasm2/analysis/depgraph.py6
-rw-r--r--miasm2/analysis/dse.py8
-rw-r--r--miasm2/analysis/ssa.py10
-rw-r--r--miasm2/arch/aarch64/sem.py128
-rw-r--r--miasm2/arch/arm/ira.py10
-rw-r--r--miasm2/arch/arm/jit.py2
-rw-r--r--miasm2/arch/arm/sem.py384
-rw-r--r--miasm2/arch/mep/sem.py14
-rw-r--r--miasm2/arch/mips32/ira.py4
-rw-r--r--miasm2/arch/mips32/sem.py10
-rw-r--r--miasm2/arch/msp430/sem.py126
-rw-r--r--miasm2/arch/ppc/ira.py6
-rw-r--r--miasm2/arch/ppc/sem.py170
-rw-r--r--miasm2/arch/x86/arch.py2
-rw-r--r--miasm2/arch/x86/ira.py6
-rw-r--r--miasm2/arch/x86/sem.py1078
-rw-r--r--miasm2/core/sembuilder.py8
-rw-r--r--miasm2/expression/expression.py35
-rw-r--r--miasm2/expression/expression_helper.py6
-rw-r--r--miasm2/expression/parser.py8
-rw-r--r--miasm2/ir/analysis.py6
-rw-r--r--miasm2/ir/ir.py10
-rw-r--r--miasm2/ir/translators/C.py2
-rw-r--r--miasm2/ir/translators/miasm.py4
-rw-r--r--miasm2/ir/translators/python.py2
-rw-r--r--miasm2/ir/translators/smt2.py2
-rw-r--r--miasm2/ir/translators/translator.py8
-rw-r--r--miasm2/ir/translators/z3_ir.py2
-rw-r--r--test/analysis/data_flow.py316
-rw-r--r--test/analysis/depgraph.py168
-rw-r--r--test/arch/mep/ir/ut_helpers_ir.py4
-rw-r--r--test/expression/expr_pickle.py4
-rw-r--r--test/expression/expression.py4
-rw-r--r--test/expression/parser.py4
-rw-r--r--test/expression/simplifications.py6
-rw-r--r--test/ir/ir.py4
-rw-r--r--test/ir/reduce_graph.py128
-rwxr-xr-xtest/ir/symbexec.py6
-rw-r--r--test/ir/translators/smt2.py2
-rw-r--r--test/jitter/jitload.py6
45 files changed, 1372 insertions, 1361 deletions
diff --git a/example/expression/solve_condition_stp.py b/example/expression/solve_condition_stp.py
index acb3abf4..6962e2ef 100644
--- a/example/expression/solve_condition_stp.py
+++ b/example/expression/solve_condition_stp.py
@@ -5,7 +5,7 @@ from pdb import pm
 
 from miasm2.analysis.machine import Machine
 from miasm2.expression.expression import ExprInt, ExprCond, ExprId, \
-    get_expr_ids, ExprAff, ExprLoc
+    get_expr_ids, ExprAssign, ExprLoc
 from miasm2.core.bin_stream import bin_stream_str
 from miasm2.ir.symbexec import SymbolicExecutionEngine, get_block
 from miasm2.expression.simplifications import expr_simp
@@ -166,7 +166,7 @@ if __name__ == '__main__':
             expr_test = ExprCond(expr,
                                  ExprInt(1, value.size),
                                  ExprInt(0, value.size))
-            cond = translator_smt2.from_expr(ExprAff(expr_test, value))
+            cond = translator_smt2.from_expr(ExprAssign(expr_test, value))
             conditions.append(cond)
 
         for name in all_ids:
diff --git a/example/ida/ctype_propagation.py b/example/ida/ctype_propagation.py
index a3d6df8b..6a655fa8 100644
--- a/example/ida/ctype_propagation.py
+++ b/example/ida/ctype_propagation.py
@@ -10,7 +10,7 @@ from miasm2.arch.x86.ctype import CTypeAMD64_unk, CTypeX86_unk
 from miasm2.arch.msp430.ctype import CTypeMSP430_unk
 from miasm2.core.objc import CTypesManagerNotPacked, ExprToAccessC, CHandler
 from miasm2.core.ctypesmngr import CAstTypes
-from miasm2.expression.expression import ExprLoc, ExprInt, ExprOp, ExprAff
+from miasm2.expression.expression import ExprLoc, ExprInt, ExprOp, ExprAssign
 from miasm2.ir.symbexec_types import SymbExecCType
 from miasm2.expression.parser import str_to_expr
 from miasm2.analysis.cst_propag import add_state, propagate_cst_expr
@@ -232,8 +232,8 @@ def get_ira_call_fixer(ira):
             print hex(stk_diff)
             call_assignblk = AssignBlock(
                 [
-                    ExprAff(self.ret_reg, ExprOp('call_func_ret', ad)),
-                    ExprAff(self.sp, self.sp + ExprInt(stk_diff, self.sp.size))
+                    ExprAssign(self.ret_reg, ExprOp('call_func_ret', ad)),
+                    ExprAssign(self.sp, self.sp + ExprInt(stk_diff, self.sp.size))
                 ],
                 instr
             )
@@ -314,8 +314,8 @@ def analyse_function():
 
     assignblk_head = AssignBlock(
         [
-            ExprAff(ir_arch.IRDst, ExprLoc(lbl_real_start, ir_arch.IRDst.size)),
-            ExprAff(ir_arch.sp, ir_arch.arch.regs.regs_init[ir_arch.sp])
+            ExprAssign(ir_arch.IRDst, ExprLoc(lbl_real_start, ir_arch.IRDst.size)),
+            ExprAssign(ir_arch.sp, ir_arch.arch.regs.regs_init[ir_arch.sp])
         ],
         first_block.lines[0]
     )
diff --git a/example/ida/symbol_exec.py b/example/ida/symbol_exec.py
index ffaa9b27..e004b1b6 100644
--- a/example/ida/symbol_exec.py
+++ b/example/ida/symbol_exec.py
@@ -3,7 +3,7 @@ import operator
 import idaapi
 import idc
 from miasm2.expression.expression_helper import Variables_Identifier
-from miasm2.expression.expression import ExprAff
+from miasm2.expression.expression import ExprAssign
 
 from utils import expr2colorstr, translatorForm
 
@@ -64,7 +64,7 @@ class symbolicexec_t(idaapi.simplecustviewer_t):
 
     def translate_expr(self, line_nb):
         element = self.line2eq[line_nb]
-        expr = ExprAff(*element)
+        expr = ExprAssign(*element)
         form = translatorForm(expr)
         form.Compile()
         form.Execute()
diff --git a/example/ida/utils.py b/example/ida/utils.py
index c66475f2..4f4f01fe 100644
--- a/example/ida/utils.py
+++ b/example/ida/utils.py
@@ -145,7 +145,7 @@ class TranslatorIDA(Translator):
                     for arg in expr._args
                 ) + ')')
 
-    def from_ExprAff(self, expr):
+    def from_ExprAssign(self, expr):
         return "%s = %s" % tuple(map(expr.from_expr, (expr.dst, expr.src)))
 
 
diff --git a/example/symbol_exec/dse_strategies.py b/example/symbol_exec/dse_strategies.py
index 5a4be321..67b63aea 100644
--- a/example/symbol_exec/dse_strategies.py
+++ b/example/symbol_exec/dse_strategies.py
@@ -22,7 +22,7 @@ from argparse import ArgumentParser
 from miasm2.analysis.machine import Machine
 from miasm2.jitter.csts import PAGE_READ, PAGE_WRITE
 from miasm2.analysis.dse import DSEPathConstraint
-from miasm2.expression.expression import ExprMem, ExprId, ExprInt, ExprAff
+from miasm2.expression.expression import ExprMem, ExprId, ExprInt, ExprAssign
 
 # Argument handling
 parser = ArgumentParser("DSE Example")
@@ -102,7 +102,7 @@ while todo:
     jitter.init_run(run_addr)
 
     # Set the argument value in the jitter context
-    jitter.eval_expr(ExprAff(arg_addr, arg_value))
+    jitter.eval_expr(ExprAssign(arg_addr, arg_value))
 
     # Launch
     jitter.continue_run()
diff --git a/miasm2/analysis/depgraph.py b/miasm2/analysis/depgraph.py
index 0d4a3719..5923e7ed 100644
--- a/miasm2/analysis/depgraph.py
+++ b/miasm2/analysis/depgraph.py
@@ -1,6 +1,6 @@
 """Provide dependency graph"""
 
-from miasm2.expression.expression import ExprInt, ExprLoc, ExprAff
+from miasm2.expression.expression import ExprInt, ExprLoc, ExprAssign
 from miasm2.core.graph import DiGraph
 from miasm2.core.locationdb import LocationDB
 from miasm2.expression.simplifications import expr_simp_explicit
@@ -319,7 +319,7 @@ class DependencyResultImplicit(DependencyResult):
     # Z3 Solver instance
     _solver = None
 
-    unsat_expr = ExprAff(ExprInt(0, 1), ExprInt(1, 1))
+    unsat_expr = ExprAssign(ExprInt(0, 1), ExprInt(1, 1))
 
     def _gen_path_constraints(self, translator, expr, expected):
         """Generate path constraint from @expr. Handle special case with
@@ -341,7 +341,7 @@ class DependencyResultImplicit(DependencyResult):
                 conds = z3.And(
                     conds,
                     translator.from_expr(
-                        ExprAff(value,
+                        ExprAssign(value,
                                 expected))
                 )
             out.append(conds)
diff --git a/miasm2/analysis/dse.py b/miasm2/analysis/dse.py
index fb332154..1a3c0259 100644
--- a/miasm2/analysis/dse.py
+++ b/miasm2/analysis/dse.py
@@ -56,7 +56,7 @@ except ImportError:
     z3 = None
 
 from miasm2.expression.expression import ExprMem, ExprInt, ExprCompose, \
-    ExprAff, ExprId, ExprLoc, LocKey
+    ExprAssign, ExprId, ExprLoc, LocKey
 from miasm2.core.bin_stream import bin_stream_vm
 from miasm2.jitter.emulatedsymbexec import EmulatedSymbExec
 from miasm2.expression.expression_helper import possible_values
@@ -626,14 +626,14 @@ class DSEPathConstraint(DSEEngine):
                 target_addr = self.ir_arch.loc_db.canonize_to_exprloc(
                     possibility.value
                 )
-                path_constraint = set() # Set of ExprAff for the possible path
+                path_constraint = set() # Set of ExprAssign for the possible path
 
                 # Get constraint associated to the possible path
                 memory_to_add = ModularIntervals(symb_pc.size)
                 for cons in possibility.constraints:
                     eaff = cons.to_constraint()
                     # eaff.get_r(mem_read=True) is not enough
-                    # ExprAff consider a Memory access in dst as a write
+                    # ExprAssign consider a Memory access in dst as a write
                     mem = eaff.dst.get_r(mem_read=True)
                     mem.update(eaff.src.get_r(mem_read=True))
                     for expr in mem:
@@ -663,7 +663,7 @@ class DSEPathConstraint(DSEEngine):
                         if not value.is_int():
                             raise TypeError("Rely on a symbolic memory case, " \
                                             "address 0x%x" % address)
-                        path_constraint.add(ExprAff(expr_mem, value))
+                        path_constraint.add(ExprAssign(expr_mem, value))
 
                 if target_addr == cur_addr:
                     # Add path constraint
diff --git a/miasm2/analysis/ssa.py b/miasm2/analysis/ssa.py
index 61aa987f..0320d117 100644
--- a/miasm2/analysis/ssa.py
+++ b/miasm2/analysis/ssa.py
@@ -1,6 +1,6 @@
 from collections import deque
 
-from miasm2.expression.expression import ExprId, ExprAff, ExprOp, get_expr_ids
+from miasm2.expression.expression import ExprId, ExprAssign, ExprOp, get_expr_ids
 from miasm2.ir.ir import AssignBlock, IRBlock
 
 
@@ -185,7 +185,7 @@ class SSA(object):
         instructions = []
         for dst in assignblk:
             # dst = src
-            aff = assignblk.dst2ExprAff(dst)
+            aff = assignblk.dst2ExprAssign(dst)
             # insert memory expression into start of list
             if dst.is_mem():
                 instructions.insert(0, aff)
@@ -259,7 +259,7 @@ class SSA(object):
                 src_ssa = rhs.popleft()
 
                 # rebuild SSA expression
-                expr = ExprAff(dst_ssa, src_ssa)
+                expr = ExprAssign(dst_ssa, src_ssa)
                 self.expressions[dst_ssa] = src_ssa
                 self.ssa_to_location[dst_ssa] = (loc_key, index)
 
@@ -455,10 +455,10 @@ class SSADiGraph(SSA):
         """
         Generates an empty phi function for a variable
         :param expr: variable
-        :return: ExprAff, empty phi function for expr
+        :return: ExprAssign, empty phi function for expr
         """
         phi = ExprId(self.PHI_STR, expr.size)
-        return ExprAff(expr, phi)
+        return ExprAssign(expr, phi)
 
     def _fill_phi(self, *args):
         """
diff --git a/miasm2/arch/aarch64/sem.py b/miasm2/arch/aarch64/sem.py
index 3f70d7a7..1b591f74 100644
--- a/miasm2/arch/aarch64/sem.py
+++ b/miasm2/arch/aarch64/sem.py
@@ -1,5 +1,5 @@
 from miasm2.expression.expression import ExprId, ExprInt, ExprLoc, ExprMem, \
-    ExprCond, ExprCompose, ExprOp, ExprAff
+    ExprCond, ExprCompose, ExprOp, ExprAssign
 from miasm2.ir.ir import IntermediateRepresentation, IRBlock, AssignBlock
 from miasm2.arch.aarch64.arch import mn_aarch64, conds_expr, replace_regs
 from miasm2.arch.aarch64.regs import *
@@ -11,16 +11,16 @@ from miasm2.jitter.csts import EXCEPT_DIV_BY_ZERO, EXCEPT_INT_XX
 
 
 def update_flag_zf(a):
-    return [ExprAff(zf, ExprOp("FLAG_EQ", a))]
+    return [ExprAssign(zf, ExprOp("FLAG_EQ", a))]
 
 
 def update_flag_zf_eq(a, b):
-    return [ExprAff(zf, ExprOp("FLAG_EQ_CMP", a, b))]
+    return [ExprAssign(zf, ExprOp("FLAG_EQ_CMP", a, b))]
 
 
 def update_flag_nf(arg):
     return [
-        ExprAff(
+        ExprAssign(
             nf,
             ExprOp("FLAG_SIGN_SUB", arg, ExprInt(0, arg.size))
         )
@@ -41,22 +41,22 @@ def check_ops_msb(a, b, c):
 
 def update_flag_add_cf(op1, op2):
     "Compute cf in @op1 + @op2"
-    return [ExprAff(cf, ExprOp("FLAG_ADD_CF", op1, op2))]
+    return [ExprAssign(cf, ExprOp("FLAG_ADD_CF", op1, op2))]
 
 
 def update_flag_add_of(op1, op2):
     "Compute of in @op1 + @op2"
-    return [ExprAff(of, ExprOp("FLAG_ADD_OF", op1, op2))]
+    return [ExprAssign(of, ExprOp("FLAG_ADD_OF", op1, op2))]
 
 
 def update_flag_sub_cf(op1, op2):
     "Compote CF in @op1 - @op2"
-    return [ExprAff(cf, ExprOp("FLAG_SUB_CF", op1, op2) ^ ExprInt(1, 1))]
+    return [ExprAssign(cf, ExprOp("FLAG_SUB_CF", op1, op2) ^ ExprInt(1, 1))]
 
 
 def update_flag_sub_of(op1, op2):
     "Compote OF in @op1 - @op2"
-    return [ExprAff(of, ExprOp("FLAG_SUB_OF", op1, op2))]
+    return [ExprAssign(of, ExprOp("FLAG_SUB_OF", op1, op2))]
 
 
 def update_flag_arith_add_co(arg1, arg2):
@@ -72,7 +72,7 @@ def update_flag_arith_add_zn(arg1, arg2):
     """
     e = []
     e += update_flag_zf_eq(arg1, -arg2)
-    e += [ExprAff(nf, ExprOp("FLAG_SIGN_SUB", arg1, -arg2))]
+    e += [ExprAssign(nf, ExprOp("FLAG_SIGN_SUB", arg1, -arg2))]
     return e
 
 
@@ -92,17 +92,17 @@ def update_flag_arith_sub_zn(arg1, arg2):
     """
     e = []
     e += update_flag_zf_eq(arg1, arg2)
-    e += [ExprAff(nf, ExprOp("FLAG_SIGN_SUB", arg1, arg2))]
+    e += [ExprAssign(nf, ExprOp("FLAG_SIGN_SUB", arg1, arg2))]
     return e
 
 
 
 
 def update_flag_zfaddwc_eq(arg1, arg2, arg3):
-    return [ExprAff(zf, ExprOp("FLAG_EQ_ADDWC", arg1, arg2, arg3))]
+    return [ExprAssign(zf, ExprOp("FLAG_EQ_ADDWC", arg1, arg2, arg3))]
 
 def update_flag_zfsubwc_eq(arg1, arg2, arg3):
-    return [ExprAff(zf, ExprOp("FLAG_EQ_SUBWC", arg1, arg2, arg3))]
+    return [ExprAssign(zf, ExprOp("FLAG_EQ_SUBWC", arg1, arg2, arg3))]
 
 
 def update_flag_arith_addwc_zn(arg1, arg2, arg3):
@@ -111,7 +111,7 @@ def update_flag_arith_addwc_zn(arg1, arg2, arg3):
     """
     e = []
     e += update_flag_zfaddwc_eq(arg1, arg2, arg3)
-    e += [ExprAff(nf, ExprOp("FLAG_SIGN_ADDWC", arg1, arg2, arg3))]
+    e += [ExprAssign(nf, ExprOp("FLAG_SIGN_ADDWC", arg1, arg2, arg3))]
     return e
 
 
@@ -121,18 +121,18 @@ def update_flag_arith_subwc_zn(arg1, arg2, arg3):
     """
     e = []
     e += update_flag_zfsubwc_eq(arg1, arg2, arg3)
-    e += [ExprAff(nf, ExprOp("FLAG_SIGN_SUBWC", arg1, arg2, arg3))]
+    e += [ExprAssign(nf, ExprOp("FLAG_SIGN_SUBWC", arg1, arg2, arg3))]
     return e
 
 
 def update_flag_addwc_cf(op1, op2, op3):
     "Compute cf in @res = @op1 + @op2 + @op3"
-    return [ExprAff(cf, ExprOp("FLAG_ADDWC_CF", op1, op2, op3))]
+    return [ExprAssign(cf, ExprOp("FLAG_ADDWC_CF", op1, op2, op3))]
 
 
 def update_flag_addwc_of(op1, op2, op3):
     "Compute of in @res = @op1 + @op2 + @op3"
-    return [ExprAff(of, ExprOp("FLAG_ADDWC_OF", op1, op2, op3))]
+    return [ExprAssign(of, ExprOp("FLAG_ADDWC_OF", op1, op2, op3))]
 
 
 def update_flag_arith_addwc_co(arg1, arg2, arg3):
@@ -145,12 +145,12 @@ def update_flag_arith_addwc_co(arg1, arg2, arg3):
 
 def update_flag_subwc_cf(op1, op2, op3):
     "Compute cf in @res = @op1 + @op2 + @op3"
-    return [ExprAff(cf, ExprOp("FLAG_SUBWC_CF", op1, op2, op3) ^ ExprInt(1, 1))]
+    return [ExprAssign(cf, ExprOp("FLAG_SUBWC_CF", op1, op2, op3) ^ ExprInt(1, 1))]
 
 
 def update_flag_subwc_of(op1, op2, op3):
     "Compute of in @res = @op1 + @op2 + @op3"
-    return [ExprAff(of, ExprOp("FLAG_SUBWC_OF", op1, op2, op3))]
+    return [ExprAssign(of, ExprOp("FLAG_SUBWC_OF", op1, op2, op3))]
 
 
 def update_flag_arith_subwc_co(arg1, arg2, arg3):
@@ -290,10 +290,10 @@ def bics(ir, instr, arg1, arg2, arg3):
     e = []
     tmp1, tmp2 = arg2, (~extend_arg(arg2, arg3))
 
-    e += [ExprAff(zf, ExprOp('FLAG_EQ_AND', tmp1, tmp2))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ_AND', tmp1, tmp2))]
     e += update_flag_nf(res)
 
-    e.append(ExprAff(arg1, res))
+    e.append(ExprAssign(arg1, res))
 
     e += null_flag_co()
     return e, []
@@ -312,7 +312,7 @@ def adds(ir, instr, arg1, arg2, arg3):
     e += update_flag_arith_add_zn(arg2, arg3)
     e += update_flag_arith_add_co(arg2, arg3)
 
-    e.append(ExprAff(arg1, res))
+    e.append(ExprAssign(arg1, res))
 
     return e, []
 
@@ -326,7 +326,7 @@ def subs(ir, instr, arg1, arg2, arg3):
     e += update_flag_arith_sub_zn(arg2, arg3)
     e += update_flag_arith_sub_co(arg2, arg3)
 
-    e.append(ExprAff(arg1, res))
+    e.append(ExprAssign(arg1, res))
     return e, []
 
 
@@ -355,10 +355,10 @@ def ands(ir, instr, arg1, arg2, arg3):
     arg3 = extend_arg(arg2, arg3)
     res = arg2 & arg3
 
-    e += [ExprAff(zf, ExprOp('FLAG_EQ_AND', arg2, arg3))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ_AND', arg2, arg3))]
     e += update_flag_nf(res)
 
-    e.append(ExprAff(arg1, res))
+    e.append(ExprAssign(arg1, res))
     return e, []
 
 def tst(ir, instr, arg1, arg2):
@@ -366,7 +366,7 @@ def tst(ir, instr, arg1, arg2):
     arg2 = extend_arg(arg1, arg2)
     res = arg1 & arg2
 
-    e += [ExprAff(zf, ExprOp('FLAG_EQ_AND', arg1, arg2))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ_AND', arg1, arg2))]
     e += update_flag_nf(res)
 
     return e, []
@@ -401,9 +401,9 @@ def movk(ir, instr, arg1, arg2):
                isinstance(arg2.args[1], ExprInt))
         value, shift = int(arg2.args[0].arg), int(arg2.args[1])
         e.append(
-            ExprAff(arg1[shift:shift + 16], ExprInt(value, 16)))
+            ExprAssign(arg1[shift:shift + 16], ExprInt(value, 16)))
     else:
-        e.append(ExprAff(arg1[:16], ExprInt(int(arg2), 16)))
+        e.append(ExprAssign(arg1[:16], ExprInt(int(arg2), 16)))
 
     return e, []
 
@@ -444,16 +444,16 @@ def ccmp(ir, instr, arg1, arg2, arg3, arg4):
     new_cf = update_flag_sub_cf(arg1, arg2).src
     new_of = update_flag_sub_of(arg1, arg2).src
 
-    e.append(ExprAff(nf, ExprCond(cond_expr,
+    e.append(ExprAssign(nf, ExprCond(cond_expr,
                                                     new_nf,
                                                     default_nf)))
-    e.append(ExprAff(zf, ExprCond(cond_expr,
+    e.append(ExprAssign(zf, ExprCond(cond_expr,
                                                     new_zf,
                                                     default_zf)))
-    e.append(ExprAff(cf, ExprCond(cond_expr,
+    e.append(ExprAssign(cf, ExprCond(cond_expr,
                                                     new_cf,
                                                     default_cf)))
-    e.append(ExprAff(of, ExprCond(cond_expr,
+    e.append(ExprAssign(of, ExprCond(cond_expr,
                                                     new_of,
                                                     default_of)))
     return e, []
@@ -463,7 +463,7 @@ def csinc(ir, instr, arg1, arg2, arg3, arg4):
     e = []
     cond_expr = cond2expr[arg4.name]
     e.append(
-        ExprAff(
+        ExprAssign(
             arg1,
             ExprCond(
                 cond_expr,
@@ -479,7 +479,7 @@ def csinv(ir, instr, arg1, arg2, arg3, arg4):
     e = []
     cond_expr = cond2expr[arg4.name]
     e.append(
-        ExprAff(
+        ExprAssign(
             arg1,
             ExprCond(
                 cond_expr,
@@ -494,7 +494,7 @@ def csneg(ir, instr, arg1, arg2, arg3, arg4):
     e = []
     cond_expr = cond2expr[arg4.name]
     e.append(
-        ExprAff(
+        ExprAssign(
             arg1,
             ExprCond(
                 cond_expr,
@@ -509,7 +509,7 @@ def cset(ir, instr, arg1, arg2):
     e = []
     cond_expr = cond2expr[arg2.name]
     e.append(
-        ExprAff(
+        ExprAssign(
             arg1,
             ExprCond(
                 cond_expr,
@@ -525,7 +525,7 @@ def csetm(ir, instr, arg1, arg2):
     e = []
     cond_expr = cond2expr[arg2.name]
     e.append(
-        ExprAff(
+        ExprAssign(
             arg1,
             ExprCond(
                 cond_expr,
@@ -562,11 +562,11 @@ def get_mem_access(mem):
                 raise NotImplementedError('bad op')
         elif mem.op == "postinc":
             addr, off = mem.args
-            updt = ExprAff(addr, addr + off)
+            updt = ExprAssign(addr, addr + off)
         elif mem.op == "preinc_wb":
             base, off = mem.args
             addr = base + off
-            updt = ExprAff(base, base + off)
+            updt = ExprAssign(base, base + off)
         else:
             raise NotImplementedError('bad op')
     else:
@@ -578,7 +578,7 @@ def get_mem_access(mem):
 def ldr(ir, instr, arg1, arg2):
     e = []
     addr, updt = get_mem_access(arg2)
-    e.append(ExprAff(arg1, ExprMem(addr, arg1.size)))
+    e.append(ExprAssign(arg1, ExprMem(addr, arg1.size)))
     if updt:
         e.append(updt)
     return e, []
@@ -588,7 +588,7 @@ def ldr_size(ir, instr, arg1, arg2, size):
     e = []
     addr, updt = get_mem_access(arg2)
     e.append(
-        ExprAff(arg1, ExprMem(addr, size).zeroExtend(arg1.size)))
+        ExprAssign(arg1, ExprMem(addr, size).zeroExtend(arg1.size)))
     if updt:
         e.append(updt)
     return e, []
@@ -606,7 +606,7 @@ def ldrs_size(ir, instr, arg1, arg2, size):
     e = []
     addr, updt = get_mem_access(arg2)
     e.append(
-        ExprAff(arg1, ExprMem(addr, size).signExtend(arg1.size)))
+        ExprAssign(arg1, ExprMem(addr, size).signExtend(arg1.size)))
     if updt:
         e.append(updt)
     return e, []
@@ -628,7 +628,7 @@ def ldrsw(ir, instr, arg1, arg2):
 def l_str(ir, instr, arg1, arg2):
     e = []
     addr, updt = get_mem_access(arg2)
-    e.append(ExprAff(ExprMem(addr, arg1.size), arg1))
+    e.append(ExprAssign(ExprMem(addr, arg1.size), arg1))
     if updt:
         e.append(updt)
     return e, []
@@ -637,7 +637,7 @@ def l_str(ir, instr, arg1, arg2):
 def strb(ir, instr, arg1, arg2):
     e = []
     addr, updt = get_mem_access(arg2)
-    e.append(ExprAff(ExprMem(addr, 8), arg1[:8]))
+    e.append(ExprAssign(ExprMem(addr, 8), arg1[:8]))
     if updt:
         e.append(updt)
     return e, []
@@ -646,7 +646,7 @@ def strb(ir, instr, arg1, arg2):
 def strh(ir, instr, arg1, arg2):
     e = []
     addr, updt = get_mem_access(arg2)
-    e.append(ExprAff(ExprMem(addr, 16), arg1[:16]))
+    e.append(ExprAssign(ExprMem(addr, 16), arg1[:16]))
     if updt:
         e.append(updt)
     return e, []
@@ -655,9 +655,9 @@ def strh(ir, instr, arg1, arg2):
 def stp(ir, instr, arg1, arg2, arg3):
     e = []
     addr, updt = get_mem_access(arg3)
-    e.append(ExprAff(ExprMem(addr, arg1.size), arg1))
+    e.append(ExprAssign(ExprMem(addr, arg1.size), arg1))
     e.append(
-        ExprAff(ExprMem(addr + ExprInt(arg1.size / 8, addr.size), arg2.size), arg2))
+        ExprAssign(ExprMem(addr + ExprInt(arg1.size / 8, addr.size), arg2.size), arg2))
     if updt:
         e.append(updt)
     return e, []
@@ -666,9 +666,9 @@ def stp(ir, instr, arg1, arg2, arg3):
 def ldp(ir, instr, arg1, arg2, arg3):
     e = []
     addr, updt = get_mem_access(arg3)
-    e.append(ExprAff(arg1, ExprMem(addr, arg1.size)))
+    e.append(ExprAssign(arg1, ExprMem(addr, arg1.size)))
     e.append(
-        ExprAff(arg2, ExprMem(addr + ExprInt(arg1.size / 8, addr.size), arg2.size)))
+        ExprAssign(arg2, ExprMem(addr + ExprInt(arg1.size / 8, addr.size), arg2.size)))
     if updt:
         e.append(updt)
     return e, []
@@ -682,7 +682,7 @@ def sbfm(ir, instr, arg1, arg2, arg3, arg4):
     else:
         shift = ExprInt(arg2.size - rim, arg2.size)
         res = (arg2[:sim].signExtend(arg1.size) << shift)
-    e.append(ExprAff(arg1, res))
+    e.append(ExprAssign(arg1, res))
     return e, []
 
 
@@ -694,7 +694,7 @@ def ubfm(ir, instr, arg1, arg2, arg3, arg4):
     else:
         shift = ExprInt(arg2.size - rim, arg2.size)
         res = (arg2[:sim].zeroExtend(arg1.size) << shift)
-    e.append(ExprAff(arg1, res))
+    e.append(ExprAssign(arg1, res))
     return e, []
 
 def bfm(ir, instr, arg1, arg2, arg3, arg4):
@@ -702,12 +702,12 @@ def bfm(ir, instr, arg1, arg2, arg3, arg4):
     rim, sim = int(arg3.arg), int(arg4) + 1
     if sim > rim:
         res = arg2[rim:sim]
-        e.append(ExprAff(arg1[:sim-rim], res))
+        e.append(ExprAssign(arg1[:sim-rim], res))
     else:
         shift_i = arg2.size - rim
         shift = ExprInt(shift_i, arg2.size)
         res = arg2[:sim]
-        e.append(ExprAff(arg1[shift_i:shift_i+sim], res))
+        e.append(ExprAssign(arg1[shift_i:shift_i+sim], res))
     return e, []
 
 
@@ -721,7 +721,7 @@ def mrs(ir, insr, arg1, arg2, arg3, arg4, arg5):
         out.append(cf)
         out.append(zf)
         out.append(nf)
-        e.append(ExprAff(arg1, ExprCompose(*out).zeroExtend(arg1.size)))
+        e.append(ExprAssign(arg1, ExprCompose(*out).zeroExtend(arg1.size)))
     else:
         raise NotImplementedError("MRS not implemented")
     return e, []
@@ -730,10 +730,10 @@ def msr(ir, instr, arg1, arg2, arg3, arg4, arg5):
 
     e = []
     if arg1.is_int(3) and arg2.is_id("c4") and arg3.is_id("c2") and arg4.is_int(0):
-        e.append(ExprAff(nf, arg5[31:32]))
-        e.append(ExprAff(zf, arg5[30:31]))
-        e.append(ExprAff(cf, arg5[29:30]))
-        e.append(ExprAff(of, arg5[28:29]))
+        e.append(ExprAssign(nf, arg5[31:32]))
+        e.append(ExprAssign(zf, arg5[30:31]))
+        e.append(ExprAssign(cf, arg5[29:30]))
+        e.append(ExprAssign(of, arg5[28:29]))
     else:
         raise NotImplementedError("MSR not implemented")
     return e, []
@@ -744,7 +744,7 @@ def adc(ir, instr, arg1, arg2, arg3):
     arg3 = extend_arg(arg2, arg3)
     e = []
     r = arg2 + arg3 + cf.zeroExtend(arg3.size)
-    e.append(ExprAff(arg1, r))
+    e.append(ExprAssign(arg1, r))
     return e, []
 
 
@@ -752,7 +752,7 @@ def adcs(ir, instr, arg1, arg2, arg3):
     arg3 = extend_arg(arg2, arg3)
     e = []
     r = arg2 + arg3 + cf.zeroExtend(arg3.size)
-    e.append(ExprAff(arg1, r))
+    e.append(ExprAssign(arg1, r))
     e += update_flag_arith_addwc_zn(arg2, arg3, cf)
     e += update_flag_arith_addwc_co(arg2, arg3, cf)
     return e, []
@@ -762,7 +762,7 @@ def sbc(ir, instr, arg1, arg2, arg3):
     arg3 = extend_arg(arg2, arg3)
     e = []
     r = arg2 - (arg3 + (~cf).zeroExtend(arg3.size))
-    e.append(ExprAff(arg1, r))
+    e.append(ExprAssign(arg1, r))
     return e, []
 
 
@@ -770,7 +770,7 @@ def sbcs(ir, instr, arg1, arg2, arg3):
     arg3 = extend_arg(arg2, arg3)
     e = []
     r = arg2 - (arg3 + (~cf).zeroExtend(arg3.size))
-    e.append(ExprAff(arg1, r))
+    e.append(ExprAssign(arg1, r))
     e += update_flag_arith_subwc_zn(arg2, arg3, ~cf)
     e += update_flag_arith_subwc_co(arg2, arg3, ~cf)
     return e, []
@@ -956,7 +956,7 @@ def rev(ir, instr, arg1, arg2):
     out.reverse()
     e = []
     result = ExprCompose(*out)
-    e.append(ExprAff(arg1, result))
+    e.append(ExprAssign(arg1, result))
     return e, []
 
 
@@ -1088,7 +1088,7 @@ class ir_aarch64l(IntermediateRepresentation):
     def expraff_fix_regs_for_mode(self, e):
         dst = self.expr_fix_regs_for_mode(e.dst)
         src = self.expr_fix_regs_for_mode(e.src)
-        return ExprAff(dst, src)
+        return ExprAssign(dst, src)
 
     def irbloc_fix_regs_for_mode(self, irblock, mode=64):
         irs = []
@@ -1119,7 +1119,7 @@ class ir_aarch64l(IntermediateRepresentation):
             if dst != self.pc:
                 dst = dst.replace_expr(pc_fixed)
             src = src.replace_expr(pc_fixed)
-            instr_ir[i] = ExprAff(dst, src)
+            instr_ir[i] = ExprAssign(dst, src)
 
         for idx, irblock in enumerate(extra_ir):
             extra_ir[idx] = irblock.modify_exprs(lambda expr: expr.replace_expr(pc_fixed) \
diff --git a/miasm2/arch/arm/ira.py b/miasm2/arch/arm/ira.py
index fd8096d7..2214c626 100644
--- a/miasm2/arch/arm/ira.py
+++ b/miasm2/arch/arm/ira.py
@@ -3,7 +3,7 @@
 from miasm2.ir.analysis import ira
 from miasm2.ir.ir import IRBlock
 from miasm2.arch.arm.sem import ir_arml, ir_armtl, ir_armb, ir_armtb, tab_cond
-from miasm2.expression.expression import ExprAff, ExprOp, ExprLoc, ExprCond
+from miasm2.expression.expression import ExprAssign, ExprOp, ExprLoc, ExprCond
 from miasm2.ir.ir import AssignBlock
 
 class ir_a_arml_base(ir_arml, ira):
@@ -26,7 +26,7 @@ class ir_a_arml(ir_a_arml_base):
     def call_effects(self, ad, instr):
         call_assignblk = AssignBlock(
             [
-                ExprAff(
+                ExprAssign(
                     self.ret_reg,
                     ExprOp(
                         'call_func_ret',
@@ -37,7 +37,7 @@ class ir_a_arml(ir_a_arml_base):
                         self.arch.regs.R3,
                     )
                 ),
-                ExprAff(
+                ExprAssign(
                     self.sp,
                     ExprOp('call_func_stack', ad, self.sp)
                 ),
@@ -61,11 +61,11 @@ class ir_a_arml(ir_a_arml_base):
 
         call_assignblks = [
             call_assignblk,
-            AssignBlock([ExprAff(self.IRDst, loc_next_expr)], instr),
+            AssignBlock([ExprAssign(self.IRDst, loc_next_expr)], instr),
         ]
         e_do = IRBlock(loc_do, call_assignblks)
         assignblks_out = [
-            AssignBlock([ExprAff(self.IRDst, dst_cond)], instr)
+            AssignBlock([ExprAssign(self.IRDst, dst_cond)], instr)
         ]
         return assignblks_out, [e_do]
 
diff --git a/miasm2/arch/arm/jit.py b/miasm2/arch/arm/jit.py
index 716a8826..551d761a 100644
--- a/miasm2/arch/arm/jit.py
+++ b/miasm2/arch/arm/jit.py
@@ -5,7 +5,7 @@ from miasm2.core.locationdb import LocationDB
 from miasm2.core.utils import pck32, upck32
 from miasm2.arch.arm.sem import ir_armb, ir_arml, ir_armtl, ir_armtb, cond_dct_inv, tab_cond
 from miasm2.jitter.codegen import CGen
-from miasm2.expression.expression import ExprId, ExprAff, ExprCond
+from miasm2.expression.expression import ExprId, ExprAssign, ExprCond
 from miasm2.ir.ir import IRBlock, AssignBlock
 from miasm2.ir.translators.C import TranslatorC
 from miasm2.expression.simplifications import expr_simp_high_to_explicit
diff --git a/miasm2/arch/arm/sem.py b/miasm2/arch/arm/sem.py
index 600ad586..f955b585 100644
--- a/miasm2/arch/arm/sem.py
+++ b/miasm2/arch/arm/sem.py
@@ -14,16 +14,16 @@ EXCEPT_PRIV_INSN = (1 << 17)
 
 
 def update_flag_zf(a):
-    return [ExprAff(zf, ExprOp("FLAG_EQ", a))]
+    return [ExprAssign(zf, ExprOp("FLAG_EQ", a))]
 
 
 def update_flag_zf_eq(a, b):
-    return [ExprAff(zf, ExprOp("FLAG_EQ_CMP", a, b))]
+    return [ExprAssign(zf, ExprOp("FLAG_EQ_CMP", a, b))]
 
 
 def update_flag_nf(arg):
     return [
-        ExprAff(
+        ExprAssign(
             nf,
             ExprOp("FLAG_SIGN_SUB", arg, ExprInt(0, arg.size))
         )
@@ -47,22 +47,22 @@ def check_ops_msb(a, b, c):
 
 def update_flag_add_cf(op1, op2):
     "Compute cf in @op1 + @op2"
-    return [ExprAff(cf, ExprOp("FLAG_ADD_CF", op1, op2))]
+    return [ExprAssign(cf, ExprOp("FLAG_ADD_CF", op1, op2))]
 
 
 def update_flag_add_of(op1, op2):
     "Compute of in @op1 + @op2"
-    return [ExprAff(of, ExprOp("FLAG_ADD_OF", op1, op2))]
+    return [ExprAssign(of, ExprOp("FLAG_ADD_OF", op1, op2))]
 
 
 def update_flag_sub_cf(op1, op2):
     "Compote CF in @op1 - @op2"
-    return [ExprAff(cf, ExprOp("FLAG_SUB_CF", op1, op2) ^ ExprInt(1, 1))]
+    return [ExprAssign(cf, ExprOp("FLAG_SUB_CF", op1, op2) ^ ExprInt(1, 1))]
 
 
 def update_flag_sub_of(op1, op2):
     "Compote OF in @op1 - @op2"
-    return [ExprAff(of, ExprOp("FLAG_SUB_OF", op1, op2))]
+    return [ExprAssign(of, ExprOp("FLAG_SUB_OF", op1, op2))]
 
 
 def update_flag_arith_add_co(arg1, arg2):
@@ -78,7 +78,7 @@ def update_flag_arith_add_zn(arg1, arg2):
     """
     e = []
     e += update_flag_zf_eq(arg1, -arg2)
-    e += [ExprAff(nf, ExprOp("FLAG_SIGN_SUB", arg1, -arg2))]
+    e += [ExprAssign(nf, ExprOp("FLAG_SIGN_SUB", arg1, -arg2))]
     return e
 
 
@@ -98,17 +98,17 @@ def update_flag_arith_sub_zn(arg1, arg2):
     """
     e = []
     e += update_flag_zf_eq(arg1, arg2)
-    e += [ExprAff(nf, ExprOp("FLAG_SIGN_SUB", arg1, arg2))]
+    e += [ExprAssign(nf, ExprOp("FLAG_SIGN_SUB", arg1, arg2))]
     return e
 
 
 
 
 def update_flag_zfaddwc_eq(arg1, arg2, arg3):
-    return [ExprAff(zf, ExprOp("FLAG_EQ_ADDWC", arg1, arg2, arg3))]
+    return [ExprAssign(zf, ExprOp("FLAG_EQ_ADDWC", arg1, arg2, arg3))]
 
 def update_flag_zfsubwc_eq(arg1, arg2, arg3):
-    return [ExprAff(zf, ExprOp("FLAG_EQ_SUBWC", arg1, arg2, arg3))]
+    return [ExprAssign(zf, ExprOp("FLAG_EQ_SUBWC", arg1, arg2, arg3))]
 
 
 def update_flag_arith_addwc_zn(arg1, arg2, arg3):
@@ -117,7 +117,7 @@ def update_flag_arith_addwc_zn(arg1, arg2, arg3):
     """
     e = []
     e += update_flag_zfaddwc_eq(arg1, arg2, arg3)
-    e += [ExprAff(nf, ExprOp("FLAG_SIGN_ADDWC", arg1, arg2, arg3))]
+    e += [ExprAssign(nf, ExprOp("FLAG_SIGN_ADDWC", arg1, arg2, arg3))]
     return e
 
 
@@ -127,18 +127,18 @@ def update_flag_arith_subwc_zn(arg1, arg2, arg3):
     """
     e = []
     e += update_flag_zfsubwc_eq(arg1, arg2, arg3)
-    e += [ExprAff(nf, ExprOp("FLAG_SIGN_SUBWC", arg1, arg2, arg3))]
+    e += [ExprAssign(nf, ExprOp("FLAG_SIGN_SUBWC", arg1, arg2, arg3))]
     return e
 
 
 def update_flag_addwc_cf(op1, op2, op3):
     "Compute cf in @res = @op1 + @op2 + @op3"
-    return [ExprAff(cf, ExprOp("FLAG_ADDWC_CF", op1, op2, op3))]
+    return [ExprAssign(cf, ExprOp("FLAG_ADDWC_CF", op1, op2, op3))]
 
 
 def update_flag_addwc_of(op1, op2, op3):
     "Compute of in @res = @op1 + @op2 + @op3"
-    return [ExprAff(of, ExprOp("FLAG_ADDWC_OF", op1, op2, op3))]
+    return [ExprAssign(of, ExprOp("FLAG_ADDWC_OF", op1, op2, op3))]
 
 
 def update_flag_arith_addwc_co(arg1, arg2, arg3):
@@ -151,12 +151,12 @@ def update_flag_arith_addwc_co(arg1, arg2, arg3):
 
 def update_flag_subwc_cf(op1, op2, op3):
     "Compute cf in @res = @op1 + @op2 + @op3"
-    return [ExprAff(cf, ExprOp("FLAG_SUBWC_CF", op1, op2, op3) ^ ExprInt(1, 1))]
+    return [ExprAssign(cf, ExprOp("FLAG_SUBWC_CF", op1, op2, op3) ^ ExprInt(1, 1))]
 
 
 def update_flag_subwc_of(op1, op2, op3):
     "Compute of in @res = @op1 + @op2 + @op3"
-    return [ExprAff(of, ExprOp("FLAG_SUBWC_OF", op1, op2, op3))]
+    return [ExprAssign(of, ExprOp("FLAG_SUBWC_OF", op1, op2, op3))]
 
 
 def update_flag_arith_subwc_co(arg1, arg2, arg3):
@@ -184,10 +184,10 @@ def adc(ir, instr, a, b, c=None):
     if instr.name == 'ADCS' and a != PC:
         e += update_flag_arith_addwc_zn(arg1, arg2, cf)
         e += update_flag_arith_addwc_co(arg1, arg2, cf)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -200,10 +200,10 @@ def add(ir, instr, a, b, c=None):
     if instr.name == 'ADDS' and a != PC:
         e += update_flag_arith_add_zn(arg1, arg2)
         e += update_flag_arith_add_co(arg1, arg2)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -213,13 +213,13 @@ def l_and(ir, instr, a, b, c=None):
         b, c = a, b
     r = b & c
     if instr.name == 'ANDS' and a != PC:
-        e += [ExprAff(zf, ExprOp('FLAG_EQ_AND', b, c))]
+        e += [ExprAssign(zf, ExprOp('FLAG_EQ_AND', b, c))]
         e += update_flag_nf(r)
 
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -228,10 +228,10 @@ def sub(ir, instr, a, b, c=None):
     if c is None:
         b, c = a, b
     r = b - c
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -243,10 +243,10 @@ def subs(ir, instr, a, b, c=None):
     r = b - c
     e += update_flag_arith_sub_zn(arg1, arg2)
     e += update_flag_arith_sub_co(arg1, arg2)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -255,10 +255,10 @@ def eor(ir, instr, a, b, c=None):
     if c is None:
         b, c = a, b
     r = b ^ c
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -269,13 +269,13 @@ def eors(ir, instr, a, b, c=None):
     arg1, arg2 = b, c
     r = arg1 ^ arg2
 
-    e += [ExprAff(zf, ExprOp('FLAG_EQ_CMP', arg1, arg2))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ_CMP', arg1, arg2))]
     e += update_flag_nf(r)
 
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -285,10 +285,10 @@ def rsb(ir, instr, a, b, c=None):
         b, c = a, b
     arg1, arg2 = c, b
     r = arg1 - arg2
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -300,10 +300,10 @@ def rsbs(ir, instr, a, b, c=None):
     r = arg1 - arg2
     e += update_flag_arith_sub_zn(arg1, arg2)
     e += update_flag_arith_sub_co(arg1, arg2)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -313,10 +313,10 @@ def sbc(ir, instr, a, b, c=None):
         b, c = a, b
     arg1, arg2 = b, c
     r = arg1 - (arg2 + (~cf).zeroExtend(32))
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -330,10 +330,10 @@ def sbcs(ir, instr, a, b, c=None):
     e += update_flag_arith_subwc_zn(arg1, arg2, ~cf)
     e += update_flag_arith_subwc_co(arg1, arg2, ~cf)
 
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -343,10 +343,10 @@ def rsc(ir, instr, a, b, c=None):
         b, c = a, b
     arg1, arg2 = c, b
     r = arg1 - (arg2 + (~cf).zeroExtend(32))
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -360,11 +360,11 @@ def rscs(ir, instr, a, b, c=None):
     e += update_flag_arith_subwc_zn(arg1, arg2, ~cf)
     e += update_flag_arith_subwc_co(arg1, arg2, ~cf)
 
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
 
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -373,7 +373,7 @@ def tst(ir, instr, a, b):
     arg1, arg2 = a, b
     r = arg1 & arg2
 
-    e += [ExprAff(zf, ExprOp('FLAG_EQ_AND', arg1, arg2))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ_AND', arg1, arg2))]
     e += update_flag_nf(r)
 
     return e, []
@@ -386,7 +386,7 @@ def teq(ir, instr, a, b, c=None):
     arg1, arg2 = b, c
     r = arg1 ^ arg2
 
-    e += [ExprAff(zf, ExprOp('FLAG_EQ_CMP', arg1, arg2))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ_CMP', arg1, arg2))]
     e += update_flag_nf(r)
 
     return e, []
@@ -417,10 +417,10 @@ def orr(ir, instr, a, b, c=None):
     if c is None:
         b, c = a, b
     r = b | c
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -429,10 +429,10 @@ def orn(ir, instr, a, b, c=None):
     if c is None:
         b, c = a, b
     r = ~(b | c)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -443,66 +443,66 @@ def orrs(ir, instr, a, b, c=None):
     arg1, arg2 = b, c
     r = arg1 | arg2
 
-    e += [ExprAff(zf, ExprOp('FLAG_EQ', r))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ', r))]
     e += update_flag_nf(r)
 
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
 def mov(ir, instr, a, b):
-    e = [ExprAff(a, b)]
+    e = [ExprAssign(a, b)]
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, b))
+        e.append(ExprAssign(ir.IRDst, b))
     return e, []
 
 
 def movt(ir, instr, a, b):
     r = a | b << ExprInt(16, 32)
-    e = [ExprAff(a, r)]
+    e = [ExprAssign(a, r)]
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
 def movs(ir, instr, a, b):
     e = []
-    e.append(ExprAff(a, b))
+    e.append(ExprAssign(a, b))
     # XXX TODO check
-    e += [ExprAff(zf, ExprOp('FLAG_EQ', b))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ', b))]
     e += update_flag_nf(b)
 
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, b))
+        e.append(ExprAssign(ir.IRDst, b))
     return e, []
 
 
 def mvn(ir, instr, a, b):
     r = b ^ ExprInt(-1, 32)
-    e = [ExprAff(a, r)]
+    e = [ExprAssign(a, r)]
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
 def mvns(ir, instr, a, b):
     e = []
     r = b ^ ExprInt(-1, 32)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     # XXX TODO check
-    e += [ExprAff(zf, ExprOp('FLAG_EQ', r))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ', r))]
     e += update_flag_nf(r)
 
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -516,7 +516,7 @@ def mrs(ir, instr, a, b):
         out.append(cf)
         out.append(zf)
         out.append(nf)
-        e.append(ExprAff(a, ExprCompose(*out)))
+        e.append(ExprAssign(a, ExprCompose(*out)))
     else:
         raise NotImplementedError("MRS not implemented")
     return e, []
@@ -524,10 +524,10 @@ def mrs(ir, instr, a, b):
 def msr(ir, instr, a, b):
     e = []
     if a.is_id('CPSR_cf'):
-        e.append(ExprAff(nf, b[31:32]))
-        e.append(ExprAff(zf, b[30:31]))
-        e.append(ExprAff(cf, b[29:30]))
-        e.append(ExprAff(of, b[28:29]))
+        e.append(ExprAssign(nf, b[31:32]))
+        e.append(ExprAssign(zf, b[30:31]))
+        e.append(ExprAssign(cf, b[29:30]))
+        e.append(ExprAssign(of, b[28:29]))
     else:
         raise NotImplementedError("MSR not implemented")
     return e, []
@@ -536,10 +536,10 @@ def msr(ir, instr, a, b):
 def neg(ir, instr, a, b):
     e = []
     r = - b
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 def negs(ir, instr, a, b):
@@ -550,10 +550,10 @@ def bic(ir, instr, a, b, c=None):
     if c is None:
         b, c = a, b
     r = b & (c ^ ExprInt(-1, 32))
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -564,13 +564,13 @@ def bics(ir, instr, a, b, c=None):
     tmp1, tmp2 = b, ~c
     r = tmp1 & tmp2
 
-    e += [ExprAff(zf, ExprOp('FLAG_EQ_AND', tmp1, tmp2))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ_AND', tmp1, tmp2))]
     e += update_flag_nf(r)
 
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -583,23 +583,23 @@ def sdiv(ir, instr, a, b, c=None):
     loc_except = ExprId(ir.loc_db.add_location(), ir.IRDst.size)
     loc_next = ExprLoc(ir.get_next_loc_key(instr), ir.IRDst.size)
 
-    e.append(ExprAff(ir.IRDst, ExprCond(c, loc_div, loc_except)))
+    e.append(ExprAssign(ir.IRDst, ExprCond(c, loc_div, loc_except)))
 
     do_except = []
-    do_except.append(ExprAff(exception_flags, ExprInt(EXCEPT_DIV_BY_ZERO, exception_flags.size)))
-    do_except.append(ExprAff(ir.IRDst, loc_next))
+    do_except.append(ExprAssign(exception_flags, ExprInt(EXCEPT_DIV_BY_ZERO, exception_flags.size)))
+    do_except.append(ExprAssign(ir.IRDst, loc_next))
     blk_except = IRBlock(loc_except.loc_key, [AssignBlock(do_except, instr)])
 
 
 
     r = ExprOp("idiv", b, c)
     do_div = []
-    do_div.append(ExprAff(a, r))
+    do_div.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        do_div.append(ExprAff(ir.IRDst, r))
+        do_div.append(ExprAssign(ir.IRDst, r))
 
-    do_div.append(ExprAff(ir.IRDst, loc_next))
+    do_div.append(ExprAssign(ir.IRDst, loc_next))
     blk_div = IRBlock(loc_div.loc_key, [AssignBlock(do_div, instr)])
 
     return e, [blk_div, blk_except]
@@ -616,22 +616,22 @@ def udiv(ir, instr, a, b, c=None):
     loc_except = ExprLoc(ir.loc_db.add_location(), ir.IRDst.size)
     loc_next = ExprLoc(ir.get_next_loc_key(instr), ir.IRDst.size)
 
-    e.append(ExprAff(ir.IRDst, ExprCond(c, loc_div, loc_except)))
+    e.append(ExprAssign(ir.IRDst, ExprCond(c, loc_div, loc_except)))
 
     do_except = []
-    do_except.append(ExprAff(exception_flags, ExprInt(EXCEPT_DIV_BY_ZERO, exception_flags.size)))
-    do_except.append(ExprAff(ir.IRDst, loc_next))
+    do_except.append(ExprAssign(exception_flags, ExprInt(EXCEPT_DIV_BY_ZERO, exception_flags.size)))
+    do_except.append(ExprAssign(ir.IRDst, loc_next))
     blk_except = IRBlock(loc_except.loc_key, [AssignBlock(do_except, instr)])
 
 
     r = ExprOp("udiv", b, c)
     do_div = []
-    do_div.append(ExprAff(a, r))
+    do_div.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        do_div.append(ExprAff(ir.IRDst, r))
+        do_div.append(ExprAssign(ir.IRDst, r))
 
-    do_div.append(ExprAff(ir.IRDst, loc_next))
+    do_div.append(ExprAssign(ir.IRDst, loc_next))
     blk_div = IRBlock(loc_div.loc_key, [AssignBlock(do_div, instr)])
 
     return e, [blk_div, blk_except]
@@ -640,10 +640,10 @@ def udiv(ir, instr, a, b, c=None):
 def mla(ir, instr, a, b, c, d):
     e = []
     r = (b * c) + d
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -651,20 +651,20 @@ def mlas(ir, instr, a, b, c, d):
     e = []
     r = (b * c) + d
     e += update_flag_zn(r)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
 def mls(ir, instr, a, b, c, d):
     e = []
     r = d - (b * c)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -673,10 +673,10 @@ def mul(ir, instr, a, b, c=None):
     if c is None:
         b, c = a, b
     r = b * c
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -686,73 +686,73 @@ def muls(ir, instr, a, b, c=None):
         b, c = a, b
     r = b * c
     e += update_flag_zn(r)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 def umull(ir, instr, a, b, c, d):
     e = []
     r = c.zeroExtend(64) * d.zeroExtend(64)
-    e.append(ExprAff(a, r[0:32]))
-    e.append(ExprAff(b, r[32:64]))
+    e.append(ExprAssign(a, r[0:32]))
+    e.append(ExprAssign(b, r[32:64]))
     # r15/IRDst not allowed as output
     return e, []
 
 def umlal(ir, instr, a, b, c, d):
     e = []
     r = c.zeroExtend(64) * d.zeroExtend(64) + ExprCompose(a, b)
-    e.append(ExprAff(a, r[0:32]))
-    e.append(ExprAff(b, r[32:64]))
+    e.append(ExprAssign(a, r[0:32]))
+    e.append(ExprAssign(b, r[32:64]))
     # r15/IRDst not allowed as output
     return e, []
 
 def smull(ir, instr, a, b, c, d):
     e = []
     r = c.signExtend(64) * d.signExtend(64)
-    e.append(ExprAff(a, r[0:32]))
-    e.append(ExprAff(b, r[32:64]))
+    e.append(ExprAssign(a, r[0:32]))
+    e.append(ExprAssign(b, r[32:64]))
     # r15/IRDst not allowed as output
     return e, []
 
 def smlal(ir, instr, a, b, c, d):
     e = []
     r = c.signExtend(64) * d.signExtend(64) + ExprCompose(a, b)
-    e.append(ExprAff(a, r[0:32]))
-    e.append(ExprAff(b, r[32:64]))
+    e.append(ExprAssign(a, r[0:32]))
+    e.append(ExprAssign(b, r[32:64]))
     # r15/IRDst not allowed as output
     return e, []
 
 def b(ir, instr, a):
     e = []
-    e.append(ExprAff(PC, a))
-    e.append(ExprAff(ir.IRDst, a))
+    e.append(ExprAssign(PC, a))
+    e.append(ExprAssign(ir.IRDst, a))
     return e, []
 
 
 def bl(ir, instr, a):
     e = []
     l = ExprInt(instr.offset + instr.l, 32)
-    e.append(ExprAff(PC, a))
-    e.append(ExprAff(ir.IRDst, a))
-    e.append(ExprAff(LR, l))
+    e.append(ExprAssign(PC, a))
+    e.append(ExprAssign(ir.IRDst, a))
+    e.append(ExprAssign(LR, l))
     return e, []
 
 
 def bx(ir, instr, a):
     e = []
-    e.append(ExprAff(PC, a))
-    e.append(ExprAff(ir.IRDst, a))
+    e.append(ExprAssign(PC, a))
+    e.append(ExprAssign(ir.IRDst, a))
     return e, []
 
 
 def blx(ir, instr, a):
     e = []
     l = ExprInt(instr.offset + instr.l, 32)
-    e.append(ExprAff(PC, a))
-    e.append(ExprAff(ir.IRDst, a))
-    e.append(ExprAff(LR, l))
+    e.append(ExprAssign(PC, a))
+    e.append(ExprAssign(ir.IRDst, a))
+    e.append(ExprAssign(LR, l))
     return e, []
 
 
@@ -804,20 +804,20 @@ def st_ld_r(ir, instr, a, a2, b, store=False, size=32, s_ext=False, z_ext=False)
     dst = None
 
     if store:
-        e.append(ExprAff(m, a))
+        e.append(ExprAssign(m, a))
         if dmem:
-            e.append(ExprAff(ExprMem(ad + ExprInt(4, 32), size=size), a2))
+            e.append(ExprAssign(ExprMem(ad + ExprInt(4, 32), size=size), a2))
     else:
         if a == PC:
             dst = PC
-            e.append(ExprAff(ir.IRDst, m))
-        e.append(ExprAff(a, m))
+            e.append(ExprAssign(ir.IRDst, m))
+        e.append(ExprAssign(a, m))
         if dmem:
-            e.append(ExprAff(a2, ExprMem(ad + ExprInt(4, 32), size=size)))
+            e.append(ExprAssign(a2, ExprMem(ad + ExprInt(4, 32), size=size)))
 
     # XXX TODO check multiple write cause by wb
     if wb or postinc:
-        e.append(ExprAff(base, base + off))
+        e.append(ExprAssign(base, base + off))
     return e, []
 
 
@@ -890,17 +890,17 @@ def st_ld_m(ir, instr, a, b, store=False, postinc=False, updown=False):
     for i, r in enumerate(regs):
         ad = base + ExprInt(i * step, 32)
         if store:
-            e.append(ExprAff(ExprMem(ad, 32), r))
+            e.append(ExprAssign(ExprMem(ad, 32), r))
         else:
-            e.append(ExprAff(r, ExprMem(ad, 32)))
+            e.append(ExprAssign(r, ExprMem(ad, 32)))
             if r == PC:
-                e.append(ExprAff(ir.IRDst, ExprMem(ad, 32)))
+                e.append(ExprAssign(ir.IRDst, ExprMem(ad, 32)))
     # XXX TODO check multiple write cause by wb
     if wb:
         if postinc:
-            e.append(ExprAff(a, base + ExprInt(len(regs) * step, 32)))
+            e.append(ExprAssign(a, base + ExprInt(len(regs) * step, 32)))
         else:
-            e.append(ExprAff(a, base + ExprInt((len(regs) - 1) * step, 32)))
+            e.append(ExprAssign(a, base + ExprInt((len(regs) - 1) * step, 32)))
     if store:
         pass
     else:
@@ -944,8 +944,8 @@ def stmdb(ir, instr, a, b):
 def svc(ir, instr, a):
     e = []
     except_int = EXCEPT_INT_XX
-    e.append(ExprAff(exception_flags, ExprInt(except_int, 32)))
-    e.append(ExprAff(interrupt_num, a))
+    e.append(ExprAssign(exception_flags, ExprInt(except_int, 32)))
+    e.append(ExprAssign(interrupt_num, a))
     return e, []
 
 
@@ -960,10 +960,10 @@ def lsr(ir, instr, a, b, c=None):
     if c is None:
         b, c = a, b
     r = b >> c
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -972,14 +972,14 @@ def lsrs(ir, instr, a, b, c=None):
     if c is None:
         b, c = a, b
     r = b >> c
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
 
-    e += [ExprAff(zf, ExprOp('FLAG_EQ', r))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ', r))]
     e += update_flag_nf(r)
 
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 def asr(ir, instr, a, b, c=None):
@@ -987,10 +987,10 @@ def asr(ir, instr, a, b, c=None):
     if c is None:
         b, c = a, b
     r = ExprOp("a>>", b, c)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 def asrs(ir, instr, a, b, c=None):
@@ -998,14 +998,14 @@ def asrs(ir, instr, a, b, c=None):
     if c is None:
         b, c = a, b
     r = ExprOp("a>>", b, c)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
 
-    e += [ExprAff(zf, ExprOp('FLAG_EQ', r))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ', r))]
     e += update_flag_nf(r)
 
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 def lsl(ir, instr, a, b, c=None):
@@ -1013,10 +1013,10 @@ def lsl(ir, instr, a, b, c=None):
     if c is None:
         b, c = a, b
     r = b << c
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -1025,28 +1025,28 @@ def lsls(ir, instr, a, b, c=None):
     if c is None:
         b, c = a, b
     r = b << c
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
 
-    e += [ExprAff(zf, ExprOp('FLAG_EQ', r))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ', r))]
     e += update_flag_nf(r)
 
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
 def rors(ir, instr, a, b):
     e = []
     r = ExprOp(">>>", a, b)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
 
-    e += [ExprAff(zf, ExprOp('FLAG_EQ', r))]
+    e += [ExprAssign(zf, ExprOp('FLAG_EQ', r))]
     e += update_flag_nf(r)
 
     dst = get_dst(a)
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -1055,9 +1055,9 @@ def push(ir, instr, a):
     regs = list(a.args)
     for i in xrange(len(regs)):
         r = SP + ExprInt(-4 * len(regs) + 4 * i, 32)
-        e.append(ExprAff(ExprMem(r, 32), regs[i]))
+        e.append(ExprAssign(ExprMem(r, 32), regs[i]))
     r = SP + ExprInt(-4 * len(regs), 32)
-    e.append(ExprAff(SP, r))
+    e.append(ExprAssign(SP, r))
     return e, []
 
 
@@ -1067,13 +1067,13 @@ def pop(ir, instr, a):
     dst = None
     for i in xrange(len(regs)):
         r = SP + ExprInt(4 * i, 32)
-        e.append(ExprAff(regs[i], ExprMem(r, 32)))
+        e.append(ExprAssign(regs[i], ExprMem(r, 32)))
         if regs[i] == ir.pc:
             dst = ExprMem(r, 32)
     r = SP + ExprInt(4 * len(regs), 32)
-    e.append(ExprAff(SP, r))
+    e.append(ExprAssign(SP, r))
     if dst is not None:
-        e.append(ExprAff(ir.IRDst, dst))
+        e.append(ExprAssign(ir.IRDst, dst))
     return e, []
 
 
@@ -1081,7 +1081,7 @@ def cbz(ir, instr, a, b):
     e = []
     loc_next = ir.get_next_loc_key(instr)
     loc_next_expr = ExprLoc(loc_next, 32)
-    e.append(ExprAff(ir.IRDst, ExprCond(a, loc_next_expr, b)))
+    e.append(ExprAssign(ir.IRDst, ExprCond(a, loc_next_expr, b)))
     return e, []
 
 
@@ -1096,41 +1096,41 @@ def cbnz(ir, instr, a, b):
 def uxtb(ir, instr, a, b):
     e = []
     r = b[:8].zeroExtend(32)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = None
     if PC in a.get_r():
         dst = PC
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 def uxth(ir, instr, a, b):
     e = []
     r = b[:16].zeroExtend(32)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = None
     if PC in a.get_r():
         dst = PC
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 def sxtb(ir, instr, a, b):
     e = []
     r = b[:8].signExtend(32)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = None
     if PC in a.get_r():
         dst = PC
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 def sxth(ir, instr, a, b):
     e = []
     r = b[:16].signExtend(32)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = None
     if PC in a.get_r():
         dst = PC
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -1139,11 +1139,11 @@ def ubfx(ir, instr, a, b, c, d):
     c = int(c)
     d = int(d)
     r = b[c:c+d].zeroExtend(32)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = None
     if PC in a.get_r():
         dst = PC
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 def bfc(ir, instr, a, b, c):
@@ -1161,11 +1161,11 @@ def bfc(ir, instr, a, b, c):
     if last < 32:
         out.append(a[last:])
     r = ExprCompose(*out)
-    e.append(ExprAff(a, r))
+    e.append(ExprAssign(a, r))
     dst = None
     if PC in a.get_r():
         dst = PC
-        e.append(ExprAff(ir.IRDst, r))
+        e.append(ExprAssign(ir.IRDst, r))
     return e, []
 
 
@@ -1181,19 +1181,19 @@ def pldw(ir, instr, a):
 
 def clz(ir, instr, a, b):
     e = []
-    e.append(ExprAff(a, ExprOp('cntleadzeros', b)))
+    e.append(ExprAssign(a, ExprOp('cntleadzeros', b)))
     return e, []
 
 def uxtab(ir, instr, a, b, c):
     e = []
-    e.append(ExprAff(a, b + (c & ExprInt(0xff, 32))))
+    e.append(ExprAssign(a, b + (c & ExprInt(0xff, 32))))
     return e, []
 
 
 def bkpt(ir, instr, a):
     e = []
-    e.append(ExprAff(exception_flags, ExprInt(EXCEPT_SOFT_BP, 32)))
-    e.append(ExprAff(bp_num, a))
+    e.append(ExprAssign(exception_flags, ExprInt(EXCEPT_SOFT_BP, 32)))
+    e.append(ExprAssign(bp_num, a))
     return e, []
 
 
@@ -1206,58 +1206,58 @@ def _extract_s16(arg, part):
 
 def smul(ir, instr, a, b, c):
     e = []
-    e.append(ExprAff(a, _extract_s16(b, instr.name[4]).signExtend(32) * _extract_s16(c, instr.name[5]).signExtend(32)))
+    e.append(ExprAssign(a, _extract_s16(b, instr.name[4]).signExtend(32) * _extract_s16(c, instr.name[5]).signExtend(32)))
     return e, []
 
 
 def smulw(ir, instr, a, b, c):
     e = []
     prod = b.signExtend(48) * _extract_s16(c, instr.name[5]).signExtend(48)
-    e.append(ExprAff(a, prod[16:48]))
+    e.append(ExprAssign(a, prod[16:48]))
     return e, [] # signed most significant 32 bits of the 48-bit result
 
 
 def tbb(ir, instr, a):
     e = []
     dst = PC + ExprInt(2, 32) * a.zeroExtend(32)
-    e.append(ExprAff(PC, dst))
-    e.append(ExprAff(ir.IRDst, dst))
+    e.append(ExprAssign(PC, dst))
+    e.append(ExprAssign(ir.IRDst, dst))
     return e, []
 
 
 def tbh(ir, instr, a):
     e = []
     dst = PC + ExprInt(2, 32) * a.zeroExtend(32)
-    e.append(ExprAff(PC, dst))
-    e.append(ExprAff(ir.IRDst, dst))
+    e.append(ExprAssign(PC, dst))
+    e.append(ExprAssign(ir.IRDst, dst))
     return e, []
 
 
 def smlabb(ir, instr, a, b, c, d):
     e = []
     result = (b[:16].signExtend(32) * c[:16].signExtend(32)) + d
-    e.append(ExprAff(a, result))
+    e.append(ExprAssign(a, result))
     return e, []
 
 
 def smlabt(ir, instr, a, b, c, d):
     e = []
     result = (b[:16].signExtend(32) * c[16:32].signExtend(32)) + d
-    e.append(ExprAff(a, result))
+    e.append(ExprAssign(a, result))
     return e, []
 
 
 def smlatb(ir, instr, a, b, c, d):
     e = []
     result = (b[16:32].signExtend(32) * c[:16].signExtend(32)) + d
-    e.append(ExprAff(a, result))
+    e.append(ExprAssign(a, result))
     return e, []
 
 
 def smlatt(ir, instr, a, b, c, d):
     e = []
     result = (b[16:32].signExtend(32) * c[16:32].signExtend(32)) + d
-    e.append(ExprAff(a, result))
+    e.append(ExprAssign(a, result))
     return e, []
 
 
@@ -1269,10 +1269,10 @@ def uadd8(ir, instr, a, b, c):
         sums.append(b[i:i+8] + c[i:i+8])
         ges.append((b[i:i+8].zeroExtend(9) + c[i:i+8].zeroExtend(9))[8:9])
 
-    e.append(ExprAff(a, ExprCompose(*sums)))
+    e.append(ExprAssign(a, ExprCompose(*sums)))
 
     for i, value in enumerate(ges):
-        e.append(ExprAff(ge_regs[i], value))
+        e.append(ExprAssign(ge_regs[i], value))
     return e, []
 
 
@@ -1283,14 +1283,14 @@ def sel(ir, instr, a, b, c):
     for i in xrange(4):
         parts.append(ExprCond(ge_regs[i], b[i*8:(i+1)*8], c[i*8:(i+1)*8]))
     result = ExprCompose(*parts)
-    e.append(ExprAff(a, result))
+    e.append(ExprAssign(a, result))
     return e, []
 
 
 def rev(ir, instr, a, b):
     e = []
     result = ExprCompose(b[24:32], b[16:24], b[8:16], b[:8])
-    e.append(ExprAff(a, result))
+    e.append(ExprAssign(a, result))
     return e, []
 
 
@@ -1438,9 +1438,9 @@ def add_condition_expr(ir, instr, cond, instr_ir, extra_ir):
             has_irdst = True
             break
     if not has_irdst:
-        instr_ir.append(ExprAff(ir.IRDst, loc_next_expr))
+        instr_ir.append(ExprAssign(ir.IRDst, loc_next_expr))
     e_do = IRBlock(loc_do, [AssignBlock(instr_ir, instr)])
-    e = [ExprAff(ir.IRDst, dst_cond)]
+    e = [ExprAssign(ir.IRDst, dst_cond)]
     return e, [e_do] + extra_ir
 
 mnemo_func = {}
@@ -1656,7 +1656,7 @@ class ir_arml(IntermediateRepresentation):
             if dst != self.pc:
                 dst = dst.replace_expr(pc_fixed)
             src = src.replace_expr(pc_fixed)
-            instr_ir[i] = ExprAff(dst, src)
+            instr_ir[i] = ExprAssign(dst, src)
 
         for idx, irblock in enumerate(extra_ir):
             extra_ir[idx] = irblock.modify_exprs(lambda expr: expr.replace_expr(pc_fixed) \
@@ -1706,7 +1706,7 @@ class ir_arml(IntermediateRepresentation):
 
         # Gen dummy irblock for IT instr
         loc_next = self.get_next_loc_key(instr)
-        dst = ExprAff(self.IRDst, ExprId(loc_next, 32))
+        dst = ExprAssign(self.IRDst, ExprId(loc_next, 32))
         dst_blk = AssignBlock([dst], instr)
         assignments.append(dst_blk)
         irblock = IRBlock(loc, assignments)
@@ -1727,7 +1727,7 @@ class ir_arml(IntermediateRepresentation):
                 local_cond = ~cond_eq
             else:
                 local_cond = cond_eq
-            dst = ExprAff(self.IRDst, ExprCond(local_cond, ExprLoc(loc_do, 32), ExprLoc(loc_next, 32)))
+            dst = ExprAssign(self.IRDst, ExprCond(local_cond, ExprLoc(loc_do, 32), ExprLoc(loc_next, 32)))
             dst_blk = AssignBlock([dst], instr)
             assignments.append(dst_blk)
             irblock = IRBlock(loc, assignments)
@@ -1743,7 +1743,7 @@ class ir_arml(IntermediateRepresentation):
             if split:
                 raise NotImplementedError("Unsupported instr in IT block (%s)" % instr)
 
-            dst = ExprAff(self.IRDst, ExprId(loc_next, 32))
+            dst = ExprAssign(self.IRDst, ExprId(loc_next, 32))
             dst_blk = AssignBlock([dst], instr)
             assignments.append(dst_blk)
             irblock = IRBlock(loc, assignments)
@@ -1824,7 +1824,7 @@ class ir_armtl(ir_arml):
             if dst != self.pc:
                 dst = dst.replace_expr(pc_fixed)
             src = src.replace_expr(pc_fixed)
-            instr_ir[i] = ExprAff(dst, src)
+            instr_ir[i] = ExprAssign(dst, src)
 
         for idx, irblock in enumerate(extra_ir):
             extra_ir[idx] = irblock.modify_exprs(lambda expr: expr.replace_expr(pc_fixed) \
diff --git a/miasm2/arch/mep/sem.py b/miasm2/arch/mep/sem.py
index e779b970..717afd7e 100644
--- a/miasm2/arch/mep/sem.py
+++ b/miasm2/arch/mep/sem.py
@@ -8,7 +8,7 @@ from miasm2.arch.mep.regs import PC, SP, LP, SAR, TP, RPB, RPE, RPC, EPC, NPC, \
     take_jmp, in_erepeat
 from miasm2.arch.mep.regs import EXC, HI, LO, PSW, DEPC, DBG
 from miasm2.expression.expression import ExprId, ExprInt, ExprOp
-from miasm2.expression.expression import ExprAff, ExprCond, ExprMem
+from miasm2.expression.expression import ExprAssign, ExprCond, ExprMem
 from miasm2.core.cpu import sign_ext
 from miasm2.jitter.csts import EXCEPT_DIV_BY_ZERO
 
@@ -105,7 +105,7 @@ def sw(reg_src, deref_dst):
 #        imm = deref_reg_or_imm.zeroExtend(32)
 #        dst = ExprMem(ExprOp("+", imm, deref_reg.arg))
 #
-#    return [ExprAff(dst, reg_src)], []
+#    return [ExprAssign(dst, reg_src)], []
 
 
 @sbuild.parse
@@ -242,7 +242,7 @@ def add3(ir, instr, reg_dst, reg_src, reg_or_imm):
         value = int(reg_or_imm.arg)
         result = ExprOp("+", reg_src, ExprInt(value, 32))
 
-    return [ExprAff(reg_dst, result)], []
+    return [ExprAssign(reg_dst, result)], []
 
 manual_functions["add3"] = add3
 
@@ -287,7 +287,7 @@ def sbvck3(ir, instr, r0, rn, rm):
 
     # Return the result
     condition = ExprCond(overflow_test, ExprInt(1, 32), ExprInt(0, 32))
-    return [ExprAff(r0, condition)], []
+    return [ExprAssign(r0, condition)], []
 
 manual_functions["sbvck3"] = sbvck3
 
@@ -602,12 +602,12 @@ def jmp(ir, instr, reg_or_imm):
 
     if isinstance(reg_or_imm, ExprId):
         # PC <- Rm31..1||0
-        new_PC = ExprAff(PC, reg_or_imm)
+        new_PC = ExprAssign(PC, reg_or_imm)
     else:
         # PC <- PC31..28||0000||(target24)23..1||0
-        new_PC = ExprAff(PC, ExprOp("+", ExprOp("&", PC, ExprInt(0xF0000000, 32)), reg_or_imm))
+        new_PC = ExprAssign(PC, ExprOp("+", ExprOp("&", PC, ExprInt(0xF0000000, 32)), reg_or_imm))
 
-    return [new_PC, ExprAff(ir.IRDst, new_PC)], []
+    return [new_PC, ExprAssign(ir.IRDst, new_PC)], []
 
 manual_functions["jmp"] = jmp
 
diff --git a/miasm2/arch/mips32/ira.py b/miasm2/arch/mips32/ira.py
index 4c4a33d8..90558708 100644
--- a/miasm2/arch/mips32/ira.py
+++ b/miasm2/arch/mips32/ira.py
@@ -1,6 +1,6 @@
 #-*- coding:utf-8 -*-
 
-from miasm2.expression.expression import ExprAff, ExprOp
+from miasm2.expression.expression import ExprAssign, ExprOp
 from miasm2.ir.ir import IRBlock, AssignBlock
 from miasm2.ir.analysis import ira
 from miasm2.arch.mips32.sem import ir_mips32l, ir_mips32b
@@ -13,7 +13,7 @@ class ir_a_mips32l(ir_mips32l, ira):
     def call_effects(self, ad, instr):
         call_assignblk = AssignBlock(
             [
-                ExprAff(
+                ExprAssign(
                     self.ret_reg,
                     ExprOp(
                         'call_func_ret',
diff --git a/miasm2/arch/mips32/sem.py b/miasm2/arch/mips32/sem.py
index 92001280..a603e7c3 100644
--- a/miasm2/arch/mips32/sem.py
+++ b/miasm2/arch/mips32/sem.py
@@ -333,7 +333,7 @@ def ins(ir, instr, a, b, c, d):
     if pos + l != 32:
         my_slices.append((a[pos+l:], pos+l, 32))
     r = m2_expr.ExprCompose(my_slices)
-    e.append(m2_expr.ExprAff(a, r))
+    e.append(m2_expr.ExprAssign(a, r))
     return e, []
 
 
@@ -433,16 +433,16 @@ def teq(ir, instr, arg1, arg2):
     loc_next_expr = m2_expr.ExprLoc(loc_next, ir.IRDst.size)
 
     do_except = []
-    do_except.append(m2_expr.ExprAff(exception_flags, m2_expr.ExprInt(
+    do_except.append(m2_expr.ExprAssign(exception_flags, m2_expr.ExprInt(
         EXCEPT_DIV_BY_ZERO, exception_flags.size)))
-    do_except.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    do_except.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     blk_except = IRBlock(loc_except.index, [AssignBlock(do_except, instr)])
 
     cond = arg1 - arg2
 
 
     e = []
-    e.append(m2_expr.ExprAff(ir.IRDst,
+    e.append(m2_expr.ExprAssign(ir.IRDst,
                              m2_expr.ExprCond(cond, loc_next_expr, loc_except_expr)))
 
     return e, [blk_except]
@@ -498,7 +498,7 @@ class ir_mips32l(IntermediateRepresentation):
             ZERO: m2_expr.ExprInt(0, 32)
         }
 
-        instr_ir = [m2_expr.ExprAff(expr.dst, expr.src.replace_expr(fixed_regs))
+        instr_ir = [m2_expr.ExprAssign(expr.dst, expr.src.replace_expr(fixed_regs))
                     for expr in instr_ir]
 
         new_extra_ir = [irblock.modify_exprs(mod_src=lambda expr: expr.replace_expr(fixed_regs))
diff --git a/miasm2/arch/msp430/sem.py b/miasm2/arch/msp430/sem.py
index 191abe75..4736a51c 100644
--- a/miasm2/arch/msp430/sem.py
+++ b/miasm2/arch/msp430/sem.py
@@ -24,23 +24,23 @@ def bcd2hex(val):
 
 
 def reset_sr_res():
-    return [ExprAff(res, ExprInt(0, 7))]
+    return [ExprAssign(res, ExprInt(0, 7))]
 
 
 def update_flag_zf(a):
-    return [ExprAff(zf, ExprCond(a, ExprInt(0, zf.size), ExprInt(1, zf.size)))]
+    return [ExprAssign(zf, ExprCond(a, ExprInt(0, zf.size), ExprInt(1, zf.size)))]
 
 
 def update_flag_nf(a):
-    return [ExprAff(nf, a.msb())]
+    return [ExprAssign(nf, a.msb())]
 
 
 def update_flag_pf(a):
-    return [ExprAff(pf, ExprOp('parity', a & ExprInt(0xFF, a.size)))]
+    return [ExprAssign(pf, ExprOp('parity', a & ExprInt(0xFF, a.size)))]
 
 
 def update_flag_cf_inv_zf(a):
-    return [ExprAff(cf, ExprCond(a, ExprInt(1, cf.size), ExprInt(0, cf.size)))]
+    return [ExprAssign(cf, ExprCond(a, ExprInt(1, cf.size), ExprInt(0, cf.size)))]
 
 
 def update_flag_zn_r(a):
@@ -52,20 +52,20 @@ def update_flag_zn_r(a):
 
 
 def update_flag_sub_cf(a, b, c):
-    return [ExprAff(cf,
+    return [ExprAssign(cf,
         ((((a ^ b) ^ c) ^ ((a ^ c) & (a ^ b))).msb()) ^ ExprInt(1, 1))]
 
 
 def update_flag_add_cf(a, b, c):
-    return [ExprAff(cf, (((a ^ b) ^ c) ^ ((a ^ c) & (~(a ^ b)))).msb())]
+    return [ExprAssign(cf, (((a ^ b) ^ c) ^ ((a ^ c) & (~(a ^ b)))).msb())]
 
 
 def update_flag_add_of(a, b, c):
-    return [ExprAff(of, (((a ^ c) & (~(a ^ b)))).msb())]
+    return [ExprAssign(of, (((a ^ c) & (~(a ^ b)))).msb())]
 
 
 def update_flag_sub_of(a, b, c):
-    return [ExprAff(of, (((a ^ c) & (a ^ b))).msb())]
+    return [ExprAssign(of, (((a ^ c) & (a ^ b))).msb())]
 
 
 def mng_autoinc(a, b, size):
@@ -74,7 +74,7 @@ def mng_autoinc(a, b, size):
         return e, a, b
 
     a_r = a.args[0]
-    e.append(ExprAff(a_r, a_r + ExprInt(size / 8, a_r.size)))
+    e.append(ExprAssign(a_r, a_r + ExprInt(size / 8, a_r.size)))
     a = ExprMem(a_r, size)
     if isinstance(b, ExprMem) and a_r in b.arg:
         b = ExprMem(b.arg + ExprInt(size / 8, 16), b.size)
@@ -90,35 +90,35 @@ def mov_b(ir, instr, a, b):
         a = a[:8]
     else:
         a = a[:8].zeroExtend(16)
-    e.append(ExprAff(b, a))
+    e.append(ExprAssign(b, a))
     return e, []
 
 
 def mov_w(ir, instr, a, b):
     e, a, b = mng_autoinc(a, b, 16)
-    e.append(ExprAff(b, a))
+    e.append(ExprAssign(b, a))
     if b == ir.pc:
-        e.append(ExprAff(ir.IRDst, a))
+        e.append(ExprAssign(ir.IRDst, a))
     return e, []
 
 
 def and_b(ir, instr, a, b):
     e, a, b = mng_autoinc(a, b, 8)
     c = a[:8] & b[:8]
-    e.append(ExprAff(b, c.zeroExtend(16)))
+    e.append(ExprAssign(b, c.zeroExtend(16)))
     e += update_flag_zn_r(c)
     e += update_flag_cf_inv_zf(c)
-    e += [ExprAff(of, ExprInt(0, 1))]
+    e += [ExprAssign(of, ExprInt(0, 1))]
     return e, []
 
 
 def and_w(ir, instr, a, b):
     e, a, b = mng_autoinc(a, b, 16)
     c = a & b
-    e.append(ExprAff(b, c))
+    e.append(ExprAssign(b, c))
     e += update_flag_zn_r(c)
     e += update_flag_cf_inv_zf(c)
-    e += [ExprAff(of, ExprInt(0, 1))]
+    e += [ExprAssign(of, ExprInt(0, 1))]
     return e, []
 
 
@@ -126,21 +126,21 @@ def bic_b(ir, instr, a, b):
     e, a, b = mng_autoinc(a, b, 8)
     c = (a[:8] ^ ExprInt(0xff, 8)) & b[:8]
     c = c.zeroExtend(b.size)
-    e.append(ExprAff(b, c))
+    e.append(ExprAssign(b, c))
     return e, []
 
 
 def bic_w(ir, instr, a, b):
     e, a, b = mng_autoinc(a, b, 16)
     c = (a ^ ExprInt(0xffff, 16)) & b
-    e.append(ExprAff(b, c))
+    e.append(ExprAssign(b, c))
     return e, []
 
 
 def bis_w(ir, instr, a, b):
     e, a, b = mng_autoinc(a, b, 16)
     c = a | b
-    e.append(ExprAff(b, c))
+    e.append(ExprAssign(b, c))
     return e, []
 
 
@@ -149,14 +149,14 @@ def bit_w(ir, instr, a, b):
     c = a & b
     e += update_flag_zn_r(c)
     e += update_flag_cf_inv_zf(c)
-    e.append(ExprAff(of, ExprInt(0, 1)))
+    e.append(ExprAssign(of, ExprInt(0, 1)))
     return e, []
 
 """
 def sub_b(ir, instr, a, b):
     e, a, b = mng_autoinc(a, b, 8)
     c = b - a
-    e.append(ExprAff(b, c))
+    e.append(ExprAssign(b, c))
     e += update_flag_zn_r(c)
     e += update_flag_sub_cf(b, a, c)
     return None, e, []
@@ -166,7 +166,7 @@ def sub_b(ir, instr, a, b):
 def sub_w(ir, instr, a, b):
     e, a, b = mng_autoinc(a, b, 16)
     c = b - a
-    e.append(ExprAff(b, c))
+    e.append(ExprAssign(b, c))
     e += update_flag_zn_r(c)
     e += update_flag_sub_cf(b, a, c)
     # micrcorruption
@@ -183,7 +183,7 @@ def add_b(ir, instr, a, b):
         b = b[:8]
     a = a[:8]
     c = b + a
-    e.append(ExprAff(b, c))
+    e.append(ExprAssign(b, c))
     e += update_flag_zn_r(c)
     e += update_flag_add_cf(a, b, c)
     e += update_flag_add_of(a, b, c)
@@ -193,7 +193,7 @@ def add_b(ir, instr, a, b):
 def add_w(ir, instr, a, b):
     e, a, b = mng_autoinc(a, b, 16)
     c = b + a
-    e.append(ExprAff(b, c))
+    e.append(ExprAssign(b, c))
     e += update_flag_zn_r(c)
     e += update_flag_add_cf(a, b, c)
     e += update_flag_add_of(a, b, c)
@@ -205,7 +205,7 @@ def dadd_w(ir, instr, a, b):
     # TODO: microcorruption no carryflag
     c = ExprOp("bcdadd", b, a)  # +zeroExtend(cf, 16))
 
-    e.append(ExprAff(b, c))
+    e.append(ExprAssign(b, c))
     # e += update_flag_zn_r(c)
 
     # micrcorruption
@@ -213,7 +213,7 @@ def dadd_w(ir, instr, a, b):
     # e += update_flag_nf(a)
     e += reset_sr_res()
 
-    e.append(ExprAff(cf, ExprOp("bcdadd_cf", b, a)))  # +zeroExtend(cf, 16))))
+    e.append(ExprAssign(cf, ExprOp("bcdadd_cf", b, a)))  # +zeroExtend(cf, 16))))
 
     # of : undefined
     return e, []
@@ -222,17 +222,17 @@ def dadd_w(ir, instr, a, b):
 def xor_w(ir, instr, a, b):
     e, a, b = mng_autoinc(a, b, 16)
     c = b ^ a
-    e.append(ExprAff(b, c))
+    e.append(ExprAssign(b, c))
     e += update_flag_zn_r(c)
     e += update_flag_cf_inv_zf(c)
-    e.append(ExprAff(of, b.msb() & a.msb()))
+    e.append(ExprAssign(of, b.msb() & a.msb()))
     return e, []
 
 
 def push_w(ir, instr, a):
     e = []
-    e.append(ExprAff(ExprMem(SP - ExprInt(2, 16), 16), a))
-    e.append(ExprAff(SP, SP - ExprInt(2, 16)))
+    e.append(ExprAssign(ExprMem(SP - ExprInt(2, 16), 16), a))
+    e.append(ExprAssign(SP, SP - ExprInt(2, 16)))
     return e, []
 
 
@@ -242,17 +242,17 @@ def call(ir, instr, a):
     loc_next = ir.get_next_loc_key(instr)
     loc_next_expr = ExprLoc(loc_next, 16)
 
-    e.append(ExprAff(ExprMem(SP - ExprInt(2, 16), 16), loc_next_expr))
-    e.append(ExprAff(SP, SP - ExprInt(2, 16)))
-    e.append(ExprAff(PC, a))
-    e.append(ExprAff(ir.IRDst, a))
+    e.append(ExprAssign(ExprMem(SP - ExprInt(2, 16), 16), loc_next_expr))
+    e.append(ExprAssign(SP, SP - ExprInt(2, 16)))
+    e.append(ExprAssign(PC, a))
+    e.append(ExprAssign(ir.IRDst, a))
     return e, []
 
 
 def swpb(ir, instr, a):
     e = []
     x, y = a[:8], a[8:16]
-    e.append(ExprAff(a, ExprCompose(y, x)))
+    e.append(ExprAssign(a, ExprCompose(y, x)))
     return e, []
 
 
@@ -278,8 +278,8 @@ def jz(ir, instr, a):
     loc_next = ir.get_next_loc_key(instr)
     loc_next_expr = ExprLoc(loc_next, 16)
     e = []
-    e.append(ExprAff(PC, ExprCond(zf, a, loc_next_expr)))
-    e.append(ExprAff(ir.IRDst, ExprCond(zf, a, loc_next_expr)))
+    e.append(ExprAssign(PC, ExprCond(zf, a, loc_next_expr)))
+    e.append(ExprAssign(ir.IRDst, ExprCond(zf, a, loc_next_expr)))
     return e, []
 
 
@@ -287,8 +287,8 @@ def jnz(ir, instr, a):
     loc_next = ir.get_next_loc_key(instr)
     loc_next_expr = ExprLoc(loc_next, 16)
     e = []
-    e.append(ExprAff(PC, ExprCond(zf, loc_next_expr, a)))
-    e.append(ExprAff(ir.IRDst, ExprCond(zf, loc_next_expr, a)))
+    e.append(ExprAssign(PC, ExprCond(zf, loc_next_expr, a)))
+    e.append(ExprAssign(ir.IRDst, ExprCond(zf, loc_next_expr, a)))
     return e, []
 
 
@@ -296,8 +296,8 @@ def jl(ir, instr, a):
     loc_next = ir.get_next_loc_key(instr)
     loc_next_expr = ExprLoc(loc_next, 16)
     e = []
-    e.append(ExprAff(PC, ExprCond(nf ^ of, a, loc_next_expr)))
-    e.append(ExprAff(ir.IRDst, ExprCond(nf ^ of, a, loc_next_expr)))
+    e.append(ExprAssign(PC, ExprCond(nf ^ of, a, loc_next_expr)))
+    e.append(ExprAssign(ir.IRDst, ExprCond(nf ^ of, a, loc_next_expr)))
     return e, []
 
 
@@ -305,8 +305,8 @@ def jc(ir, instr, a):
     loc_next = ir.get_next_loc_key(instr)
     loc_next_expr = ExprLoc(loc_next, 16)
     e = []
-    e.append(ExprAff(PC, ExprCond(cf, a, loc_next_expr)))
-    e.append(ExprAff(ir.IRDst, ExprCond(cf, a, loc_next_expr)))
+    e.append(ExprAssign(PC, ExprCond(cf, a, loc_next_expr)))
+    e.append(ExprAssign(ir.IRDst, ExprCond(cf, a, loc_next_expr)))
     return e, []
 
 
@@ -314,8 +314,8 @@ def jnc(ir, instr, a):
     loc_next = ir.get_next_loc_key(instr)
     loc_next_expr = ExprLoc(loc_next, 16)
     e = []
-    e.append(ExprAff(PC, ExprCond(cf, loc_next_expr, a)))
-    e.append(ExprAff(ir.IRDst, ExprCond(cf, loc_next_expr, a)))
+    e.append(ExprAssign(PC, ExprCond(cf, loc_next_expr, a)))
+    e.append(ExprAssign(ir.IRDst, ExprCond(cf, loc_next_expr, a)))
     return e, []
 
 
@@ -323,23 +323,23 @@ def jge(ir, instr, a):
     loc_next = ir.get_next_loc_key(instr)
     loc_next_expr = ExprLoc(loc_next, 16)
     e = []
-    e.append(ExprAff(PC, ExprCond(nf ^ of, loc_next_expr, a)))
-    e.append(ExprAff(ir.IRDst, ExprCond(nf ^ of, loc_next_expr, a)))
+    e.append(ExprAssign(PC, ExprCond(nf ^ of, loc_next_expr, a)))
+    e.append(ExprAssign(ir.IRDst, ExprCond(nf ^ of, loc_next_expr, a)))
     return e, []
 
 
 def jmp(ir, instr, a):
     e = []
-    e.append(ExprAff(PC, a))
-    e.append(ExprAff(ir.IRDst, a))
+    e.append(ExprAssign(PC, a))
+    e.append(ExprAssign(ir.IRDst, a))
     return e, []
 
 
 def rrc_w(ir, instr, a):
     e = []
     c = ExprCompose(a[1:16], cf)
-    e.append(ExprAff(a, c))
-    e.append(ExprAff(cf, a[:1]))
+    e.append(ExprAssign(a, c))
+    e.append(ExprAssign(cf, a[:1]))
     # e += update_flag_zn_r(c)
 
     # micrcorruption
@@ -347,16 +347,16 @@ def rrc_w(ir, instr, a):
     # e += update_flag_nf(a)
     e += reset_sr_res()
 
-    e.append(ExprAff(of, ExprInt(0, 1)))
+    e.append(ExprAssign(of, ExprInt(0, 1)))
     return e, []
 
 
 def rra_w(ir, instr, a):
     e = []
     c = ExprCompose(a[1:16], a[15:16])
-    e.append(ExprAff(a, c))
+    e.append(ExprAssign(a, c))
     # TODO: error in disasm microcorruption?
-    # e.append(ExprAff(cf, a[:1]))
+    # e.append(ExprAssign(cf, a[:1]))
     # e += update_flag_zn_r(c)
 
     # micrcorruption
@@ -364,18 +364,18 @@ def rra_w(ir, instr, a):
     # e += update_flag_nf(a)
     e += reset_sr_res()
 
-    e.append(ExprAff(of, ExprInt(0, 1)))
+    e.append(ExprAssign(of, ExprInt(0, 1)))
     return e, []
 
 
 def sxt(ir, instr, a):
     e = []
     c = a[:8].signExtend(16)
-    e.append(ExprAff(a, c))
+    e.append(ExprAssign(a, c))
 
     e += update_flag_zn_r(c)
     e += update_flag_cf_inv_zf(c)
-    e.append(ExprAff(of, ExprInt(0, 1)))
+    e.append(ExprAssign(of, ExprInt(0, 1)))
 
     return e, []
 
@@ -414,10 +414,10 @@ mnemo_func = {
 composed_sr = ExprCompose(cf, zf, nf, gie, cpuoff, osc, scg0, scg1, of, res)
 
 
-def ComposeExprAff(dst, src):
+def ComposeExprAssign(dst, src):
     e = []
     for start, arg in dst.iter_args():
-        e.append(ExprAff(arg, src[start:start+arg.size]))
+        e.append(ExprAssign(arg, src[start:start+arg.size]))
     return e
 
 
@@ -442,14 +442,14 @@ class ir_msp430(IntermediateRepresentation):
 
     def mod_sr(self, instr, instr_ir, extra_ir):
         for i, x in enumerate(instr_ir):
-            x = ExprAff(x.dst, x.src.replace_expr({SR: composed_sr}))
+            x = ExprAssign(x.dst, x.src.replace_expr({SR: composed_sr}))
             instr_ir[i] = x
             if x.dst != SR:
                 continue
-            xx = ComposeExprAff(composed_sr, x.src)
+            xx = ComposeExprAssign(composed_sr, x.src)
             instr_ir[i:i+1] = xx
         for i, x in enumerate(instr_ir):
-            x = ExprAff(x.dst, x.src.replace_expr(
+            x = ExprAssign(x.dst, x.src.replace_expr(
                 {self.pc: ExprInt(instr.offset + instr.l, 16)}))
             instr_ir[i] = x
 
diff --git a/miasm2/arch/ppc/ira.py b/miasm2/arch/ppc/ira.py
index 79476e90..cde57dd3 100644
--- a/miasm2/arch/ppc/ira.py
+++ b/miasm2/arch/ppc/ira.py
@@ -1,4 +1,4 @@
-from miasm2.expression.expression import ExprAff, ExprOp
+from miasm2.expression.expression import ExprAssign, ExprOp
 from miasm2.ir.ir import AssignBlock
 from miasm2.ir.analysis import ira
 from miasm2.arch.ppc.sem import ir_ppc32b
@@ -25,7 +25,7 @@ class ir_a_ppc32b(ir_ppc32b, ira):
     def call_effects(self, ad, instr):
         call_assignblks = AssignBlock(
             [
-                ExprAff(
+                ExprAssign(
                     self.ret_reg,
                     ExprOp(
                         'call_func_ret',
@@ -36,7 +36,7 @@ class ir_a_ppc32b(ir_ppc32b, ira):
                         self.arch.regs.R5,
                     )
                 ),
-                ExprAff(self.sp, ExprOp('call_func_stack', ad, self.sp)),
+                ExprAssign(self.sp, ExprOp('call_func_stack', ad, self.sp)),
             ],
             instr
         )
diff --git a/miasm2/arch/ppc/sem.py b/miasm2/arch/ppc/sem.py
index 82a662c2..3a8ec244 100644
--- a/miasm2/arch/ppc/sem.py
+++ b/miasm2/arch/ppc/sem.py
@@ -23,15 +23,15 @@ sbuild = SemBuilder(ctx)
 
 def mn_compute_flags(rvalue, overflow_expr=None):
     ret = []
-    ret.append(ExprAff(CR0_LT, rvalue.msb()))
-    ret.append(ExprAff(CR0_GT, (ExprCond(rvalue, ExprInt(1, 1),
+    ret.append(ExprAssign(CR0_LT, rvalue.msb()))
+    ret.append(ExprAssign(CR0_GT, (ExprCond(rvalue, ExprInt(1, 1),
                                          ExprInt(0, 1)) & ~rvalue.msb())))
-    ret.append(ExprAff(CR0_EQ, ExprCond(rvalue, ExprInt(0, 1),
+    ret.append(ExprAssign(CR0_EQ, ExprCond(rvalue, ExprInt(0, 1),
                                         ExprInt(1, 1))))
     if overflow_expr != None:
-        ret.append(ExprAff(CR0_SO, XER_SO | overflow_expr))
+        ret.append(ExprAssign(CR0_SO, XER_SO | overflow_expr))
     else:
-        ret.append(ExprAff(CR0_SO, XER_SO))
+        ret.append(ExprAssign(CR0_SO, XER_SO))
 
     return ret
 
@@ -70,8 +70,8 @@ def mn_do_add(ir, instr, arg1, arg2, arg3):
         msb2 = arg3.msb()
         msba = rvalue.msb()
         over_expr = ~(msb1 ^ msb2) & (msb1 ^ msba)
-        flags_update.append(ExprAff(XER_OV, over_expr))
-        flags_update.append(ExprAff(XER_SO, XER_SO | over_expr))
+        flags_update.append(ExprAssign(XER_OV, over_expr))
+        flags_update.append(ExprAssign(XER_SO, XER_SO | over_expr))
 
     if has_dot:
         flags_update += mn_compute_flags(rvalue, over_expr)
@@ -79,9 +79,9 @@ def mn_do_add(ir, instr, arg1, arg2, arg3):
     if has_c or has_e:
         carry_expr = (((arg2 ^ arg3) ^ rvalue) ^
                       ((arg2 ^ rvalue) & (~(arg2 ^ arg3)))).msb()
-        flags_update.append(ExprAff(XER_CA, carry_expr))
+        flags_update.append(ExprAssign(XER_CA, carry_expr))
 
-    return ([ ExprAff(arg1, rvalue) ] + flags_update), []
+    return ([ ExprAssign(arg1, rvalue) ] + flags_update), []
 
 def mn_do_and(ir, instr, ra, rs, arg2):
     if len(instr.name) > 3 and instr.name[3] == 'C':
@@ -90,7 +90,7 @@ def mn_do_and(ir, instr, ra, rs, arg2):
         oarg = arg2
 
     rvalue = rs & oarg
-    ret = [ ExprAff(ra, rvalue) ]
+    ret = [ ExprAssign(ra, rvalue) ]
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue)
@@ -98,7 +98,7 @@ def mn_do_and(ir, instr, ra, rs, arg2):
     return ret, []
 
 def mn_do_cntlzw(ir, instr, ra, rs):
-    ret = [ ExprAff(ra, ExprOp('cntleadzeros', rs)) ]
+    ret = [ ExprAssign(ra, ExprOp('cntleadzeros', rs)) ]
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue)
@@ -136,7 +136,7 @@ def mn_do_cr(ir, instr, crd, cra, crb):
         r = a ^ b
     else:
         raise RuntimeError("Unknown operation on CR")
-    return [ ExprAff(d, r) ], []
+    return [ ExprAssign(d, r) ], []
 
 def mn_do_div(ir, instr, rd, ra, rb):
     assert instr.name[0:4] == 'DIVW'
@@ -177,18 +177,18 @@ def mn_do_div(ir, instr, rd, ra, rb):
                                               ExprInt(1, 1)) &
                                      ExprCond(rb ^ 0xFFFFFFFF, ExprInt(0, 1),
                                               ExprInt(1, 1)))
-        flags_update.append(ExprAff(XER_OV, over_expr))
-        flags_update.append(ExprAff(XER_SO, XER_SO | over_expr))
+        flags_update.append(ExprAssign(XER_OV, over_expr))
+        flags_update.append(ExprAssign(XER_SO, XER_SO | over_expr))
 
     if has_dot:
         flags_update += mn_compute_flags(rvalue, over_expr)
 
-    return ([ ExprAff(rd, rvalue) ] + flags_update), []
+    return ([ ExprAssign(rd, rvalue) ] + flags_update), []
 
 
 def mn_do_eqv(ir, instr, ra, rs, rb):
     rvalue = ~(rs ^ rb)
-    ret = [ ExprAff(ra, rvalue) ]
+    ret = [ ExprAssign(ra, rvalue) ]
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue)
@@ -204,7 +204,7 @@ def mn_do_exts(ir, instr, ra, rs):
         assert False
 
     rvalue = rs[0:size].signExtend(32)
-    ret = [ ExprAff(ra, rvalue) ]
+    ret = [ ExprAssign(ra, rvalue) ]
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue)
@@ -264,16 +264,16 @@ def mn_do_load(ir, instr, arg1, arg2, arg3=None):
     else:
         src = src.zeroExtend(32)
 
-    ret.append(ExprAff(arg1, src))
+    ret.append(ExprAssign(arg1, src))
     if has_u:
         if arg3 is None:
-            ret.append(ExprAff(arg2.arg.args[0], address))
+            ret.append(ExprAssign(arg2.arg.args[0], address))
         else:
-            ret.append(ExprAff(arg2, address))
+            ret.append(ExprAssign(arg2, address))
 
     if is_lwarx:
-        ret.append(ExprAff(reserve, ExprInt(1, 1)))
-        ret.append(ExprAff(reserve_address, address))	# XXX should be the PA
+        ret.append(ExprAssign(reserve, ExprInt(1, 1)))
+        ret.append(ExprAssign(reserve_address, address))	# XXX should be the PA
 
     return ret, []
 
@@ -283,7 +283,7 @@ def mn_do_lmw(ir, instr, rd, src):
     ri = int(rd.name[1:],10)
     i = 0
     while ri <= 31:
-        ret.append(ExprAff(all_regs_ids_byname["R%d" % ri],
+        ret.append(ExprAssign(all_regs_ids_byname["R%d" % ri],
                            ExprMem(address + ExprInt(i, 32), 32)))
         ri += 1
         i += 4
@@ -305,7 +305,7 @@ def mn_do_mcrf(ir, instr, crfd, crfs):
     for bit in [ 'LT', 'GT', 'EQ', 'SO' ]:
         d = all_regs_ids_byname["%s_%s" % (crfd, bit)]
         s = all_regs_ids_byname["%s_%s" % (crfs, bit)]
-        ret.append(ExprAff(d, s))
+        ret.append(ExprAssign(d, s))
 
     return ret, []
 
@@ -314,12 +314,12 @@ def mn_do_mcrxr(ir, instr, crfd):
 
     for (bit, val) in [ ('LT', XER_SO), ('GT', XER_OV), ('EQ', XER_CA),
                         ('SO', ExprInt(0, 1)) ]:
-        ret.append(ExprAff(all_regs_ids_byname["%s_%s" % (crfd, bit)], val))
+        ret.append(ExprAssign(all_regs_ids_byname["%s_%s" % (crfd, bit)], val))
 
     return ret, []
 
 def mn_do_mfcr(ir, instr, rd):
-    return ([ ExprAff(rd, ExprCompose(*[ all_regs_ids_byname["CR%d_%s" % (i, b)]
+    return ([ ExprAssign(rd, ExprCompose(*[ all_regs_ids_byname["CR%d_%s" % (i, b)]
                                         for i in xrange(7, -1, -1)
                                         for b in ['SO', 'EQ', 'GT', 'LT']]))],
             [])
@@ -332,15 +332,15 @@ def mn_mfspr(ir, instr, arg1, arg2):
     sprid = arg2.arg.arg
     gprid = int(arg1.name[1:])
     if sprid in spr_dict:
-        return [ ExprAff(arg1, spr_dict[sprid]) ], []
+        return [ ExprAssign(arg1, spr_dict[sprid]) ], []
     elif sprid == 1:		# XER
-        return [ ExprAff(arg1, ExprCompose(XER_BC, ExprInt(0, 22),
+        return [ ExprAssign(arg1, ExprCompose(XER_BC, ExprInt(0, 22),
                                            XER_CA, XER_OV, XER_SO)) ], []
     else:
-        return [ ExprAff(spr_access,
+        return [ ExprAssign(spr_access,
                          ExprInt(((sprid << SPR_ACCESS_SPR_OFF) |
                                     (gprid << SPR_ACCESS_GPR_OFF)), 32)),
-                 ExprAff(exception_flags, ExprInt(EXCEPT_SPR_ACCESS, 32)) ], []
+                 ExprAssign(exception_flags, ExprInt(EXCEPT_SPR_ACCESS, 32)) ], []
 
 def mn_mtcrf(ir, instr, crm, rs):
     ret = []
@@ -349,7 +349,7 @@ def mn_mtcrf(ir, instr, crm, rs):
         if crm.arg.arg & (1 << (7 - i)):
             j = (28 - 4 * i) + 3
             for b in ['LT', 'GT', 'EQ', 'SO']:
-                ret.append(ExprAff(all_regs_ids_byname["CR%d_%s" % (i, b)],
+                ret.append(ExprAssign(all_regs_ids_byname["CR%d_%s" % (i, b)],
                                    rs[j:j+1]))
                 j -= 1
 
@@ -357,24 +357,24 @@ def mn_mtcrf(ir, instr, crm, rs):
 
 def mn_mtmsr(ir, instr, rs):
     print "%08x: MSR assigned" % instr.offset
-    return [ ExprAff(MSR, rs) ], []
+    return [ ExprAssign(MSR, rs) ], []
 
 def mn_mtspr(ir, instr, arg1, arg2):
     sprid = arg1.arg.arg
     gprid = int(arg2.name[1:])
     if sprid in spr_dict:
-        return [ ExprAff(spr_dict[sprid], arg2) ], []
+        return [ ExprAssign(spr_dict[sprid], arg2) ], []
     elif sprid == 1:		# XER
-        return [ ExprAff(XER_SO, arg2[31:32]),
-                 ExprAff(XER_OV, arg2[30:31]),
-                 ExprAff(XER_CA, arg2[29:30]),
-                 ExprAff(XER_BC, arg2[0:7]) ], []
+        return [ ExprAssign(XER_SO, arg2[31:32]),
+                 ExprAssign(XER_OV, arg2[30:31]),
+                 ExprAssign(XER_CA, arg2[29:30]),
+                 ExprAssign(XER_BC, arg2[0:7]) ], []
     else:
-        return [ ExprAff(spr_access,
+        return [ ExprAssign(spr_access,
                          ExprInt(((sprid << SPR_ACCESS_SPR_OFF) |
                                     (gprid << SPR_ACCESS_GPR_OFF) |
                                     SPR_ACCESS_IS_WRITE), 32)),
-                 ExprAff(exception_flags, ExprInt(EXCEPT_SPR_ACCESS, 32)) ], []
+                 ExprAssign(exception_flags, ExprInt(EXCEPT_SPR_ACCESS, 32)) ], []
 
 def mn_do_mul(ir, instr, rd, ra, arg2):
     variant = instr.name[3:]
@@ -398,7 +398,7 @@ def mn_do_mul(ir, instr, rd, ra, arg2):
     if shift != 0:
         rvalue = rvalue[shift : shift + 32]
 
-    ret = [ ExprAff(rd, rvalue) ]
+    ret = [ ExprAssign(rd, rvalue) ]
 
     over_expr = None
     if variant[-1] == 'O':
@@ -406,8 +406,8 @@ def mn_do_mul(ir, instr, rd, ra, arg2):
                               ExprOp('*', v1.signExtend(64),
                                      v2.signExtend(64))),
                              ExprInt(1, 1), ExprInt(0, 1))
-        ret.append(ExprAff(XER_OV, over_expr))
-        ret.append(ExprAff(XER_SO, XER_SO | over_expr))
+        ret.append(ExprAssign(XER_OV, over_expr))
+        ret.append(ExprAssign(XER_SO, XER_SO | over_expr))
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue, over_expr)
@@ -416,7 +416,7 @@ def mn_do_mul(ir, instr, rd, ra, arg2):
 
 def mn_do_nand(ir, instr, ra, rs, rb):
     rvalue = ~(rs & rb)
-    ret = [ ExprAff(ra, rvalue) ]
+    ret = [ ExprAssign(ra, rvalue) ]
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue)
@@ -425,7 +425,7 @@ def mn_do_nand(ir, instr, ra, rs, rb):
 
 def mn_do_neg(ir, instr, rd, ra):
     rvalue = -ra
-    ret = [ ExprAff(rd, rvalue) ]
+    ret = [ ExprAssign(rd, rvalue) ]
     has_o = False
 
     over_expr = None
@@ -433,8 +433,8 @@ def mn_do_neg(ir, instr, rd, ra):
         has_o = True
         over_expr = ExprCond(ra ^ ExprInt(0x80000000, 32),
                              ExprInt(0, 1), ExprInt(1, 1))
-        ret.append(ExprAff(XER_OV, over_expr))
-        ret.append(ExprAff(XER_SO, XER_SO | over_expr))
+        ret.append(ExprAssign(XER_OV, over_expr))
+        ret.append(ExprAssign(XER_SO, XER_SO | over_expr))
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue, over_expr)
@@ -444,7 +444,7 @@ def mn_do_neg(ir, instr, rd, ra):
 def mn_do_nor(ir, instr, ra, rs, rb):
 
     rvalue = ~(rs | rb)
-    ret = [ ExprAff(ra, rvalue) ]
+    ret = [ ExprAssign(ra, rvalue) ]
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue)
@@ -458,7 +458,7 @@ def mn_do_or(ir, instr, ra, rs, arg2):
         oarg = arg2
 
     rvalue = rs | oarg
-    ret = [ ExprAff(ra, rvalue) ]
+    ret = [ ExprAssign(ra, rvalue) ]
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue)
@@ -467,13 +467,13 @@ def mn_do_or(ir, instr, ra, rs, arg2):
 
 def mn_do_rfi(ir, instr):
     dest = ExprCompose(ExprInt(0, 2), SRR0[2:32])
-    ret = [ ExprAff(MSR, (MSR &
+    ret = [ ExprAssign(MSR, (MSR &
                           ~ExprInt(0b1111111101110011, 32) |
                           ExprCompose(SRR1[0:2], ExprInt(0, 2),
                                       SRR1[4:7], ExprInt(0, 1), 
                                       SRR1[8:16], ExprInt(0, 16)))),
-            ExprAff(PC, dest),
-            ExprAff(ir.IRDst, dest) ]
+            ExprAssign(PC, dest),
+            ExprAssign(ir.IRDst, dest) ]
     return ret, []
 
 def mn_do_rotate(ir, instr, ra, rs, shift, mb, me):
@@ -486,7 +486,7 @@ def mn_do_rotate(ir, instr, ra, rs, shift, mb, me):
     if instr.name[0:6] == 'RLWIMI':
         rvalue = rvalue | (ra & ~m)
 
-    ret = [ ExprAff(ra, rvalue) ]
+    ret = [ ExprAssign(ra, rvalue) ]
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue)
@@ -497,7 +497,7 @@ def mn_do_slw(ir, instr, ra, rs, rb):
 
     rvalue = ExprCond(rb[5:6], ExprInt(0, 32),
                       ExprOp('<<', rs, rb & ExprInt(0b11111, 32)))
-    ret = [ ExprAff(ra, rvalue) ]
+    ret = [ ExprAssign(ra, rvalue) ]
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue)
@@ -507,7 +507,7 @@ def mn_do_slw(ir, instr, ra, rs, rb):
 def mn_do_sraw(ir, instr, ra, rs, rb):
     rvalue = ExprCond(rb[5:6], ExprInt(0xFFFFFFFF, 32),
                       ExprOp('a>>', rs, rb & ExprInt(0b11111, 32)))
-    ret = [ ExprAff(ra, rvalue) ]
+    ret = [ ExprAssign(ra, rvalue) ]
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue)
@@ -515,28 +515,28 @@ def mn_do_sraw(ir, instr, ra, rs, rb):
     mask = ExprCond(rb[5:6], ExprInt(0xFFFFFFFF, 32),
                     (ExprInt(0xFFFFFFFF, 32) >>
                      (ExprInt(32, 32) - (rb & ExprInt(0b11111, 32)))))
-    ret.append(ExprAff(XER_CA, rs.msb() &
+    ret.append(ExprAssign(XER_CA, rs.msb() &
                        ExprCond(rs & mask, ExprInt(1, 1), ExprInt(0, 1))))
 
     return ret, []
 
 def mn_do_srawi(ir, instr, ra, rs, imm):
     rvalue = ExprOp('a>>', rs, imm)
-    ret = [ ExprAff(ra, rvalue) ]
+    ret = [ ExprAssign(ra, rvalue) ]
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue)
 
     mask = ExprInt(0xFFFFFFFF >> (32 - imm.arg.arg), 32)
 
-    ret.append(ExprAff(XER_CA, rs.msb() &
+    ret.append(ExprAssign(XER_CA, rs.msb() &
                        ExprCond(rs & mask, ExprInt(1, 1), ExprInt(0, 1))))
 
     return ret, []
 
 def mn_do_srw(ir, instr, ra, rs, rb):
     rvalue = rs >> (rb & ExprInt(0b11111, 32))
-    ret = [ ExprAff(ra, rvalue) ]
+    ret = [ ExprAssign(ra, rvalue) ]
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue)
@@ -549,7 +549,7 @@ def mn_do_stmw(ir, instr, rs, dest):
     ri = int(rs.name[1:],10)
     i = 0
     while ri <= 31:
-        ret.append(ExprAff(ExprMem(address + ExprInt(i,32), 32),
+        ret.append(ExprAssign(ExprMem(address + ExprInt(i,32), 32),
                            all_regs_ids_byname["R%d" % ri]))
         ri += 1
         i += 4
@@ -596,29 +596,29 @@ def mn_do_store(ir, instr, arg1, arg2, arg3=None):
     if has_b:
         src = byte_swap(src)
 
-    ret.append(ExprAff(dest, src))
+    ret.append(ExprAssign(dest, src))
     if has_u:
         if arg3 is None:
-            ret.append(ExprAff(arg2.arg.args[0], address))
+            ret.append(ExprAssign(arg2.arg.args[0], address))
         else:
-            ret.append(ExprAff(arg2, address))
+            ret.append(ExprAssign(arg2, address))
 
     if is_stwcx:
         loc_do = ExprLoc(ir.loc_db.add_location(), ir.IRDst.size)
         loc_dont = ExprLoc(ir.loc_db.add_location(), ir.IRDst.size)
         loc_next = ExprLoc(ir.get_next_loc_key(instr), ir.IRDst.size)
-        flags = [ ExprAff(CR0_LT, ExprInt(0,1)),
-                  ExprAff(CR0_GT, ExprInt(0,1)),
-                  ExprAff(CR0_SO, XER_SO)]
+        flags = [ ExprAssign(CR0_LT, ExprInt(0,1)),
+                  ExprAssign(CR0_GT, ExprInt(0,1)),
+                  ExprAssign(CR0_SO, XER_SO)]
         ret += flags
-        ret.append(ExprAff(CR0_EQ, ExprInt(1,1)))
-        ret.append(ExprAff(ir.IRDst, loc_next))
-        dont = flags + [ ExprAff(CR0_EQ, ExprInt(0,1)),
-                         ExprAff(ir.IRDst, loc_next) ]
+        ret.append(ExprAssign(CR0_EQ, ExprInt(1,1)))
+        ret.append(ExprAssign(ir.IRDst, loc_next))
+        dont = flags + [ ExprAssign(CR0_EQ, ExprInt(0,1)),
+                         ExprAssign(ir.IRDst, loc_next) ]
         additional_ir = [ IRBlock(loc_do, [ AssignBlock(ret) ]),
                           IRBlock(loc_dont, [ AssignBlock(dont) ]) ]
-        ret = [ ExprAff(reserve, ExprInt(0, 1)),
-                ExprAff(ir.IRDst, ExprCond(reserve, loc_do, loc_dont)) ]
+        ret = [ ExprAssign(reserve, ExprInt(0, 1)),
+                ExprAssign(ir.IRDst, ExprCond(reserve, loc_do, loc_dont)) ]
 
     return ret, additional_ir
 
@@ -658,8 +658,8 @@ def mn_do_sub(ir, instr, arg1, arg2, arg3):
         msb2 = arg3.msb()
         msba = rvalue.msb()
         over_expr = (msb1 ^ msb2) & (msb1 ^ msba)
-        flags_update.append(ExprAff(XER_OV, over_expr))
-        flags_update.append(ExprAff(XER_SO, XER_SO | over_expr))
+        flags_update.append(ExprAssign(XER_OV, over_expr))
+        flags_update.append(ExprAssign(XER_SO, XER_SO | over_expr))
 
     if has_dot:
         flags_update += mn_compute_flags(rvalue, over_expr)
@@ -667,13 +667,13 @@ def mn_do_sub(ir, instr, arg1, arg2, arg3):
     if has_c or has_e:
         carry_expr = ((((arg3 ^ arg2) ^ rvalue) ^
                        ((arg3 ^ rvalue) & (arg3 ^ arg2))).msb())
-        flags_update.append(ExprAff(XER_CA, ~carry_expr))
+        flags_update.append(ExprAssign(XER_CA, ~carry_expr))
 
-    return ([ ExprAff(arg1, rvalue) ] + flags_update), []
+    return ([ ExprAssign(arg1, rvalue) ] + flags_update), []
 
 def mn_do_xor(ir, instr, ra, rs, rb):
     rvalue = rs ^ rb
-    ret = [ ExprAff(ra, rvalue) ]
+    ret = [ ExprAssign(ra, rvalue) ]
 
     if instr.name[-1] == '.':
         ret += mn_compute_flags(rvalue)
@@ -683,15 +683,15 @@ def mn_do_xor(ir, instr, ra, rs, rb):
 def mn_b(ir, instr, arg1, arg2 = None):
     if arg2 is not None:
         arg1 = arg2
-    return [ ExprAff(PC, arg1), ExprAff(ir.IRDst, arg1) ], []
+    return [ ExprAssign(PC, arg1), ExprAssign(ir.IRDst, arg1) ], []
 
 def mn_bl(ir, instr, arg1, arg2 = None):
     if arg2 is not None:
         arg1 = arg2
     dst = ir.get_next_instr(instr)
-    return [ ExprAff(LR, ExprLoc(dst, 32)),
-             ExprAff(PC, arg1),
-             ExprAff(ir.IRDst, arg1) ], []
+    return [ ExprAssign(LR, ExprLoc(dst, 32)),
+             ExprAssign(PC, arg1),
+             ExprAssign(ir.IRDst, arg1) ], []
 
 def mn_get_condition(instr):
     bit = instr.additional_info.bi & 0b11
@@ -706,7 +706,7 @@ def mn_do_cond_branch(ir, instr, dest):
     if bo & 0b00100:
         ctr_cond = True
     else:
-        ret.append(ExprAff(CTR, CTR - ExprInt(1, 32)))
+        ret.append(ExprAssign(CTR, CTR - ExprInt(1, 32)))
         ctr_cond = ExprCond(CTR ^ ExprInt(1, 32), ExprInt(1, 1), ExprInt(0, 1))
         if bo & 0b00010:
             ctr_cond = ~ctr_cond
@@ -733,10 +733,10 @@ def mn_do_cond_branch(ir, instr, dest):
 
     if instr.name[-1] == 'L' or instr.name[-2:-1] == 'LA':
         dst = ir.get_next_instr(instr)
-        ret.append(ExprAff(LR, ExprLoc(dst, 32)))
+        ret.append(ExprAssign(LR, ExprLoc(dst, 32)))
 
-    ret.append(ExprAff(PC, dest_expr))
-    ret.append(ExprAff(ir.IRDst, dest_expr))
+    ret.append(ExprAssign(PC, dest_expr))
+    ret.append(ExprAssign(ir.IRDst, dest_expr))
 
     return ret, []
 
@@ -777,7 +777,7 @@ def mn_assign(arg1, arg2):
 
 def mn_stb(ir, instr, arg1, arg2):
     dest = ExprMem(arg2.arg, 8)
-    return [ExprAff(dest, ExprSlice(arg1, 0, 8))], []
+    return [ExprAssign(dest, ExprSlice(arg1, 0, 8))], []
 
 @sbuild.parse
 def mn_stwu(arg1, arg2):
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py
index 2abd5bbc..e2c515d1 100644
--- a/miasm2/arch/x86/arch.py
+++ b/miasm2/arch/x86/arch.py
@@ -881,7 +881,7 @@ class mn_x86(cls_mn):
         raise NotImplementedError('not fully functional')
 
     def ir_pre_instruction(self):
-        return [ExprAff(mRIP[self.mode],
+        return [ExprAssign(mRIP[self.mode],
             ExprInt(self.offset + self.l, mRIP[self.mode].size))]
 
     @classmethod
diff --git a/miasm2/arch/x86/ira.py b/miasm2/arch/x86/ira.py
index a95e6c69..749069f6 100644
--- a/miasm2/arch/x86/ira.py
+++ b/miasm2/arch/x86/ira.py
@@ -1,6 +1,6 @@
 #-*- coding:utf-8 -*-
 
-from miasm2.expression.expression import ExprAff, ExprOp
+from miasm2.expression.expression import ExprAssign, ExprOp
 from miasm2.ir.ir import AssignBlock
 from miasm2.ir.analysis import ira
 from miasm2.arch.x86.sem import ir_x86_16, ir_x86_32, ir_x86_64
@@ -46,7 +46,7 @@ class ir_a_x86_64(ir_x86_64, ir_a_x86_16):
     def call_effects(self, ad, instr):
         call_assignblk = AssignBlock(
             [
-                ExprAff(
+                ExprAssign(
                     self.ret_reg,
                     ExprOp(
                         'call_func_ret',
@@ -58,7 +58,7 @@ class ir_a_x86_64(ir_x86_64, ir_a_x86_16):
                         self.arch.regs.R9,
                     )
                 ),
-                ExprAff(self.sp, ExprOp('call_func_stack', ad, self.sp)),
+                ExprAssign(self.sp, ExprOp('call_func_stack', ad, self.sp)),
             ],
             instr
         )
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py
index 816608cb..727d0bc2 100644
--- a/miasm2/arch/x86/sem.py
+++ b/miasm2/arch/x86/sem.py
@@ -60,12 +60,12 @@ OF(A-B) = ((A XOR D) AND (A XOR B)) < 0
 
 # XXX TODO make default check against 0 or not 0 (same eq as in C)
 def update_flag_zf_eq(a, b):
-    return [m2_expr.ExprAff(zf, m2_expr.ExprOp("FLAG_EQ_CMP", a, b))]
+    return [m2_expr.ExprAssign(zf, m2_expr.ExprOp("FLAG_EQ_CMP", a, b))]
 
 
 def update_flag_zf(a):
     return [
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             zf,
             m2_expr.ExprCond(
                 a,
@@ -78,7 +78,7 @@ def update_flag_zf(a):
 
 def update_flag_nf(arg):
     return [
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             nf,
             m2_expr.ExprOp("FLAG_SIGN_SUB", arg, m2_expr.ExprInt(0, arg.size))
         )
@@ -86,13 +86,13 @@ def update_flag_nf(arg):
 
 
 def update_flag_pf(a):
-    return [m2_expr.ExprAff(pf,
+    return [m2_expr.ExprAssign(pf,
                             m2_expr.ExprOp('parity',
                                            a & m2_expr.ExprInt(0xFF, a.size)))]
 
 
 def update_flag_af(op1, op2, res):
-    return [m2_expr.ExprAff(af, (op1 ^ op2 ^ res)[4:5])]
+    return [m2_expr.ExprAssign(af, (op1 ^ op2 ^ res)[4:5])]
 
 
 def update_flag_znp(a):
@@ -112,8 +112,8 @@ def update_flag_np(result):
 
 def null_flag_co():
     e = []
-    e.append(m2_expr.ExprAff(of, m2_expr.ExprInt(0, of.size)))
-    e.append(m2_expr.ExprAff(cf, m2_expr.ExprInt(0, cf.size)))
+    e.append(m2_expr.ExprAssign(of, m2_expr.ExprInt(0, of.size)))
+    e.append(m2_expr.ExprAssign(cf, m2_expr.ExprInt(0, cf.size)))
     return e
 
 
@@ -124,10 +124,10 @@ def update_flag_arith(a):
 
 
 def update_flag_zfaddwc_eq(arg1, arg2, arg3):
-    return [m2_expr.ExprAff(zf, m2_expr.ExprOp("FLAG_EQ_ADDWC", arg1, arg2, arg3))]
+    return [m2_expr.ExprAssign(zf, m2_expr.ExprOp("FLAG_EQ_ADDWC", arg1, arg2, arg3))]
 
 def update_flag_zfsubwc_eq(arg1, arg2, arg3):
-    return [m2_expr.ExprAff(zf, m2_expr.ExprOp("FLAG_EQ_SUBWC", arg1, arg2, arg3))]
+    return [m2_expr.ExprAssign(zf, m2_expr.ExprOp("FLAG_EQ_SUBWC", arg1, arg2, arg3))]
 
 
 def update_flag_arith_add_znp(arg1, arg2):
@@ -136,7 +136,7 @@ def update_flag_arith_add_znp(arg1, arg2):
     """
     e = []
     e += update_flag_zf_eq(arg1, -arg2)
-    e += [m2_expr.ExprAff(nf, m2_expr.ExprOp("FLAG_SIGN_SUB", arg1, -arg2))]
+    e += [m2_expr.ExprAssign(nf, m2_expr.ExprOp("FLAG_SIGN_SUB", arg1, -arg2))]
     e += update_flag_pf(arg1+arg2)
     return e
 
@@ -147,7 +147,7 @@ def update_flag_arith_addwc_znp(arg1, arg2, arg3):
     """
     e = []
     e += update_flag_zfaddwc_eq(arg1, arg2, arg3)
-    e += [m2_expr.ExprAff(nf, m2_expr.ExprOp("FLAG_SIGN_ADDWC", arg1, arg2, arg3))]
+    e += [m2_expr.ExprAssign(nf, m2_expr.ExprOp("FLAG_SIGN_ADDWC", arg1, arg2, arg3))]
     e += update_flag_pf(arg1+arg2+arg3.zeroExtend(arg2.size))
     return e
 
@@ -160,7 +160,7 @@ def update_flag_arith_sub_znp(arg1, arg2):
     """
     e = []
     e += update_flag_zf_eq(arg1, arg2)
-    e += [m2_expr.ExprAff(nf, m2_expr.ExprOp("FLAG_SIGN_SUB", arg1, arg2))]
+    e += [m2_expr.ExprAssign(nf, m2_expr.ExprOp("FLAG_SIGN_SUB", arg1, arg2))]
     e += update_flag_pf(arg1 - arg2)
     return e
 
@@ -171,7 +171,7 @@ def update_flag_arith_subwc_znp(arg1, arg2, arg3):
     """
     e = []
     e += update_flag_zfsubwc_eq(arg1, arg2, arg3)
-    e += [m2_expr.ExprAff(nf, m2_expr.ExprOp("FLAG_SIGN_SUBWC", arg1, arg2, arg3))]
+    e += [m2_expr.ExprAssign(nf, m2_expr.ExprOp("FLAG_SIGN_SUBWC", arg1, arg2, arg3))]
     e += update_flag_pf(arg1 - (arg2+arg3.zeroExtend(arg2.size)))
     return e
 
@@ -192,45 +192,45 @@ def arith_flag(a, b, c):
 
 def update_flag_add_cf(op1, op2, res):
     "Compute cf in @res = @op1 + @op2"
-    #return [m2_expr.ExprAff(cf, m2_expr.ExprOp("FLAG_SUB_CF", op1, -op2))]
-    return [m2_expr.ExprAff(cf, m2_expr.ExprOp("FLAG_ADD_CF", op1, op2))]
+    #return [m2_expr.ExprAssign(cf, m2_expr.ExprOp("FLAG_SUB_CF", op1, -op2))]
+    return [m2_expr.ExprAssign(cf, m2_expr.ExprOp("FLAG_ADD_CF", op1, op2))]
 
 
 def update_flag_add_of(op1, op2, res):
     "Compute of in @res = @op1 + @op2"
-    return [m2_expr.ExprAff(of, m2_expr.ExprOp("FLAG_ADD_OF", op1, op2))]
+    return [m2_expr.ExprAssign(of, m2_expr.ExprOp("FLAG_ADD_OF", op1, op2))]
 
 
 # checked: ok for sbb add because b & c before +cf
 def update_flag_sub_cf(op1, op2, res):
     "Compote CF in @res = @op1 - @op2"
-    return [m2_expr.ExprAff(cf, m2_expr.ExprOp("FLAG_SUB_CF", op1, op2))]
+    return [m2_expr.ExprAssign(cf, m2_expr.ExprOp("FLAG_SUB_CF", op1, op2))]
 
 
 def update_flag_sub_of(op1, op2, res):
     "Compote OF in @res = @op1 - @op2"
-    return [m2_expr.ExprAff(of, m2_expr.ExprOp("FLAG_SUB_OF", op1, op2))]
+    return [m2_expr.ExprAssign(of, m2_expr.ExprOp("FLAG_SUB_OF", op1, op2))]
 
 
 def update_flag_addwc_cf(op1, op2, op3):
     "Compute cf in @res = @op1 + @op2 + @op3"
-    return [m2_expr.ExprAff(cf, m2_expr.ExprOp("FLAG_ADDWC_CF", op1, op2, op3))]
+    return [m2_expr.ExprAssign(cf, m2_expr.ExprOp("FLAG_ADDWC_CF", op1, op2, op3))]
 
 
 def update_flag_addwc_of(op1, op2, op3):
     "Compute of in @res = @op1 + @op2 + @op3"
-    return [m2_expr.ExprAff(of, m2_expr.ExprOp("FLAG_ADDWC_OF", op1, op2, op3))]
+    return [m2_expr.ExprAssign(of, m2_expr.ExprOp("FLAG_ADDWC_OF", op1, op2, op3))]
 
 
 
 def update_flag_subwc_cf(op1, op2, op3):
     "Compute cf in @res = @op1 + @op2 + @op3"
-    return [m2_expr.ExprAff(cf, m2_expr.ExprOp("FLAG_SUBWC_CF", op1, op2, op3))]
+    return [m2_expr.ExprAssign(cf, m2_expr.ExprOp("FLAG_SUBWC_CF", op1, op2, op3))]
 
 
 def update_flag_subwc_of(op1, op2, op3):
     "Compute of in @res = @op1 + @op2 + @op3"
-    return [m2_expr.ExprAff(of, m2_expr.ExprOp("FLAG_SUBWC_OF", op1, op2, op3))]
+    return [m2_expr.ExprAssign(of, m2_expr.ExprOp("FLAG_SUBWC_OF", op1, op2, op3))]
 
 
 
@@ -269,9 +269,9 @@ def update_flag_arith_subwc_co(arg1, arg2, arg3):
 def set_float_cs_eip(instr):
     e = []
     # XXX TODO check float updt
-    e.append(m2_expr.ExprAff(float_eip,
+    e.append(m2_expr.ExprAssign(float_eip,
                              m2_expr.ExprInt(instr.offset, float_eip.size)))
-    e.append(m2_expr.ExprAff(float_cs, CS))
+    e.append(m2_expr.ExprAssign(float_cs, CS))
     return e
 
 
@@ -358,8 +358,8 @@ def gen_jcc(ir, instr, cond, dst, jmp_if):
     mn_dst = m2_expr.ExprCond(cond,
                               dstA.zeroExtend(ir.IRDst.size),
                               dstB.zeroExtend(ir.IRDst.size))
-    e.append(m2_expr.ExprAff(meip, mn_dst))
-    e.append(m2_expr.ExprAff(ir.IRDst, mn_dst))
+    e.append(m2_expr.ExprAssign(meip, mn_dst))
+    e.append(m2_expr.ExprAssign(ir.IRDst, mn_dst))
     return e, []
 
 
@@ -378,9 +378,9 @@ def gen_fcmov(ir, instr, cond, arg1, arg2, mov_if):
     else:
         dstA, dstB = loc_skip_expr, loc_do_expr
     e = []
-    e_do, extra_irs = [m2_expr.ExprAff(arg1, arg2)], []
-    e_do.append(m2_expr.ExprAff(ir.IRDst, loc_skip_expr))
-    e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(cond, dstA, dstB)))
+    e_do, extra_irs = [m2_expr.ExprAssign(arg1, arg2)], []
+    e_do.append(m2_expr.ExprAssign(ir.IRDst, loc_skip_expr))
+    e.append(m2_expr.ExprAssign(ir.IRDst, m2_expr.ExprCond(cond, dstA, dstB)))
     return e, [IRBlock(loc_do, [AssignBlock(e_do, instr)])]
 
 
@@ -400,8 +400,8 @@ def gen_cmov(ir, instr, cond, dst, src, mov_if):
         dstA, dstB = loc_skip_expr, loc_do_expr
     e = []
     e_do, extra_irs = mov(ir, instr, dst, src)
-    e_do.append(m2_expr.ExprAff(ir.IRDst, loc_skip_expr))
-    e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(cond, dstA, dstB)))
+    e_do.append(m2_expr.ExprAssign(ir.IRDst, loc_skip_expr))
+    e.append(m2_expr.ExprAssign(ir.IRDst, m2_expr.ExprCond(cond, dstA, dstB)))
     return e, [IRBlock(loc_do, [AssignBlock(e_do, instr)])]
 
 
@@ -410,7 +410,7 @@ def mov(_, instr, dst, src):
         src = src[:dst.size]
     if src in [ES, CS, SS, DS, FS, GS]:
         src = src.zeroExtend(dst.size)
-    e = [m2_expr.ExprAff(dst, src)]
+    e = [m2_expr.ExprAssign(dst, src)]
     return e, []
 
 
@@ -418,7 +418,7 @@ def movq(_, instr, dst, src):
     src_final = (src.zeroExtend(dst.size)
                  if dst.size >= src.size else
                  src[:dst.size])
-    return [m2_expr.ExprAff(dst, src_final)], []
+    return [m2_expr.ExprAssign(dst, src_final)], []
 
 
 @sbuild.parse
@@ -429,12 +429,12 @@ def xchg(arg1, arg2):
 
 
 def movzx(_, instr, dst, src):
-    e = [m2_expr.ExprAff(dst, src.zeroExtend(dst.size))]
+    e = [m2_expr.ExprAssign(dst, src.zeroExtend(dst.size))]
     return e, []
 
 
 def movsx(_, instr, dst, src):
-    e = [m2_expr.ExprAff(dst, src.signExtend(dst.size))]
+    e = [m2_expr.ExprAssign(dst, src.signExtend(dst.size))]
     return e, []
 
 
@@ -446,7 +446,7 @@ def lea(_, instr, dst, src):
 
     if ptr.size > dst.size:
         ptr = ptr[:dst.size]
-    e = [m2_expr.ExprAff(dst, ptr.zeroExtend(dst.size))]
+    e = [m2_expr.ExprAssign(dst, ptr.zeroExtend(dst.size))]
     return e, []
 
 
@@ -458,7 +458,7 @@ def add(_, instr, dst, src):
     e += update_flag_arith_add_znp(dst, src)
     e += update_flag_arith_add_co(dst, src, result)
     e += update_flag_af(dst, src, result)
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return e, []
 
 
@@ -470,8 +470,8 @@ def xadd(_, instr, dst, src):
     e += update_flag_arith_add_co(src, dst, result)
     e += update_flag_af(dst, src, result)
     if dst != src:
-        e.append(m2_expr.ExprAff(src, dst))
-    e.append(m2_expr.ExprAff(dst, result))
+        e.append(m2_expr.ExprAssign(src, dst))
+    e.append(m2_expr.ExprAssign(dst, result))
     return e, []
 
 
@@ -485,7 +485,7 @@ def adc(_, instr, dst, src):
     e += update_flag_arith_addwc_znp(arg1, arg2, cf)
     e += update_flag_arith_addwc_co(arg1, arg2, cf)
     e += update_flag_af(arg1, arg2, result)
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return e, []
 
 
@@ -498,7 +498,7 @@ def sub(_, instr, dst, src):
     e += update_flag_arith_sub_co(arg1, arg2, result)
     e += update_flag_af(dst, src, result)
 
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return e, []
 
 # a-(b+cf)
@@ -513,7 +513,7 @@ def sbb(_, instr, dst, src):
     e += update_flag_arith_subwc_znp(arg1, arg2, cf)
     e += update_flag_af(arg1, arg2, result)
     e += update_flag_arith_subwc_co(arg1, arg2, cf)
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return e, []
 
 
@@ -526,14 +526,14 @@ def neg(_, instr, src):
     e += update_flag_arith_sub_znp(arg1, arg2)
     e += update_flag_arith_sub_co(arg1, arg2, result)
     e += update_flag_af(arg1, arg2, result)
-    e.append(m2_expr.ExprAff(src, result))
+    e.append(m2_expr.ExprAssign(src, result))
     return (e, [])
 
 
 def l_not(_, instr, dst):
     e = []
     result = (~dst)
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return (e, [])
 
 
@@ -551,38 +551,38 @@ def l_cmp(_, instr, dst, src):
 def xor(_, instr, dst, src):
     e = []
     result = dst ^ src
-    e += [m2_expr.ExprAff(zf, m2_expr.ExprOp('FLAG_EQ_CMP', dst, src))]
+    e += [m2_expr.ExprAssign(zf, m2_expr.ExprOp('FLAG_EQ_CMP', dst, src))]
     e += update_flag_np(result)
     e += null_flag_co()
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return (e, [])
 
 
 def pxor(_, instr, dst, src):
     e = []
     result = dst ^ src
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return (e, [])
 
 
 def l_or(_, instr, dst, src):
     e = []
     result = dst | src
-    e += [m2_expr.ExprAff(zf, m2_expr.ExprOp('FLAG_EQ', dst | src))]
+    e += [m2_expr.ExprAssign(zf, m2_expr.ExprOp('FLAG_EQ', dst | src))]
     e += update_flag_np(result)
     e += null_flag_co()
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return (e, [])
 
 
 def l_and(_, instr, dst, src):
     e = []
     result = dst & src
-    e += [m2_expr.ExprAff(zf, m2_expr.ExprOp('FLAG_EQ_AND', dst, src))]
+    e += [m2_expr.ExprAssign(zf, m2_expr.ExprOp('FLAG_EQ_AND', dst, src))]
     e += update_flag_np(result)
     e += null_flag_co()
 
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return (e, [])
 
 
@@ -590,8 +590,8 @@ def l_test(_, instr, dst, src):
     e = []
     result = dst & src
 
-    e += [m2_expr.ExprAff(zf, m2_expr.ExprOp('FLAG_EQ_CMP', result, m2_expr.ExprInt(0, result.size)))]
-    e += [m2_expr.ExprAff(nf, m2_expr.ExprOp("FLAG_SIGN_SUB", result, m2_expr.ExprInt(0, result.size)))]
+    e += [m2_expr.ExprAssign(zf, m2_expr.ExprOp('FLAG_EQ_CMP', result, m2_expr.ExprInt(0, result.size)))]
+    e += [m2_expr.ExprAssign(nf, m2_expr.ExprOp("FLAG_SIGN_SUB", result, m2_expr.ExprInt(0, result.size)))]
     e += update_flag_pf(result)
     e += null_flag_co()
 
@@ -632,9 +632,9 @@ def _rotate_tpl(ir, instr, dst, src, op, left=False):
                               res.msb() ^ new_cf if left else (dst ^ res).msb())
 
     # Build basic blocks
-    e_do = [m2_expr.ExprAff(cf, new_cf),
-            m2_expr.ExprAff(of, new_of),
-            m2_expr.ExprAff(dst, res)
+    e_do = [m2_expr.ExprAssign(cf, new_cf),
+            m2_expr.ExprAssign(of, new_of),
+            m2_expr.ExprAssign(dst, res)
             ]
     # Don't generate conditional shifter on constant
     if isinstance(shifter, m2_expr.ExprInt):
@@ -647,8 +647,8 @@ def _rotate_tpl(ir, instr, dst, src, op, left=False):
     loc_skip = ir.get_next_loc_key(instr)
     loc_skip_expr = m2_expr.ExprLoc(loc_skip, ir.IRDst.size)
 
-    e_do.append(m2_expr.ExprAff(ir.IRDst, loc_skip_expr))
-    e.append(m2_expr.ExprAff(
+    e_do.append(m2_expr.ExprAssign(ir.IRDst, loc_skip_expr))
+    e.append(m2_expr.ExprAssign(
         ir.IRDst, m2_expr.ExprCond(shifter, loc_do_expr, loc_skip_expr)))
     return (e, [IRBlock(loc_do, [AssignBlock(e_do, instr)])])
 
@@ -681,9 +681,9 @@ def rotate_with_carry_tpl(ir, instr, op, dst, src):
 
 
     # Build basic blocks
-    e_do = [m2_expr.ExprAff(cf, new_cf),
-            m2_expr.ExprAff(of, new_of),
-            m2_expr.ExprAff(dst, new_dst)
+    e_do = [m2_expr.ExprAssign(cf, new_cf),
+            m2_expr.ExprAssign(of, new_of),
+            m2_expr.ExprAssign(dst, new_dst)
             ]
     # Don't generate conditional shifter on constant
     if isinstance(shifter, m2_expr.ExprInt):
@@ -696,8 +696,8 @@ def rotate_with_carry_tpl(ir, instr, op, dst, src):
     loc_skip = ir.get_next_loc_key(instr)
     loc_skip_expr = m2_expr.ExprLoc(loc_skip, ir.IRDst.size)
 
-    e_do.append(m2_expr.ExprAff(ir.IRDst, loc_skip_expr))
-    e.append(m2_expr.ExprAff(
+    e_do.append(m2_expr.ExprAssign(ir.IRDst, loc_skip_expr))
+    e.append(m2_expr.ExprAssign(
         ir.IRDst, m2_expr.ExprCond(shifter, loc_do_expr, loc_skip_expr)))
     return (e, [IRBlock(loc_do, [AssignBlock(e_do, instr)])])
 
@@ -765,11 +765,11 @@ def _shift_tpl(op, ir, instr, a, b, c=None, op_inv=None, left=False,
 
     # Build basic blocks
     e_do = [
-        m2_expr.ExprAff(cf, new_cf),
-        m2_expr.ExprAff(of, m2_expr.ExprCond(shifter - i1,
+        m2_expr.ExprAssign(cf, new_cf),
+        m2_expr.ExprAssign(of, m2_expr.ExprCond(shifter - i1,
                                              m2_expr.ExprInt(0, of.size),
                                              value_of)),
-        m2_expr.ExprAff(a, res),
+        m2_expr.ExprAssign(a, res),
     ]
     e_do += update_flag_znp(res)
 
@@ -784,8 +784,8 @@ def _shift_tpl(op, ir, instr, a, b, c=None, op_inv=None, left=False,
     loc_do, loc_do_expr = ir.gen_loc_key_and_expr(ir.IRDst.size)
     loc_skip = ir.get_next_loc_key(instr)
     loc_skip_expr = m2_expr.ExprLoc(loc_skip, ir.IRDst.size)
-    e_do.append(m2_expr.ExprAff(ir.IRDst, loc_skip_expr))
-    e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(shifter, loc_do_expr,
+    e_do.append(m2_expr.ExprAssign(ir.IRDst, loc_skip_expr))
+    e.append(m2_expr.ExprAssign(ir.IRDst, m2_expr.ExprCond(shifter, loc_do_expr,
                                                         loc_skip_expr)))
     return e, [IRBlock(loc_do, [AssignBlock(e_do, instr)])]
 
@@ -814,38 +814,38 @@ def shld(ir, instr, dst, src1, src2):
 
 # XXX todo ###
 def cmc(_, instr):
-    e = [m2_expr.ExprAff(cf, m2_expr.ExprCond(cf, m2_expr.ExprInt(0, cf.size),
+    e = [m2_expr.ExprAssign(cf, m2_expr.ExprCond(cf, m2_expr.ExprInt(0, cf.size),
                                               m2_expr.ExprInt(1, cf.size)))]
     return e, []
 
 
 def clc(_, instr):
-    e = [m2_expr.ExprAff(cf, m2_expr.ExprInt(0, cf.size))]
+    e = [m2_expr.ExprAssign(cf, m2_expr.ExprInt(0, cf.size))]
     return e, []
 
 
 def stc(_, instr):
-    e = [m2_expr.ExprAff(cf, m2_expr.ExprInt(1, cf.size))]
+    e = [m2_expr.ExprAssign(cf, m2_expr.ExprInt(1, cf.size))]
     return e, []
 
 
 def cld(_, instr):
-    e = [m2_expr.ExprAff(df, m2_expr.ExprInt(0, df.size))]
+    e = [m2_expr.ExprAssign(df, m2_expr.ExprInt(0, df.size))]
     return e, []
 
 
 def std(_, instr):
-    e = [m2_expr.ExprAff(df, m2_expr.ExprInt(1, df.size))]
+    e = [m2_expr.ExprAssign(df, m2_expr.ExprInt(1, df.size))]
     return e, []
 
 
 def cli(_, instr):
-    e = [m2_expr.ExprAff(i_f, m2_expr.ExprInt(0, i_f.size))]
+    e = [m2_expr.ExprAssign(i_f, m2_expr.ExprInt(0, i_f.size))]
     return e, []
 
 
 def sti(_, instr):
-    e = [m2_expr.ExprAff(exception_flags, m2_expr.ExprInt(EXCEPT_PRIV_INSN, 32))]
+    e = [m2_expr.ExprAssign(exception_flags, m2_expr.ExprInt(EXCEPT_PRIV_INSN, 32))]
     return e, []
 
 
@@ -859,7 +859,7 @@ def inc(_, instr, dst):
     e += update_flag_af(arg1, arg2, result)
     e += update_flag_add_of(arg1, arg2, result)
 
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return e, []
 
 
@@ -873,7 +873,7 @@ def dec(_, instr, dst):
     e += update_flag_af(arg1, arg2, result)
     e += update_flag_sub_of(arg1, arg2, result)
 
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return e, []
 
 
@@ -887,10 +887,10 @@ def push_gen(ir, instr, src, size):
 
     sp = mRSP[instr.mode]
     new_sp = sp - m2_expr.ExprInt(off_size / 8, sp.size)
-    e.append(m2_expr.ExprAff(sp, new_sp))
+    e.append(m2_expr.ExprAssign(sp, new_sp))
     if ir.do_stk_segm:
         new_sp = ir.gen_segm_expr(SS, new_sp)
-    e.append(m2_expr.ExprAff(ir.ExprMem(new_sp, off_size),
+    e.append(m2_expr.ExprAssign(ir.ExprMem(new_sp, off_size),
                              src))
     return e, []
 
@@ -912,7 +912,7 @@ def pop_gen(ir, instr, src, size):
     new_sp = sp + m2_expr.ExprInt(src.size / 8, sp.size)
     # don't generate ESP incrementation on POP ESP
     if src != ir.sp:
-        e.append(m2_expr.ExprAff(sp, new_sp))
+        e.append(m2_expr.ExprAssign(sp, new_sp))
     # XXX FIX XXX for pop [esp]
     if isinstance(src, m2_expr.ExprMem):
         src = expr_simp(src.replace_expr({sp: new_sp}))
@@ -920,7 +920,7 @@ def pop_gen(ir, instr, src, size):
     if ir.do_stk_segm:
         result = ir.gen_segm_expr(SS, result)
 
-    e.append(m2_expr.ExprAff(src, ir.ExprMem(result, src.size)))
+    e.append(m2_expr.ExprAssign(src, ir.ExprMem(result, src.size)))
     return e, []
 
 
@@ -935,7 +935,7 @@ def popw(ir, instr, src):
 def sete(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_EQ", zf).zeroExtend(dst.size),
         )
@@ -946,7 +946,7 @@ def sete(_, instr, dst):
 def setnz(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_EQ", ~zf).zeroExtend(dst.size),
         )
@@ -957,7 +957,7 @@ def setnz(_, instr, dst):
 def setl(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_S<", nf, of).zeroExtend(dst.size),
         )
@@ -968,7 +968,7 @@ def setl(_, instr, dst):
 def setg(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_S>", nf, of, zf).zeroExtend(dst.size),
         )
@@ -979,7 +979,7 @@ def setg(_, instr, dst):
 def setge(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_S>=", nf, of).zeroExtend(dst.size),
         )
@@ -990,7 +990,7 @@ def setge(_, instr, dst):
 def seta(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_U>", cf, zf).zeroExtend(dst.size),
         )
@@ -1001,7 +1001,7 @@ def seta(_, instr, dst):
 def setae(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_U>=", cf).zeroExtend(dst.size),
         )
@@ -1012,7 +1012,7 @@ def setae(_, instr, dst):
 def setb(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_U<", cf).zeroExtend(dst.size),
         )
@@ -1023,7 +1023,7 @@ def setb(_, instr, dst):
 def setbe(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_U<=", cf, zf).zeroExtend(dst.size),
         )
@@ -1034,7 +1034,7 @@ def setbe(_, instr, dst):
 def setns(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_NEG", ~nf).zeroExtend(dst.size),
         )
@@ -1045,7 +1045,7 @@ def setns(_, instr, dst):
 def sets(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_NEG", nf).zeroExtend(dst.size),
         )
@@ -1056,7 +1056,7 @@ def sets(_, instr, dst):
 def seto(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             of.zeroExtend(dst.size)
         )
@@ -1067,7 +1067,7 @@ def seto(_, instr, dst):
 def setp(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             pf.zeroExtend(dst.size)
         )
@@ -1078,7 +1078,7 @@ def setp(_, instr, dst):
 def setnp(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprCond(
                 pf,
@@ -1093,7 +1093,7 @@ def setnp(_, instr, dst):
 def setle(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_S<=", nf, of, zf).zeroExtend(dst.size),
         )
@@ -1104,7 +1104,7 @@ def setle(_, instr, dst):
 def setna(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_U<=", cf, zf).zeroExtend(dst.size),
         )
@@ -1115,7 +1115,7 @@ def setna(_, instr, dst):
 def setnbe(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_U>", cf, zf).zeroExtend(dst.size),
         )
@@ -1126,7 +1126,7 @@ def setnbe(_, instr, dst):
 def setno(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprCond(
                 of,
@@ -1141,7 +1141,7 @@ def setno(_, instr, dst):
 def setnb(_, instr, dst):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst,
             m2_expr.ExprOp("CC_U>=", cf).zeroExtend(dst.size),
         )
@@ -1153,7 +1153,7 @@ def setalc(_, instr):
     dst = mRAX[instr.mode][0:8]
     e = []
     e.append(
-        m2_expr.ExprAff(dst, m2_expr.ExprCond(cf, m2_expr.ExprInt(0xff, dst.size),
+        m2_expr.ExprAssign(dst, m2_expr.ExprCond(cf, m2_expr.ExprInt(0xff, dst.size),
                                               m2_expr.ExprInt(0, dst.size))))
     return e, []
 
@@ -1170,7 +1170,7 @@ def bswap(_, instr, dst):
                                      dst[24:32], dst[16:24], dst[8:16], dst[:8])
     else:
         raise ValueError('the size DOES matter')
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return e, []
 
 
@@ -1199,18 +1199,18 @@ def cmps(ir, instr, size):
 
 
     e0 = []
-    e0.append(m2_expr.ExprAff(src1, src1 + offset))
-    e0.append(m2_expr.ExprAff(src2, src2 + offset))
-    e0.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    e0.append(m2_expr.ExprAssign(src1, src1 + offset))
+    e0.append(m2_expr.ExprAssign(src2, src2 + offset))
+    e0.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     e0 = IRBlock(loc_df_0, [AssignBlock(e0, instr)])
 
     e1 = []
-    e1.append(m2_expr.ExprAff(src1, src1 - offset))
-    e1.append(m2_expr.ExprAff(src2, src2 - offset))
-    e1.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    e1.append(m2_expr.ExprAssign(src1, src1 - offset))
+    e1.append(m2_expr.ExprAssign(src2, src2 - offset))
+    e1.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     e1 = IRBlock(loc_df_1, [AssignBlock(e1, instr)])
 
-    e.append(m2_expr.ExprAff(ir.IRDst,
+    e.append(m2_expr.ExprAssign(ir.IRDst,
                              m2_expr.ExprCond(df, loc_df_1_expr, loc_df_0_expr)))
     return e, [e0, e1]
 
@@ -1236,17 +1236,17 @@ def scas(ir, instr, size):
                      ir.ExprMem(src_sgm, size))
 
     e0 = []
-    e0.append(m2_expr.ExprAff(src, src + offset))
+    e0.append(m2_expr.ExprAssign(src, src + offset))
 
-    e0.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    e0.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     e0 = IRBlock(loc_df_0, [AssignBlock(e0, instr)])
 
     e1 = []
-    e1.append(m2_expr.ExprAff(src, src - offset))
-    e1.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    e1.append(m2_expr.ExprAssign(src, src - offset))
+    e1.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     e1 = IRBlock(loc_df_1, [AssignBlock(e1, instr)])
 
-    e.append(m2_expr.ExprAff(ir.IRDst,
+    e.append(m2_expr.ExprAssign(ir.IRDst,
                              m2_expr.ExprCond(df, loc_df_1_expr, loc_df_0_expr)))
 
     return e, [e0, e1]
@@ -1284,26 +1284,26 @@ def pushfw(ir, instr):
 def popfd(ir, instr):
     tmp = ir.ExprMem(mRSP[instr.mode], 32)
     e = []
-    e.append(m2_expr.ExprAff(cf, m2_expr.ExprSlice(tmp, 0, 1)))
-    e.append(m2_expr.ExprAff(pf, m2_expr.ExprSlice(tmp, 2, 3)))
-    e.append(m2_expr.ExprAff(af, m2_expr.ExprSlice(tmp, 4, 5)))
-    e.append(m2_expr.ExprAff(zf, m2_expr.ExprSlice(tmp, 6, 7)))
-    e.append(m2_expr.ExprAff(nf, m2_expr.ExprSlice(tmp, 7, 8)))
-    e.append(m2_expr.ExprAff(tf, m2_expr.ExprSlice(tmp, 8, 9)))
-    e.append(m2_expr.ExprAff(i_f, m2_expr.ExprSlice(tmp, 9, 10)))
-    e.append(m2_expr.ExprAff(df, m2_expr.ExprSlice(tmp, 10, 11)))
-    e.append(m2_expr.ExprAff(of, m2_expr.ExprSlice(tmp, 11, 12)))
-    e.append(m2_expr.ExprAff(iopl, m2_expr.ExprSlice(tmp, 12, 14)))
-    e.append(m2_expr.ExprAff(nt, m2_expr.ExprSlice(tmp, 14, 15)))
-    e.append(m2_expr.ExprAff(rf, m2_expr.ExprSlice(tmp, 16, 17)))
-    e.append(m2_expr.ExprAff(vm, m2_expr.ExprSlice(tmp, 17, 18)))
-    e.append(m2_expr.ExprAff(ac, m2_expr.ExprSlice(tmp, 18, 19)))
-    e.append(m2_expr.ExprAff(vif, m2_expr.ExprSlice(tmp, 19, 20)))
-    e.append(m2_expr.ExprAff(vip, m2_expr.ExprSlice(tmp, 20, 21)))
-    e.append(m2_expr.ExprAff(i_d, m2_expr.ExprSlice(tmp, 21, 22)))
-    e.append(m2_expr.ExprAff(mRSP[instr.mode],
+    e.append(m2_expr.ExprAssign(cf, m2_expr.ExprSlice(tmp, 0, 1)))
+    e.append(m2_expr.ExprAssign(pf, m2_expr.ExprSlice(tmp, 2, 3)))
+    e.append(m2_expr.ExprAssign(af, m2_expr.ExprSlice(tmp, 4, 5)))
+    e.append(m2_expr.ExprAssign(zf, m2_expr.ExprSlice(tmp, 6, 7)))
+    e.append(m2_expr.ExprAssign(nf, m2_expr.ExprSlice(tmp, 7, 8)))
+    e.append(m2_expr.ExprAssign(tf, m2_expr.ExprSlice(tmp, 8, 9)))
+    e.append(m2_expr.ExprAssign(i_f, m2_expr.ExprSlice(tmp, 9, 10)))
+    e.append(m2_expr.ExprAssign(df, m2_expr.ExprSlice(tmp, 10, 11)))
+    e.append(m2_expr.ExprAssign(of, m2_expr.ExprSlice(tmp, 11, 12)))
+    e.append(m2_expr.ExprAssign(iopl, m2_expr.ExprSlice(tmp, 12, 14)))
+    e.append(m2_expr.ExprAssign(nt, m2_expr.ExprSlice(tmp, 14, 15)))
+    e.append(m2_expr.ExprAssign(rf, m2_expr.ExprSlice(tmp, 16, 17)))
+    e.append(m2_expr.ExprAssign(vm, m2_expr.ExprSlice(tmp, 17, 18)))
+    e.append(m2_expr.ExprAssign(ac, m2_expr.ExprSlice(tmp, 18, 19)))
+    e.append(m2_expr.ExprAssign(vif, m2_expr.ExprSlice(tmp, 19, 20)))
+    e.append(m2_expr.ExprAssign(vip, m2_expr.ExprSlice(tmp, 20, 21)))
+    e.append(m2_expr.ExprAssign(i_d, m2_expr.ExprSlice(tmp, 21, 22)))
+    e.append(m2_expr.ExprAssign(mRSP[instr.mode],
                              mRSP[instr.mode] + m2_expr.ExprInt(instr.mode / 8, mRSP[instr.mode].size)))
-    e.append(m2_expr.ExprAff(exception_flags,
+    e.append(m2_expr.ExprAssign(exception_flags,
                              m2_expr.ExprCond(m2_expr.ExprSlice(tmp, 8, 9),
                                               m2_expr.ExprInt(
                                                   EXCEPT_SOFT_BP, 32),
@@ -1318,7 +1318,7 @@ def _tpl_eflags(tmp):
     """Extract eflags from @tmp
     @tmp: Expr instance with a size >= 16
     """
-    return [m2_expr.ExprAff(dest, tmp[base:base + dest.size])
+    return [m2_expr.ExprAssign(dest, tmp[base:base + dest.size])
             for base, dest in ((0, cf), (2, pf), (4, af), (6, zf), (7, nf),
                                (8, tf), (9, i_f), (10, df), (11, of),
                                (12, iopl), (14, nt))]
@@ -1328,7 +1328,7 @@ def popfw(ir, instr):
     tmp = ir.ExprMem(mRSP[instr.mode], 32)
     e = _tpl_eflags(tmp)
     e.append(
-        m2_expr.ExprAff(mRSP[instr.mode], mRSP[instr.mode] + m2_expr.ExprInt(2, mRSP[instr.mode].size)))
+        m2_expr.ExprAssign(mRSP[instr.mode], mRSP[instr.mode] + m2_expr.ExprInt(2, mRSP[instr.mode].size)))
     return e, []
 
 pa_regs = [
@@ -1344,8 +1344,8 @@ def pusha_gen(ir, instr, size):
     cur_sp = mRSP[instr.mode]
     for i, reg in enumerate(pa_regs):
         stk_ptr = cur_sp + m2_expr.ExprInt(-(size / 8) * (i + 1), instr.mode)
-        e.append(m2_expr.ExprAff(ir.ExprMem(stk_ptr, size), reg[size]))
-    e.append(m2_expr.ExprAff(cur_sp, stk_ptr))
+        e.append(m2_expr.ExprAssign(ir.ExprMem(stk_ptr, size), reg[size]))
+    e.append(m2_expr.ExprAssign(cur_sp, stk_ptr))
     return e, []
 
 
@@ -1364,10 +1364,10 @@ def popa_gen(ir, instr, size):
         if reg == mRSP:
             continue
         stk_ptr = cur_sp + m2_expr.ExprInt((size / 8) * i, instr.mode)
-        e.append(m2_expr.ExprAff(reg[size], ir.ExprMem(stk_ptr, size)))
+        e.append(m2_expr.ExprAssign(reg[size], ir.ExprMem(stk_ptr, size)))
 
     stk_ptr = cur_sp + m2_expr.ExprInt((size / 8) * (i + 1), instr.mode)
-    e.append(m2_expr.ExprAff(cur_sp, stk_ptr))
+    e.append(m2_expr.ExprAssign(cur_sp, stk_ptr))
 
     return e, []
 
@@ -1406,31 +1406,31 @@ def call(ir, instr, dst):
         else:
             raise RuntimeError("bad call operator")
 
-        e.append(m2_expr.ExprAff(CS, m1))
-        e.append(m2_expr.ExprAff(meip, m2))
+        e.append(m2_expr.ExprAssign(CS, m1))
+        e.append(m2_expr.ExprAssign(meip, m2))
 
-        e.append(m2_expr.ExprAff(ir.IRDst, m2))
+        e.append(m2_expr.ExprAssign(ir.IRDst, m2))
 
         c = myesp + m2_expr.ExprInt(-s / 8, s)
-        e.append(m2_expr.ExprAff(ir.ExprMem(c, size=s).zeroExtend(s),
+        e.append(m2_expr.ExprAssign(ir.ExprMem(c, size=s).zeroExtend(s),
                                  CS.zeroExtend(s)))
 
         c = myesp + m2_expr.ExprInt(-2 * s / 8, s)
-        e.append(m2_expr.ExprAff(ir.ExprMem(c, size=s).zeroExtend(s),
+        e.append(m2_expr.ExprAssign(ir.ExprMem(c, size=s).zeroExtend(s),
                                  meip.zeroExtend(s)))
 
         c = myesp + m2_expr.ExprInt((-2 * s) / 8, s)
-        e.append(m2_expr.ExprAff(myesp, c))
+        e.append(m2_expr.ExprAssign(myesp, c))
         return e, []
 
     c = myesp + m2_expr.ExprInt((-s / 8), s)
-    e.append(m2_expr.ExprAff(myesp, c))
+    e.append(m2_expr.ExprAssign(myesp, c))
     if ir.do_stk_segm:
         c = ir.gen_segm_expr(SS, c)
 
-    e.append(m2_expr.ExprAff(ir.ExprMem(c, size=s), n))
-    e.append(m2_expr.ExprAff(meip, dst.zeroExtend(ir.IRDst.size)))
-    e.append(m2_expr.ExprAff(ir.IRDst, dst.zeroExtend(ir.IRDst.size)))
+    e.append(m2_expr.ExprAssign(ir.ExprMem(c, size=s), n))
+    e.append(m2_expr.ExprAssign(meip, dst.zeroExtend(ir.IRDst.size)))
+    e.append(m2_expr.ExprAssign(ir.IRDst, dst.zeroExtend(ir.IRDst.size)))
     return e, []
 
 
@@ -1446,14 +1446,14 @@ def ret(ir, instr, src=None):
         src = m2_expr.ExprInt(int(src), size)
         value = (myesp + (m2_expr.ExprInt((size / 8), size) + src))
 
-    e.append(m2_expr.ExprAff(myesp, value))
+    e.append(m2_expr.ExprAssign(myesp, value))
     result = myesp
     if ir.do_stk_segm:
         result = ir.gen_segm_expr(SS, result)
 
-    e.append(m2_expr.ExprAff(meip, ir.ExprMem(
+    e.append(m2_expr.ExprAssign(meip, ir.ExprMem(
         result, size=size).zeroExtend(size)))
-    e.append(m2_expr.ExprAff(ir.IRDst,
+    e.append(m2_expr.ExprAssign(ir.IRDst,
                              ir.ExprMem(result, size=size).zeroExtend(size)))
     return e, []
 
@@ -1472,19 +1472,19 @@ def retf(ir, instr, src=None):
     if ir.do_stk_segm:
         result = ir.gen_segm_expr(SS, result)
 
-    e.append(m2_expr.ExprAff(meip, ir.ExprMem(
+    e.append(m2_expr.ExprAssign(meip, ir.ExprMem(
         result, size=size).zeroExtend(size)))
-    e.append(m2_expr.ExprAff(ir.IRDst,
+    e.append(m2_expr.ExprAssign(ir.IRDst,
                              ir.ExprMem(result, size=size).zeroExtend(size)))
-    # e.append(m2_expr.ExprAff(meip, ir.ExprMem(c, size = s)))
+    # e.append(m2_expr.ExprAssign(meip, ir.ExprMem(c, size = s)))
     result = myesp + m2_expr.ExprInt(size / 8, size)
     if ir.do_stk_segm:
         result = ir.gen_segm_expr(SS, result)
 
-    e.append(m2_expr.ExprAff(CS, ir.ExprMem(result, size=16)))
+    e.append(m2_expr.ExprAssign(CS, ir.ExprMem(result, size=16)))
 
     value = myesp + (m2_expr.ExprInt((2 * size) / 8, size) + src)
-    e.append(m2_expr.ExprAff(myesp, value))
+    e.append(m2_expr.ExprAssign(myesp, value))
     return e, []
 
 
@@ -1492,8 +1492,8 @@ def leave(ir, instr):
     size = instr.mode
     myesp = mRSP[size]
     e = []
-    e.append(m2_expr.ExprAff(mRBP[size], ir.ExprMem(mRBP[size], size=size)))
-    e.append(m2_expr.ExprAff(myesp,
+    e.append(m2_expr.ExprAssign(mRBP[size], ir.ExprMem(mRBP[size], size=size)))
+    e.append(m2_expr.ExprAssign(myesp,
                              m2_expr.ExprInt(size / 8, size) + mRBP[size]))
     return e, []
 
@@ -1507,10 +1507,10 @@ def enter(ir, instr, src1, src2):
 
     e = []
     esp_tmp = myesp - m2_expr.ExprInt(size / 8, size)
-    e.append(m2_expr.ExprAff(ir.ExprMem(esp_tmp, size=size),
+    e.append(m2_expr.ExprAssign(ir.ExprMem(esp_tmp, size=size),
                              myebp))
-    e.append(m2_expr.ExprAff(myebp, esp_tmp))
-    e.append(m2_expr.ExprAff(myesp,
+    e.append(m2_expr.ExprAssign(myebp, esp_tmp))
+    e.append(m2_expr.ExprAssign(myesp,
                              myesp - (src1 + m2_expr.ExprInt(size / 8, size))))
     return e, []
 
@@ -1534,14 +1534,14 @@ def jmp(ir, instr, dst):
         else:
             raise RuntimeError("bad jmp operator")
 
-        e.append(m2_expr.ExprAff(CS, m1))
-        e.append(m2_expr.ExprAff(meip, m2))
-        e.append(m2_expr.ExprAff(ir.IRDst, m2))
+        e.append(m2_expr.ExprAssign(CS, m1))
+        e.append(m2_expr.ExprAssign(meip, m2))
+        e.append(m2_expr.ExprAssign(ir.IRDst, m2))
 
     else:
         # Classic jmp
-        e.append(m2_expr.ExprAff(meip, dst))
-        e.append(m2_expr.ExprAff(ir.IRDst, dst))
+        e.append(m2_expr.ExprAssign(meip, dst))
+        e.append(m2_expr.ExprAssign(ir.IRDst, dst))
 
         if isinstance(dst, m2_expr.ExprMem):
             dst = meip
@@ -1650,9 +1650,9 @@ def loop(ir, instr, dst):
     dst_o = m2_expr.ExprCond(c,
                              dst.zeroExtend(ir.IRDst.size),
                              n.zeroExtend(ir.IRDst.size))
-    e.append(m2_expr.ExprAff(myecx, c))
-    e.append(m2_expr.ExprAff(meip, dst_o))
-    e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
+    e.append(m2_expr.ExprAssign(myecx, c))
+    e.append(m2_expr.ExprAssign(meip, dst_o))
+    e.append(m2_expr.ExprAssign(ir.IRDst, dst_o))
     return e, []
 
 
@@ -1669,12 +1669,12 @@ def loopne(ir, instr, dst):
                          m2_expr.ExprInt(0, 1))
     c &= zf ^ m2_expr.ExprInt(1, 1)
 
-    e.append(m2_expr.ExprAff(myecx, myecx - m2_expr.ExprInt(1, myecx.size)))
+    e.append(m2_expr.ExprAssign(myecx, myecx - m2_expr.ExprInt(1, myecx.size)))
     dst_o = m2_expr.ExprCond(c,
                              dst.zeroExtend(ir.IRDst.size),
                              n.zeroExtend(ir.IRDst.size))
-    e.append(m2_expr.ExprAff(meip, dst_o))
-    e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
+    e.append(m2_expr.ExprAssign(meip, dst_o))
+    e.append(m2_expr.ExprAssign(ir.IRDst, dst_o))
     return e, []
 
 
@@ -1689,12 +1689,12 @@ def loope(ir, instr, dst):
                          m2_expr.ExprInt(1, 1),
                          m2_expr.ExprInt(0, 1))
     c &= zf
-    e.append(m2_expr.ExprAff(myecx, myecx - m2_expr.ExprInt(1, myecx.size)))
+    e.append(m2_expr.ExprAssign(myecx, myecx - m2_expr.ExprInt(1, myecx.size)))
     dst_o = m2_expr.ExprCond(c,
                              dst.zeroExtend(ir.IRDst.size),
                              n.zeroExtend(ir.IRDst.size))
-    e.append(m2_expr.ExprAff(meip, dst_o))
-    e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
+    e.append(m2_expr.ExprAssign(meip, dst_o))
+    e.append(m2_expr.ExprAssign(ir.IRDst, dst_o))
     return e, []
 
 # XXX size to do; eflag
@@ -1716,10 +1716,10 @@ def div(ir, instr, src1):
 
     # if 8 bit div, only ax is affected
     if size == 8:
-        e.append(m2_expr.ExprAff(src2, m2_expr.ExprCompose(c_d[:8], c_r[:8])))
+        e.append(m2_expr.ExprAssign(src2, m2_expr.ExprCompose(c_d[:8], c_r[:8])))
     else:
-        e.append(m2_expr.ExprAff(s1, c_r[:size]))
-        e.append(m2_expr.ExprAff(s2, c_d[:size]))
+        e.append(m2_expr.ExprAssign(s1, c_r[:size]))
+        e.append(m2_expr.ExprAssign(s2, c_d[:size]))
 
     loc_div, loc_div_expr = ir.gen_loc_key_and_expr(ir.IRDst.size)
     loc_except, loc_except_expr = ir.gen_loc_key_and_expr(ir.IRDst.size)
@@ -1728,17 +1728,17 @@ def div(ir, instr, src1):
 
     do_div = []
     do_div += e
-    do_div.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    do_div.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     blk_div = IRBlock(loc_div, [AssignBlock(do_div, instr)])
 
     do_except = []
-    do_except.append(m2_expr.ExprAff(exception_flags, m2_expr.ExprInt(
+    do_except.append(m2_expr.ExprAssign(exception_flags, m2_expr.ExprInt(
         EXCEPT_DIV_BY_ZERO, exception_flags.size)))
-    do_except.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    do_except.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     blk_except = IRBlock(loc_except, [AssignBlock(do_except, instr)])
 
     e = []
-    e.append(m2_expr.ExprAff(ir.IRDst,
+    e.append(m2_expr.ExprAssign(ir.IRDst,
                              m2_expr.ExprCond(src1, loc_div_expr, loc_except_expr)))
 
     return e, [blk_div, blk_except]
@@ -1763,10 +1763,10 @@ def idiv(ir, instr, src1):
 
     # if 8 bit div, only ax is affected
     if size == 8:
-        e.append(m2_expr.ExprAff(src2, m2_expr.ExprCompose(c_d[:8], c_r[:8])))
+        e.append(m2_expr.ExprAssign(src2, m2_expr.ExprCompose(c_d[:8], c_r[:8])))
     else:
-        e.append(m2_expr.ExprAff(s1, c_r[:size]))
-        e.append(m2_expr.ExprAff(s2, c_d[:size]))
+        e.append(m2_expr.ExprAssign(s1, c_r[:size]))
+        e.append(m2_expr.ExprAssign(s2, c_d[:size]))
 
     loc_div, loc_div_expr = ir.gen_loc_key_and_expr(ir.IRDst.size)
     loc_except, loc_except_expr = ir.gen_loc_key_and_expr(ir.IRDst.size)
@@ -1775,17 +1775,17 @@ def idiv(ir, instr, src1):
 
     do_div = []
     do_div += e
-    do_div.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    do_div.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     blk_div = IRBlock(loc_div, [AssignBlock(do_div, instr)])
 
     do_except = []
-    do_except.append(m2_expr.ExprAff(exception_flags, m2_expr.ExprInt(
+    do_except.append(m2_expr.ExprAssign(exception_flags, m2_expr.ExprInt(
         EXCEPT_DIV_BY_ZERO, exception_flags.size)))
-    do_except.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    do_except.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     blk_except = IRBlock(loc_except, [AssignBlock(do_except, instr)])
 
     e = []
-    e.append(m2_expr.ExprAff(ir.IRDst,
+    e.append(m2_expr.ExprAssign(ir.IRDst,
                              m2_expr.ExprCond(src1, loc_div_expr, loc_except_expr)))
 
     return e, [blk_div, blk_except]
@@ -1801,21 +1801,21 @@ def mul(_, instr, src1):
         result = m2_expr.ExprOp('*',
                                 mRAX[size].zeroExtend(size * 2),
                                 src1.zeroExtend(size * 2))
-        e.append(m2_expr.ExprAff(mRAX[size], result[:size]))
-        e.append(m2_expr.ExprAff(mRDX[size], result[size:size * 2]))
+        e.append(m2_expr.ExprAssign(mRAX[size], result[:size]))
+        e.append(m2_expr.ExprAssign(mRDX[size], result[size:size * 2]))
 
     elif src1.size == 8:
         result = m2_expr.ExprOp('*',
                                 mRAX[instr.mode][:8].zeroExtend(16),
                                 src1.zeroExtend(16))
-        e.append(m2_expr.ExprAff(mRAX[instr.mode][:16], result))
+        e.append(m2_expr.ExprAssign(mRAX[instr.mode][:16], result))
     else:
         raise ValueError('unknow size')
 
-    e.append(m2_expr.ExprAff(of, m2_expr.ExprCond(result[size:size * 2],
+    e.append(m2_expr.ExprAssign(of, m2_expr.ExprCond(result[size:size * 2],
                                                   m2_expr.ExprInt(1, 1),
                                                   m2_expr.ExprInt(0, 1))))
-    e.append(m2_expr.ExprAff(cf, m2_expr.ExprCond(result[size:size * 2],
+    e.append(m2_expr.ExprAssign(cf, m2_expr.ExprCond(result[size:size * 2],
                                                   m2_expr.ExprInt(1, 1),
                                                   m2_expr.ExprInt(0, 1))))
 
@@ -1830,23 +1830,23 @@ def imul(_, instr, src1, src2=None, src3=None):
             result = m2_expr.ExprOp('*',
                                     mRAX[size].signExtend(size * 2),
                                     src1.signExtend(size * 2))
-            e.append(m2_expr.ExprAff(mRAX[size], result[:size]))
-            e.append(m2_expr.ExprAff(mRDX[size], result[size:size * 2]))
+            e.append(m2_expr.ExprAssign(mRAX[size], result[:size]))
+            e.append(m2_expr.ExprAssign(mRDX[size], result[size:size * 2]))
         elif size == 8:
             dst = mRAX[instr.mode][:16]
             result = m2_expr.ExprOp('*',
                                     mRAX[instr.mode][:8].signExtend(16),
                                     src1.signExtend(16))
 
-            e.append(m2_expr.ExprAff(dst, result))
+            e.append(m2_expr.ExprAssign(dst, result))
         value = m2_expr.ExprCond(result - result[:size].signExtend(size * 2),
                                  m2_expr.ExprInt(1, 1),
                                  m2_expr.ExprInt(0, 1))
-        e.append(m2_expr.ExprAff(cf, value))
+        e.append(m2_expr.ExprAssign(cf, value))
         value = m2_expr.ExprCond(result - result[:size].signExtend(size * 2),
                                  m2_expr.ExprInt(1, 1),
                                  m2_expr.ExprInt(0, 1))
-        e.append(m2_expr.ExprAff(of, value))
+        e.append(m2_expr.ExprAssign(of, value))
 
     else:
         if src3 is None:
@@ -1855,16 +1855,16 @@ def imul(_, instr, src1, src2=None, src3=None):
         result = m2_expr.ExprOp('*',
                                 src2.signExtend(size * 2),
                                 src3.signExtend(size * 2))
-        e.append(m2_expr.ExprAff(src1, result[:size]))
+        e.append(m2_expr.ExprAssign(src1, result[:size]))
 
         value = m2_expr.ExprCond(result - result[:size].signExtend(size * 2),
                                  m2_expr.ExprInt(1, 1),
                                  m2_expr.ExprInt(0, 1))
-        e.append(m2_expr.ExprAff(cf, value))
+        e.append(m2_expr.ExprAssign(cf, value))
         value = m2_expr.ExprCond(result - result[:size].signExtend(size * 2),
                                  m2_expr.ExprInt(1, 1),
                                  m2_expr.ExprInt(0, 1))
-        e.append(m2_expr.ExprAff(of, value))
+        e.append(m2_expr.ExprAssign(of, value))
     return e, []
 
 
@@ -1873,7 +1873,7 @@ def cbw(_, instr):
     e = []
     tempAL = mRAX[instr.v_opmode()][:8]
     tempAX = mRAX[instr.v_opmode()][:16]
-    e.append(m2_expr.ExprAff(tempAX, tempAL.signExtend(16)))
+    e.append(m2_expr.ExprAssign(tempAX, tempAL.signExtend(16)))
     return e, []
 
 
@@ -1882,7 +1882,7 @@ def cwde(_, instr):
     e = []
     tempAX = mRAX[instr.v_opmode()][:16]
     tempEAX = mRAX[instr.v_opmode()][:32]
-    e.append(m2_expr.ExprAff(tempEAX, tempAX.signExtend(32)))
+    e.append(m2_expr.ExprAssign(tempEAX, tempAX.signExtend(32)))
     return e, []
 
 
@@ -1891,7 +1891,7 @@ def cdqe(_, instr):
     e = []
     tempEAX = mRAX[instr.mode][:32]
     tempRAX = mRAX[instr.mode][:64]
-    e.append(m2_expr.ExprAff(tempRAX, tempEAX.signExtend(64)))
+    e.append(m2_expr.ExprAssign(tempRAX, tempEAX.signExtend(64)))
     return e, []
 
 
@@ -1901,8 +1901,8 @@ def cwd(_, instr):
     tempAX = mRAX[instr.mode][:16]
     tempDX = mRDX[instr.mode][:16]
     result = tempAX.signExtend(32)
-    e.append(m2_expr.ExprAff(tempAX, result[:16]))
-    e.append(m2_expr.ExprAff(tempDX, result[16:32]))
+    e.append(m2_expr.ExprAssign(tempAX, result[:16]))
+    e.append(m2_expr.ExprAssign(tempDX, result[16:32]))
     return e, []
 
 
@@ -1912,7 +1912,7 @@ def cdq(_, instr):
     tempEAX = mRAX[instr.v_opmode()]
     tempEDX = mRDX[instr.v_opmode()]
     result = tempEAX.signExtend(64)
-    e.append(m2_expr.ExprAff(tempEDX, result[32:64]))
+    e.append(m2_expr.ExprAssign(tempEDX, result[32:64]))
     return e, []
 
 
@@ -1922,8 +1922,8 @@ def cqo(_, instr):
     tempRAX = mRAX[instr.mode][:64]
     tempRDX = mRDX[instr.mode][:64]
     result = tempRAX.signExtend(128)
-    e.append(m2_expr.ExprAff(tempRAX, result[:64]))
-    e.append(m2_expr.ExprAff(tempRDX, result[64:128]))
+    e.append(m2_expr.ExprAssign(tempRAX, result[:64]))
+    e.append(m2_expr.ExprAssign(tempRDX, result[64:128]))
     return e, []
 
 
@@ -1946,18 +1946,18 @@ def stos(ir, instr, size):
     b = mRAX[instr.mode][:size]
 
     e0 = []
-    e0.append(m2_expr.ExprAff(addr_o, addr_p))
-    e0.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    e0.append(m2_expr.ExprAssign(addr_o, addr_p))
+    e0.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     e0 = IRBlock(loc_df_0, [AssignBlock(e0, instr)])
 
     e1 = []
-    e1.append(m2_expr.ExprAff(addr_o, addr_m))
-    e1.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    e1.append(m2_expr.ExprAssign(addr_o, addr_m))
+    e1.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     e1 = IRBlock(loc_df_1, [AssignBlock(e1, instr)])
 
     e = []
-    e.append(m2_expr.ExprAff(ir.ExprMem(addr, size), b))
-    e.append(m2_expr.ExprAff(ir.IRDst,
+    e.append(m2_expr.ExprAssign(ir.ExprMem(addr, size), b))
+    e.append(m2_expr.ExprAssign(ir.IRDst,
                              m2_expr.ExprCond(df, loc_df_1_expr, loc_df_0_expr)))
     return e, [e0, e1]
 
@@ -1982,23 +1982,23 @@ def lods(ir, instr, size):
     b = mRAX[instr.mode][:size]
 
     e0 = []
-    e0.append(m2_expr.ExprAff(addr_o, addr_p))
-    e0.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    e0.append(m2_expr.ExprAssign(addr_o, addr_p))
+    e0.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     e0 = IRBlock(loc_df_0, [AssignBlock(e0, instr)])
 
     e1 = []
-    e1.append(m2_expr.ExprAff(addr_o, addr_m))
-    e1.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    e1.append(m2_expr.ExprAssign(addr_o, addr_m))
+    e1.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     e1 = IRBlock(loc_df_1, [AssignBlock(e1, instr)])
 
     e = []
     if instr.mode == 64 and b.size == 32:
-        e.append(m2_expr.ExprAff(mRAX[instr.mode],
+        e.append(m2_expr.ExprAssign(mRAX[instr.mode],
                                  ir.ExprMem(addr, size).zeroExtend(64)))
     else:
-        e.append(m2_expr.ExprAff(b, ir.ExprMem(addr, size)))
+        e.append(m2_expr.ExprAssign(b, ir.ExprMem(addr, size)))
 
-    e.append(m2_expr.ExprAff(ir.IRDst,
+    e.append(m2_expr.ExprAssign(ir.IRDst,
                              m2_expr.ExprCond(df, loc_df_1_expr, loc_df_0_expr)))
     return e, [e0, e1]
 
@@ -2024,22 +2024,22 @@ def movs(ir, instr, size):
 
     offset = m2_expr.ExprInt(size / 8, src.size)
 
-    e.append(m2_expr.ExprAff(ir.ExprMem(dst_sgm, size),
+    e.append(m2_expr.ExprAssign(ir.ExprMem(dst_sgm, size),
                              ir.ExprMem(src_sgm, size)))
 
     e0 = []
-    e0.append(m2_expr.ExprAff(src, src + offset))
-    e0.append(m2_expr.ExprAff(dst, dst + offset))
-    e0.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    e0.append(m2_expr.ExprAssign(src, src + offset))
+    e0.append(m2_expr.ExprAssign(dst, dst + offset))
+    e0.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     e0 = IRBlock(loc_df_0, [AssignBlock(e0, instr)])
 
     e1 = []
-    e1.append(m2_expr.ExprAff(src, src - offset))
-    e1.append(m2_expr.ExprAff(dst, dst - offset))
-    e1.append(m2_expr.ExprAff(ir.IRDst, loc_next_expr))
+    e1.append(m2_expr.ExprAssign(src, src - offset))
+    e1.append(m2_expr.ExprAssign(dst, dst - offset))
+    e1.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr))
     e1 = IRBlock(loc_df_1, [AssignBlock(e1, instr)])
 
-    e.append(m2_expr.ExprAff(ir.IRDst,
+    e.append(m2_expr.ExprAssign(ir.IRDst,
                              m2_expr.ExprCond(df, loc_df_1_expr, loc_df_0_expr)))
     return e, [e0, e1]
 
@@ -2056,7 +2056,7 @@ def movsd(_, instr, dst, src):
         src = m2_expr.ExprMem(src.arg, 64)
         # Erase dst high bits
         src = src.zeroExtend(dst.size)
-    return [m2_expr.ExprAff(dst, src)], []
+    return [m2_expr.ExprAssign(dst, src)], []
 
 
 def movsd_dispatch(ir, instr, dst=None, src=None):
@@ -2087,14 +2087,14 @@ def float_pop(avoid_flt=None, popcount=1):
     e = []
     for i in xrange(8 - popcount):
         if avoid_flt != float_list[i]:
-            e.append(m2_expr.ExprAff(float_list[i],
+            e.append(m2_expr.ExprAssign(float_list[i],
                                      float_list[i + popcount]))
     fill_value = m2_expr.ExprOp("sint_to_fp", m2_expr.ExprInt(0, 64))
     for i in xrange(8 - popcount, 8):
-        e.append(m2_expr.ExprAff(float_list[i],
+        e.append(m2_expr.ExprAssign(float_list[i],
                                  fill_value))
     e.append(
-        m2_expr.ExprAff(float_stack_ptr,
+        m2_expr.ExprAssign(float_stack_ptr,
                         float_stack_ptr - m2_expr.ExprInt(popcount, 3)))
     return e
 
@@ -2111,10 +2111,10 @@ def fcom(_, instr, dst=None, src=None):
 
     e = []
 
-    e.append(m2_expr.ExprAff(float_c0, m2_expr.ExprOp('fcom_c0', dst, src)))
-    e.append(m2_expr.ExprAff(float_c1, m2_expr.ExprOp('fcom_c1', dst, src)))
-    e.append(m2_expr.ExprAff(float_c2, m2_expr.ExprOp('fcom_c2', dst, src)))
-    e.append(m2_expr.ExprAff(float_c3, m2_expr.ExprOp('fcom_c3', dst, src)))
+    e.append(m2_expr.ExprAssign(float_c0, m2_expr.ExprOp('fcom_c0', dst, src)))
+    e.append(m2_expr.ExprAssign(float_c1, m2_expr.ExprOp('fcom_c1', dst, src)))
+    e.append(m2_expr.ExprAssign(float_c2, m2_expr.ExprOp('fcom_c2', dst, src)))
+    e.append(m2_expr.ExprAssign(float_c3, m2_expr.ExprOp('fcom_c3', dst, src)))
 
     e += set_float_cs_eip(instr)
     return e, []
@@ -2125,10 +2125,10 @@ def ftst(_, instr):
 
     e = []
     src = m2_expr.ExprOp('sint_to_fp', m2_expr.ExprInt(0, 64))
-    e.append(m2_expr.ExprAff(float_c0, m2_expr.ExprOp('fcom_c0', dst, src)))
-    e.append(m2_expr.ExprAff(float_c1, m2_expr.ExprOp('fcom_c1', dst, src)))
-    e.append(m2_expr.ExprAff(float_c2, m2_expr.ExprOp('fcom_c2', dst, src)))
-    e.append(m2_expr.ExprAff(float_c3, m2_expr.ExprOp('fcom_c3', dst, src)))
+    e.append(m2_expr.ExprAssign(float_c0, m2_expr.ExprOp('fcom_c0', dst, src)))
+    e.append(m2_expr.ExprAssign(float_c1, m2_expr.ExprOp('fcom_c1', dst, src)))
+    e.append(m2_expr.ExprAssign(float_c2, m2_expr.ExprOp('fcom_c2', dst, src)))
+    e.append(m2_expr.ExprAssign(float_c3, m2_expr.ExprOp('fcom_c3', dst, src)))
 
     e += set_float_cs_eip(instr)
     return e, []
@@ -2188,8 +2188,8 @@ def fxam(ir, instr):
                  )
         )
     )
-    base = [m2_expr.ExprAff(ir.IRDst, irdst),
-         m2_expr.ExprAff(float_c1, dst.msb())
+    base = [m2_expr.ExprAssign(ir.IRDst, irdst),
+         m2_expr.ExprAssign(float_c1, dst.msb())
     ]
     base += set_float_cs_eip(instr)
 
@@ -2234,16 +2234,16 @@ def ficom(_, instr, dst, src=None):
 
     e = []
 
-    e.append(m2_expr.ExprAff(float_c0,
+    e.append(m2_expr.ExprAssign(float_c0,
                              m2_expr.ExprOp('fcom_c0', dst,
                                             src.zeroExtend(dst.size))))
-    e.append(m2_expr.ExprAff(float_c1,
+    e.append(m2_expr.ExprAssign(float_c1,
                              m2_expr.ExprOp('fcom_c1', dst,
                                             src.zeroExtend(dst.size))))
-    e.append(m2_expr.ExprAff(float_c2,
+    e.append(m2_expr.ExprAssign(float_c2,
                              m2_expr.ExprOp('fcom_c2', dst,
                                             src.zeroExtend(dst.size))))
-    e.append(m2_expr.ExprAff(float_c3,
+    e.append(m2_expr.ExprAssign(float_c3,
                              m2_expr.ExprOp('fcom_c3', dst,
                                             src.zeroExtend(dst.size))))
 
@@ -2261,13 +2261,13 @@ def fcomi(_, instr, dst=None, src=None):
 
     e = []
 
-    e.append(m2_expr.ExprAff(cf, m2_expr.ExprOp('fcom_c0', dst, src)))
-    e.append(m2_expr.ExprAff(pf, m2_expr.ExprOp('fcom_c2', dst, src)))
-    e.append(m2_expr.ExprAff(zf, m2_expr.ExprOp('fcom_c3', dst, src)))
+    e.append(m2_expr.ExprAssign(cf, m2_expr.ExprOp('fcom_c0', dst, src)))
+    e.append(m2_expr.ExprAssign(pf, m2_expr.ExprOp('fcom_c2', dst, src)))
+    e.append(m2_expr.ExprAssign(zf, m2_expr.ExprOp('fcom_c3', dst, src)))
 
-    e.append(m2_expr.ExprAff(of, m2_expr.ExprInt(0, 1)))
-    e.append(m2_expr.ExprAff(nf, m2_expr.ExprInt(0, 1)))
-    e.append(m2_expr.ExprAff(af, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(of, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(nf, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(af, m2_expr.ExprInt(0, 1)))
 
     e += set_float_cs_eip(instr)
     return e, []
@@ -2334,13 +2334,13 @@ def comiss(_, instr, dst, src):
     dst = m2_expr.ExprOp('sint_to_fp', dst[:32])
     src = m2_expr.ExprOp('sint_to_fp', src[:32])
 
-    e.append(m2_expr.ExprAff(cf, m2_expr.ExprOp('fcom_c0', dst, src)))
-    e.append(m2_expr.ExprAff(pf, m2_expr.ExprOp('fcom_c2', dst, src)))
-    e.append(m2_expr.ExprAff(zf, m2_expr.ExprOp('fcom_c3', dst, src)))
+    e.append(m2_expr.ExprAssign(cf, m2_expr.ExprOp('fcom_c0', dst, src)))
+    e.append(m2_expr.ExprAssign(pf, m2_expr.ExprOp('fcom_c2', dst, src)))
+    e.append(m2_expr.ExprAssign(zf, m2_expr.ExprOp('fcom_c3', dst, src)))
 
-    e.append(m2_expr.ExprAff(of, m2_expr.ExprInt(0, 1)))
-    e.append(m2_expr.ExprAff(nf, m2_expr.ExprInt(0, 1)))
-    e.append(m2_expr.ExprAff(af, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(of, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(nf, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(af, m2_expr.ExprInt(0, 1)))
 
     e += set_float_cs_eip(instr)
     return e, []
@@ -2354,13 +2354,13 @@ def comisd(_, instr, dst, src):
     dst = m2_expr.ExprOp('sint_to_fp', dst[:64])
     src = m2_expr.ExprOp('sint_to_fp', src[:64])
 
-    e.append(m2_expr.ExprAff(cf, m2_expr.ExprOp('fcom_c0', dst, src)))
-    e.append(m2_expr.ExprAff(pf, m2_expr.ExprOp('fcom_c2', dst, src)))
-    e.append(m2_expr.ExprAff(zf, m2_expr.ExprOp('fcom_c3', dst, src)))
+    e.append(m2_expr.ExprAssign(cf, m2_expr.ExprOp('fcom_c0', dst, src)))
+    e.append(m2_expr.ExprAssign(pf, m2_expr.ExprOp('fcom_c2', dst, src)))
+    e.append(m2_expr.ExprAssign(zf, m2_expr.ExprOp('fcom_c3', dst, src)))
 
-    e.append(m2_expr.ExprAff(of, m2_expr.ExprInt(0, 1)))
-    e.append(m2_expr.ExprAff(nf, m2_expr.ExprInt(0, 1)))
-    e.append(m2_expr.ExprAff(af, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(of, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(nf, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(af, m2_expr.ExprInt(0, 1)))
 
     e += set_float_cs_eip(instr)
     return e, []
@@ -2374,16 +2374,16 @@ def fld(_, instr, src):
         raise NotImplementedError('convert from 80bits')
 
     e = []
-    e.append(m2_expr.ExprAff(float_st7, float_st6))
-    e.append(m2_expr.ExprAff(float_st6, float_st5))
-    e.append(m2_expr.ExprAff(float_st5, float_st4))
-    e.append(m2_expr.ExprAff(float_st4, float_st3))
-    e.append(m2_expr.ExprAff(float_st3, float_st2))
-    e.append(m2_expr.ExprAff(float_st2, float_st1))
-    e.append(m2_expr.ExprAff(float_st1, float_st0))
-    e.append(m2_expr.ExprAff(float_st0, src))
+    e.append(m2_expr.ExprAssign(float_st7, float_st6))
+    e.append(m2_expr.ExprAssign(float_st6, float_st5))
+    e.append(m2_expr.ExprAssign(float_st5, float_st4))
+    e.append(m2_expr.ExprAssign(float_st4, float_st3))
+    e.append(m2_expr.ExprAssign(float_st3, float_st2))
+    e.append(m2_expr.ExprAssign(float_st2, float_st1))
+    e.append(m2_expr.ExprAssign(float_st1, float_st0))
+    e.append(m2_expr.ExprAssign(float_st0, src))
     e.append(
-        m2_expr.ExprAff(float_stack_ptr,
+        m2_expr.ExprAssign(float_stack_ptr,
                         float_stack_ptr + m2_expr.ExprInt(1, 3)))
 
     e += set_float_cs_eip(instr)
@@ -2399,7 +2399,7 @@ def fst(_, instr, dst):
 
     if dst.size == 32:
         src = m2_expr.ExprOp("fpconvert_fp32", src)
-    e.append(m2_expr.ExprAff(dst, src))
+    e.append(m2_expr.ExprAssign(dst, src))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2414,13 +2414,13 @@ def fstp(ir, instr, dst):
         src = float_st0
         if dst.size == 32:
             src = m2_expr.ExprOp("fpconvert_fp32", src)
-        e.append(m2_expr.ExprAff(dst, src))
+        e.append(m2_expr.ExprAssign(dst, src))
     else:
         src = float_st0
         if float_list.index(dst) > 1:
             # a = st0 -> st0 is dropped
             # a = st1 -> st0 = st0, useless
-            e.append(m2_expr.ExprAff(float_prev(dst), src))
+            e.append(m2_expr.ExprAssign(float_prev(dst), src))
 
     e += set_float_cs_eip(instr)
     e += float_pop(dst)
@@ -2429,7 +2429,7 @@ def fstp(ir, instr, dst):
 
 def fist(_, instr, dst):
     e = []
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('fp_to_sint%d' % dst.size,
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('fp_to_sint%d' % dst.size,
                                                  float_st0)))
 
     e += set_float_cs_eip(instr)
@@ -2444,7 +2444,7 @@ def fistp(ir, instr, dst):
 
 def fisttp(_, instr, dst):
     e = []
-    e.append(m2_expr.ExprAff(
+    e.append(m2_expr.ExprAssign(
         dst,
         m2_expr.ExprOp('fp_to_sint%d' % dst.size,
                        m2_expr.ExprOp('fpround_towardszero', float_st0)
@@ -2516,7 +2516,7 @@ def fadd(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('fadd', dst, src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('fadd', dst, src)))
 
     e += set_float_cs_eip(instr)
     return e, []
@@ -2526,7 +2526,7 @@ def fiadd(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('fiadd', dst, src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('fiadd', dst, src)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2535,7 +2535,7 @@ def fisub(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('fisub', dst, src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('fisub', dst, src)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2544,7 +2544,7 @@ def fisubr(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('fisub', src, dst)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('fisub', src, dst)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2552,7 +2552,7 @@ def fisubr(_, instr, dst, src=None):
 def fpatan(_, instr):
     e = []
     a = float_st1
-    e.append(m2_expr.ExprAff(float_prev(a),
+    e.append(m2_expr.ExprAssign(float_prev(a),
                              m2_expr.ExprOp('fpatan', float_st0, float_st1)))
     e += set_float_cs_eip(instr)
     e += float_pop(a)
@@ -2562,14 +2562,14 @@ def fpatan(_, instr):
 def fprem(_, instr):
     e = []
     e.append(
-        m2_expr.ExprAff(float_st0, m2_expr.ExprOp('fprem', float_st0, float_st1)))
+        m2_expr.ExprAssign(float_st0, m2_expr.ExprOp('fprem', float_st0, float_st1)))
     # Remaining bits (ex: used in argument reduction in tan)
     quotient = m2_expr.ExprOp('fp_to_sint32', m2_expr.ExprOp('fpround_towardszero', m2_expr.ExprOp('fdiv', float_st0, float_st1)))
-    e += [m2_expr.ExprAff(float_c0, quotient[2:3]),
-          m2_expr.ExprAff(float_c3, quotient[1:2]),
-          m2_expr.ExprAff(float_c1, quotient[0:1]),
+    e += [m2_expr.ExprAssign(float_c0, quotient[2:3]),
+          m2_expr.ExprAssign(float_c3, quotient[1:2]),
+          m2_expr.ExprAssign(float_c1, quotient[0:1]),
           # Consider the reduction is always completed
-          m2_expr.ExprAff(float_c2, m2_expr.ExprInt(0, 1)),
+          m2_expr.ExprAssign(float_c2, m2_expr.ExprInt(0, 1)),
           ]
     e += set_float_cs_eip(instr)
     return e, []
@@ -2578,7 +2578,7 @@ def fprem(_, instr):
 def fprem1(_, instr):
     e = []
     e.append(
-        m2_expr.ExprAff(float_st0, m2_expr.ExprOp('fprem1', float_st0, float_st1)))
+        m2_expr.ExprAssign(float_st0, m2_expr.ExprOp('fprem1', float_st0, float_st1)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2587,7 +2587,7 @@ def faddp(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(float_prev(dst), m2_expr.ExprOp('fadd', dst, src)))
+    e.append(m2_expr.ExprAssign(float_prev(dst), m2_expr.ExprOp('fadd', dst, src)))
     e += set_float_cs_eip(instr)
     e += float_pop(dst)
     return e, []
@@ -2603,7 +2603,7 @@ def fyl2x(_, instr):
     e = []
     a = float_st1
     e.append(
-        m2_expr.ExprAff(float_prev(a), m2_expr.ExprOp('fyl2x', float_st0, float_st1)))
+        m2_expr.ExprAssign(float_prev(a), m2_expr.ExprOp('fyl2x', float_st0, float_st1)))
     e += set_float_cs_eip(instr)
     e += float_pop(a)
     return e, []
@@ -2622,22 +2622,22 @@ def fnstenv(ir, instr, dst):
     # This will truncate addresses
     size = min(32, s)
     ad = ir.ExprMem(dst.arg, size=16)
-    e.append(m2_expr.ExprAff(ad, float_control))
+    e.append(m2_expr.ExprAssign(ad, float_control))
     ad = ir.ExprMem(dst.arg + m2_expr.ExprInt(size /
                                               8 * 1, dst.arg.size), size=16)
-    e.append(m2_expr.ExprAff(ad, status_word))
+    e.append(m2_expr.ExprAssign(ad, status_word))
     ad = ir.ExprMem(dst.arg + m2_expr.ExprInt(size /
                                               8 * 3, dst.arg.size), size=size)
-    e.append(m2_expr.ExprAff(ad, float_eip[:size]))
+    e.append(m2_expr.ExprAssign(ad, float_eip[:size]))
     ad = ir.ExprMem(dst.arg + m2_expr.ExprInt(size /
                                               8 * 4, dst.arg.size), size=16)
-    e.append(m2_expr.ExprAff(ad, float_cs))
+    e.append(m2_expr.ExprAssign(ad, float_cs))
     ad = ir.ExprMem(dst.arg + m2_expr.ExprInt(size /
                                               8 * 5, dst.arg.size), size=size)
-    e.append(m2_expr.ExprAff(ad, float_address[:size]))
+    e.append(m2_expr.ExprAssign(ad, float_address[:size]))
     ad = ir.ExprMem(dst.arg + m2_expr.ExprInt(size /
                                               8 * 6, dst.arg.size), size=16)
-    e.append(m2_expr.ExprAff(ad, float_ds))
+    e.append(m2_expr.ExprAssign(ad, float_ds))
     return e, []
 
 
@@ -2652,12 +2652,12 @@ def fldenv(ir, instr, src):
 
     # Float control
     ad = ir.ExprMem(src.arg, size=16)
-    e.append(m2_expr.ExprAff(float_control, ad))
+    e.append(m2_expr.ExprAssign(float_control, ad))
 
     # Status word
     ad = ir.ExprMem(src.arg + m2_expr.ExprInt(size / 8 * 1, size=src.arg.size),
                     size=16)
-    e += [m2_expr.ExprAff(x, y) for x, y in ((float_c0, ad[8:9]),
+    e += [m2_expr.ExprAssign(x, y) for x, y in ((float_c0, ad[8:9]),
                                              (float_c1, ad[9:10]),
                                              (float_c2, ad[10:11]),
                                              (float_stack_ptr, ad[11:14]),
@@ -2672,7 +2672,7 @@ def fldenv(ir, instr, src):
         ad = ir.ExprMem(src.arg + m2_expr.ExprInt(size / 8 * offset,
                                                   size=src.arg.size),
                         size=target.size)
-        e.append(m2_expr.ExprAff(target, ad))
+        e.append(m2_expr.ExprAssign(target, ad))
 
     return e, []
 
@@ -2681,7 +2681,7 @@ def fsub(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('fsub', dst, src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('fsub', dst, src)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2690,7 +2690,7 @@ def fsubp(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(float_prev(dst), m2_expr.ExprOp('fsub', dst, src)))
+    e.append(m2_expr.ExprAssign(float_prev(dst), m2_expr.ExprOp('fsub', dst, src)))
     e += set_float_cs_eip(instr)
     e += float_pop(dst)
     return e, []
@@ -2700,7 +2700,7 @@ def fsubr(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('fsub', src, dst)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('fsub', src, dst)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2709,7 +2709,7 @@ def fsubrp(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(float_prev(dst), m2_expr.ExprOp('fsub', src, dst)))
+    e.append(m2_expr.ExprAssign(float_prev(dst), m2_expr.ExprOp('fsub', src, dst)))
     e += set_float_cs_eip(instr)
     e += float_pop(dst)
     return e, []
@@ -2719,7 +2719,7 @@ def fmul(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('fmul', dst, src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('fmul', dst, src)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2728,7 +2728,7 @@ def fimul(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('fimul', dst, src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('fimul', dst, src)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2737,7 +2737,7 @@ def fdiv(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('fdiv', dst, src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('fdiv', dst, src)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2746,7 +2746,7 @@ def fdivr(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('fdiv', src, dst)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('fdiv', src, dst)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2755,7 +2755,7 @@ def fdivrp(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(float_prev(dst), m2_expr.ExprOp('fdiv', src, dst)))
+    e.append(m2_expr.ExprAssign(float_prev(dst), m2_expr.ExprOp('fdiv', src, dst)))
     e += set_float_cs_eip(instr)
     e += float_pop(dst)
     return e, []
@@ -2765,7 +2765,7 @@ def fidiv(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('fidiv', dst, src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('fidiv', dst, src)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2774,7 +2774,7 @@ def fidivr(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('fidiv', src, dst)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('fidiv', src, dst)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2784,7 +2784,7 @@ def fdivp(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(float_prev(dst), m2_expr.ExprOp('fdiv', dst, src)))
+    e.append(m2_expr.ExprAssign(float_prev(dst), m2_expr.ExprOp('fdiv', dst, src)))
     e += set_float_cs_eip(instr)
     e += float_pop(dst)
     return e, []
@@ -2795,7 +2795,7 @@ def fmulp(_, instr, dst, src=None):
     dst, src = float_implicit_st0(dst, src)
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(float_prev(dst), m2_expr.ExprOp('fmul', dst, src)))
+    e.append(m2_expr.ExprAssign(float_prev(dst), m2_expr.ExprOp('fmul', dst, src)))
     e += set_float_cs_eip(instr)
     e += float_pop(dst)
     return e, []
@@ -2804,7 +2804,7 @@ def fmulp(_, instr, dst, src=None):
 def ftan(_, instr, src):
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp('ftan', src)))
+    e.append(m2_expr.ExprAssign(float_st0, m2_expr.ExprOp('ftan', src)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2812,23 +2812,23 @@ def ftan(_, instr, src):
 def fxch(_, instr, src):
     e = []
     src = mem2double(instr, src)
-    e.append(m2_expr.ExprAff(float_st0, src))
-    e.append(m2_expr.ExprAff(src, float_st0))
+    e.append(m2_expr.ExprAssign(float_st0, src))
+    e.append(m2_expr.ExprAssign(src, float_st0))
     e += set_float_cs_eip(instr)
     return e, []
 
 
 def fptan(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(float_st7, float_st6))
-    e.append(m2_expr.ExprAff(float_st6, float_st5))
-    e.append(m2_expr.ExprAff(float_st5, float_st4))
-    e.append(m2_expr.ExprAff(float_st4, float_st3))
-    e.append(m2_expr.ExprAff(float_st3, float_st2))
-    e.append(m2_expr.ExprAff(float_st2, float_st1))
-    e.append(m2_expr.ExprAff(float_st1, m2_expr.ExprOp('ftan', float_st0)))
+    e.append(m2_expr.ExprAssign(float_st7, float_st6))
+    e.append(m2_expr.ExprAssign(float_st6, float_st5))
+    e.append(m2_expr.ExprAssign(float_st5, float_st4))
+    e.append(m2_expr.ExprAssign(float_st4, float_st3))
+    e.append(m2_expr.ExprAssign(float_st3, float_st2))
+    e.append(m2_expr.ExprAssign(float_st2, float_st1))
+    e.append(m2_expr.ExprAssign(float_st1, m2_expr.ExprOp('ftan', float_st0)))
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             float_st0,
             m2_expr.ExprOp(
                 'sint_to_fp',
@@ -2837,51 +2837,51 @@ def fptan(_, instr):
         )
     )
     e.append(
-        m2_expr.ExprAff(float_stack_ptr,
+        m2_expr.ExprAssign(float_stack_ptr,
                         float_stack_ptr + m2_expr.ExprInt(1, 3)))
     return e, []
 
 
 def frndint(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp('frndint', float_st0)))
+    e.append(m2_expr.ExprAssign(float_st0, m2_expr.ExprOp('frndint', float_st0)))
     e += set_float_cs_eip(instr)
     return e, []
 
 
 def fsin(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp('fsin', float_st0)))
+    e.append(m2_expr.ExprAssign(float_st0, m2_expr.ExprOp('fsin', float_st0)))
     e += set_float_cs_eip(instr)
     return e, []
 
 
 def fcos(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp('fcos', float_st0)))
+    e.append(m2_expr.ExprAssign(float_st0, m2_expr.ExprOp('fcos', float_st0)))
     e += set_float_cs_eip(instr)
     return e, []
 
 
 def fsincos(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(float_st7, float_st6))
-    e.append(m2_expr.ExprAff(float_st6, float_st5))
-    e.append(m2_expr.ExprAff(float_st5, float_st4))
-    e.append(m2_expr.ExprAff(float_st4, float_st3))
-    e.append(m2_expr.ExprAff(float_st3, float_st2))
-    e.append(m2_expr.ExprAff(float_st2, float_st1))
-    e.append(m2_expr.ExprAff(float_st1, m2_expr.ExprOp('fsin', float_st0)))
-    e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp('fcos', float_st0)))
+    e.append(m2_expr.ExprAssign(float_st7, float_st6))
+    e.append(m2_expr.ExprAssign(float_st6, float_st5))
+    e.append(m2_expr.ExprAssign(float_st5, float_st4))
+    e.append(m2_expr.ExprAssign(float_st4, float_st3))
+    e.append(m2_expr.ExprAssign(float_st3, float_st2))
+    e.append(m2_expr.ExprAssign(float_st2, float_st1))
+    e.append(m2_expr.ExprAssign(float_st1, m2_expr.ExprOp('fsin', float_st0)))
+    e.append(m2_expr.ExprAssign(float_st0, m2_expr.ExprOp('fcos', float_st0)))
     e.append(
-        m2_expr.ExprAff(float_stack_ptr,
+        m2_expr.ExprAssign(float_stack_ptr,
                         float_stack_ptr + m2_expr.ExprInt(1, 3)))
     return e, []
 
 
 def fscale(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp('fscale', float_st0,
+    e.append(m2_expr.ExprAssign(float_st0, m2_expr.ExprOp('fscale', float_st0,
                                                        float_st1)))
     e += set_float_cs_eip(instr)
     return e, []
@@ -2889,28 +2889,28 @@ def fscale(_, instr):
 
 def f2xm1(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp('f2xm1', float_st0)))
+    e.append(m2_expr.ExprAssign(float_st0, m2_expr.ExprOp('f2xm1', float_st0)))
     e += set_float_cs_eip(instr)
     return e, []
 
 
 def fchs(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp('fchs', float_st0)))
+    e.append(m2_expr.ExprAssign(float_st0, m2_expr.ExprOp('fchs', float_st0)))
     e += set_float_cs_eip(instr)
     return e, []
 
 
 def fsqrt(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp('fsqrt', float_st0)))
+    e.append(m2_expr.ExprAssign(float_st0, m2_expr.ExprOp('fsqrt', float_st0)))
     e += set_float_cs_eip(instr)
     return e, []
 
 
 def fabs(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp('fabs', float_st0)))
+    e.append(m2_expr.ExprAssign(float_st0, m2_expr.ExprOp('fabs', float_st0)))
     e += set_float_cs_eip(instr)
     return e, []
 
@@ -2926,19 +2926,19 @@ def fnstsw(_, instr, dst):
         float_c3,
         # B: FPU is not busy -> 0
         m2_expr.ExprInt(0, 1)]
-    e = [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*args))]
+    e = [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*args))]
     return e, []
 
 
 def fnstcw(_, instr, dst):
     e = []
-    e.append(m2_expr.ExprAff(dst, float_control))
+    e.append(m2_expr.ExprAssign(dst, float_control))
     return e, []
 
 
 def fldcw(_, instr, src):
     e = []
-    e.append(m2_expr.ExprAff(float_control, src))
+    e.append(m2_expr.ExprAssign(float_control, src))
     return e, []
 
 
@@ -3030,7 +3030,7 @@ def sfence(_, instr, src=None):
 
 
 def ud2(_, instr, src=None):
-    e = [m2_expr.ExprAff(exception_flags, m2_expr.ExprInt(
+    e = [m2_expr.ExprAssign(exception_flags, m2_expr.ExprInt(
         EXCEPT_ILLEGAL_INSN, exception_flags.size))]
     return e, []
 
@@ -3038,18 +3038,18 @@ def ud2(_, instr, src=None):
 def hlt(_, instr):
     e = []
     except_int = EXCEPT_PRIV_INSN
-    e.append(m2_expr.ExprAff(exception_flags, m2_expr.ExprInt(except_int, 32)))
+    e.append(m2_expr.ExprAssign(exception_flags, m2_expr.ExprInt(except_int, 32)))
     return e, []
 
 
 def rdtsc(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(tsc1, tsc1 + m2_expr.ExprInt(1, 32)))
-    e.append(m2_expr.ExprAff(tsc2, tsc2 + m2_expr.ExprCond(tsc1 - tsc1.mask,
+    e.append(m2_expr.ExprAssign(tsc1, tsc1 + m2_expr.ExprInt(1, 32)))
+    e.append(m2_expr.ExprAssign(tsc2, tsc2 + m2_expr.ExprCond(tsc1 - tsc1.mask,
                                                            m2_expr.ExprInt(0, 32),
                                                            m2_expr.ExprInt(1, 32))))
-    e.append(m2_expr.ExprAff(mRAX[32], tsc1))
-    e.append(m2_expr.ExprAff(mRDX[32], tsc2))
+    e.append(m2_expr.ExprAssign(mRAX[32], tsc1))
+    e.append(m2_expr.ExprAssign(mRDX[32], tsc2))
     return e, []
 
 
@@ -3058,7 +3058,7 @@ def daa(_, instr):
     r_al = mRAX[instr.mode][:8]
 
     cond1 = m2_expr.expr_is_unsigned_greater(r_al[:4], m2_expr.ExprInt(0x9, 4)) | af
-    e.append(m2_expr.ExprAff(af, cond1))
+    e.append(m2_expr.ExprAssign(af, cond1))
 
     cond2 = m2_expr.expr_is_unsigned_greater(m2_expr.ExprInt(6, 8), r_al)
     cond3 = m2_expr.expr_is_unsigned_greater(r_al, m2_expr.ExprInt(0x99, 8)) | cf
@@ -3069,7 +3069,7 @@ def daa(_, instr):
     new_cf = m2_expr.ExprCond(cond3,
                               m2_expr.ExprInt(1, 1),
                               m2_expr.ExprInt(0, 1))
-    e.append(m2_expr.ExprAff(cf, new_cf))
+    e.append(m2_expr.ExprAssign(cf, new_cf))
 
     al_c1 = m2_expr.ExprCond(cond1,
                              r_al + m2_expr.ExprInt(6, 8),
@@ -3078,7 +3078,7 @@ def daa(_, instr):
     new_al = m2_expr.ExprCond(cond3,
                               al_c1 + m2_expr.ExprInt(0x60, 8),
                               al_c1)
-    e.append(m2_expr.ExprAff(r_al, new_al))
+    e.append(m2_expr.ExprAssign(r_al, new_al))
     e += update_flag_znp(new_al)
     return e, []
 
@@ -3088,7 +3088,7 @@ def das(_, instr):
     r_al = mRAX[instr.mode][:8]
 
     cond1 = m2_expr.expr_is_unsigned_greater(r_al[:4], m2_expr.ExprInt(0x9, 4)) | af
-    e.append(m2_expr.ExprAff(af, cond1))
+    e.append(m2_expr.ExprAssign(af, cond1))
 
     cond2 = m2_expr.expr_is_unsigned_greater(m2_expr.ExprInt(6, 8), r_al)
     cond3 = m2_expr.expr_is_unsigned_greater(r_al, m2_expr.ExprInt(0x99, 8)) | cf
@@ -3099,7 +3099,7 @@ def das(_, instr):
     new_cf = m2_expr.ExprCond(cond3,
                               m2_expr.ExprInt(1, 1),
                               cf_c1)
-    e.append(m2_expr.ExprAff(cf, new_cf))
+    e.append(m2_expr.ExprAssign(cf, new_cf))
 
     al_c1 = m2_expr.ExprCond(cond1,
                              r_al - m2_expr.ExprInt(6, 8),
@@ -3108,7 +3108,7 @@ def das(_, instr):
     new_al = m2_expr.ExprCond(cond3,
                               al_c1 - m2_expr.ExprInt(0x60, 8),
                               al_c1)
-    e.append(m2_expr.ExprAff(r_al, new_al))
+    e.append(m2_expr.ExprAssign(r_al, new_al))
     e += update_flag_znp(new_al)
     return e, []
 
@@ -3125,12 +3125,12 @@ def aam(ir, instr, src):
             m2_expr.ExprOp("udiv", tempAL, src),
             mRAX[instr.mode][16:]
         )
-        e += [m2_expr.ExprAff(mRAX[instr.mode], newEAX)]
+        e += [m2_expr.ExprAssign(mRAX[instr.mode], newEAX)]
         e += update_flag_arith(newEAX)
-        e.append(m2_expr.ExprAff(af, m2_expr.ExprInt(0, 1)))
+        e.append(m2_expr.ExprAssign(af, m2_expr.ExprInt(0, 1)))
     else:
         e.append(
-            m2_expr.ExprAff(
+            m2_expr.ExprAssign(
                 exception_flags,
                 m2_expr.ExprInt(EXCEPT_DIV_BY_ZERO, exception_flags.size)
             )
@@ -3145,9 +3145,9 @@ def aad(_, instr, src):
     newEAX = m2_expr.ExprCompose((tempAL + (tempAH * src)) & m2_expr.ExprInt(0xFF, 8),
                                  m2_expr.ExprInt(0, 8),
                                  mRAX[instr.mode][16:])
-    e += [m2_expr.ExprAff(mRAX[instr.mode], newEAX)]
+    e += [m2_expr.ExprAssign(mRAX[instr.mode], newEAX)]
     e += update_flag_arith(newEAX)
-    e.append(m2_expr.ExprAff(af, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(af, m2_expr.ExprInt(0, 1)))
     return e, []
 
 
@@ -3175,9 +3175,9 @@ def _tpl_aaa(_, instr, op):
     new_ax = first_part & m2_expr.ExprInt(0xff0f,
                                           size=r_ax.size)
     # set AL
-    e.append(m2_expr.ExprAff(r_ax, m2_expr.ExprCond(cond, new_ax, r_ax)))
-    e.append(m2_expr.ExprAff(af, cond))
-    e.append(m2_expr.ExprAff(cf, cond))
+    e.append(m2_expr.ExprAssign(r_ax, m2_expr.ExprCond(cond, new_ax, r_ax)))
+    e.append(m2_expr.ExprAssign(af, cond))
+    e.append(m2_expr.ExprAssign(cf, cond))
     return e, []
 
 
@@ -3203,18 +3203,18 @@ def bsr_bsf(ir, instr, dst, src, op_func):
     loc_next = ir.get_next_loc_key(instr)
     loc_next_expr = m2_expr.ExprLoc(loc_next, ir.IRDst.size)
 
-    aff_dst = m2_expr.ExprAff(ir.IRDst, loc_next_expr)
-    e = [m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(src,
+    aff_dst = m2_expr.ExprAssign(ir.IRDst, loc_next_expr)
+    e = [m2_expr.ExprAssign(ir.IRDst, m2_expr.ExprCond(src,
                                                     loc_src_not_null_expr,
                                                     loc_src_null_expr))]
     e_src_null = []
-    e_src_null.append(m2_expr.ExprAff(zf, m2_expr.ExprInt(1, zf.size)))
+    e_src_null.append(m2_expr.ExprAssign(zf, m2_expr.ExprInt(1, zf.size)))
     # XXX destination is undefined
     e_src_null.append(aff_dst)
 
     e_src_not_null = []
-    e_src_not_null.append(m2_expr.ExprAff(zf, m2_expr.ExprInt(0, zf.size)))
-    e_src_not_null.append(m2_expr.ExprAff(dst, op_func(src)))
+    e_src_not_null.append(m2_expr.ExprAssign(zf, m2_expr.ExprInt(0, zf.size)))
+    e_src_not_null.append(m2_expr.ExprAssign(dst, op_func(src)))
     e_src_not_null.append(aff_dst)
 
     return e, [IRBlock(loc_src_null, [AssignBlock(e_src_null, instr)]),
@@ -3235,13 +3235,13 @@ def bsr(ir, instr, dst, src):
 
 def arpl(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(exception_flags, m2_expr.ExprInt(1 << 7, 32)))
+    e.append(m2_expr.ExprAssign(exception_flags, m2_expr.ExprInt(1 << 7, 32)))
     return e, []
 
 
 def ins(_, instr, size):
     e = []
-    e.append(m2_expr.ExprAff(exception_flags, m2_expr.ExprInt(1 << 7, 32)))
+    e.append(m2_expr.ExprAssign(exception_flags, m2_expr.ExprInt(1 << 7, 32)))
     return e, []
 
 
@@ -3251,17 +3251,17 @@ def sidt(ir, instr, dst):
         raise ValueError('not exprmem 32bit instance!!')
     ptr = dst.arg
     LOG_X86_SEM.warning("DEFAULT SIDT ADDRESS %s!!", str(dst))
-    e.append(m2_expr.ExprAff(ir.ExprMem(ptr, 32),
+    e.append(m2_expr.ExprAssign(ir.ExprMem(ptr, 32),
                              m2_expr.ExprInt(0xe40007ff, 32)))
     e.append(
-        m2_expr.ExprAff(ir.ExprMem(ptr + m2_expr.ExprInt(4, ptr.size), 16),
+        m2_expr.ExprAssign(ir.ExprMem(ptr + m2_expr.ExprInt(4, ptr.size), 16),
                         m2_expr.ExprInt(0x8245, 16)))
     return e, []
 
 
 def sldt(_, instr, dst):
     LOG_X86_SEM.warning("DEFAULT SLDT ADDRESS %s!!", str(dst))
-    e = [m2_expr.ExprAff(dst, m2_expr.ExprInt(0, dst.size))]
+    e = [m2_expr.ExprAssign(dst, m2_expr.ExprInt(0, dst.size))]
     return e, []
 
 
@@ -3343,7 +3343,7 @@ def cmovns(ir, instr, dst, src):
 
 def icebp(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(exception_flags,
+    e.append(m2_expr.ExprAssign(exception_flags,
                              m2_expr.ExprInt(EXCEPT_SOFT_BP, 32)))
     return e, []
 # XXX
@@ -3356,22 +3356,22 @@ def l_int(_, instr, src):
         except_int = EXCEPT_SOFT_BP
     else:
         except_int = EXCEPT_INT_XX
-    e.append(m2_expr.ExprAff(exception_flags,
+    e.append(m2_expr.ExprAssign(exception_flags,
                              m2_expr.ExprInt(except_int, 32)))
-    e.append(m2_expr.ExprAff(interrupt_num, src))
+    e.append(m2_expr.ExprAssign(interrupt_num, src))
     return e, []
 
 
 def l_sysenter(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(exception_flags,
+    e.append(m2_expr.ExprAssign(exception_flags,
                              m2_expr.ExprInt(EXCEPT_PRIV_INSN, 32)))
     return e, []
 
 
 def l_syscall(_, instr):
     e = []
-    e.append(m2_expr.ExprAff(exception_flags,
+    e.append(m2_expr.ExprAssign(exception_flags,
                              m2_expr.ExprInt(EXCEPT_PRIV_INSN, 32)))
     return e, []
 
@@ -3380,7 +3380,7 @@ def l_syscall(_, instr):
 
 def l_out(_, instr, src1, src2):
     e = []
-    e.append(m2_expr.ExprAff(exception_flags,
+    e.append(m2_expr.ExprAssign(exception_flags,
                              m2_expr.ExprInt(EXCEPT_PRIV_INSN, 32)))
     return e, []
 
@@ -3389,7 +3389,7 @@ def l_out(_, instr, src1, src2):
 
 def l_outs(_, instr, size):
     e = []
-    e.append(m2_expr.ExprAff(exception_flags,
+    e.append(m2_expr.ExprAssign(exception_flags,
                              m2_expr.ExprInt(EXCEPT_PRIV_INSN, 32)))
     return e, []
 
@@ -3400,23 +3400,23 @@ def xlat(ir, instr):
     e = []
     ptr = mRAX[instr.mode][0:8].zeroExtend(mRBX[instr.mode].size)
     src = ir.ExprMem(mRBX[instr.mode] + ptr, 8)
-    e.append(m2_expr.ExprAff(mRAX[instr.mode][0:8], src))
+    e.append(m2_expr.ExprAssign(mRAX[instr.mode][0:8], src))
     return e, []
 
 
 def cpuid(_, instr):
     e = []
     e.append(
-        m2_expr.ExprAff(mRAX[instr.mode],
+        m2_expr.ExprAssign(mRAX[instr.mode],
                         m2_expr.ExprOp('x86_cpuid', mRAX[instr.mode], m2_expr.ExprInt(0, instr.mode))))
     e.append(
-        m2_expr.ExprAff(mRBX[instr.mode],
+        m2_expr.ExprAssign(mRBX[instr.mode],
                         m2_expr.ExprOp('x86_cpuid', mRAX[instr.mode], m2_expr.ExprInt(1, instr.mode))))
     e.append(
-        m2_expr.ExprAff(mRCX[instr.mode],
+        m2_expr.ExprAssign(mRCX[instr.mode],
                         m2_expr.ExprOp('x86_cpuid', mRAX[instr.mode], m2_expr.ExprInt(2, instr.mode))))
     e.append(
-        m2_expr.ExprAff(mRDX[instr.mode],
+        m2_expr.ExprAssign(mRDX[instr.mode],
                         m2_expr.ExprOp('x86_cpuid', mRAX[instr.mode], m2_expr.ExprInt(3, instr.mode))))
     return e, []
 
@@ -3454,17 +3454,17 @@ def bt(ir, instr, src, index):
     index = index.zeroExtend(src.size)
     d, off_bit = bittest_get(ir, instr, src, index)
     d = d >> off_bit
-    e.append(m2_expr.ExprAff(cf, d[:1]))
+    e.append(m2_expr.ExprAssign(cf, d[:1]))
     return e, []
 
 
 def btc(ir, instr, src, index):
     e = []
     d, off_bit = bittest_get(ir, instr, src, index)
-    e.append(m2_expr.ExprAff(cf, (d >> off_bit)[:1]))
+    e.append(m2_expr.ExprAssign(cf, (d >> off_bit)[:1]))
 
     m = m2_expr.ExprInt(1, src.size) << off_bit
-    e.append(m2_expr.ExprAff(d, d ^ m))
+    e.append(m2_expr.ExprAssign(d, d ^ m))
 
     return e, []
 
@@ -3472,9 +3472,9 @@ def btc(ir, instr, src, index):
 def bts(ir, instr, src, index):
     e = []
     d, off_bit = bittest_get(ir, instr, src, index)
-    e.append(m2_expr.ExprAff(cf, (d >> off_bit)[:1]))
+    e.append(m2_expr.ExprAssign(cf, (d >> off_bit)[:1]))
     m = m2_expr.ExprInt(1, src.size) << off_bit
-    e.append(m2_expr.ExprAff(d, d | m))
+    e.append(m2_expr.ExprAssign(d, d | m))
 
     return e, []
 
@@ -3482,9 +3482,9 @@ def bts(ir, instr, src, index):
 def btr(ir, instr, src, index):
     e = []
     d, off_bit = bittest_get(ir, instr, src, index)
-    e.append(m2_expr.ExprAff(cf, (d >> off_bit)[:1]))
+    e.append(m2_expr.ExprAssign(cf, (d >> off_bit)[:1]))
     m = ~(m2_expr.ExprInt(1, src.size) << off_bit)
-    e.append(m2_expr.ExprAff(d, d & m))
+    e.append(m2_expr.ExprAssign(d, d & m))
 
     return e, []
 
@@ -3495,7 +3495,7 @@ def into(_, instr):
 
 def l_in(_, instr, src1, src2):
     e = []
-    e.append(m2_expr.ExprAff(exception_flags,
+    e.append(m2_expr.ExprAssign(exception_flags,
                              m2_expr.ExprInt(EXCEPT_PRIV_INSN, 32)))
     return e, []
 
@@ -3537,46 +3537,46 @@ def cmpxchg16b(arg1):
 
 def lds(ir, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst, ir.ExprMem(src.arg, size=dst.size)))
+    e.append(m2_expr.ExprAssign(dst, ir.ExprMem(src.arg, size=dst.size)))
     DS_value = ir.ExprMem(src.arg + m2_expr.ExprInt(dst.size / 8, src.arg.size),
                           size=16)
-    e.append(m2_expr.ExprAff(DS, DS_value))
+    e.append(m2_expr.ExprAssign(DS, DS_value))
     return e, []
 
 
 def les(ir, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst, ir.ExprMem(src.arg, size=dst.size)))
+    e.append(m2_expr.ExprAssign(dst, ir.ExprMem(src.arg, size=dst.size)))
     ES_value = ir.ExprMem(src.arg + m2_expr.ExprInt(dst.size / 8, src.arg.size),
                           size=16)
-    e.append(m2_expr.ExprAff(ES, ES_value))
+    e.append(m2_expr.ExprAssign(ES, ES_value))
     return e, []
 
 
 def lss(ir, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst, ir.ExprMem(src.arg, size=dst.size)))
+    e.append(m2_expr.ExprAssign(dst, ir.ExprMem(src.arg, size=dst.size)))
     SS_value = ir.ExprMem(src.arg + m2_expr.ExprInt(dst.size / 8, src.arg.size),
                           size=16)
-    e.append(m2_expr.ExprAff(SS, SS_value))
+    e.append(m2_expr.ExprAssign(SS, SS_value))
     return e, []
 
 
 def lfs(ir, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst, ir.ExprMem(src.arg, size=dst.size)))
+    e.append(m2_expr.ExprAssign(dst, ir.ExprMem(src.arg, size=dst.size)))
     FS_value = ir.ExprMem(src.arg + m2_expr.ExprInt(dst.size / 8, src.arg.size),
                           size=16)
-    e.append(m2_expr.ExprAff(FS, FS_value))
+    e.append(m2_expr.ExprAssign(FS, FS_value))
     return e, []
 
 
 def lgs(ir, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst, ir.ExprMem(src.arg, size=dst.size)))
+    e.append(m2_expr.ExprAssign(dst, ir.ExprMem(src.arg, size=dst.size)))
     GS_value = ir.ExprMem(src.arg + m2_expr.ExprInt(dst.size / 8, src.arg.size),
                           size=16)
-    e.append(m2_expr.ExprAff(GS, GS_value))
+    e.append(m2_expr.ExprAssign(GS, GS_value))
     return e, []
 
 
@@ -3585,32 +3585,32 @@ def lahf(_, instr):
     args = [cf, m2_expr.ExprInt(1, 1), pf, m2_expr.ExprInt(0, 1), af,
             m2_expr.ExprInt(0, 1), zf, nf]
     e.append(
-        m2_expr.ExprAff(mRAX[instr.mode][8:16], m2_expr.ExprCompose(*args)))
+        m2_expr.ExprAssign(mRAX[instr.mode][8:16], m2_expr.ExprCompose(*args)))
     return e, []
 
 
 def sahf(_, instr):
     tmp = mRAX[instr.mode][8:16]
     e = []
-    e.append(m2_expr.ExprAff(cf, tmp[0:1]))
-    e.append(m2_expr.ExprAff(pf, tmp[2:3]))
-    e.append(m2_expr.ExprAff(af, tmp[4:5]))
-    e.append(m2_expr.ExprAff(zf, tmp[6:7]))
-    e.append(m2_expr.ExprAff(nf, tmp[7:8]))
+    e.append(m2_expr.ExprAssign(cf, tmp[0:1]))
+    e.append(m2_expr.ExprAssign(pf, tmp[2:3]))
+    e.append(m2_expr.ExprAssign(af, tmp[4:5]))
+    e.append(m2_expr.ExprAssign(zf, tmp[6:7]))
+    e.append(m2_expr.ExprAssign(nf, tmp[7:8]))
     return e, []
 
 
 def lar(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('access_segment', src)))
-    e.append(m2_expr.ExprAff(zf, m2_expr.ExprOp('access_segment_ok', src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('access_segment', src)))
+    e.append(m2_expr.ExprAssign(zf, m2_expr.ExprOp('access_segment_ok', src)))
     return e, []
 
 
 def lsl(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('load_segment_limit', src)))
-    e.append(m2_expr.ExprAff(zf, m2_expr.ExprOp('load_segment_limit_ok', src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('load_segment_limit', src)))
+    e.append(m2_expr.ExprAssign(zf, m2_expr.ExprOp('load_segment_limit_ok', src)))
     return e, []
 
 
@@ -3626,7 +3626,7 @@ def fnclex(_, instr):
 
 def l_str(_, instr, dst):
     e = []
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('load_tr_segment_selector',
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('load_tr_segment_selector',
                                                  m2_expr.ExprInt(0, 32))))
     return e, []
 
@@ -3634,57 +3634,57 @@ def l_str(_, instr, dst):
 def movd(_, instr, dst, src):
     e = []
     if dst in regs_mm_expr:
-        e.append(m2_expr.ExprAff(
+        e.append(m2_expr.ExprAssign(
             dst, m2_expr.ExprCompose(src, m2_expr.ExprInt(0, 32))))
     elif dst in regs_xmm_expr:
-        e.append(m2_expr.ExprAff(
+        e.append(m2_expr.ExprAssign(
             dst, m2_expr.ExprCompose(src, m2_expr.ExprInt(0, 96))))
     else:
-        e.append(m2_expr.ExprAff(dst, src[:32]))
+        e.append(m2_expr.ExprAssign(dst, src[:32]))
     return e, []
 
 
 def movdqu(_, instr, dst, src):
     # XXX TODO alignement check
-    return [m2_expr.ExprAff(dst, src)], []
+    return [m2_expr.ExprAssign(dst, src)], []
 
 
 def movapd(_, instr, dst, src):
     # XXX TODO alignement check
-    return [m2_expr.ExprAff(dst, src)], []
+    return [m2_expr.ExprAssign(dst, src)], []
 
 
 def andps(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('&', dst, src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('&', dst, src)))
     return e, []
 
 
 def andnps(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('&', dst ^ dst.mask, src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('&', dst ^ dst.mask, src)))
     return e, []
 
 
 def orps(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('|', dst, src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('|', dst, src)))
     return e, []
 
 
 def xorps(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprOp('^', dst, src)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprOp('^', dst, src)))
     return e, []
 
 
 def rdmsr(ir, instr):
-    e = [m2_expr.ExprAff(exception_flags,m2_expr.ExprInt(EXCEPT_PRIV_INSN, 32))]
+    e = [m2_expr.ExprAssign(exception_flags,m2_expr.ExprInt(EXCEPT_PRIV_INSN, 32))]
     return e, []
 
 
 def wrmsr(ir, instr):
-    e = [m2_expr.ExprAff(exception_flags,m2_expr.ExprInt(EXCEPT_PRIV_INSN, 32))]
+    e = [m2_expr.ExprAssign(exception_flags,m2_expr.ExprInt(EXCEPT_PRIV_INSN, 32))]
     return e, []
 
 # MMX/SSE/AVX operations
@@ -3703,7 +3703,7 @@ def vec_op_clip(op, size, callback=None):
             result = m2_expr.ExprOp(op, dst[:size], src[:size])
         if callback is not None:
             result = callback(result)
-        return [m2_expr.ExprAff(dst[:size], result)], []
+        return [m2_expr.ExprAssign(dst[:size], result)], []
     return vec_op_clip_instr
 
 # Generic vertical operation
@@ -3734,7 +3734,7 @@ def __vec_vertical_instr_gen(op, elt_size, sem, apply_on_output):
         if isinstance(src, m2_expr.ExprMem):
             src = ir.ExprMem(src.arg, dst.size)
         reg_size = dst.size
-        e.append(m2_expr.ExprAff(dst, sem(op, elt_size, reg_size, dst, src,
+        e.append(m2_expr.ExprAssign(dst, sem(op, elt_size, reg_size, dst, src,
                                           apply_on_output)))
         return e, []
     return vec_instr
@@ -3839,16 +3839,16 @@ pmulhq = vec_vertical_instr('*', 64, lambda x: _keep_mul_high(x, signed=True))
 def pmuludq(ir, instr, dst, src):
     e = []
     if dst.size == 64:
-        e.append(m2_expr.ExprAff(
+        e.append(m2_expr.ExprAssign(
             dst,
             src[:32].zeroExtend(64) * dst[:32].zeroExtend(64)
         ))
     elif dst.size == 128:
-        e.append(m2_expr.ExprAff(
+        e.append(m2_expr.ExprAssign(
             dst[:64],
             src[:32].zeroExtend(64) * dst[:32].zeroExtend(64)
         ))
-        e.append(m2_expr.ExprAff(
+        e.append(m2_expr.ExprAssign(
             dst[64:],
             src[64:96].zeroExtend(64) * dst[64:96].zeroExtend(64)
         ))
@@ -3870,7 +3870,7 @@ def pmaddwd(ir, instr, dst, src):
         base += sizesrc
         mul2 = src[base: base + sizesrc].signExtend(sizedst) * dst[base: base + sizesrc].signExtend(sizedst)
         out.append(mul1 + mul2)
-    return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out))], []
 
 
 def _absolute(expr):
@@ -3895,7 +3895,7 @@ def psadbw(ir, instr, dst, src):
         out_dst.append(m2_expr.ExprOp("+", *out))
         out_dst.append(m2_expr.ExprInt(0, 64 - sizedst))
 
-    return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out_dst))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out_dst))], []
 
 def _average(expr):
     assert expr.is_op("avg") and len(expr.args) == 2
@@ -4031,7 +4031,7 @@ def pand(_, instr, dst, src):
     e = []
     result = dst & src
     # No flag affected
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return e, []
 
 
@@ -4039,21 +4039,21 @@ def pandn(_, instr, dst, src):
     e = []
     result = (dst ^ dst.mask) & src
     # No flag affected
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return e, []
 
 
 def por(_, instr, dst, src):
     e = []
     result = dst | src
-    e.append(m2_expr.ExprAff(dst, result))
+    e.append(m2_expr.ExprAssign(dst, result))
     return e, []
 
 
 def cvtdq2pd(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst[:64],
             m2_expr.ExprOp(
                 'sint_to_fp',
@@ -4062,7 +4062,7 @@ def cvtdq2pd(_, instr, dst, src):
         )
     )
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst[64:128],
             m2_expr.ExprOp(
                 'sint_to_fp',
@@ -4076,49 +4076,49 @@ def cvtdq2pd(_, instr, dst, src):
 def cvtdq2ps(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(dst[:32], m2_expr.ExprOp('sint_to_fp', src[:32])))
+        m2_expr.ExprAssign(dst[:32], m2_expr.ExprOp('sint_to_fp', src[:32])))
     e.append(
-        m2_expr.ExprAff(dst[32:64], m2_expr.ExprOp('sint_to_fp', src[32:64])))
+        m2_expr.ExprAssign(dst[32:64], m2_expr.ExprOp('sint_to_fp', src[32:64])))
     e.append(
-        m2_expr.ExprAff(dst[64:96], m2_expr.ExprOp('sint_to_fp', src[64:96])))
+        m2_expr.ExprAssign(dst[64:96], m2_expr.ExprOp('sint_to_fp', src[64:96])))
     e.append(
-        m2_expr.ExprAff(dst[96:128], m2_expr.ExprOp('sint_to_fp', src[96:128])))
+        m2_expr.ExprAssign(dst[96:128], m2_expr.ExprOp('sint_to_fp', src[96:128])))
     return e, []
 
 
 def cvtpd2dq(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(dst[:32], m2_expr.ExprOp('fp_to_sint32', src[:64])))
+        m2_expr.ExprAssign(dst[:32], m2_expr.ExprOp('fp_to_sint32', src[:64])))
     e.append(
-        m2_expr.ExprAff(dst[32:64], m2_expr.ExprOp('fp_to_sint32', src[64:128])))
-    e.append(m2_expr.ExprAff(dst[64:128], m2_expr.ExprInt(0, 64)))
+        m2_expr.ExprAssign(dst[32:64], m2_expr.ExprOp('fp_to_sint32', src[64:128])))
+    e.append(m2_expr.ExprAssign(dst[64:128], m2_expr.ExprInt(0, 64)))
     return e, []
 
 
 def cvtpd2pi(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(dst[:32], m2_expr.ExprOp('fp_to_sint32', src[:64])))
+        m2_expr.ExprAssign(dst[:32], m2_expr.ExprOp('fp_to_sint32', src[:64])))
     e.append(
-        m2_expr.ExprAff(dst[32:64], m2_expr.ExprOp('fp_to_sint32', src[64:128])))
+        m2_expr.ExprAssign(dst[32:64], m2_expr.ExprOp('fp_to_sint32', src[64:128])))
     return e, []
 
 
 def cvtpd2ps(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(dst[:32], m2_expr.ExprOp('fpconvert_fp32', src[:64])))
+        m2_expr.ExprAssign(dst[:32], m2_expr.ExprOp('fpconvert_fp32', src[:64])))
     e.append(
-        m2_expr.ExprAff(dst[32:64], m2_expr.ExprOp('fpconvert_fp32', src[64:128])))
-    e.append(m2_expr.ExprAff(dst[64:128], m2_expr.ExprInt(0, 64)))
+        m2_expr.ExprAssign(dst[32:64], m2_expr.ExprOp('fpconvert_fp32', src[64:128])))
+    e.append(m2_expr.ExprAssign(dst[64:128], m2_expr.ExprInt(0, 64)))
     return e, []
 
 
 def cvtpi2pd(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst[:64],
             m2_expr.ExprOp(
                 'sint_to_fp',
@@ -4127,7 +4127,7 @@ def cvtpi2pd(_, instr, dst, src):
         )
     )
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst[64:128],
             m2_expr.ExprOp(
                 'sint_to_fp',
@@ -4140,61 +4140,61 @@ def cvtpi2pd(_, instr, dst, src):
 def cvtpi2ps(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(dst[:32], m2_expr.ExprOp('sint_to_fp', src[:32])))
+        m2_expr.ExprAssign(dst[:32], m2_expr.ExprOp('sint_to_fp', src[:32])))
     e.append(
-        m2_expr.ExprAff(dst[32:64], m2_expr.ExprOp('sint_to_fp', src[32:64])))
+        m2_expr.ExprAssign(dst[32:64], m2_expr.ExprOp('sint_to_fp', src[32:64])))
     return e, []
 
 
 def cvtps2dq(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(dst[:32], m2_expr.ExprOp('fp_to_sint32', src[:32])))
+        m2_expr.ExprAssign(dst[:32], m2_expr.ExprOp('fp_to_sint32', src[:32])))
     e.append(
-        m2_expr.ExprAff(dst[32:64], m2_expr.ExprOp('fp_to_sint32', src[32:64])))
+        m2_expr.ExprAssign(dst[32:64], m2_expr.ExprOp('fp_to_sint32', src[32:64])))
     e.append(
-        m2_expr.ExprAff(dst[64:96], m2_expr.ExprOp('fp_to_sint32', src[64:96])))
+        m2_expr.ExprAssign(dst[64:96], m2_expr.ExprOp('fp_to_sint32', src[64:96])))
     e.append(
-        m2_expr.ExprAff(dst[96:128], m2_expr.ExprOp('fp_to_sint32', src[96:128])))
+        m2_expr.ExprAssign(dst[96:128], m2_expr.ExprOp('fp_to_sint32', src[96:128])))
     return e, []
 
 
 def cvtps2pd(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(dst[:64], m2_expr.ExprOp('fpconvert_fp64', src[:32])))
+        m2_expr.ExprAssign(dst[:64], m2_expr.ExprOp('fpconvert_fp64', src[:32])))
     e.append(
-        m2_expr.ExprAff(dst[64:128], m2_expr.ExprOp('fpconvert_fp64', src[32:64])))
+        m2_expr.ExprAssign(dst[64:128], m2_expr.ExprOp('fpconvert_fp64', src[32:64])))
     return e, []
 
 
 def cvtps2pi(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(dst[:32], m2_expr.ExprOp('fp_to_sint32', src[:32])))
+        m2_expr.ExprAssign(dst[:32], m2_expr.ExprOp('fp_to_sint32', src[:32])))
     e.append(
-        m2_expr.ExprAff(dst[32:64], m2_expr.ExprOp('fp_to_sint32', src[32:64])))
+        m2_expr.ExprAssign(dst[32:64], m2_expr.ExprOp('fp_to_sint32', src[32:64])))
     return e, []
 
 
 def cvtsd2si(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(dst[:32], m2_expr.ExprOp('fp_to_sint32', src[:64])))
+        m2_expr.ExprAssign(dst[:32], m2_expr.ExprOp('fp_to_sint32', src[:64])))
     return e, []
 
 
 def cvtsd2ss(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(dst[:32], m2_expr.ExprOp('fpconvert_fp32', src[:64])))
+        m2_expr.ExprAssign(dst[:32], m2_expr.ExprOp('fpconvert_fp32', src[:64])))
     return e, []
 
 
 def cvtsi2sd(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(
+        m2_expr.ExprAssign(
             dst[:64],
             m2_expr.ExprOp(
                 'sint_to_fp',
@@ -4208,21 +4208,21 @@ def cvtsi2sd(_, instr, dst, src):
 def cvtsi2ss(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(dst[:32], m2_expr.ExprOp('sint_to_fp', src[:32])))
+        m2_expr.ExprAssign(dst[:32], m2_expr.ExprOp('sint_to_fp', src[:32])))
     return e, []
 
 
 def cvtss2sd(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(dst[:64], m2_expr.ExprOp('fpconvert_fp64', src[:32])))
+        m2_expr.ExprAssign(dst[:64], m2_expr.ExprOp('fpconvert_fp64', src[:32])))
     return e, []
 
 
 def cvtss2si(_, instr, dst, src):
     e = []
     e.append(
-        m2_expr.ExprAff(dst[:32], m2_expr.ExprOp('fp_to_sint32', src[:32])))
+        m2_expr.ExprAssign(dst[:32], m2_expr.ExprOp('fp_to_sint32', src[:32])))
     return e, []
 
 
@@ -4236,7 +4236,7 @@ def _cvtt_tpl(dst, src, numbers, double):
         else:
             tmp_src = src[i*32:i*32 + 32]
 
-        e.append(m2_expr.ExprAff(
+        e.append(m2_expr.ExprAssign(
             dst[i*32:i*32 + 32],
             m2_expr.ExprOp('fp_to_sint32', m2_expr.ExprOp(
                 'fpround_towardszero',
@@ -4249,7 +4249,7 @@ def cvttpd2pi(_, instr, dst, src):
 
 def cvttpd2dq(_, instr, dst, src):
     e = _cvtt_tpl(dst, src, [0, 1], double=True)
-    e.append(m2_expr.ExprAff(dst[64:128], m2_expr.ExprInt(0, 64)))
+    e.append(m2_expr.ExprAssign(dst[64:128], m2_expr.ExprInt(0, 64)))
     return e, []
 
 def cvttsd2si(_, instr, dst, src):
@@ -4268,44 +4268,44 @@ def movss(_, instr, dst, src):
     e = []
     if not isinstance(dst, m2_expr.ExprMem) and not isinstance(src, m2_expr.ExprMem):
         # Source and Destination xmm
-        e.append(m2_expr.ExprAff(dst[:32], src[:32]))
+        e.append(m2_expr.ExprAssign(dst[:32], src[:32]))
     elif not isinstance(src, m2_expr.ExprMem) and isinstance(dst, m2_expr.ExprMem):
         # Source XMM Destination Mem
-        e.append(m2_expr.ExprAff(dst, src[:32]))
+        e.append(m2_expr.ExprAssign(dst, src[:32]))
     else:
         # Source Mem Destination XMM
-        e.append(m2_expr.ExprAff(
+        e.append(m2_expr.ExprAssign(
             dst, m2_expr.ExprCompose(src, m2_expr.ExprInt(0, 96))))
     return e, []
 
 
 def ucomiss(_, instr, src1, src2):
     e = []
-    e.append(m2_expr.ExprAff(zf, m2_expr.ExprOp(
+    e.append(m2_expr.ExprAssign(zf, m2_expr.ExprOp(
         'ucomiss_zf', src1[:32], src2[:32])))
-    e.append(m2_expr.ExprAff(pf, m2_expr.ExprOp(
+    e.append(m2_expr.ExprAssign(pf, m2_expr.ExprOp(
         'ucomiss_pf', src1[:32], src2[:32])))
-    e.append(m2_expr.ExprAff(cf, m2_expr.ExprOp(
+    e.append(m2_expr.ExprAssign(cf, m2_expr.ExprOp(
         'ucomiss_cf', src1[:32], src2[:32])))
 
-    e.append(m2_expr.ExprAff(of, m2_expr.ExprInt(0, 1)))
-    e.append(m2_expr.ExprAff(af, m2_expr.ExprInt(0, 1)))
-    e.append(m2_expr.ExprAff(nf, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(of, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(af, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(nf, m2_expr.ExprInt(0, 1)))
 
     return e, []
 
 def ucomisd(_, instr, src1, src2):
     e = []
-    e.append(m2_expr.ExprAff(zf, m2_expr.ExprOp(
+    e.append(m2_expr.ExprAssign(zf, m2_expr.ExprOp(
         'ucomisd_zf', src1[:64], src2[:64])))
-    e.append(m2_expr.ExprAff(pf, m2_expr.ExprOp(
+    e.append(m2_expr.ExprAssign(pf, m2_expr.ExprOp(
         'ucomisd_pf', src1[:64], src2[:64])))
-    e.append(m2_expr.ExprAff(cf, m2_expr.ExprOp(
+    e.append(m2_expr.ExprAssign(cf, m2_expr.ExprOp(
         'ucomisd_cf', src1[:64], src2[:64])))
 
-    e.append(m2_expr.ExprAff(of, m2_expr.ExprInt(0, 1)))
-    e.append(m2_expr.ExprAff(af, m2_expr.ExprInt(0, 1)))
-    e.append(m2_expr.ExprAff(nf, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(of, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(af, m2_expr.ExprInt(0, 1)))
+    e.append(m2_expr.ExprAssign(nf, m2_expr.ExprInt(0, 1)))
 
     return e, []
 
@@ -4322,7 +4322,7 @@ def pshufb(_, instr, dst, src):
         index = src[
             i:i + bit_l].zeroExtend(dst.size) << m2_expr.ExprInt(3, dst.size)
         value = (dst >> index)[:8]
-        e.append(m2_expr.ExprAff(dst[i:i + 8],
+        e.append(m2_expr.ExprAssign(dst[i:i + 8],
                                  m2_expr.ExprCond(src[i + 7:i + 8],
                                                   m2_expr.ExprInt(0, 8),
                                                   value)))
@@ -4337,7 +4337,7 @@ def pshufd(_, instr, dst, src, imm):
         # shift is 2 bits long, expr.size is 128
         # => shift + 32 <= src.size
         out.append(src[shift: shift + 32])
-    return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out))], []
 
 
 def pshuflw(_, instr, dst, src, imm):
@@ -4347,7 +4347,7 @@ def pshuflw(_, instr, dst, src, imm):
         shift = ((control >> (i * 2)) & 3) * 16
         out.append(src[shift: shift + 16])
     out.append(src[64:])
-    return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out))], []
 
 
 def pshufhw(_, instr, dst, src, imm):
@@ -4356,7 +4356,7 @@ def pshufhw(_, instr, dst, src, imm):
     for i in xrange(4):
         shift = ((control >> (i * 2)) & 3) * 16
         out.append(src[shift + 64: shift + 16 + 64])
-    return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out))], []
 
 
 def ps_rl_ll(ir, instr, dst, src, op, size):
@@ -4378,7 +4378,7 @@ def ps_rl_ll(ir, instr, dst, src, op, size):
     out = []
     for i in xrange(0, dst.size, size):
         out.append(m2_expr.ExprOp(op, dst[i:i + size], count))
-    return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out))], []
 
 
 def psrlw(ir, instr, dst, src):
@@ -4418,18 +4418,18 @@ def pslldq(_, instr, dst, src):
     e = []
     count = int(src)
     if count > 15:
-        return [m2_expr.ExprAff(dst, m2_expr.ExprInt(0, dst.size))], []
+        return [m2_expr.ExprAssign(dst, m2_expr.ExprInt(0, dst.size))], []
     else:
-        return [m2_expr.ExprAff(dst, dst << m2_expr.ExprInt(8 * count, dst.size))], []
+        return [m2_expr.ExprAssign(dst, dst << m2_expr.ExprInt(8 * count, dst.size))], []
 
 
 def psrldq(_, instr, dst, src):
     assert src.is_int()
     count = int(src)
     if count > 15:
-        return [m2_expr.ExprAff(dst, m2_expr.ExprInt(0, dst.size))], []
+        return [m2_expr.ExprAssign(dst, m2_expr.ExprInt(0, dst.size))], []
     else:
-        return [m2_expr.ExprAff(dst, dst >> m2_expr.ExprInt(8 * count, dst.size))], []
+        return [m2_expr.ExprAssign(dst, dst >> m2_expr.ExprInt(8 * count, dst.size))], []
 
 
 def iret(ir, instr):
@@ -4447,7 +4447,7 @@ def pcmpeq(_, instr, dst, src, size):
     e = []
     for i in xrange(0, dst.size, size):
         test = m2_expr.expr_is_equal(dst[i:i + size], src[i:i + size])
-        e.append(m2_expr.ExprAff(dst[i:i + size],
+        e.append(m2_expr.ExprAssign(dst[i:i + size],
                                  m2_expr.ExprCond(test,
                                                   m2_expr.ExprInt(-1, size),
                                                   m2_expr.ExprInt(0, size))))
@@ -4458,7 +4458,7 @@ def pcmpgt(_, instr, dst, src, size):
     e = []
     for i in xrange(0, dst.size, size):
         test = m2_expr.expr_is_signed_greater(dst[i:i + size], src[i:i + size])
-        e.append(m2_expr.ExprAff(dst[i:i + size],
+        e.append(m2_expr.ExprAssign(dst[i:i + size],
                                  m2_expr.ExprCond(test,
                                                   m2_expr.ExprInt(-1, size),
                                                   m2_expr.ExprInt(0, size))))
@@ -4500,7 +4500,7 @@ def punpck(_, instr, dst, src, size, off):
     for i in xrange(dst.size / (2 * size)):
         slices.append(dst[size * i + off: size * i + off + size])
         slices.append(src[size * i + off: size * i + off + size])
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprCompose(*slices)))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*slices)))
     return e, []
 
 
@@ -4545,7 +4545,7 @@ def pinsr(_, instr, dst, src, imm, size):
             64: 0x1}[size]
 
     sel = (int(imm) & mask) * size
-    e.append(m2_expr.ExprAff(dst[sel:sel + size], src[:size]))
+    e.append(m2_expr.ExprAssign(dst[sel:sel + size], src[:size]))
 
     return e, []
 
@@ -4575,7 +4575,7 @@ def pextr(_, instr, dst, src, imm, size):
             64: 0x1}[size]
 
     sel = (int(imm) & mask) * size
-    e.append(m2_expr.ExprAff(dst, src[sel:sel + size].zeroExtend(dst.size)))
+    e.append(m2_expr.ExprAssign(dst, src[sel:sel + size].zeroExtend(dst.size)))
 
     return e, []
 
@@ -4599,49 +4599,49 @@ def pextrq(ir, instr, dst, src, imm):
 def unpckhps(_, instr, dst, src):
     e = []
     src = m2_expr.ExprCompose(dst[64:96], src[64:96], dst[96:128], src[96:128])
-    e.append(m2_expr.ExprAff(dst, src))
+    e.append(m2_expr.ExprAssign(dst, src))
     return e, []
 
 
 def unpckhpd(_, instr, dst, src):
     e = []
     src = m2_expr.ExprCompose(dst[64:128], src[64:128])
-    e.append(m2_expr.ExprAff(dst, src))
+    e.append(m2_expr.ExprAssign(dst, src))
     return e, []
 
 
 def unpcklps(_, instr, dst, src):
     e = []
     src = m2_expr.ExprCompose(dst[0:32], src[0:32], dst[32:64], src[32:64])
-    e.append(m2_expr.ExprAff(dst, src))
+    e.append(m2_expr.ExprAssign(dst, src))
     return e, []
 
 
 def unpcklpd(_, instr, dst, src):
     e = []
     src = m2_expr.ExprCompose(dst[0:64], src[0:64])
-    e.append(m2_expr.ExprAff(dst, src))
+    e.append(m2_expr.ExprAssign(dst, src))
     return e, []
 
 
 def movlpd(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst[:64], src[:64]))
+    e.append(m2_expr.ExprAssign(dst[:64], src[:64]))
     return e, []
 
 
 def movlps(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst[:64], src[:64]))
+    e.append(m2_expr.ExprAssign(dst[:64], src[:64]))
     return e, []
 
 
 def movhpd(_, instr, dst, src):
     e = []
     if src.size == 64:
-        e.append(m2_expr.ExprAff(dst[64:128], src))
+        e.append(m2_expr.ExprAssign(dst[64:128], src))
     elif dst.size == 64:
-        e.append(m2_expr.ExprAff(dst, src[64:128]))
+        e.append(m2_expr.ExprAssign(dst, src[64:128]))
     else:
         raise RuntimeError("bad encoding!")
     return e, []
@@ -4649,25 +4649,25 @@ def movhpd(_, instr, dst, src):
 
 def movlhps(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst[64:128], src[:64]))
+    e.append(m2_expr.ExprAssign(dst[64:128], src[:64]))
     return e, []
 
 
 def movhlps(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst[:64], src[64:128]))
+    e.append(m2_expr.ExprAssign(dst[:64], src[64:128]))
     return e, []
 
 
 def movdq2q(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst, src[:64]))
+    e.append(m2_expr.ExprAssign(dst, src[:64]))
     return e, []
 
 
 def movq2dq(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst, src[:64].zeroExtend(dst.size)))
+    e.append(m2_expr.ExprAssign(dst, src[:64].zeroExtend(dst.size)))
     return e, []
 
 
@@ -4678,7 +4678,7 @@ def sqrt_gen(_, instr, dst, src, size):
         out.append(m2_expr.ExprOp('fsqrt',
                                   src[i * size: (i + 1) * size]))
     src = m2_expr.ExprCompose(*out)
-    e.append(m2_expr.ExprAff(dst, src))
+    e.append(m2_expr.ExprAssign(dst, src))
     return e, []
 
 
@@ -4692,7 +4692,7 @@ def sqrtps(ir, instr, dst, src):
 
 def sqrtsd(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst[:64],
+    e.append(m2_expr.ExprAssign(dst[:64],
                              m2_expr.ExprOp('fsqrt',
                                             src[:64])))
     return e, []
@@ -4700,7 +4700,7 @@ def sqrtsd(_, instr, dst, src):
 
 def sqrtss(_, instr, dst, src):
     e = []
-    e.append(m2_expr.ExprAff(dst[:32],
+    e.append(m2_expr.ExprAssign(dst[:32],
                              m2_expr.ExprOp('fsqrt',
                                             src[:32])))
     return e, []
@@ -4712,14 +4712,14 @@ def pmovmskb(_, instr, dst, src):
     for i in xrange(src.size / 8):
         out.append(src[8 * i + 7:8 * (i + 1)])
     src = m2_expr.ExprCompose(*out)
-    e.append(m2_expr.ExprAff(dst, src.zeroExtend(dst.size)))
+    e.append(m2_expr.ExprAssign(dst, src.zeroExtend(dst.size)))
     return e, []
 
 
 def smsw(ir, instr, dst):
     e = []
     LOG_X86_SEM.warning("DEFAULT SMSW %s!!", str(dst))
-    e.append(m2_expr.ExprAff(dst, m2_expr.ExprInt(0x80050033, 32)[:dst.size]))
+    e.append(m2_expr.ExprAssign(dst, m2_expr.ExprInt(0x80050033, 32)[:dst.size]))
     return e, []
 
 
@@ -4744,7 +4744,7 @@ def palignr(ir, instr, dst, src, imm):
             dst[:shift],
         )
 
-    return [m2_expr.ExprAff(dst, result)], []
+    return [m2_expr.ExprAssign(dst, result)], []
 
 
 def _signed_saturation(expr, dst_size):
@@ -4816,7 +4816,7 @@ def packsswb(ir, instr, dst, src):
     for source in [dst, src]:
         for start in xrange(0, dst.size, 16):
             out.append(_signed_saturation(source[start:start + 16], 8))
-    return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out))], []
 
 
 def packssdw(ir, instr, dst, src):
@@ -4824,7 +4824,7 @@ def packssdw(ir, instr, dst, src):
     for source in [dst, src]:
         for start in xrange(0, dst.size, 32):
             out.append(_signed_saturation(source[start:start + 32], 16))
-    return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out))], []
 
 
 def packuswb(ir, instr, dst, src):
@@ -4832,7 +4832,7 @@ def packuswb(ir, instr, dst, src):
     for source in [dst, src]:
         for start in xrange(0, dst.size, 16):
             out.append(_unsigned_saturation(source[start:start + 16], 8))
-    return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out))], []
 
 
 def _saturation_sub_unsigned(expr):
@@ -4912,7 +4912,7 @@ def maskmovq(ir, instr, src, mask):
         cur_label = check_labels[i]
         next_check_label = check_labels[i + 1] if (i + 1) < len(check_labels) else loc_next_expr
         write_label = write_labels[i]
-        check = m2_expr.ExprAff(ir.IRDst,
+        check = m2_expr.ExprAssign(ir.IRDst,
                                 m2_expr.ExprCond(bit,
                                                  write_label,
                                                  next_check_label))
@@ -4926,13 +4926,13 @@ def maskmovq(ir, instr, src, mask):
         write_addr = dst_addr + m2_expr.ExprInt(i, dst_addr.size)
 
         # @8[DI/EDI/RDI + i] = src[byte i]
-        write_mem = m2_expr.ExprAff(m2_expr.ExprMem(write_addr, 8),
+        write_mem = m2_expr.ExprAssign(m2_expr.ExprMem(write_addr, 8),
                                     src[start: start + 8])
-        jump = m2_expr.ExprAff(ir.IRDst, next_check_label)
+        jump = m2_expr.ExprAssign(ir.IRDst, next_check_label)
         blks.append(IRBlock(cur_label.loc_key, [AssignBlock([write_mem, jump], instr)]))
 
     # If mask is null, bypass all
-    e = [m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(mask,
+    e = [m2_expr.ExprAssign(ir.IRDst, m2_expr.ExprCond(mask,
                                                     check_labels[0],
                                                     loc_next_expr))]
     return e, blks
@@ -4945,7 +4945,7 @@ def emms(ir, instr):
 # Common value without too many option, 0x1fa0
 STMXCSR_VALUE = 0x1fa0
 def stmxcsr(ir, instr, dst):
-    return [m2_expr.ExprAff(dst, m2_expr.ExprInt(STMXCSR_VALUE, dst.size))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprInt(STMXCSR_VALUE, dst.size))], []
 
 def ldmxcsr(ir, instr, dst):
     # Implemented as a NOP
@@ -4977,7 +4977,7 @@ def shufps(ir, instr, dst, src, imm8):
         else:
             source = src
         out.append(_select4(source, (control >> (i * 2)) & 3))
-    return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out))], []
 
 
 def shufpd(ir, instr, dst, src, imm8):
@@ -4985,19 +4985,19 @@ def shufpd(ir, instr, dst, src, imm8):
     control = int(imm8)
     out.append(dst[64:] if control & 1 else dst[:64])
     out.append(src[64:] if control & 2 else src[:64])
-    return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out))], []
 
 def movmskps(ir, instr, dst, src):
     out = []
     for i in xrange(4):
         out.append(src[(32 * i) + 31:(32 * i) + 32])
-    return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out).zeroExtend(dst.size))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out).zeroExtend(dst.size))], []
 
 def movmskpd(ir, instr, dst, src):
     out = []
     for i in xrange(2):
         out.append(src[(64 * i) + 63:(64 * i) + 64])
-    return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out).zeroExtend(dst.size))], []
+    return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out).zeroExtend(dst.size))], []
 
 
 mnemo_func = {'mov': mov,
@@ -5692,17 +5692,17 @@ class ir_x86_16(IntermediateRepresentation):
                         for irblock in extra_ir]
 
         cond_bloc = []
-        cond_bloc.append(m2_expr.ExprAff(c_reg,
+        cond_bloc.append(m2_expr.ExprAssign(c_reg,
                                          c_reg - m2_expr.ExprInt(1,
                                                                  c_reg.size)))
-        cond_bloc.append(m2_expr.ExprAff(self.IRDst, m2_expr.ExprCond(c_cond,
+        cond_bloc.append(m2_expr.ExprAssign(self.IRDst, m2_expr.ExprCond(c_cond,
                                                                       loc_skip_expr,
                                                                       loc_do_expr)))
         cond_bloc = IRBlock(loc_end, [AssignBlock(cond_bloc, instr)])
         e_do = instr_ir
 
         c = IRBlock(loc_do, [AssignBlock(e_do, instr)])
-        e_n = [m2_expr.ExprAff(self.IRDst, m2_expr.ExprCond(c_reg, loc_do_expr,
+        e_n = [m2_expr.ExprAssign(self.IRDst, m2_expr.ExprCond(c_reg, loc_do_expr,
                                                             loc_skip_expr))]
         return e_n, [cond_bloc, c] + new_extra_ir
 
@@ -5712,7 +5712,7 @@ class ir_x86_16(IntermediateRepresentation):
     def expraff_fix_regs_for_mode(self, e, mode=64):
         dst = self.expr_fix_regs_for_mode(e.dst, mode)
         src = self.expr_fix_regs_for_mode(e.src, mode)
-        return m2_expr.ExprAff(dst, src)
+        return m2_expr.ExprAssign(dst, src)
 
     def irbloc_fix_regs_for_mode(self, irblock, mode=64):
         irs = []
@@ -5771,7 +5771,7 @@ class ir_x86_64(ir_x86_16):
             if dst != self.pc:
                 dst = dst.replace_expr(pc_fixed)
             src = src.replace_expr(pc_fixed)
-            instr_ir[i] = m2_expr.ExprAff(dst, src)
+            instr_ir[i] = m2_expr.ExprAssign(dst, src)
 
         for idx, irblock in enumerate(extra_ir):
             extra_ir[idx] = irblock.modify_exprs(lambda expr: expr.replace_expr(pc_fixed) \
diff --git a/miasm2/core/sembuilder.py b/miasm2/core/sembuilder.py
index ab1af953..67c6c257 100644
--- a/miasm2/core/sembuilder.py
+++ b/miasm2/core/sembuilder.py
@@ -161,7 +161,7 @@ class SemBuilder(object):
         """Recursive function transforming a @body to a block expression
         Return:
          - AST to append to body (real python statements)
-         - a list of blocks, ie list of affblock, ie list of ExprAff (AST)"""
+         - a list of blocks, ie list of affblock, ie list of ExprAssign (AST)"""
 
         # Init
         ## Real instructions
@@ -188,7 +188,7 @@ class SemBuilder(object):
 
                 dst.ctx = ast.Load()
 
-                res = ast.Call(func=ast.Name(id='ExprAff',
+                res = ast.Call(func=ast.Name(id='ExprAssign',
                                              ctx=ast.Load()),
                                args=[dst, src],
                                keywords=[],
@@ -230,7 +230,7 @@ class SemBuilder(object):
                 IRDst = ast.Attribute(value=ast.Name(id='ir',
                                                      ctx=ast.Load()),
                                       attr='IRDst', ctx=ast.Load())
-                blocks[-1][-1].append(ast.Call(func=ast.Name(id='ExprAff',
+                blocks[-1][-1].append(ast.Call(func=ast.Name(id='ExprAssign',
                                                              ctx=ast.Load()),
                                                args=[IRDst, dst],
                                                keywords=[],
@@ -248,7 +248,7 @@ class SemBuilder(object):
                         raise RuntimeError("Imbricated if unimplemented")
 
                     ## Close the last block
-                    jmp_end = ast.Call(func=ast.Name(id='ExprAff',
+                    jmp_end = ast.Call(func=ast.Name(id='ExprAssign',
                                                      ctx=ast.Load()),
                                        args=[IRDst, loc_end],
                                        keywords=[],
diff --git a/miasm2/expression/expression.py b/miasm2/expression/expression.py
index d617a8fa..58ebda60 100644
--- a/miasm2/expression/expression.py
+++ b/miasm2/expression/expression.py
@@ -20,7 +20,7 @@
 #  - ExprInt
 #  - ExprId
 #  - ExprLoc
-#  - ExprAff
+#  - ExprAssign
 #  - ExprCond
 #  - ExprMem
 #  - ExprOp
@@ -50,7 +50,7 @@ TOK_POS_STRICT = "Spos"
 EXPRINT = 1
 EXPRID = 2
 EXPRLOC = 3
-EXPRAFF = 4
+EXPRASSIGN = 4
 EXPRCOND = 5
 EXPRMEM = 6
 EXPROP = 7
@@ -675,9 +675,9 @@ class ExprLoc(Expr):
         return True
 
 
-class ExprAff(Expr):
+class ExprAssign(Expr):
 
-    """An ExprAff represent an affection from an Expression to another one.
+    """An ExprAssign represent an affection from an Expression to another one.
 
     Some use cases:
      - var1 <- 2
@@ -686,7 +686,7 @@ class ExprAff(Expr):
     __slots__ = Expr.__slots__ + ["_dst", "_src"]
 
     def __init__(self, dst, src):
-        """Create an ExprAff for dst <- src
+        """Create an ExprAssign for dst <- src
         @dst: Expr, affectation destination
         @src: Expr, affectation source
         """
@@ -696,10 +696,10 @@ class ExprAff(Expr):
 
         if dst.size != src.size:
             raise ValueError(
-                "sanitycheck: ExprAff args must have same size! %s" %
+                "sanitycheck: ExprAssign args must have same size! %s" %
                 ([(str(arg), arg.size) for arg in [dst, src]]))
 
-        super(ExprAff, self).__init__(self.dst.size)
+        super(ExprAssign, self).__init__(self.dst.size)
 
     dst = property(lambda self: self._dst)
     src = property(lambda self: self._src)
@@ -743,7 +743,7 @@ class ExprAff(Expr):
             return self._dst.get_w()
 
     def _exprhash(self):
-        return hash((EXPRAFF, hash(self._dst), hash(self._src)))
+        return hash((EXPRASSIGN, hash(self._dst), hash(self._src)))
 
     def _exprrepr(self):
         return "%s(%r, %r)" % (self.__class__.__name__, self._dst, self._src)
@@ -759,10 +759,10 @@ class ExprAff(Expr):
         if dst == self._dst and src == self._src:
             return self
         else:
-            return ExprAff(dst, src)
+            return ExprAssign(dst, src)
 
     def copy(self):
-        return ExprAff(self._dst.copy(), self._src.copy())
+        return ExprAssign(self._dst.copy(), self._src.copy())
 
     def depth(self):
         return max(self._src.depth(), self._dst.depth()) + 1
@@ -777,6 +777,17 @@ class ExprAff(Expr):
         return True
 
 
+class ExprAff(ExprAssign):
+    """
+    DEPRECATED class.
+    Use ExprAssign instead of ExprAff
+    """
+
+    def __init__(self, dst, src):
+        warnings.warn('DEPRECATION WARNING: use ExprAssign instead of ExprAff')
+        super(ExprAff, self).__init__(dst, src)
+
+
 class ExprCond(Expr):
 
     """An ExprCond stand for a condition on an Expr
@@ -1402,9 +1413,9 @@ def compare_exprs(expr1, expr2):
         if ret:
             return ret
         return cmp(expr1.size, expr2.size)
-    elif cls1 == ExprAff:
+    elif cls1 == ExprAssign:
         raise NotImplementedError(
-            "Comparaison from an ExprAff not yet implemented")
+            "Comparaison from an ExprAssign not yet implemented")
     elif cls2 == ExprCond:
         ret = compare_exprs(expr1.cond, expr2.cond)
         if ret:
diff --git a/miasm2/expression/expression_helper.py b/miasm2/expression/expression_helper.py
index 5de9e04f..7db41394 100644
--- a/miasm2/expression/expression_helper.py
+++ b/miasm2/expression/expression_helper.py
@@ -515,7 +515,7 @@ class CondConstraintZero(CondConstraint):
     operator = m2_expr.TOK_EQUAL
 
     def to_constraint(self):
-        return m2_expr.ExprAff(self.expr, m2_expr.ExprInt(0, self.expr.size))
+        return m2_expr.ExprAssign(self.expr, m2_expr.ExprInt(0, self.expr.size))
 
 
 class CondConstraintNotZero(CondConstraint):
@@ -525,7 +525,7 @@ class CondConstraintNotZero(CondConstraint):
 
     def to_constraint(self):
         cst1, cst2 = m2_expr.ExprInt(0, 1), m2_expr.ExprInt(1, 1)
-        return m2_expr.ExprAff(cst1, m2_expr.ExprCond(self.expr, cst1, cst2))
+        return m2_expr.ExprAssign(cst1, m2_expr.ExprCond(self.expr, cst1, cst2))
 
 
 ConstrainedValue = collections.namedtuple("ConstrainedValue",
@@ -568,7 +568,7 @@ def possible_values(expr):
                                          m2_expr.ExprMem(consval.value,
                                                          expr.size))
                         for consval in possible_values(expr.arg))
-    elif isinstance(expr, m2_expr.ExprAff):
+    elif isinstance(expr, m2_expr.ExprAssign):
         consvals.update(possible_values(expr.src))
     # Special case: constraint insertion
     elif isinstance(expr, m2_expr.ExprCond):
diff --git a/miasm2/expression/parser.py b/miasm2/expression/parser.py
index cbfd58d0..71efc849 100644
--- a/miasm2/expression/parser.py
+++ b/miasm2/expression/parser.py
@@ -1,6 +1,6 @@
 import pyparsing
 from miasm2.expression.expression import ExprInt, ExprId, ExprLoc, ExprSlice, \
-    ExprMem, ExprCond, ExprCompose, ExprOp, ExprAff, LocKey
+    ExprMem, ExprCond, ExprCompose, ExprOp, ExprAssign, LocKey
 
 integer = pyparsing.Word(pyparsing.nums).setParseAction(lambda t:
                                                         int(t[0]))
@@ -22,7 +22,7 @@ STR_EXPRMEM = pyparsing.Suppress("ExprMem")
 STR_EXPRCOND = pyparsing.Suppress("ExprCond")
 STR_EXPRCOMPOSE = pyparsing.Suppress("ExprCompose")
 STR_EXPROP = pyparsing.Suppress("ExprOp")
-STR_EXPRAFF = pyparsing.Suppress("ExprAff")
+STR_EXPRASSIGN = pyparsing.Suppress("ExprAssign")
 
 LOCKEY = pyparsing.Suppress("LocKey")
 
@@ -51,7 +51,7 @@ expr_mem = STR_EXPRMEM + LPARENTHESIS + expr + STR_COMMA + str_int + RPARENTHESI
 expr_cond = STR_EXPRCOND + LPARENTHESIS + expr + STR_COMMA + expr + STR_COMMA + expr + RPARENTHESIS
 expr_compose = STR_EXPRCOMPOSE + LPARENTHESIS + pyparsing.delimitedList(expr, delim=',') + RPARENTHESIS
 expr_op = STR_EXPROP + LPARENTHESIS + string + STR_COMMA + pyparsing.delimitedList(expr, delim=',') + RPARENTHESIS
-expr_aff = STR_EXPRAFF + LPARENTHESIS + expr + STR_COMMA + expr + RPARENTHESIS
+expr_aff = STR_EXPRASSIGN + LPARENTHESIS + expr + STR_COMMA + expr + RPARENTHESIS
 
 expr << (expr_int | expr_id | expr_loc | expr_slice | expr_mem | expr_cond | \
          expr_compose | expr_op | expr_aff)
@@ -69,7 +69,7 @@ expr_mem.setParseAction(lambda t: ExprMem(*t))
 expr_cond.setParseAction(lambda t: ExprCond(*t))
 expr_compose.setParseAction(lambda t: ExprCompose(*t))
 expr_op.setParseAction(lambda t: ExprOp(*t))
-expr_aff.setParseAction(lambda t: ExprAff(*t))
+expr_aff.setParseAction(lambda t: ExprAssign(*t))
 
 
 def str_to_expr(str_in):
diff --git a/miasm2/ir/analysis.py b/miasm2/ir/analysis.py
index d49f6b4e..9158aceb 100644
--- a/miasm2/ir/analysis.py
+++ b/miasm2/ir/analysis.py
@@ -4,7 +4,7 @@ import warnings
 import logging
 
 from miasm2.ir.ir import IntermediateRepresentation, AssignBlock
-from miasm2.expression.expression import ExprOp, ExprAff
+from miasm2.expression.expression import ExprOp, ExprAssign
 from miasm2.analysis.data_flow import dead_simp as new_dead_simp_imp
 
 
@@ -45,8 +45,8 @@ class ira(IntermediateRepresentation):
 
         call_assignblk = AssignBlock(
             [
-                ExprAff(self.ret_reg, ExprOp('call_func_ret', addr, self.sp)),
-                ExprAff(self.sp, ExprOp('call_func_stack', addr, self.sp))
+                ExprAssign(self.ret_reg, ExprOp('call_func_ret', addr, self.sp)),
+                ExprAssign(self.sp, ExprOp('call_func_stack', addr, self.sp))
             ],
             instr
         )
diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py
index db47d4ef..a77ce992 100644
--- a/miasm2/ir/ir.py
+++ b/miasm2/ir/ir.py
@@ -58,7 +58,7 @@ class AssignBlock(object):
 
     def __init__(self, irs=None, instr=None):
         """Create a new AssignBlock
-        @irs: (optional) sequence of ExprAff, or dictionnary dst (Expr) -> src
+        @irs: (optional) sequence of ExprAssign, or dictionnary dst (Expr) -> src
               (Expr)
         @instr: (optional) associate an instruction with this AssignBlock
 
@@ -66,7 +66,7 @@ class AssignBlock(object):
         if irs is None:
             irs = []
         self._instr = instr
-        self._assigns = {} # ExprAff.dst -> ExprAff.src
+        self._assigns = {} # ExprAssign.dst -> ExprAssign.src
 
         # Concurrent assignments are handled in _set
         if hasattr(irs, "iteritems"):
@@ -250,10 +250,10 @@ class AssignBlock(object):
             out.append("%s = %s" % (dst, src))
         return "\n".join(out)
 
-    def dst2ExprAff(self, dst):
-        """Return an ExprAff corresponding to @dst equation
+    def dst2ExprAssign(self, dst):
+        """Return an ExprAssign corresponding to @dst equation
         @dst: Expr instance"""
-        return m2_expr.ExprAff(dst, self[dst])
+        return m2_expr.ExprAssign(dst, self[dst])
 
     def simplify(self, simplifier):
         """
diff --git a/miasm2/ir/translators/C.py b/miasm2/ir/translators/C.py
index 71f42636..1146dce6 100644
--- a/miasm2/ir/translators/C.py
+++ b/miasm2/ir/translators/C.py
@@ -77,7 +77,7 @@ class TranslatorC(Translator):
         value, int_size = int_size_to_bn(offset, 64)
         return 'bignum_from_string("%s", %d)' % (value, int_size)
 
-    def from_ExprAff(self, expr):
+    def from_ExprAssign(self, expr):
         new_dst = self.from_expr(expr.dst)
         new_src = self.from_expr(expr.src)
         return "%s = %s" % (new_dst, new_src)
diff --git a/miasm2/ir/translators/miasm.py b/miasm2/ir/translators/miasm.py
index b390eb51..d8509d24 100644
--- a/miasm2/ir/translators/miasm.py
+++ b/miasm2/ir/translators/miasm.py
@@ -30,8 +30,8 @@ class TranslatorMiasm(Translator):
         args = ["%s" % self.from_expr(arg) for arg in expr.args]
         return "ExprCompose(%s)" % ", ".join(args)
 
-    def from_ExprAff(self, expr):
-        return "ExprAff(%s, %s)" % (self.from_expr(expr.dst),
+    def from_ExprAssign(self, expr):
+        return "ExprAssign(%s, %s)" % (self.from_expr(expr.dst),
                                     self.from_expr(expr.src))
 
     def from_ExprMem(self, expr):
diff --git a/miasm2/ir/translators/python.py b/miasm2/ir/translators/python.py
index e05f5e4d..c6eb0ba8 100644
--- a/miasm2/ir/translators/python.py
+++ b/miasm2/ir/translators/python.py
@@ -74,7 +74,7 @@ class TranslatorPython(Translator):
 
         raise NotImplementedError("Unknown operator: %s" % expr.op)
 
-    def from_ExprAff(self, expr):
+    def from_ExprAssign(self, expr):
         return "%s = %s" % tuple(map(self.from_expr, (expr.dst, expr.src)))
 
 
diff --git a/miasm2/ir/translators/smt2.py b/miasm2/ir/translators/smt2.py
index f285c92a..408eb53f 100644
--- a/miasm2/ir/translators/smt2.py
+++ b/miasm2/ir/translators/smt2.py
@@ -278,7 +278,7 @@ class TranslatorSMT2(Translator):
 
         return res
 
-    def from_ExprAff(self, expr):
+    def from_ExprAssign(self, expr):
         src = self.from_expr(expr.src)
         dst = self.from_expr(expr.dst)
         return smt2_assert(smt2_eq(src, dst))
diff --git a/miasm2/ir/translators/translator.py b/miasm2/ir/translators/translator.py
index 557fdabe..a56c6a62 100644
--- a/miasm2/ir/translators/translator.py
+++ b/miasm2/ir/translators/translator.py
@@ -83,9 +83,9 @@ class Translator(object):
         """
         raise NotImplementedError("Abstract method")
 
-    def from_ExprAff(self, expr):
-        """Translate an ExprAff
-        @expr: ExprAff to translate
+    def from_ExprAssign(self, expr):
+        """Translate an ExprAssign
+        @expr: ExprAssign to translate
         """
         raise NotImplementedError("Abstract method")
 
@@ -111,7 +111,7 @@ class Translator(object):
                     m2_expr.ExprSlice: self.from_ExprSlice,
                     m2_expr.ExprOp: self.from_ExprOp,
                     m2_expr.ExprMem: self.from_ExprMem,
-                    m2_expr.ExprAff: self.from_ExprAff,
+                    m2_expr.ExprAssign: self.from_ExprAssign,
                     m2_expr.ExprCond: self.from_ExprCond
                     }
         for target, handler in handlers.iteritems():
diff --git a/miasm2/ir/translators/z3_ir.py b/miasm2/ir/translators/z3_ir.py
index a481acd7..97a0397a 100644
--- a/miasm2/ir/translators/z3_ir.py
+++ b/miasm2/ir/translators/z3_ir.py
@@ -239,7 +239,7 @@ class TranslatorZ3(Translator):
 
         return res
 
-    def from_ExprAff(self, expr):
+    def from_ExprAssign(self, expr):
         src = self.from_expr(expr.src)
         dst = self.from_expr(expr.dst)
         return (src == dst)
diff --git a/test/analysis/data_flow.py b/test/analysis/data_flow.py
index d0dbbd8d..53c9b01b 100644
--- a/test/analysis/data_flow.py
+++ b/test/analysis/data_flow.py
@@ -1,5 +1,5 @@
 """ Test cases for dead code elimination"""
-from miasm2.expression.expression import ExprId, ExprInt, ExprAff, ExprMem
+from miasm2.expression.expression import ExprId, ExprInt, ExprAssign, ExprMem
 from miasm2.core.locationdb import LocationDB
 from miasm2.analysis.data_flow import *
 from miasm2.ir.analysis import ira
@@ -83,9 +83,9 @@ IRA = IRATest(loc_db)
 
 G1_IRA = IRA.new_ircfg()
 
-G1_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)], [ExprAff(b, CST2)]])
-G1_IRB1 = gen_irblock(LBL1, [[ExprAff(a, b)]])
-G1_IRB2 = gen_irblock(LBL2, [[ExprAff(r, a)]])
+G1_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)], [ExprAssign(b, CST2)]])
+G1_IRB1 = gen_irblock(LBL1, [[ExprAssign(a, b)]])
+G1_IRB2 = gen_irblock(LBL2, [[ExprAssign(r, a)]])
 
 for irb in [G1_IRB0, G1_IRB1, G1_IRB2]:
     G1_IRA.add_irblock(irb)
@@ -96,9 +96,9 @@ G1_IRA.add_uniq_edge(G1_IRB1.loc_key, G1_IRB2.loc_key)
 # Expected output for graph 1
 G1_EXP_IRA = IRA.new_ircfg()
 
-G1_EXP_IRB0 = gen_irblock(LBL0, [[], [ExprAff(b, CST2)]])
-G1_EXP_IRB1 = gen_irblock(LBL1, [[ExprAff(a, b)]])
-G1_EXP_IRB2 = gen_irblock(LBL2, [[ExprAff(r, a)]])
+G1_EXP_IRB0 = gen_irblock(LBL0, [[], [ExprAssign(b, CST2)]])
+G1_EXP_IRB1 = gen_irblock(LBL1, [[ExprAssign(a, b)]])
+G1_EXP_IRB2 = gen_irblock(LBL2, [[ExprAssign(r, a)]])
 
 for irb in [G1_EXP_IRB0, G1_EXP_IRB1, G1_EXP_IRB2]:
     G1_EXP_IRA.add_irblock(irb)
@@ -107,9 +107,9 @@ for irb in [G1_EXP_IRB0, G1_EXP_IRB1, G1_EXP_IRB2]:
 
 G2_IRA = IRA.new_ircfg()
 
-G2_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)], [ExprAff(r, CST1)]])
-G2_IRB1 = gen_irblock(LBL1, [[ExprAff(a, a+CST1)]])
-G2_IRB2 = gen_irblock(LBL2, [[ExprAff(a, r)]])
+G2_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)], [ExprAssign(r, CST1)]])
+G2_IRB1 = gen_irblock(LBL1, [[ExprAssign(a, a+CST1)]])
+G2_IRB2 = gen_irblock(LBL2, [[ExprAssign(a, r)]])
 
 for irb in [G2_IRB0, G2_IRB1, G2_IRB2]:
     G2_IRA.add_irblock(irb)
@@ -121,7 +121,7 @@ G2_IRA.add_uniq_edge(G2_IRB1.loc_key, G2_IRB1.loc_key)
 # Expected output for graph 2
 G2_EXP_IRA = IRA.new_ircfg()
 
-G2_EXP_IRB0 = gen_irblock(LBL0, [[], [ExprAff(r, CST1)]])
+G2_EXP_IRB0 = gen_irblock(LBL0, [[], [ExprAssign(r, CST1)]])
 G2_EXP_IRB1 = gen_irblock(LBL1, [[]])
 G2_EXP_IRB2 = gen_irblock(LBL2, [[]])
 
@@ -132,9 +132,9 @@ for irb in [G2_EXP_IRB0, G2_EXP_IRB1, G2_EXP_IRB2]:
 
 G3_IRA = IRA.new_ircfg()
 
-G3_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)]])
-G3_IRB1 = gen_irblock(LBL1, [[ExprAff(a, a+CST1)]])
-G3_IRB2 = gen_irblock(LBL2, [[ExprAff(r, a)]])
+G3_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)]])
+G3_IRB1 = gen_irblock(LBL1, [[ExprAssign(a, a+CST1)]])
+G3_IRB2 = gen_irblock(LBL2, [[ExprAssign(r, a)]])
 
 for irb in [G3_IRB0, G3_IRB1, G3_IRB2]:
     G3_IRA.add_irblock(irb)
@@ -146,9 +146,9 @@ G3_IRA.add_uniq_edge(G3_IRB1.loc_key, G3_IRB1.loc_key)
 # Expected output for graph 3
 G3_EXP_IRA = IRA.new_ircfg()
 
-G3_EXP_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)]])
-G3_EXP_IRB1 = gen_irblock(LBL1, [[ExprAff(a, a+CST1)]])
-G3_EXP_IRB2 = gen_irblock(LBL2, [[ExprAff(r, a)]])
+G3_EXP_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)]])
+G3_EXP_IRB1 = gen_irblock(LBL1, [[ExprAssign(a, a+CST1)]])
+G3_EXP_IRB2 = gen_irblock(LBL2, [[ExprAssign(r, a)]])
 
 for irb in [G3_EXP_IRB0, G3_EXP_IRB1, G3_EXP_IRB2]:
     G3_EXP_IRA.add_irblock(irb)
@@ -157,10 +157,10 @@ for irb in [G3_EXP_IRB0, G3_EXP_IRB1, G3_EXP_IRB2]:
 
 G4_IRA = IRA.new_ircfg()
 
-G4_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)]])
-G4_IRB1 = gen_irblock(LBL1, [[ExprAff(a, a+CST1)]])
-G4_IRB2 = gen_irblock(LBL2, [[ExprAff(a, a+CST2)]])
-G4_IRB3 = gen_irblock(LBL3, [[ExprAff(a, CST3)], [ExprAff(r, a)]])
+G4_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)]])
+G4_IRB1 = gen_irblock(LBL1, [[ExprAssign(a, a+CST1)]])
+G4_IRB2 = gen_irblock(LBL2, [[ExprAssign(a, a+CST2)]])
+G4_IRB3 = gen_irblock(LBL3, [[ExprAssign(a, CST3)], [ExprAssign(r, a)]])
 
 for irb in [G4_IRB0, G4_IRB1, G4_IRB2, G4_IRB3]:
     G4_IRA.add_irblock(irb)
@@ -176,7 +176,7 @@ G4_EXP_IRA = IRA.new_ircfg()
 G4_EXP_IRB0 = gen_irblock(LBL0, [[]])
 G4_EXP_IRB1 = gen_irblock(LBL1, [[]])
 G4_EXP_IRB2 = gen_irblock(LBL2, [[]])
-G4_EXP_IRB3 = gen_irblock(LBL3, [[ExprAff(a, CST3)], [ExprAff(r, a)]])
+G4_EXP_IRB3 = gen_irblock(LBL3, [[ExprAssign(a, CST3)], [ExprAssign(r, a)]])
 
 for irb in [G4_EXP_IRB0, G4_EXP_IRB1, G4_EXP_IRB2, G4_EXP_IRB3]:
     G4_EXP_IRA.add_irblock(irb)
@@ -185,12 +185,12 @@ for irb in [G4_EXP_IRB0, G4_EXP_IRB1, G4_EXP_IRB2, G4_EXP_IRB3]:
 
 G5_IRA = IRA.new_ircfg()
 
-G5_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)]])
-G5_IRB1 = gen_irblock(LBL1, [[ExprAff(r, CST2)]])
-G5_IRB2 = gen_irblock(LBL2, [[ExprAff(a, a+CST2)]])
-G5_IRB3 = gen_irblock(LBL3, [[ExprAff(a, a+CST3)]])
-G5_IRB4 = gen_irblock(LBL4, [[ExprAff(a, a+CST1)]])
-G5_IRB5 = gen_irblock(LBL5, [[ExprAff(a, r)]])
+G5_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)]])
+G5_IRB1 = gen_irblock(LBL1, [[ExprAssign(r, CST2)]])
+G5_IRB2 = gen_irblock(LBL2, [[ExprAssign(a, a+CST2)]])
+G5_IRB3 = gen_irblock(LBL3, [[ExprAssign(a, a+CST3)]])
+G5_IRB4 = gen_irblock(LBL4, [[ExprAssign(a, a+CST1)]])
+G5_IRB5 = gen_irblock(LBL5, [[ExprAssign(a, r)]])
 
 for irb in [G5_IRB0, G5_IRB1, G5_IRB2, G5_IRB3, G5_IRB4, G5_IRB5]:
     G5_IRA.add_irblock(irb)
@@ -207,7 +207,7 @@ G5_IRA.add_uniq_edge(G5_IRB4.loc_key, G5_IRB1.loc_key)
 G5_EXP_IRA = IRA.new_ircfg()
 
 G5_EXP_IRB0 = gen_irblock(LBL0, [[]])
-G5_EXP_IRB1 = gen_irblock(LBL1, [[ExprAff(r, CST2)]])
+G5_EXP_IRB1 = gen_irblock(LBL1, [[ExprAssign(r, CST2)]])
 G5_EXP_IRB2 = gen_irblock(LBL2, [[]])
 G5_EXP_IRB3 = gen_irblock(LBL3, [[]])
 G5_EXP_IRB4 = gen_irblock(LBL4, [[]])
@@ -222,10 +222,10 @@ for irb in [G5_EXP_IRB0, G5_EXP_IRB1, G5_EXP_IRB2,
 
 G6_IRA = IRA.new_ircfg()
 
-G6_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)]])
-G6_IRB1 = gen_irblock(LBL1, [[ExprAff(b, a)]])
-G6_IRB2 = gen_irblock(LBL2, [[ExprAff(a, b)]])
-G6_IRB3 = gen_irblock(LBL3, [[ExprAff(r, CST2)]])
+G6_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)]])
+G6_IRB1 = gen_irblock(LBL1, [[ExprAssign(b, a)]])
+G6_IRB2 = gen_irblock(LBL2, [[ExprAssign(a, b)]])
+G6_IRB3 = gen_irblock(LBL3, [[ExprAssign(r, CST2)]])
 
 for irb in [G6_IRB0, G6_IRB1, G6_IRB2, G6_IRB3]:
     G6_IRA.add_irblock(irb)
@@ -241,7 +241,7 @@ G6_EXP_IRA = IRA.new_ircfg()
 G6_EXP_IRB0 = gen_irblock(LBL0, [[]])
 G6_EXP_IRB1 = gen_irblock(LBL1, [[]])
 G6_EXP_IRB2 = gen_irblock(LBL2, [[]])
-G6_EXP_IRB3 = gen_irblock(LBL3, [[ExprAff(r, CST2)]])
+G6_EXP_IRB3 = gen_irblock(LBL3, [[ExprAssign(r, CST2)]])
 
 for irb in [G6_EXP_IRB0, G6_EXP_IRB1, G6_EXP_IRB2, G6_EXP_IRB3]:
     G6_EXP_IRA.add_irblock(irb)
@@ -250,10 +250,10 @@ for irb in [G6_EXP_IRB0, G6_EXP_IRB1, G6_EXP_IRB2, G6_EXP_IRB3]:
 
 G7_IRA = IRA.new_ircfg()
 
-G7_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)], [ExprAff(r, CST1)]])
-G7_IRB1 = gen_irblock(LBL1, [[ExprAff(a, a+CST1)]])
-G7_IRB2 = gen_irblock(LBL2, [[ExprAff(a, a+CST2)]])
-G7_IRB3 = gen_irblock(LBL3, [[ExprAff(a, r)]])
+G7_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)], [ExprAssign(r, CST1)]])
+G7_IRB1 = gen_irblock(LBL1, [[ExprAssign(a, a+CST1)]])
+G7_IRB2 = gen_irblock(LBL2, [[ExprAssign(a, a+CST2)]])
+G7_IRB3 = gen_irblock(LBL3, [[ExprAssign(a, r)]])
 
 for irb in [G7_IRB0, G7_IRB1, G7_IRB2, G7_IRB3]:
     G7_IRA.add_irblock(irb)
@@ -268,7 +268,7 @@ G7_IRA.add_uniq_edge(G7_IRB0.loc_key, G7_IRB2.loc_key)
 # Expected output for graph 7
 G7_EXP_IRA = IRA.new_ircfg()
 
-G7_EXP_IRB0 = gen_irblock(LBL0, [[], [ExprAff(r, CST1)]])
+G7_EXP_IRB0 = gen_irblock(LBL0, [[], [ExprAssign(r, CST1)]])
 G7_EXP_IRB1 = gen_irblock(LBL1, [[]])
 G7_EXP_IRB2 = gen_irblock(LBL2, [[]])
 G7_EXP_IRB3 = gen_irblock(LBL3, [[]])
@@ -280,10 +280,10 @@ for irb in [G7_EXP_IRB0, G7_EXP_IRB1, G7_EXP_IRB2, G7_EXP_IRB3]:
 
 G8_IRA = IRA.new_ircfg()
 
-G8_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)], [ExprAff(b, CST1)]])
-G8_IRB1 = gen_irblock(LBL1, [[ExprAff(a, a+CST1)]])
-G8_IRB2 = gen_irblock(LBL2, [[ExprAff(b, b+CST2)]])
-G8_IRB3 = gen_irblock(LBL3, [[ExprAff(a, b)]])
+G8_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)], [ExprAssign(b, CST1)]])
+G8_IRB1 = gen_irblock(LBL1, [[ExprAssign(a, a+CST1)]])
+G8_IRB2 = gen_irblock(LBL2, [[ExprAssign(b, b+CST2)]])
+G8_IRB3 = gen_irblock(LBL3, [[ExprAssign(a, b)]])
 
 
 for irb in [G8_IRB0, G8_IRB1, G8_IRB2, G8_IRB3]:
@@ -312,11 +312,11 @@ for irb in [G8_EXP_IRB0, G8_EXP_IRB1, G8_EXP_IRB2, G8_EXP_IRB3]:
 
 G9_IRA = IRA.new_ircfg()
 
-G9_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)], [ExprAff(b, CST1)]])
-G9_IRB1 = gen_irblock(LBL1, [[ExprAff(a, a+CST1)], [ExprAff(b, b+CST1)]])
-G9_IRB2 = gen_irblock(LBL2, [[ExprAff(a, a+CST2)], [ExprAff(b, b+CST2)]])
-G9_IRB3 = gen_irblock(LBL3, [[ExprAff(a, b)]])
-G9_IRB4 = gen_irblock(LBL4, [[ExprAff(r, a)], [ExprAff(r, b)]])
+G9_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)], [ExprAssign(b, CST1)]])
+G9_IRB1 = gen_irblock(LBL1, [[ExprAssign(a, a+CST1)], [ExprAssign(b, b+CST1)]])
+G9_IRB2 = gen_irblock(LBL2, [[ExprAssign(a, a+CST2)], [ExprAssign(b, b+CST2)]])
+G9_IRB3 = gen_irblock(LBL3, [[ExprAssign(a, b)]])
+G9_IRB4 = gen_irblock(LBL4, [[ExprAssign(r, a)], [ExprAssign(r, b)]])
 
 for irb in [G9_IRB0, G9_IRB1, G9_IRB2, G9_IRB3, G9_IRB4]:
     G9_IRA.add_irblock(irb)
@@ -335,11 +335,11 @@ G9_IRA.add_uniq_edge(G9_IRB3.loc_key, G9_IRB4.loc_key)
 
 G9_EXP_IRA = IRA.new_ircfg()
 
-G9_EXP_IRB0 = gen_irblock(LBL0, [[], [ExprAff(b, CST1)]])
-G9_EXP_IRB1 = gen_irblock(LBL1, [[], [ExprAff(b, b+CST1)]])
-G9_EXP_IRB2 = gen_irblock(LBL2, [[], [ExprAff(b, b+CST2)]])
+G9_EXP_IRB0 = gen_irblock(LBL0, [[], [ExprAssign(b, CST1)]])
+G9_EXP_IRB1 = gen_irblock(LBL1, [[], [ExprAssign(b, b+CST1)]])
+G9_EXP_IRB2 = gen_irblock(LBL2, [[], [ExprAssign(b, b+CST2)]])
 G9_EXP_IRB3 = gen_irblock(LBL3, [[]])
-G9_EXP_IRB4 = gen_irblock(LBL4, [[], [ExprAff(r, b)]])
+G9_EXP_IRB4 = gen_irblock(LBL4, [[], [ExprAssign(r, b)]])
 
 for irb in [G9_EXP_IRB0, G9_EXP_IRB1, G9_EXP_IRB2, G9_EXP_IRB3, G9_EXP_IRB4]:
     G9_EXP_IRA.add_irblock(irb)
@@ -349,10 +349,10 @@ for irb in [G9_EXP_IRB0, G9_EXP_IRB1, G9_EXP_IRB2, G9_EXP_IRB3, G9_EXP_IRB4]:
 
 G10_IRA = IRA.new_ircfg()
 
-G10_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)]])
-G10_IRB1 = gen_irblock(LBL1, [[ExprAff(b, a)]])
-G10_IRB2 = gen_irblock(LBL2, [[ExprAff(a, b)]])
-G10_IRB3 = gen_irblock(LBL3, [[ExprAff(r, CST1)]])
+G10_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)]])
+G10_IRB1 = gen_irblock(LBL1, [[ExprAssign(b, a)]])
+G10_IRB2 = gen_irblock(LBL2, [[ExprAssign(a, b)]])
+G10_IRB3 = gen_irblock(LBL3, [[ExprAssign(r, CST1)]])
 
 for irb in [G10_IRB0, G10_IRB1, G10_IRB2, G10_IRB3]:
     G10_IRA.add_irblock(irb)
@@ -369,7 +369,7 @@ G10_EXP_IRA = IRA.new_ircfg()
 G10_EXP_IRB0 = gen_irblock(LBL0, [[]])
 G10_EXP_IRB1 = gen_irblock(LBL1, [[]])
 G10_EXP_IRB2 = gen_irblock(LBL2, [[]])
-G10_EXP_IRB3 = gen_irblock(LBL3, [[ExprAff(r, CST1)]])
+G10_EXP_IRB3 = gen_irblock(LBL3, [[ExprAssign(r, CST1)]])
 
 for irb in [G10_EXP_IRB0, G10_EXP_IRB1, G10_EXP_IRB2, G10_EXP_IRB3]:
     G10_EXP_IRA.add_irblock(irb)
@@ -378,11 +378,11 @@ for irb in [G10_EXP_IRB0, G10_EXP_IRB1, G10_EXP_IRB2, G10_EXP_IRB3]:
 
 G11_IRA = IRA.new_ircfg()
 
-G11_IRB0 = gen_irblock(LBL0, [[ExprAff(a, b)]])
-G11_IRB1 = gen_irblock(LBL1, [[ExprAff(b, a)]])
-G11_IRB2 = gen_irblock(LBL2, [[ExprAff(r, a)]])
-G11_IRB3 = gen_irblock(LBL3, [[ExprAff(a, a+CST1)]])
-G11_IRB4 = gen_irblock(LBL4, [[ExprAff(b, b+CST1)]])
+G11_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, b)]])
+G11_IRB1 = gen_irblock(LBL1, [[ExprAssign(b, a)]])
+G11_IRB2 = gen_irblock(LBL2, [[ExprAssign(r, a)]])
+G11_IRB3 = gen_irblock(LBL3, [[ExprAssign(a, a+CST1)]])
+G11_IRB4 = gen_irblock(LBL4, [[ExprAssign(b, b+CST1)]])
 
 
 for irb in [G11_IRB0, G11_IRB1, G11_IRB2]:
@@ -398,11 +398,11 @@ G11_IRA.add_uniq_edge(G11_IRB1.loc_key, G11_IRB2.loc_key)
 # Expected output for graph 11
 G11_EXP_IRA = IRA.new_ircfg()
 
-G11_EXP_IRB0 = gen_irblock(LBL0, [[ExprAff(a, b)]])
-G11_EXP_IRB1 = gen_irblock(LBL1, [[ExprAff(b, a)]])
-G11_EXP_IRB2 = gen_irblock(LBL2, [[ExprAff(r, a)]])
-#G11_EXP_IRB3 = gen_irblock(LBL3, [[ExprAff(a, a+CST1)]])
-#G11_EXP_IRB4 = gen_irblock(LBL4, [[ExprAff(b, b+CST1)]])
+G11_EXP_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, b)]])
+G11_EXP_IRB1 = gen_irblock(LBL1, [[ExprAssign(b, a)]])
+G11_EXP_IRB2 = gen_irblock(LBL2, [[ExprAssign(r, a)]])
+#G11_EXP_IRB3 = gen_irblock(LBL3, [[ExprAssign(a, a+CST1)]])
+#G11_EXP_IRB4 = gen_irblock(LBL4, [[ExprAssign(b, b+CST1)]])
 
 for irb in [G11_EXP_IRB0, G11_EXP_IRB1,
             G11_EXP_IRB2]:
@@ -413,12 +413,12 @@ for irb in [G11_EXP_IRB0, G11_EXP_IRB1,
 
 G12_IRA = IRA.new_ircfg()
 
-G12_IRB0 = gen_irblock(LBL0, [[ExprAff(r, CST1)], [ExprAff(a, CST2)]])
-G12_IRB1 = gen_irblock(LBL1, [[ExprAff(r, CST2)]])
-G12_IRB2 = gen_irblock(LBL2, [[ExprAff(r, a)], [ExprAff(b, CST3)]])
-G12_IRB3 = gen_irblock(LBL3, [[ExprAff(r, CST3)]])
-G12_IRB4 = gen_irblock(LBL4, [[ExprAff(r, CST2)]])
-G12_IRB5 = gen_irblock(LBL5, [[ExprAff(r, b)]])
+G12_IRB0 = gen_irblock(LBL0, [[ExprAssign(r, CST1)], [ExprAssign(a, CST2)]])
+G12_IRB1 = gen_irblock(LBL1, [[ExprAssign(r, CST2)]])
+G12_IRB2 = gen_irblock(LBL2, [[ExprAssign(r, a)], [ExprAssign(b, CST3)]])
+G12_IRB3 = gen_irblock(LBL3, [[ExprAssign(r, CST3)]])
+G12_IRB4 = gen_irblock(LBL4, [[ExprAssign(r, CST2)]])
+G12_IRB5 = gen_irblock(LBL5, [[ExprAssign(r, b)]])
 
 for irb in [G12_IRB0, G12_IRB1, G12_IRB2, G12_IRB3, G12_IRB4, G12_IRB5]:
     G12_IRA.add_irblock(irb)
@@ -433,11 +433,11 @@ G12_IRA.add_uniq_edge(G12_IRB4.loc_key, G12_IRB5.loc_key)
 G12_EXP_IRA = IRA.new_ircfg()
 
 G12_EXP_IRB0 = gen_irblock(LBL0, [[], []])
-G12_EXP_IRB1 = gen_irblock(LBL1, [[ExprAff(r, CST2)]])
-G12_EXP_IRB2 = gen_irblock(LBL2, [[], [ExprAff(b, CST3)]])
-G12_EXP_IRB3 = gen_irblock(LBL3, [[ExprAff(r, CST3)]])
+G12_EXP_IRB1 = gen_irblock(LBL1, [[ExprAssign(r, CST2)]])
+G12_EXP_IRB2 = gen_irblock(LBL2, [[], [ExprAssign(b, CST3)]])
+G12_EXP_IRB3 = gen_irblock(LBL3, [[ExprAssign(r, CST3)]])
 G12_EXP_IRB4 = gen_irblock(LBL4, [[]])
-G12_EXP_IRB5 = gen_irblock(LBL5, [[ExprAff(r, b)]])
+G12_EXP_IRB5 = gen_irblock(LBL5, [[ExprAssign(r, b)]])
 
 
 for irb in [G12_EXP_IRB0, G12_EXP_IRB1,
@@ -449,12 +449,12 @@ for irb in [G12_EXP_IRB0, G12_EXP_IRB1,
 
 G13_IRA = IRA.new_ircfg()
 
-G13_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)], [ExprAff(b, CST2)]])
-G13_IRB1 = gen_irblock(LBL1, [[ExprAff(r, b)]])
-G13_IRB2 = gen_irblock(LBL2, [[ExprAff(d, CST2)], [ExprAff(a, b+CST1),
-                                                   ExprAff(c, a+b)]])
+G13_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)], [ExprAssign(b, CST2)]])
+G13_IRB1 = gen_irblock(LBL1, [[ExprAssign(r, b)]])
+G13_IRB2 = gen_irblock(LBL2, [[ExprAssign(d, CST2)], [ExprAssign(a, b+CST1),
+                                                   ExprAssign(c, a+b)]])
 G13_IRB3 = gen_irblock(LBL3, [[]]) # lost son
-G13_IRB4 = gen_irblock(LBL4, [[ExprAff(b, CST2)]])
+G13_IRB4 = gen_irblock(LBL4, [[ExprAssign(b, CST2)]])
 
 for irb in [G13_IRB0, G13_IRB1, G13_IRB2, G13_IRB4]:
     G13_IRA.add_irblock(irb)
@@ -467,12 +467,12 @@ G13_IRA.add_uniq_edge(G13_IRB4.loc_key, G13_IRB2.loc_key)
 # Expected output for graph 13
 G13_EXP_IRA = IRA.new_ircfg()
 
-G13_EXP_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)], [ExprAff(b, CST2)]])
-G13_EXP_IRB1 = gen_irblock(LBL1, [[ExprAff(r, b)]])
-G13_EXP_IRB2 = gen_irblock(LBL2, [[ExprAff(d, CST2)], [ExprAff(a, b+CST1),
-                                                       ExprAff(c, a+b)]])
+G13_EXP_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)], [ExprAssign(b, CST2)]])
+G13_EXP_IRB1 = gen_irblock(LBL1, [[ExprAssign(r, b)]])
+G13_EXP_IRB2 = gen_irblock(LBL2, [[ExprAssign(d, CST2)], [ExprAssign(a, b+CST1),
+                                                       ExprAssign(c, a+b)]])
 G13_EXP_IRB3 = gen_irblock(LBL3, [[]])
-G13_EXP_IRB4 = gen_irblock(LBL4, [[ExprAff(b, CST2)]])
+G13_EXP_IRB4 = gen_irblock(LBL4, [[ExprAssign(b, CST2)]])
 
 for irb in [G13_EXP_IRB0, G13_EXP_IRB1, G13_EXP_IRB2, G13_EXP_IRB4]:
     G13_EXP_IRA.add_irblock(irb)
@@ -484,9 +484,9 @@ for irb in [G13_EXP_IRB0, G13_EXP_IRB1, G13_EXP_IRB2, G13_EXP_IRB4]:
 
 G14_IRA = IRA.new_ircfg()
 
-G14_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)], [ExprAff(c, a)],
-                              [ExprAff(a, CST2)]])
-G14_IRB1 = gen_irblock(LBL1, [[ExprAff(r, a+c)]])
+G14_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)], [ExprAssign(c, a)],
+                              [ExprAssign(a, CST2)]])
+G14_IRB1 = gen_irblock(LBL1, [[ExprAssign(r, a+c)]])
 
 for irb in [G14_IRB0, G14_IRB1]:
     G14_IRA.add_irblock(irb)
@@ -496,9 +496,9 @@ G14_IRA.add_uniq_edge(G14_IRB0.loc_key, G14_IRB1.loc_key)
 # Expected output for graph 1
 G14_EXP_IRA = IRA.new_ircfg()
 
-G14_EXP_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1)], [ExprAff(c, a)],
-                                  [ExprAff(a, CST2)]])
-G14_EXP_IRB1 = gen_irblock(LBL1, [[ExprAff(r, a+c)]])
+G14_EXP_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1)], [ExprAssign(c, a)],
+                                  [ExprAssign(a, CST2)]])
+G14_EXP_IRB1 = gen_irblock(LBL1, [[ExprAssign(r, a+c)]])
 
 for irb in [G14_EXP_IRB0, G14_EXP_IRB1]:
     G14_EXP_IRA.add_irblock(irb)
@@ -508,10 +508,10 @@ for irb in [G14_EXP_IRB0, G14_EXP_IRB1]:
 
 G15_IRA = IRA.new_ircfg()
 
-G15_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST2)], [ExprAff(a, CST1),
-                                                   ExprAff(b, a+CST2),
-                                                   ExprAff(c, CST1)]])
-G15_IRB1 = gen_irblock(LBL1, [[ExprAff(r, a)]])
+G15_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST2)], [ExprAssign(a, CST1),
+                                                   ExprAssign(b, a+CST2),
+                                                   ExprAssign(c, CST1)]])
+G15_IRB1 = gen_irblock(LBL1, [[ExprAssign(r, a)]])
 
 for irb in [G15_IRB0, G15_IRB1]:
     G15_IRA.add_irblock(irb)
@@ -521,8 +521,8 @@ G15_IRA.add_uniq_edge(G15_IRB0.loc_key, G15_IRB1.loc_key)
 # Expected output for graph 1
 G15_EXP_IRA = IRA.new_ircfg()
 
-G15_EXP_IRB0 = gen_irblock(LBL0, [[], [ExprAff(a, CST1)]])
-G15_EXP_IRB1 = gen_irblock(LBL1, [[ExprAff(r, a)]])
+G15_EXP_IRB0 = gen_irblock(LBL0, [[], [ExprAssign(a, CST1)]])
+G15_EXP_IRB1 = gen_irblock(LBL1, [[ExprAssign(r, a)]])
 
 for irb in [G15_EXP_IRB0, G15_EXP_IRB1]:
     G15_EXP_IRA.add_irblock(irb)
@@ -531,10 +531,10 @@ for irb in [G15_EXP_IRB0, G15_EXP_IRB1]:
 
 G16_IRA = IRA.new_ircfg()
 
-G16_IRB0 = gen_irblock(LBL0, [[ExprAff(a, CST1), ExprAff(b, CST2),
-                               ExprAff(c, CST3)], [ExprAff(a, c+CST1),
-                                                   ExprAff(b, c+CST2)]])
-G16_IRB1 = gen_irblock(LBL1, [[ExprAff(r, a+b)], [ExprAff(r, c+r)]])
+G16_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, CST1), ExprAssign(b, CST2),
+                               ExprAssign(c, CST3)], [ExprAssign(a, c+CST1),
+                                                   ExprAssign(b, c+CST2)]])
+G16_IRB1 = gen_irblock(LBL1, [[ExprAssign(r, a+b)], [ExprAssign(r, c+r)]])
 G16_IRB2 = gen_irblock(LBL2, [[]])
 
 for irb in [G16_IRB0, G16_IRB1]:
@@ -549,9 +549,9 @@ for irb in [G16_IRB0, G16_IRB1]:
 # Expected output for graph 1
 G16_EXP_IRA = IRA.new_ircfg()
 
-G16_EXP_IRB0 = gen_irblock(LBL0, [[ExprAff(c, CST3)], [ExprAff(a, c + CST1),
-                                                       ExprAff(b, c + CST2)]])
-G16_EXP_IRB1 = gen_irblock(LBL1, [[ExprAff(r, a+b)], [ExprAff(r, c+r)]])
+G16_EXP_IRB0 = gen_irblock(LBL0, [[ExprAssign(c, CST3)], [ExprAssign(a, c + CST1),
+                                                       ExprAssign(b, c + CST2)]])
+G16_EXP_IRB1 = gen_irblock(LBL1, [[ExprAssign(r, a+b)], [ExprAssign(r, c+r)]])
 
 for irb in [G16_EXP_IRB0, G16_EXP_IRB1]:
     G16_EXP_IRA.add_irblock(irb)
@@ -560,57 +560,57 @@ for irb in [G16_EXP_IRB0, G16_EXP_IRB1]:
 
 G17_IRA = IRA.new_ircfg()
 
-G17_IRB0 = gen_irblock(LBL0, [[ExprAff(a, a*b),
-                               ExprAff(b, c),
-                               ExprAff(c, CST1)],
+G17_IRB0 = gen_irblock(LBL0, [[ExprAssign(a, a*b),
+                               ExprAssign(b, c),
+                               ExprAssign(c, CST1)],
 
-                              [ExprAff(d, d+ CST2)],
+                              [ExprAssign(d, d+ CST2)],
 
-                              [ExprAff(a, CST1),
-                               ExprAff(b, a),
-                               ExprAff(c, b)],
+                              [ExprAssign(a, CST1),
+                               ExprAssign(b, a),
+                               ExprAssign(c, b)],
 
-                              [ExprAff(ExprMem(d+CST1, 32), a),
-                               ExprAff(a, b),
-                               ExprAff(b, c),
-                               ExprAff(c, CST1)],
+                              [ExprAssign(ExprMem(d+CST1, 32), a),
+                               ExprAssign(a, b),
+                               ExprAssign(b, c),
+                               ExprAssign(c, CST1)],
 
-                              [ExprAff(a, CST1),
-                               ExprAff(b, a),
-                               ExprAff(c, b)],
+                              [ExprAssign(a, CST1),
+                               ExprAssign(b, a),
+                               ExprAssign(c, b)],
 
-                              [ExprAff(ExprMem(d+CST2, 32), a),
-                               ExprAff(a, b),
-                               ExprAff(b, c),
-                               ExprAff(c, CST1)],
+                              [ExprAssign(ExprMem(d+CST2, 32), a),
+                               ExprAssign(a, b),
+                               ExprAssign(b, c),
+                               ExprAssign(c, CST1)],
 
 
-                              [ExprAff(a, CST2),
-                               ExprAff(b, a),
-                               ExprAff(c, b)],
+                              [ExprAssign(a, CST2),
+                               ExprAssign(b, a),
+                               ExprAssign(c, b)],
 
-                              [ExprAff(a, a+CST1)],
+                              [ExprAssign(a, a+CST1)],
 
-                              [ExprAff(d, a),
-                               ExprAff(a, d)],
+                              [ExprAssign(d, a),
+                               ExprAssign(a, d)],
 
-                              [ExprAff(d, d+CST1)],
+                              [ExprAssign(d, d+CST1)],
 
-                              [ExprAff(a, CST2),
-                               ExprAff(b, a),
-                               ExprAff(c, b)],
+                              [ExprAssign(a, CST2),
+                               ExprAssign(b, a),
+                               ExprAssign(c, b)],
 
-                              [ExprAff(a, a+CST2)],
+                              [ExprAssign(a, a+CST2)],
 
-                              [ExprAff(a, CST2),
-                               ExprAff(b, a),
-                               ExprAff(c, b)],
+                              [ExprAssign(a, CST2),
+                               ExprAssign(b, a),
+                               ExprAssign(c, b)],
 
-                              [ExprAff(a, CST1),
-                               ExprAff(b, a),
-                               ExprAff(c, b)],
+                              [ExprAssign(a, CST1),
+                               ExprAssign(b, a),
+                               ExprAssign(c, b)],
 
-                              [ExprAff(ExprMem(d, 32), a+b+c)],
+                              [ExprAssign(ExprMem(d, 32), a+b+c)],
 
                          ])
 
@@ -624,34 +624,34 @@ G17_EXP_IRA = IRA.new_ircfg()
 
 G17_EXP_IRB0 = gen_irblock(LBL0, [[],
 
-                                  [ExprAff(d, d+ CST2)],
+                                  [ExprAssign(d, d+ CST2)],
 
-                                  [ExprAff(a, CST1)],
+                                  [ExprAssign(a, CST1)],
 
-                                  [ExprAff(ExprMem(d+CST1, 32), a)],
+                                  [ExprAssign(ExprMem(d+CST1, 32), a)],
 
-                                  [ExprAff(a, CST1)],
+                                  [ExprAssign(a, CST1)],
 
-                                  [ExprAff(ExprMem(d+CST2, 32), a)],
+                                  [ExprAssign(ExprMem(d+CST2, 32), a)],
 
-                                  [ExprAff(a, CST2)],
+                                  [ExprAssign(a, CST2)],
 
-                                  [ExprAff(a, a+CST1)],
+                                  [ExprAssign(a, a+CST1)],
 
-                                  [ExprAff(d, a)],
+                                  [ExprAssign(d, a)],
 
-                                  [ExprAff(d, d+CST1)],
+                                  [ExprAssign(d, d+CST1)],
 
-                                  [ExprAff(a, CST2)],
+                                  [ExprAssign(a, CST2)],
 
-                                  [ExprAff(a, a+CST2)],
+                                  [ExprAssign(a, a+CST2)],
 
-                                  [ExprAff(a, CST2),
-                                   ExprAff(b, a)],
+                                  [ExprAssign(a, CST2),
+                                   ExprAssign(b, a)],
 
-                                  [ExprAff(a, CST1),
-                                   ExprAff(b, a),
-                                   ExprAff(c, b)],
+                                  [ExprAssign(a, CST1),
+                                   ExprAssign(b, a),
+                                   ExprAssign(c, b)],
 
                                   G17_IRB0[14]
                                   # Trick because a+b+c != ((a+b)+c)
diff --git a/test/analysis/depgraph.py b/test/analysis/depgraph.py
index 2ba5f044..0d909ba2 100644
--- a/test/analysis/depgraph.py
+++ b/test/analysis/depgraph.py
@@ -1,5 +1,5 @@
 """Regression test module for DependencyGraph"""
-from miasm2.expression.expression import ExprId, ExprInt, ExprAff, ExprCond, \
+from miasm2.expression.expression import ExprId, ExprInt, ExprAssign, ExprCond, \
     ExprLoc, LocKey
 from miasm2.core.locationdb import LocationDB
 from miasm2.ir.analysis import ira
@@ -236,9 +236,9 @@ END = ExprId("END", IRDst.size)
 
 G1_IRA = IRA.new_ircfg()
 
-G1_IRB0 = gen_irblock(LBL0, [[ExprAff(C, CST1), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
-G1_IRB1 = gen_irblock(LBL1, [[ExprAff(B, C), ExprAff(IRDst, ExprLoc(LBL2, 32))]])
-G1_IRB2 = gen_irblock(LBL2, [[ExprAff(A, B), ExprAff(IRDst, END)]])
+G1_IRB0 = gen_irblock(LBL0, [[ExprAssign(C, CST1), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
+G1_IRB1 = gen_irblock(LBL1, [[ExprAssign(B, C), ExprAssign(IRDst, ExprLoc(LBL2, 32))]])
+G1_IRB2 = gen_irblock(LBL2, [[ExprAssign(A, B), ExprAssign(IRDst, END)]])
 
 for irb in [G1_IRB0, G1_IRB1, G1_IRB2]:
     G1_IRA.add_irblock(irb)
@@ -247,9 +247,9 @@ for irb in [G1_IRB0, G1_IRB1, G1_IRB2]:
 
 G2_IRA = IRA.new_ircfg()
 
-G2_IRB0 = gen_irblock(LBL0, [[ExprAff(C, CST1), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
-G2_IRB1 = gen_irblock(LBL1, [[ExprAff(B, CST2), ExprAff(IRDst, ExprLoc(LBL2, 32))]])
-G2_IRB2 = gen_irblock(LBL2, [[ExprAff(A, B + C), ExprAff(IRDst, END)]])
+G2_IRB0 = gen_irblock(LBL0, [[ExprAssign(C, CST1), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
+G2_IRB1 = gen_irblock(LBL1, [[ExprAssign(B, CST2), ExprAssign(IRDst, ExprLoc(LBL2, 32))]])
+G2_IRB2 = gen_irblock(LBL2, [[ExprAssign(A, B + C), ExprAssign(IRDst, END)]])
 
 for irb in [G2_IRB0, G2_IRB1, G2_IRB2]:
     G2_IRA.add_irblock(irb)
@@ -262,7 +262,7 @@ G3_IRA = IRA.new_ircfg()
 G3_IRB0 = gen_irblock(
     LBL0,
     [
-        [ExprAff(C, CST1), ExprAff(
+        [ExprAssign(C, CST1), ExprAssign(
             IRDst, ExprCond(
                 COND,
                 ExprLoc(LBL1, 32),
@@ -273,9 +273,9 @@ G3_IRB0 = gen_irblock(
     ]
 )
 
-G3_IRB1 = gen_irblock(LBL1, [[ExprAff(B, CST2), ExprAff(IRDst, ExprLoc(LBL3, 32))]])
-G3_IRB2 = gen_irblock(LBL2, [[ExprAff(B, CST3), ExprAff(IRDst, ExprLoc(LBL3, 32))]])
-G3_IRB3 = gen_irblock(LBL3, [[ExprAff(A, B + C), ExprAff(IRDst, END)]])
+G3_IRB1 = gen_irblock(LBL1, [[ExprAssign(B, CST2), ExprAssign(IRDst, ExprLoc(LBL3, 32))]])
+G3_IRB2 = gen_irblock(LBL2, [[ExprAssign(B, CST3), ExprAssign(IRDst, ExprLoc(LBL3, 32))]])
+G3_IRB3 = gen_irblock(LBL3, [[ExprAssign(A, B + C), ExprAssign(IRDst, END)]])
 
 for irb in [G3_IRB0, G3_IRB1, G3_IRB2, G3_IRB3]:
     G3_IRA.add_irblock(irb)
@@ -284,12 +284,12 @@ for irb in [G3_IRB0, G3_IRB1, G3_IRB2, G3_IRB3]:
 
 G4_IRA = IRA.new_ircfg()
 
-G4_IRB0 = gen_irblock(LBL0, [[ExprAff(C, CST1), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
+G4_IRB0 = gen_irblock(LBL0, [[ExprAssign(C, CST1), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
 G4_IRB1 = gen_irblock(
     LBL1,
     [
-        [ExprAff(C, C + CST2)],
-        [ExprAff(IRDst,
+        [ExprAssign(C, C + CST2)],
+        [ExprAssign(IRDst,
                  ExprCond(
                      C,
                      ExprLoc(LBL2, 32),
@@ -298,7 +298,7 @@ G4_IRB1 = gen_irblock(
         ]]
 )
 
-G4_IRB2 = gen_irblock(LBL2, [[ExprAff(A, B), ExprAff(IRDst, END)]])
+G4_IRB2 = gen_irblock(LBL2, [[ExprAssign(A, B), ExprAssign(IRDst, END)]])
 
 for irb in [G4_IRB0, G4_IRB1, G4_IRB2]:
     G4_IRA.add_irblock(irb)
@@ -308,12 +308,12 @@ for irb in [G4_IRB0, G4_IRB1, G4_IRB2]:
 
 G5_IRA = IRA.new_ircfg()
 
-G5_IRB0 = gen_irblock(LBL0, [[ExprAff(B, CST1), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
+G5_IRB0 = gen_irblock(LBL0, [[ExprAssign(B, CST1), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
 G5_IRB1 = gen_irblock(
     LBL1,
     [
-        [ExprAff(B, B + CST2)],
-        [ExprAff(
+        [ExprAssign(B, B + CST2)],
+        [ExprAssign(
             IRDst,
             ExprCond(
                 B,
@@ -325,7 +325,7 @@ G5_IRB1 = gen_irblock(
     ]
 )
 
-G5_IRB2 = gen_irblock(LBL2, [[ExprAff(A, B), ExprAff(IRDst, END)]])
+G5_IRB2 = gen_irblock(LBL2, [[ExprAssign(A, B), ExprAssign(IRDst, END)]])
 
 for irb in [G5_IRB0, G5_IRB1, G5_IRB2]:
     G5_IRA.add_irblock(irb)
@@ -334,8 +334,8 @@ for irb in [G5_IRB0, G5_IRB1, G5_IRB2]:
 
 G6_IRA = IRA.new_ircfg()
 
-G6_IRB0 = gen_irblock(LBL0, [[ExprAff(B, CST1), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
-G6_IRB1 = gen_irblock(LBL1, [[ExprAff(A, B), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
+G6_IRB0 = gen_irblock(LBL0, [[ExprAssign(B, CST1), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
+G6_IRB1 = gen_irblock(LBL1, [[ExprAssign(A, B), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
 
 for irb in [G6_IRB0, G6_IRB1]:
     G6_IRA.add_irblock(irb)
@@ -344,13 +344,13 @@ for irb in [G6_IRB0, G6_IRB1]:
 
 G7_IRA = IRA.new_ircfg()
 
-G7_IRB0 = gen_irblock(LBL0, [[ExprAff(C, CST1), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
+G7_IRB0 = gen_irblock(LBL0, [[ExprAssign(C, CST1), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
 G7_IRB1 = gen_irblock(
     LBL1,
     [
-        [ExprAff(B, C)],
-        [ExprAff(A, B)],
-        [ExprAff(
+        [ExprAssign(B, C)],
+        [ExprAssign(A, B)],
+        [ExprAssign(
             IRDst,
             ExprCond(
                 COND,
@@ -362,7 +362,7 @@ G7_IRB1 = gen_irblock(
     ]
 )
 
-G7_IRB2 = gen_irblock(LBL2, [[ExprAff(D, A), ExprAff(IRDst, END)]])
+G7_IRB2 = gen_irblock(LBL2, [[ExprAssign(D, A), ExprAssign(IRDst, END)]])
 
 for irb in [G7_IRB0, G7_IRB1, G7_IRB2]:
     G7_IRA.add_irblock(irb)
@@ -371,13 +371,13 @@ for irb in [G7_IRB0, G7_IRB1, G7_IRB2]:
 
 G8_IRA = IRA.new_ircfg()
 
-G8_IRB0 = gen_irblock(LBL0, [[ExprAff(C, CST1), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
+G8_IRB0 = gen_irblock(LBL0, [[ExprAssign(C, CST1), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
 G8_IRB1 = gen_irblock(
     LBL1,
     [
-        [ExprAff(B, C)],
-        [ExprAff(C, D),
-         ExprAff(
+        [ExprAssign(B, C)],
+        [ExprAssign(C, D),
+         ExprAssign(
              IRDst,
              ExprCond(
                  COND,
@@ -388,7 +388,7 @@ G8_IRB1 = gen_irblock(
         ]
     ]
 )
-G8_IRB2 = gen_irblock(LBL2, [[ExprAff(A, B), ExprAff(IRDst, END)]])
+G8_IRB2 = gen_irblock(LBL2, [[ExprAssign(A, B), ExprAssign(IRDst, END)]])
 
 for irb in [G8_IRB0, G8_IRB1, G8_IRB2]:
     G8_IRA.add_irblock(irb)
@@ -402,8 +402,8 @@ G10_IRA = IRA.new_ircfg()
 G10_IRB1 = gen_irblock(
     LBL1,
     [
-        [ExprAff(B, B + CST2),
-         ExprAff(
+        [ExprAssign(B, B + CST2),
+         ExprAssign(
              IRDst,
              ExprCond(
                  COND,
@@ -415,7 +415,7 @@ G10_IRB1 = gen_irblock(
     ]
 )
 
-G10_IRB2 = gen_irblock(LBL2, [[ExprAff(A, B), ExprAff(IRDst, END)]])
+G10_IRB2 = gen_irblock(LBL2, [[ExprAssign(A, B), ExprAssign(IRDst, END)]])
 
 for irb in [G10_IRB1, G10_IRB2]:
     G10_IRA.add_irblock(irb)
@@ -427,9 +427,9 @@ G11_IRA = IRA.new_ircfg()
 G11_IRB0 = gen_irblock(
     LBL0,
     [
-        [ExprAff(A, CST1),
-         ExprAff(B, CST2),
-         ExprAff(IRDst, ExprLoc(LBL1, 32))
+        [ExprAssign(A, CST1),
+         ExprAssign(B, CST2),
+         ExprAssign(IRDst, ExprLoc(LBL1, 32))
         ]
     ]
 )
@@ -437,14 +437,14 @@ G11_IRB0 = gen_irblock(
 G11_IRB1 = gen_irblock(
     LBL1,
     [
-        [ExprAff(A, B),
-         ExprAff(B, A),
-         ExprAff(IRDst, ExprLoc(LBL2, 32))
+        [ExprAssign(A, B),
+         ExprAssign(B, A),
+         ExprAssign(IRDst, ExprLoc(LBL2, 32))
         ]
     ]
 )
 
-G11_IRB2 = gen_irblock(LBL2, [[ExprAff(A, A - B), ExprAff(IRDst, END)]])
+G11_IRB2 = gen_irblock(LBL2, [[ExprAssign(A, A - B), ExprAssign(IRDst, END)]])
 
 for irb in [G11_IRB0, G11_IRB1, G11_IRB2]:
     G11_IRA.add_irblock(irb)
@@ -453,13 +453,13 @@ for irb in [G11_IRB0, G11_IRB1, G11_IRB2]:
 
 G12_IRA = IRA.new_ircfg()
 
-G12_IRB0 = gen_irblock(LBL0, [[ExprAff(B, CST1), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
+G12_IRB0 = gen_irblock(LBL0, [[ExprAssign(B, CST1), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
 G12_IRB1 = gen_irblock(
     LBL1,
     [
-        [ExprAff(A, B)],
-        [ExprAff(B, B + CST2),
-         ExprAff(
+        [ExprAssign(A, B)],
+        [ExprAssign(B, B + CST2),
+         ExprAssign(
              IRDst,
              ExprCond(
                  COND,
@@ -471,7 +471,7 @@ G12_IRB1 = gen_irblock(
     ]
 )
 
-G12_IRB2 = gen_irblock(LBL2, [[ExprAff(B, A), ExprAff(IRDst, END)]])
+G12_IRB2 = gen_irblock(LBL2, [[ExprAssign(B, A), ExprAssign(IRDst, END)]])
 
 for irb in [G12_IRB0, G12_IRB1, G12_IRB2]:
     G12_IRA.add_irblock(irb)
@@ -481,13 +481,13 @@ for irb in [G12_IRB0, G12_IRB1, G12_IRB2]:
 
 G13_IRA = IRA.new_ircfg()
 
-G13_IRB0 = gen_irblock(LBL0, [[ExprAff(A, CST1)],
-                              #[ExprAff(B, A)],
-                              [ExprAff(IRDst,
+G13_IRB0 = gen_irblock(LBL0, [[ExprAssign(A, CST1)],
+                              #[ExprAssign(B, A)],
+                              [ExprAssign(IRDst,
                                        ExprLoc(LBL1, 32))]])
-G13_IRB1 = gen_irblock(LBL1, [[ExprAff(C, A)],
-                              #[ExprAff(A, A + CST1)],
-                              [ExprAff(IRDst,
+G13_IRB1 = gen_irblock(LBL1, [[ExprAssign(C, A)],
+                              #[ExprAssign(A, A + CST1)],
+                              [ExprAssign(IRDst,
                                        ExprCond(
                                            R,
                                            ExprLoc(LBL2, 32),
@@ -495,11 +495,11 @@ G13_IRB1 = gen_irblock(LBL1, [[ExprAff(C, A)],
                                        )
                               )]])
 
-G13_IRB2 = gen_irblock(LBL2, [[ExprAff(B, A + CST3)], [ExprAff(A, B + CST3)],
-                              [ExprAff(IRDst,
+G13_IRB2 = gen_irblock(LBL2, [[ExprAssign(B, A + CST3)], [ExprAssign(A, B + CST3)],
+                              [ExprAssign(IRDst,
                                        ExprLoc(LBL1, 32))]])
 
-G13_IRB3 = gen_irblock(LBL3, [[ExprAff(R, C), ExprAff(IRDst, END)]])
+G13_IRB3 = gen_irblock(LBL3, [[ExprAssign(R, C), ExprAssign(IRDst, END)]])
 
 for irb in [G13_IRB0, G13_IRB1, G13_IRB2, G13_IRB3]:
     G13_IRA.add_irblock(irb)
@@ -508,12 +508,12 @@ for irb in [G13_IRB0, G13_IRB1, G13_IRB2, G13_IRB3]:
 
 G14_IRA = IRA.new_ircfg()
 
-G14_IRB0 = gen_irblock(LBL0, [[ExprAff(A, CST1)],
-                              [ExprAff(IRDst,
+G14_IRB0 = gen_irblock(LBL0, [[ExprAssign(A, CST1)],
+                              [ExprAssign(IRDst,
                                        ExprLoc(LBL1, 32))]
                              ])
-G14_IRB1 = gen_irblock(LBL1, [[ExprAff(B, A)],
-                              [ExprAff(IRDst,
+G14_IRB1 = gen_irblock(LBL1, [[ExprAssign(B, A)],
+                              [ExprAssign(IRDst,
                                        ExprCond(
                                            C,
                                            ExprLoc(LBL2, 32),
@@ -523,13 +523,13 @@ G14_IRB1 = gen_irblock(LBL1, [[ExprAff(B, A)],
                               ]
                              ])
 
-G14_IRB2 = gen_irblock(LBL2, [[ExprAff(D, A)],
-                              [ExprAff(A, D + CST1)],
-                              [ExprAff(IRDst,
+G14_IRB2 = gen_irblock(LBL2, [[ExprAssign(D, A)],
+                              [ExprAssign(A, D + CST1)],
+                              [ExprAssign(IRDst,
                                        ExprLoc(LBL1, 32))]
                              ])
 
-G14_IRB3 = gen_irblock(LBL3, [[ExprAff(R, D + B), ExprAff(IRDst, END)]])
+G14_IRB3 = gen_irblock(LBL3, [[ExprAssign(R, D + B), ExprAssign(IRDst, END)]])
 
 for irb in [G14_IRB0, G14_IRB1, G14_IRB2, G14_IRB3]:
     G14_IRA.add_irblock(irb)
@@ -538,18 +538,18 @@ for irb in [G14_IRB0, G14_IRB1, G14_IRB2, G14_IRB3]:
 
 G15_IRA = IRA.new_ircfg()
 
-G15_IRB0 = gen_irblock(LBL0, [[ExprAff(A, CST1), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
-G15_IRB1 = gen_irblock(LBL1, [[ExprAff(D, A + B)],
-                              [ExprAff(C, D)],
-                              [ExprAff(B, C),
-                               ExprAff(IRDst,
+G15_IRB0 = gen_irblock(LBL0, [[ExprAssign(A, CST1), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
+G15_IRB1 = gen_irblock(LBL1, [[ExprAssign(D, A + B)],
+                              [ExprAssign(C, D)],
+                              [ExprAssign(B, C),
+                               ExprAssign(IRDst,
                                        ExprCond(
                                            C,
                                            ExprLoc(LBL1, 32),
                                            ExprLoc(LBL2, 32)
                                        )
                                )]])
-G15_IRB2 = gen_irblock(LBL2, [[ExprAff(R, B), ExprAff(IRDst, END)]])
+G15_IRB2 = gen_irblock(LBL2, [[ExprAssign(R, B), ExprAssign(IRDst, END)]])
 
 for irb in [G15_IRB0, G15_IRB1, G15_IRB2]:
     G15_IRA.add_irblock(irb)
@@ -560,15 +560,15 @@ G16_IRA = IRA.new_ircfg()
 
 G16_IRB0 = gen_irblock(
     LBL0, [
-        [ExprAff(A, CST1), ExprAff(IRDst, ExprLoc(LBL1, 32))]
+        [ExprAssign(A, CST1), ExprAssign(IRDst, ExprLoc(LBL1, 32))]
     ]
 )
 
 G16_IRB1 = gen_irblock(
     LBL1,
     [
-        [ExprAff(R, D),
-         ExprAff(
+        [ExprAssign(R, D),
+         ExprAssign(
              IRDst,
              ExprCond(
                  C,
@@ -590,10 +590,10 @@ G16_IRB1 = gen_irblock(
 
 
 
-G16_IRB2 = gen_irblock(LBL2, [[ExprAff(D, A), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
-G16_IRB3 = gen_irblock(LBL3, [[ExprAff(R, D), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
-G16_IRB4 = gen_irblock(LBL4, [[ExprAff(R, A), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
-G16_IRB5 = gen_irblock(LBL5, [[ExprAff(R, A), ExprAff(IRDst, ExprLoc(LBL1, 32))]])
+G16_IRB2 = gen_irblock(LBL2, [[ExprAssign(D, A), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
+G16_IRB3 = gen_irblock(LBL3, [[ExprAssign(R, D), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
+G16_IRB4 = gen_irblock(LBL4, [[ExprAssign(R, A), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
+G16_IRB5 = gen_irblock(LBL5, [[ExprAssign(R, A), ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
 
 for irb in [G16_IRB0, G16_IRB1, G16_IRB2, G16_IRB3, G16_IRB4, G16_IRB5]:
     G16_IRA.add_irblock(irb)
@@ -602,14 +602,14 @@ for irb in [G16_IRB0, G16_IRB1, G16_IRB2, G16_IRB3, G16_IRB4, G16_IRB5]:
 
 G17_IRA = IRA.new_ircfg()
 
-G17_IRB0 = gen_irblock(LBL0, [[ExprAff(A, CST1),
-                               ExprAff(D, CST2),
-                               ExprAff(IRDst, ExprLoc(LBL1, 32))]])
-G17_IRB1 = gen_irblock(LBL1, [[ExprAff(A, D),
-                               ExprAff(B, D),
-                               ExprAff(IRDst, ExprLoc(LBL2, 32))]])
-G17_IRB2 = gen_irblock(LBL2, [[ExprAff(A, A - B),
-                               ExprAff(IRDst, END)]])
+G17_IRB0 = gen_irblock(LBL0, [[ExprAssign(A, CST1),
+                               ExprAssign(D, CST2),
+                               ExprAssign(IRDst, ExprLoc(LBL1, 32))]])
+G17_IRB1 = gen_irblock(LBL1, [[ExprAssign(A, D),
+                               ExprAssign(B, D),
+                               ExprAssign(IRDst, ExprLoc(LBL2, 32))]])
+G17_IRB2 = gen_irblock(LBL2, [[ExprAssign(A, A - B),
+                               ExprAssign(IRDst, END)]])
 
 G17_IRA.add_uniq_edge(G17_IRB0.loc_key, G17_IRB1.loc_key)
 G17_IRA.add_uniq_edge(G17_IRB1.loc_key, G17_IRB2.loc_key)
diff --git a/test/arch/mep/ir/ut_helpers_ir.py b/test/arch/mep/ir/ut_helpers_ir.py
index fcf31764..9c9efdfa 100644
--- a/test/arch/mep/ir/ut_helpers_ir.py
+++ b/test/arch/mep/ir/ut_helpers_ir.py
@@ -10,7 +10,7 @@ from miasm2.core.locationdb import LocationDB
 from miasm2.core.utils import Disasm_Exception
 from miasm2.ir.ir import AssignBlock
 from miasm2.arch.mep.ira import ir_a_mepb
-from miasm2.expression.expression import ExprId, ExprInt, ExprOp, ExprMem, ExprAff, ExprLoc
+from miasm2.expression.expression import ExprId, ExprInt, ExprOp, ExprMem, ExprAssign, ExprLoc
 
 
 def exec_instruction(mn_str, init_values, results, index=0, offset=0):
@@ -36,7 +36,7 @@ def exec_instruction(mn_str, init_values, results, index=0, offset=0):
     iir, eiir = im.get_ir(instr)
 
     # Filter out IRDst
-    iir = [ir for ir in iir if not (isinstance(ir, ExprAff) and
+    iir = [ir for ir in iir if not (isinstance(ir, ExprAssign) and
                                     isinstance(ir.dst, ExprId) and
                                     ir.dst.name == "IRDst")]
 
diff --git a/test/expression/expr_pickle.py b/test/expression/expr_pickle.py
index 84ad0b9f..870f761a 100644
--- a/test/expression/expr_pickle.py
+++ b/test/expression/expr_pickle.py
@@ -1,5 +1,5 @@
 import pickle
-from miasm2.expression.expression import ExprInt, ExprAff, ExprId, \
+from miasm2.expression.expression import ExprInt, ExprAssign, ExprId, \
     Expr, ExprCompose, ExprMem
 
 
@@ -9,7 +9,7 @@ c = a + b
 d = ExprCompose(a, b)
 e = ExprMem(a, 32)
 f = a[:8]
-aff = ExprAff(a, b)
+aff = ExprAssign(a, b)
 
 
 print 'Pickling'
diff --git a/test/expression/expression.py b/test/expression/expression.py
index b998d4a5..1b39ab9f 100644
--- a/test/expression/expression.py
+++ b/test/expression/expression.py
@@ -61,12 +61,12 @@ for expr in [
         A + cst1,
         ExprCompose(A, cst1),
         A.msb(),
-        ExprAff(A, cst1),
+        ExprAssign(A, cst1),
 ]:
     print repr(expr)
     assert expr == eval(repr(expr))
 
 
-aff = ExprAff(A[0:32], cst1)
+aff = ExprAssign(A[0:32], cst1)
 
 assert aff.dst == A and aff.src == cst1
diff --git a/test/expression/parser.py b/test/expression/parser.py
index 1d5889fb..ccae49b0 100644
--- a/test/expression/parser.py
+++ b/test/expression/parser.py
@@ -1,6 +1,6 @@
 from miasm2.expression.parser import str_to_expr
 from miasm2.expression.expression import ExprInt, ExprId, ExprSlice, ExprMem, \
-    ExprCond, ExprCompose, ExprOp, ExprAff, ExprLoc, LocKey
+    ExprCond, ExprCompose, ExprOp, ExprAssign, ExprLoc, LocKey
 
 for expr_test in [ExprInt(0x12, 32),
                   ExprId('test', 32),
@@ -10,7 +10,7 @@ for expr_test in [ExprInt(0x12, 32),
                   ExprCond(ExprInt(0x10, 32), ExprInt(0x11, 32), ExprInt(0x12, 32)),
                   ExprCompose(ExprInt(0x10, 16), ExprInt(0x11, 8), ExprInt(0x12, 8)),
                   ExprInt(0x11, 8) + ExprInt(0x12, 8),
-                  ExprAff(ExprId('EAX', 32),  ExprInt(0x12, 32)),
+                  ExprAssign(ExprId('EAX', 32),  ExprInt(0x12, 32)),
                   ]:
 
     print 'Test: %s' % expr_test
diff --git a/test/expression/simplifications.py b/test/expression/simplifications.py
index 046c948e..68dc0437 100644
--- a/test/expression/simplifications.py
+++ b/test/expression/simplifications.py
@@ -575,9 +575,9 @@ for test, res in match_tests:
 
 
 get_tests = [
-    (ExprAff(ExprMem(a, 32), ExprMem(b, 32)).get_r(True), set([a, b, ExprMem(b, 32)])),
-    (ExprAff(ExprMem(a, 32), ExprMem(b, 32)).get_w(), set([ExprMem(a, 32)])),
-    (ExprAff(ExprMem(ExprMem(a, 32), 32), ExprMem(b, 32))
+    (ExprAssign(ExprMem(a, 32), ExprMem(b, 32)).get_r(True), set([a, b, ExprMem(b, 32)])),
+    (ExprAssign(ExprMem(a, 32), ExprMem(b, 32)).get_w(), set([ExprMem(a, 32)])),
+    (ExprAssign(ExprMem(ExprMem(a, 32), 32), ExprMem(b, 32))
      .get_r(True), set([a, b, ExprMem(b, 32), ExprMem(a, 32)])),
 ]
 
diff --git a/test/ir/ir.py b/test/ir/ir.py
index 3774e4e9..072c90f6 100644
--- a/test/ir/ir.py
+++ b/test/ir/ir.py
@@ -8,11 +8,11 @@ int0 = ExprInt(0, id_a.size)
 
 # Test AssignBlock
 ## Constructors
-assignblk1 = AssignBlock([ExprAff(id_a, id_b)])
+assignblk1 = AssignBlock([ExprAssign(id_a, id_b)])
 assignblk2 = AssignBlock({id_a: id_b})
 
 ## Equality
-assignblk1_bis = AssignBlock([ExprAff(id_a, id_b)])
+assignblk1_bis = AssignBlock([ExprAssign(id_a, id_b)])
 assert assignblk1 == assignblk1_bis
 assert assignblk1 == assignblk2
 
diff --git a/test/ir/reduce_graph.py b/test/ir/reduce_graph.py
index 68a3aea8..29a3501f 100644
--- a/test/ir/reduce_graph.py
+++ b/test/ir/reduce_graph.py
@@ -1,7 +1,7 @@
 """Regression test module for DependencyGraph"""
 from pdb import pm
 
-from miasm2.expression.expression import ExprId, ExprInt, ExprAff, ExprCond, \
+from miasm2.expression.expression import ExprId, ExprInt, ExprAssign, ExprCond, \
     ExprLoc, LocKey
 
 from miasm2.core.locationdb import LocationDB
@@ -109,8 +109,8 @@ G1_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(B, C),
-            ExprAff(IRDst, ExprLoc(LBL1, 32)),
+            ExprAssign(B, C),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
@@ -119,7 +119,7 @@ G1_IRB1 = gen_irblock(
     LBL1,
     [
         [
-            ExprAff(IRDst, ExprLoc(LBL2, 32)),
+            ExprAssign(IRDst, ExprLoc(LBL2, 32)),
         ]
     ]
 )
@@ -128,8 +128,8 @@ G1_IRB2 = gen_irblock(
     LBL2,
     [
         [
-            ExprAff(A, B),
-            ExprAff(IRDst, C),
+            ExprAssign(A, B),
+            ExprAssign(IRDst, C),
         ]
     ]
 )
@@ -144,11 +144,11 @@ G1_RES_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(B, C),
+            ExprAssign(B, C),
         ],
         [
-            ExprAff(A, B),
-            ExprAff(IRDst, C),
+            ExprAssign(A, B),
+            ExprAssign(IRDst, C),
         ]
 
     ]
@@ -176,7 +176,7 @@ G2_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(IRDst, ExprLoc(LBL1, 32)),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
@@ -185,8 +185,8 @@ G2_IRB1 = gen_irblock(
     LBL1,
     [
         [
-            ExprAff(A, C),
-            ExprAff(IRDst, C),
+            ExprAssign(A, C),
+            ExprAssign(IRDst, C),
         ]
     ]
 )
@@ -202,8 +202,8 @@ G2_RES_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(A, C),
-            ExprAff(IRDst, C),
+            ExprAssign(A, C),
+            ExprAssign(IRDst, C),
         ]
     ]
 )
@@ -222,7 +222,7 @@ G3_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(IRDst, ExprLoc(LBL1, 32)),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
@@ -231,8 +231,8 @@ G3_IRB1 = gen_irblock(
     LBL1,
     [
         [
-            ExprAff(A, C),
-            ExprAff(IRDst, ExprLoc(LBL2, 32)),
+            ExprAssign(A, C),
+            ExprAssign(IRDst, ExprLoc(LBL2, 32)),
         ]
     ]
 )
@@ -241,8 +241,8 @@ G3_IRB2 = gen_irblock(
     LBL2,
     [
         [
-            ExprAff(D, A),
-            ExprAff(IRDst, C),
+            ExprAssign(D, A),
+            ExprAssign(IRDst, C),
         ]
     ]
 )
@@ -259,11 +259,11 @@ G3_RES_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(A, C),
+            ExprAssign(A, C),
         ],
         [
-            ExprAff(D, A),
-            ExprAff(IRDst, C),
+            ExprAssign(D, A),
+            ExprAssign(IRDst, C),
         ]
     ]
 )
@@ -284,7 +284,7 @@ G4_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(IRDst, ExprLoc(LBL1, 32)),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
@@ -293,8 +293,8 @@ G4_IRB1 = gen_irblock(
     LBL1,
     [
         [
-            ExprAff(A, C),
-            ExprAff(IRDst, ExprLoc(LBL2, 32)),
+            ExprAssign(A, C),
+            ExprAssign(IRDst, ExprLoc(LBL2, 32)),
         ]
     ]
 )
@@ -303,8 +303,8 @@ G4_IRB2 = gen_irblock(
     LBL2,
     [
         [
-            ExprAff(D, A),
-            ExprAff(IRDst, ExprLoc(LBL1, 32)),
+            ExprAssign(D, A),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
@@ -321,11 +321,11 @@ G4_RES_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(A, C),
+            ExprAssign(A, C),
         ],
         [
-            ExprAff(D, A),
-            ExprAff(IRDst, ExprLoc(LBL0, 32)),
+            ExprAssign(D, A),
+            ExprAssign(IRDst, ExprLoc(LBL0, 32)),
         ]
     ]
 )
@@ -345,7 +345,7 @@ G5_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(IRDst, ExprLoc(LBL1, 32)),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
@@ -354,8 +354,8 @@ G5_IRB1 = gen_irblock(
     LBL1,
     [
         [
-            ExprAff(A, C),
-            ExprAff(IRDst, ExprLoc(LBL2, 32)),
+            ExprAssign(A, C),
+            ExprAssign(IRDst, ExprLoc(LBL2, 32)),
         ]
     ]
 )
@@ -364,8 +364,8 @@ G5_IRB2 = gen_irblock(
     LBL2,
     [
         [
-            ExprAff(D, A),
-            ExprAff(IRDst, ExprCond(C, ExprLoc(LBL1, 32), ExprLoc(LBL3, 32))),
+            ExprAssign(D, A),
+            ExprAssign(IRDst, ExprCond(C, ExprLoc(LBL1, 32), ExprLoc(LBL3, 32))),
         ]
     ]
 )
@@ -375,8 +375,8 @@ G5_IRB3 = gen_irblock(
     LBL3,
     [
         [
-            ExprAff(D, A),
-            ExprAff(IRDst, C),
+            ExprAssign(D, A),
+            ExprAssign(IRDst, C),
         ]
     ]
 )
@@ -393,11 +393,11 @@ G5_RES_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(A, C),
+            ExprAssign(A, C),
         ],
         [
-            ExprAff(D, A),
-            ExprAff(IRDst, ExprCond(C, ExprLoc(LBL0, 32), ExprLoc(LBL3, 32))),
+            ExprAssign(D, A),
+            ExprAssign(IRDst, ExprCond(C, ExprLoc(LBL0, 32), ExprLoc(LBL3, 32))),
         ]
     ]
 )
@@ -407,8 +407,8 @@ G5_RES_IRB3 = gen_irblock(
     LBL3,
     [
         [
-            ExprAff(D, A),
-            ExprAff(IRDst, C),
+            ExprAssign(D, A),
+            ExprAssign(IRDst, C),
         ]
     ]
 )
@@ -427,7 +427,7 @@ G6_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(IRDst, ExprCond(C, ExprLoc(LBL1, 32), ExprLoc(LBL2, 32))),
+            ExprAssign(IRDst, ExprCond(C, ExprLoc(LBL1, 32), ExprLoc(LBL2, 32))),
         ]
     ]
 )
@@ -436,7 +436,7 @@ G6_IRB1 = gen_irblock(
     LBL1,
     [
         [
-            ExprAff(IRDst, ExprLoc(LBL3, 32)),
+            ExprAssign(IRDst, ExprLoc(LBL3, 32)),
         ]
     ]
 )
@@ -445,8 +445,8 @@ G6_IRB2 = gen_irblock(
     LBL2,
     [
         [
-            ExprAff(D, A),
-            ExprAff(IRDst, D),
+            ExprAssign(D, A),
+            ExprAssign(IRDst, D),
         ]
     ]
 )
@@ -456,8 +456,8 @@ G6_IRB3 = gen_irblock(
     LBL3,
     [
         [
-            ExprAff(A, D),
-            ExprAff(IRDst, ExprLoc(LBL3, 32)),
+            ExprAssign(A, D),
+            ExprAssign(IRDst, ExprLoc(LBL3, 32)),
         ]
     ]
 )
@@ -474,7 +474,7 @@ G6_RES_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(IRDst, ExprCond(C, ExprLoc(LBL3, 32), ExprLoc(LBL2, 32))),
+            ExprAssign(IRDst, ExprCond(C, ExprLoc(LBL3, 32), ExprLoc(LBL2, 32))),
         ]
     ]
 )
@@ -484,8 +484,8 @@ G6_RES_IRB2 = gen_irblock(
     LBL2,
     [
         [
-            ExprAff(D, A),
-            ExprAff(IRDst, D),
+            ExprAssign(D, A),
+            ExprAssign(IRDst, D),
         ]
     ]
 )
@@ -495,8 +495,8 @@ G6_RES_IRB3 = gen_irblock(
     LBL3,
     [
         [
-            ExprAff(A, D),
-            ExprAff(IRDst, ExprLoc(LBL3, 32)),
+            ExprAssign(A, D),
+            ExprAssign(IRDst, ExprLoc(LBL3, 32)),
         ]
     ]
 )
@@ -517,8 +517,8 @@ G7_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(A, C),
-            ExprAff(IRDst, ExprLoc(LBL1, 32)),
+            ExprAssign(A, C),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
@@ -527,7 +527,7 @@ G7_IRB1 = gen_irblock(
     LBL1,
     [
         [
-            ExprAff(IRDst, ExprLoc(LBL1, 32)),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
@@ -546,8 +546,8 @@ G7_RES_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(A, C),
-            ExprAff(IRDst, ExprLoc(LBL1, 32)),
+            ExprAssign(A, C),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
@@ -556,7 +556,7 @@ G7_RES_IRB1 = gen_irblock(
     LBL1,
     [
         [
-            ExprAff(IRDst, ExprLoc(LBL1, 32)),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
@@ -576,7 +576,7 @@ G8_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(IRDst, ExprLoc(LBL1, 32)),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
@@ -585,8 +585,8 @@ G8_IRB1 = gen_irblock(
     LBL1,
     [
         [
-            ExprAff(A, C),
-            ExprAff(IRDst, ExprLoc(LBL1, 32)),
+            ExprAssign(A, C),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
@@ -605,8 +605,8 @@ G8_RES_IRB0 = gen_irblock(
     LBL0,
     [
         [
-            ExprAff(A, C),
-            ExprAff(IRDst, ExprLoc(LBL0, 32)),
+            ExprAssign(A, C),
+            ExprAssign(IRDst, ExprLoc(LBL0, 32)),
         ]
     ]
 )
diff --git a/test/ir/symbexec.py b/test/ir/symbexec.py
index 3158be60..00ef7c10 100755
--- a/test/ir/symbexec.py
+++ b/test/ir/symbexec.py
@@ -8,7 +8,7 @@ class TestSymbExec(unittest.TestCase):
 
     def test_ClassDef(self):
         from miasm2.expression.expression import ExprInt, ExprId, ExprMem, \
-            ExprCompose, ExprAff
+            ExprCompose, ExprAssign
         from miasm2.arch.x86.sem import ir_x86_32
         from miasm2.core.locationdb import LocationDB
         from miasm2.ir.symbexec import SymbolicExecutionEngine
@@ -128,7 +128,7 @@ class TestSymbExec(unittest.TestCase):
         self.assertEqual(sb.eval_expr(id_x), id_a)
 
         ## x = a (with a = 0x0)
-        self.assertEqual(sb.eval_updt_expr(assignblk.dst2ExprAff(id_x)), ExprInt(0, 32))
+        self.assertEqual(sb.eval_updt_expr(assignblk.dst2ExprAssign(id_x)), ExprInt(0, 32))
         self.assertEqual(sb.eval_expr(id_x), ExprInt(0, 32))
         self.assertEqual(sb.eval_updt_expr(id_x), ExprInt(0, 32))
 
@@ -137,7 +137,7 @@ class TestSymbExec(unittest.TestCase):
         ## state
         reads = set()
         for dst, src in sb.modified():
-            reads.update(ExprAff(dst, src).get_r())
+            reads.update(ExprAssign(dst, src).get_r())
 
         self.assertEqual(reads, set([
             id_x, id_a,
diff --git a/test/ir/translators/smt2.py b/test/ir/translators/smt2.py
index 838b0bc5..2b5c8df3 100644
--- a/test/ir/translators/smt2.py
+++ b/test/ir/translators/smt2.py
@@ -19,7 +19,7 @@ right = ExprCond(cond,
                  a + ExprInt(0x64L, 64),
                  ExprInt(0x16L, 64))
 
-e = ExprAff(left, right)
+e = ExprAssign(left, right)
 
 # initialise translators
 t_z3 = TranslatorZ3()
diff --git a/test/jitter/jitload.py b/test/jitter/jitload.py
index dff1f0d6..1a56099f 100644
--- a/test/jitter/jitload.py
+++ b/test/jitter/jitload.py
@@ -3,7 +3,7 @@ from pdb import pm
 
 from miasm2.jitter.csts import PAGE_READ, PAGE_WRITE
 from miasm2.analysis.machine import Machine
-from miasm2.expression.expression import ExprId, ExprAff, ExprInt, ExprMem
+from miasm2.expression.expression import ExprId, ExprAssign, ExprInt, ExprMem
 
 # Initial data: from 'example/samples/x86_32_sc.bin'
 data = "8d49048d5b0180f90174058d5bffeb038d5b0189d8c3".decode("hex")
@@ -40,8 +40,8 @@ eax = ExprId("RAX", 64)[:32]
 imm0, imm4, imm4_64 = ExprInt(0, 32), ExprInt(4, 32), ExprInt(4, 64)
 memdata = ExprMem(ExprInt(run_addr, 32), len(data) * 8)
 assert myjit.eval_expr(eax) == imm0
-## Due to ExprAff construction, imm4 is "promoted" to imm4_64
-assert myjit.eval_expr(ExprAff(eax, imm4)) == imm4_64
+## Due to ExprAssign construction, imm4 is "promoted" to imm4_64
+assert myjit.eval_expr(ExprAssign(eax, imm4)) == imm4_64
 assert myjit.eval_expr(eax) == imm4
 ## Changes must be passed on myjit.cpu instance
 assert myjit.cpu.EAX == 4