1 /* { dg-do compile } */
2 
3 typedef union rtunion_def {
4   struct rtx_def *rtx;
5 } rtunion;
6 typedef struct rtx_def {
7   unsigned short code;
8   rtunion fld[1];
9 } *rtx;
10 extern rtx recog_operand[];
11 extern rtx *recog_operand_loc[];
12 extern int reload_n_operands;
13 extern void find_dummy_reload (int, int);
14 extern int asm_noperands (rtx);
15 extern int n_occurrences (char **);
16 char operands_match[10][10];
find_reloads(rtx insn,int n_alternatives,int commutative)17 void find_reloads (rtx insn, int n_alternatives, int commutative)
18 {
19   register int i, j;
20   int noperands;
21   char *constraints[10];
22   int address_reloaded[10];
23   int this_alternative[10];
24   char this_alternative_win[10];
25   int this_alternative_matches[10];
26   int this_alternative_number;
27   rtx body = ((insn)->fld[3].rtx);
28   int operand_mode[10];
29   if (body->code == 1)
30     {
31       reload_n_operands = noperands = asm_noperands (body);
32       n_alternatives = n_occurrences (constraints);
33     }
34   for (this_alternative_number = 0;
35        this_alternative_number < n_alternatives;
36        this_alternative_number++)
37     for (i = 0;
38 	 i < noperands;
39 	 i++)
40       {
41 	register char *p = constraints[i];
42 	register int win = 0;
43 	int badop = 1;
44 	int c;
45 	register rtx operand = recog_operand[i];
46 	int force_reload = 0;
47 	this_alternative_win[i] = 0;
48 	this_alternative[i] = 1;
49 	while (*p && (c = *p++) != ',')
50 	  switch (c)
51 	    {
52 	    case '4':
53 	      c -= '0';
54 	      this_alternative_matches[i] = c;
55 	      if ((c != commutative
56 		   || i != commutative + 1)
57 		  && operands_match[c][i])
58 		win = this_alternative_win[c];
59 	      else
60 		find_dummy_reload (operand_mode[i], this_alternative[c]);
61 	      if (! win || force_reload)
62 		for (j = 0; j < i; j++)
63 		  if (this_alternative_matches[j]
64 		      == this_alternative_matches[i])
65 		    badop = 1;
66 	      break;
67 	    case '<':
68 	      if (operand->code == 2
69 		  && ! address_reloaded[i]
70 		  && operand->fld[0].rtx->code == 3)
71 		win = 1;
72 	    }
73       }
74 }
75