public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/clyon/heads/mve-autovec)] fix bool_mode
@ 2022-01-12 8:29 Christophe Lyon
0 siblings, 0 replies; only message in thread
From: Christophe Lyon @ 2022-01-12 8:29 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:8a7b815328c967d42fdd5f7ba8b8c7df9cdac0aa
commit 8a7b815328c967d42fdd5f7ba8b8c7df9cdac0aa
Author: Christophe Lyon <christophe.lyon@foss.st.com>
Date: Fri Dec 10 10:00:35 2021 +0000
fix bool_mode
Diff:
---
gcc/config/arm/arm-modes.def | 4 +--
gcc/emit-rtl.c | 11 +++++--
gcc/genmodes.c | 68 ++++++++++++++++++++++++++++++++++----------
gcc/machmode.def | 2 +-
4 files changed, 64 insertions(+), 21 deletions(-)
diff --git a/gcc/config/arm/arm-modes.def b/gcc/config/arm/arm-modes.def
index 068bbebe63d..52d150dedd4 100644
--- a/gcc/config/arm/arm-modes.def
+++ b/gcc/config/arm/arm-modes.def
@@ -85,8 +85,8 @@ VECTOR_MODE (FLOAT, BF, 4); /* V4BF. */
VECTOR_MODE (FLOAT, BF, 8); /* V8BF. */
/* Predicates for MVE. */
-FRACTIONAL_INT_MODE (B2I, 2, 1);
-FRACTIONAL_INT_MODE (B4I, 4, 1);
+BOOL_MODE (B2I, 2, 1);
+BOOL_MODE (B4I, 4, 1);
VECTOR_BOOL_MODE (V16BI, 16, BI, 2);
VECTOR_BOOL_MODE (V8BI, 8, B2I, 2);
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 6a50d9a704f..f8228bef6ea 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -6233,9 +6233,14 @@ init_emit_once (void)
/* For BImode, 1 and -1 are unsigned and signed interpretations
of the same value. */
- const_tiny_rtx[0][(int) BImode] = const0_rtx;
- const_tiny_rtx[1][(int) BImode] = const_true_rtx;
- const_tiny_rtx[3][(int) BImode] = const_true_rtx;
+ for (mode = MIN_MODE_BOOL;
+ mode <= MAX_MODE_BOOL;
+ mode = (machine_mode)((int)(mode) + 1))
+ {
+ const_tiny_rtx[0][(int) mode] = const0_rtx;
+ const_tiny_rtx[1][(int) mode] = const_true_rtx;
+ const_tiny_rtx[3][(int) mode] = const_true_rtx;
+ }
for (mode = MIN_MODE_PARTIAL_INT;
mode <= MAX_MODE_PARTIAL_INT;
diff --git a/gcc/genmodes.c b/gcc/genmodes.c
index 4a8361572d5..5b7b3d9360b 100644
--- a/gcc/genmodes.c
+++ b/gcc/genmodes.c
@@ -78,6 +78,7 @@ struct mode_data
bool need_bytesize_adj; /* true if this mode needs dynamic size
adjustment */
unsigned int int_n; /* If nonzero, then __int<INT_N> will be defined */
+ bool boolean;
};
static struct mode_data *modes[MAX_MODE_CLASS];
@@ -88,7 +89,8 @@ static const struct mode_data blank_mode = {
0, "<unknown>", MAX_MODE_CLASS,
0, -1U, -1U, -1U, -1U,
0, 0, 0, 0, 0, 0,
- "<unknown>", 0, 0, 0, 0, false, false, 0
+ "<unknown>", 0, 0, 0, 0, false, false, 0,
+ false
};
static htab_t modes_by_name;
@@ -456,7 +458,7 @@ make_complex_modes (enum mode_class cl,
size_t m_len;
/* Skip BImode. FIXME: BImode probably shouldn't be MODE_INT. */
- if (m->precision == 1)
+ if (m->boolean)
continue;
m_len = strlen (m->name);
@@ -528,7 +530,7 @@ make_vector_modes (enum mode_class cl, const char *prefix, unsigned int width,
not be necessary. */
if (cl == MODE_FLOAT && m->bytesize == 1)
continue;
- if (cl == MODE_INT && m->precision == 1)
+ if (m->boolean)
continue;
if ((size_t) snprintf (buf, sizeof buf, "%s%u%s", prefix,
@@ -597,6 +599,20 @@ make_int_mode (const char *name,
m->precision = precision;
}
+#define BOOL_MODE(N, B, Y) \
+ make_bool_mode (#N, B, Y, __FILE__, __LINE__)
+
+static void
+make_bool_mode (const char *name,
+ unsigned int precision, unsigned int bytesize,
+ const char *file, unsigned int line)
+{
+ struct mode_data *m = new_mode (MODE_INT, name, file, line);
+ m->bytesize = bytesize;
+ m->precision = precision;
+ m->boolean = true;
+}
+
#define OPAQUE_MODE(N, B) \
make_opaque_mode (#N, -1U, B, __FILE__, __LINE__)
@@ -1299,9 +1315,21 @@ enum machine_mode\n{");
/* Don't use BImode for MIN_MODE_INT, since otherwise the middle
end will try to use it for bitfields in structures and the
like, which we do not want. Only the target md file should
- generate BImode widgets. */
- if (first && first->precision == 1 && c == MODE_INT)
- first = first->next;
+ generate BImode widgets. Since some targets such as ARM/MVE
+ define boolean modes with multiple bits, handle those too. */
+ if (first && first->boolean)
+ {
+ struct mode_data *last_bool = first;
+ printf (" MIN_MODE_BOOL = E_%smode,\n", first->name);
+
+ while (first && first->boolean)
+ {
+ last_bool = first;
+ first = first->next;
+ }
+
+ printf (" MAX_MODE_BOOL = E_%smode,\n\n", last_bool->name);
+ }
if (first && last)
printf (" MIN_%s = E_%smode,\n MAX_%s = E_%smode,\n\n",
@@ -1680,15 +1708,25 @@ emit_class_narrowest_mode (void)
print_decl ("unsigned char", "class_narrowest_mode", "MAX_MODE_CLASS");
for (c = 0; c < MAX_MODE_CLASS; c++)
- /* Bleah, all this to get the comment right for MIN_MODE_INT. */
- tagged_printf ("MIN_%s", mode_class_names[c],
- modes[c]
- ? ((c != MODE_INT || modes[c]->precision != 1)
- ? modes[c]->name
- : (modes[c]->next
- ? modes[c]->next->name
- : void_mode->name))
- : void_mode->name);
+ {
+ /* Bleah, all this to get the comment right for MIN_MODE_INT. */
+ const char *comment_name = void_mode->name;
+
+ if (modes[c])
+ if (c != MODE_INT || !modes[c]->boolean)
+ comment_name = modes[c]->name;
+ else
+ {
+ struct mode_data *m = modes[c];
+ while (m->boolean)
+ m = m->next;
+ if (m)
+ comment_name = m->name;
+ else
+ comment_name = void_mode->name;
+ }
+ tagged_printf ("MIN_%s", mode_class_names[c], comment_name);
+ }
print_closer ();
}
diff --git a/gcc/machmode.def b/gcc/machmode.def
index fc27ae41d58..65376f69b8d 100644
--- a/gcc/machmode.def
+++ b/gcc/machmode.def
@@ -196,7 +196,7 @@ RANDOM_MODE (VOID);
RANDOM_MODE (BLK);
/* Single bit mode used for booleans. */
-FRACTIONAL_INT_MODE (BI, 1, 1);
+BOOL_MODE (BI, 1, 1);
/* Basic integer modes. We go up to TI in generic code (128 bits).
TImode is needed here because the some front ends now genericly
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-01-12 8:29 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-12 8:29 [gcc(refs/users/clyon/heads/mve-autovec)] fix bool_mode Christophe Lyon
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).