summaryrefslogtreecommitdiff
path: root/src/arch/arm/v7/opdefs
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-05-27 21:18:54 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-05-27 21:18:54 (GMT)
commitac2906c17089d3f5fa3b7ef5988a3d24a8c6c542 (patch)
tree1d4087252a8ba0720407c1bffb89e61dcb0786fd /src/arch/arm/v7/opdefs
parent1878e3ab82d8711f305e7b8bbc43c5ed21bf140b (diff)
Handled more ARM instructions from the storing family.
Diffstat (limited to 'src/arch/arm/v7/opdefs')
-rw-r--r--src/arch/arm/v7/opdefs/Makefile.am13
-rw-r--r--src/arch/arm/v7/opdefs/strbt_A88209.d93
-rw-r--r--src/arch/arm/v7/opdefs/strd_A88210.d75
-rw-r--r--src/arch/arm/v7/opdefs/strd_A88211.d54
-rw-r--r--src/arch/arm/v7/opdefs/strex_A88212.d68
-rw-r--r--src/arch/arm/v7/opdefs/strexb_A88213.d67
-rw-r--r--src/arch/arm/v7/opdefs/strexd_A88214.d69
-rw-r--r--src/arch/arm/v7/opdefs/strexh_A88215.d67
-rw-r--r--src/arch/arm/v7/opdefs/strh_A88216.d81
-rw-r--r--src/arch/arm/v7/opdefs/strh_A88217.d53
-rw-r--r--src/arch/arm/v7/opdefs/strh_A88218.d88
-rw-r--r--src/arch/arm/v7/opdefs/strht_A88219.d92
-rw-r--r--src/arch/arm/v7/opdefs/strt_A88220.d93
13 files changed, 913 insertions, 0 deletions
diff --git a/src/arch/arm/v7/opdefs/Makefile.am b/src/arch/arm/v7/opdefs/Makefile.am
index 578e4a5..133810b 100644
--- a/src/arch/arm/v7/opdefs/Makefile.am
+++ b/src/arch/arm/v7/opdefs/Makefile.am
@@ -211,9 +211,22 @@ ARMV7_DEFS = \
smull_A88189.d \
str_A88203.d \
str_A88204.d \
+ str_A88205.d \
strb_A88206.d \
strb_A88207.d \
strb_A88208.d \
+ strbt_A88209.d \
+ strd_A88210.d \
+ strd_A88211.d \
+ strex_A88212.d \
+ strexb_A88213.d \
+ strexd_A88214.d \
+ strexh_A88215.d \
+ strh_A88216.d \
+ strh_A88217.d \
+ strh_A88218.d \
+ strht_A88219.d \
+ strt_A88220.d \
sub_A88221.d \
sub_A88222.d \
sub_A88223.d \
diff --git a/src/arch/arm/v7/opdefs/strbt_A88209.d b/src/arch/arm/v7/opdefs/strbt_A88209.d
new file mode 100644
index 0000000..2bcb260
--- /dev/null
+++ b/src/arch/arm/v7/opdefs/strbt_A88209.d
@@ -0,0 +1,93 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * ##FILE## - traduction d'instructions ARMv7
+ *
+ * Copyright (C) 2015 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+@title STRBT
+
+@desc Store Register Byte Unprivileged stores a byte from a register to memory. For information about memory accesses see Memory accesses on page A8-294. The memory access is restricted as if the processor were running in User mode. This makes no difference if the processor is actually running in User mode. STRBT is UNPREDICTABLE in Hyp mode. The Thumb instruction uses an offset addressing mode, that calculates the address used for the memory access from a base register value and an immediate offset, and leaves the base register unchanged. The ARM instruction uses a post-indexed addressing mode, that uses a base register value as the address for the memory access, and calculates a new address from a base register value and an offset and writes it back to the base register. The offset can be an immediate value or an optionally-shifted register value.
+
+@encoding (T1) {
+
+ @word 1 1 1 1 1 0 0 0 0 0 0 0 Rn(4) Rt(4) 1 1 1 0 imm8(8)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ imm32 = ZeroExtend(imm8, 32)
+ mem_access = MakeMemoryAccess(reg_N, imm32, NULL, true, true, false)
+
+ }
+
+}
+
+@encoding (A1) {
+
+ @word cond(4) 0 1 0 0 U(1) 1 1 0 Rn(4) Rt(4) imm12(12)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ add = (U == '1')
+ imm32 = ZeroExtend(imm12, 32)
+ mem_access = MakeMemoryAccess(reg_N, imm32, NULL, false, add, false)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+
+@encoding (A2) {
+
+ @word cond(4) 0 1 1 0 U(1) 1 1 0 Rn(4) Rt(4) imm5(5) type(2) 0 Rm(4)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ reg_M = Register(Rm)
+ add = (U == '1')
+ shift = DecodeImmShift(type, imm5)
+ mem_access = MakeMemoryAccess(reg_N, reg_M, shift, false, add, false)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+
diff --git a/src/arch/arm/v7/opdefs/strd_A88210.d b/src/arch/arm/v7/opdefs/strd_A88210.d
new file mode 100644
index 0000000..437bcb3
--- /dev/null
+++ b/src/arch/arm/v7/opdefs/strd_A88210.d
@@ -0,0 +1,75 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * ##FILE## - traduction d'instructions ARMv7
+ *
+ * Copyright (C) 2015 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+@title STRD (immediate)
+
+@desc Store Register Dual (immediate) calculates an address from a base register value and an immediate offset, and stores two words from two registers to memory. It can use offset, post-indexed, or pre-indexed addressing. For information about memory accesses see Memory accesses on page A8-294.
+
+@encoding (T1) {
+
+ @word 1 1 1 0 1 0 0 P(1) U(1) 1 W(1) 0 Rn(4) Rt(4) Rt2(4) imm8(8)
+
+ @syntax <reg_T> <reg_T2> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_T2 = Register(Rt2)
+ reg_N = Register(Rn)
+ imm32 = ZeroExtend(imm8:'00', 32)
+ index = (P == '1')
+ add = (U == '1')
+ wback = (W == '1')
+ mem_access = MakeMemoryAccess(reg_N, imm32, NULL, index, add, wback)
+
+ }
+
+}
+
+@encoding (A1) {
+
+ @word cond(4) 0 0 0 P(1) U(1) 1 W(1) 0 Rn(4) Rt(4) imm4H(4) 1 1 1 1 imm4L(4)
+
+ @syntax <reg_T> <reg_T2> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_T2 = NextRegister(reg_T)
+ reg_N = Register(Rn)
+ imm32 = ZeroExtend(imm4H:imm4L, 32)
+ index = (P == '1')
+ add = (U == '1')
+ wback = (P == '0') || (W == '1')
+ mem_access = MakeMemoryAccess(reg_N, imm32, NULL, index, add, wback)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+
diff --git a/src/arch/arm/v7/opdefs/strd_A88211.d b/src/arch/arm/v7/opdefs/strd_A88211.d
new file mode 100644
index 0000000..b30d4a5
--- /dev/null
+++ b/src/arch/arm/v7/opdefs/strd_A88211.d
@@ -0,0 +1,54 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * ##FILE## - traduction d'instructions ARMv7
+ *
+ * Copyright (C) 2015 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+@title STRD (register)
+
+@desc Store Register Dual (register) calculates an address from a base register value and a register offset, and stores two words from two registers to memory. It can use offset, post-indexed, or pre-indexed addressing. For information about memory accesses see Memory accesses on page A8-294.
+
+@encoding (A1) {
+
+ @word cond(4) 0 0 0 P(1) U(1) 0 W(1) 0 Rn(4) Rt(4) 0 0 0 0 1 1 1 1 Rm(4)
+
+ @syntax <reg_T> <reg_T2> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_T2 = NextRegister(reg_T)
+ reg_N = Register(Rn)
+ reg_M = Register(Rm)
+ index = (P == '1')
+ add = (U == '1')
+ wback = (P == '0') || (W == '1')
+ mem_access = MakeMemoryAccess(reg_N, reg_M, NULL, index, add, wback)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+
diff --git a/src/arch/arm/v7/opdefs/strex_A88212.d b/src/arch/arm/v7/opdefs/strex_A88212.d
new file mode 100644
index 0000000..65a7dfe
--- /dev/null
+++ b/src/arch/arm/v7/opdefs/strex_A88212.d
@@ -0,0 +1,68 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * ##FILE## - traduction d'instructions ARMv7
+ *
+ * Copyright (C) 2015 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+@title STREX
+
+@desc Store Register Exclusive calculates an address from a base register value and an immediate offset, and stores a word from a register to memory if the executing processor has exclusive access to the memory addressed. For more information about support for shared memory see Synchronization and semaphores on page A3-114. For information about memory accesses see Memory accesses on page A8-294.
+
+@encoding (T1) {
+
+ @word 1 1 1 0 1 0 0 0 0 1 0 0 Rn(4) Rt(4) Rd(4) imm8(8)
+
+ @syntax <reg_D> <reg_T> <mem_access>
+
+ @conv {
+
+ reg_D = Register(Rd)
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ imm32 = ZeroExtend(imm8:'00', 32)
+ mem_access = MakeMemoryAccess(reg_N, imm32, NULL, true, false, false)
+
+ }
+
+}
+
+@encoding (A1) {
+
+ @word cond(4) 0 0 0 1 1 0 0 0 Rn(4) Rd(4) 1 1 1 1 1 0 0 1 Rt(4)
+
+ @syntax <reg_D> <reg_T> <mem_access>
+
+ @conv {
+
+ reg_D = Register(Rd)
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ mem_access = MakeMemoryAccess(reg_N, NULL, NULL, true, false, false)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+
diff --git a/src/arch/arm/v7/opdefs/strexb_A88213.d b/src/arch/arm/v7/opdefs/strexb_A88213.d
new file mode 100644
index 0000000..0197d6c
--- /dev/null
+++ b/src/arch/arm/v7/opdefs/strexb_A88213.d
@@ -0,0 +1,67 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * ##FILE## - traduction d'instructions ARMv7
+ *
+ * Copyright (C) 2015 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+@title STREXB
+
+@desc Store Register Exclusive Byte derives an address from a base register value, and stores a byte from a register to memory if the executing processor has exclusive access to the memory addressed. For more information about support for shared memory see Synchronization and semaphores on page A3-114. For information about memory accesses see Memory accesses on page A8-294.
+
+@encoding (T1) {
+
+ @word 1 1 1 0 1 0 0 0 1 1 0 0 Rn(4) Rt(4) 1 1 1 1 0 1 0 0 Rd(4)
+
+ @syntax <reg_D> <reg_T> <mem_access>
+
+ @conv {
+
+ reg_D = Register(Rd)
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ mem_access = MakeMemoryAccess(reg_N, NULL, NULL, true, false, false)
+
+ }
+
+}
+
+@encoding (A1) {
+
+ @word cond(4) 0 0 0 1 1 1 0 0 Rn(4) Rd(4) 1 1 1 1 1 0 0 1 Rt(4)
+
+ @syntax <reg_D> <reg_T> <mem_access>
+
+ @conv {
+
+ reg_D = Register(Rd)
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ mem_access = MakeMemoryAccess(reg_N, NULL, NULL, true, false, false)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+
diff --git a/src/arch/arm/v7/opdefs/strexd_A88214.d b/src/arch/arm/v7/opdefs/strexd_A88214.d
new file mode 100644
index 0000000..2867cea
--- /dev/null
+++ b/src/arch/arm/v7/opdefs/strexd_A88214.d
@@ -0,0 +1,69 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * ##FILE## - traduction d'instructions ARMv7
+ *
+ * Copyright (C) 2015 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+@title STREXD
+
+@desc Store Register Exclusive Doubleword derives an address from a base register value, and stores a 64-bit doubleword from two registers to memory if the executing processor has exclusive access to the memory addressed. For more information about support for shared memory see Synchronization and semaphores on page A3-114. For information about memory accesses see Memory accesses on page A8-294.
+
+@encoding (T1) {
+
+ @word 1 1 1 0 1 0 0 0 1 1 0 0 Rn(4) Rt(4) Rt2(4) 0 1 1 1 Rd(4)
+
+ @syntax <reg_D> <reg_T> <reg_T2> <mem_access>
+
+ @conv {
+
+ reg_D = Register(Rd)
+ reg_T = Register(Rt)
+ reg_T2 = Register(Rt2)
+ reg_N = Register(Rn)
+ mem_access = MakeMemoryAccess(reg_N, NULL, NULL, true, false, false)
+
+ }
+
+}
+
+@encoding (A1) {
+
+ @word cond(4) 0 0 0 1 1 0 1 0 Rn(4) Rd(4) 1 1 1 1 1 0 0 1 Rt(4)
+
+ @syntax <reg_D> <reg_T> <reg_T2> <mem_access>
+
+ @conv {
+
+ reg_D = Register(Rd)
+ reg_T = Register(Rt)
+ reg_T2 = NextRegister(reg_T)
+ reg_N = Register(Rn)
+ mem_access = MakeMemoryAccess(reg_N, NULL, NULL, true, false, false)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+
diff --git a/src/arch/arm/v7/opdefs/strexh_A88215.d b/src/arch/arm/v7/opdefs/strexh_A88215.d
new file mode 100644
index 0000000..4ca0b6f
--- /dev/null
+++ b/src/arch/arm/v7/opdefs/strexh_A88215.d
@@ -0,0 +1,67 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * ##FILE## - traduction d'instructions ARMv7
+ *
+ * Copyright (C) 2015 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+@title STREXH
+
+@desc Store Register Exclusive Halfword derives an address from a base register value, and stores a halfword from a register to memory if the executing processor has exclusive access to the memory addressed. For more information about support for shared memory see Synchronization and semaphores on page A3-114. For information about memory accesses see Memory accesses on page A8-294.
+
+@encoding (T1) {
+
+ @word 1 1 1 0 1 0 0 0 1 1 0 0 Rn(4) Rt(4) 1 1 1 1 0 1 0 1 Rd(4)
+
+ @syntax <reg_D> <reg_T> <mem_access>
+
+ @conv {
+
+ reg_D = Register(Rd)
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ mem_access = MakeMemoryAccess(reg_N, NULL, NULL, true, false, false)
+
+ }
+
+}
+
+@encoding (A1) {
+
+ @word cond(4) 0 0 0 1 1 1 1 0 Rn(4) Rd(4) 1 1 1 1 1 0 0 1 Rt(4)
+
+ @syntax <reg_D> <reg_T> <mem_access>
+
+ @conv {
+
+ reg_D = Register(Rd)
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ mem_access = MakeMemoryAccess(reg_N, NULL, NULL, true, false, false)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+
diff --git a/src/arch/arm/v7/opdefs/strh_A88216.d b/src/arch/arm/v7/opdefs/strh_A88216.d
new file mode 100644
index 0000000..624b483
--- /dev/null
+++ b/src/arch/arm/v7/opdefs/strh_A88216.d
@@ -0,0 +1,81 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * ##FILE## - traduction d'instructions ARMv7
+ *
+ * Copyright (C) 2015 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+@title STRH (immediate, Thumb)
+
+@desc Store Register Halfword (immediate) calculates an address from a base register value and an immediate offset, and stores a halfword from a register to memory. It can use offset, post-indexed, or pre-indexed addressing. For information about memory accesses see Memory accesses on page A8-294.
+
+@encoding (t1) {
+
+ @half 1 0 0 0 0 imm5(5) Rn(3) Rt(3)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ imm32 = ZeroExtend(imm5:'0', 32)
+ mem_access = MakeMemoryAccess(reg_N, imm32, NULL, true, true, false)
+
+ }
+
+}
+
+@encoding (T2) {
+
+ @word 1 1 1 1 1 0 0 0 1 0 1 0 Rn(4) Rt(4) imm12(12)
+
+ @syntax ".W" <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ imm32 = ZeroExtend(imm12, 32)
+ mem_access = MakeMemoryAccess(reg_N, imm32, NULL, true, true, false)
+
+ }
+
+}
+
+@encoding (T3) {
+
+ @word 1 1 1 1 1 0 0 0 0 0 1 0 Rn(4) Rt(4) 1 P(1) U(1) W(1) imm8(8)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ imm32 = ZeroExtend(imm8, 32)
+ index = (P == '1')
+ add = (U == '1')
+ wback = (W == '1')
+ mem_access = MakeMemoryAccess(reg_N, imm32, NULL, index, add, wback)
+
+ }
+
+}
+
diff --git a/src/arch/arm/v7/opdefs/strh_A88217.d b/src/arch/arm/v7/opdefs/strh_A88217.d
new file mode 100644
index 0000000..3b5f97c
--- /dev/null
+++ b/src/arch/arm/v7/opdefs/strh_A88217.d
@@ -0,0 +1,53 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * ##FILE## - traduction d'instructions ARMv7
+ *
+ * Copyright (C) 2015 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+@title STRH (immediate, ARM)
+
+@desc Store Register Halfword (immediate) calculates an address from a base register value and an immediate offset, and stores a halfword from a register to memory. It can use offset, post-indexed, or pre-indexed addressing. For information about memory accesses see Memory accesses on page A8-294.
+
+@encoding (A1) {
+
+ @word cond(4) 0 0 0 P(1) U(1) 1 W(1) 0 Rn(4) Rt(4) imm4H(4) 1 0 1 1 imm4L(4)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ imm32 = ZeroExtend(imm4H:imm4L, 32)
+ index = (P == '1')
+ add = (U == '1')
+ wback = (P == '0') || (W == '1')
+ mem_access = MakeMemoryAccess(reg_N, imm32, NULL, index, add, wback)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+
diff --git a/src/arch/arm/v7/opdefs/strh_A88218.d b/src/arch/arm/v7/opdefs/strh_A88218.d
new file mode 100644
index 0000000..1e9dc1f
--- /dev/null
+++ b/src/arch/arm/v7/opdefs/strh_A88218.d
@@ -0,0 +1,88 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * ##FILE## - traduction d'instructions ARMv7
+ *
+ * Copyright (C) 2015 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+@title STRH (register)
+
+@desc Store Register Halfword (register) calculates an address from a base register value and an offset register value, and stores a halfword from a register to memory. The offset register value can be shifted left by 0, 1, 2, or 3 bits. For information about memory accesses see Memory accesses on page A8-294.
+
+@encoding (t1) {
+
+ @half 0 1 0 1 0 0 1 Rm(3) Rn(3) Rt(3)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ reg_M = Register(Rm)
+ mem_access = MakeMemoryAccess(reg_N, reg_M, NULL, true, true, false)
+
+ }
+
+}
+
+@encoding (T2) {
+
+ @word 1 1 1 1 1 0 0 0 0 0 1 0 Rn(4) Rt(4) 0 0 0 0 0 0 imm2(2) Rm(4)
+
+ @syntax ".W" <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ reg_M = Register(Rm)
+ shift = DecodeImmShift(0, imm2)
+ mem_access = MakeMemoryAccess(reg_N, reg_M, shift, true, true, false)
+
+ }
+
+}
+
+@encoding (A1) {
+
+ @word cond(4) 0 0 0 P(1) U(1) 0 W(1) 0 Rn(4) Rt(4) 0 0 0 0 1 0 1 1 Rm(4)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ reg_M = Register(Rm)
+ index = (P == '1')
+ add = (U == '1')
+ wback = (P == '0') || (W == '1')
+ mem_access = MakeMemoryAccess(reg_N, reg_M, NULL, index, add, wback)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+
diff --git a/src/arch/arm/v7/opdefs/strht_A88219.d b/src/arch/arm/v7/opdefs/strht_A88219.d
new file mode 100644
index 0000000..3811572
--- /dev/null
+++ b/src/arch/arm/v7/opdefs/strht_A88219.d
@@ -0,0 +1,92 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * ##FILE## - traduction d'instructions ARMv7
+ *
+ * Copyright (C) 2015 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+@title STRHT
+
+@desc Store Register Halfword Unprivileged stores a halfword from a register to memory. For information about memory accesses see Memory accesses on page A8-294. The memory access is restricted as if the processor were running in User mode. This makes no difference if the processor is actually running in User mode. STRHT is UNPREDICTABLE in Hyp mode. The Thumb instruction uses an offset addressing mode, that calculates the address used for the memory access from a base register value and an immediate offset, and leaves the base register unchanged. The ARM instruction uses a post-indexed addressing mode, that uses a base register value as the address for the memory access, and calculates a new address from a base register value and an offset and writes it back to the base register. The offset can be an immediate value or a register value.
+
+@encoding (T1) {
+
+ @word 1 1 1 1 1 0 0 0 0 0 1 0 Rn(4) Rt(4) 1 1 1 0 imm8(8)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ imm32 = ZeroExtend(imm8, 32)
+ mem_access = MakeMemoryAccess(reg_N, imm32, NULL, true, true, false)
+
+ }
+
+}
+
+@encoding (A1) {
+
+ @word cond(4) 0 0 0 0 U(1) 1 1 0 Rn(4) Rt(4) imm4H(4) 1 0 1 1 imm4L(4)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ add = (U == '1')
+ imm32 = ZeroExtend(imm4H:imm4L, 32)
+ mem_access = MakeMemoryAccess(reg_N, imm32, NULL, false, add, false)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+
+@encoding (A2) {
+
+ @word cond(4) 0 0 0 0 U(1) 0 1 0 Rn(4) Rt(4) 0 0 0 0 1 0 1 1 Rm(4)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ reg_M = Register(Rm)
+ add = (U == '1')
+ mem_access = MakeMemoryAccess(reg_N, reg_M, NULL, false, add, false)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+
diff --git a/src/arch/arm/v7/opdefs/strt_A88220.d b/src/arch/arm/v7/opdefs/strt_A88220.d
new file mode 100644
index 0000000..794a0fa
--- /dev/null
+++ b/src/arch/arm/v7/opdefs/strt_A88220.d
@@ -0,0 +1,93 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * ##FILE## - traduction d'instructions ARMv7
+ *
+ * Copyright (C) 2015 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+@title STRT
+
+@desc Store Register Unprivileged stores a word from a register to memory. For information about memory accesses see Memory accesses on page A8-294. The memory access is restricted as if the processor were running in User mode. This makes no difference if the processor is actually running in User mode. STRT is UNPREDICTABLE in Hyp mode. The Thumb instruction uses an offset addressing mode, that calculates the address used for the memory access from a base register value and an immediate offset, and leaves the base register unchanged. The ARM instruction uses a post-indexed addressing mode, that uses a base register value as the address for the memory access, and calculates a new address from a base register value and an offset and writes it back to the base register. The offset can be an immediate value or an optionally-shifted register value.
+
+@encoding (T1) {
+
+ @word 1 1 1 1 1 0 0 0 0 1 0 0 Rn(4) Rt(4) 1 1 1 0 imm8(8)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ imm32 = ZeroExtend(imm8, 32)
+ mem_access = MakeMemoryAccess(reg_N, imm32, NULL, true, true, false)
+
+ }
+
+}
+
+@encoding (A1) {
+
+ @word cond(4) 0 1 0 0 U(1) 0 1 0 Rn(4) Rt(4) imm12(12)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ add = (U == '1')
+ imm32 = ZeroExtend(imm12, 32)
+ mem_access = MakeMemoryAccess(reg_N, imm32, NULL, false, add, false)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+
+@encoding (A2) {
+
+ @word cond(4) 0 1 1 0 U(1) 0 1 0 Rn(4) Rt(4) imm5(5) type(2) 0 Rm(4)
+
+ @syntax <reg_T> <mem_access>
+
+ @conv {
+
+ reg_T = Register(Rt)
+ reg_N = Register(Rn)
+ reg_M = Register(Rm)
+ add = (U == '1')
+ shift = DecodeImmShift(type, imm5)
+ mem_access = MakeMemoryAccess(reg_N, reg_M, shift, false, add, false)
+
+ }
+
+ @rules {
+
+ chk_call StoreCondition(cond)
+
+ }
+
+}
+