summaryrefslogtreecommitdiff
path: root/tools/d2c/conv
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-05-22 15:43:43 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-05-22 15:43:43 (GMT)
commit7577eadd4e871d467f747c4927a1b1984d6a7606 (patch)
treee72a2fd5c1619e60402a678b0559079ed267eab0 /tools/d2c/conv
parent33aa90b022e7d711a733ca7eb62c0b285f974317 (diff)
Extended the compiler to transform all the new ARMv7 encoding definitions.
Diffstat (limited to 'tools/d2c/conv')
-rw-r--r--tools/d2c/conv/manager.c154
-rw-r--r--tools/d2c/conv/manager.h15
2 files changed, 156 insertions, 13 deletions
diff --git a/tools/d2c/conv/manager.c b/tools/d2c/conv/manager.c
index fca9ce0..09368ce 100644
--- a/tools/d2c/conv/manager.c
+++ b/tools/d2c/conv/manager.c
@@ -42,6 +42,8 @@
/* Fonction de conversion */
struct _conv_func
{
+ bool used; /* Conversion utilisée ? */
+ bool intermediate; /* Variable intermédiaire ? */
bool declared; /* Expression déjà déclarée ? */
bool defined; /* Expression déjà définie ? */
@@ -241,9 +243,10 @@ bool compute_conv_func_size(const conv_func *func, const coding_bits *bits, cons
/******************************************************************************
* *
-* Paramètres : func = fonction de conversion à manipuler. *
-* bits = gestionnaire des bits d'encodage. *
-* list = liste de l'ensemble des fonctions de conversion. *
+* Paramètres : func = fonction de conversion à manipuler. *
+* inter = note un résultat de conversion comme intermédiaire. *
+* bits = gestionnaire des bits d'encodage. *
+* list = liste de l'ensemble des fonctions de conversion. *
* *
* Description : Marque les champs utilisés par une fonction de conversion. *
* *
@@ -253,10 +256,13 @@ bool compute_conv_func_size(const conv_func *func, const coding_bits *bits, cons
* *
******************************************************************************/
-bool mark_conv_func(conv_func *func, const coding_bits *bits, const conv_list *list)
+bool mark_conv_func(conv_func *func, bool inter, const coding_bits *bits, const conv_list *list)
{
bool result; /* Bilan à remonter */
+ func->used = true;
+ func->intermediate |= inter;
+
if (func->is_expr)
result = ensure_arg_expr_content_fully_marked(func->expr, bits, list);
else
@@ -273,6 +279,7 @@ bool mark_conv_func(conv_func *func, const coding_bits *bits, const conv_list *l
* fd = descripteur d'un flux ouvert en écriture. *
* bits = gestionnaire des bits d'encodage. *
* list = liste de l'ensemble des fonctions de conversion. *
+* pp = pré-processeur pour les échanges de chaînes. *
* wide = taille des mots décodés. *
* *
* Description : Déclare les variables associées à une fonction de conversion.*
@@ -283,18 +290,31 @@ bool mark_conv_func(conv_func *func, const coding_bits *bits, const conv_list *l
* *
******************************************************************************/
-bool declare_conv_func(conv_func *func, int fd, const coding_bits *bits, const conv_list *list, unsigned int wide)
+bool declare_conv_func(conv_func *func, int fd, const coding_bits *bits, const conv_list *list, const pre_processor *pp, unsigned int wide)
{
bool result; /* Bilan à remonter */
+ printf(" -> declaration for '%s': declared ? %d - expr ? %d\n",
+ func->dest, func->declared, func->is_expr);
+
+ assert(func->used);
+
/* Si la fonction a déjà été définie lors d'un précédent besoin... */
if (func->declared) return true;
if (func->is_expr)
- result = ensure_arg_expr_content_fully_declared(func->expr, fd, bits, list, wide);
+ result = ensure_arg_expr_content_fully_declared(func->expr, fd, bits, list, pp, wide);
else
- result = ensure_arg_list_content_fully_declared(func->args, fd, bits, list, wide);
+ result = ensure_arg_list_content_fully_declared(func->args, fd, bits, list, pp, wide);
+
+ if (result && func->intermediate)
+ {
+ if (!func->is_expr && is_operand_producer(pp, func->name))
+ dprintf(fd, "\t\tGArchOperand *val_%s;\n", func->dest);
+ else
+ dprintf(fd, "\t\tuint%u_t val_%s;\n", wide, func->dest);
+ }
func->declared = result;
@@ -305,6 +325,25 @@ bool declare_conv_func(conv_func *func, int fd, const coding_bits *bits, const c
/******************************************************************************
* *
+* Paramètres : func = fonction de conversion à consulter. *
+* *
+* Description : Indique si une conversion a déjà été définie. *
+* *
+* Retour : Etat de la définition. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool is_conv_func_already_defined(const conv_func *func)
+{
+ return func->defined;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : func = fonction de conversion à manipuler. *
* last = précise si la conversion est la dernière. *
* internal = indique le type de manipulation finale. *
@@ -313,6 +352,7 @@ bool declare_conv_func(conv_func *func, int fd, const coding_bits *bits, const c
* bits = gestionnaire des bits d'encodage. *
* list = liste de l'ensemble des fonctions de conversion. *
* pp = pré-processeur pour les échanges de chaînes. *
+* exit = exprime le besoin d'une voie de sortie. [OUT] *
* *
* Description : Définit les variables associées à une fonction de conversion.*
* *
@@ -322,7 +362,7 @@ bool declare_conv_func(conv_func *func, int fd, const coding_bits *bits, const c
* *
******************************************************************************/
-bool define_conv_func(conv_func *func, bool last, bool internal, int fd, const char *arch, const coding_bits *bits, const conv_list *list, const pre_processor *pp)
+bool define_conv_func(conv_func *func, bool last, bool internal, int fd, const char *arch, const coding_bits *bits, const conv_list *list, const pre_processor *pp, bool *exit)
{
bool result; /* Bilan à remonter */
const char *callable; /* Fonction à appeler */
@@ -331,9 +371,9 @@ bool define_conv_func(conv_func *func, bool last, bool internal, int fd, const c
if (func->defined) return true;
if (func->is_expr)
- result = ensure_arg_expr_content_fully_defined(func->expr, fd, arch, bits, list, pp);
+ result = ensure_arg_expr_content_fully_defined(func->expr, fd, arch, bits, list, pp, exit);
else
- result = ensure_arg_list_content_fully_defined(func->args, fd, arch, bits, list, pp);
+ result = ensure_arg_list_content_fully_defined(func->args, fd, arch, bits, list, pp, exit);
/* Nom de la fonction effectivement appelée */
@@ -396,6 +436,12 @@ bool define_conv_func(conv_func *func, bool last, bool internal, int fd, const c
dprintf(fd, ";\n");
+ if (!func->is_expr && is_operand_producer(pp, func->name))
+ {
+ dprintf(fd, "\t\tif (val_%s == NULL) goto bad_exit;\n", func->dest);
+ *exit = true;
+ }
+
}
func->defined = result;
@@ -516,3 +562,91 @@ conv_func *find_named_conv_in_list(const conv_list *list, const char *name)
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : list = liste de fonctions de conversion à consulter. *
+* fd = descripteur d'un flux ouvert en écriture. *
+* bits = gestionnaire des bits d'encodage. *
+* pp = pré-processeur pour les échanges de chaînes. *
+* wide = taille des mots décodés. *
+* *
+* Description : Déclare l'ensemble des variables intermédiaires. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool declare_used_intermediate_conversions(const conv_list *list, int fd, const coding_bits *bits, const pre_processor *pp, unsigned int wide)
+{
+ bool result; /* Bilan à remonter */
+ size_t i; /* Boucle de parcours */
+ conv_func *func; /* Conversion à traiter */
+
+ result = true;
+
+ for (i = 0; i < list->func_count && result; i++)
+ {
+ func = list->functions[i];
+
+ if (func->used && func->intermediate)
+ result = declare_conv_func(func, fd, bits, list, pp, wide);
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : list = liste de fonctions de conversion à consulter. *
+* fd = descripteur d'un flux ouvert en écriture. *
+* arch = architecture visée par l'opération globale. *
+* bits = gestionnaire des bits d'encodage. *
+* pp = pré-processeur pour les échanges de chaînes. *
+* exit = exprime le besoin d'une voie de sortie. [OUT] *
+* *
+* Description : Définit l'ensemble des variables intermédiaires. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool define_used_intermediate_conversions(const conv_list *list, int fd, const char *arch, const coding_bits *bits, const pre_processor *pp, bool *exit)
+{
+ bool result; /* Bilan à remonter */
+ bool got_one; /* Suit le nombre d'impressions*/
+ size_t i; /* Boucle de parcours */
+ conv_func *func; /* Conversion à traiter */
+
+ result = true;
+
+ got_one = false;
+
+ for (i = 0; i < list->func_count && result; i++)
+ {
+ func = list->functions[i];
+
+ if (func->used && func->intermediate)
+ {
+ result = define_conv_func(func, false, false, fd, arch, bits, list, pp, exit);
+
+ got_one = true;
+
+ }
+
+ }
+
+ if (got_one)
+ dprintf(fd, "\n");
+
+ return result;
+
+}
diff --git a/tools/d2c/conv/manager.h b/tools/d2c/conv/manager.h
index abd6c6f..3ea64fb 100644
--- a/tools/d2c/conv/manager.h
+++ b/tools/d2c/conv/manager.h
@@ -60,13 +60,16 @@ bool is_conv_func_expression(const conv_func *);
bool compute_conv_func_size(const conv_func *, const coding_bits *, const conv_list *, unsigned int *);
/* Marque les champs utilisés par une fonction de conversion. */
-bool mark_conv_func(conv_func *, const coding_bits *, const conv_list *);
+bool mark_conv_func(conv_func *, bool, const coding_bits *, const conv_list *);
/* Déclare les variables associées à une fonction de conversion. */
-bool declare_conv_func(conv_func *, int, const coding_bits *, const conv_list *, unsigned int);
+bool declare_conv_func(conv_func *, int, const coding_bits *, const conv_list *, const pre_processor *, unsigned int);
+
+/* Indique si une conversion a déjà été définie. */
+bool is_conv_func_already_defined(const conv_func *);
/* Définit les variables associées à une fonction de conversion. */
-bool define_conv_func(conv_func *, bool, bool, int, const char *, const coding_bits *, const conv_list *, const pre_processor *);
+bool define_conv_func(conv_func *, bool, bool, int, const char *, const coding_bits *, const conv_list *, const pre_processor *, bool *);
@@ -89,6 +92,12 @@ void register_conversion(conv_list *, conv_func *);
/* Recherche un résultat précis dans une liste de fonctions. */
conv_func *find_named_conv_in_list(const conv_list *, const char *);
+/* Déclare l'ensemble des variables intermédiaires. */
+bool declare_used_intermediate_conversions(const conv_list *, int, const coding_bits *, const pre_processor *, unsigned int);
+
+/* Définit l'ensemble des variables intermédiaires. */
+bool define_used_intermediate_conversions(const conv_list *, int, const char *, const coding_bits *, const pre_processor *, bool *);
+
#endif /* _TOOLS_D2C_CONV_MANAGER_H */