about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorCamille Mougey <commial@gmail.com>2018-02-08 09:42:46 +0100
committerGitHub <noreply@github.com>2018-02-08 09:42:46 +0100
commit47811fe5a56c8071ab5064e1f84ca64389941eec (patch)
treedad26c0bc7257aa9535b8a7e07c2ca63d4b5dab5
parentd404b1803c09b61463845fe14feee5324cbdc051 (diff)
parent45aed57c8bbe1cf7d4fde57ea1e39cf68b638cca (diff)
downloadmiasm-47811fe5a56c8071ab5064e1f84ca64389941eec.tar.gz
miasm-47811fe5a56c8071ab5064e1f84ca64389941eec.zip
Merge pull request #667 from serpilliere/aarch64_add_instr
Aarch64/sem: add ld[ur]s[[bhw]
-rw-r--r--miasm2/arch/aarch64/sem.py46
1 files changed, 31 insertions, 15 deletions
diff --git a/miasm2/arch/aarch64/sem.py b/miasm2/arch/aarch64/sem.py
index a1c6b41d..d8dc1efa 100644
--- a/miasm2/arch/aarch64/sem.py
+++ b/miasm2/arch/aarch64/sem.py
@@ -417,26 +417,47 @@ def ldr(ir, instr, arg1, arg2):
     return e, []
 
 
-def ldrb(ir, instr, arg1, arg2):
+def ldr_size(ir, instr, arg1, arg2, size):
     e = []
     addr, updt = get_mem_access(arg2)
     e.append(
-        m2_expr.ExprAff(arg1, m2_expr.ExprMem(addr, 8).zeroExtend(arg1.size)))
+        m2_expr.ExprAff(arg1, m2_expr.ExprMem(addr, size).zeroExtend(arg1.size)))
     if updt:
         e.append(updt)
     return e, []
 
 
+def ldrb(ir, instr, arg1, arg2):
+    return ldr_size(ir, instr, arg1, arg2, 8)
+
+
 def ldrh(ir, instr, arg1, arg2):
+    return ldr_size(ir, instr, arg1, arg2, 16)
+
+
+def ldrs_size(ir, instr, arg1, arg2, size):
     e = []
     addr, updt = get_mem_access(arg2)
     e.append(
-        m2_expr.ExprAff(arg1, m2_expr.ExprMem(addr, 16).zeroExtend(arg1.size)))
+        m2_expr.ExprAff(arg1, m2_expr.ExprMem(addr, size).signExtend(arg1.size)))
     if updt:
         e.append(updt)
     return e, []
 
 
+def ldrsb(ir, instr, arg1, arg2):
+    return ldrs_size(ir, instr, arg1, arg2, 8)
+
+
+def ldrsh(ir, instr, arg1, arg2):
+    return ldrs_size(ir, instr, arg1, arg2, 16)
+
+
+def ldrsw(ir, instr, arg1, arg2):
+    return ldrs_size(ir, instr, arg1, arg2, 32)
+
+
+
 def l_str(ir, instr, arg1, arg2):
     e = []
     addr, updt = get_mem_access(arg2)
@@ -486,16 +507,6 @@ def ldp(ir, instr, arg1, arg2, arg3):
     return e, []
 
 
-def ldrsw(ir, instr, arg1, arg2):
-    e = []
-    addr, updt = get_mem_access(arg2)
-    e.append(
-        m2_expr.ExprAff(arg1, m2_expr.ExprMem(addr, 32).signExtend(arg1.size)))
-    if updt:
-        e.append(updt)
-    return e, []
-
-
 def sbfm(ir, instr, arg1, arg2, arg3, arg4):
     e = []
     rim, sim = int(arg3.arg), int(arg4) + 1
@@ -745,7 +756,14 @@ mnemo_func.update({
 
     'ldur': ldr,
     'ldurb': ldrb,
+    'ldursb': ldrsb,
     'ldurh': ldrh,
+    'ldursh': ldrsh,
+    'ldursw': ldrsw,
+
+    'ldrsb': ldrsb,
+    'ldrsh': ldrsh,
+    'ldrsw': ldrsw,
 
     'str': l_str,
     'strb': strb,
@@ -755,8 +773,6 @@ mnemo_func.update({
     'sturb': strb,
     'sturh': strh,
 
-    'ldrsw': ldrsw,
-
 
     'bfm': bfm,
     'sbfm': sbfm,