diff options
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/gcc/expr.c b/gcc/expr.c index bba785ab33b..779bf879755 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -10791,4 +10791,34 @@ try_tablejump (index_type, index_expr, minval, range, return 1; } +/* Nonzero if the mode is a valid vector mode for this architecture. + This returns nonzero even if there is no hardware support for the + vector mode, but we can emulate with narrower modes. */ + +int +vector_mode_valid_p (mode) + enum machine_mode mode; +{ + enum mode_class class = GET_MODE_CLASS (mode); + enum machine_mode innermode; + + /* Doh! What's going on? */ + if (class != MODE_VECTOR_INT + && class != MODE_VECTOR_FLOAT) + return 0; + + /* Hardware support. Woo hoo! */ + if (VECTOR_MODE_SUPPORTED_P (mode)) + return 1; + + innermode = GET_MODE_INNER (mode); + + /* We should probably return 1 if requesting V4DI and we have no DI, + but we have V2DI, but this is probably very unlikely. */ + + /* If we have support for the inner mode, we can safely emulate it. + We may not have V2DI, but me can emulate with a pair of DIs. */ + return mov_optab->handlers[innermode].insn_code != CODE_FOR_nothing; +} + #include "gt-expr.h" |