Commit 7d0ce941 by Richard Earnshaw Committed by Richard Earnshaw

[arm] Use arm_active_target when configuring builtins

This patch uses the new ISA data structure to determine which builtins
to add.  It entirely eliminates the need for insn_flags to be a global
variable, but we're about to delete that in the following patches, so
for now we leave it as a global.

	* arm-builtins.c: Include sbitmap.h.
	(def_mbuiltin): Change first parameter to a flag bit.  Use it to test
	available features in the current target.
	(struct builtin_description): Change type of feature field.
	(IWMMXT_BUILTIN): Use the isa_features types.
	(IWMMXT2_BUILTIN): Likewise.
	(IWMMXT_BUILTIN2): Likewise.
	(IWMMXT2_BUILTIN2): Likewise.
	(CRC32_BUILTIN): Likewise.
	(CRYPTO_BUILTIN): Likewise.
	(iwmmx_builtin): Likewise.
	(iwmmx2_builtin): Likewise.
	(arm_iwmmxt_builtin): Check for specific feature bits.

From-SVN: r243702
parent 199acf6c
2016-12-15 Richard Earnshaw <rearnsha@arm.com> 2016-12-15 Richard Earnshaw <rearnsha@arm.com>
* arm-builtins.c: Include sbitmap.h.
(def_mbuiltin): Change first parameter to a flag bit. Use it to test
available features in the current target.
(struct builtin_description): Change type of feature field.
(IWMMXT_BUILTIN): Use the isa_features types.
(IWMMXT2_BUILTIN): Likewise.
(IWMMXT_BUILTIN2): Likewise.
(IWMMXT2_BUILTIN2): Likewise.
(CRC32_BUILTIN): Likewise.
(CRYPTO_BUILTIN): Likewise.
(iwmmx_builtin): Likewise.
(iwmmx2_builtin): Likewise.
(arm_iwmmxt_builtin): Check for specific feature bits.
2016-12-15 Richard Earnshaw <rearnsha@arm.com>
* arm-isa.h (enum isa_feature): Add isa_quirk_cm3_ldrd. * arm-isa.h (enum isa_feature): Add isa_quirk_cm3_ldrd.
(ISA_ALL_QUIRKS): New macro. (ISA_ALL_QUIRKS): New macro.
* arm-cores.def (cortex-m3): Add isa_quirk_cm3_ldrd to isa feature list. * arm-cores.def (cortex-m3): Add isa_quirk_cm3_ldrd to isa feature list.
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "expr.h" #include "expr.h"
#include "langhooks.h" #include "langhooks.h"
#include "case-cfn-macros.h" #include "case-cfn-macros.h"
#include "sbitmap.h"
#define SIMD_MAX_BUILTIN_ARGS 5 #define SIMD_MAX_BUILTIN_ARGS 5
...@@ -1154,11 +1155,11 @@ arm_init_crypto_builtins (void) ...@@ -1154,11 +1155,11 @@ arm_init_crypto_builtins (void)
#undef NUM_DREG_TYPES #undef NUM_DREG_TYPES
#undef NUM_QREG_TYPES #undef NUM_QREG_TYPES
#define def_mbuiltin(FLAGS, NAME, TYPE, CODE) \ #define def_mbuiltin(FLAG, NAME, TYPE, CODE) \
do \ do \
{ \ { \
const arm_feature_set flags = FLAGS; \ if (FLAG == isa_nobit \
if (ARM_FSET_CPU_SUBSET (flags, insn_flags)) \ || bitmap_bit_p (arm_active_target.isa, FLAG)) \
{ \ { \
tree bdecl; \ tree bdecl; \
bdecl = add_builtin_function ((NAME), (TYPE), (CODE), \ bdecl = add_builtin_function ((NAME), (TYPE), (CODE), \
...@@ -1170,7 +1171,7 @@ arm_init_crypto_builtins (void) ...@@ -1170,7 +1171,7 @@ arm_init_crypto_builtins (void)
struct builtin_description struct builtin_description
{ {
const arm_feature_set features; const enum isa_feature feature;
const enum insn_code icode; const enum insn_code icode;
const char * const name; const char * const name;
const enum arm_builtins code; const enum arm_builtins code;
...@@ -1181,12 +1182,12 @@ struct builtin_description ...@@ -1181,12 +1182,12 @@ struct builtin_description
static const struct builtin_description bdesc_2arg[] = static const struct builtin_description bdesc_2arg[] =
{ {
#define IWMMXT_BUILTIN(code, string, builtin) \ #define IWMMXT_BUILTIN(code, string, builtin) \
{ ARM_FSET_MAKE_CPU1 (FL_IWMMXT), CODE_FOR_##code, \ { isa_bit_iwmmxt, CODE_FOR_##code, \
"__builtin_arm_" string, \ "__builtin_arm_" string, \
ARM_BUILTIN_##builtin, UNKNOWN, 0 }, ARM_BUILTIN_##builtin, UNKNOWN, 0 },
#define IWMMXT2_BUILTIN(code, string, builtin) \ #define IWMMXT2_BUILTIN(code, string, builtin) \
{ ARM_FSET_MAKE_CPU1 (FL_IWMMXT2), CODE_FOR_##code, \ { isa_bit_iwmmxt2, CODE_FOR_##code, \
"__builtin_arm_" string, \ "__builtin_arm_" string, \
ARM_BUILTIN_##builtin, UNKNOWN, 0 }, ARM_BUILTIN_##builtin, UNKNOWN, 0 },
...@@ -1270,11 +1271,11 @@ static const struct builtin_description bdesc_2arg[] = ...@@ -1270,11 +1271,11 @@ static const struct builtin_description bdesc_2arg[] =
IWMMXT_BUILTIN (iwmmxt_walignr3, "walignr3", WALIGNR3) IWMMXT_BUILTIN (iwmmxt_walignr3, "walignr3", WALIGNR3)
#define IWMMXT_BUILTIN2(code, builtin) \ #define IWMMXT_BUILTIN2(code, builtin) \
{ ARM_FSET_MAKE_CPU1 (FL_IWMMXT), CODE_FOR_##code, NULL, \ { isa_bit_iwmmxt, CODE_FOR_##code, NULL, \
ARM_BUILTIN_##builtin, UNKNOWN, 0 }, ARM_BUILTIN_##builtin, UNKNOWN, 0 },
#define IWMMXT2_BUILTIN2(code, builtin) \ #define IWMMXT2_BUILTIN2(code, builtin) \
{ ARM_FSET_MAKE_CPU2 (FL_IWMMXT2), CODE_FOR_##code, NULL, \ { isa_bit_iwmmxt2, CODE_FOR_##code, NULL, \
ARM_BUILTIN_##builtin, UNKNOWN, 0 }, ARM_BUILTIN_##builtin, UNKNOWN, 0 },
IWMMXT2_BUILTIN2 (iwmmxt_waddbhusm, WADDBHUSM) IWMMXT2_BUILTIN2 (iwmmxt_waddbhusm, WADDBHUSM)
...@@ -1290,7 +1291,7 @@ static const struct builtin_description bdesc_2arg[] = ...@@ -1290,7 +1291,7 @@ static const struct builtin_description bdesc_2arg[] =
#define FP_BUILTIN(L, U) \ #define FP_BUILTIN(L, U) \
{ARM_FSET_EMPTY, CODE_FOR_##L, "__builtin_arm_"#L, ARM_BUILTIN_##U, \ {isa_nobit, CODE_FOR_##L, "__builtin_arm_"#L, ARM_BUILTIN_##U, \
UNKNOWN, 0}, UNKNOWN, 0},
FP_BUILTIN (get_fpscr, GET_FPSCR) FP_BUILTIN (get_fpscr, GET_FPSCR)
...@@ -1298,7 +1299,7 @@ static const struct builtin_description bdesc_2arg[] = ...@@ -1298,7 +1299,7 @@ static const struct builtin_description bdesc_2arg[] =
#undef FP_BUILTIN #undef FP_BUILTIN
#define CRC32_BUILTIN(L, U) \ #define CRC32_BUILTIN(L, U) \
{ARM_FSET_EMPTY, CODE_FOR_##L, "__builtin_arm_"#L, \ {isa_nobit, CODE_FOR_##L, "__builtin_arm_"#L, \
ARM_BUILTIN_##U, UNKNOWN, 0}, ARM_BUILTIN_##U, UNKNOWN, 0},
CRC32_BUILTIN (crc32b, CRC32B) CRC32_BUILTIN (crc32b, CRC32B)
CRC32_BUILTIN (crc32h, CRC32H) CRC32_BUILTIN (crc32h, CRC32H)
...@@ -1310,7 +1311,7 @@ static const struct builtin_description bdesc_2arg[] = ...@@ -1310,7 +1311,7 @@ static const struct builtin_description bdesc_2arg[] =
#define CRYPTO_BUILTIN(L, U) \ #define CRYPTO_BUILTIN(L, U) \
{ARM_FSET_EMPTY, 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},
#undef CRYPTO1 #undef CRYPTO1
#undef CRYPTO2 #undef CRYPTO2
...@@ -1567,9 +1568,9 @@ arm_init_iwmmxt_builtins (void) ...@@ -1567,9 +1568,9 @@ arm_init_iwmmxt_builtins (void)
machine_mode mode; machine_mode mode;
tree type; tree type;
if (d->name == 0 || if (d->name == 0
!(ARM_FSET_HAS_CPU1 (d->features, FL_IWMMXT) || || !(d->feature == isa_bit_iwmmxt
ARM_FSET_HAS_CPU1 (d->features, FL_IWMMXT2))) || d->feature == isa_bit_iwmmxt2))
continue; continue;
mode = insn_data[d->icode].operand[1].mode; mode = insn_data[d->icode].operand[1].mode;
...@@ -1593,16 +1594,16 @@ arm_init_iwmmxt_builtins (void) ...@@ -1593,16 +1594,16 @@ arm_init_iwmmxt_builtins (void)
gcc_unreachable (); gcc_unreachable ();
} }
def_mbuiltin (d->features, d->name, type, d->code); def_mbuiltin (d->feature, d->name, type, d->code);
} }
/* Add the remaining MMX insns with somewhat more complicated types. */ /* Add the remaining MMX insns with somewhat more complicated types. */
#define iwmmx_mbuiltin(NAME, TYPE, CODE) \ #define iwmmx_mbuiltin(NAME, TYPE, CODE) \
def_mbuiltin (ARM_FSET_MAKE_CPU1 (FL_IWMMXT), "__builtin_arm_" NAME, \ def_mbuiltin (isa_bit_iwmmxt, "__builtin_arm_" NAME, \
(TYPE), ARM_BUILTIN_ ## CODE) (TYPE), ARM_BUILTIN_ ## CODE)
#define iwmmx2_mbuiltin(NAME, TYPE, CODE) \ #define iwmmx2_mbuiltin(NAME, TYPE, CODE) \
def_mbuiltin (ARM_FSET_MAKE_CPU1 (FL_IWMMXT2), "__builtin_arm_" NAME, \ def_mbuiltin (isa_bit_iwmmxt2, "__builtin_arm_" NAME, \
(TYPE), ARM_BUILTIN_ ## CODE) (TYPE), ARM_BUILTIN_ ## CODE)
iwmmx_mbuiltin ("wzero", di_ftype_void, WZERO); iwmmx_mbuiltin ("wzero", di_ftype_void, WZERO);
......
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