summaryrefslogtreecommitdiff
path: root/src/arch/arm/v7/helpers.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-11-14 19:22:25 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-11-14 19:22:25 (GMT)
commit44e6aa9039585ad95fb9c6f21535d89457563297 (patch)
treea613aec315c32dcd83be426c31eb1bffc76ee657 /src/arch/arm/v7/helpers.c
parent8056807369571b593b25fad926daa6a447d757fa (diff)
Rewritten and extended the whole code for the instructions definitions compiler.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@419 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/arm/v7/helpers.c')
-rw-r--r--src/arch/arm/v7/helpers.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/arch/arm/v7/helpers.c b/src/arch/arm/v7/helpers.c
index 632c1b7..e7c9ad8 100644
--- a/src/arch/arm/v7/helpers.c
+++ b/src/arch/arm/v7/helpers.c
@@ -26,11 +26,67 @@
#include "register.h"
#include "../../register.h"
+#include "../../immediate.h"
+#include "../../../common/asm.h"
/******************************************************************************
* *
+* Paramètres : value = valeur sur 32 bits maximum à traiter. *
+* topbit = valeur du bit de poids fort manipulé. *
+* size = taille de la valeur finale à constituer. *
+* *
+* Description : Crée un opérande de valeur immédiate avec extension de signe.*
+* *
+* Retour : Adresse de la structure mise en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GArchOperand *sign_extend_armv7_imm(uint32_t value, bool topbit, unsigned int size)
+{
+ GArchOperand *result; /* Opérande à faire remonter */
+ unsigned int msb; /* Position du premier bit à 1 */
+ MemoryDataSize mds; /* Conversion de la taille */
+ uint32_t val4; /* Valeur sur 4 bits */
+ uint32_t val8; /* Valeur sur 8 bits */
+ uint32_t val16; /* Valeur sur 16 bits */
+ uint32_t val32; /* Valeur sur 32 bits */
+ unsigned int i; /* Boucle de parcours */
+
+ result = NULL;
+
+ topbit &= msb_32(value, &msb);
+
+ switch (size)
+ {
+
+#define SIGN_EXTEND_CASE(sz) \
+ case sz: \
+ mds = MDS_ ## sz ## _BITS_SIGNED; \
+ val ## sz = value; \
+ if (topbit) \
+ for (i = msb + 1; i < sz; i++) \
+ val ## sz |= (1 << i); \
+ result = g_imm_operand_new_from_value(mds, val ## sz); \
+ break;
+
+ SIGN_EXTEND_CASE(4);
+ SIGN_EXTEND_CASE(8);
+ SIGN_EXTEND_CASE(16);
+ SIGN_EXTEND_CASE(32);
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : index = indice du registre correspondant. *
* *
* Description : Crée un opérande représentant un registre ARMv7. *