diff options
Diffstat (limited to 'gcc/genmodes.c')
-rw-r--r-- | gcc/genmodes.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/gcc/genmodes.c b/gcc/genmodes.c index b134c1b..9e37d65 100644 --- a/gcc/genmodes.c +++ b/gcc/genmodes.c @@ -375,6 +375,10 @@ complete_mode (struct mode_data *m) m->bytesize = 2 * m->component->bytesize; break; + case MODE_VECTOR_BOOL: + validate_mode (m, UNSET, SET, SET, SET, UNSET); + break; + case MODE_VECTOR_INT: case MODE_VECTOR_FLOAT: case MODE_VECTOR_FRACT: @@ -526,6 +530,28 @@ make_vector_modes (enum mode_class cl, unsigned int width, } } +/* Create a vector of booleans called NAME with COUNT elements and + BYTESIZE bytes in total. */ +#define VECTOR_BOOL_MODE(NAME, COUNT, BYTESIZE) \ + make_vector_bool_mode (#NAME, COUNT, BYTESIZE, __FILE__, __LINE__) +static void ATTRIBUTE_UNUSED +make_vector_bool_mode (const char *name, unsigned int count, + unsigned int bytesize, const char *file, + unsigned int line) +{ + struct mode_data *m = find_mode ("BI"); + if (!m) + { + error ("%s:%d: no mode \"BI\"", file, line); + return; + } + + struct mode_data *v = new_mode (MODE_VECTOR_BOOL, name, file, line); + v->component = m; + v->ncomponents = count; + v->bytesize = bytesize; +} + /* Input. */ #define _SPECIAL_MODE(C, N) \ @@ -1438,7 +1464,8 @@ emit_mode_wider (void) /* For vectors we want twice the number of components, with the same element type. */ - if (m->cl == MODE_VECTOR_INT + if (m->cl == MODE_VECTOR_BOOL + || m->cl == MODE_VECTOR_INT || m->cl == MODE_VECTOR_FLOAT || m->cl == MODE_VECTOR_FRACT || m->cl == MODE_VECTOR_UFRACT @@ -1657,6 +1684,7 @@ emit_mode_adjustments (void) printf ("\n /* %s:%d */\n", a->file, a->line); switch (a->mode->cl) { + case MODE_VECTOR_BOOL: case MODE_VECTOR_INT: case MODE_VECTOR_FLOAT: case MODE_VECTOR_FRACT: @@ -1688,6 +1716,10 @@ emit_mode_adjustments (void) m->name); break; + case MODE_VECTOR_BOOL: + /* Changes to BImode should not affect vector booleans. */ + break; + case MODE_VECTOR_INT: case MODE_VECTOR_FLOAT: case MODE_VECTOR_FRACT: @@ -1728,6 +1760,10 @@ emit_mode_adjustments (void) printf (" mode_base_align[E_%smode] = s;\n", m->name); break; + case MODE_VECTOR_BOOL: + /* Changes to BImode should not affect vector booleans. */ + break; + case MODE_VECTOR_INT: case MODE_VECTOR_FLOAT: case MODE_VECTOR_FRACT: |