diff options
author | Ira Rosen <irar@il.ibm.com> | 2010-06-24 06:31:30 +0000 |
---|---|---|
committer | Ira Rosen <irar@il.ibm.com> | 2010-06-24 06:31:30 +0000 |
commit | ff549d76c1b3e68bd5016a83d66e04a622cea273 (patch) | |
tree | 8dca232ce284453bcdbe5b3c7147d35f74374a4a | |
parent | 65b95581c873434d1288a562277cb8be0f718586 (diff) |
Add float2int and int2float builtins.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/st/cli-be-vect@161308 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/config/cil32/cil-builtins.def | 27 | ||||
-rw-r--r-- | gcc/config/cil32/cil32.c | 44 |
2 files changed, 71 insertions, 0 deletions
diff --git a/gcc/config/cil32/cil-builtins.def b/gcc/config/cil32/cil-builtins.def index 39b2e4d4760..ad0bc957e9a 100644 --- a/gcc/config/cil32/cil-builtins.def +++ b/gcc/config/cil32/cil-builtins.def @@ -1340,6 +1340,33 @@ DEF_CILBUILTIN(GCC_BUILD_INIT_VEC_VQI, "[genvec_support]genvec_support.VQI::VQI_ 2, \ intQI_type_node, intQI_type_node) +/* float->int */ +DEF_CILBUILTIN(GEN_VSI_FLOAT_TO_INT_UNSIGNED, "[genvec_support]genvec_support.VSI::VSI_float_to_int_unsigned", \ + ATTR_CONST_NOTHROW_LIST, \ + VSI_type_node, \ + 1, \ + float_type_node) + +DEF_CILBUILTIN(GEN_VSI_FLOAT_TO_INT_SIGNED, "[genvec_support]genvec_support.VSI::VSI_float_to_int_signed", \ + ATTR_CONST_NOTHROW_LIST, \ + VSI_type_node, \ + 1, \ + float_type_node) + +/* int->float */ +DEF_CILBUILTIN(GEN_VSF_INT_TO_FLOAT_UNSIGNED, "[genvec_support]genvec_support.VSF::VSF_int_to_float_unsigned", \ + ATTR_CONST_NOTHROW_LIST, \ + VSF_type_node, \ + 1, \ + unsigned_type_node) + +DEF_CILBUILTIN(GEN_VSF_INT_TO_FLOAT_SIGNED, "[genvec_support]genvec_support.VSI::VSI_int_to_float_signed", \ + ATTR_CONST_NOTHROW_LIST, \ + VSF_type_node, \ + 1, \ + integer_type_node) + + /* V DF */ DEF_CILBUILTIN(GEN_VDF_CTOR, "[Xxxx.Simd]Xxxx.Simd.VecGenDF::.ctor", \ ATTR_CONST_NOTHROW_LIST, \ diff --git a/gcc/config/cil32/cil32.c b/gcc/config/cil32/cil32.c index 3268562e67c..12dfa9201f7 100644 --- a/gcc/config/cil32/cil32.c +++ b/gcc/config/cil32/cil32.c @@ -97,6 +97,7 @@ static tree cil32_builtin_get_loop_niters (void); static tree cil32_builtin_pattern (enum tree_code code, tree); static tree cil32_builtin_realign_offset (tree); static tree cil32_builtin_build_init_vec (tree); +static tree cil32_builtin_conversion (enum tree_code, tree); /* Initialize the GCC target structure. */ #undef TARGET_ATTRIBUTE_TABLE @@ -182,6 +183,9 @@ static tree cil32_builtin_build_init_vec (tree); #define TARGET_VECTORIZE_BUILTIN_BUILD_INIT_VEC \ cil32_builtin_build_init_vec +#undef TARGET_VECTORIZE_BUILTIN_CONVERSION +#define TARGET_VECTORIZE_BUILTIN_CONVERSION \ + cil32_builtin_conversion struct gcc_target targetm = TARGET_INITIALIZER; @@ -817,3 +821,43 @@ static tree cil32_builtin_build_init_vec (tree type) } } +/* Implement targetm.vectorize.builtin_conversion. + Returns a decl of a function that implements conversion of an integer vector + into a floating-point vector, or vice-versa. TYPE is the type of the integer + side of the conversion. + Return NULL_TREE if it is not available. */ +static tree +cil32_builtin_conversion (enum tree_code code, tree type) +{ + tree elem_type = TREE_TYPE (type); + unsigned element_size = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (elem_type)); + + switch (code) + { + case FIX_TRUNC_EXPR: + switch (element_size) + { + case 4: + return TYPE_UNSIGNED (type) + ? cil32_builtins[CIL32_GEN_VSI_FLOAT_TO_INT_UNSIGNED] + : cil32_builtins[CIL32_GEN_VSI_FLOAT_TO_INT_SIGNED]; + default: + return NULL_TREE; + } + + case FLOAT_EXPR: + switch (element_size) + { + case 4: + return TYPE_UNSIGNED (type) + ? cil32_builtins[CIL32_GEN_VSF_INT_TO_FLOAT_UNSIGNED] + : cil32_builtins[CIL32_GEN_VSF_INT_TO_FLOAT_SIGNED]; + default: + return NULL_TREE; + } + + default: + return NULL_TREE; + } +} + |