diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2018-05-31 16:24:27 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2018-05-31 16:24:27 (GMT) |
commit | 48b4166d1f2931fa7f311b6ec1c77153052e63a0 (patch) | |
tree | ae00744c32653ac8196b51f7060d00283071cf4f /tools | |
parent | c492a5c94cc20210bce8069db7235cbb7dd691e9 (diff) |
Handled lists of simples ARMv7 SIMD registers.
Diffstat (limited to 'tools')
-rw-r--r-- | tools/d2c/args/manager.c | 6 | ||||
-rw-r--r-- | tools/d2c/assert/manager.c | 123 | ||||
-rw-r--r-- | tools/d2c/assert/tokens.l | 2 |
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; |