summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-05-31 16:24:27 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-05-31 16:24:27 (GMT)
commit48b4166d1f2931fa7f311b6ec1c77153052e63a0 (patch)
treeae00744c32653ac8196b51f7060d00283071cf4f /tools
parentc492a5c94cc20210bce8069db7235cbb7dd691e9 (diff)
Handled lists of simples ARMv7 SIMD registers.
Diffstat (limited to 'tools')
-rw-r--r--tools/d2c/args/manager.c6
-rw-r--r--tools/d2c/assert/manager.c123
-rw-r--r--tools/d2c/assert/tokens.l2
3 files changed, 128 insertions, 3 deletions
diff --git a/tools/d2c/args/manager.c b/tools/d2c/args/manager.c
index eca3bab..8706694 100644
--- a/tools/d2c/args/manager.c
+++ b/tools/d2c/args/manager.c
@@ -1030,6 +1030,9 @@ bool define_arg_expr(const arg_expr_t *expr, int fd, const coding_bits *bits, co
result = compute_arg_expr_size(expr, bits, list, &max_size);
+ if (result && expr->comp_count > 1)
+ dprintf(fd, "(");
+
for (i = 0; i < expr->comp_count && result; i++)
{
cname = expr->comp_items[i];
@@ -1082,6 +1085,9 @@ bool define_arg_expr(const arg_expr_t *expr, int fd, const coding_bits *bits, co
}
+ if (result && expr->comp_count > 1)
+ dprintf(fd, ")");
+
break;
case CET_UNARY:
diff --git a/tools/d2c/assert/manager.c b/tools/d2c/assert/manager.c
index 2ccf468..4fe1860 100644
--- a/tools/d2c/assert/manager.c
+++ b/tools/d2c/assert/manager.c
@@ -63,6 +63,13 @@ struct _disass_assert
};
+/* Définit le masque correspondant à une valeur booléenne. */
+static char *get_disass_assert_mask(const char *);
+
+/* Définit la valeur correspondant à une valeur booléenne. */
+static char *get_disass_assert_value(const char *);
+
+
/******************************************************************************
* *
@@ -301,6 +308,8 @@ bool define_disass_assert(const disass_assert *dassert, int fd, const coding_bit
size_t j; /* Boucle de parcours #2 */
def_cond *cond; /* Condition à marquer */
raw_bitfield *rf; /* Champ de bits à marquer */
+ char *mask; /* Eventuel masque à appliquer */
+ char *expected; /* Valeur attendue */
for (i = 0; i < dassert->count; i++)
{
@@ -337,7 +346,22 @@ bool define_disass_assert(const disass_assert *dassert, int fd, const coding_bit
}
- write_raw_bitfield(rf, fd);
+ mask = get_disass_assert_mask(cond->value);
+
+ if (mask == NULL)
+ write_raw_bitfield(rf, fd);
+
+ else
+ {
+ dprintf(fd, "(");
+
+ write_raw_bitfield(rf, fd);
+
+ dprintf(fd, " & %s)", mask);
+
+ free(mask);
+
+ }
switch (cond->op)
{
@@ -351,7 +375,11 @@ bool define_disass_assert(const disass_assert *dassert, int fd, const coding_bit
}
- dprintf(fd, "b%s", cond->value);
+ expected = get_disass_assert_value(cond->value);
+
+ dprintf(fd, "%s", expected);
+
+ free(expected);
}
@@ -363,3 +391,94 @@ bool define_disass_assert(const disass_assert *dassert, int fd, const coding_bit
return true;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : value = valeur booléenne à écrire. *
+* *
+* Description : Définit le masque correspondant à une valeur booléenne. *
+* *
+* Retour : Masque à appliquer (et libérer) ou NULL si aucun. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static char *get_disass_assert_mask(const char *value)
+{
+ char *result; /* Masque à renvoyer */
+ char *iter; /* Boucle de parcours */
+
+ if (strchr(value, 'x') == NULL)
+ result = NULL;
+
+ else
+ {
+ result = strdup(value);
+
+ for (iter = result; *iter != '\0'; iter++)
+ switch (*iter)
+ {
+ case '0':
+ case '1':
+ *iter = '1';
+ break;
+
+ case 'x':
+ *iter = '0';
+ break;
+
+ default:
+ assert(false);
+ break;
+
+ }
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : value = valeur booléenne à écrire. *
+* *
+* Description : Définit la valeur correspondant à une valeur booléenne. *
+* *
+* Retour : Valeur à comparer et libérer. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static char *get_disass_assert_value(const char *value)
+{
+ char *result; /* Masque à renvoyer */
+ char *iter; /* Boucle de parcours */
+
+ result = strdup(value);
+
+ if (strchr(value, 'x') != NULL)
+ for (iter = result; *iter != '\0'; iter++)
+ switch (*iter)
+ {
+ case '0':
+ case '1':
+ break;
+
+ case 'x':
+ *iter = '0';
+ break;
+
+ default:
+ assert(false);
+ break;
+
+ }
+
+ return result;
+
+}
diff --git a/tools/d2c/assert/tokens.l b/tools/d2c/assert/tokens.l
index 192bcc7..e455a76 100644
--- a/tools/d2c/assert/tokens.l
+++ b/tools/d2c/assert/tokens.l
@@ -29,7 +29,7 @@
[A-Za-z_][A-Za-z0-9_]* { yylvalp->string = strdup(yytext); return FIELD; }
-[01]+ { yylvalp->string = strdup(yytext); return VALUE; }
+[01x]+ { yylvalp->string = strdup(yytext); return VALUE; }
. {
char *msg;