diff options
author | Alan Lawrence <alan.lawrence@arm.com> | 2015-06-24 16:13:28 +0000 |
---|---|---|
committer | Alan Lawrence <alalaw01@gcc.gnu.org> | 2015-06-24 16:13:28 +0000 |
commit | 261fb553d291b2fd74ae28348dda80115bf6d29e (patch) | |
tree | 4102743e90a18e3286c00d6d21c034a0e0340d59 /gcc/config | |
parent | 4ca1ca5bdb4c7467a1db9a3e2ef32607cceb6ddd (diff) | |
download | gcc-261fb553d291b2fd74ae28348dda80115bf6d29e.zip gcc-261fb553d291b2fd74ae28348dda80115bf6d29e.tar.gz gcc-261fb553d291b2fd74ae28348dda80115bf6d29e.tar.bz2 |
[AArch64] Fix ICES with -mgeneral-regs-only / -march=...+nofp
gcc/ChangeLog:
* config/aarch64/aarch64-protos.h (aarch64_err_no_fpadvsimd): New.
* config/aarch64/aarch64.md (mov<mode>/GPF, movtf): Use
aarch64_err_no_fpadvsimd.
* config/aarch64/aarch64.c (aarch64_err_no_fpadvsimd): New.
(aarch64_layout_arg, aarch64_init_cumulative_args): Use
aarch64_err_no_fpadvsimd if !TARGET_FLOAT and we need FP regs.
(aarch64_expand_builtin_va_start, aarch64_setup_incoming_varargs):
Turn error into assert, test TARGET_FLOAT.
(aarch64_gimplify_va_arg_expr): Use aarch64_err_no_fpadvsimd, test
TARGET_FLOAT.
gcc/testsuite/ChangeLog:
* gcc.target/aarch64/mgeneral-regs_1.c: New file.
* gcc.target/aarch64/mgeneral-regs_2.c: New file.
* gcc.target/aarch64/nofp_1.c: New file.
From-SVN: r224908
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/aarch64/aarch64-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.c | 35 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.md | 20 |
3 files changed, 38 insertions, 18 deletions
diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index 965a11b..ac92c59 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -259,6 +259,7 @@ unsigned aarch64_dbx_register_number (unsigned); unsigned aarch64_trampoline_size (void); void aarch64_asm_output_labelref (FILE *, const char *); void aarch64_elf_asm_named_section (const char *, unsigned, tree); +void aarch64_err_no_fpadvsimd (machine_mode, const char *); void aarch64_expand_epilogue (bool); void aarch64_expand_mov_immediate (rtx, rtx); void aarch64_expand_prologue (void); diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 17bae08..fa1f7da 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -520,6 +520,16 @@ static const char * const aarch64_condition_codes[] = "hi", "ls", "ge", "lt", "gt", "le", "al", "nv" }; +void +aarch64_err_no_fpadvsimd (machine_mode mode, const char *msg) +{ + const char *mc = FLOAT_MODE_P (mode) ? "floating-point" : "vector"; + if (TARGET_GENERAL_REGS_ONLY) + error ("%qs is incompatible with %s %s", "-mgeneral-regs-only", mc, msg); + else + error ("%qs feature modifier is incompatible with %s %s", "+nofp", mc, msg); +} + static unsigned int aarch64_min_divisions_for_recip_mul (enum machine_mode mode) { @@ -1770,6 +1780,9 @@ aarch64_layout_arg (cumulative_args_t pcum_v, machine_mode mode, and homogenous short-vector aggregates (HVA). */ if (allocate_nvrn) { + if (!TARGET_FLOAT) + aarch64_err_no_fpadvsimd (mode, "argument"); + if (nvrn + nregs <= NUM_FP_ARG_REGS) { pcum->aapcs_nextnvrn = nvrn + nregs; @@ -1896,6 +1909,17 @@ aarch64_init_cumulative_args (CUMULATIVE_ARGS *pcum, pcum->aapcs_stack_words = 0; pcum->aapcs_stack_size = 0; + if (!TARGET_FLOAT + && fndecl && TREE_PUBLIC (fndecl) + && fntype && fntype != error_mark_node) + { + const_tree type = TREE_TYPE (fntype); + machine_mode mode ATTRIBUTE_UNUSED; /* To pass pointer as argument. */ + int nregs ATTRIBUTE_UNUSED; /* Likewise. */ + if (aarch64_vfp_is_call_or_return_candidate (TYPE_MODE (type), type, + &mode, &nregs, NULL)) + aarch64_err_no_fpadvsimd (TYPE_MODE (type), "return type"); + } return; } @@ -7555,9 +7579,7 @@ aarch64_expand_builtin_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED) if (!TARGET_FLOAT) { - if (cum->aapcs_nvrn > 0) - sorry ("%qs and floating point or vector arguments", - "-mgeneral-regs-only"); + gcc_assert (cum->aapcs_nvrn == 0); vr_save_area_size = 0; } @@ -7664,8 +7686,7 @@ aarch64_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p, { /* TYPE passed in fp/simd registers. */ if (!TARGET_FLOAT) - sorry ("%qs and floating point or vector arguments", - "-mgeneral-regs-only"); + aarch64_err_no_fpadvsimd (mode, "varargs"); f_top = build3 (COMPONENT_REF, TREE_TYPE (f_vrtop), unshare_expr (valist), f_vrtop, NULL_TREE); @@ -7902,9 +7923,7 @@ aarch64_setup_incoming_varargs (cumulative_args_t cum_v, machine_mode mode, if (!TARGET_FLOAT) { - if (local_cum.aapcs_nvrn > 0) - sorry ("%qs and floating point or vector arguments", - "-mgeneral-regs-only"); + gcc_assert (local_cum.aapcs_nvrn == 0); vr_saved = 0; } diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index d3f5d5b..934c8fa 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -979,18 +979,18 @@ [(set (match_operand:GPF 0 "nonimmediate_operand" "") (match_operand:GPF 1 "general_operand" ""))] "" - " + { if (!TARGET_FLOAT) - { - sorry (\"%qs and floating point code\", \"-mgeneral-regs-only\"); + { + aarch64_err_no_fpadvsimd (<MODE>mode, "code"); FAIL; - } + } if (GET_CODE (operands[0]) == MEM && ! (GET_CODE (operands[1]) == CONST_DOUBLE && aarch64_float_const_zero_rtx_p (operands[1]))) operands[1] = force_reg (<MODE>mode, operands[1]); - " + } ) (define_insn "*movsf_aarch64" @@ -1035,18 +1035,18 @@ [(set (match_operand:TF 0 "nonimmediate_operand" "") (match_operand:TF 1 "general_operand" ""))] "" - " + { if (!TARGET_FLOAT) - { - sorry (\"%qs and floating point code\", \"-mgeneral-regs-only\"); + { + aarch64_err_no_fpadvsimd (TFmode, "code"); FAIL; - } + } if (GET_CODE (operands[0]) == MEM && ! (GET_CODE (operands[1]) == CONST_DOUBLE && aarch64_float_const_zero_rtx_p (operands[1]))) operands[1] = force_reg (TFmode, operands[1]); - " + } ) (define_insn "*movtf_aarch64" |