Commit 7a2c8e28 by Andre Vieira Committed by Andre Vieira

[ARM] Move CRC builtins to refactored framework

gcc/ChangeLog:
2017-01-06  Andre Vieira  <andre.simoesdiasvieira@arm.com>

	* config/arm/arm-builtins.c (arm_unsigned_binop_qualifiers): New.
	(UBINOP_QUALIFIERS): New.
	(si_UP): Define.
	(acle_builtin_data): New. Change comment.
	(arm_builtins): Remove ARM_BUILTIN_CRC32B, ARM_BUILTIN_CRC32H,
	ARM_BUILTIN_CRC32W, ARM_BUILTIN_CRC32CB, ARM_BUILTIN_CRC32CH,
	ARM_BUILTIN_CRC32CW. Add ARM_BUILTIN_ACLE_BASE and include
	arm_acle_builtins.def.
	(ARM_BUILTIN_ACLE_PATTERN_START): Define.
	(arm_init_acle_builtins): New.
	(CRC32_BUILTIN): Remove.
	(bdesc_2arg): Remove entries for crc32b, crc32h, crc32w,
	crc32cb, crc32ch and crc32cw.
	(arm_init_crc32_builtins): Remove.
	(arm_init_builtins): Use arm_init_acle_builtins rather
	than arm_init_crc32_builtins.
	(arm_expand_acle_builtin): New.
	(arm_expand_builtin): Use 'arm_expand_acle_builtin'.
	* config/arm/arm_acle_builtins.def: New.

