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/d2c | |
| parent | c492a5c94cc20210bce8069db7235cbb7dd691e9 (diff) | |
Handled lists of simples ARMv7 SIMD registers.
Diffstat (limited to 'tools/d2c')
| -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; | 
