]> gcc.gnu.org Git - gcc.git/blame - gcc/stmt.c
defaults.h (GO_IF_MODE_DEPENDENT_ADDRESS): Provide empty default.
[gcc.git] / gcc / stmt.c
CommitLineData
5e6908ea 1/* Expands front end tree to back end RTL for GCC
4559fd9e 2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
eca72963 3 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
c8d3e15a 4 Free Software Foundation, Inc.
28d81abb 5
1322177d 6This file is part of GCC.
28d81abb 7
1322177d
LB
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
9dcd6f09 10Software Foundation; either version 3, or (at your option) any later
1322177d 11version.
28d81abb 12
1322177d
LB
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
28d81abb
RK
17
18You should have received a copy of the GNU General Public License
9dcd6f09
NC
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
28d81abb 21
28d81abb
RK
22/* This file handles the generation of rtl code from tree structure
23 above the level of expressions, using subroutines in exp*.c and emit-rtl.c.
28d81abb 24 The functions whose names start with `expand_' are called by the
7efcb746 25 expander to generate RTL instructions for various kinds of constructs. */
28d81abb
RK
26
27#include "config.h"
670ee920 28#include "system.h"
4977bab6
ZW
29#include "coretypes.h"
30#include "tm.h"
ccd043a9 31
28d81abb 32#include "rtl.h"
61158923 33#include "hard-reg-set.h"
28d81abb 34#include "tree.h"
6baf1cc8 35#include "tm_p.h"
28d81abb 36#include "flags.h"
6adb4e3a 37#include "except.h"
28d81abb 38#include "function.h"
28d81abb 39#include "insn-config.h"
28d81abb 40#include "expr.h"
e78d8e51 41#include "libfuncs.h"
28d81abb 42#include "recog.h"
ca695ac9 43#include "machmode.h"
10f0ad3d 44#include "toplev.h"
d6f4ec51 45#include "output.h"
87ff9c8e 46#include "ggc.h"
43577e6b 47#include "langhooks.h"
969d70ca 48#include "predict.h"
9bb231fd 49#include "optabs.h"
61f71b34 50#include "target.h"
66fd46b6 51#include "regs.h"
6ac1b3a4 52#include "alloc-pool.h"
28d81abb
RK
53\f
54/* Functions and data structures for expanding case statements. */
55
56/* Case label structure, used to hold info on labels within case
57 statements. We handle "range" labels; for a single-value label
58 as in C, the high and low limits are the same.
59
a6c0a76c
SB
60 We start with a vector of case nodes sorted in ascending order, and
61 the default label as the last element in the vector. Before expanding
62 to RTL, we transform this vector into a list linked via the RIGHT
63 fields in the case_node struct. Nodes with higher case values are
64 later in the list.
65
66 Switch statements can be output in three forms. A branch table is
67 used if there are more than a few labels and the labels are dense
28d81abb
RK
68 within the range between the smallest and largest case value. If a
69 branch table is used, no further manipulations are done with the case
70 node chain.
71
72 The alternative to the use of a branch table is to generate a series
73 of compare and jump insns. When that is done, we use the LEFT, RIGHT,
74 and PARENT fields to hold a binary tree. Initially the tree is
de14fd73
RK
75 totally unbalanced, with everything on the right. We balance the tree
76 with nodes on the left having lower case values than the parent
28d81abb 77 and nodes on the right having higher values. We then output the tree
a6c0a76c
SB
78 in order.
79
80 For very small, suitable switch statements, we can generate a series
81 of simple bit test and branches instead. */
28d81abb 82
6ac1b3a4 83struct case_node
28d81abb
RK
84{
85 struct case_node *left; /* Left son in binary tree */
86 struct case_node *right; /* Right son in binary tree; also node chain */
87 struct case_node *parent; /* Parent of node in binary tree */
88 tree low; /* Lowest index value for this label */
89 tree high; /* Highest index value for this label */
90 tree code_label; /* Label to jump to when node matches */
91};
92
93typedef struct case_node case_node;
94typedef struct case_node *case_node_ptr;
95
96/* These are used by estimate_case_costs and balance_case_nodes. */
97
98/* This must be a signed type, and non-ANSI compilers lack signed char. */
e7749837 99static short cost_table_[129];
28d81abb 100static int use_cost_table;
2a2137c4
RH
101static int cost_table_initialized;
102
103/* Special care is needed because we allow -1, but TREE_INT_CST_LOW
104 is unsigned. */
cf403648 105#define COST_TABLE(I) cost_table_[(unsigned HOST_WIDE_INT) ((I) + 1)]
28d81abb 106\f
46c5ad27 107static int n_occurrences (int, const char *);
91b4415a 108static bool tree_conflicts_with_clobbers_p (tree, HARD_REG_SET *);
46c5ad27 109static void expand_nl_goto_receiver (void);
46c5ad27
AJ
110static bool check_operand_nalternatives (tree, tree);
111static bool check_unique_operand_names (tree, tree);
112static char *resolve_operand_name_1 (char *, tree, tree);
ac45df5d 113static void expand_null_return_1 (void);
46c5ad27 114static void expand_value_return (rtx);
46c5ad27 115static int estimate_case_costs (case_node_ptr);
46c5ad27
AJ
116static bool lshift_cheap_p (void);
117static int case_bit_test_cmp (const void *, const void *);
118static void emit_case_bit_tests (tree, tree, tree, tree, case_node_ptr, rtx);
46c5ad27
AJ
119static void balance_case_nodes (case_node_ptr *, case_node_ptr);
120static int node_has_low_bound (case_node_ptr, tree);
121static int node_has_high_bound (case_node_ptr, tree);
122static int node_is_bounded (case_node_ptr, tree);
46c5ad27 123static void emit_case_nodes (rtx, case_node_ptr, rtx, tree);
eb172681 124static struct case_node *add_case_node (struct case_node *, tree,
6ac1b3a4 125 tree, tree, tree, alloc_pool);
0cea056b 126
28d81abb
RK
127\f
128/* Return the rtx-label that corresponds to a LABEL_DECL,
129 creating it if necessary. */
130
131rtx
46c5ad27 132label_rtx (tree label)
28d81abb 133{
41374e13 134 gcc_assert (TREE_CODE (label) == LABEL_DECL);
28d81abb 135
19e7881c 136 if (!DECL_RTL_SET_P (label))
6de9cd9a
DN
137 {
138 rtx r = gen_label_rtx ();
139 SET_DECL_RTL (label, r);
140 if (FORCED_LABEL (label) || DECL_NONLOCAL (label))
141 LABEL_PRESERVE_P (r) = 1;
142 }
28d81abb 143
19e7881c 144 return DECL_RTL (label);
28d81abb
RK
145}
146
046e4e36
ZW
147/* As above, but also put it on the forced-reference list of the
148 function that contains it. */
149rtx
46c5ad27 150force_label_rtx (tree label)
046e4e36
ZW
151{
152 rtx ref = label_rtx (label);
153 tree function = decl_function_context (label);
046e4e36 154
41374e13 155 gcc_assert (function);
046e4e36 156
bd60bab2 157 forced_labels = gen_rtx_EXPR_LIST (VOIDmode, ref, forced_labels);
046e4e36
ZW
158 return ref;
159}
19e7881c 160
28d81abb
RK
161/* Add an unconditional jump to LABEL as the next sequential instruction. */
162
163void
46c5ad27 164emit_jump (rtx label)
28d81abb
RK
165{
166 do_pending_stack_adjust ();
167 emit_jump_insn (gen_jump (label));
168 emit_barrier ();
169}
170
171/* Emit code to jump to the address
172 specified by the pointer expression EXP. */
173
174void
46c5ad27 175expand_computed_goto (tree exp)
28d81abb 176{
84217346 177 rtx x = expand_normal (exp);
ed9a9db1 178
5ae6cd0d 179 x = convert_memory_address (Pmode, x);
ffa1a1ce 180
eb4e1c01
JH
181 do_pending_stack_adjust ();
182 emit_indirect_jump (x);
28d81abb
RK
183}
184\f
185/* Handle goto statements and the labels that they can go to. */
186
187/* Specify the location in the RTL code of a label LABEL,
188 which is a LABEL_DECL tree node.
189
190 This is used for the kind of label that the user can jump to with a
191 goto statement, and for alternatives of a switch or case statement.
192 RTL labels generated for loops and conditionals don't go through here;
193 they are generated directly at the RTL level, by other functions below.
194
195 Note that this has nothing to do with defining label *names*.
196 Languages vary in how they do that and what that even means. */
197
198void
46c5ad27 199expand_label (tree label)
28d81abb 200{
6de9cd9a 201 rtx label_r = label_rtx (label);
28d81abb
RK
202
203 do_pending_stack_adjust ();
6de9cd9a 204 emit_label (label_r);
28d81abb
RK
205 if (DECL_NAME (label))
206 LABEL_NAME (DECL_RTL (label)) = IDENTIFIER_POINTER (DECL_NAME (label));
207
6de9cd9a
DN
208 if (DECL_NONLOCAL (label))
209 {
210 expand_nl_goto_receiver ();
211 nonlocal_goto_handler_labels
212 = gen_rtx_EXPR_LIST (VOIDmode, label_r,
213 nonlocal_goto_handler_labels);
214 }
215
216 if (FORCED_LABEL (label))
217 forced_labels = gen_rtx_EXPR_LIST (VOIDmode, label_r, forced_labels);
caf93cb0 218
6de9cd9a
DN
219 if (DECL_NONLOCAL (label) || FORCED_LABEL (label))
220 maybe_set_first_label_num (label_r);
28d81abb
RK
221}
222
28d81abb
RK
223/* Generate RTL code for a `goto' statement with target label LABEL.
224 LABEL should be a LABEL_DECL tree node that was or will later be
225 defined with `expand_label'. */
226
227void
46c5ad27 228expand_goto (tree label)
28d81abb 229{
6de9cd9a
DN
230#ifdef ENABLE_CHECKING
231 /* Check for a nonlocal goto to a containing function. Should have
232 gotten translated to __builtin_nonlocal_goto. */
233 tree context = decl_function_context (label);
41374e13 234 gcc_assert (!context || context == current_function_decl);
28d81abb 235#endif
4b01bd16 236
ac45df5d 237 emit_jump (label_rtx (label));
28d81abb 238}
2a230e9d
BS
239\f
240/* Return the number of times character C occurs in string S. */
241static int
46c5ad27 242n_occurrences (int c, const char *s)
2a230e9d
BS
243{
244 int n = 0;
245 while (*s)
246 n += (*s++ == c);
247 return n;
248}
28d81abb
RK
249\f
250/* Generate RTL for an asm statement (explicit assembler code).
4c46ea23
EB
251 STRING is a STRING_CST node containing the assembler code text,
252 or an ADDR_EXPR containing a STRING_CST. VOL nonzero means the
253 insn is volatile; don't optimize it. */
28d81abb 254
bac6bfc5 255static void
bff4b63d 256expand_asm_loc (tree string, int vol, location_t locus)
28d81abb 257{
4c46ea23
EB
258 rtx body;
259
260 if (TREE_CODE (string) == ADDR_EXPR)
261 string = TREE_OPERAND (string, 0);
262
bff4b63d
AO
263 body = gen_rtx_ASM_INPUT_loc (VOIDmode,
264 ggc_strdup (TREE_STRING_POINTER (string)),
265 locus);
4c46ea23
EB
266
267 MEM_VOLATILE_P (body) = vol;
28d81abb 268
4c46ea23 269 emit_insn (body);
28d81abb
RK
270}
271
40b18c0a
MM
272/* Parse the output constraint pointed to by *CONSTRAINT_P. It is the
273 OPERAND_NUMth output operand, indexed from zero. There are NINPUTS
274 inputs and NOUTPUTS outputs to this extended-asm. Upon return,
275 *ALLOWS_MEM will be TRUE iff the constraint allows the use of a
276 memory operand. Similarly, *ALLOWS_REG will be TRUE iff the
277 constraint allows the use of a register operand. And, *IS_INOUT
278 will be true if the operand is read-write, i.e., if it is used as
279 an input as well as an output. If *CONSTRAINT_P is not in
280 canonical form, it will be made canonical. (Note that `+' will be
14b493d6 281 replaced with `=' as part of this process.)
40b18c0a
MM
282
283 Returns TRUE if all went well; FALSE if an error occurred. */
284
285bool
46c5ad27
AJ
286parse_output_constraint (const char **constraint_p, int operand_num,
287 int ninputs, int noutputs, bool *allows_mem,
288 bool *allows_reg, bool *is_inout)
40b18c0a
MM
289{
290 const char *constraint = *constraint_p;
291 const char *p;
292
293 /* Assume the constraint doesn't allow the use of either a register
294 or memory. */
295 *allows_mem = false;
296 *allows_reg = false;
297
298 /* Allow the `=' or `+' to not be at the beginning of the string,
299 since it wasn't explicitly documented that way, and there is a
300 large body of code that puts it last. Swap the character to
301 the front, so as not to uglify any place else. */
302 p = strchr (constraint, '=');
303 if (!p)
304 p = strchr (constraint, '+');
305
306 /* If the string doesn't contain an `=', issue an error
307 message. */
308 if (!p)
309 {
971801ff 310 error ("output operand constraint lacks %<=%>");
40b18c0a
MM
311 return false;
312 }
313
314 /* If the constraint begins with `+', then the operand is both read
315 from and written to. */
316 *is_inout = (*p == '+');
317
40b18c0a 318 /* Canonicalize the output constraint so that it begins with `='. */
372d72d9 319 if (p != constraint || *is_inout)
40b18c0a
MM
320 {
321 char *buf;
322 size_t c_len = strlen (constraint);
323
324 if (p != constraint)
d4ee4d25 325 warning (0, "output constraint %qc for operand %d "
971801ff 326 "is not at the beginning",
40b18c0a
MM
327 *p, operand_num);
328
329 /* Make a copy of the constraint. */
1634b18f 330 buf = XALLOCAVEC (char, c_len + 1);
40b18c0a
MM
331 strcpy (buf, constraint);
332 /* Swap the first character and the `=' or `+'. */
333 buf[p - constraint] = buf[0];
334 /* Make sure the first character is an `='. (Until we do this,
335 it might be a `+'.) */
336 buf[0] = '=';
337 /* Replace the constraint with the canonicalized string. */
338 *constraint_p = ggc_alloc_string (buf, c_len);
339 constraint = *constraint_p;
340 }
341
342 /* Loop through the constraint string. */
97488870 343 for (p = constraint + 1; *p; p += CONSTRAINT_LEN (*p, p))
40b18c0a
MM
344 switch (*p)
345 {
346 case '+':
347 case '=':
971801ff
JM
348 error ("operand constraint contains incorrectly positioned "
349 "%<+%> or %<=%>");
40b18c0a 350 return false;
786de7eb 351
40b18c0a
MM
352 case '%':
353 if (operand_num + 1 == ninputs + noutputs)
354 {
971801ff 355 error ("%<%%%> constraint used with last operand");
40b18c0a
MM
356 return false;
357 }
358 break;
359
a4edaf83 360 case 'V': case TARGET_MEM_CONSTRAINT: case 'o':
40b18c0a
MM
361 *allows_mem = true;
362 break;
363
364 case '?': case '!': case '*': case '&': case '#':
365 case 'E': case 'F': case 'G': case 'H':
366 case 's': case 'i': case 'n':
367 case 'I': case 'J': case 'K': case 'L': case 'M':
368 case 'N': case 'O': case 'P': case ',':
369 break;
370
371 case '0': case '1': case '2': case '3': case '4':
372 case '5': case '6': case '7': case '8': case '9':
84b72302 373 case '[':
40b18c0a
MM
374 error ("matching constraint not valid in output operand");
375 return false;
376
377 case '<': case '>':
378 /* ??? Before flow, auto inc/dec insns are not supposed to exist,
379 excepting those that expand_call created. So match memory
380 and hope. */
381 *allows_mem = true;
382 break;
383
384 case 'g': case 'X':
385 *allows_reg = true;
386 *allows_mem = true;
387 break;
786de7eb 388
40b18c0a
MM
389 case 'p': case 'r':
390 *allows_reg = true;
391 break;
392
393 default:
394 if (!ISALPHA (*p))
395 break;
97488870 396 if (REG_CLASS_FROM_CONSTRAINT (*p, p) != NO_REGS)
40b18c0a 397 *allows_reg = true;
97488870
R
398#ifdef EXTRA_CONSTRAINT_STR
399 else if (EXTRA_ADDRESS_CONSTRAINT (*p, p))
ccfc6cc8 400 *allows_reg = true;
97488870 401 else if (EXTRA_MEMORY_CONSTRAINT (*p, p))
ccfc6cc8 402 *allows_mem = true;
40b18c0a
MM
403 else
404 {
405 /* Otherwise we can't assume anything about the nature of
406 the constraint except that it isn't purely registers.
407 Treat it like "g" and hope for the best. */
408 *allows_reg = true;
409 *allows_mem = true;
410 }
411#endif
412 break;
413 }
414
415 return true;
416}
417
6be2e1f8
RH
418/* Similar, but for input constraints. */
419
1456deaf 420bool
46c5ad27
AJ
421parse_input_constraint (const char **constraint_p, int input_num,
422 int ninputs, int noutputs, int ninout,
423 const char * const * constraints,
424 bool *allows_mem, bool *allows_reg)
6be2e1f8
RH
425{
426 const char *constraint = *constraint_p;
427 const char *orig_constraint = constraint;
428 size_t c_len = strlen (constraint);
429 size_t j;
f3da0ead 430 bool saw_match = false;
6be2e1f8
RH
431
432 /* Assume the constraint doesn't allow the use of either
433 a register or memory. */
434 *allows_mem = false;
435 *allows_reg = false;
436
437 /* Make sure constraint has neither `=', `+', nor '&'. */
438
97488870 439 for (j = 0; j < c_len; j += CONSTRAINT_LEN (constraint[j], constraint+j))
6be2e1f8
RH
440 switch (constraint[j])
441 {
442 case '+': case '=': case '&':
443 if (constraint == orig_constraint)
444 {
971801ff 445 error ("input operand constraint contains %qc", constraint[j]);
6be2e1f8
RH
446 return false;
447 }
448 break;
449
450 case '%':
451 if (constraint == orig_constraint
452 && input_num + 1 == ninputs - ninout)
453 {
971801ff 454 error ("%<%%%> constraint used with last operand");
6be2e1f8
RH
455 return false;
456 }
457 break;
458
a4edaf83 459 case 'V': case TARGET_MEM_CONSTRAINT: case 'o':
6be2e1f8
RH
460 *allows_mem = true;
461 break;
462
463 case '<': case '>':
464 case '?': case '!': case '*': case '#':
465 case 'E': case 'F': case 'G': case 'H':
466 case 's': case 'i': case 'n':
467 case 'I': case 'J': case 'K': case 'L': case 'M':
468 case 'N': case 'O': case 'P': case ',':
469 break;
470
471 /* Whether or not a numeric constraint allows a register is
472 decided by the matching constraint, and so there is no need
473 to do anything special with them. We must handle them in
474 the default case, so that we don't unnecessarily force
475 operands to memory. */
476 case '0': case '1': case '2': case '3': case '4':
477 case '5': case '6': case '7': case '8': case '9':
478 {
479 char *end;
480 unsigned long match;
481
f3da0ead
JM
482 saw_match = true;
483
6be2e1f8
RH
484 match = strtoul (constraint + j, &end, 10);
485 if (match >= (unsigned long) noutputs)
486 {
487 error ("matching constraint references invalid operand number");
488 return false;
489 }
490
491 /* Try and find the real constraint for this dup. Only do this
492 if the matching constraint is the only alternative. */
493 if (*end == '\0'
494 && (j == 0 || (j == 1 && constraint[0] == '%')))
495 {
496 constraint = constraints[match];
497 *constraint_p = constraint;
498 c_len = strlen (constraint);
499 j = 0;
97488870
R
500 /* ??? At the end of the loop, we will skip the first part of
501 the matched constraint. This assumes not only that the
502 other constraint is an output constraint, but also that
503 the '=' or '+' come first. */
6be2e1f8
RH
504 break;
505 }
506 else
507 j = end - constraint;
97488870
R
508 /* Anticipate increment at end of loop. */
509 j--;
6be2e1f8
RH
510 }
511 /* Fall through. */
512
513 case 'p': case 'r':
514 *allows_reg = true;
515 break;
516
517 case 'g': case 'X':
518 *allows_reg = true;
519 *allows_mem = true;
520 break;
521
522 default:
523 if (! ISALPHA (constraint[j]))
524 {
971801ff 525 error ("invalid punctuation %qc in constraint", constraint[j]);
6be2e1f8
RH
526 return false;
527 }
97488870
R
528 if (REG_CLASS_FROM_CONSTRAINT (constraint[j], constraint + j)
529 != NO_REGS)
6be2e1f8 530 *allows_reg = true;
97488870
R
531#ifdef EXTRA_CONSTRAINT_STR
532 else if (EXTRA_ADDRESS_CONSTRAINT (constraint[j], constraint + j))
ccfc6cc8 533 *allows_reg = true;
97488870 534 else if (EXTRA_MEMORY_CONSTRAINT (constraint[j], constraint + j))
ccfc6cc8 535 *allows_mem = true;
6be2e1f8
RH
536 else
537 {
538 /* Otherwise we can't assume anything about the nature of
539 the constraint except that it isn't purely registers.
540 Treat it like "g" and hope for the best. */
541 *allows_reg = true;
542 *allows_mem = true;
543 }
544#endif
545 break;
546 }
547
f3da0ead 548 if (saw_match && !*allows_reg)
d4ee4d25 549 warning (0, "matching constraint does not allow a register");
f3da0ead 550
6be2e1f8
RH
551 return true;
552}
553
91b4415a
R
554/* Return DECL iff there's an overlap between *REGS and DECL, where DECL
555 can be an asm-declared register. Called via walk_tree. */
acb5d088 556
91b4415a
R
557static tree
558decl_overlaps_hard_reg_set_p (tree *declp, int *walk_subtrees ATTRIBUTE_UNUSED,
559 void *data)
acb5d088 560{
91b4415a 561 tree decl = *declp;
1634b18f 562 const HARD_REG_SET *const regs = (const HARD_REG_SET *) data;
91b4415a 563
3f2de3dc 564 if (TREE_CODE (decl) == VAR_DECL)
acb5d088 565 {
3f2de3dc 566 if (DECL_HARD_REGISTER (decl)
91b4415a
R
567 && REG_P (DECL_RTL (decl))
568 && REGNO (DECL_RTL (decl)) < FIRST_PSEUDO_REGISTER)
569 {
570 rtx reg = DECL_RTL (decl);
09e18274
RS
571
572 if (overlaps_hard_reg_set_p (*regs, GET_MODE (reg), REGNO (reg)))
573 return decl;
91b4415a
R
574 }
575 walk_subtrees = 0;
61158923 576 }
3f2de3dc 577 else if (TYPE_P (decl) || TREE_CODE (decl) == PARM_DECL)
91b4415a
R
578 walk_subtrees = 0;
579 return NULL_TREE;
61158923
HPN
580}
581
91b4415a
R
582/* If there is an overlap between *REGS and DECL, return the first overlap
583 found. */
584tree
585tree_overlaps_hard_reg_set (tree decl, HARD_REG_SET *regs)
586{
587 return walk_tree (&decl, decl_overlaps_hard_reg_set_p, regs, NULL);
588}
61158923
HPN
589
590/* Check for overlap between registers marked in CLOBBERED_REGS and
91b4415a
R
591 anything inappropriate in T. Emit error and return the register
592 variable definition for error, NULL_TREE for ok. */
61158923
HPN
593
594static bool
91b4415a 595tree_conflicts_with_clobbers_p (tree t, HARD_REG_SET *clobbered_regs)
61158923
HPN
596{
597 /* Conflicts between asm-declared register variables and the clobber
598 list are not allowed. */
91b4415a
R
599 tree overlap = tree_overlaps_hard_reg_set (t, clobbered_regs);
600
601 if (overlap)
61158923
HPN
602 {
603 error ("asm-specifier for variable %qs conflicts with asm clobber list",
91b4415a 604 IDENTIFIER_POINTER (DECL_NAME (overlap)));
61158923
HPN
605
606 /* Reset registerness to stop multiple errors emitted for a single
607 variable. */
91b4415a 608 DECL_REGISTER (overlap) = 0;
61158923 609 return true;
acb5d088 610 }
61158923 611
acb5d088
HPN
612 return false;
613}
614
28d81abb
RK
615/* Generate RTL for an asm statement with arguments.
616 STRING is the instruction template.
617 OUTPUTS is a list of output arguments (lvalues); INPUTS a list of inputs.
618 Each output or input has an expression in the TREE_VALUE and
fa10beec 619 a tree list in TREE_PURPOSE which in turn contains a constraint
786de7eb 620 name in TREE_VALUE (or NULL_TREE) and a constraint string
2ec37136 621 in TREE_PURPOSE.
28d81abb
RK
622 CLOBBERS is a list of STRING_CST nodes each naming a hard register
623 that is clobbered by this insn.
624
625 Not all kinds of lvalue that may appear in OUTPUTS can be stored directly.
626 Some elements of OUTPUTS may be replaced with trees representing temporary
627 values. The caller should copy those temporary values to the originally
628 specified lvalues.
629
630 VOL nonzero means the insn is volatile; don't optimize it. */
631
bac6bfc5 632static void
46c5ad27 633expand_asm_operands (tree string, tree outputs, tree inputs,
177560b2 634 tree clobbers, int vol, location_t locus)
28d81abb 635{
84b72302 636 rtvec argvec, constraintvec;
28d81abb
RK
637 rtx body;
638 int ninputs = list_length (inputs);
639 int noutputs = list_length (outputs);
6be2e1f8 640 int ninout;
b4ccaa16 641 int nclobbers;
acb5d088
HPN
642 HARD_REG_SET clobbered_regs;
643 int clobber_conflict_found = 0;
28d81abb 644 tree tail;
7dc8b126 645 tree t;
b3694847 646 int i;
28d81abb 647 /* Vector of RTX's of evaluated output operands. */
1634b18f
KG
648 rtx *output_rtx = XALLOCAVEC (rtx, noutputs);
649 int *inout_opnum = XALLOCAVEC (int, noutputs);
650 rtx *real_output_rtx = XALLOCAVEC (rtx, noutputs);
651 enum machine_mode *inout_mode = XALLOCAVEC (enum machine_mode, noutputs);
652 const char **constraints = XALLOCAVEC (const char *, noutputs + ninputs);
1b3d8f8a 653 int old_generating_concat_p = generating_concat_p;
28d81abb 654
e5e809f4 655 /* An ASM with no outputs needs to be treated as volatile, for now. */
296f8acc
JL
656 if (noutputs == 0)
657 vol = 1;
658
84b72302
RH
659 if (! check_operand_nalternatives (outputs, inputs))
660 return;
661
7dc8b126
JM
662 string = resolve_asm_operand_names (string, outputs, inputs);
663
664 /* Collect constraints. */
665 i = 0;
666 for (t = outputs; t ; t = TREE_CHAIN (t), i++)
667 constraints[i] = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
668 for (t = inputs; t ; t = TREE_CHAIN (t), i++)
669 constraints[i] = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
84b72302 670
57bcb97a
RH
671 /* Sometimes we wish to automatically clobber registers across an asm.
672 Case in point is when the i386 backend moved from cc0 to a hard reg --
f63d1bf7 673 maintaining source-level compatibility means automatically clobbering
57bcb97a 674 the flags register. */
61158923 675 clobbers = targetm.md_asm_clobbers (outputs, inputs, clobbers);
57bcb97a 676
b4ccaa16
RS
677 /* Count the number of meaningful clobbered registers, ignoring what
678 we would ignore later. */
679 nclobbers = 0;
acb5d088 680 CLEAR_HARD_REG_SET (clobbered_regs);
b4ccaa16
RS
681 for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
682 {
123b24e7
VR
683 const char *regname;
684
685 if (TREE_VALUE (tail) == error_mark_node)
686 return;
687 regname = TREE_STRING_POINTER (TREE_VALUE (tail));
14a774a9 688
c09e6498
RS
689 i = decode_reg_name (regname);
690 if (i >= 0 || i == -4)
b4ccaa16 691 ++nclobbers;
7859e3ac 692 else if (i == -2)
971801ff 693 error ("unknown register name %qs in %<asm%>", regname);
acb5d088
HPN
694
695 /* Mark clobbered registers. */
696 if (i >= 0)
e54b4cae 697 {
ea4b7848 698 /* Clobbering the PIC register is an error. */
fc555370 699 if (i == (int) PIC_OFFSET_TABLE_REGNUM)
e54b4cae 700 {
971801ff 701 error ("PIC register %qs clobbered in %<asm%>", regname);
e54b4cae
EB
702 return;
703 }
704
705 SET_HARD_REG_BIT (clobbered_regs, i);
706 }
b4ccaa16
RS
707 }
708
6be2e1f8
RH
709 /* First pass over inputs and outputs checks validity and sets
710 mark_addressable if needed. */
711
712 ninout = 0;
28d81abb
RK
713 for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
714 {
715 tree val = TREE_VALUE (tail);
b50a024d 716 tree type = TREE_TYPE (val);
6be2e1f8 717 const char *constraint;
40b18c0a
MM
718 bool is_inout;
719 bool allows_reg;
720 bool allows_mem;
28d81abb
RK
721
722 /* If there's an erroneous arg, emit no insn. */
40b18c0a 723 if (type == error_mark_node)
28d81abb
RK
724 return;
725
40b18c0a
MM
726 /* Try to parse the output constraint. If that fails, there's
727 no point in going further. */
6be2e1f8
RH
728 constraint = constraints[i];
729 if (!parse_output_constraint (&constraint, i, ninputs, noutputs,
730 &allows_mem, &allows_reg, &is_inout))
731 return;
732
733 if (! allows_reg
734 && (allows_mem
735 || is_inout
736 || (DECL_P (val)
f8cfc6aa 737 && REG_P (DECL_RTL (val))
6be2e1f8 738 && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type))))
ae2bcd98 739 lang_hooks.mark_addressable (val);
6be2e1f8
RH
740
741 if (is_inout)
742 ninout++;
743 }
744
745 ninputs += ninout;
746 if (ninputs + noutputs > MAX_RECOG_OPERANDS)
747 {
971801ff 748 error ("more than %d operands in %<asm%>", MAX_RECOG_OPERANDS);
6be2e1f8
RH
749 return;
750 }
751
752 for (i = 0, tail = inputs; tail; i++, tail = TREE_CHAIN (tail))
753 {
754 bool allows_reg, allows_mem;
755 const char *constraint;
756
757 /* If there's an erroneous arg, emit no insn, because the ASM_INPUT
758 would get VOIDmode and that could cause a crash in reload. */
759 if (TREE_TYPE (TREE_VALUE (tail)) == error_mark_node)
760 return;
761
762 constraint = constraints[i + noutputs];
763 if (! parse_input_constraint (&constraint, i, ninputs, noutputs, ninout,
764 constraints, &allows_mem, &allows_reg))
40b18c0a 765 return;
d09a75ae 766
6be2e1f8 767 if (! allows_reg && allows_mem)
ae2bcd98 768 lang_hooks.mark_addressable (TREE_VALUE (tail));
6be2e1f8
RH
769 }
770
771 /* Second pass evaluates arguments. */
772
773 ninout = 0;
774 for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
775 {
776 tree val = TREE_VALUE (tail);
777 tree type = TREE_TYPE (val);
778 bool is_inout;
779 bool allows_reg;
780 bool allows_mem;
5b50aa9d 781 rtx op;
41374e13 782 bool ok;
6be2e1f8 783
41374e13 784 ok = parse_output_constraint (&constraints[i], i, ninputs,
6be2e1f8 785 noutputs, &allows_mem, &allows_reg,
41374e13
NS
786 &is_inout);
787 gcc_assert (ok);
6be2e1f8 788
d09a75ae
RK
789 /* If an output operand is not a decl or indirect ref and our constraint
790 allows a register, make a temporary to act as an intermediate.
791 Make the asm insn write into that, then our caller will copy it to
792 the real output operand. Likewise for promoted variables. */
28d81abb 793
1b3d8f8a
GK
794 generating_concat_p = 0;
795
947255ed 796 real_output_rtx[i] = NULL_RTX;
1afbe1c4
RH
797 if ((TREE_CODE (val) == INDIRECT_REF
798 && allows_mem)
2f939d94 799 || (DECL_P (val)
f8cfc6aa
JQ
800 && (allows_mem || REG_P (DECL_RTL (val)))
801 && ! (REG_P (DECL_RTL (val))
d09a75ae 802 && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type)))
11579f33 803 || ! allows_reg
2a230e9d 804 || is_inout)
d09a75ae 805 {
5b50aa9d 806 op = expand_expr (val, NULL_RTX, VOIDmode, EXPAND_WRITE);
3c0cb5de 807 if (MEM_P (op))
5b50aa9d 808 op = validize_mem (op);
d09a75ae 809
3c0cb5de 810 if (! allows_reg && !MEM_P (op))
d09a75ae 811 error ("output number %d not directly addressable", i);
3c0cb5de 812 if ((! allows_mem && MEM_P (op))
5b50aa9d 813 || GET_CODE (op) == CONCAT)
947255ed 814 {
ad76cef8 815 real_output_rtx[i] = op;
5b50aa9d 816 op = gen_reg_rtx (GET_MODE (op));
11579f33 817 if (is_inout)
5b50aa9d 818 emit_move_insn (op, real_output_rtx[i]);
947255ed 819 }
d09a75ae 820 }
b50a024d 821 else
e619bb8d 822 {
5b50aa9d
RH
823 op = assign_temp (type, 0, 0, 1);
824 op = validize_mem (op);
825 TREE_VALUE (tail) = make_tree (type, op);
b50a024d 826 }
5b50aa9d 827 output_rtx[i] = op;
235c5021 828
1b3d8f8a
GK
829 generating_concat_p = old_generating_concat_p;
830
2a230e9d 831 if (is_inout)
235c5021 832 {
6be2e1f8 833 inout_mode[ninout] = TYPE_MODE (type);
235c5021
RK
834 inout_opnum[ninout++] = i;
835 }
acb5d088 836
91b4415a 837 if (tree_conflicts_with_clobbers_p (val, &clobbered_regs))
acb5d088 838 clobber_conflict_found = 1;
28d81abb
RK
839 }
840
84b72302
RH
841 /* Make vectors for the expression-rtx, constraint strings,
842 and named operands. */
28d81abb
RK
843
844 argvec = rtvec_alloc (ninputs);
84b72302 845 constraintvec = rtvec_alloc (ninputs);
28d81abb 846
6462bb43
AO
847 body = gen_rtx_ASM_OPERANDS ((noutputs == 0 ? VOIDmode
848 : GET_MODE (output_rtx[0])),
a396f8ae 849 ggc_strdup (TREE_STRING_POINTER (string)),
84b72302 850 empty_string, 0, argvec, constraintvec,
6773e15f 851 locus);
c85f7c16 852
78418280 853 MEM_VOLATILE_P (body) = vol;
28d81abb
RK
854
855 /* Eval the inputs and put them into ARGVEC.
856 Put their constraints into ASM_INPUTs and store in CONSTRAINTS. */
857
84b72302 858 for (i = 0, tail = inputs; tail; tail = TREE_CHAIN (tail), ++i)
28d81abb 859 {
6be2e1f8
RH
860 bool allows_reg, allows_mem;
861 const char *constraint;
862 tree val, type;
1f06ee8d 863 rtx op;
41374e13 864 bool ok;
28d81abb 865
6be2e1f8 866 constraint = constraints[i + noutputs];
41374e13
NS
867 ok = parse_input_constraint (&constraint, i, ninputs, noutputs, ninout,
868 constraints, &allows_mem, &allows_reg);
869 gcc_assert (ok);
2a230e9d 870
6be2e1f8 871 generating_concat_p = 0;
65fed0cb 872
6be2e1f8
RH
873 val = TREE_VALUE (tail);
874 type = TREE_TYPE (val);
6d40c489
RS
875 /* EXPAND_INITIALIZER will not generate code for valid initializer
876 constants, but will still generate code for other types of operand.
877 This is the behavior we want for constant constraints. */
017e1b43 878 op = expand_expr (val, NULL_RTX, VOIDmode,
6d40c489
RS
879 allows_reg ? EXPAND_NORMAL
880 : allows_mem ? EXPAND_MEMORY
881 : EXPAND_INITIALIZER);
65fed0cb 882
1b3d8f8a 883 /* Never pass a CONCAT to an ASM. */
1b3d8f8a
GK
884 if (GET_CODE (op) == CONCAT)
885 op = force_reg (GET_MODE (op), op);
3c0cb5de 886 else if (MEM_P (op))
5b50aa9d 887 op = validize_mem (op);
1b3d8f8a 888
eca72963 889 if (asm_operand_ok (op, constraint, NULL) <= 0)
65fed0cb 890 {
4bbcb8fc 891 if (allows_reg && TYPE_MODE (type) != BLKmode)
6be2e1f8 892 op = force_reg (TYPE_MODE (type), op);
11579f33 893 else if (!allows_mem)
d4ee4d25 894 warning (0, "asm operand %d probably doesn%'t match constraints",
84b72302 895 i + noutputs);
3c0cb5de 896 else if (MEM_P (op))
6be2e1f8 897 {
d50ad6af
RH
898 /* We won't recognize either volatile memory or memory
899 with a queued address as available a memory_operand
900 at this point. Ignore it: clearly this *is* a memory. */
6be2e1f8 901 }
1f06ee8d 902 else
017e1b43 903 {
d4ee4d25 904 warning (0, "use of memory input without lvalue in "
71ed1fdb 905 "asm operand %d is deprecated", i + noutputs);
017e1b43
RH
906
907 if (CONSTANT_P (op))
908 {
9c858681
RS
909 rtx mem = force_const_mem (TYPE_MODE (type), op);
910 if (mem)
911 op = validize_mem (mem);
912 else
913 op = force_reg (TYPE_MODE (type), op);
017e1b43 914 }
f8cfc6aa 915 if (REG_P (op)
9c858681 916 || GET_CODE (op) == SUBREG
9c858681 917 || GET_CODE (op) == CONCAT)
017e1b43
RH
918 {
919 tree qual_type = build_qualified_type (type,
920 (TYPE_QUALS (type)
921 | TYPE_QUAL_CONST));
922 rtx memloc = assign_temp (qual_type, 1, 1, 1);
923 memloc = validize_mem (memloc);
924 emit_move_insn (memloc, op);
925 op = memloc;
926 }
927 }
65fed0cb 928 }
6be2e1f8 929
1b3d8f8a 930 generating_concat_p = old_generating_concat_p;
6462bb43 931 ASM_OPERANDS_INPUT (body, i) = op;
2a230e9d 932
6462bb43 933 ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, i)
a396f8ae
GK
934 = gen_rtx_ASM_INPUT (TYPE_MODE (type),
935 ggc_strdup (constraints[i + noutputs]));
acb5d088 936
91b4415a 937 if (tree_conflicts_with_clobbers_p (val, &clobbered_regs))
acb5d088 938 clobber_conflict_found = 1;
28d81abb
RK
939 }
940
14a774a9
RK
941 /* Protect all the operands from the queue now that they have all been
942 evaluated. */
28d81abb 943
1b3d8f8a
GK
944 generating_concat_p = 0;
945
4381f7c2 946 /* For in-out operands, copy output rtx to input rtx. */
235c5021
RK
947 for (i = 0; i < ninout; i++)
948 {
235c5021 949 int j = inout_opnum[i];
84b72302 950 char buffer[16];
235c5021 951
6462bb43 952 ASM_OPERANDS_INPUT (body, ninputs - ninout + i)
235c5021 953 = output_rtx[j];
84b72302
RH
954
955 sprintf (buffer, "%d", j);
6462bb43 956 ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, ninputs - ninout + i)
485bad26 957 = gen_rtx_ASM_INPUT (inout_mode[i], ggc_strdup (buffer));
235c5021
RK
958 }
959
1b3d8f8a
GK
960 generating_concat_p = old_generating_concat_p;
961
28d81abb 962 /* Now, for each output, construct an rtx
84b72302
RH
963 (set OUTPUT (asm_operands INSN OUTPUTCONSTRAINT OUTPUTNUMBER
964 ARGVEC CONSTRAINTS OPNAMES))
28d81abb
RK
965 If there is more than one, put them inside a PARALLEL. */
966
967 if (noutputs == 1 && nclobbers == 0)
968 {
a396f8ae 969 ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = ggc_strdup (constraints[0]);
4977bab6 970 emit_insn (gen_rtx_SET (VOIDmode, output_rtx[0], body));
28d81abb 971 }
14a774a9 972
28d81abb
RK
973 else if (noutputs == 0 && nclobbers == 0)
974 {
975 /* No output operands: put in a raw ASM_OPERANDS rtx. */
4977bab6 976 emit_insn (body);
28d81abb 977 }
14a774a9 978
28d81abb
RK
979 else
980 {
981 rtx obody = body;
982 int num = noutputs;
14a774a9
RK
983
984 if (num == 0)
985 num = 1;
986
38a448ca 987 body = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (num + nclobbers));
28d81abb
RK
988
989 /* For each output operand, store a SET. */
28d81abb
RK
990 for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
991 {
992 XVECEXP (body, 0, i)
38a448ca
RH
993 = gen_rtx_SET (VOIDmode,
994 output_rtx[i],
c5c76735 995 gen_rtx_ASM_OPERANDS
6462bb43 996 (GET_MODE (output_rtx[i]),
a396f8ae
GK
997 ggc_strdup (TREE_STRING_POINTER (string)),
998 ggc_strdup (constraints[i]),
999 i, argvec, constraintvec, locus));
c5c76735 1000
28d81abb
RK
1001 MEM_VOLATILE_P (SET_SRC (XVECEXP (body, 0, i))) = vol;
1002 }
1003
1004 /* If there are no outputs (but there are some clobbers)
1005 store the bare ASM_OPERANDS into the PARALLEL. */
1006
1007 if (i == 0)
1008 XVECEXP (body, 0, i++) = obody;
1009
1010 /* Store (clobber REG) for each clobbered register specified. */
1011
b4ccaa16 1012 for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
28d81abb 1013 {
47ee9bcb 1014 const char *regname = TREE_STRING_POINTER (TREE_VALUE (tail));
b4ac57ab 1015 int j = decode_reg_name (regname);
acb5d088 1016 rtx clobbered_reg;
28d81abb 1017
b4ac57ab 1018 if (j < 0)
28d81abb 1019 {
c09e6498 1020 if (j == -3) /* `cc', which is not a register */
dcfedcd0
RK
1021 continue;
1022
c09e6498
RS
1023 if (j == -4) /* `memory', don't cache memory across asm */
1024 {
bffc6177 1025 XVECEXP (body, 0, i++)
38a448ca 1026 = gen_rtx_CLOBBER (VOIDmode,
c5c76735
JL
1027 gen_rtx_MEM
1028 (BLKmode,
1029 gen_rtx_SCRATCH (VOIDmode)));
c09e6498
RS
1030 continue;
1031 }
1032
956d6950 1033 /* Ignore unknown register, error already signaled. */
cc1f5387 1034 continue;
28d81abb
RK
1035 }
1036
1037 /* Use QImode since that's guaranteed to clobber just one reg. */
acb5d088
HPN
1038 clobbered_reg = gen_rtx_REG (QImode, j);
1039
1040 /* Do sanity check for overlap between clobbers and respectively
1041 input and outputs that hasn't been handled. Such overlap
1042 should have been detected and reported above. */
1043 if (!clobber_conflict_found)
1044 {
1045 int opno;
1046
1047 /* We test the old body (obody) contents to avoid tripping
1048 over the under-construction body. */
1049 for (opno = 0; opno < noutputs; opno++)
1050 if (reg_overlap_mentioned_p (clobbered_reg, output_rtx[opno]))
1051 internal_error ("asm clobber conflict with output operand");
1052
1053 for (opno = 0; opno < ninputs - ninout; opno++)
1054 if (reg_overlap_mentioned_p (clobbered_reg,
1055 ASM_OPERANDS_INPUT (obody, opno)))
1056 internal_error ("asm clobber conflict with input operand");
1057 }
1058
b4ccaa16 1059 XVECEXP (body, 0, i++)
acb5d088 1060 = gen_rtx_CLOBBER (VOIDmode, clobbered_reg);
28d81abb
RK
1061 }
1062
4977bab6 1063 emit_insn (body);
28d81abb
RK
1064 }
1065
947255ed
RH
1066 /* For any outputs that needed reloading into registers, spill them
1067 back to where they belong. */
1068 for (i = 0; i < noutputs; ++i)
1069 if (real_output_rtx[i])
1070 emit_move_insn (real_output_rtx[i], output_rtx[i]);
1071
e3b5732b 1072 crtl->has_asm_statement = 1;
28d81abb
RK
1073 free_temp_slots ();
1074}
84b72302 1075
6de9cd9a
DN
1076void
1077expand_asm_expr (tree exp)
1078{
1079 int noutputs, i;
1080 tree outputs, tail;
1081 tree *o;
1082
1083 if (ASM_INPUT_P (exp))
1084 {
bff4b63d 1085 expand_asm_loc (ASM_STRING (exp), ASM_VOLATILE_P (exp), input_location);
6de9cd9a
DN
1086 return;
1087 }
1088
1089 outputs = ASM_OUTPUTS (exp);
1090 noutputs = list_length (outputs);
1091 /* o[I] is the place that output number I should be written. */
1092 o = (tree *) alloca (noutputs * sizeof (tree));
1093
1094 /* Record the contents of OUTPUTS before it is modified. */
1095 for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
1096 o[i] = TREE_VALUE (tail);
1097
1098 /* Generate the ASM_OPERANDS insn; store into the TREE_VALUEs of
1099 OUTPUTS some trees for where the values were actually stored. */
1100 expand_asm_operands (ASM_STRING (exp), outputs, ASM_INPUTS (exp),
1101 ASM_CLOBBERS (exp), ASM_VOLATILE_P (exp),
1102 input_location);
1103
1104 /* Copy all the intermediate outputs into the specified outputs. */
1105 for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
1106 {
1107 if (o[i] != TREE_VALUE (tail))
1108 {
79f5e442 1109 expand_assignment (o[i], TREE_VALUE (tail), false);
6de9cd9a
DN
1110 free_temp_slots ();
1111
1112 /* Restore the original value so that it's correct the next
1113 time we expand this function. */
1114 TREE_VALUE (tail) = o[i];
1115 }
1116 }
6de9cd9a
DN
1117}
1118
84b72302
RH
1119/* A subroutine of expand_asm_operands. Check that all operands have
1120 the same number of alternatives. Return true if so. */
1121
1122static bool
46c5ad27 1123check_operand_nalternatives (tree outputs, tree inputs)
84b72302
RH
1124{
1125 if (outputs || inputs)
1126 {
1127 tree tmp = TREE_PURPOSE (outputs ? outputs : inputs);
1128 int nalternatives
1129 = n_occurrences (',', TREE_STRING_POINTER (TREE_VALUE (tmp)));
1130 tree next = inputs;
1131
1132 if (nalternatives + 1 > MAX_RECOG_ALTERNATIVES)
1133 {
971801ff 1134 error ("too many alternatives in %<asm%>");
84b72302
RH
1135 return false;
1136 }
1137
1138 tmp = outputs;
1139 while (tmp)
1140 {
1141 const char *constraint
1142 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tmp)));
1143
1144 if (n_occurrences (',', constraint) != nalternatives)
1145 {
971801ff
JM
1146 error ("operand constraints for %<asm%> differ "
1147 "in number of alternatives");
84b72302
RH
1148 return false;
1149 }
1150
1151 if (TREE_CHAIN (tmp))
1152 tmp = TREE_CHAIN (tmp);
1153 else
1154 tmp = next, next = 0;
1155 }
1156 }
1157
1158 return true;
1159}
1160
1161/* A subroutine of expand_asm_operands. Check that all operand names
1162 are unique. Return true if so. We rely on the fact that these names
1163 are identifiers, and so have been canonicalized by get_identifier,
1164 so all we need are pointer comparisons. */
1165
1166static bool
46c5ad27 1167check_unique_operand_names (tree outputs, tree inputs)
84b72302
RH
1168{
1169 tree i, j;
1170
1171 for (i = outputs; i ; i = TREE_CHAIN (i))
1172 {
1173 tree i_name = TREE_PURPOSE (TREE_PURPOSE (i));
1174 if (! i_name)
1175 continue;
1176
1177 for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
fc552851 1178 if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
84b72302
RH
1179 goto failure;
1180 }
1181
1182 for (i = inputs; i ; i = TREE_CHAIN (i))
1183 {
1184 tree i_name = TREE_PURPOSE (TREE_PURPOSE (i));
1185 if (! i_name)
1186 continue;
1187
1188 for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
fc552851 1189 if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
84b72302
RH
1190 goto failure;
1191 for (j = outputs; j ; j = TREE_CHAIN (j))
fc552851 1192 if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
84b72302
RH
1193 goto failure;
1194 }
1195
1196 return true;
1197
1198 failure:
971801ff 1199 error ("duplicate asm operand name %qs",
fc552851 1200 TREE_STRING_POINTER (TREE_PURPOSE (TREE_PURPOSE (i))));
84b72302
RH
1201 return false;
1202}
1203
1204/* A subroutine of expand_asm_operands. Resolve the names of the operands
1205 in *POUTPUTS and *PINPUTS to numbers, and replace the name expansions in
1206 STRING and in the constraints to those numbers. */
1207
7dc8b126
JM
1208tree
1209resolve_asm_operand_names (tree string, tree outputs, tree inputs)
84b72302 1210{
7dc8b126 1211 char *buffer;
84b72302 1212 char *p;
40209195 1213 const char *c;
84b72302
RH
1214 tree t;
1215
1456deaf
JM
1216 check_unique_operand_names (outputs, inputs);
1217
7dc8b126
JM
1218 /* Substitute [<name>] in input constraint strings. There should be no
1219 named operands in output constraints. */
1220 for (t = inputs; t ; t = TREE_CHAIN (t))
1221 {
40209195 1222 c = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
7dc8b126
JM
1223 if (strchr (c, '[') != NULL)
1224 {
1225 p = buffer = xstrdup (c);
1226 while ((p = strchr (p, '[')) != NULL)
1227 p = resolve_operand_name_1 (p, outputs, inputs);
1228 TREE_VALUE (TREE_PURPOSE (t))
1229 = build_string (strlen (buffer), buffer);
1230 free (buffer);
1231 }
1232 }
1233
40209195
JM
1234 /* Now check for any needed substitutions in the template. */
1235 c = TREE_STRING_POINTER (string);
1236 while ((c = strchr (c, '%')) != NULL)
84b72302 1237 {
40209195
JM
1238 if (c[1] == '[')
1239 break;
1240 else if (ISALPHA (c[1]) && c[2] == '[')
1241 break;
7abcb63a
RH
1242 else
1243 {
40209195 1244 c += 1;
7abcb63a
RH
1245 continue;
1246 }
84b72302
RH
1247 }
1248
40209195
JM
1249 if (c)
1250 {
1251 /* OK, we need to make a copy so we can perform the substitutions.
1252 Assume that we will not need extra space--we get to remove '['
1253 and ']', which means we cannot have a problem until we have more
1254 than 999 operands. */
1255 buffer = xstrdup (TREE_STRING_POINTER (string));
1256 p = buffer + (c - TREE_STRING_POINTER (string));
caf93cb0 1257
40209195
JM
1258 while ((p = strchr (p, '%')) != NULL)
1259 {
1260 if (p[1] == '[')
1261 p += 1;
1262 else if (ISALPHA (p[1]) && p[2] == '[')
1263 p += 2;
1264 else
1265 {
1266 p += 1;
1267 continue;
1268 }
1269
1270 p = resolve_operand_name_1 (p, outputs, inputs);
1271 }
1272
1273 string = build_string (strlen (buffer), buffer);
1274 free (buffer);
1275 }
84b72302 1276
84b72302
RH
1277 return string;
1278}
1279
1280/* A subroutine of resolve_operand_names. P points to the '[' for a
1281 potential named operand of the form [<name>]. In place, replace
786de7eb 1282 the name and brackets with a number. Return a pointer to the
84b72302
RH
1283 balance of the string after substitution. */
1284
1285static char *
46c5ad27 1286resolve_operand_name_1 (char *p, tree outputs, tree inputs)
84b72302
RH
1287{
1288 char *q;
1289 int op;
1290 tree t;
1291 size_t len;
1292
1293 /* Collect the operand name. */
1294 q = strchr (p, ']');
1295 if (!q)
1296 {
1297 error ("missing close brace for named operand");
1298 return strchr (p, '\0');
1299 }
1300 len = q - p - 1;
1301
1302 /* Resolve the name to a number. */
1303 for (op = 0, t = outputs; t ; t = TREE_CHAIN (t), op++)
1304 {
fc552851
RS
1305 tree name = TREE_PURPOSE (TREE_PURPOSE (t));
1306 if (name)
edd1967d 1307 {
fc552851 1308 const char *c = TREE_STRING_POINTER (name);
edd1967d
RH
1309 if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
1310 goto found;
1311 }
84b72302
RH
1312 }
1313 for (t = inputs; t ; t = TREE_CHAIN (t), op++)
1314 {
fc552851
RS
1315 tree name = TREE_PURPOSE (TREE_PURPOSE (t));
1316 if (name)
edd1967d 1317 {
fc552851 1318 const char *c = TREE_STRING_POINTER (name);
edd1967d
RH
1319 if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
1320 goto found;
1321 }
84b72302
RH
1322 }
1323
1324 *q = '\0';
971801ff 1325 error ("undefined named operand %qs", p + 1);
84b72302
RH
1326 op = 0;
1327 found:
1328
1329 /* Replace the name with the number. Unfortunately, not all libraries
1330 get the return value of sprintf correct, so search for the end of the
1331 generated string by hand. */
1332 sprintf (p, "%d", op);
1333 p = strchr (p, '\0');
1334
1335 /* Verify the no extra buffer space assumption. */
41374e13 1336 gcc_assert (p <= q);
84b72302
RH
1337
1338 /* Shift the rest of the buffer down to fill the gap. */
1339 memmove (p, q + 1, strlen (q + 1) + 1);
1340
1341 return p;
1342}
28d81abb 1343\f
4dfa0342 1344/* Generate RTL to evaluate the expression EXP. */
28d81abb
RK
1345
1346void
46c5ad27 1347expand_expr_stmt (tree exp)
1574ef13
AO
1348{
1349 rtx value;
1350 tree type;
b6ec8c5f 1351
49452c07 1352 value = expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL);
1574ef13 1353 type = TREE_TYPE (exp);
28d81abb
RK
1354
1355 /* If all we do is reference a volatile value in memory,
1356 copy it to a register to be sure it is actually touched. */
3c0cb5de 1357 if (value && MEM_P (value) && TREE_THIS_VOLATILE (exp))
28d81abb 1358 {
1574ef13 1359 if (TYPE_MODE (type) == VOIDmode)
6a5bbbe6 1360 ;
1574ef13
AO
1361 else if (TYPE_MODE (type) != BLKmode)
1362 value = copy_to_reg (value);
28d81abb 1363 else
ddbe9812
RS
1364 {
1365 rtx lab = gen_label_rtx ();
4381f7c2 1366
ddbe9812 1367 /* Compare the value with itself to reference it. */
1574ef13 1368 emit_cmp_and_jump_insns (value, value, EQ,
84217346 1369 expand_normal (TYPE_SIZE (type)),
d43e0b7d 1370 BLKmode, 0, lab);
ddbe9812
RS
1371 emit_label (lab);
1372 }
28d81abb
RK
1373 }
1374
4dfa0342 1375 /* Free any temporaries used to evaluate this expression. */
28d81abb 1376 free_temp_slots ();
28d81abb
RK
1377}
1378
1379/* Warn if EXP contains any computations whose results are not used.
caf93cb0 1380 Return 1 if a warning is printed; 0 otherwise. LOCUS is the
b9861bff 1381 (potential) location of the expression. */
28d81abb 1382
150a992a 1383int
fa233e34 1384warn_if_unused_value (const_tree exp, location_t locus)
28d81abb 1385{
b9861bff 1386 restart:
591baeb0 1387 if (TREE_USED (exp) || TREE_NO_WARNING (exp))
28d81abb
RK
1388 return 0;
1389
9790cefd
RH
1390 /* Don't warn about void constructs. This includes casting to void,
1391 void function calls, and statement expressions with a final cast
1392 to void. */
1393 if (VOID_TYPE_P (TREE_TYPE (exp)))
1394 return 0;
1395
607bdeaa
PB
1396 if (EXPR_HAS_LOCATION (exp))
1397 locus = EXPR_LOCATION (exp);
b9861bff 1398
28d81abb
RK
1399 switch (TREE_CODE (exp))
1400 {
1401 case PREINCREMENT_EXPR:
1402 case POSTINCREMENT_EXPR:
1403 case PREDECREMENT_EXPR:
1404 case POSTDECREMENT_EXPR:
1405 case MODIFY_EXPR:
1406 case INIT_EXPR:
1407 case TARGET_EXPR:
1408 case CALL_EXPR:
81797aba 1409 case TRY_CATCH_EXPR:
28d81abb
RK
1410 case WITH_CLEANUP_EXPR:
1411 case EXIT_EXPR:
d3d6f724 1412 case VA_ARG_EXPR:
28d81abb
RK
1413 return 0;
1414
1415 case BIND_EXPR:
1416 /* For a binding, warn if no side effect within it. */
b9861bff
RH
1417 exp = BIND_EXPR_BODY (exp);
1418 goto restart;
28d81abb 1419
de73f171 1420 case SAVE_EXPR:
b9861bff
RH
1421 exp = TREE_OPERAND (exp, 0);
1422 goto restart;
de73f171 1423
28d81abb
RK
1424 case TRUTH_ORIF_EXPR:
1425 case TRUTH_ANDIF_EXPR:
1426 /* In && or ||, warn if 2nd operand has no side effect. */
b9861bff
RH
1427 exp = TREE_OPERAND (exp, 1);
1428 goto restart;
28d81abb
RK
1429
1430 case COMPOUND_EXPR:
b9861bff 1431 if (warn_if_unused_value (TREE_OPERAND (exp, 0), locus))
28d81abb 1432 return 1;
4d23e509
RS
1433 /* Let people do `(foo (), 0)' without a warning. */
1434 if (TREE_CONSTANT (TREE_OPERAND (exp, 1)))
1435 return 0;
b9861bff
RH
1436 exp = TREE_OPERAND (exp, 1);
1437 goto restart;
28d81abb 1438
591baeb0
JM
1439 case COND_EXPR:
1440 /* If this is an expression with side effects, don't warn; this
1441 case commonly appears in macro expansions. */
1442 if (TREE_SIDE_EFFECTS (exp))
28d81abb 1443 return 0;
591baeb0 1444 goto warn;
28d81abb 1445
d1e1adfb
JM
1446 case INDIRECT_REF:
1447 /* Don't warn about automatic dereferencing of references, since
1448 the user cannot control it. */
1449 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == REFERENCE_TYPE)
b9861bff
RH
1450 {
1451 exp = TREE_OPERAND (exp, 0);
1452 goto restart;
1453 }
4381f7c2
KH
1454 /* Fall through. */
1455
28d81abb 1456 default:
ddbe9812 1457 /* Referencing a volatile value is a side effect, so don't warn. */
6615c446 1458 if ((DECL_P (exp) || REFERENCE_CLASS_P (exp))
ddbe9812
RS
1459 && TREE_THIS_VOLATILE (exp))
1460 return 0;
8d5e6e25
RK
1461
1462 /* If this is an expression which has no operands, there is no value
1463 to be unused. There are no such language-independent codes,
1464 but front ends may define such. */
5039610b 1465 if (EXPRESSION_CLASS_P (exp) && TREE_OPERAND_LENGTH (exp) == 0)
8d5e6e25
RK
1466 return 0;
1467
591baeb0 1468 warn:
c5409249 1469 warning (OPT_Wunused_value, "%Hvalue computed is not used", &locus);
28d81abb
RK
1470 return 1;
1471 }
1472}
28d81abb 1473
28d81abb
RK
1474\f
1475/* Generate RTL to return from the current function, with no value.
1476 (That is, we do not do anything about returning any value.) */
1477
1478void
46c5ad27 1479expand_null_return (void)
28d81abb 1480{
4381f7c2 1481 /* If this function was declared to return a value, but we
bd695e1e 1482 didn't, clobber the return registers so that they are not
a1f300c0 1483 propagated live to the rest of the function. */
c13fde05 1484 clobber_return_register ();
28d81abb 1485
ac45df5d 1486 expand_null_return_1 ();
28d81abb
RK
1487}
1488
6e3077c6
EB
1489/* Generate RTL to return directly from the current function.
1490 (That is, we bypass any return value.) */
1491
1492void
1493expand_naked_return (void)
1494{
ac45df5d 1495 rtx end_label;
6e3077c6
EB
1496
1497 clear_pending_stack_adjust ();
1498 do_pending_stack_adjust ();
6e3077c6 1499
ac45df5d 1500 end_label = naked_return_label;
6e3077c6
EB
1501 if (end_label == 0)
1502 end_label = naked_return_label = gen_label_rtx ();
ac45df5d
RH
1503
1504 emit_jump (end_label);
6e3077c6
EB
1505}
1506
28d81abb
RK
1507/* Generate RTL to return from the current function, with value VAL. */
1508
8d800403 1509static void
46c5ad27 1510expand_value_return (rtx val)
28d81abb 1511{
28d81abb
RK
1512 /* Copy the value to the return location
1513 unless it's already there. */
1514
07a236b6 1515 rtx return_reg = DECL_RTL (DECL_RESULT (current_function_decl));
28d81abb 1516 if (return_reg != val)
77636079 1517 {
77636079 1518 tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
61f71b34
DD
1519 if (targetm.calls.promote_function_return (TREE_TYPE (current_function_decl)))
1520 {
8df83eae 1521 int unsignedp = TYPE_UNSIGNED (type);
61f71b34
DD
1522 enum machine_mode old_mode
1523 = DECL_MODE (DECL_RESULT (current_function_decl));
1524 enum machine_mode mode
1525 = promote_mode (type, old_mode, &unsignedp, 1);
1526
1527 if (mode != old_mode)
1528 val = convert_modes (mode, old_mode, val, unsignedp);
1529 }
14a774a9 1530 if (GET_CODE (return_reg) == PARALLEL)
6e985040 1531 emit_group_load (return_reg, val, type, int_size_in_bytes (type));
14a774a9 1532 else
77636079
RS
1533 emit_move_insn (return_reg, val);
1534 }
14a774a9 1535
ac45df5d 1536 expand_null_return_1 ();
28d81abb
RK
1537}
1538
ac45df5d 1539/* Output a return with no value. */
28d81abb
RK
1540
1541static void
ac45df5d 1542expand_null_return_1 (void)
28d81abb 1543{
28d81abb
RK
1544 clear_pending_stack_adjust ();
1545 do_pending_stack_adjust ();
526c334b 1546 emit_jump (return_label);
28d81abb
RK
1547}
1548\f
1549/* Generate RTL to evaluate the expression RETVAL and return it
1550 from the current function. */
1551
1552void
46c5ad27 1553expand_return (tree retval)
28d81abb 1554{
19e7881c 1555 rtx result_rtl;
b3694847 1556 rtx val = 0;
28d81abb 1557 tree retval_rhs;
28d81abb
RK
1558
1559 /* If function wants no value, give it none. */
1560 if (TREE_CODE (TREE_TYPE (TREE_TYPE (current_function_decl))) == VOID_TYPE)
1561 {
84217346 1562 expand_normal (retval);
28d81abb
RK
1563 expand_null_return ();
1564 return;
1565 }
1566
ea11ca7e 1567 if (retval == error_mark_node)
c9407e4c
MM
1568 {
1569 /* Treat this like a return of no value from a function that
1570 returns a value. */
1571 expand_null_return ();
786de7eb 1572 return;
c9407e4c 1573 }
726a989a 1574 else if ((TREE_CODE (retval) == MODIFY_EXPR
ac45df5d 1575 || TREE_CODE (retval) == INIT_EXPR)
726a989a
RB
1576 && TREE_CODE (TREE_OPERAND (retval, 0)) == RESULT_DECL)
1577 retval_rhs = TREE_OPERAND (retval, 1);
28d81abb 1578 else
6de9cd9a 1579 retval_rhs = retval;
28d81abb 1580
19e7881c
MM
1581 result_rtl = DECL_RTL (DECL_RESULT (current_function_decl));
1582
6f4a43e0
ZW
1583 /* If we are returning the RESULT_DECL, then the value has already
1584 been stored into it, so we don't have to do anything special. */
1585 if (TREE_CODE (retval_rhs) == RESULT_DECL)
1586 expand_value_return (result_rtl);
1587
4c485b63
JL
1588 /* If the result is an aggregate that is being returned in one (or more)
1589 registers, load the registers here. The compiler currently can't handle
1590 copying a BLKmode value into registers. We could put this code in a
1591 more general area (for use by everyone instead of just function
1592 call/return), but until this feature is generally usable it is kept here
ac45df5d 1593 (and in expand_call). */
4c485b63 1594
6f4a43e0 1595 else if (retval_rhs != 0
726a989a 1596 && TYPE_MODE (TREE_TYPE (retval_rhs)) == BLKmode
6f4a43e0 1597 && REG_P (result_rtl))
4c485b63 1598 {
770ae6cc
RK
1599 int i;
1600 unsigned HOST_WIDE_INT bitpos, xbitpos;
c988af2b 1601 unsigned HOST_WIDE_INT padding_correction = 0;
770ae6cc
RK
1602 unsigned HOST_WIDE_INT bytes
1603 = int_size_in_bytes (TREE_TYPE (retval_rhs));
4c485b63 1604 int n_regs = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
770ae6cc
RK
1605 unsigned int bitsize
1606 = MIN (TYPE_ALIGN (TREE_TYPE (retval_rhs)), BITS_PER_WORD);
1634b18f 1607 rtx *result_pseudos = XALLOCAVEC (rtx, n_regs);
c16ddde3 1608 rtx result_reg, src = NULL_RTX, dst = NULL_RTX;
84217346 1609 rtx result_val = expand_normal (retval_rhs);
af55da56 1610 enum machine_mode tmpmode, result_reg_mode;
4c485b63 1611
2954d7db
RK
1612 if (bytes == 0)
1613 {
1614 expand_null_return ();
1615 return;
1616 }
1617
c988af2b
RS
1618 /* If the structure doesn't take up a whole number of words, see
1619 whether the register value should be padded on the left or on
1620 the right. Set PADDING_CORRECTION to the number of padding
1621 bits needed on the left side.
1622
1623 In most ABIs, the structure will be returned at the least end of
1624 the register, which translates to right padding on little-endian
1625 targets and left padding on big-endian targets. The opposite
1626 holds if the structure is returned at the most significant
1627 end of the register. */
1628 if (bytes % UNITS_PER_WORD != 0
1629 && (targetm.calls.return_in_msb (TREE_TYPE (retval_rhs))
1630 ? !BYTES_BIG_ENDIAN
1631 : BYTES_BIG_ENDIAN))
1632 padding_correction = (BITS_PER_WORD - ((bytes % UNITS_PER_WORD)
1633 * BITS_PER_UNIT));
a7f875d7 1634
4381f7c2 1635 /* Copy the structure BITSIZE bits at a time. */
c988af2b 1636 for (bitpos = 0, xbitpos = padding_correction;
a7f875d7
RK
1637 bitpos < bytes * BITS_PER_UNIT;
1638 bitpos += bitsize, xbitpos += bitsize)
4c485b63 1639 {
a7f875d7 1640 /* We need a new destination pseudo each time xbitpos is
c988af2b 1641 on a word boundary and when xbitpos == padding_correction
a7f875d7
RK
1642 (the first time through). */
1643 if (xbitpos % BITS_PER_WORD == 0
c988af2b 1644 || xbitpos == padding_correction)
4c485b63 1645 {
a7f875d7
RK
1646 /* Generate an appropriate register. */
1647 dst = gen_reg_rtx (word_mode);
1648 result_pseudos[xbitpos / BITS_PER_WORD] = dst;
1649
8a38ed86
AM
1650 /* Clear the destination before we move anything into it. */
1651 emit_move_insn (dst, CONST0_RTX (GET_MODE (dst)));
4c485b63 1652 }
a7f875d7
RK
1653
1654 /* We need a new source operand each time bitpos is on a word
1655 boundary. */
1656 if (bitpos % BITS_PER_WORD == 0)
1657 src = operand_subword_force (result_val,
1658 bitpos / BITS_PER_WORD,
1659 BLKmode);
1660
1661 /* Use bitpos for the source extraction (left justified) and
1662 xbitpos for the destination store (right justified). */
1663 store_bit_field (dst, bitsize, xbitpos % BITS_PER_WORD, word_mode,
1664 extract_bit_field (src, bitsize,
1665 bitpos % BITS_PER_WORD, 1,
b3520980 1666 NULL_RTX, word_mode, word_mode));
4c485b63
JL
1667 }
1668
c988af2b
RS
1669 tmpmode = GET_MODE (result_rtl);
1670 if (tmpmode == BLKmode)
1671 {
1672 /* Find the smallest integer mode large enough to hold the
1673 entire structure and use that mode instead of BLKmode
1674 on the USE insn for the return register. */
1675 for (tmpmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
1676 tmpmode != VOIDmode;
1677 tmpmode = GET_MODE_WIDER_MODE (tmpmode))
1678 /* Have we found a large enough mode? */
1679 if (GET_MODE_SIZE (tmpmode) >= bytes)
1680 break;
4c485b63 1681
41374e13
NS
1682 /* A suitable mode should have been found. */
1683 gcc_assert (tmpmode != VOIDmode);
4c485b63 1684
c988af2b
RS
1685 PUT_MODE (result_rtl, tmpmode);
1686 }
3ffeb8f1 1687
af55da56
JW
1688 if (GET_MODE_SIZE (tmpmode) < GET_MODE_SIZE (word_mode))
1689 result_reg_mode = word_mode;
1690 else
1691 result_reg_mode = tmpmode;
1692 result_reg = gen_reg_rtx (result_reg_mode);
1693
3ffeb8f1 1694 for (i = 0; i < n_regs; i++)
af55da56 1695 emit_move_insn (operand_subword (result_reg, i, 0, result_reg_mode),
3ffeb8f1 1696 result_pseudos[i]);
4c485b63 1697
af55da56
JW
1698 if (tmpmode != result_reg_mode)
1699 result_reg = gen_lowpart (tmpmode, result_reg);
1700
4c485b63
JL
1701 expand_value_return (result_reg);
1702 }
7cc8342c
RH
1703 else if (retval_rhs != 0
1704 && !VOID_TYPE_P (TREE_TYPE (retval_rhs))
f8cfc6aa 1705 && (REG_P (result_rtl)
7cc8342c 1706 || (GET_CODE (result_rtl) == PARALLEL)))
28d81abb 1707 {
14a774a9
RK
1708 /* Calculate the return value into a temporary (usually a pseudo
1709 reg). */
1da68f56
RK
1710 tree ot = TREE_TYPE (DECL_RESULT (current_function_decl));
1711 tree nt = build_qualified_type (ot, TYPE_QUALS (ot) | TYPE_QUAL_CONST);
1712
1713 val = assign_temp (nt, 0, 0, 1);
49452c07 1714 val = expand_expr (retval_rhs, val, GET_MODE (val), EXPAND_NORMAL);
dd98f85c 1715 val = force_not_mem (val);
ac45df5d 1716 /* Return the calculated value. */
bef5d8b6 1717 expand_value_return (val);
28d81abb
RK
1718 }
1719 else
1720 {
ac45df5d 1721 /* No hard reg used; calculate value into hard return reg. */
49452c07 1722 expand_expr (retval, const0_rtx, VOIDmode, EXPAND_NORMAL);
14a774a9 1723 expand_value_return (result_rtl);
28d81abb
RK
1724 }
1725}
28d81abb 1726\f
ba716ac9
BS
1727/* Emit code to restore vital registers at the beginning of a nonlocal goto
1728 handler. */
1729static void
46c5ad27 1730expand_nl_goto_receiver (void)
ba716ac9 1731{
6de9cd9a 1732 /* Clobber the FP when we get here, so we have to make sure it's
e292dbb0 1733 marked as used by this function. */
c41c1387 1734 emit_use (hard_frame_pointer_rtx);
e292dbb0
WH
1735
1736 /* Mark the static chain as clobbered here so life information
1737 doesn't get messed up for it. */
c41c1387 1738 emit_clobber (static_chain_rtx);
e292dbb0 1739
ba716ac9
BS
1740#ifdef HAVE_nonlocal_goto
1741 if (! HAVE_nonlocal_goto)
1742#endif
1743 /* First adjust our frame pointer to its actual value. It was
1744 previously set to the start of the virtual area corresponding to
1745 the stacked variables when we branched here and now needs to be
1746 adjusted to the actual hardware fp value.
1747
1748 Assignments are to virtual registers are converted by
1749 instantiate_virtual_regs into the corresponding assignment
1750 to the underlying register (fp in this case) that makes
1751 the original assignment true.
1752 So the following insn will actually be
1753 decrementing fp by STARTING_FRAME_OFFSET. */
1754 emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
1755
1756#if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
1757 if (fixed_regs[ARG_POINTER_REGNUM])
1758 {
1759#ifdef ELIMINABLE_REGS
1760 /* If the argument pointer can be eliminated in favor of the
1761 frame pointer, we don't need to restore it. We assume here
1762 that if such an elimination is present, it can always be used.
1763 This is the case on all known machines; if we don't make this
1764 assumption, we do unnecessary saving on many machines. */
8b60264b 1765 static const struct elims {const int from, to;} elim_regs[] = ELIMINABLE_REGS;
ba716ac9
BS
1766 size_t i;
1767
b6a1cbae 1768 for (i = 0; i < ARRAY_SIZE (elim_regs); i++)
ba716ac9
BS
1769 if (elim_regs[i].from == ARG_POINTER_REGNUM
1770 && elim_regs[i].to == HARD_FRAME_POINTER_REGNUM)
1771 break;
1772
b6a1cbae 1773 if (i == ARRAY_SIZE (elim_regs))
ba716ac9
BS
1774#endif
1775 {
1776 /* Now restore our arg pointer from the address at which it
278ed218 1777 was saved in our stack frame. */
2e3f842f 1778 emit_move_insn (crtl->args.internal_arg_pointer,
bd60bab2 1779 copy_to_reg (get_arg_pointer_save_area ()));
ba716ac9
BS
1780 }
1781 }
1782#endif
1783
1784#ifdef HAVE_nonlocal_goto_receiver
1785 if (HAVE_nonlocal_goto_receiver)
1786 emit_insn (gen_nonlocal_goto_receiver ());
1787#endif
e292dbb0 1788
6fb5fa3c
DB
1789 /* We must not allow the code we just generated to be reordered by
1790 scheduling. Specifically, the update of the frame pointer must
1791 happen immediately, not later. */
1792 emit_insn (gen_blockage ());
ba716ac9 1793}
28d81abb
RK
1794\f
1795/* Generate RTL for the automatic variable declaration DECL.
ec5cd386 1796 (Other kinds of declarations are simply ignored if seen here.) */
28d81abb
RK
1797
1798void
46c5ad27 1799expand_decl (tree decl)
28d81abb 1800{
ca695ac9
JB
1801 tree type;
1802
ca695ac9 1803 type = TREE_TYPE (decl);
28d81abb 1804
eabb9ed0
RK
1805 /* For a CONST_DECL, set mode, alignment, and sizes from those of the
1806 type in case this node is used in a reference. */
1807 if (TREE_CODE (decl) == CONST_DECL)
1808 {
1809 DECL_MODE (decl) = TYPE_MODE (type);
1810 DECL_ALIGN (decl) = TYPE_ALIGN (type);
1811 DECL_SIZE (decl) = TYPE_SIZE (type);
1812 DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (type);
1813 return;
1814 }
28d81abb 1815
eabb9ed0
RK
1816 /* Otherwise, only automatic variables need any expansion done. Static and
1817 external variables, and external functions, will be handled by
1818 `assemble_variable' (called from finish_decl). TYPE_DECL requires
1819 nothing. PARM_DECLs are handled in `assign_parms'. */
28d81abb
RK
1820 if (TREE_CODE (decl) != VAR_DECL)
1821 return;
eabb9ed0 1822
44fe2e80 1823 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
28d81abb
RK
1824 return;
1825
1826 /* Create the RTL representation for the variable. */
1827
1828 if (type == error_mark_node)
19e7881c 1829 SET_DECL_RTL (decl, gen_rtx_MEM (BLKmode, const0_rtx));
1da68f56 1830
28d81abb 1831 else if (DECL_SIZE (decl) == 0)
28d81abb 1832 {
b38f3813 1833 /* Variable with incomplete type. */
abde42f7 1834 rtx x;
28d81abb
RK
1835 if (DECL_INITIAL (decl) == 0)
1836 /* Error message was already done; now avoid a crash. */
abde42f7 1837 x = gen_rtx_MEM (BLKmode, const0_rtx);
28d81abb
RK
1838 else
1839 /* An initializer is going to decide the size of this array.
1840 Until we know the size, represent its address with a reg. */
abde42f7 1841 x = gen_rtx_MEM (BLKmode, gen_reg_rtx (Pmode));
3bdf5ad1 1842
abde42f7
JH
1843 set_mem_attributes (x, decl, 1);
1844 SET_DECL_RTL (decl, x);
28d81abb 1845 }
8fff4fc1 1846 else if (use_register_for_decl (decl))
28d81abb
RK
1847 {
1848 /* Automatic variable that can go in a register. */
8df83eae 1849 int unsignedp = TYPE_UNSIGNED (type);
28612f9e
RK
1850 enum machine_mode reg_mode
1851 = promote_mode (type, DECL_MODE (decl), &unsignedp, 0);
98f3b471 1852
19e7881c 1853 SET_DECL_RTL (decl, gen_reg_rtx (reg_mode));
0d4903b8 1854
0b068ee9 1855 /* Note if the object is a user variable. */
7dc8b126 1856 if (!DECL_ARTIFICIAL (decl))
0b068ee9
JL
1857 mark_user_reg (DECL_RTL (decl));
1858
61021c2c
AP
1859 if (POINTER_TYPE_P (type))
1860 mark_reg_pointer (DECL_RTL (decl),
1861 TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
28d81abb 1862 }
0df15c2c 1863
b38f3813 1864 else
28d81abb 1865 {
28d81abb
RK
1866 rtx oldaddr = 0;
1867 rtx addr;
0d4903b8 1868 rtx x;
28d81abb 1869
b38f3813
EB
1870 /* Variable-sized decls are dealt with in the gimplifier. */
1871 gcc_assert (TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST);
1872
28d81abb
RK
1873 /* If we previously made RTL for this decl, it must be an array
1874 whose size was determined by the initializer.
1875 The old address was a register; set that register now
1876 to the proper address. */
19e7881c 1877 if (DECL_RTL_SET_P (decl))
28d81abb 1878 {
41374e13
NS
1879 gcc_assert (MEM_P (DECL_RTL (decl)));
1880 gcc_assert (REG_P (XEXP (DECL_RTL (decl), 0)));
28d81abb
RK
1881 oldaddr = XEXP (DECL_RTL (decl), 0);
1882 }
1883
28d81abb
RK
1884 /* Set alignment we actually gave this decl. */
1885 DECL_ALIGN (decl) = (DECL_MODE (decl) == BLKmode ? BIGGEST_ALIGNMENT
1886 : GET_MODE_BITSIZE (DECL_MODE (decl)));
11cf4d18 1887 DECL_USER_ALIGN (decl) = 0;
28d81abb 1888
9432c136 1889 x = assign_temp (decl, 1, 1, 1);
0d4903b8
RK
1890 set_mem_attributes (x, decl, 1);
1891 SET_DECL_RTL (decl, x);
1892
28d81abb
RK
1893 if (oldaddr)
1894 {
1895 addr = force_operand (XEXP (DECL_RTL (decl), 0), oldaddr);
1896 if (addr != oldaddr)
1897 emit_move_insn (oldaddr, addr);
1898 }
28d81abb 1899 }
28d81abb
RK
1900}
1901\f
6de9cd9a
DN
1902/* Emit code to save the current value of stack. */
1903rtx
1904expand_stack_save (void)
1905{
1906 rtx ret = NULL_RTX;
1907
1908 do_pending_stack_adjust ();
1909 emit_stack_save (SAVE_BLOCK, &ret, NULL_RTX);
1910 return ret;
1911}
1912
1913/* Emit code to restore the current value of stack. */
1914void
1915expand_stack_restore (tree var)
1916{
b9f9b210 1917 rtx sa = expand_normal (var);
6de9cd9a 1918
41ccb5d1 1919 sa = convert_memory_address (Pmode, sa);
6de9cd9a
DN
1920 emit_stack_restore (SAVE_BLOCK, sa, NULL_RTX);
1921}
28d81abb 1922\f
7efcb746
PB
1923/* Do the insertion of a case label into case_list. The labels are
1924 fed to us in descending order from the sorted vector of case labels used
a6c0a76c 1925 in the tree part of the middle end. So the list we construct is
eb172681
RS
1926 sorted in ascending order. The bounds on the case range, LOW and HIGH,
1927 are converted to case's index type TYPE. */
57641239 1928
eb172681
RS
1929static struct case_node *
1930add_case_node (struct case_node *head, tree type, tree low, tree high,
6ac1b3a4 1931 tree label, alloc_pool case_node_pool)
57641239 1932{
eb172681 1933 tree min_value, max_value;
a6c0a76c 1934 struct case_node *r;
57641239 1935
eb172681
RS
1936 gcc_assert (TREE_CODE (low) == INTEGER_CST);
1937 gcc_assert (!high || TREE_CODE (high) == INTEGER_CST);
1938
1939 min_value = TYPE_MIN_VALUE (type);
1940 max_value = TYPE_MAX_VALUE (type);
1941
56cb9733
MM
1942 /* If there's no HIGH value, then this is not a case range; it's
1943 just a simple case label. But that's just a degenerate case
a6c0a76c
SB
1944 range.
1945 If the bounds are equal, turn this into the one-value case. */
1946 if (!high || tree_int_cst_equal (low, high))
eb172681
RS
1947 {
1948 /* If the simple case value is unreachable, ignore it. */
b77aa1f7
AP
1949 if ((TREE_CODE (min_value) == INTEGER_CST
1950 && tree_int_cst_compare (low, min_value) < 0)
1951 || (TREE_CODE (max_value) == INTEGER_CST
1952 && tree_int_cst_compare (low, max_value) > 0))
eb172681
RS
1953 return head;
1954 low = fold_convert (type, low);
1955 high = low;
1956 }
1957 else
1958 {
1959 /* If the entire case range is unreachable, ignore it. */
b77aa1f7
AP
1960 if ((TREE_CODE (min_value) == INTEGER_CST
1961 && tree_int_cst_compare (high, min_value) < 0)
1962 || (TREE_CODE (max_value) == INTEGER_CST
1963 && tree_int_cst_compare (low, max_value) > 0))
eb172681
RS
1964 return head;
1965
1966 /* If the lower bound is less than the index type's minimum
1967 value, truncate the range bounds. */
b77aa1f7
AP
1968 if (TREE_CODE (min_value) == INTEGER_CST
1969 && tree_int_cst_compare (low, min_value) < 0)
eb172681
RS
1970 low = min_value;
1971 low = fold_convert (type, low);
1972
1973 /* If the upper bound is greater than the index type's maximum
1974 value, truncate the range bounds. */
b77aa1f7
AP
1975 if (TREE_CODE (max_value) == INTEGER_CST
1976 && tree_int_cst_compare (high, max_value) > 0)
eb172681
RS
1977 high = max_value;
1978 high = fold_convert (type, high);
1979 }
1980
56cb9733 1981
b2ecb7a8 1982 /* Add this label to the chain. Make sure to drop overflow flags. */
6ac1b3a4 1983 r = (struct case_node *) pool_alloc (case_node_pool);
b2ecb7a8
RG
1984 r->low = build_int_cst_wide (TREE_TYPE (low), TREE_INT_CST_LOW (low),
1985 TREE_INT_CST_HIGH (low));
1986 r->high = build_int_cst_wide (TREE_TYPE (high), TREE_INT_CST_LOW (high),
1987 TREE_INT_CST_HIGH (high));
57641239 1988 r->code_label = label;
a6c0a76c 1989 r->parent = r->left = NULL;
7efcb746
PB
1990 r->right = head;
1991 return r;
28d81abb 1992}
28d81abb 1993\f
9bb231fd
RS
1994/* Maximum number of case bit tests. */
1995#define MAX_CASE_BIT_TESTS 3
1996
1997/* By default, enable case bit tests on targets with ashlsi3. */
1998#ifndef CASE_USE_BIT_TESTS
166cdb08 1999#define CASE_USE_BIT_TESTS (optab_handler (ashl_optab, word_mode)->insn_code \
9bb231fd
RS
2000 != CODE_FOR_nothing)
2001#endif
2002
2003
2004/* A case_bit_test represents a set of case nodes that may be
2005 selected from using a bit-wise comparison. HI and LO hold
2006 the integer to be tested against, LABEL contains the label
2007 to jump to upon success and BITS counts the number of case
2008 nodes handled by this test, typically the number of bits
2009 set in HI:LO. */
2010
2011struct case_bit_test
2012{
2013 HOST_WIDE_INT hi;
2014 HOST_WIDE_INT lo;
2015 rtx label;
2016 int bits;
2017};
2018
2019/* Determine whether "1 << x" is relatively cheap in word_mode. */
2020
7e51717c
AJ
2021static
2022bool lshift_cheap_p (void)
9bb231fd
RS
2023{
2024 static bool init = false;
2025 static bool cheap = true;
2026
2027 if (!init)
2028 {
2029 rtx reg = gen_rtx_REG (word_mode, 10000);
f40751dd
JH
2030 int cost = rtx_cost (gen_rtx_ASHIFT (word_mode, const1_rtx, reg), SET,
2031 optimize_insn_for_speed_p ());
9bb231fd
RS
2032 cheap = cost < COSTS_N_INSNS (3);
2033 init = true;
2034 }
2035
2036 return cheap;
2037}
2038
2039/* Comparison function for qsort to order bit tests by decreasing
2040 number of case nodes, i.e. the node with the most cases gets
2041 tested first. */
2042
f667741c
SB
2043static int
2044case_bit_test_cmp (const void *p1, const void *p2)
9bb231fd 2045{
1634b18f
KG
2046 const struct case_bit_test *const d1 = (const struct case_bit_test *) p1;
2047 const struct case_bit_test *const d2 = (const struct case_bit_test *) p2;
9bb231fd 2048
0174997a
RS
2049 if (d2->bits != d1->bits)
2050 return d2->bits - d1->bits;
2051
2052 /* Stabilize the sort. */
2053 return CODE_LABEL_NUMBER (d2->label) - CODE_LABEL_NUMBER (d1->label);
9bb231fd
RS
2054}
2055
2056/* Expand a switch statement by a short sequence of bit-wise
2057 comparisons. "switch(x)" is effectively converted into
2058 "if ((1 << (x-MINVAL)) & CST)" where CST and MINVAL are
2059 integer constants.
2060
2061 INDEX_EXPR is the value being switched on, which is of
2062 type INDEX_TYPE. MINVAL is the lowest case value of in
2063 the case nodes, of INDEX_TYPE type, and RANGE is highest
2064 value minus MINVAL, also of type INDEX_TYPE. NODES is
2065 the set of case nodes, and DEFAULT_LABEL is the label to
2066 branch to should none of the cases match.
2067
2068 There *MUST* be MAX_CASE_BIT_TESTS or less unique case
2069 node targets. */
2070
2071static void
46c5ad27
AJ
2072emit_case_bit_tests (tree index_type, tree index_expr, tree minval,
2073 tree range, case_node_ptr nodes, rtx default_label)
9bb231fd
RS
2074{
2075 struct case_bit_test test[MAX_CASE_BIT_TESTS];
2076 enum machine_mode mode;
2077 rtx expr, index, label;
2078 unsigned int i,j,lo,hi;
2079 struct case_node *n;
2080 unsigned int count;
2081
2082 count = 0;
2083 for (n = nodes; n; n = n->right)
2084 {
2085 label = label_rtx (n->code_label);
2086 for (i = 0; i < count; i++)
7efcb746 2087 if (label == test[i].label)
9bb231fd
RS
2088 break;
2089
2090 if (i == count)
2091 {
41374e13
NS
2092 gcc_assert (count < MAX_CASE_BIT_TESTS);
2093 test[i].hi = 0;
2094 test[i].lo = 0;
9bb231fd
RS
2095 test[i].label = label;
2096 test[i].bits = 1;
2097 count++;
2098 }
2099 else
2100 test[i].bits++;
2101
4845b383
KH
2102 lo = tree_low_cst (fold_build2 (MINUS_EXPR, index_type,
2103 n->low, minval), 1);
2104 hi = tree_low_cst (fold_build2 (MINUS_EXPR, index_type,
2105 n->high, minval), 1);
9bb231fd
RS
2106 for (j = lo; j <= hi; j++)
2107 if (j >= HOST_BITS_PER_WIDE_INT)
2108 test[i].hi |= (HOST_WIDE_INT) 1 << (j - HOST_BITS_PER_INT);
2109 else
2110 test[i].lo |= (HOST_WIDE_INT) 1 << j;
2111 }
2112
2113 qsort (test, count, sizeof(*test), case_bit_test_cmp);
2114
4845b383
KH
2115 index_expr = fold_build2 (MINUS_EXPR, index_type,
2116 fold_convert (index_type, index_expr),
2117 fold_convert (index_type, minval));
84217346 2118 index = expand_normal (index_expr);
9bb231fd
RS
2119 do_pending_stack_adjust ();
2120
2121 mode = TYPE_MODE (index_type);
84217346 2122 expr = expand_normal (range);
b7814a18
RG
2123 if (default_label)
2124 emit_cmp_and_jump_insns (index, expr, GTU, NULL_RTX, mode, 1,
2125 default_label);
9bb231fd
RS
2126
2127 index = convert_to_mode (word_mode, index, 0);
2128 index = expand_binop (word_mode, ashl_optab, const1_rtx,
2129 index, NULL_RTX, 1, OPTAB_WIDEN);
2130
2131 for (i = 0; i < count; i++)
2132 {
2133 expr = immed_double_const (test[i].lo, test[i].hi, word_mode);
2134 expr = expand_binop (word_mode, and_optab, index, expr,
2135 NULL_RTX, 1, OPTAB_WIDEN);
2136 emit_cmp_and_jump_insns (expr, const0_rtx, NE, NULL_RTX,
2137 word_mode, 1, test[i].label);
2138 }
2139
b7814a18
RG
2140 if (default_label)
2141 emit_jump (default_label);
9bb231fd 2142}
ad82abb8 2143
41cbdcd0
KH
2144#ifndef HAVE_casesi
2145#define HAVE_casesi 0
2146#endif
2147
2148#ifndef HAVE_tablejump
2149#define HAVE_tablejump 0
2150#endif
2151
3feaea00 2152/* Terminate a case (Pascal/Ada) or switch (C) statement
9ab0ddd7 2153 in which ORIG_INDEX is the expression to be tested.
6f9fdf4d
JJ
2154 If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
2155 type as given in the source before any compiler conversions.
28d81abb
RK
2156 Generate the code to test it and jump to the right place. */
2157
2158void
7efcb746 2159expand_case (tree exp)
28d81abb 2160{
9fb60a0d 2161 tree minval = NULL_TREE, maxval = NULL_TREE, range = NULL_TREE;
28d81abb 2162 rtx default_label = 0;
4cfa46c8 2163 struct case_node *n;
9bb231fd 2164 unsigned int count, uniq;
28d81abb 2165 rtx index;
ca695ac9 2166 rtx table_label;
28d81abb
RK
2167 int ncases;
2168 rtx *labelvec;
a38e7aa5 2169 int i;
9bb231fd 2170 rtx before_case, end, lab;
ca695ac9 2171
7efcb746
PB
2172 tree vec = SWITCH_LABELS (exp);
2173 tree orig_type = TREE_TYPE (exp);
2174 tree index_expr = SWITCH_COND (exp);
2175 tree index_type = TREE_TYPE (index_expr);
2176 int unsignedp = TYPE_UNSIGNED (index_type);
2177
2178 /* The insn after which the case dispatch should finally
2179 be emitted. Zero for a dummy. */
2180 rtx start;
2181
2182 /* A list of case labels; it is first built as a list and it may then
2183 be rearranged into a nearly balanced binary tree. */
2184 struct case_node *case_list = 0;
2185
2186 /* Label to jump to if no case matches. */
b7814a18 2187 tree default_label_decl = NULL_TREE;
7efcb746 2188
6ac1b3a4
LB
2189 alloc_pool case_node_pool = create_alloc_pool ("struct case_node pool",
2190 sizeof (struct case_node),
2191 100);
2192
7efcb746
PB
2193 /* The switch body is lowered in gimplify.c, we should never have
2194 switches with a non-NULL SWITCH_BODY here. */
41374e13
NS
2195 gcc_assert (!SWITCH_BODY (exp));
2196 gcc_assert (SWITCH_LABELS (exp));
03c03770 2197
28d81abb
RK
2198 do_pending_stack_adjust ();
2199
2200 /* An ERROR_MARK occurs for various reasons including invalid data type. */
1b0cb6fc 2201 if (index_type != error_mark_node)
28d81abb 2202 {
4e0148df 2203 tree elt;
4cfa46c8 2204 bitmap label_bitmap;
b7814a18 2205 int vl = TREE_VEC_LENGTH (vec);
eb172681 2206
5100d114
KH
2207 /* cleanup_tree_cfg removes all SWITCH_EXPR with their index
2208 expressions being INTEGER_CST. */
2209 gcc_assert (TREE_CODE (index_expr) != INTEGER_CST);
2210
b7814a18
RG
2211 /* The default case, if ever taken, is at the end of TREE_VEC. */
2212 elt = TREE_VEC_ELT (vec, vl - 1);
2213 if (!CASE_LOW (elt) && !CASE_HIGH (elt))
2214 {
2215 default_label_decl = CASE_LABEL (elt);
2216 --vl;
2217 }
4e0148df 2218
b7814a18 2219 for (i = vl - 1; i >= 0; --i)
4e0148df 2220 {
3feaea00 2221 tree low, high;
4e0148df 2222 elt = TREE_VEC_ELT (vec, i);
3feaea00
EB
2223
2224 low = CASE_LOW (elt);
2225 gcc_assert (low);
2226 high = CASE_HIGH (elt);
2227
2228 /* Discard empty ranges. */
288bd0d7 2229 if (high && tree_int_cst_lt (high, low))
3feaea00
EB
2230 continue;
2231
2232 case_list = add_case_node (case_list, index_type, low, high,
6ac1b3a4 2233 CASE_LABEL (elt), case_node_pool);
eb172681
RS
2234 }
2235
2236
ede497cf 2237 before_case = start = get_last_insn ();
b7814a18
RG
2238 if (default_label_decl)
2239 default_label = label_rtx (default_label_decl);
28d81abb 2240
5cfffc4e 2241 /* Get upper and lower bounds of case values. */
28d81abb 2242
9bb231fd 2243 uniq = 0;
28d81abb 2244 count = 0;
8bdbfff5 2245 label_bitmap = BITMAP_ALLOC (NULL);
7efcb746 2246 for (n = case_list; n; n = n->right)
28d81abb 2247 {
28d81abb
RK
2248 /* Count the elements and track the largest and smallest
2249 of them (treating them as signed even if they are not). */
2250 if (count++ == 0)
2251 {
2252 minval = n->low;
2253 maxval = n->high;
2254 }
2255 else
2256 {
288bd0d7 2257 if (tree_int_cst_lt (n->low, minval))
28d81abb 2258 minval = n->low;
288bd0d7 2259 if (tree_int_cst_lt (maxval, n->high))
28d81abb
RK
2260 maxval = n->high;
2261 }
2262 /* A range counts double, since it requires two compares. */
2263 if (! tree_int_cst_equal (n->low, n->high))
2264 count++;
9bb231fd 2265
4cfa46c8
JL
2266 /* If we have not seen this label yet, then increase the
2267 number of unique case node targets seen. */
9bb231fd 2268 lab = label_rtx (n->code_label);
4cfa46c8
JL
2269 if (!bitmap_bit_p (label_bitmap, CODE_LABEL_NUMBER (lab)))
2270 {
2271 bitmap_set_bit (label_bitmap, CODE_LABEL_NUMBER (lab));
2272 uniq++;
2273 }
28d81abb
RK
2274 }
2275
8bdbfff5 2276 BITMAP_FREE (label_bitmap);
4cfa46c8 2277
5372d088 2278 /* cleanup_tree_cfg removes all SWITCH_EXPR with a single
2aabee29
AO
2279 destination, such as one with a default case only. However,
2280 it doesn't remove cases that are out of range for the switch
2281 type, so we may still get a zero here. */
2282 if (count == 0)
2283 {
b7814a18
RG
2284 if (default_label)
2285 emit_jump (default_label);
6ac1b3a4 2286 free_alloc_pool (case_node_pool);
2aabee29
AO
2287 return;
2288 }
28d81abb 2289
5372d088 2290 /* Compute span of values. */
4845b383 2291 range = fold_build2 (MINUS_EXPR, index_type, maxval, minval);
3474db0e 2292
9bb231fd
RS
2293 /* Try implementing this switch statement by a short sequence of
2294 bit-wise comparisons. However, we let the binary-tree case
2295 below handle constant index expressions. */
5372d088
KH
2296 if (CASE_USE_BIT_TESTS
2297 && ! TREE_CONSTANT (index_expr)
2298 && compare_tree_int (range, GET_MODE_BITSIZE (word_mode)) < 0
2299 && compare_tree_int (range, 0) > 0
2300 && lshift_cheap_p ()
2301 && ((uniq == 1 && count >= 3)
2302 || (uniq == 2 && count >= 5)
2303 || (uniq == 3 && count >= 6)))
9bb231fd
RS
2304 {
2305 /* Optimize the case where all the case values fit in a
2306 word without having to subtract MINVAL. In this case,
2307 we can optimize away the subtraction. */
2308 if (compare_tree_int (minval, 0) > 0
2309 && compare_tree_int (maxval, GET_MODE_BITSIZE (word_mode)) < 0)
2310 {
3bedcc89 2311 minval = build_int_cst (index_type, 0);
9bb231fd
RS
2312 range = maxval;
2313 }
2314 emit_case_bit_tests (index_type, index_expr, minval, range,
7efcb746 2315 case_list, default_label);
9bb231fd
RS
2316 }
2317
28d81abb
RK
2318 /* If range of values is much bigger than number of values,
2319 make a sequence of conditional branches instead of a dispatch.
2320 If the switch-index is a constant, do it this way
2321 because we can optimize it. */
4f73c5dd 2322
ad82abb8 2323 else if (count < case_values_threshold ()
9e4b13a7 2324 || compare_tree_int (range,
efd8f750 2325 (optimize_insn_for_size_p () ? 3 : 10) * count) > 0
f0c988c8
BS
2326 /* RANGE may be signed, and really large ranges will show up
2327 as negative numbers. */
2328 || compare_tree_int (range, 0) < 0
3f6fe18e
RK
2329#ifndef ASM_OUTPUT_ADDR_DIFF_ELT
2330 || flag_pic
2331#endif
82c0180d 2332 || !flag_jump_tables
41cbdcd0
KH
2333 || TREE_CONSTANT (index_expr)
2334 /* If neither casesi or tablejump is available, we can
2335 only go this way. */
2336 || (!HAVE_casesi && !HAVE_tablejump))
28d81abb 2337 {
84217346 2338 index = expand_normal (index_expr);
28d81abb
RK
2339
2340 /* If the index is a short or char that we do not have
2341 an insn to handle comparisons directly, convert it to
2342 a full integer now, rather than letting each comparison
2343 generate the conversion. */
2344
2345 if (GET_MODE_CLASS (GET_MODE (index)) == MODE_INT
ef89d648 2346 && ! have_insn_for (COMPARE, GET_MODE (index)))
28d81abb
RK
2347 {
2348 enum machine_mode wider_mode;
2349 for (wider_mode = GET_MODE (index); wider_mode != VOIDmode;
2350 wider_mode = GET_MODE_WIDER_MODE (wider_mode))
ef89d648 2351 if (have_insn_for (COMPARE, wider_mode))
28d81abb
RK
2352 {
2353 index = convert_to_mode (wider_mode, index, unsignedp);
2354 break;
2355 }
2356 }
2357
28d81abb
RK
2358 do_pending_stack_adjust ();
2359
3c0cb5de 2360 if (MEM_P (index))
28d81abb 2361 index = copy_to_reg (index);
28d81abb 2362
b2c5a1e9
KH
2363 /* We generate a binary decision tree to select the
2364 appropriate target code. This is done as follows:
5100d114
KH
2365
2366 The list of cases is rearranged into a binary tree,
2367 nearly optimal assuming equal probability for each case.
2368
2369 The tree is transformed into RTL, eliminating
2370 redundant test conditions at the same time.
2371
2372 If program flow could reach the end of the
2373 decision tree an unconditional jump to the
2374 default code is emitted. */
2375
2376 use_cost_table
2377 = (TREE_CODE (orig_type) != ENUMERAL_TYPE
2378 && estimate_case_costs (case_list));
2379 balance_case_nodes (&case_list, NULL);
2380 emit_case_nodes (index, case_list, default_label, index_type);
b7814a18
RG
2381 if (default_label)
2382 emit_jump (default_label);
28d81abb
RK
2383 }
2384 else
2385 {
55187c8a 2386 rtx fallback_label = label_rtx (case_list->code_label);
100e3acb 2387 table_label = gen_label_rtx ();
ad82abb8 2388 if (! try_casesi (index_type, index_expr, minval, range,
55187c8a 2389 table_label, default_label, fallback_label))
28d81abb 2390 {
41374e13 2391 bool ok;
1ff37128 2392
786de7eb 2393 /* Index jumptables from zero for suitable values of
1ff37128 2394 minval to avoid a subtraction. */
efd8f750 2395 if (optimize_insn_for_speed_p ()
786de7eb
KH
2396 && compare_tree_int (minval, 0) > 0
2397 && compare_tree_int (minval, 3) < 0)
2398 {
3bedcc89 2399 minval = build_int_cst (index_type, 0);
786de7eb
KH
2400 range = maxval;
2401 }
1ff37128 2402
41374e13
NS
2403 ok = try_tablejump (index_type, index_expr, minval, range,
2404 table_label, default_label);
2405 gcc_assert (ok);
28d81abb 2406 }
786de7eb 2407
28d81abb
RK
2408 /* Get table of labels to jump to, in order of case index. */
2409
1ff37128 2410 ncases = tree_low_cst (range, 0) + 1;
1634b18f 2411 labelvec = XALLOCAVEC (rtx, ncases);
703ad42b 2412 memset (labelvec, 0, ncases * sizeof (rtx));
28d81abb 2413
7efcb746 2414 for (n = case_list; n; n = n->right)
28d81abb 2415 {
2d9d49e4
OH
2416 /* Compute the low and high bounds relative to the minimum
2417 value since that should fit in a HOST_WIDE_INT while the
2418 actual values may not. */
2419 HOST_WIDE_INT i_low
4845b383
KH
2420 = tree_low_cst (fold_build2 (MINUS_EXPR, index_type,
2421 n->low, minval), 1);
2d9d49e4 2422 HOST_WIDE_INT i_high
4845b383
KH
2423 = tree_low_cst (fold_build2 (MINUS_EXPR, index_type,
2424 n->high, minval), 1);
2d9d49e4
OH
2425 HOST_WIDE_INT i;
2426
2427 for (i = i_low; i <= i_high; i ++)
2428 labelvec[i]
2429 = gen_rtx_LABEL_REF (Pmode, label_rtx (n->code_label));
28d81abb
RK
2430 }
2431
55187c8a
RG
2432 /* Fill in the gaps with the default. We may have gaps at
2433 the beginning if we tried to avoid the minval subtraction,
2434 so substitute some label even if the default label was
2435 deemed unreachable. */
2436 if (!default_label)
2437 default_label = fallback_label;
2438 for (i = 0; i < ncases; i++)
2439 if (labelvec[i] == 0)
2440 labelvec[i] = gen_rtx_LABEL_REF (Pmode, default_label);
28d81abb 2441
f9da5064 2442 /* Output the table. */
28d81abb
RK
2443 emit_label (table_label);
2444
18543a22 2445 if (CASE_VECTOR_PC_RELATIVE || flag_pic)
38a448ca
RH
2446 emit_jump_insn (gen_rtx_ADDR_DIFF_VEC (CASE_VECTOR_MODE,
2447 gen_rtx_LABEL_REF (Pmode, table_label),
33f7f353 2448 gen_rtvec_v (ncases, labelvec),
4381f7c2 2449 const0_rtx, const0_rtx));
28d81abb 2450 else
38a448ca
RH
2451 emit_jump_insn (gen_rtx_ADDR_VEC (CASE_VECTOR_MODE,
2452 gen_rtvec_v (ncases, labelvec)));
28d81abb 2453
6be85b25 2454 /* Record no drop-through after the table. */
28d81abb 2455 emit_barrier ();
28d81abb
RK
2456 }
2457
2270623a
JM
2458 before_case = NEXT_INSN (before_case);
2459 end = get_last_insn ();
7efcb746 2460 reorder_insns (before_case, end, start);
28d81abb 2461 }
1b0cb6fc 2462
28d81abb 2463 free_temp_slots ();
6ac1b3a4 2464 free_alloc_pool (case_node_pool);
28d81abb
RK
2465}
2466
feb04780 2467/* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE. */
28d81abb
RK
2468
2469static void
feb04780
RS
2470do_jump_if_equal (enum machine_mode mode, rtx op0, rtx op1, rtx label,
2471 int unsignedp)
28d81abb 2472{
feb04780
RS
2473 do_compare_rtx_and_jump (op0, op1, EQ, unsignedp, mode,
2474 NULL_RTX, NULL_RTX, label);
28d81abb
RK
2475}
2476\f
2477/* Not all case values are encountered equally. This function
2478 uses a heuristic to weight case labels, in cases where that
2479 looks like a reasonable thing to do.
2480
2481 Right now, all we try to guess is text, and we establish the
2482 following weights:
2483
2484 chars above space: 16
2485 digits: 16
2486 default: 12
2487 space, punct: 8
2488 tab: 4
2489 newline: 2
2490 other "\" chars: 1
2491 remaining chars: 0
2492
2493 If we find any cases in the switch that are not either -1 or in the range
2494 of valid ASCII characters, or are control characters other than those
2495 commonly used with "\", don't treat this switch scanning text.
2496
2497 Return 1 if these nodes are suitable for cost estimation, otherwise
2498 return 0. */
2499
2500static int
46c5ad27 2501estimate_case_costs (case_node_ptr node)
28d81abb 2502{
f2d1f0ba 2503 tree min_ascii = integer_minus_one_node;
aeba6c28 2504 tree max_ascii = build_int_cst (TREE_TYPE (node->high), 127);
28d81abb
RK
2505 case_node_ptr n;
2506 int i;
2507
2508 /* If we haven't already made the cost table, make it now. Note that the
2509 lower bound of the table is -1, not zero. */
2510
2a2137c4 2511 if (! cost_table_initialized)
28d81abb 2512 {
2a2137c4 2513 cost_table_initialized = 1;
28d81abb
RK
2514
2515 for (i = 0; i < 128; i++)
2516 {
e9a780ec 2517 if (ISALNUM (i))
2a2137c4 2518 COST_TABLE (i) = 16;
e9a780ec 2519 else if (ISPUNCT (i))
2a2137c4 2520 COST_TABLE (i) = 8;
e9a780ec 2521 else if (ISCNTRL (i))
2a2137c4 2522 COST_TABLE (i) = -1;
28d81abb
RK
2523 }
2524
2a2137c4
RH
2525 COST_TABLE (' ') = 8;
2526 COST_TABLE ('\t') = 4;
2527 COST_TABLE ('\0') = 4;
2528 COST_TABLE ('\n') = 2;
2529 COST_TABLE ('\f') = 1;
2530 COST_TABLE ('\v') = 1;
2531 COST_TABLE ('\b') = 1;
28d81abb
RK
2532 }
2533
2534 /* See if all the case expressions look like text. It is text if the
2535 constant is >= -1 and the highest constant is <= 127. Do all comparisons
2536 as signed arithmetic since we don't want to ever access cost_table with a
2537 value less than -1. Also check that none of the constants in a range
2538 are strange control characters. */
2539
2540 for (n = node; n; n = n->right)
2541 {
288bd0d7
RG
2542 if (tree_int_cst_lt (n->low, min_ascii)
2543 || tree_int_cst_lt (max_ascii, n->high))
28d81abb
RK
2544 return 0;
2545
05bccae2
RK
2546 for (i = (HOST_WIDE_INT) TREE_INT_CST_LOW (n->low);
2547 i <= (HOST_WIDE_INT) TREE_INT_CST_LOW (n->high); i++)
2a2137c4 2548 if (COST_TABLE (i) < 0)
28d81abb
RK
2549 return 0;
2550 }
2551
2552 /* All interesting values are within the range of interesting
2553 ASCII characters. */
2554 return 1;
2555}
2556
28d81abb
RK
2557/* Take an ordered list of case nodes
2558 and transform them into a near optimal binary tree,
6dc42e49 2559 on the assumption that any target code selection value is as
28d81abb
RK
2560 likely as any other.
2561
2562 The transformation is performed by splitting the ordered
2563 list into two equal sections plus a pivot. The parts are
2564 then attached to the pivot as left and right branches. Each
38e01259 2565 branch is then transformed recursively. */
28d81abb
RK
2566
2567static void
46c5ad27 2568balance_case_nodes (case_node_ptr *head, case_node_ptr parent)
28d81abb 2569{
b3694847 2570 case_node_ptr np;
28d81abb
RK
2571
2572 np = *head;
2573 if (np)
2574 {
2575 int cost = 0;
2576 int i = 0;
2577 int ranges = 0;
b3694847 2578 case_node_ptr *npp;
28d81abb
RK
2579 case_node_ptr left;
2580
2581 /* Count the number of entries on branch. Also count the ranges. */
2582
2583 while (np)
2584 {
2585 if (!tree_int_cst_equal (np->low, np->high))
2586 {
2587 ranges++;
2588 if (use_cost_table)
2a2137c4 2589 cost += COST_TABLE (TREE_INT_CST_LOW (np->high));
28d81abb
RK
2590 }
2591
2592 if (use_cost_table)
2a2137c4 2593 cost += COST_TABLE (TREE_INT_CST_LOW (np->low));
28d81abb
RK
2594
2595 i++;
2596 np = np->right;
2597 }
2598
2599 if (i > 2)
2600 {
2601 /* Split this list if it is long enough for that to help. */
2602 npp = head;
2603 left = *npp;
2604 if (use_cost_table)
2605 {
2606 /* Find the place in the list that bisects the list's total cost,
2607 Here I gets half the total cost. */
2608 int n_moved = 0;
2609 i = (cost + 1) / 2;
2610 while (1)
2611 {
2612 /* Skip nodes while their cost does not reach that amount. */
2613 if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
2a2137c4
RH
2614 i -= COST_TABLE (TREE_INT_CST_LOW ((*npp)->high));
2615 i -= COST_TABLE (TREE_INT_CST_LOW ((*npp)->low));
28d81abb
RK
2616 if (i <= 0)
2617 break;
2618 npp = &(*npp)->right;
2619 n_moved += 1;
2620 }
2621 if (n_moved == 0)
2622 {
2623 /* Leave this branch lopsided, but optimize left-hand
2624 side and fill in `parent' fields for right-hand side. */
2625 np = *head;
2626 np->parent = parent;
2627 balance_case_nodes (&np->left, np);
2628 for (; np->right; np = np->right)
2629 np->right->parent = np;
2630 return;
2631 }
2632 }
2633 /* If there are just three nodes, split at the middle one. */
2634 else if (i == 3)
2635 npp = &(*npp)->right;
2636 else
2637 {
2638 /* Find the place in the list that bisects the list's total cost,
2639 where ranges count as 2.
2640 Here I gets half the total cost. */
2641 i = (i + ranges + 1) / 2;
2642 while (1)
2643 {
2644 /* Skip nodes while their cost does not reach that amount. */
2645 if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
2646 i--;
2647 i--;
2648 if (i <= 0)
2649 break;
2650 npp = &(*npp)->right;
2651 }
2652 }
2653 *head = np = *npp;
2654 *npp = 0;
2655 np->parent = parent;
2656 np->left = left;
2657
2658 /* Optimize each of the two split parts. */
2659 balance_case_nodes (&np->left, np);
2660 balance_case_nodes (&np->right, np);
2661 }
2662 else
2663 {
2664 /* Else leave this branch as one level,
2665 but fill in `parent' fields. */
2666 np = *head;
2667 np->parent = parent;
2668 for (; np->right; np = np->right)
2669 np->right->parent = np;
2670 }
2671 }
2672}
2673\f
2674/* Search the parent sections of the case node tree
2675 to see if a test for the lower bound of NODE would be redundant.
2676 INDEX_TYPE is the type of the index expression.
2677
2678 The instructions to generate the case decision tree are
2679 output in the same order as nodes are processed so it is
2680 known that if a parent node checks the range of the current
2681 node minus one that the current node is bounded at its lower
2682 span. Thus the test would be redundant. */
2683
2684static int
46c5ad27 2685node_has_low_bound (case_node_ptr node, tree index_type)
28d81abb
RK
2686{
2687 tree low_minus_one;
2688 case_node_ptr pnode;
2689
2690 /* If the lower bound of this node is the lowest value in the index type,
2691 we need not test it. */
2692
2693 if (tree_int_cst_equal (node->low, TYPE_MIN_VALUE (index_type)))
2694 return 1;
2695
2696 /* If this node has a left branch, the value at the left must be less
2697 than that at this node, so it cannot be bounded at the bottom and
2698 we need not bother testing any further. */
2699
2700 if (node->left)
2701 return 0;
2702
4845b383 2703 low_minus_one = fold_build2 (MINUS_EXPR, TREE_TYPE (node->low),
3bedcc89
RG
2704 node->low,
2705 build_int_cst (TREE_TYPE (node->low), 1));
28d81abb
RK
2706
2707 /* If the subtraction above overflowed, we can't verify anything.
2708 Otherwise, look for a parent that tests our value - 1. */
2709
2710 if (! tree_int_cst_lt (low_minus_one, node->low))
2711 return 0;
2712
2713 for (pnode = node->parent; pnode; pnode = pnode->parent)
2714 if (tree_int_cst_equal (low_minus_one, pnode->high))
2715 return 1;
2716
2717 return 0;
2718}
2719
2720/* Search the parent sections of the case node tree
2721 to see if a test for the upper bound of NODE would be redundant.
2722 INDEX_TYPE is the type of the index expression.
2723
2724 The instructions to generate the case decision tree are
2725 output in the same order as nodes are processed so it is
2726 known that if a parent node checks the range of the current
2727 node plus one that the current node is bounded at its upper
2728 span. Thus the test would be redundant. */
2729
2730static int
46c5ad27 2731node_has_high_bound (case_node_ptr node, tree index_type)
28d81abb
RK
2732{
2733 tree high_plus_one;
2734 case_node_ptr pnode;
2735
e1ee5cdc
RH
2736 /* If there is no upper bound, obviously no test is needed. */
2737
2738 if (TYPE_MAX_VALUE (index_type) == NULL)
2739 return 1;
2740
28d81abb
RK
2741 /* If the upper bound of this node is the highest value in the type
2742 of the index expression, we need not test against it. */
2743
2744 if (tree_int_cst_equal (node->high, TYPE_MAX_VALUE (index_type)))
2745 return 1;
2746
2747 /* If this node has a right branch, the value at the right must be greater
2748 than that at this node, so it cannot be bounded at the top and
2749 we need not bother testing any further. */
2750
2751 if (node->right)
2752 return 0;
2753
4845b383 2754 high_plus_one = fold_build2 (PLUS_EXPR, TREE_TYPE (node->high),
3bedcc89
RG
2755 node->high,
2756 build_int_cst (TREE_TYPE (node->high), 1));
28d81abb
RK
2757
2758 /* If the addition above overflowed, we can't verify anything.
2759 Otherwise, look for a parent that tests our value + 1. */
2760
2761 if (! tree_int_cst_lt (node->high, high_plus_one))
2762 return 0;
2763
2764 for (pnode = node->parent; pnode; pnode = pnode->parent)
2765 if (tree_int_cst_equal (high_plus_one, pnode->low))
2766 return 1;
2767
2768 return 0;
2769}
2770
2771/* Search the parent sections of the
2772 case node tree to see if both tests for the upper and lower
2773 bounds of NODE would be redundant. */
2774
2775static int
46c5ad27 2776node_is_bounded (case_node_ptr node, tree index_type)
28d81abb
RK
2777{
2778 return (node_has_low_bound (node, index_type)
2779 && node_has_high_bound (node, index_type));
2780}
28d81abb
RK
2781\f
2782/* Emit step-by-step code to select a case for the value of INDEX.
2783 The thus generated decision tree follows the form of the
2784 case-node binary tree NODE, whose nodes represent test conditions.
2785 INDEX_TYPE is the type of the index of the switch.
2786
2787 Care is taken to prune redundant tests from the decision tree
2788 by detecting any boundary conditions already checked by
2789 emitted rtx. (See node_has_high_bound, node_has_low_bound
2790 and node_is_bounded, above.)
2791
2792 Where the test conditions can be shown to be redundant we emit
2793 an unconditional jump to the target code. As a further
2794 optimization, the subordinates of a tree node are examined to
2795 check for bounded nodes. In this case conditional and/or
2796 unconditional jumps as a result of the boundary check for the
2797 current node are arranged to target the subordinates associated
38e01259 2798 code for out of bound conditions on the current node.
28d81abb 2799
f72aed24 2800 We can assume that when control reaches the code generated here,
28d81abb
RK
2801 the index value has already been compared with the parents
2802 of this node, and determined to be on the same side of each parent
2803 as this node is. Thus, if this node tests for the value 51,
2804 and a parent tested for 52, we don't need to consider
2805 the possibility of a value greater than 51. If another parent
2806 tests for the value 50, then this node need not test anything. */
2807
2808static void
46c5ad27
AJ
2809emit_case_nodes (rtx index, case_node_ptr node, rtx default_label,
2810 tree index_type)
28d81abb
RK
2811{
2812 /* If INDEX has an unsigned type, we must make unsigned branches. */
8df83eae 2813 int unsignedp = TYPE_UNSIGNED (index_type);
28d81abb 2814 enum machine_mode mode = GET_MODE (index);
69107307 2815 enum machine_mode imode = TYPE_MODE (index_type);
28d81abb 2816
f8318079
RS
2817 /* Handle indices detected as constant during RTL expansion. */
2818 if (mode == VOIDmode)
2819 mode = imode;
2820
28d81abb
RK
2821 /* See if our parents have already tested everything for us.
2822 If they have, emit an unconditional jump for this node. */
2823 if (node_is_bounded (node, index_type))
2824 emit_jump (label_rtx (node->code_label));
2825
2826 else if (tree_int_cst_equal (node->low, node->high))
2827 {
2828 /* Node is single valued. First see if the index expression matches
0f41302f 2829 this node and then check our children, if any. */
28d81abb 2830
feb04780 2831 do_jump_if_equal (mode, index,
69107307 2832 convert_modes (mode, imode,
84217346 2833 expand_normal (node->low),
69107307 2834 unsignedp),
28d81abb
RK
2835 label_rtx (node->code_label), unsignedp);
2836
2837 if (node->right != 0 && node->left != 0)
2838 {
2839 /* This node has children on both sides.
2840 Dispatch to one side or the other
2841 by comparing the index value with this node's value.
2842 If one subtree is bounded, check that one first,
2843 so we can avoid real branches in the tree. */
2844
2845 if (node_is_bounded (node->right, index_type))
2846 {
4381f7c2 2847 emit_cmp_and_jump_insns (index,
69107307
AO
2848 convert_modes
2849 (mode, imode,
84217346 2850 expand_normal (node->high),
69107307 2851 unsignedp),
d43e0b7d 2852 GT, NULL_RTX, mode, unsignedp,
4381f7c2 2853 label_rtx (node->right->code_label));
28d81abb
RK
2854 emit_case_nodes (index, node->left, default_label, index_type);
2855 }
2856
2857 else if (node_is_bounded (node->left, index_type))
2858 {
4381f7c2 2859 emit_cmp_and_jump_insns (index,
69107307
AO
2860 convert_modes
2861 (mode, imode,
84217346 2862 expand_normal (node->high),
69107307 2863 unsignedp),
d43e0b7d 2864 LT, NULL_RTX, mode, unsignedp,
c5d5d461 2865 label_rtx (node->left->code_label));
28d81abb
RK
2866 emit_case_nodes (index, node->right, default_label, index_type);
2867 }
2868
43a21dfc
KH
2869 /* If both children are single-valued cases with no
2870 children, finish up all the work. This way, we can save
2871 one ordered comparison. */
2872 else if (tree_int_cst_equal (node->right->low, node->right->high)
2873 && node->right->left == 0
2874 && node->right->right == 0
2875 && tree_int_cst_equal (node->left->low, node->left->high)
2876 && node->left->left == 0
2877 && node->left->right == 0)
2878 {
2879 /* Neither node is bounded. First distinguish the two sides;
2880 then emit the code for one side at a time. */
2881
2882 /* See if the value matches what the right hand side
2883 wants. */
feb04780 2884 do_jump_if_equal (mode, index,
43a21dfc 2885 convert_modes (mode, imode,
84217346 2886 expand_normal (node->right->low),
43a21dfc
KH
2887 unsignedp),
2888 label_rtx (node->right->code_label),
2889 unsignedp);
2890
2891 /* See if the value matches what the left hand side
2892 wants. */
feb04780 2893 do_jump_if_equal (mode, index,
43a21dfc 2894 convert_modes (mode, imode,
84217346 2895 expand_normal (node->left->low),
43a21dfc
KH
2896 unsignedp),
2897 label_rtx (node->left->code_label),
2898 unsignedp);
2899 }
2900
28d81abb
RK
2901 else
2902 {
2903 /* Neither node is bounded. First distinguish the two sides;
2904 then emit the code for one side at a time. */
2905
4381f7c2 2906 tree test_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
28d81abb
RK
2907
2908 /* See if the value is on the right. */
4381f7c2 2909 emit_cmp_and_jump_insns (index,
69107307
AO
2910 convert_modes
2911 (mode, imode,
84217346 2912 expand_normal (node->high),
69107307 2913 unsignedp),
d43e0b7d 2914 GT, NULL_RTX, mode, unsignedp,
c5d5d461 2915 label_rtx (test_label));
28d81abb
RK
2916
2917 /* Value must be on the left.
2918 Handle the left-hand subtree. */
2919 emit_case_nodes (index, node->left, default_label, index_type);
2920 /* If left-hand subtree does nothing,
2921 go to default. */
b7814a18
RG
2922 if (default_label)
2923 emit_jump (default_label);
28d81abb
RK
2924
2925 /* Code branches here for the right-hand subtree. */
2926 expand_label (test_label);
2927 emit_case_nodes (index, node->right, default_label, index_type);
2928 }
2929 }
2930
2931 else if (node->right != 0 && node->left == 0)
2932 {
adb35797 2933 /* Here we have a right child but no left so we issue a conditional
28d81abb
RK
2934 branch to default and process the right child.
2935
adb35797
KH
2936 Omit the conditional branch to default if the right child
2937 does not have any children and is single valued; it would
2938 cost too much space to save so little time. */
28d81abb 2939
de14fd73 2940 if (node->right->right || node->right->left
28d81abb
RK
2941 || !tree_int_cst_equal (node->right->low, node->right->high))
2942 {
2943 if (!node_has_low_bound (node, index_type))
2944 {
4381f7c2 2945 emit_cmp_and_jump_insns (index,
69107307
AO
2946 convert_modes
2947 (mode, imode,
84217346 2948 expand_normal (node->high),
69107307 2949 unsignedp),
d43e0b7d 2950 LT, NULL_RTX, mode, unsignedp,
c5d5d461 2951 default_label);
28d81abb
RK
2952 }
2953
2954 emit_case_nodes (index, node->right, default_label, index_type);
2955 }
2956 else
2957 /* We cannot process node->right normally
2958 since we haven't ruled out the numbers less than
2959 this node's value. So handle node->right explicitly. */
feb04780 2960 do_jump_if_equal (mode, index,
69107307
AO
2961 convert_modes
2962 (mode, imode,
84217346 2963 expand_normal (node->right->low),
69107307 2964 unsignedp),
28d81abb
RK
2965 label_rtx (node->right->code_label), unsignedp);
2966 }
2967
2968 else if (node->right == 0 && node->left != 0)
2969 {
2970 /* Just one subtree, on the left. */
4381f7c2 2971 if (node->left->left || node->left->right
28d81abb
RK
2972 || !tree_int_cst_equal (node->left->low, node->left->high))
2973 {
2974 if (!node_has_high_bound (node, index_type))
2975 {
69107307
AO
2976 emit_cmp_and_jump_insns (index,
2977 convert_modes
2978 (mode, imode,
84217346 2979 expand_normal (node->high),
69107307 2980 unsignedp),
d43e0b7d 2981 GT, NULL_RTX, mode, unsignedp,
c5d5d461 2982 default_label);
28d81abb
RK
2983 }
2984
2985 emit_case_nodes (index, node->left, default_label, index_type);
2986 }
2987 else
2988 /* We cannot process node->left normally
2989 since we haven't ruled out the numbers less than
2990 this node's value. So handle node->left explicitly. */
feb04780 2991 do_jump_if_equal (mode, index,
69107307
AO
2992 convert_modes
2993 (mode, imode,
84217346 2994 expand_normal (node->left->low),
69107307 2995 unsignedp),
28d81abb
RK
2996 label_rtx (node->left->code_label), unsignedp);
2997 }
2998 }
2999 else
3000 {
3001 /* Node is a range. These cases are very similar to those for a single
3002 value, except that we do not start by testing whether this node
3003 is the one to branch to. */
3004
3005 if (node->right != 0 && node->left != 0)
3006 {
3007 /* Node has subtrees on both sides.
3008 If the right-hand subtree is bounded,
3009 test for it first, since we can go straight there.
3010 Otherwise, we need to make a branch in the control structure,
3011 then handle the two subtrees. */
3012 tree test_label = 0;
3013
28d81abb
RK
3014 if (node_is_bounded (node->right, index_type))
3015 /* Right hand node is fully bounded so we can eliminate any
3016 testing and branch directly to the target code. */
69107307
AO
3017 emit_cmp_and_jump_insns (index,
3018 convert_modes
3019 (mode, imode,
84217346 3020 expand_normal (node->high),
69107307 3021 unsignedp),
d43e0b7d 3022 GT, NULL_RTX, mode, unsignedp,
c5d5d461 3023 label_rtx (node->right->code_label));
28d81abb
RK
3024 else
3025 {
3026 /* Right hand node requires testing.
3027 Branch to a label where we will handle it later. */
3028
3029 test_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
4381f7c2 3030 emit_cmp_and_jump_insns (index,
69107307
AO
3031 convert_modes
3032 (mode, imode,
84217346 3033 expand_normal (node->high),
69107307 3034 unsignedp),
d43e0b7d 3035 GT, NULL_RTX, mode, unsignedp,
c5d5d461 3036 label_rtx (test_label));
28d81abb
RK
3037 }
3038
3039 /* Value belongs to this node or to the left-hand subtree. */
3040
69107307
AO
3041 emit_cmp_and_jump_insns (index,
3042 convert_modes
3043 (mode, imode,
84217346 3044 expand_normal (node->low),
69107307 3045 unsignedp),
d43e0b7d 3046 GE, NULL_RTX, mode, unsignedp,
c5d5d461 3047 label_rtx (node->code_label));
28d81abb
RK
3048
3049 /* Handle the left-hand subtree. */
3050 emit_case_nodes (index, node->left, default_label, index_type);
3051
3052 /* If right node had to be handled later, do that now. */
3053
3054 if (test_label)
3055 {
3056 /* If the left-hand subtree fell through,
3057 don't let it fall into the right-hand subtree. */
b7814a18
RG
3058 if (default_label)
3059 emit_jump (default_label);
28d81abb
RK
3060
3061 expand_label (test_label);
3062 emit_case_nodes (index, node->right, default_label, index_type);
3063 }
3064 }
3065
3066 else if (node->right != 0 && node->left == 0)
3067 {
3068 /* Deal with values to the left of this node,
3069 if they are possible. */
3070 if (!node_has_low_bound (node, index_type))
3071 {
4381f7c2 3072 emit_cmp_and_jump_insns (index,
69107307
AO
3073 convert_modes
3074 (mode, imode,
84217346 3075 expand_normal (node->low),
69107307 3076 unsignedp),
d43e0b7d 3077 LT, NULL_RTX, mode, unsignedp,
c5d5d461 3078 default_label);
28d81abb
RK
3079 }
3080
3081 /* Value belongs to this node or to the right-hand subtree. */
3082
69107307
AO
3083 emit_cmp_and_jump_insns (index,
3084 convert_modes
3085 (mode, imode,
84217346 3086 expand_normal (node->high),
69107307 3087 unsignedp),
d43e0b7d 3088 LE, NULL_RTX, mode, unsignedp,
c5d5d461 3089 label_rtx (node->code_label));
28d81abb
RK
3090
3091 emit_case_nodes (index, node->right, default_label, index_type);
3092 }
3093
3094 else if (node->right == 0 && node->left != 0)
3095 {
3096 /* Deal with values to the right of this node,
3097 if they are possible. */
3098 if (!node_has_high_bound (node, index_type))
3099 {
4381f7c2 3100 emit_cmp_and_jump_insns (index,
69107307
AO
3101 convert_modes
3102 (mode, imode,
84217346 3103 expand_normal (node->high),
69107307 3104 unsignedp),
d43e0b7d 3105 GT, NULL_RTX, mode, unsignedp,
c5d5d461 3106 default_label);
28d81abb
RK
3107 }
3108
3109 /* Value belongs to this node or to the left-hand subtree. */
3110
4381f7c2 3111 emit_cmp_and_jump_insns (index,
69107307
AO
3112 convert_modes
3113 (mode, imode,
84217346 3114 expand_normal (node->low),
69107307 3115 unsignedp),
d43e0b7d 3116 GE, NULL_RTX, mode, unsignedp,
c5d5d461 3117 label_rtx (node->code_label));
28d81abb
RK
3118
3119 emit_case_nodes (index, node->left, default_label, index_type);
3120 }
3121
3122 else
3123 {
3124 /* Node has no children so we check low and high bounds to remove
3125 redundant tests. Only one of the bounds can exist,
3126 since otherwise this node is bounded--a case tested already. */
923cbdc3
JH
3127 int high_bound = node_has_high_bound (node, index_type);
3128 int low_bound = node_has_low_bound (node, index_type);
28d81abb 3129
923cbdc3 3130 if (!high_bound && low_bound)
28d81abb 3131 {
4381f7c2 3132 emit_cmp_and_jump_insns (index,
69107307
AO
3133 convert_modes
3134 (mode, imode,
84217346 3135 expand_normal (node->high),
69107307 3136 unsignedp),
d43e0b7d 3137 GT, NULL_RTX, mode, unsignedp,
c5d5d461 3138 default_label);
28d81abb
RK
3139 }
3140
923cbdc3 3141 else if (!low_bound && high_bound)
28d81abb 3142 {
4381f7c2 3143 emit_cmp_and_jump_insns (index,
69107307
AO
3144 convert_modes
3145 (mode, imode,
84217346 3146 expand_normal (node->low),
69107307 3147 unsignedp),
d43e0b7d 3148 LT, NULL_RTX, mode, unsignedp,
c5d5d461 3149 default_label);
28d81abb 3150 }
923cbdc3
JH
3151 else if (!low_bound && !high_bound)
3152 {
9312aecc 3153 /* Widen LOW and HIGH to the same width as INDEX. */
ae2bcd98 3154 tree type = lang_hooks.types.type_for_mode (mode, unsignedp);
9312aecc
JDA
3155 tree low = build1 (CONVERT_EXPR, type, node->low);
3156 tree high = build1 (CONVERT_EXPR, type, node->high);
ef89d648 3157 rtx low_rtx, new_index, new_bound;
9312aecc
JDA
3158
3159 /* Instead of doing two branches, emit one unsigned branch for
3160 (index-low) > (high-low). */
84217346 3161 low_rtx = expand_expr (low, NULL_RTX, mode, EXPAND_NORMAL);
ef89d648
ZW
3162 new_index = expand_simple_binop (mode, MINUS, index, low_rtx,
3163 NULL_RTX, unsignedp,
3164 OPTAB_WIDEN);
4845b383
KH
3165 new_bound = expand_expr (fold_build2 (MINUS_EXPR, type,
3166 high, low),
84217346 3167 NULL_RTX, mode, EXPAND_NORMAL);
786de7eb 3168
9312aecc 3169 emit_cmp_and_jump_insns (new_index, new_bound, GT, NULL_RTX,
d43e0b7d 3170 mode, 1, default_label);
923cbdc3 3171 }
28d81abb
RK
3172
3173 emit_jump (label_rtx (node->code_label));
3174 }
3175 }
3176}
This page took 5.48293 seconds and 5 git commands to generate.