unsigned int alt = 0;
bool early_clobbered = false;
+ /* Currently, multiple hard register constraints in one alternative are not
+ supported. A combination of hard register constraints and regular
+ register constraints is also not supported. */
+ bool alt_has_hard_reg_cstr = false;
+ bool alt_has_reg_cstr = false;
/* Loop through the constraint string. */
for (p = constraint + 1; *p; )
case ',':
++alt;
early_clobbered = false;
+ alt_has_hard_reg_cstr = false;
+ alt_has_reg_cstr = false;
break;
case '0': case '1': case '2': case '3': case '4':
}
if (reg_info)
{
+ if (alt_has_reg_cstr)
+ {
+ error (
+ "hard register constraints and regular register "
+ "constraints in one alternative are not supported");
+ return false;
+ }
+ if (alt_has_hard_reg_cstr)
+ {
+ error (
+ "multiple hard register constraints in one "
+ "alternative are not supported");
+ return false;
+ }
+ alt_has_hard_reg_cstr = true;
int regno = decode_hard_reg_constraint (p);
if (regno < 0)
{
enum constraint_num cn = lookup_constraint (p);
if (reg_class_for_constraint (cn) != NO_REGS
|| insn_extra_address_constraint (cn))
- *allows_reg = true;
+ {
+ if (alt_has_hard_reg_cstr)
+ {
+ error (
+ "hard register constraints and regular register "
+ "constraints in one alternative are not supported");
+ return false;
+ }
+ alt_has_reg_cstr = true;
+ *allows_reg = true;
+ }
else if (insn_extra_memory_constraint (cn))
*allows_mem = true;
else
*allows_mem = false;
*allows_reg = false;
+ bool alt_has_hard_reg_cstr = false;
+ bool alt_has_reg_cstr = false;
+
/* Make sure constraint has neither `=', `+', nor '&'. */
unsigned int alt = 0;
case ',':
++alt;
+ alt_has_hard_reg_cstr = false;
+ alt_has_reg_cstr = false;
break;
/* Whether or not a numeric constraint allows a register is
}
if (reg_info)
{
+ if (alt_has_reg_cstr)
+ {
+ error (
+ "hard register constraints and regular register "
+ "constraints in one alternative are not supported");
+ return false;
+ }
+ if (alt_has_hard_reg_cstr)
+ {
+ error (
+ "multiple hard register constraints in one "
+ "alternative are not supported");
+ return false;
+ }
+ alt_has_hard_reg_cstr = true;
int regno = decode_hard_reg_constraint (constraint + j);
if (regno < 0)
{
enum constraint_num cn = lookup_constraint (constraint + j);
if (reg_class_for_constraint (cn) != NO_REGS
|| insn_extra_address_constraint (cn))
- *allows_reg = true;
+ {
+ if (alt_has_hard_reg_cstr)
+ {
+ error (
+ "hard register constraints and regular register "
+ "constraints in one alternative are not supported");
+ return false;
+ }
+ alt_has_reg_cstr = true;
+ *allows_reg = true;
+ }
else if (insn_extra_memory_constraint (cn)
|| insn_extra_special_memory_constraint (cn)
|| insn_extra_relaxed_memory_constraint (cn))
__asm__ ("" :: GPR1","GPR2 (42), GPR2","GPR3 (42));
__asm__ ("" :: GPR1","GPR2 (42), GPR3","GPR2 (42)); /* { dg-error "multiple inputs to hard register" } */
__asm__ ("" :: GPR1","GPR2 (42), GPR1","GPR3 (42)); /* { dg-error "multiple inputs to hard register" } */
- __asm__ ("" :: GPR1 GPR2 (42), GPR2 (42)); /* { dg-error "multiple inputs to hard register" } */
__asm__ ("" : "+"GPR1 (x), "="GPR1 (y)); /* { dg-error "multiple outputs to hard register" } */
__asm__ ("" : "="GPR1 (y) : GPR1 (42), "0" (42)); /* { dg-error "multiple inputs to hard register" } */
__asm__ ("" : "+"GPR1 (x) : GPR1 (42)); /* { dg-error "multiple inputs to hard register" } */
__asm__ ("" : "="GPR2 (gpr1)); /* { dg-error "constraint and register 'asm' for output operand 0 are unsatisfiable" } */
__asm__ ("" :: GPR2 (gpr1)); /* { dg-error "constraint and register 'asm' for input operand 0 are unsatisfiable" } */
__asm__ ("" : "="GPR1 (x) : "0" (gpr1));
- __asm__ ("" : "="GPR1 GPR2 (x) : "0" (gpr1)); /* { dg-error "constraint and register 'asm' for input operand 0 are unsatisfiable" } */
+ __asm__ ("" : "="GPR2 (x) : "0" (gpr1)); /* { dg-error "constraint and register 'asm' for input operand 0 are unsatisfiable" } */
__asm__ ("" : "=&"GPR1 (x) : "0" (gpr1));
__asm__ ("" : "=&"GPR1 (x) : "0" (42));
--- /dev/null
+/* { dg-do compile { target lra } } */
+
+#if defined __hppa__
+# define R0 "20"
+# define R1 "21"
+#elif defined __AVR__
+# define R0 "20"
+# define R1 "24"
+#elif defined __PRU__
+# define R0 "0"
+# define R1 "4"
+#else
+# define R0 "0"
+# define R1 "1"
+#endif
+
+int
+test (void)
+{
+ int x;
+
+ __asm__ ("" : "={"R0"}{"R1"}" (x)); /* { dg-error "multiple hard register constraints in one alternative are not supported" } */
+ __asm__ ("" : "={"R0"}m{"R1"}" (x) : "r" (x)); /* { dg-error "multiple hard register constraints in one alternative are not supported" } */
+ __asm__ ("" : "={"R0"}m" (x) : "r" (x));
+ __asm__ ("" : "=r" (x) : "{"R0"}{"R1"}" (x)); /* { dg-error "multiple hard register constraints in one alternative are not supported" } */
+ __asm__ ("" : "=r" (x) : "{"R0"}i{"R1"}" (x)); /* { dg-error "multiple hard register constraints in one alternative are not supported" } */
+ __asm__ ("" : "=r" (x) : "{"R0"}i" (x));
+
+ __asm__ ("" : "={"R0"}r" (x) : "r" (x)); /* { dg-error "hard register constraints and regular register constraints in one alternative are not supported" } */
+ __asm__ ("" : "=r{"R0"}" (x) : "r" (x)); /* { dg-error "hard register constraints and regular register constraints in one alternative are not supported" } */
+ __asm__ ("" : "=r" (x) : "{"R0"}r" (x)); /* { dg-error "hard register constraints and regular register constraints in one alternative are not supported" } */
+ __asm__ ("" : "=r" (x) : "r{"R0"}" (x)); /* { dg-error "hard register constraints and regular register constraints in one alternative are not supported" } */
+
+ return x;
+}