summaryrefslogtreecommitdiff
path: root/src/arch/arm/v7/opdefs/push_A88133.d
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/arm/v7/opdefs/push_A88133.d')
-rw-r--r--src/arch/arm/v7/opdefs/push_A88133.d107
1 files changed, 39 insertions, 68 deletions
diff --git a/src/arch/arm/v7/opdefs/push_A88133.d b/src/arch/arm/v7/opdefs/push_A88133.d
index 2ba7293..14fc3e9 100644
--- a/src/arch/arm/v7/opdefs/push_A88133.d
+++ b/src/arch/arm/v7/opdefs/push_A88133.d
@@ -2,7 +2,7 @@
/* Chrysalide - Outil d'analyse de fichiers binaires
* ##FILE## - traduction d'instructions ARMv7
*
- * Copyright (C) 2014 Cyrille Bagard
+ * Copyright (C) 2015 Cyrille Bagard
*
* This file is part of Chrysalide.
*
@@ -23,116 +23,87 @@
@title PUSH
-@encoding(t1) {
+@desc Push Multiple Registers stores multiple registers to the stack, storing to consecutive memory locations ending just below the address in SP, and updates SP to point to the start of the stored data.
- @half 1 0 1 1 0 1 0 M(1) register_list(8)
+@encoding (t1) {
- @syntax <registers>
+ @half 1 0 1 1 0 1 0 M(1) register_list(8)
- @conv {
+ @syntax <registers>
- registers = RegistersList('0':M:'000000':register_list)
+ @conv {
- }
+ registers = RegistersList('0':M:'000000':register_list)
- @rules {
-
- //if BitCount(registers) < 1 then UNPREDICTABLE;
-
- if (M == '1'); call SetInsFlag(AIF_ROUTINE_START);
-
- }
+ }
}
-@encoding(T2) {
-
- @word 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 M(1) 0 register_list(13)
-
- @syntax "push.W" <registers>
-
- @conv {
-
- registers = RegistersList('0':M:'0':register_list)
+@encoding (T2) {
- }
+ @word 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 M(1) 0 register_list(13)
- @rules {
+ @syntax ".W" <registers>
- //if BitCount(registers) < 2 then UNPREDICTABLE;
+ @conv {
- if (M == '1'); call SetInsFlag(AIF_ROUTINE_START);
+ registers = RegistersList('0':M:'0':register_list)
- }
+ }
}
-@encoding(T3) {
+@encoding (T3) {
- @word 1 1 1 1 1 0 0 0 0 1 0 0 1 1 0 1 Rt(4) 1 1 0 1 0 0 0 0 0 1 0 0
+ @word 1 1 1 1 1 0 0 0 0 1 0 0 1 1 0 1 Rt(4) 1 1 0 1 0 0 0 0 0 1 0 0
- @syntax "push.W" <registers>
+ @syntax ".W" <registers>
- @conv {
+ @conv {
- Rgt = Register(Rt)
- registers = ListFromRegister(Rgt)
+ registers = Zeros(16)
- }
-
- @rules {
-
- //if t IN {13,15} then UNPREDICTABLE
-
- if (Rt == '1110'); call SetInsFlag(AIF_ROUTINE_START);
-
- }
+ }
}
-@encoding(A1) {
+@encoding (A1) {
- @word cond(4) 1 0 0 1 0 0 1 0 1 1 0 1 register_list(16)
+ @word cond(4) 1 0 0 1 0 0 1 0 1 1 0 1 register_list(16)
- @syntax {c} <registers>
+ @syntax <registers>
- @conv {
+ @conv {
- c = Condition(cond)
- registers = RegistersList(register_list)
+ registers = RegistersList(register_list)
- }
+ }
- @rules {
+ @rules {
- //if BitCount(register_list) < 2 then SEE STMDB / STMFD;
+ chk_call StoreCondition(cond)
- if (register_list & 0x4000); call SetInsFlag(AIF_ROUTINE_START);
-
- }
+ }
}
-@encoding(A2) {
-
- @word cond(4) 0 1 0 1 0 0 1 0 1 1 0 1 Rt(4) 0 0 0 0 0 0 0 0 0 1 0 0
+@encoding (A2) {
- @syntax {c} <registers>
+ @word cond(4) 0 1 0 1 0 0 1 0 1 1 0 1 Rt(4) 0 0 0 0 0 0 0 0 0 1 0 0
- @conv {
+ @syntax <registers>
- c = Condition(cond)
- Rgt = Register(Rt)
- registers = ListFromRegister(Rgt)
+ @conv {
- }
+ registers = Zeros(16)
- @rules {
+ }
- //if t == 13 then UNPREDICTABLE;
+ @rules {
- if (Rt == '1110'); call SetInsFlag(AIF_ROUTINE_START);
+ chk_call StoreCondition(cond)
- }
+ }
}
+