Commit 6db1ec94 by James Greenhalgh Committed by James Greenhalgh

[AArch64] [2/4 Fix vtbx1] Handle poly types in the new Simd types infrastructure

gcc/
	* config/aarch64/aarch64-builtins.c
	(aarch64_type_qualifiers): Add qualifier_poly.
	(aarch64_build_scalar_type): Also build Poly types.
	(aarch64_build_vector_type): Likewise.
	(aarch64_build_type): Likewise.
	(aarch64_build_signed_type): New.
	(aarch64_build_unsigned_type): Likewise.
	(aarch64_build_poly_type): Likewise.
	(aarch64_init_simd_builtins): Also handle Poly types.

From-SVN: r205384
parent e993fea1
2013-11-26 James Greenhalgh <james.greenhalgh@arm.com> 2013-11-26 James Greenhalgh <james.greenhalgh@arm.com>
* config/aarch64/aarch64-builtins.c * config/aarch64/aarch64-builtins.c
(aarch64_type_qualifiers): Add qualifier_poly.
(aarch64_build_scalar_type): Also build Poly types.
(aarch64_build_vector_type): Likewise.
(aarch64_build_type): Likewise.
(aarch64_build_signed_type): New.
(aarch64_build_unsigned_type): Likewise.
(aarch64_build_poly_type): Likewise.
(aarch64_init_simd_builtins): Also handle Poly types.
2013-11-26 James Greenhalgh <james.greenhalgh@arm.com>
* config/aarch64/aarch64-builtins.c
(VAR1): Use new naming scheme for aarch64_builtins. (VAR1): Use new naming scheme for aarch64_builtins.
(aarch64_builtin_vectorized_function): Use new (aarch64_builtin_vectorized_function): Use new
aarch64_builtins names. aarch64_builtins names.
...@@ -124,7 +124,9 @@ enum aarch64_type_qualifiers ...@@ -124,7 +124,9 @@ enum aarch64_type_qualifiers
/* qualifier_pointer | qualifier_map_mode */ /* qualifier_pointer | qualifier_map_mode */
qualifier_pointer_map_mode = 0x84, qualifier_pointer_map_mode = 0x84,
/* qualifier_const_pointer | qualifier_map_mode */ /* qualifier_const_pointer | qualifier_map_mode */
qualifier_const_pointer_map_mode = 0x86 qualifier_const_pointer_map_mode = 0x86,
/* Polynomial types. */
qualifier_poly = 0x100
}; };
typedef struct typedef struct
...@@ -340,7 +342,9 @@ static GTY(()) tree aarch64_builtin_decls[AARCH64_BUILTIN_MAX]; ...@@ -340,7 +342,9 @@ static GTY(()) tree aarch64_builtin_decls[AARCH64_BUILTIN_MAX];
/* Return a tree for a signed or unsigned argument of either /* Return a tree for a signed or unsigned argument of either
the mode specified by MODE, or the inner mode of MODE. */ the mode specified by MODE, or the inner mode of MODE. */
tree tree
aarch64_build_scalar_type (enum machine_mode mode, bool unsigned_p) aarch64_build_scalar_type (enum machine_mode mode,
bool unsigned_p,
bool poly_p)
{ {
#undef INT_TYPES #undef INT_TYPES
#define INT_TYPES \ #define INT_TYPES \
...@@ -357,6 +361,7 @@ aarch64_build_scalar_type (enum machine_mode mode, bool unsigned_p) ...@@ -357,6 +361,7 @@ aarch64_build_scalar_type (enum machine_mode mode, bool unsigned_p)
/* Statically declare all the possible types we might need. */ /* Statically declare all the possible types we might need. */
#undef AARCH64_TYPE_BUILDER #undef AARCH64_TYPE_BUILDER
#define AARCH64_TYPE_BUILDER(X) \ #define AARCH64_TYPE_BUILDER(X) \
static tree X##_aarch64_type_node_p = NULL; \
static tree X##_aarch64_type_node_s = NULL; \ static tree X##_aarch64_type_node_s = NULL; \
static tree X##_aarch64_type_node_u = NULL; static tree X##_aarch64_type_node_u = NULL;
...@@ -377,6 +382,11 @@ aarch64_build_scalar_type (enum machine_mode mode, bool unsigned_p) ...@@ -377,6 +382,11 @@ aarch64_build_scalar_type (enum machine_mode mode, bool unsigned_p)
? X##_aarch64_type_node_u \ ? X##_aarch64_type_node_u \
: X##_aarch64_type_node_u \ : X##_aarch64_type_node_u \
= make_unsigned_type (GET_MODE_PRECISION (mode))); \ = make_unsigned_type (GET_MODE_PRECISION (mode))); \
else if (poly_p) \
return (X##_aarch64_type_node_p \
? X##_aarch64_type_node_p \
: X##_aarch64_type_node_p \
= make_unsigned_type (GET_MODE_PRECISION (mode))); \
else \ else \
return (X##_aarch64_type_node_s \ return (X##_aarch64_type_node_s \
? X##_aarch64_type_node_s \ ? X##_aarch64_type_node_s \
...@@ -411,7 +421,9 @@ aarch64_build_scalar_type (enum machine_mode mode, bool unsigned_p) ...@@ -411,7 +421,9 @@ aarch64_build_scalar_type (enum machine_mode mode, bool unsigned_p)
} }
tree tree
aarch64_build_vector_type (enum machine_mode mode, bool unsigned_p) aarch64_build_vector_type (enum machine_mode mode,
bool unsigned_p,
bool poly_p)
{ {
tree eltype; tree eltype;
...@@ -431,7 +443,8 @@ aarch64_build_vector_type (enum machine_mode mode, bool unsigned_p) ...@@ -431,7 +443,8 @@ aarch64_build_vector_type (enum machine_mode mode, bool unsigned_p)
#undef AARCH64_TYPE_BUILDER #undef AARCH64_TYPE_BUILDER
#define AARCH64_TYPE_BUILDER(X) \ #define AARCH64_TYPE_BUILDER(X) \
static tree X##_aarch64_type_node_s = NULL; \ static tree X##_aarch64_type_node_s = NULL; \
static tree X##_aarch64_type_node_u = NULL; static tree X##_aarch64_type_node_u = NULL; \
static tree X##_aarch64_type_node_p = NULL;
VECTOR_TYPES VECTOR_TYPES
...@@ -446,20 +459,28 @@ aarch64_build_vector_type (enum machine_mode mode, bool unsigned_p) ...@@ -446,20 +459,28 @@ aarch64_build_vector_type (enum machine_mode mode, bool unsigned_p)
: X##_aarch64_type_node_u \ : X##_aarch64_type_node_u \
= build_vector_type_for_mode (aarch64_build_scalar_type \ = build_vector_type_for_mode (aarch64_build_scalar_type \
(GET_MODE_INNER (mode), \ (GET_MODE_INNER (mode), \
unsigned_p), mode); \ unsigned_p, poly_p), mode); \
else if (poly_p) \
return X##_aarch64_type_node_p \
? X##_aarch64_type_node_p \
: X##_aarch64_type_node_p \
= build_vector_type_for_mode (aarch64_build_scalar_type \
(GET_MODE_INNER (mode), \
unsigned_p, poly_p), mode); \
else \ else \
return X##_aarch64_type_node_s \ return X##_aarch64_type_node_s \
? X##_aarch64_type_node_s \ ? X##_aarch64_type_node_s \
: X##_aarch64_type_node_s \ : X##_aarch64_type_node_s \
= build_vector_type_for_mode (aarch64_build_scalar_type \ = build_vector_type_for_mode (aarch64_build_scalar_type \
(GET_MODE_INNER (mode), \ (GET_MODE_INNER (mode), \
unsigned_p), mode); \ unsigned_p, poly_p), mode); \
break; break;
switch (mode) switch (mode)
{ {
default: default:
eltype = aarch64_build_scalar_type (GET_MODE_INNER (mode), unsigned_p); eltype = aarch64_build_scalar_type (GET_MODE_INNER (mode),
unsigned_p, poly_p);
return build_vector_type_for_mode (eltype, mode); return build_vector_type_for_mode (eltype, mode);
break; break;
VECTOR_TYPES VECTOR_TYPES
...@@ -467,12 +488,30 @@ aarch64_build_vector_type (enum machine_mode mode, bool unsigned_p) ...@@ -467,12 +488,30 @@ aarch64_build_vector_type (enum machine_mode mode, bool unsigned_p)
} }
tree tree
aarch64_build_type (enum machine_mode mode, bool unsigned_p) aarch64_build_type (enum machine_mode mode, bool unsigned_p, bool poly_p)
{ {
if (VECTOR_MODE_P (mode)) if (VECTOR_MODE_P (mode))
return aarch64_build_vector_type (mode, unsigned_p); return aarch64_build_vector_type (mode, unsigned_p, poly_p);
else else
return aarch64_build_scalar_type (mode, unsigned_p); return aarch64_build_scalar_type (mode, unsigned_p, poly_p);
}
tree
aarch64_build_signed_type (enum machine_mode mode)
{
return aarch64_build_type (mode, false, false);
}
tree
aarch64_build_unsigned_type (enum machine_mode mode)
{
return aarch64_build_type (mode, true, false);
}
tree
aarch64_build_poly_type (enum machine_mode mode)
{
return aarch64_build_type (mode, false, true);
} }
static void static void
...@@ -480,32 +519,30 @@ aarch64_init_simd_builtins (void) ...@@ -480,32 +519,30 @@ aarch64_init_simd_builtins (void)
{ {
unsigned int i, fcode = AARCH64_SIMD_BUILTIN_BASE + 1; unsigned int i, fcode = AARCH64_SIMD_BUILTIN_BASE + 1;
/* In order that 'poly' types mangle correctly they must not share /* Signed scalar type nodes. */
a base tree with the other scalar types, thus we must generate them tree aarch64_simd_intQI_type_node = aarch64_build_signed_type (QImode);
as a special case. */ tree aarch64_simd_intHI_type_node = aarch64_build_signed_type (HImode);
tree aarch64_simd_polyQI_type_node = tree aarch64_simd_intSI_type_node = aarch64_build_signed_type (SImode);
make_signed_type (GET_MODE_PRECISION (QImode)); tree aarch64_simd_intDI_type_node = aarch64_build_signed_type (DImode);
tree aarch64_simd_polyHI_type_node = tree aarch64_simd_intTI_type_node = aarch64_build_signed_type (TImode);
make_signed_type (GET_MODE_PRECISION (HImode)); tree aarch64_simd_intEI_type_node = aarch64_build_signed_type (EImode);
tree aarch64_simd_intOI_type_node = aarch64_build_signed_type (OImode);
/* Scalar type nodes. */ tree aarch64_simd_intCI_type_node = aarch64_build_signed_type (CImode);
tree aarch64_simd_intQI_type_node = aarch64_build_type (QImode, false); tree aarch64_simd_intXI_type_node = aarch64_build_signed_type (XImode);
tree aarch64_simd_intHI_type_node = aarch64_build_type (HImode, false);
tree aarch64_simd_intSI_type_node = aarch64_build_type (SImode, false); /* Unsigned scalar type nodes. */
tree aarch64_simd_intDI_type_node = aarch64_build_type (DImode, false); tree aarch64_simd_intUQI_type_node = aarch64_build_unsigned_type (QImode);
tree aarch64_simd_intTI_type_node = aarch64_build_type (TImode, false); tree aarch64_simd_intUHI_type_node = aarch64_build_unsigned_type (HImode);
tree aarch64_simd_intEI_type_node = aarch64_build_type (EImode, false); tree aarch64_simd_intUSI_type_node = aarch64_build_unsigned_type (SImode);
tree aarch64_simd_intOI_type_node = aarch64_build_type (OImode, false); tree aarch64_simd_intUDI_type_node = aarch64_build_unsigned_type (DImode);
tree aarch64_simd_intCI_type_node = aarch64_build_type (CImode, false);
tree aarch64_simd_intXI_type_node = aarch64_build_type (XImode, false); /* Poly scalar type nodes. */
tree aarch64_simd_intUQI_type_node = aarch64_build_type (QImode, true); tree aarch64_simd_polyQI_type_node = aarch64_build_poly_type (QImode);
tree aarch64_simd_intUHI_type_node = aarch64_build_type (HImode, true); tree aarch64_simd_polyHI_type_node = aarch64_build_poly_type (HImode);
tree aarch64_simd_intUSI_type_node = aarch64_build_type (SImode, true);
tree aarch64_simd_intUDI_type_node = aarch64_build_type (DImode, true);
/* Float type nodes. */ /* Float type nodes. */
tree aarch64_simd_float_type_node = aarch64_build_type (SFmode, false); tree aarch64_simd_float_type_node = aarch64_build_signed_type (SFmode);
tree aarch64_simd_double_type_node = aarch64_build_type (DFmode, false); tree aarch64_simd_double_type_node = aarch64_build_signed_type (DFmode);
/* Define typedefs which exactly correspond to the modes we are basing vector /* Define typedefs which exactly correspond to the modes we are basing vector
types on. If you change these names you'll need to change types on. If you change these names you'll need to change
...@@ -603,6 +640,11 @@ aarch64_init_simd_builtins (void) ...@@ -603,6 +640,11 @@ aarch64_init_simd_builtins (void)
type_signature[arg_num] = 'u'; type_signature[arg_num] = 'u';
print_type_signature_p = true; print_type_signature_p = true;
} }
else if (qualifiers & qualifier_poly)
{
type_signature[arg_num] = 'p';
print_type_signature_p = true;
}
else else
type_signature[arg_num] = 's'; type_signature[arg_num] = 's';
...@@ -621,7 +663,8 @@ aarch64_init_simd_builtins (void) ...@@ -621,7 +663,8 @@ aarch64_init_simd_builtins (void)
op_mode = GET_MODE_INNER (op_mode); op_mode = GET_MODE_INNER (op_mode);
eltype = aarch64_build_type (op_mode, eltype = aarch64_build_type (op_mode,
qualifiers & qualifier_unsigned); qualifiers & qualifier_unsigned,
qualifiers & qualifier_poly);
/* Add qualifiers. */ /* Add qualifiers. */
if (qualifiers & qualifier_const) if (qualifiers & qualifier_const)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment