2019-12-02 Richard Sandiford <richard.sandiford@arm.com>
+ * config/aarch64/aarch64.c (aarch64_report_sve_required): New function.
+ (aarch64_expand_mov_immediate): Use it when attempting to measure
+ the length of an SVE vector.
+ (aarch64_mov_operand_p): Only allow SVE CNT immediates when
+ SVE is enabled.
+
+2019-12-02 Richard Sandiford <richard.sandiford@arm.com>
+
* config/aarch64/aarch64-sve-builtins.h
(gimple_folder::force_vector): Declare.
* config/aarch64/aarch64-sve-builtins.cc
" vector types", "+nofp");
}
+/* Report when we try to do something that requires SVE when SVE is disabled.
+ This is an error of last resort and isn't very high-quality. It usually
+ involves attempts to measure the vector length in some way. */
+static void
+aarch64_report_sve_required (void)
+{
+ static bool reported_p = false;
+
+ /* Avoid reporting a slew of messages for a single oversight. */
+ if (reported_p)
+ return;
+
+ error ("this operation requires the SVE ISA extension");
+ inform (input_location, "you can enable SVE using the command-line"
+ " option %<-march%>, or by using the %<target%>"
+ " attribute or pragma");
+ reported_p = true;
+}
+
/* Return true if REGNO is P0-P15 or one of the special FFR-related
registers. */
inline bool
folding it into the relocation. */
if (!offset.is_constant (&const_offset))
{
+ if (!TARGET_SVE)
+ {
+ aarch64_report_sve_required ();
+ return;
+ }
if (base == const0_rtx && aarch64_sve_cnt_immediate_p (offset))
emit_insn (gen_rtx_SET (dest, imm));
else
if (GET_CODE (x) == SYMBOL_REF && mode == DImode && CONSTANT_ADDRESS_P (x))
return true;
- if (aarch64_sve_cnt_immediate_p (x))
+ if (TARGET_SVE && aarch64_sve_cnt_immediate_p (x))
return true;
return aarch64_classify_symbolic_expression (x)
2019-12-02 Richard Sandiford <richard.sandiford@arm.com>
+ * gcc.target/aarch64/sve/acle/general/nosve_4.c: New test.
+ * gcc.target/aarch64/sve/acle/general/nosve_5.c: Likewise.
+ * gcc.target/aarch64/sve/pcs/nosve_4.c: Expected a second error
+ for the copy.
+ * gcc.target/aarch64/sve/pcs/nosve_5.c: Likewise.
+ * gcc.target/aarch64/sve/pcs/nosve_6.c: Likewise.
+
+2019-12-02 Richard Sandiford <richard.sandiford@arm.com>
+
* gcc.target/aarch64/sve/acle/aarch64-sve-acle.exp: Run the
general/* tests too.
--- /dev/null
+/* { dg-options "-march=armv8-a" } */
+
+void
+f (__SVBool_t *x, __SVBool_t *y)
+{
+ *x = *y; /* { dg-error {this operation requires the SVE ISA extension} } */
+ *x = *y;
+}
--- /dev/null
+/* { dg-options "-march=armv8-a" } */
+
+void
+f (__SVInt8_t *x, __SVInt8_t *y)
+{
+ *x = *y; /* { dg-error {this operation requires the SVE ISA extension} } */
+ *x = *y;
+}
void
f (svuint8_t *ptr)
{
- take_svuint8 (*ptr); /* { dg-error {'take_svuint8' requires the SVE ISA extension} } */
+ take_svuint8 (*ptr); /* { dg-error {this operation requires the SVE ISA extension} } */
+ /* { dg-error {'take_svuint8' requires the SVE ISA extension} "" { target *-*-* } .-1 } */
}
void
f (svuint8_t *ptr)
{
- take_svuint8_eventually (0, 0, 0, 0, 0, 0, 0, 0, *ptr); /* { dg-error {arguments of type '(svuint8_t|__SVUint8_t)' require the SVE ISA extension} } */
+ take_svuint8_eventually (0, 0, 0, 0, 0, 0, 0, 0, *ptr); /* { dg-error {this operation requires the SVE ISA extension} } */
+ /* { dg-error {arguments of type '(svuint8_t|__SVUint8_t)' require the SVE ISA extension} "" { target *-*-* } .-1 } */
}
void
f (svuint8_t *ptr)
{
- unprototyped (*ptr); /* { dg-error {arguments of type '(svuint8_t|__SVUint8_t)' require the SVE ISA extension} } */
+ unprototyped (*ptr); /* { dg-error {this operation requires the SVE ISA extension} } */
+ /* { dg-error {arguments of type '(svuint8_t|__SVUint8_t)' require the SVE ISA extension} "" { target *-*-* } .-1 } */
}