From-SVN: r244171
parent 131e1faa
2017-01-06 Andre Vieira <andre.simoesdiasvieira@arm.com> 2017-01-06 Andre Vieira <andre.simoesdiasvieira@arm.com>
* config/arm/arm-builtins.c (arm_unsigned_binop_qualifiers): New.
(UBINOP_QUALIFIERS): New.
(si_UP): Define.
(acle_builtin_data): New. Change comment.
(arm_builtins): Remove ARM_BUILTIN_CRC32B, ARM_BUILTIN_CRC32H,
ARM_BUILTIN_CRC32W, ARM_BUILTIN_CRC32CB, ARM_BUILTIN_CRC32CH,
ARM_BUILTIN_CRC32CW. Add ARM_BUILTIN_ACLE_BASE and include
arm_acle_builtins.def.
(ARM_BUILTIN_ACLE_PATTERN_START): Define.
(arm_init_acle_builtins): New.
(CRC32_BUILTIN): Remove.
(bdesc_2arg): Remove entries for crc32b, crc32h, crc32w,
crc32cb, crc32ch and crc32cw.
(arm_init_crc32_builtins): Remove.
(arm_init_builtins): Use arm_init_acle_builtins rather
than arm_init_crc32_builtins.
(arm_expand_acle_builtin): New.
(arm_expand_builtin): Use 'arm_expand_acle_builtin'.
* config/arm/arm_acle_builtins.def: New.
2017-01-06 Andre Vieira <andre.simoesdiasvieira@arm.com>
* config/arm/arm-builtins.c (neon_builtin_datum): Rename to .. * config/arm/arm-builtins.c (neon_builtin_datum): Rename to ..
(arm_builtin_datum): ... this. (arm_builtin_datum): ... this.
(arm_init_neon_builtin): Rename to ... (arm_init_neon_builtin): Rename to ...
......
...@@ -158,6 +158,13 @@ arm_load1_lane_qualifiers[SIMD_MAX_BUILTIN_ARGS] ...@@ -158,6 +158,13 @@ arm_load1_lane_qualifiers[SIMD_MAX_BUILTIN_ARGS]
qualifier_none, qualifier_struct_load_store_lane_index }; qualifier_none, qualifier_struct_load_store_lane_index };
#define LOAD1LANE_QUALIFIERS (arm_load1_lane_qualifiers) #define LOAD1LANE_QUALIFIERS (arm_load1_lane_qualifiers)
/* unsigned T (unsigned T, unsigned T, unsigned T). */
static enum arm_type_qualifiers
arm_unsigned_binop_qualifiers[SIMD_MAX_BUILTIN_ARGS]
= { qualifier_unsigned, qualifier_unsigned, qualifier_unsigned,
qualifier_unsigned };
#define UBINOP_QUALIFIERS (arm_unsigned_binop_qualifiers)
/* The first argument (return type) of a store should be void type, /* The first argument (return type) of a store should be void type,
which we represent with qualifier_void. Their first operand will be which we represent with qualifier_void. Their first operand will be
a DImode pointer to the location to store to, so we must use a DImode pointer to the location to store to, so we must use
...@@ -243,17 +250,16 @@ typedef struct { ...@@ -243,17 +250,16 @@ typedef struct {
VAR11 (T, N, A, B, C, D, E, F, G, H, I, J, K) \ VAR11 (T, N, A, B, C, D, E, F, G, H, I, J, K) \
VAR1 (T, N, L) VAR1 (T, N, L)
/* The builtin data can be found in arm_neon_builtins.def, /* The builtin data can be found in arm_neon_builtins.def, arm_vfp_builtins.def
arm_vfp_builtins.def. The entries in arm_neon_builtins.def require and arm_acle_builtins.def. The entries in arm_neon_builtins.def require
TARGET_NEON to be true. The feature tests are checked when the TARGET_NEON to be true. The feature tests are checked when the builtins are
builtins are expanded. expanded.
The mode entries in the following table correspond to the "key" The mode entries in the following table correspond to the "key" type of the
type of the instruction variant, i.e. equivalent to that which instruction variant, i.e. equivalent to that which would be specified after
would be specified after the assembler mnemonic, which usually the assembler mnemonic for neon instructions, which usually refers to the
refers to the last vector operand. The modes listed per last vector operand. The modes listed per instruction should be the same as
instruction should be the same as those defined for that those defined for that instruction's pattern, for instance in neon.md. */
instruction's pattern, for instance in neon.md. */
static arm_builtin_datum vfp_builtin_data[] = static arm_builtin_datum vfp_builtin_data[] =
{ {
...@@ -267,6 +273,15 @@ static arm_builtin_datum neon_builtin_data[] = ...@@ -267,6 +273,15 @@ static arm_builtin_datum neon_builtin_data[] =
#undef CF #undef CF
#undef VAR1 #undef VAR1
#define VAR1(T, N, A) \
{#N, UP (A), CODE_FOR_##N, 0, T##_QUALIFIERS},
static arm_builtin_datum acle_builtin_data[] =
{
#include "arm_acle_builtins.def"
};
#undef VAR1
#define VAR1(T, N, X) \ #define VAR1(T, N, X) \
ARM_BUILTIN_NEON_##N##X, ARM_BUILTIN_NEON_##N##X,
...@@ -519,13 +534,6 @@ enum arm_builtins ...@@ -519,13 +534,6 @@ enum arm_builtins
ARM_BUILTIN_WMERGE, ARM_BUILTIN_WMERGE,
ARM_BUILTIN_CRC32B,
ARM_BUILTIN_CRC32H,
ARM_BUILTIN_CRC32W,
ARM_BUILTIN_CRC32CB,
ARM_BUILTIN_CRC32CH,
ARM_BUILTIN_CRC32CW,
ARM_BUILTIN_GET_FPSCR, ARM_BUILTIN_GET_FPSCR,
ARM_BUILTIN_SET_FPSCR, ARM_BUILTIN_SET_FPSCR,
...@@ -559,6 +567,14 @@ enum arm_builtins ...@@ -559,6 +567,14 @@ enum arm_builtins
#include "arm_neon_builtins.def" #include "arm_neon_builtins.def"
#undef VAR1
#define VAR1(T, N, X) \
ARM_BUILTIN_##N,
ARM_BUILTIN_ACLE_BASE,
#include "arm_acle_builtins.def"
ARM_BUILTIN_MAX ARM_BUILTIN_MAX
}; };
...@@ -568,6 +584,9 @@ enum arm_builtins ...@@ -568,6 +584,9 @@ enum arm_builtins
#define ARM_BUILTIN_NEON_PATTERN_START \ #define ARM_BUILTIN_NEON_PATTERN_START \
(ARM_BUILTIN_NEON_BASE + 1) (ARM_BUILTIN_NEON_BASE + 1)
#define ARM_BUILTIN_ACLE_PATTERN_START \
(ARM_BUILTIN_ACLE_BASE + 1)
#undef CF #undef CF
#undef VAR1 #undef VAR1
#undef VAR2 #undef VAR2
...@@ -1016,7 +1035,7 @@ arm_init_builtin (unsigned int fcode, arm_builtin_datum *d, ...@@ -1016,7 +1035,7 @@ arm_init_builtin (unsigned int fcode, arm_builtin_datum *d,
gcc_assert (ftype != NULL); gcc_assert (ftype != NULL);
if (print_type_signature_p if (print_type_signature_p
&& IN_RANGE (fcode, ARM_BUILTIN_VFP_BASE, ARM_BUILTIN_MAX - 1)) && IN_RANGE (fcode, ARM_BUILTIN_VFP_BASE, ARM_BUILTIN_ACLE_BASE - 1))
snprintf (namebuf, sizeof (namebuf), "%s_%s_%s", snprintf (namebuf, sizeof (namebuf), "%s_%s_%s",
prefix, d->name, type_signature); prefix, d->name, type_signature);
else else
...@@ -1028,6 +1047,23 @@ arm_init_builtin (unsigned int fcode, arm_builtin_datum *d, ...@@ -1028,6 +1047,23 @@ arm_init_builtin (unsigned int fcode, arm_builtin_datum *d,
arm_builtin_decls[fcode] = fndecl; arm_builtin_decls[fcode] = fndecl;
} }
/* Set up ACLE builtins, even builtins for instructions that are not
in the current target ISA to allow the user to compile particular modules
with different target specific options that differ from the command line
options. Such builtins will be rejected in arm_expand_builtin. */
static void
arm_init_acle_builtins (void)
{
unsigned int i, fcode = ARM_BUILTIN_ACLE_PATTERN_START;
for (i = 0; i < ARRAY_SIZE (acle_builtin_data); i++, fcode++)
{
arm_builtin_datum *d = &acle_builtin_data[i];
arm_init_builtin (fcode, d, "__builtin_arm");
}
}
/* Set up all the NEON builtins, even builtins for instructions that are not /* Set up all the NEON builtins, even builtins for instructions that are not
in the current target ISA to allow the user to compile particular modules in the current target ISA to allow the user to compile particular modules
with different target specific options that differ from the command line with different target specific options that differ from the command line
...@@ -1303,18 +1339,6 @@ static const struct builtin_description bdesc_2arg[] = ...@@ -1303,18 +1339,6 @@ static const struct builtin_description bdesc_2arg[] =
FP_BUILTIN (set_fpscr, SET_FPSCR) FP_BUILTIN (set_fpscr, SET_FPSCR)
#undef FP_BUILTIN #undef FP_BUILTIN
#define CRC32_BUILTIN(L, U) \
{isa_nobit, CODE_FOR_##L, "__builtin_arm_"#L, \
ARM_BUILTIN_##U, UNKNOWN, 0},
CRC32_BUILTIN (crc32b, CRC32B)
CRC32_BUILTIN (crc32h, CRC32H)
CRC32_BUILTIN (crc32w, CRC32W)
CRC32_BUILTIN (crc32cb, CRC32CB)
CRC32_BUILTIN (crc32ch, CRC32CH)
CRC32_BUILTIN (crc32cw, CRC32CW)
#undef CRC32_BUILTIN
#define CRYPTO_BUILTIN(L, U) \ #define CRYPTO_BUILTIN(L, U) \
{isa_nobit, CODE_FOR_crypto_##L, "__builtin_arm_crypto_"#L, \ {isa_nobit, CODE_FOR_crypto_##L, "__builtin_arm_crypto_"#L, \
ARM_BUILTIN_CRYPTO_##U, UNKNOWN, 0}, ARM_BUILTIN_CRYPTO_##U, UNKNOWN, 0},
...@@ -1771,42 +1795,6 @@ arm_init_fp16_builtins (void) ...@@ -1771,42 +1795,6 @@ arm_init_fp16_builtins (void)
"__fp16"); "__fp16");
} }
static void
arm_init_crc32_builtins ()
{
tree si_ftype_si_qi
= build_function_type_list (unsigned_intSI_type_node,
unsigned_intSI_type_node,
unsigned_intQI_type_node, NULL_TREE);
tree si_ftype_si_hi
= build_function_type_list (unsigned_intSI_type_node,
unsigned_intSI_type_node,
unsigned_intHI_type_node, NULL_TREE);
tree si_ftype_si_si
= build_function_type_list (unsigned_intSI_type_node,
unsigned_intSI_type_node,
unsigned_intSI_type_node, NULL_TREE);
arm_builtin_decls[ARM_BUILTIN_CRC32B]
= add_builtin_function ("__builtin_arm_crc32b", si_ftype_si_qi,
ARM_BUILTIN_CRC32B, BUILT_IN_MD, NULL, NULL_TREE);
arm_builtin_decls[ARM_BUILTIN_CRC32H]
= add_builtin_function ("__builtin_arm_crc32h", si_ftype_si_hi,
ARM_BUILTIN_CRC32H, BUILT_IN_MD, NULL, NULL_TREE);
arm_builtin_decls[ARM_BUILTIN_CRC32W]
= add_builtin_function ("__builtin_arm_crc32w", si_ftype_si_si,
ARM_BUILTIN_CRC32W, BUILT_IN_MD, NULL, NULL_TREE);
arm_builtin_decls[ARM_BUILTIN_CRC32CB]
= add_builtin_function ("__builtin_arm_crc32cb", si_ftype_si_qi,
ARM_BUILTIN_CRC32CB, BUILT_IN_MD, NULL, NULL_TREE);
arm_builtin_decls[ARM_BUILTIN_CRC32CH]
= add_builtin_function ("__builtin_arm_crc32ch", si_ftype_si_hi,
ARM_BUILTIN_CRC32CH, BUILT_IN_MD, NULL, NULL_TREE);
arm_builtin_decls[ARM_BUILTIN_CRC32CW]
= add_builtin_function ("__builtin_arm_crc32cw", si_ftype_si_si,
ARM_BUILTIN_CRC32CW, BUILT_IN_MD, NULL, NULL_TREE);
}
void void
arm_init_builtins (void) arm_init_builtins (void)
{ {
...@@ -1824,8 +1812,7 @@ arm_init_builtins (void) ...@@ -1824,8 +1812,7 @@ arm_init_builtins (void)
arm_init_crypto_builtins (); arm_init_crypto_builtins ();
} }
if (TARGET_CRC32) arm_init_acle_builtins ();
arm_init_crc32_builtins ();
if (TARGET_HARD_FLOAT) if (TARGET_HARD_FLOAT)
{ {
...@@ -2107,6 +2094,7 @@ arm_expand_builtin_args (rtx target, machine_mode map_mode, int fcode, ...@@ -2107,6 +2094,7 @@ arm_expand_builtin_args (rtx target, machine_mode map_mode, int fcode,
machine_mode mode[SIMD_MAX_BUILTIN_ARGS]; machine_mode mode[SIMD_MAX_BUILTIN_ARGS];
tree formals; tree formals;
int argc = 0; int argc = 0;
rtx_insn * insn;
if (have_retval if (have_retval
&& (!target && (!target
...@@ -2271,7 +2259,17 @@ constant_arg: ...@@ -2271,7 +2259,17 @@ constant_arg:
if (!pat) if (!pat)
return 0; return 0;
/* Check whether our current target implements the pattern chosen for this
builtin and error out if not. */
start_sequence ();
emit_insn (pat); emit_insn (pat);
insn = get_insns ();
end_sequence ();
if (recog_memoized (insn) < 0)
error ("this builtin is not supported for this target");
else
emit_insn (insn);
return target; return target;
} }
...@@ -2292,7 +2290,7 @@ arm_expand_builtin_1 (int fcode, tree exp, rtx target, ...@@ -2292,7 +2290,7 @@ arm_expand_builtin_1 (int fcode, tree exp, rtx target,
int k; int k;
bool neon = false; bool neon = false;
if (IN_RANGE (fcode, ARM_BUILTIN_VFP_BASE, ARM_BUILTIN_MAX - 1)) if (IN_RANGE (fcode, ARM_BUILTIN_VFP_BASE, ARM_BUILTIN_ACLE_BASE - 1))
neon = true; neon = true;
is_void = !!(d->qualifiers[0] & qualifier_void); is_void = !!(d->qualifiers[0] & qualifier_void);
...@@ -2349,6 +2347,20 @@ arm_expand_builtin_1 (int fcode, tree exp, rtx target, ...@@ -2349,6 +2347,20 @@ arm_expand_builtin_1 (int fcode, tree exp, rtx target,
&args[1]); &args[1]);
} }
/* Expand an ACLE builtin, i.e. those registered only if their respective
target constraints are met. This check happens within
arm_expand_builtin_args. */
static rtx
arm_expand_acle_builtin (int fcode, tree exp, rtx target)
{
arm_builtin_datum *d
= &acle_builtin_data[fcode - ARM_BUILTIN_ACLE_PATTERN_START];
return arm_expand_builtin_1 (fcode, exp, target, d);
}
/* Expand a Neon builtin, i.e. those registered only if TARGET_NEON holds. /* Expand a Neon builtin, i.e. those registered only if TARGET_NEON holds.
Most of these are "special" because they don't have symbolic Most of these are "special" because they don't have symbolic
constants defined per-instruction or per instruction-variant. Instead, the constants defined per-instruction or per instruction-variant. Instead, the
...@@ -2443,6 +2455,9 @@ arm_expand_builtin (tree exp, ...@@ -2443,6 +2455,9 @@ arm_expand_builtin (tree exp,
int mask; int mask;
int imm; int imm;
if (fcode >= ARM_BUILTIN_ACLE_BASE)
return arm_expand_acle_builtin (fcode, exp, target);
if (fcode >= ARM_BUILTIN_NEON_BASE) if (fcode >= ARM_BUILTIN_NEON_BASE)
return arm_expand_neon_builtin (fcode, exp, target); return arm_expand_neon_builtin (fcode, exp, target);
......
/* ACLE builtin definitions for ARM.
Copyright (C) 2016 Free Software Foundation, Inc.
Contributed by ARM Ltd.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 3, or (at your
option) any later version.
GCC is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
VAR1 (UBINOP, crc32b, si)
VAR1 (UBINOP, crc32h, si)
VAR1 (UBINOP, crc32w, si)
VAR1 (UBINOP, crc32cb, si)
VAR1 (UBINOP, crc32ch, si)
VAR1 (UBINOP, crc32cw, si)
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