aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIra Rosen <irar@il.ibm.com>2010-06-24 06:31:30 +0000
committerIra Rosen <irar@il.ibm.com>2010-06-24 06:31:30 +0000
commitff549d76c1b3e68bd5016a83d66e04a622cea273 (patch)
tree8dca232ce284453bcdbe5b3c7147d35f74374a4a
parent65b95581c873434d1288a562277cb8be0f718586 (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.def27
-rw-r--r--gcc/config/cil32/cil32.c44
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;
+ }
+}
+