2009-01-19 Iain Sandoe <iain.sandoe@sandoe-acoustics.co.uk>
[official-gcc.git] / gcc / stmt.c
blob286e5663c98e3a867f69dfd204577c8f12836108
1 /* Expands front end tree to back end RTL for GCC
2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
3 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
4 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
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.
24 The functions whose names start with `expand_' are called by the
25 expander to generate RTL instructions for various kinds of constructs. */
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tm.h"
32 #include "rtl.h"
33 #include "hard-reg-set.h"
34 #include "tree.h"
35 #include "tm_p.h"
36 #include "flags.h"
37 #include "except.h"
38 #include "function.h"
39 #include "insn-config.h"
40 #include "expr.h"
41 #include "libfuncs.h"
42 #include "recog.h"
43 #include "machmode.h"
44 #include "toplev.h"
45 #include "output.h"
46 #include "ggc.h"
47 #include "langhooks.h"
48 #include "predict.h"
49 #include "optabs.h"
50 #include "target.h"
51 #include "regs.h"
52 #include "alloc-pool.h"
54 /* Functions and data structures for expanding case statements. */
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.
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.
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
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.
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
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
77 and nodes on the right having higher values. We then output the tree
78 in order.
80 For very small, suitable switch statements, we can generate a series
81 of simple bit test and branches instead. */
83 struct case_node
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 */
93 typedef struct case_node case_node;
94 typedef struct case_node *case_node_ptr;
96 /* These are used by estimate_case_costs and balance_case_nodes. */
98 /* This must be a signed type, and non-ANSI compilers lack signed char. */
99 static short cost_table_[129];
100 static int use_cost_table;
101 static int cost_table_initialized;
103 /* Special care is needed because we allow -1, but TREE_INT_CST_LOW
104 is unsigned. */
105 #define COST_TABLE(I) cost_table_[(unsigned HOST_WIDE_INT) ((I) + 1)]
107 static int n_occurrences (int, const char *);
108 static bool tree_conflicts_with_clobbers_p (tree, HARD_REG_SET *);
109 static void expand_nl_goto_receiver (void);
110 static bool check_operand_nalternatives (tree, tree);
111 static bool check_unique_operand_names (tree, tree);
112 static char *resolve_operand_name_1 (char *, tree, tree);
113 static void expand_null_return_1 (void);
114 static void expand_value_return (rtx);
115 static int estimate_case_costs (case_node_ptr);
116 static bool lshift_cheap_p (void);
117 static int case_bit_test_cmp (const void *, const void *);
118 static void emit_case_bit_tests (tree, tree, tree, tree, case_node_ptr, rtx);
119 static void balance_case_nodes (case_node_ptr *, case_node_ptr);
120 static int node_has_low_bound (case_node_ptr, tree);
121 static int node_has_high_bound (case_node_ptr, tree);
122 static int node_is_bounded (case_node_ptr, tree);
123 static void emit_case_nodes (rtx, case_node_ptr, rtx, tree);
124 static struct case_node *add_case_node (struct case_node *, tree,
125 tree, tree, tree, alloc_pool);
128 /* Return the rtx-label that corresponds to a LABEL_DECL,
129 creating it if necessary. */
132 label_rtx (tree label)
134 gcc_assert (TREE_CODE (label) == LABEL_DECL);
136 if (!DECL_RTL_SET_P (label))
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;
144 return DECL_RTL (label);
147 /* As above, but also put it on the forced-reference list of the
148 function that contains it. */
150 force_label_rtx (tree label)
152 rtx ref = label_rtx (label);
153 tree function = decl_function_context (label);
155 gcc_assert (function);
157 forced_labels = gen_rtx_EXPR_LIST (VOIDmode, ref, forced_labels);
158 return ref;
161 /* Add an unconditional jump to LABEL as the next sequential instruction. */
163 void
164 emit_jump (rtx label)
166 do_pending_stack_adjust ();
167 emit_jump_insn (gen_jump (label));
168 emit_barrier ();
171 /* Emit code to jump to the address
172 specified by the pointer expression EXP. */
174 void
175 expand_computed_goto (tree exp)
177 rtx x = expand_normal (exp);
179 x = convert_memory_address (Pmode, x);
181 do_pending_stack_adjust ();
182 emit_indirect_jump (x);
185 /* Handle goto statements and the labels that they can go to. */
187 /* Specify the location in the RTL code of a label LABEL,
188 which is a LABEL_DECL tree node.
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.
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. */
198 void
199 expand_label (tree label)
201 rtx label_r = label_rtx (label);
203 do_pending_stack_adjust ();
204 emit_label (label_r);
205 if (DECL_NAME (label))
206 LABEL_NAME (DECL_RTL (label)) = IDENTIFIER_POINTER (DECL_NAME (label));
208 if (DECL_NONLOCAL (label))
210 expand_nl_goto_receiver ();
211 nonlocal_goto_handler_labels
212 = gen_rtx_EXPR_LIST (VOIDmode, label_r,
213 nonlocal_goto_handler_labels);
216 if (FORCED_LABEL (label))
217 forced_labels = gen_rtx_EXPR_LIST (VOIDmode, label_r, forced_labels);
219 if (DECL_NONLOCAL (label) || FORCED_LABEL (label))
220 maybe_set_first_label_num (label_r);
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'. */
227 void
228 expand_goto (tree label)
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);
234 gcc_assert (!context || context == current_function_decl);
235 #endif
237 emit_jump (label_rtx (label));
240 /* Return the number of times character C occurs in string S. */
241 static int
242 n_occurrences (int c, const char *s)
244 int n = 0;
245 while (*s)
246 n += (*s++ == c);
247 return n;
250 /* Generate RTL for an asm statement (explicit assembler code).
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. */
255 static void
256 expand_asm_loc (tree string, int vol, location_t locus)
258 rtx body;
260 if (TREE_CODE (string) == ADDR_EXPR)
261 string = TREE_OPERAND (string, 0);
263 body = gen_rtx_ASM_INPUT_loc (VOIDmode,
264 ggc_strdup (TREE_STRING_POINTER (string)),
265 locus);
267 MEM_VOLATILE_P (body) = vol;
269 emit_insn (body);
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
281 replaced with `=' as part of this process.)
283 Returns TRUE if all went well; FALSE if an error occurred. */
285 bool
286 parse_output_constraint (const char **constraint_p, int operand_num,
287 int ninputs, int noutputs, bool *allows_mem,
288 bool *allows_reg, bool *is_inout)
290 const char *constraint = *constraint_p;
291 const char *p;
293 /* Assume the constraint doesn't allow the use of either a register
294 or memory. */
295 *allows_mem = false;
296 *allows_reg = false;
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, '+');
306 /* If the string doesn't contain an `=', issue an error
307 message. */
308 if (!p)
310 error ("output operand constraint lacks %<=%>");
311 return false;
314 /* If the constraint begins with `+', then the operand is both read
315 from and written to. */
316 *is_inout = (*p == '+');
318 /* Canonicalize the output constraint so that it begins with `='. */
319 if (p != constraint || *is_inout)
321 char *buf;
322 size_t c_len = strlen (constraint);
324 if (p != constraint)
325 warning (0, "output constraint %qc for operand %d "
326 "is not at the beginning",
327 *p, operand_num);
329 /* Make a copy of the constraint. */
330 buf = XALLOCAVEC (char, c_len + 1);
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;
342 /* Loop through the constraint string. */
343 for (p = constraint + 1; *p; p += CONSTRAINT_LEN (*p, p))
344 switch (*p)
346 case '+':
347 case '=':
348 error ("operand constraint contains incorrectly positioned "
349 "%<+%> or %<=%>");
350 return false;
352 case '%':
353 if (operand_num + 1 == ninputs + noutputs)
355 error ("%<%%%> constraint used with last operand");
356 return false;
358 break;
360 case 'V': case TARGET_MEM_CONSTRAINT: case 'o':
361 *allows_mem = true;
362 break;
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;
371 case '0': case '1': case '2': case '3': case '4':
372 case '5': case '6': case '7': case '8': case '9':
373 case '[':
374 error ("matching constraint not valid in output operand");
375 return false;
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;
384 case 'g': case 'X':
385 *allows_reg = true;
386 *allows_mem = true;
387 break;
389 case 'p': case 'r':
390 *allows_reg = true;
391 break;
393 default:
394 if (!ISALPHA (*p))
395 break;
396 if (REG_CLASS_FROM_CONSTRAINT (*p, p) != NO_REGS)
397 *allows_reg = true;
398 #ifdef EXTRA_CONSTRAINT_STR
399 else if (EXTRA_ADDRESS_CONSTRAINT (*p, p))
400 *allows_reg = true;
401 else if (EXTRA_MEMORY_CONSTRAINT (*p, p))
402 *allows_mem = true;
403 else
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;
411 #endif
412 break;
415 return true;
418 /* Similar, but for input constraints. */
420 bool
421 parse_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)
426 const char *constraint = *constraint_p;
427 const char *orig_constraint = constraint;
428 size_t c_len = strlen (constraint);
429 size_t j;
430 bool saw_match = false;
432 /* Assume the constraint doesn't allow the use of either
433 a register or memory. */
434 *allows_mem = false;
435 *allows_reg = false;
437 /* Make sure constraint has neither `=', `+', nor '&'. */
439 for (j = 0; j < c_len; j += CONSTRAINT_LEN (constraint[j], constraint+j))
440 switch (constraint[j])
442 case '+': case '=': case '&':
443 if (constraint == orig_constraint)
445 error ("input operand constraint contains %qc", constraint[j]);
446 return false;
448 break;
450 case '%':
451 if (constraint == orig_constraint
452 && input_num + 1 == ninputs - ninout)
454 error ("%<%%%> constraint used with last operand");
455 return false;
457 break;
459 case 'V': case TARGET_MEM_CONSTRAINT: case 'o':
460 *allows_mem = true;
461 break;
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;
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':
479 char *end;
480 unsigned long match;
482 saw_match = true;
484 match = strtoul (constraint + j, &end, 10);
485 if (match >= (unsigned long) noutputs)
487 error ("matching constraint references invalid operand number");
488 return false;
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] == '%')))
496 constraint = constraints[match];
497 *constraint_p = constraint;
498 c_len = strlen (constraint);
499 j = 0;
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. */
504 break;
506 else
507 j = end - constraint;
508 /* Anticipate increment at end of loop. */
509 j--;
511 /* Fall through. */
513 case 'p': case 'r':
514 *allows_reg = true;
515 break;
517 case 'g': case 'X':
518 *allows_reg = true;
519 *allows_mem = true;
520 break;
522 default:
523 if (! ISALPHA (constraint[j]))
525 error ("invalid punctuation %qc in constraint", constraint[j]);
526 return false;
528 if (REG_CLASS_FROM_CONSTRAINT (constraint[j], constraint + j)
529 != NO_REGS)
530 *allows_reg = true;
531 #ifdef EXTRA_CONSTRAINT_STR
532 else if (EXTRA_ADDRESS_CONSTRAINT (constraint[j], constraint + j))
533 *allows_reg = true;
534 else if (EXTRA_MEMORY_CONSTRAINT (constraint[j], constraint + j))
535 *allows_mem = true;
536 else
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;
544 #endif
545 break;
548 if (saw_match && !*allows_reg)
549 warning (0, "matching constraint does not allow a register");
551 return true;
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. */
557 static tree
558 decl_overlaps_hard_reg_set_p (tree *declp, int *walk_subtrees ATTRIBUTE_UNUSED,
559 void *data)
561 tree decl = *declp;
562 const HARD_REG_SET *const regs = (const HARD_REG_SET *) data;
564 if (TREE_CODE (decl) == VAR_DECL)
566 if (DECL_HARD_REGISTER (decl)
567 && REG_P (DECL_RTL (decl))
568 && REGNO (DECL_RTL (decl)) < FIRST_PSEUDO_REGISTER)
570 rtx reg = DECL_RTL (decl);
572 if (overlaps_hard_reg_set_p (*regs, GET_MODE (reg), REGNO (reg)))
573 return decl;
575 walk_subtrees = 0;
577 else if (TYPE_P (decl) || TREE_CODE (decl) == PARM_DECL)
578 walk_subtrees = 0;
579 return NULL_TREE;
582 /* If there is an overlap between *REGS and DECL, return the first overlap
583 found. */
584 tree
585 tree_overlaps_hard_reg_set (tree decl, HARD_REG_SET *regs)
587 return walk_tree (&decl, decl_overlaps_hard_reg_set_p, regs, NULL);
590 /* Check for overlap between registers marked in CLOBBERED_REGS and
591 anything inappropriate in T. Emit error and return the register
592 variable definition for error, NULL_TREE for ok. */
594 static bool
595 tree_conflicts_with_clobbers_p (tree t, HARD_REG_SET *clobbered_regs)
597 /* Conflicts between asm-declared register variables and the clobber
598 list are not allowed. */
599 tree overlap = tree_overlaps_hard_reg_set (t, clobbered_regs);
601 if (overlap)
603 error ("asm-specifier for variable %qs conflicts with asm clobber list",
604 IDENTIFIER_POINTER (DECL_NAME (overlap)));
606 /* Reset registerness to stop multiple errors emitted for a single
607 variable. */
608 DECL_REGISTER (overlap) = 0;
609 return true;
612 return false;
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
619 a tree list in TREE_PURPOSE which in turn contains a constraint
620 name in TREE_VALUE (or NULL_TREE) and a constraint string
621 in TREE_PURPOSE.
622 CLOBBERS is a list of STRING_CST nodes each naming a hard register
623 that is clobbered by this insn.
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.
630 VOL nonzero means the insn is volatile; don't optimize it. */
632 static void
633 expand_asm_operands (tree string, tree outputs, tree inputs,
634 tree clobbers, int vol, location_t locus)
636 rtvec argvec, constraintvec;
637 rtx body;
638 int ninputs = list_length (inputs);
639 int noutputs = list_length (outputs);
640 int ninout;
641 int nclobbers;
642 HARD_REG_SET clobbered_regs;
643 int clobber_conflict_found = 0;
644 tree tail;
645 tree t;
646 int i;
647 /* Vector of RTX's of evaluated output operands. */
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);
653 int old_generating_concat_p = generating_concat_p;
655 /* An ASM with no outputs needs to be treated as volatile, for now. */
656 if (noutputs == 0)
657 vol = 1;
659 if (! check_operand_nalternatives (outputs, inputs))
660 return;
662 string = resolve_asm_operand_names (string, outputs, inputs);
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)));
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 --
673 maintaining source-level compatibility means automatically clobbering
674 the flags register. */
675 clobbers = targetm.md_asm_clobbers (outputs, inputs, clobbers);
677 /* Count the number of meaningful clobbered registers, ignoring what
678 we would ignore later. */
679 nclobbers = 0;
680 CLEAR_HARD_REG_SET (clobbered_regs);
681 for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
683 const char *regname;
685 if (TREE_VALUE (tail) == error_mark_node)
686 return;
687 regname = TREE_STRING_POINTER (TREE_VALUE (tail));
689 i = decode_reg_name (regname);
690 if (i >= 0 || i == -4)
691 ++nclobbers;
692 else if (i == -2)
693 error ("unknown register name %qs in %<asm%>", regname);
695 /* Mark clobbered registers. */
696 if (i >= 0)
698 /* Clobbering the PIC register is an error. */
699 if (i == (int) PIC_OFFSET_TABLE_REGNUM)
701 error ("PIC register %qs clobbered in %<asm%>", regname);
702 return;
705 SET_HARD_REG_BIT (clobbered_regs, i);
709 /* First pass over inputs and outputs checks validity and sets
710 mark_addressable if needed. */
712 ninout = 0;
713 for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
715 tree val = TREE_VALUE (tail);
716 tree type = TREE_TYPE (val);
717 const char *constraint;
718 bool is_inout;
719 bool allows_reg;
720 bool allows_mem;
722 /* If there's an erroneous arg, emit no insn. */
723 if (type == error_mark_node)
724 return;
726 /* Try to parse the output constraint. If that fails, there's
727 no point in going further. */
728 constraint = constraints[i];
729 if (!parse_output_constraint (&constraint, i, ninputs, noutputs,
730 &allows_mem, &allows_reg, &is_inout))
731 return;
733 if (! allows_reg
734 && (allows_mem
735 || is_inout
736 || (DECL_P (val)
737 && REG_P (DECL_RTL (val))
738 && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type))))
739 lang_hooks.mark_addressable (val);
741 if (is_inout)
742 ninout++;
745 ninputs += ninout;
746 if (ninputs + noutputs > MAX_RECOG_OPERANDS)
748 error ("more than %d operands in %<asm%>", MAX_RECOG_OPERANDS);
749 return;
752 for (i = 0, tail = inputs; tail; i++, tail = TREE_CHAIN (tail))
754 bool allows_reg, allows_mem;
755 const char *constraint;
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;
762 constraint = constraints[i + noutputs];
763 if (! parse_input_constraint (&constraint, i, ninputs, noutputs, ninout,
764 constraints, &allows_mem, &allows_reg))
765 return;
767 if (! allows_reg && allows_mem)
768 lang_hooks.mark_addressable (TREE_VALUE (tail));
771 /* Second pass evaluates arguments. */
773 ninout = 0;
774 for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
776 tree val = TREE_VALUE (tail);
777 tree type = TREE_TYPE (val);
778 bool is_inout;
779 bool allows_reg;
780 bool allows_mem;
781 rtx op;
782 bool ok;
784 ok = parse_output_constraint (&constraints[i], i, ninputs,
785 noutputs, &allows_mem, &allows_reg,
786 &is_inout);
787 gcc_assert (ok);
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. */
794 generating_concat_p = 0;
796 real_output_rtx[i] = NULL_RTX;
797 if ((TREE_CODE (val) == INDIRECT_REF
798 && allows_mem)
799 || (DECL_P (val)
800 && (allows_mem || REG_P (DECL_RTL (val)))
801 && ! (REG_P (DECL_RTL (val))
802 && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type)))
803 || ! allows_reg
804 || is_inout)
806 op = expand_expr (val, NULL_RTX, VOIDmode, EXPAND_WRITE);
807 if (MEM_P (op))
808 op = validize_mem (op);
810 if (! allows_reg && !MEM_P (op))
811 error ("output number %d not directly addressable", i);
812 if ((! allows_mem && MEM_P (op))
813 || GET_CODE (op) == CONCAT)
815 real_output_rtx[i] = op;
816 op = gen_reg_rtx (GET_MODE (op));
817 if (is_inout)
818 emit_move_insn (op, real_output_rtx[i]);
821 else
823 op = assign_temp (type, 0, 0, 1);
824 op = validize_mem (op);
825 TREE_VALUE (tail) = make_tree (type, op);
827 output_rtx[i] = op;
829 generating_concat_p = old_generating_concat_p;
831 if (is_inout)
833 inout_mode[ninout] = TYPE_MODE (type);
834 inout_opnum[ninout++] = i;
837 if (tree_conflicts_with_clobbers_p (val, &clobbered_regs))
838 clobber_conflict_found = 1;
841 /* Make vectors for the expression-rtx, constraint strings,
842 and named operands. */
844 argvec = rtvec_alloc (ninputs);
845 constraintvec = rtvec_alloc (ninputs);
847 body = gen_rtx_ASM_OPERANDS ((noutputs == 0 ? VOIDmode
848 : GET_MODE (output_rtx[0])),
849 ggc_strdup (TREE_STRING_POINTER (string)),
850 empty_string, 0, argvec, constraintvec,
851 locus);
853 MEM_VOLATILE_P (body) = vol;
855 /* Eval the inputs and put them into ARGVEC.
856 Put their constraints into ASM_INPUTs and store in CONSTRAINTS. */
858 for (i = 0, tail = inputs; tail; tail = TREE_CHAIN (tail), ++i)
860 bool allows_reg, allows_mem;
861 const char *constraint;
862 tree val, type;
863 rtx op;
864 bool ok;
866 constraint = constraints[i + noutputs];
867 ok = parse_input_constraint (&constraint, i, ninputs, noutputs, ninout,
868 constraints, &allows_mem, &allows_reg);
869 gcc_assert (ok);
871 generating_concat_p = 0;
873 val = TREE_VALUE (tail);
874 type = TREE_TYPE (val);
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. */
878 op = expand_expr (val, NULL_RTX, VOIDmode,
879 allows_reg ? EXPAND_NORMAL
880 : allows_mem ? EXPAND_MEMORY
881 : EXPAND_INITIALIZER);
883 /* Never pass a CONCAT to an ASM. */
884 if (GET_CODE (op) == CONCAT)
885 op = force_reg (GET_MODE (op), op);
886 else if (MEM_P (op))
887 op = validize_mem (op);
889 if (asm_operand_ok (op, constraint) <= 0)
891 if (allows_reg && TYPE_MODE (type) != BLKmode)
892 op = force_reg (TYPE_MODE (type), op);
893 else if (!allows_mem)
894 warning (0, "asm operand %d probably doesn%'t match constraints",
895 i + noutputs);
896 else if (MEM_P (op))
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. */
902 else
904 warning (0, "use of memory input without lvalue in "
905 "asm operand %d is deprecated", i + noutputs);
907 if (CONSTANT_P (op))
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);
915 if (REG_P (op)
916 || GET_CODE (op) == SUBREG
917 || GET_CODE (op) == CONCAT)
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;
930 generating_concat_p = old_generating_concat_p;
931 ASM_OPERANDS_INPUT (body, i) = op;
933 ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, i)
934 = gen_rtx_ASM_INPUT (TYPE_MODE (type),
935 ggc_strdup (constraints[i + noutputs]));
937 if (tree_conflicts_with_clobbers_p (val, &clobbered_regs))
938 clobber_conflict_found = 1;
941 /* Protect all the operands from the queue now that they have all been
942 evaluated. */
944 generating_concat_p = 0;
946 /* For in-out operands, copy output rtx to input rtx. */
947 for (i = 0; i < ninout; i++)
949 int j = inout_opnum[i];
950 char buffer[16];
952 ASM_OPERANDS_INPUT (body, ninputs - ninout + i)
953 = output_rtx[j];
955 sprintf (buffer, "%d", j);
956 ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, ninputs - ninout + i)
957 = gen_rtx_ASM_INPUT (inout_mode[i], ggc_strdup (buffer));
960 generating_concat_p = old_generating_concat_p;
962 /* Now, for each output, construct an rtx
963 (set OUTPUT (asm_operands INSN OUTPUTCONSTRAINT OUTPUTNUMBER
964 ARGVEC CONSTRAINTS OPNAMES))
965 If there is more than one, put them inside a PARALLEL. */
967 if (noutputs == 1 && nclobbers == 0)
969 ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = ggc_strdup (constraints[0]);
970 emit_insn (gen_rtx_SET (VOIDmode, output_rtx[0], body));
973 else if (noutputs == 0 && nclobbers == 0)
975 /* No output operands: put in a raw ASM_OPERANDS rtx. */
976 emit_insn (body);
979 else
981 rtx obody = body;
982 int num = noutputs;
984 if (num == 0)
985 num = 1;
987 body = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (num + nclobbers));
989 /* For each output operand, store a SET. */
990 for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
992 XVECEXP (body, 0, i)
993 = gen_rtx_SET (VOIDmode,
994 output_rtx[i],
995 gen_rtx_ASM_OPERANDS
996 (GET_MODE (output_rtx[i]),
997 ggc_strdup (TREE_STRING_POINTER (string)),
998 ggc_strdup (constraints[i]),
999 i, argvec, constraintvec, locus));
1001 MEM_VOLATILE_P (SET_SRC (XVECEXP (body, 0, i))) = vol;
1004 /* If there are no outputs (but there are some clobbers)
1005 store the bare ASM_OPERANDS into the PARALLEL. */
1007 if (i == 0)
1008 XVECEXP (body, 0, i++) = obody;
1010 /* Store (clobber REG) for each clobbered register specified. */
1012 for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
1014 const char *regname = TREE_STRING_POINTER (TREE_VALUE (tail));
1015 int j = decode_reg_name (regname);
1016 rtx clobbered_reg;
1018 if (j < 0)
1020 if (j == -3) /* `cc', which is not a register */
1021 continue;
1023 if (j == -4) /* `memory', don't cache memory across asm */
1025 XVECEXP (body, 0, i++)
1026 = gen_rtx_CLOBBER (VOIDmode,
1027 gen_rtx_MEM
1028 (BLKmode,
1029 gen_rtx_SCRATCH (VOIDmode)));
1030 continue;
1033 /* Ignore unknown register, error already signaled. */
1034 continue;
1037 /* Use QImode since that's guaranteed to clobber just one reg. */
1038 clobbered_reg = gen_rtx_REG (QImode, j);
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)
1045 int opno;
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");
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");
1059 XVECEXP (body, 0, i++)
1060 = gen_rtx_CLOBBER (VOIDmode, clobbered_reg);
1063 emit_insn (body);
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]);
1072 crtl->has_asm_statement = 1;
1073 free_temp_slots ();
1076 void
1077 expand_asm_expr (tree exp)
1079 int noutputs, i;
1080 tree outputs, tail;
1081 tree *o;
1083 if (ASM_INPUT_P (exp))
1085 expand_asm_loc (ASM_STRING (exp), ASM_VOLATILE_P (exp), input_location);
1086 return;
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));
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);
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);
1104 /* Copy all the intermediate outputs into the specified outputs. */
1105 for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
1107 if (o[i] != TREE_VALUE (tail))
1109 expand_assignment (o[i], TREE_VALUE (tail), false);
1110 free_temp_slots ();
1112 /* Restore the original value so that it's correct the next
1113 time we expand this function. */
1114 TREE_VALUE (tail) = o[i];
1119 /* A subroutine of expand_asm_operands. Check that all operands have
1120 the same number of alternatives. Return true if so. */
1122 static bool
1123 check_operand_nalternatives (tree outputs, tree inputs)
1125 if (outputs || inputs)
1127 tree tmp = TREE_PURPOSE (outputs ? outputs : inputs);
1128 int nalternatives
1129 = n_occurrences (',', TREE_STRING_POINTER (TREE_VALUE (tmp)));
1130 tree next = inputs;
1132 if (nalternatives + 1 > MAX_RECOG_ALTERNATIVES)
1134 error ("too many alternatives in %<asm%>");
1135 return false;
1138 tmp = outputs;
1139 while (tmp)
1141 const char *constraint
1142 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tmp)));
1144 if (n_occurrences (',', constraint) != nalternatives)
1146 error ("operand constraints for %<asm%> differ "
1147 "in number of alternatives");
1148 return false;
1151 if (TREE_CHAIN (tmp))
1152 tmp = TREE_CHAIN (tmp);
1153 else
1154 tmp = next, next = 0;
1158 return true;
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. */
1166 static bool
1167 check_unique_operand_names (tree outputs, tree inputs)
1169 tree i, j;
1171 for (i = outputs; i ; i = TREE_CHAIN (i))
1173 tree i_name = TREE_PURPOSE (TREE_PURPOSE (i));
1174 if (! i_name)
1175 continue;
1177 for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
1178 if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
1179 goto failure;
1182 for (i = inputs; i ; i = TREE_CHAIN (i))
1184 tree i_name = TREE_PURPOSE (TREE_PURPOSE (i));
1185 if (! i_name)
1186 continue;
1188 for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
1189 if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
1190 goto failure;
1191 for (j = outputs; j ; j = TREE_CHAIN (j))
1192 if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
1193 goto failure;
1196 return true;
1198 failure:
1199 error ("duplicate asm operand name %qs",
1200 TREE_STRING_POINTER (TREE_PURPOSE (TREE_PURPOSE (i))));
1201 return false;
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. */
1208 tree
1209 resolve_asm_operand_names (tree string, tree outputs, tree inputs)
1211 char *buffer;
1212 char *p;
1213 const char *c;
1214 tree t;
1216 check_unique_operand_names (outputs, inputs);
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))
1222 c = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
1223 if (strchr (c, '[') != NULL)
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);
1234 /* Now check for any needed substitutions in the template. */
1235 c = TREE_STRING_POINTER (string);
1236 while ((c = strchr (c, '%')) != NULL)
1238 if (c[1] == '[')
1239 break;
1240 else if (ISALPHA (c[1]) && c[2] == '[')
1241 break;
1242 else
1244 c += 1;
1245 continue;
1249 if (c)
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));
1258 while ((p = strchr (p, '%')) != NULL)
1260 if (p[1] == '[')
1261 p += 1;
1262 else if (ISALPHA (p[1]) && p[2] == '[')
1263 p += 2;
1264 else
1266 p += 1;
1267 continue;
1270 p = resolve_operand_name_1 (p, outputs, inputs);
1273 string = build_string (strlen (buffer), buffer);
1274 free (buffer);
1277 return string;
1280 /* A subroutine of resolve_operand_names. P points to the '[' for a
1281 potential named operand of the form [<name>]. In place, replace
1282 the name and brackets with a number. Return a pointer to the
1283 balance of the string after substitution. */
1285 static char *
1286 resolve_operand_name_1 (char *p, tree outputs, tree inputs)
1288 char *q;
1289 int op;
1290 tree t;
1291 size_t len;
1293 /* Collect the operand name. */
1294 q = strchr (p, ']');
1295 if (!q)
1297 error ("missing close brace for named operand");
1298 return strchr (p, '\0');
1300 len = q - p - 1;
1302 /* Resolve the name to a number. */
1303 for (op = 0, t = outputs; t ; t = TREE_CHAIN (t), op++)
1305 tree name = TREE_PURPOSE (TREE_PURPOSE (t));
1306 if (name)
1308 const char *c = TREE_STRING_POINTER (name);
1309 if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
1310 goto found;
1313 for (t = inputs; t ; t = TREE_CHAIN (t), op++)
1315 tree name = TREE_PURPOSE (TREE_PURPOSE (t));
1316 if (name)
1318 const char *c = TREE_STRING_POINTER (name);
1319 if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
1320 goto found;
1324 *q = '\0';
1325 error ("undefined named operand %qs", p + 1);
1326 op = 0;
1327 found:
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');
1335 /* Verify the no extra buffer space assumption. */
1336 gcc_assert (p <= q);
1338 /* Shift the rest of the buffer down to fill the gap. */
1339 memmove (p, q + 1, strlen (q + 1) + 1);
1341 return p;
1344 /* Generate RTL to evaluate the expression EXP. */
1346 void
1347 expand_expr_stmt (tree exp)
1349 rtx value;
1350 tree type;
1352 value = expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL);
1353 type = TREE_TYPE (exp);
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. */
1357 if (value && MEM_P (value) && TREE_THIS_VOLATILE (exp))
1359 if (TYPE_MODE (type) == VOIDmode)
1361 else if (TYPE_MODE (type) != BLKmode)
1362 value = copy_to_reg (value);
1363 else
1365 rtx lab = gen_label_rtx ();
1367 /* Compare the value with itself to reference it. */
1368 emit_cmp_and_jump_insns (value, value, EQ,
1369 expand_normal (TYPE_SIZE (type)),
1370 BLKmode, 0, lab);
1371 emit_label (lab);
1375 /* Free any temporaries used to evaluate this expression. */
1376 free_temp_slots ();
1379 /* Warn if EXP contains any computations whose results are not used.
1380 Return 1 if a warning is printed; 0 otherwise. LOCUS is the
1381 (potential) location of the expression. */
1384 warn_if_unused_value (const_tree exp, location_t locus)
1386 restart:
1387 if (TREE_USED (exp) || TREE_NO_WARNING (exp))
1388 return 0;
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;
1396 if (EXPR_HAS_LOCATION (exp))
1397 locus = EXPR_LOCATION (exp);
1399 switch (TREE_CODE (exp))
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:
1409 case TRY_CATCH_EXPR:
1410 case WITH_CLEANUP_EXPR:
1411 case EXIT_EXPR:
1412 case VA_ARG_EXPR:
1413 return 0;
1415 case BIND_EXPR:
1416 /* For a binding, warn if no side effect within it. */
1417 exp = BIND_EXPR_BODY (exp);
1418 goto restart;
1420 case SAVE_EXPR:
1421 exp = TREE_OPERAND (exp, 0);
1422 goto restart;
1424 case TRUTH_ORIF_EXPR:
1425 case TRUTH_ANDIF_EXPR:
1426 /* In && or ||, warn if 2nd operand has no side effect. */
1427 exp = TREE_OPERAND (exp, 1);
1428 goto restart;
1430 case COMPOUND_EXPR:
1431 if (warn_if_unused_value (TREE_OPERAND (exp, 0), locus))
1432 return 1;
1433 /* Let people do `(foo (), 0)' without a warning. */
1434 if (TREE_CONSTANT (TREE_OPERAND (exp, 1)))
1435 return 0;
1436 exp = TREE_OPERAND (exp, 1);
1437 goto restart;
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))
1443 return 0;
1444 goto warn;
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)
1451 exp = TREE_OPERAND (exp, 0);
1452 goto restart;
1454 /* Fall through. */
1456 default:
1457 /* Referencing a volatile value is a side effect, so don't warn. */
1458 if ((DECL_P (exp) || REFERENCE_CLASS_P (exp))
1459 && TREE_THIS_VOLATILE (exp))
1460 return 0;
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. */
1465 if (EXPRESSION_CLASS_P (exp) && TREE_OPERAND_LENGTH (exp) == 0)
1466 return 0;
1468 warn:
1469 warning (OPT_Wunused_value, "%Hvalue computed is not used", &locus);
1470 return 1;
1475 /* Generate RTL to return from the current function, with no value.
1476 (That is, we do not do anything about returning any value.) */
1478 void
1479 expand_null_return (void)
1481 /* If this function was declared to return a value, but we
1482 didn't, clobber the return registers so that they are not
1483 propagated live to the rest of the function. */
1484 clobber_return_register ();
1486 expand_null_return_1 ();
1489 /* Generate RTL to return directly from the current function.
1490 (That is, we bypass any return value.) */
1492 void
1493 expand_naked_return (void)
1495 rtx end_label;
1497 clear_pending_stack_adjust ();
1498 do_pending_stack_adjust ();
1500 end_label = naked_return_label;
1501 if (end_label == 0)
1502 end_label = naked_return_label = gen_label_rtx ();
1504 emit_jump (end_label);
1507 /* Generate RTL to return from the current function, with value VAL. */
1509 static void
1510 expand_value_return (rtx val)
1512 /* Copy the value to the return location
1513 unless it's already there. */
1515 rtx return_reg = DECL_RTL (DECL_RESULT (current_function_decl));
1516 if (return_reg != val)
1518 tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
1519 if (targetm.calls.promote_function_return (TREE_TYPE (current_function_decl)))
1521 int unsignedp = TYPE_UNSIGNED (type);
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);
1527 if (mode != old_mode)
1528 val = convert_modes (mode, old_mode, val, unsignedp);
1530 if (GET_CODE (return_reg) == PARALLEL)
1531 emit_group_load (return_reg, val, type, int_size_in_bytes (type));
1532 else
1533 emit_move_insn (return_reg, val);
1536 expand_null_return_1 ();
1539 /* Output a return with no value. */
1541 static void
1542 expand_null_return_1 (void)
1544 clear_pending_stack_adjust ();
1545 do_pending_stack_adjust ();
1546 emit_jump (return_label);
1549 /* Generate RTL to evaluate the expression RETVAL and return it
1550 from the current function. */
1552 void
1553 expand_return (tree retval)
1555 rtx result_rtl;
1556 rtx val = 0;
1557 tree retval_rhs;
1559 /* If function wants no value, give it none. */
1560 if (TREE_CODE (TREE_TYPE (TREE_TYPE (current_function_decl))) == VOID_TYPE)
1562 expand_normal (retval);
1563 expand_null_return ();
1564 return;
1567 if (retval == error_mark_node)
1569 /* Treat this like a return of no value from a function that
1570 returns a value. */
1571 expand_null_return ();
1572 return;
1574 else if ((TREE_CODE (retval) == MODIFY_EXPR
1575 || TREE_CODE (retval) == INIT_EXPR)
1576 && TREE_CODE (TREE_OPERAND (retval, 0)) == RESULT_DECL)
1577 retval_rhs = TREE_OPERAND (retval, 1);
1578 else
1579 retval_rhs = retval;
1581 result_rtl = DECL_RTL (DECL_RESULT (current_function_decl));
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);
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
1593 (and in expand_call). */
1595 else if (retval_rhs != 0
1596 && TYPE_MODE (TREE_TYPE (retval_rhs)) == BLKmode
1597 && REG_P (result_rtl))
1599 int i;
1600 unsigned HOST_WIDE_INT bitpos, xbitpos;
1601 unsigned HOST_WIDE_INT padding_correction = 0;
1602 unsigned HOST_WIDE_INT bytes
1603 = int_size_in_bytes (TREE_TYPE (retval_rhs));
1604 int n_regs = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
1605 unsigned int bitsize
1606 = MIN (TYPE_ALIGN (TREE_TYPE (retval_rhs)), BITS_PER_WORD);
1607 rtx *result_pseudos = XALLOCAVEC (rtx, n_regs);
1608 rtx result_reg, src = NULL_RTX, dst = NULL_RTX;
1609 rtx result_val = expand_normal (retval_rhs);
1610 enum machine_mode tmpmode, result_reg_mode;
1612 if (bytes == 0)
1614 expand_null_return ();
1615 return;
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.
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));
1635 /* Copy the structure BITSIZE bits at a time. */
1636 for (bitpos = 0, xbitpos = padding_correction;
1637 bitpos < bytes * BITS_PER_UNIT;
1638 bitpos += bitsize, xbitpos += bitsize)
1640 /* We need a new destination pseudo each time xbitpos is
1641 on a word boundary and when xbitpos == padding_correction
1642 (the first time through). */
1643 if (xbitpos % BITS_PER_WORD == 0
1644 || xbitpos == padding_correction)
1646 /* Generate an appropriate register. */
1647 dst = gen_reg_rtx (word_mode);
1648 result_pseudos[xbitpos / BITS_PER_WORD] = dst;
1650 /* Clear the destination before we move anything into it. */
1651 emit_move_insn (dst, CONST0_RTX (GET_MODE (dst)));
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);
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,
1666 NULL_RTX, word_mode, word_mode));
1669 tmpmode = GET_MODE (result_rtl);
1670 if (tmpmode == BLKmode)
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;
1682 /* A suitable mode should have been found. */
1683 gcc_assert (tmpmode != VOIDmode);
1685 PUT_MODE (result_rtl, tmpmode);
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);
1694 for (i = 0; i < n_regs; i++)
1695 emit_move_insn (operand_subword (result_reg, i, 0, result_reg_mode),
1696 result_pseudos[i]);
1698 if (tmpmode != result_reg_mode)
1699 result_reg = gen_lowpart (tmpmode, result_reg);
1701 expand_value_return (result_reg);
1703 else if (retval_rhs != 0
1704 && !VOID_TYPE_P (TREE_TYPE (retval_rhs))
1705 && (REG_P (result_rtl)
1706 || (GET_CODE (result_rtl) == PARALLEL)))
1708 /* Calculate the return value into a temporary (usually a pseudo
1709 reg). */
1710 tree ot = TREE_TYPE (DECL_RESULT (current_function_decl));
1711 tree nt = build_qualified_type (ot, TYPE_QUALS (ot) | TYPE_QUAL_CONST);
1713 val = assign_temp (nt, 0, 0, 1);
1714 val = expand_expr (retval_rhs, val, GET_MODE (val), EXPAND_NORMAL);
1715 val = force_not_mem (val);
1716 /* Return the calculated value. */
1717 expand_value_return (val);
1719 else
1721 /* No hard reg used; calculate value into hard return reg. */
1722 expand_expr (retval, const0_rtx, VOIDmode, EXPAND_NORMAL);
1723 expand_value_return (result_rtl);
1727 /* Given a pointer to a BLOCK node return nonzero if (and only if) the node
1728 in question represents the outermost pair of curly braces (i.e. the "body
1729 block") of a function or method.
1731 For any BLOCK node representing a "body block" of a function or method, the
1732 BLOCK_SUPERCONTEXT of the node will point to another BLOCK node which
1733 represents the outermost (function) scope for the function or method (i.e.
1734 the one which includes the formal parameters). The BLOCK_SUPERCONTEXT of
1735 *that* node in turn will point to the relevant FUNCTION_DECL node. */
1738 is_body_block (const_tree stmt)
1740 if (lang_hooks.no_body_blocks)
1741 return 0;
1743 if (TREE_CODE (stmt) == BLOCK)
1745 tree parent = BLOCK_SUPERCONTEXT (stmt);
1747 if (parent && TREE_CODE (parent) == BLOCK)
1749 tree grandparent = BLOCK_SUPERCONTEXT (parent);
1751 if (grandparent && TREE_CODE (grandparent) == FUNCTION_DECL)
1752 return 1;
1756 return 0;
1759 /* Emit code to restore vital registers at the beginning of a nonlocal goto
1760 handler. */
1761 static void
1762 expand_nl_goto_receiver (void)
1764 /* Clobber the FP when we get here, so we have to make sure it's
1765 marked as used by this function. */
1766 emit_use (hard_frame_pointer_rtx);
1768 /* Mark the static chain as clobbered here so life information
1769 doesn't get messed up for it. */
1770 emit_clobber (static_chain_rtx);
1772 #ifdef HAVE_nonlocal_goto
1773 if (! HAVE_nonlocal_goto)
1774 #endif
1775 /* First adjust our frame pointer to its actual value. It was
1776 previously set to the start of the virtual area corresponding to
1777 the stacked variables when we branched here and now needs to be
1778 adjusted to the actual hardware fp value.
1780 Assignments are to virtual registers are converted by
1781 instantiate_virtual_regs into the corresponding assignment
1782 to the underlying register (fp in this case) that makes
1783 the original assignment true.
1784 So the following insn will actually be
1785 decrementing fp by STARTING_FRAME_OFFSET. */
1786 emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
1788 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
1789 if (fixed_regs[ARG_POINTER_REGNUM])
1791 #ifdef ELIMINABLE_REGS
1792 /* If the argument pointer can be eliminated in favor of the
1793 frame pointer, we don't need to restore it. We assume here
1794 that if such an elimination is present, it can always be used.
1795 This is the case on all known machines; if we don't make this
1796 assumption, we do unnecessary saving on many machines. */
1797 static const struct elims {const int from, to;} elim_regs[] = ELIMINABLE_REGS;
1798 size_t i;
1800 for (i = 0; i < ARRAY_SIZE (elim_regs); i++)
1801 if (elim_regs[i].from == ARG_POINTER_REGNUM
1802 && elim_regs[i].to == HARD_FRAME_POINTER_REGNUM)
1803 break;
1805 if (i == ARRAY_SIZE (elim_regs))
1806 #endif
1808 /* Now restore our arg pointer from the address at which it
1809 was saved in our stack frame. */
1810 emit_move_insn (crtl->args.internal_arg_pointer,
1811 copy_to_reg (get_arg_pointer_save_area ()));
1814 #endif
1816 #ifdef HAVE_nonlocal_goto_receiver
1817 if (HAVE_nonlocal_goto_receiver)
1818 emit_insn (gen_nonlocal_goto_receiver ());
1819 #endif
1821 /* We must not allow the code we just generated to be reordered by
1822 scheduling. Specifically, the update of the frame pointer must
1823 happen immediately, not later. */
1824 emit_insn (gen_blockage ());
1827 /* Generate RTL for the automatic variable declaration DECL.
1828 (Other kinds of declarations are simply ignored if seen here.) */
1830 void
1831 expand_decl (tree decl)
1833 tree type;
1835 type = TREE_TYPE (decl);
1837 /* For a CONST_DECL, set mode, alignment, and sizes from those of the
1838 type in case this node is used in a reference. */
1839 if (TREE_CODE (decl) == CONST_DECL)
1841 DECL_MODE (decl) = TYPE_MODE (type);
1842 DECL_ALIGN (decl) = TYPE_ALIGN (type);
1843 DECL_SIZE (decl) = TYPE_SIZE (type);
1844 DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (type);
1845 return;
1848 /* Otherwise, only automatic variables need any expansion done. Static and
1849 external variables, and external functions, will be handled by
1850 `assemble_variable' (called from finish_decl). TYPE_DECL requires
1851 nothing. PARM_DECLs are handled in `assign_parms'. */
1852 if (TREE_CODE (decl) != VAR_DECL)
1853 return;
1855 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
1856 return;
1858 /* Create the RTL representation for the variable. */
1860 if (type == error_mark_node)
1861 SET_DECL_RTL (decl, gen_rtx_MEM (BLKmode, const0_rtx));
1863 else if (DECL_SIZE (decl) == 0)
1865 /* Variable with incomplete type. */
1866 rtx x;
1867 if (DECL_INITIAL (decl) == 0)
1868 /* Error message was already done; now avoid a crash. */
1869 x = gen_rtx_MEM (BLKmode, const0_rtx);
1870 else
1871 /* An initializer is going to decide the size of this array.
1872 Until we know the size, represent its address with a reg. */
1873 x = gen_rtx_MEM (BLKmode, gen_reg_rtx (Pmode));
1875 set_mem_attributes (x, decl, 1);
1876 SET_DECL_RTL (decl, x);
1878 else if (use_register_for_decl (decl))
1880 /* Automatic variable that can go in a register. */
1881 int unsignedp = TYPE_UNSIGNED (type);
1882 enum machine_mode reg_mode
1883 = promote_mode (type, DECL_MODE (decl), &unsignedp, 0);
1885 SET_DECL_RTL (decl, gen_reg_rtx (reg_mode));
1887 /* Note if the object is a user variable. */
1888 if (!DECL_ARTIFICIAL (decl))
1889 mark_user_reg (DECL_RTL (decl));
1891 if (POINTER_TYPE_P (type))
1892 mark_reg_pointer (DECL_RTL (decl),
1893 TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
1896 else
1898 rtx oldaddr = 0;
1899 rtx addr;
1900 rtx x;
1902 /* Variable-sized decls are dealt with in the gimplifier. */
1903 gcc_assert (TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST);
1905 /* If we previously made RTL for this decl, it must be an array
1906 whose size was determined by the initializer.
1907 The old address was a register; set that register now
1908 to the proper address. */
1909 if (DECL_RTL_SET_P (decl))
1911 gcc_assert (MEM_P (DECL_RTL (decl)));
1912 gcc_assert (REG_P (XEXP (DECL_RTL (decl), 0)));
1913 oldaddr = XEXP (DECL_RTL (decl), 0);
1916 /* Set alignment we actually gave this decl. */
1917 DECL_ALIGN (decl) = (DECL_MODE (decl) == BLKmode ? BIGGEST_ALIGNMENT
1918 : GET_MODE_BITSIZE (DECL_MODE (decl)));
1919 DECL_USER_ALIGN (decl) = 0;
1921 x = assign_temp (decl, 1, 1, 1);
1922 set_mem_attributes (x, decl, 1);
1923 SET_DECL_RTL (decl, x);
1925 if (oldaddr)
1927 addr = force_operand (XEXP (DECL_RTL (decl), 0), oldaddr);
1928 if (addr != oldaddr)
1929 emit_move_insn (oldaddr, addr);
1934 /* Emit code to save the current value of stack. */
1936 expand_stack_save (void)
1938 rtx ret = NULL_RTX;
1940 do_pending_stack_adjust ();
1941 emit_stack_save (SAVE_BLOCK, &ret, NULL_RTX);
1942 return ret;
1945 /* Emit code to restore the current value of stack. */
1946 void
1947 expand_stack_restore (tree var)
1949 rtx sa = expand_normal (var);
1951 sa = convert_memory_address (Pmode, sa);
1952 emit_stack_restore (SAVE_BLOCK, sa, NULL_RTX);
1955 /* Do the insertion of a case label into case_list. The labels are
1956 fed to us in descending order from the sorted vector of case labels used
1957 in the tree part of the middle end. So the list we construct is
1958 sorted in ascending order. The bounds on the case range, LOW and HIGH,
1959 are converted to case's index type TYPE. */
1961 static struct case_node *
1962 add_case_node (struct case_node *head, tree type, tree low, tree high,
1963 tree label, alloc_pool case_node_pool)
1965 tree min_value, max_value;
1966 struct case_node *r;
1968 gcc_assert (TREE_CODE (low) == INTEGER_CST);
1969 gcc_assert (!high || TREE_CODE (high) == INTEGER_CST);
1971 min_value = TYPE_MIN_VALUE (type);
1972 max_value = TYPE_MAX_VALUE (type);
1974 /* If there's no HIGH value, then this is not a case range; it's
1975 just a simple case label. But that's just a degenerate case
1976 range.
1977 If the bounds are equal, turn this into the one-value case. */
1978 if (!high || tree_int_cst_equal (low, high))
1980 /* If the simple case value is unreachable, ignore it. */
1981 if ((TREE_CODE (min_value) == INTEGER_CST
1982 && tree_int_cst_compare (low, min_value) < 0)
1983 || (TREE_CODE (max_value) == INTEGER_CST
1984 && tree_int_cst_compare (low, max_value) > 0))
1985 return head;
1986 low = fold_convert (type, low);
1987 high = low;
1989 else
1991 /* If the entire case range is unreachable, ignore it. */
1992 if ((TREE_CODE (min_value) == INTEGER_CST
1993 && tree_int_cst_compare (high, min_value) < 0)
1994 || (TREE_CODE (max_value) == INTEGER_CST
1995 && tree_int_cst_compare (low, max_value) > 0))
1996 return head;
1998 /* If the lower bound is less than the index type's minimum
1999 value, truncate the range bounds. */
2000 if (TREE_CODE (min_value) == INTEGER_CST
2001 && tree_int_cst_compare (low, min_value) < 0)
2002 low = min_value;
2003 low = fold_convert (type, low);
2005 /* If the upper bound is greater than the index type's maximum
2006 value, truncate the range bounds. */
2007 if (TREE_CODE (max_value) == INTEGER_CST
2008 && tree_int_cst_compare (high, max_value) > 0)
2009 high = max_value;
2010 high = fold_convert (type, high);
2014 /* Add this label to the chain. Make sure to drop overflow flags. */
2015 r = (struct case_node *) pool_alloc (case_node_pool);
2016 r->low = build_int_cst_wide (TREE_TYPE (low), TREE_INT_CST_LOW (low),
2017 TREE_INT_CST_HIGH (low));
2018 r->high = build_int_cst_wide (TREE_TYPE (high), TREE_INT_CST_LOW (high),
2019 TREE_INT_CST_HIGH (high));
2020 r->code_label = label;
2021 r->parent = r->left = NULL;
2022 r->right = head;
2023 return r;
2026 /* Maximum number of case bit tests. */
2027 #define MAX_CASE_BIT_TESTS 3
2029 /* By default, enable case bit tests on targets with ashlsi3. */
2030 #ifndef CASE_USE_BIT_TESTS
2031 #define CASE_USE_BIT_TESTS (optab_handler (ashl_optab, word_mode)->insn_code \
2032 != CODE_FOR_nothing)
2033 #endif
2036 /* A case_bit_test represents a set of case nodes that may be
2037 selected from using a bit-wise comparison. HI and LO hold
2038 the integer to be tested against, LABEL contains the label
2039 to jump to upon success and BITS counts the number of case
2040 nodes handled by this test, typically the number of bits
2041 set in HI:LO. */
2043 struct case_bit_test
2045 HOST_WIDE_INT hi;
2046 HOST_WIDE_INT lo;
2047 rtx label;
2048 int bits;
2051 /* Determine whether "1 << x" is relatively cheap in word_mode. */
2053 static
2054 bool lshift_cheap_p (void)
2056 static bool init = false;
2057 static bool cheap = true;
2059 if (!init)
2061 rtx reg = gen_rtx_REG (word_mode, 10000);
2062 int cost = rtx_cost (gen_rtx_ASHIFT (word_mode, const1_rtx, reg), SET,
2063 optimize_insn_for_speed_p ());
2064 cheap = cost < COSTS_N_INSNS (3);
2065 init = true;
2068 return cheap;
2071 /* Comparison function for qsort to order bit tests by decreasing
2072 number of case nodes, i.e. the node with the most cases gets
2073 tested first. */
2075 static int
2076 case_bit_test_cmp (const void *p1, const void *p2)
2078 const struct case_bit_test *const d1 = (const struct case_bit_test *) p1;
2079 const struct case_bit_test *const d2 = (const struct case_bit_test *) p2;
2081 if (d2->bits != d1->bits)
2082 return d2->bits - d1->bits;
2084 /* Stabilize the sort. */
2085 return CODE_LABEL_NUMBER (d2->label) - CODE_LABEL_NUMBER (d1->label);
2088 /* Expand a switch statement by a short sequence of bit-wise
2089 comparisons. "switch(x)" is effectively converted into
2090 "if ((1 << (x-MINVAL)) & CST)" where CST and MINVAL are
2091 integer constants.
2093 INDEX_EXPR is the value being switched on, which is of
2094 type INDEX_TYPE. MINVAL is the lowest case value of in
2095 the case nodes, of INDEX_TYPE type, and RANGE is highest
2096 value minus MINVAL, also of type INDEX_TYPE. NODES is
2097 the set of case nodes, and DEFAULT_LABEL is the label to
2098 branch to should none of the cases match.
2100 There *MUST* be MAX_CASE_BIT_TESTS or less unique case
2101 node targets. */
2103 static void
2104 emit_case_bit_tests (tree index_type, tree index_expr, tree minval,
2105 tree range, case_node_ptr nodes, rtx default_label)
2107 struct case_bit_test test[MAX_CASE_BIT_TESTS];
2108 enum machine_mode mode;
2109 rtx expr, index, label;
2110 unsigned int i,j,lo,hi;
2111 struct case_node *n;
2112 unsigned int count;
2114 count = 0;
2115 for (n = nodes; n; n = n->right)
2117 label = label_rtx (n->code_label);
2118 for (i = 0; i < count; i++)
2119 if (label == test[i].label)
2120 break;
2122 if (i == count)
2124 gcc_assert (count < MAX_CASE_BIT_TESTS);
2125 test[i].hi = 0;
2126 test[i].lo = 0;
2127 test[i].label = label;
2128 test[i].bits = 1;
2129 count++;
2131 else
2132 test[i].bits++;
2134 lo = tree_low_cst (fold_build2 (MINUS_EXPR, index_type,
2135 n->low, minval), 1);
2136 hi = tree_low_cst (fold_build2 (MINUS_EXPR, index_type,
2137 n->high, minval), 1);
2138 for (j = lo; j <= hi; j++)
2139 if (j >= HOST_BITS_PER_WIDE_INT)
2140 test[i].hi |= (HOST_WIDE_INT) 1 << (j - HOST_BITS_PER_INT);
2141 else
2142 test[i].lo |= (HOST_WIDE_INT) 1 << j;
2145 qsort (test, count, sizeof(*test), case_bit_test_cmp);
2147 index_expr = fold_build2 (MINUS_EXPR, index_type,
2148 fold_convert (index_type, index_expr),
2149 fold_convert (index_type, minval));
2150 index = expand_normal (index_expr);
2151 do_pending_stack_adjust ();
2153 mode = TYPE_MODE (index_type);
2154 expr = expand_normal (range);
2155 if (default_label)
2156 emit_cmp_and_jump_insns (index, expr, GTU, NULL_RTX, mode, 1,
2157 default_label);
2159 index = convert_to_mode (word_mode, index, 0);
2160 index = expand_binop (word_mode, ashl_optab, const1_rtx,
2161 index, NULL_RTX, 1, OPTAB_WIDEN);
2163 for (i = 0; i < count; i++)
2165 expr = immed_double_const (test[i].lo, test[i].hi, word_mode);
2166 expr = expand_binop (word_mode, and_optab, index, expr,
2167 NULL_RTX, 1, OPTAB_WIDEN);
2168 emit_cmp_and_jump_insns (expr, const0_rtx, NE, NULL_RTX,
2169 word_mode, 1, test[i].label);
2172 if (default_label)
2173 emit_jump (default_label);
2176 #ifndef HAVE_casesi
2177 #define HAVE_casesi 0
2178 #endif
2180 #ifndef HAVE_tablejump
2181 #define HAVE_tablejump 0
2182 #endif
2184 /* Terminate a case (Pascal/Ada) or switch (C) statement
2185 in which ORIG_INDEX is the expression to be tested.
2186 If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
2187 type as given in the source before any compiler conversions.
2188 Generate the code to test it and jump to the right place. */
2190 void
2191 expand_case (tree exp)
2193 tree minval = NULL_TREE, maxval = NULL_TREE, range = NULL_TREE;
2194 rtx default_label = 0;
2195 struct case_node *n;
2196 unsigned int count, uniq;
2197 rtx index;
2198 rtx table_label;
2199 int ncases;
2200 rtx *labelvec;
2201 int i;
2202 rtx before_case, end, lab;
2204 tree vec = SWITCH_LABELS (exp);
2205 tree orig_type = TREE_TYPE (exp);
2206 tree index_expr = SWITCH_COND (exp);
2207 tree index_type = TREE_TYPE (index_expr);
2208 int unsignedp = TYPE_UNSIGNED (index_type);
2210 /* The insn after which the case dispatch should finally
2211 be emitted. Zero for a dummy. */
2212 rtx start;
2214 /* A list of case labels; it is first built as a list and it may then
2215 be rearranged into a nearly balanced binary tree. */
2216 struct case_node *case_list = 0;
2218 /* Label to jump to if no case matches. */
2219 tree default_label_decl = NULL_TREE;
2221 alloc_pool case_node_pool = create_alloc_pool ("struct case_node pool",
2222 sizeof (struct case_node),
2223 100);
2225 /* The switch body is lowered in gimplify.c, we should never have
2226 switches with a non-NULL SWITCH_BODY here. */
2227 gcc_assert (!SWITCH_BODY (exp));
2228 gcc_assert (SWITCH_LABELS (exp));
2230 do_pending_stack_adjust ();
2232 /* An ERROR_MARK occurs for various reasons including invalid data type. */
2233 if (index_type != error_mark_node)
2235 tree elt;
2236 bitmap label_bitmap;
2237 int vl = TREE_VEC_LENGTH (vec);
2239 /* cleanup_tree_cfg removes all SWITCH_EXPR with their index
2240 expressions being INTEGER_CST. */
2241 gcc_assert (TREE_CODE (index_expr) != INTEGER_CST);
2243 /* The default case, if ever taken, is at the end of TREE_VEC. */
2244 elt = TREE_VEC_ELT (vec, vl - 1);
2245 if (!CASE_LOW (elt) && !CASE_HIGH (elt))
2247 default_label_decl = CASE_LABEL (elt);
2248 --vl;
2251 for (i = vl - 1; i >= 0; --i)
2253 tree low, high;
2254 elt = TREE_VEC_ELT (vec, i);
2256 low = CASE_LOW (elt);
2257 gcc_assert (low);
2258 high = CASE_HIGH (elt);
2260 /* Discard empty ranges. */
2261 if (high && tree_int_cst_lt (high, low))
2262 continue;
2264 case_list = add_case_node (case_list, index_type, low, high,
2265 CASE_LABEL (elt), case_node_pool);
2269 before_case = start = get_last_insn ();
2270 if (default_label_decl)
2271 default_label = label_rtx (default_label_decl);
2273 /* Get upper and lower bounds of case values. */
2275 uniq = 0;
2276 count = 0;
2277 label_bitmap = BITMAP_ALLOC (NULL);
2278 for (n = case_list; n; n = n->right)
2280 /* Count the elements and track the largest and smallest
2281 of them (treating them as signed even if they are not). */
2282 if (count++ == 0)
2284 minval = n->low;
2285 maxval = n->high;
2287 else
2289 if (tree_int_cst_lt (n->low, minval))
2290 minval = n->low;
2291 if (tree_int_cst_lt (maxval, n->high))
2292 maxval = n->high;
2294 /* A range counts double, since it requires two compares. */
2295 if (! tree_int_cst_equal (n->low, n->high))
2296 count++;
2298 /* If we have not seen this label yet, then increase the
2299 number of unique case node targets seen. */
2300 lab = label_rtx (n->code_label);
2301 if (!bitmap_bit_p (label_bitmap, CODE_LABEL_NUMBER (lab)))
2303 bitmap_set_bit (label_bitmap, CODE_LABEL_NUMBER (lab));
2304 uniq++;
2308 BITMAP_FREE (label_bitmap);
2310 /* cleanup_tree_cfg removes all SWITCH_EXPR with a single
2311 destination, such as one with a default case only. However,
2312 it doesn't remove cases that are out of range for the switch
2313 type, so we may still get a zero here. */
2314 if (count == 0)
2316 if (default_label)
2317 emit_jump (default_label);
2318 free_alloc_pool (case_node_pool);
2319 return;
2322 /* Compute span of values. */
2323 range = fold_build2 (MINUS_EXPR, index_type, maxval, minval);
2325 /* Try implementing this switch statement by a short sequence of
2326 bit-wise comparisons. However, we let the binary-tree case
2327 below handle constant index expressions. */
2328 if (CASE_USE_BIT_TESTS
2329 && ! TREE_CONSTANT (index_expr)
2330 && compare_tree_int (range, GET_MODE_BITSIZE (word_mode)) < 0
2331 && compare_tree_int (range, 0) > 0
2332 && lshift_cheap_p ()
2333 && ((uniq == 1 && count >= 3)
2334 || (uniq == 2 && count >= 5)
2335 || (uniq == 3 && count >= 6)))
2337 /* Optimize the case where all the case values fit in a
2338 word without having to subtract MINVAL. In this case,
2339 we can optimize away the subtraction. */
2340 if (compare_tree_int (minval, 0) > 0
2341 && compare_tree_int (maxval, GET_MODE_BITSIZE (word_mode)) < 0)
2343 minval = build_int_cst (index_type, 0);
2344 range = maxval;
2346 emit_case_bit_tests (index_type, index_expr, minval, range,
2347 case_list, default_label);
2350 /* If range of values is much bigger than number of values,
2351 make a sequence of conditional branches instead of a dispatch.
2352 If the switch-index is a constant, do it this way
2353 because we can optimize it. */
2355 else if (count < case_values_threshold ()
2356 || compare_tree_int (range,
2357 (optimize_insn_for_size_p () ? 3 : 10) * count) > 0
2358 /* RANGE may be signed, and really large ranges will show up
2359 as negative numbers. */
2360 || compare_tree_int (range, 0) < 0
2361 #ifndef ASM_OUTPUT_ADDR_DIFF_ELT
2362 || flag_pic
2363 #endif
2364 || !flag_jump_tables
2365 || TREE_CONSTANT (index_expr)
2366 /* If neither casesi or tablejump is available, we can
2367 only go this way. */
2368 || (!HAVE_casesi && !HAVE_tablejump))
2370 index = expand_normal (index_expr);
2372 /* If the index is a short or char that we do not have
2373 an insn to handle comparisons directly, convert it to
2374 a full integer now, rather than letting each comparison
2375 generate the conversion. */
2377 if (GET_MODE_CLASS (GET_MODE (index)) == MODE_INT
2378 && ! have_insn_for (COMPARE, GET_MODE (index)))
2380 enum machine_mode wider_mode;
2381 for (wider_mode = GET_MODE (index); wider_mode != VOIDmode;
2382 wider_mode = GET_MODE_WIDER_MODE (wider_mode))
2383 if (have_insn_for (COMPARE, wider_mode))
2385 index = convert_to_mode (wider_mode, index, unsignedp);
2386 break;
2390 do_pending_stack_adjust ();
2392 if (MEM_P (index))
2393 index = copy_to_reg (index);
2395 /* We generate a binary decision tree to select the
2396 appropriate target code. This is done as follows:
2398 The list of cases is rearranged into a binary tree,
2399 nearly optimal assuming equal probability for each case.
2401 The tree is transformed into RTL, eliminating
2402 redundant test conditions at the same time.
2404 If program flow could reach the end of the
2405 decision tree an unconditional jump to the
2406 default code is emitted. */
2408 use_cost_table
2409 = (TREE_CODE (orig_type) != ENUMERAL_TYPE
2410 && estimate_case_costs (case_list));
2411 balance_case_nodes (&case_list, NULL);
2412 emit_case_nodes (index, case_list, default_label, index_type);
2413 if (default_label)
2414 emit_jump (default_label);
2416 else
2418 rtx fallback_label = label_rtx (case_list->code_label);
2419 table_label = gen_label_rtx ();
2420 if (! try_casesi (index_type, index_expr, minval, range,
2421 table_label, default_label, fallback_label))
2423 bool ok;
2425 /* Index jumptables from zero for suitable values of
2426 minval to avoid a subtraction. */
2427 if (optimize_insn_for_speed_p ()
2428 && compare_tree_int (minval, 0) > 0
2429 && compare_tree_int (minval, 3) < 0)
2431 minval = build_int_cst (index_type, 0);
2432 range = maxval;
2435 ok = try_tablejump (index_type, index_expr, minval, range,
2436 table_label, default_label);
2437 gcc_assert (ok);
2440 /* Get table of labels to jump to, in order of case index. */
2442 ncases = tree_low_cst (range, 0) + 1;
2443 labelvec = XALLOCAVEC (rtx, ncases);
2444 memset (labelvec, 0, ncases * sizeof (rtx));
2446 for (n = case_list; n; n = n->right)
2448 /* Compute the low and high bounds relative to the minimum
2449 value since that should fit in a HOST_WIDE_INT while the
2450 actual values may not. */
2451 HOST_WIDE_INT i_low
2452 = tree_low_cst (fold_build2 (MINUS_EXPR, index_type,
2453 n->low, minval), 1);
2454 HOST_WIDE_INT i_high
2455 = tree_low_cst (fold_build2 (MINUS_EXPR, index_type,
2456 n->high, minval), 1);
2457 HOST_WIDE_INT i;
2459 for (i = i_low; i <= i_high; i ++)
2460 labelvec[i]
2461 = gen_rtx_LABEL_REF (Pmode, label_rtx (n->code_label));
2464 /* Fill in the gaps with the default. We may have gaps at
2465 the beginning if we tried to avoid the minval subtraction,
2466 so substitute some label even if the default label was
2467 deemed unreachable. */
2468 if (!default_label)
2469 default_label = fallback_label;
2470 for (i = 0; i < ncases; i++)
2471 if (labelvec[i] == 0)
2472 labelvec[i] = gen_rtx_LABEL_REF (Pmode, default_label);
2474 /* Output the table. */
2475 emit_label (table_label);
2477 if (CASE_VECTOR_PC_RELATIVE || flag_pic)
2478 emit_jump_insn (gen_rtx_ADDR_DIFF_VEC (CASE_VECTOR_MODE,
2479 gen_rtx_LABEL_REF (Pmode, table_label),
2480 gen_rtvec_v (ncases, labelvec),
2481 const0_rtx, const0_rtx));
2482 else
2483 emit_jump_insn (gen_rtx_ADDR_VEC (CASE_VECTOR_MODE,
2484 gen_rtvec_v (ncases, labelvec)));
2486 /* Record no drop-through after the table. */
2487 emit_barrier ();
2490 before_case = NEXT_INSN (before_case);
2491 end = get_last_insn ();
2492 reorder_insns (before_case, end, start);
2495 free_temp_slots ();
2496 free_alloc_pool (case_node_pool);
2499 /* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE. */
2501 static void
2502 do_jump_if_equal (enum machine_mode mode, rtx op0, rtx op1, rtx label,
2503 int unsignedp)
2505 do_compare_rtx_and_jump (op0, op1, EQ, unsignedp, mode,
2506 NULL_RTX, NULL_RTX, label);
2509 /* Not all case values are encountered equally. This function
2510 uses a heuristic to weight case labels, in cases where that
2511 looks like a reasonable thing to do.
2513 Right now, all we try to guess is text, and we establish the
2514 following weights:
2516 chars above space: 16
2517 digits: 16
2518 default: 12
2519 space, punct: 8
2520 tab: 4
2521 newline: 2
2522 other "\" chars: 1
2523 remaining chars: 0
2525 If we find any cases in the switch that are not either -1 or in the range
2526 of valid ASCII characters, or are control characters other than those
2527 commonly used with "\", don't treat this switch scanning text.
2529 Return 1 if these nodes are suitable for cost estimation, otherwise
2530 return 0. */
2532 static int
2533 estimate_case_costs (case_node_ptr node)
2535 tree min_ascii = integer_minus_one_node;
2536 tree max_ascii = build_int_cst (TREE_TYPE (node->high), 127);
2537 case_node_ptr n;
2538 int i;
2540 /* If we haven't already made the cost table, make it now. Note that the
2541 lower bound of the table is -1, not zero. */
2543 if (! cost_table_initialized)
2545 cost_table_initialized = 1;
2547 for (i = 0; i < 128; i++)
2549 if (ISALNUM (i))
2550 COST_TABLE (i) = 16;
2551 else if (ISPUNCT (i))
2552 COST_TABLE (i) = 8;
2553 else if (ISCNTRL (i))
2554 COST_TABLE (i) = -1;
2557 COST_TABLE (' ') = 8;
2558 COST_TABLE ('\t') = 4;
2559 COST_TABLE ('\0') = 4;
2560 COST_TABLE ('\n') = 2;
2561 COST_TABLE ('\f') = 1;
2562 COST_TABLE ('\v') = 1;
2563 COST_TABLE ('\b') = 1;
2566 /* See if all the case expressions look like text. It is text if the
2567 constant is >= -1 and the highest constant is <= 127. Do all comparisons
2568 as signed arithmetic since we don't want to ever access cost_table with a
2569 value less than -1. Also check that none of the constants in a range
2570 are strange control characters. */
2572 for (n = node; n; n = n->right)
2574 if (tree_int_cst_lt (n->low, min_ascii)
2575 || tree_int_cst_lt (max_ascii, n->high))
2576 return 0;
2578 for (i = (HOST_WIDE_INT) TREE_INT_CST_LOW (n->low);
2579 i <= (HOST_WIDE_INT) TREE_INT_CST_LOW (n->high); i++)
2580 if (COST_TABLE (i) < 0)
2581 return 0;
2584 /* All interesting values are within the range of interesting
2585 ASCII characters. */
2586 return 1;
2589 /* Take an ordered list of case nodes
2590 and transform them into a near optimal binary tree,
2591 on the assumption that any target code selection value is as
2592 likely as any other.
2594 The transformation is performed by splitting the ordered
2595 list into two equal sections plus a pivot. The parts are
2596 then attached to the pivot as left and right branches. Each
2597 branch is then transformed recursively. */
2599 static void
2600 balance_case_nodes (case_node_ptr *head, case_node_ptr parent)
2602 case_node_ptr np;
2604 np = *head;
2605 if (np)
2607 int cost = 0;
2608 int i = 0;
2609 int ranges = 0;
2610 case_node_ptr *npp;
2611 case_node_ptr left;
2613 /* Count the number of entries on branch. Also count the ranges. */
2615 while (np)
2617 if (!tree_int_cst_equal (np->low, np->high))
2619 ranges++;
2620 if (use_cost_table)
2621 cost += COST_TABLE (TREE_INT_CST_LOW (np->high));
2624 if (use_cost_table)
2625 cost += COST_TABLE (TREE_INT_CST_LOW (np->low));
2627 i++;
2628 np = np->right;
2631 if (i > 2)
2633 /* Split this list if it is long enough for that to help. */
2634 npp = head;
2635 left = *npp;
2636 if (use_cost_table)
2638 /* Find the place in the list that bisects the list's total cost,
2639 Here I gets half the total cost. */
2640 int n_moved = 0;
2641 i = (cost + 1) / 2;
2642 while (1)
2644 /* Skip nodes while their cost does not reach that amount. */
2645 if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
2646 i -= COST_TABLE (TREE_INT_CST_LOW ((*npp)->high));
2647 i -= COST_TABLE (TREE_INT_CST_LOW ((*npp)->low));
2648 if (i <= 0)
2649 break;
2650 npp = &(*npp)->right;
2651 n_moved += 1;
2653 if (n_moved == 0)
2655 /* Leave this branch lopsided, but optimize left-hand
2656 side and fill in `parent' fields for right-hand side. */
2657 np = *head;
2658 np->parent = parent;
2659 balance_case_nodes (&np->left, np);
2660 for (; np->right; np = np->right)
2661 np->right->parent = np;
2662 return;
2665 /* If there are just three nodes, split at the middle one. */
2666 else if (i == 3)
2667 npp = &(*npp)->right;
2668 else
2670 /* Find the place in the list that bisects the list's total cost,
2671 where ranges count as 2.
2672 Here I gets half the total cost. */
2673 i = (i + ranges + 1) / 2;
2674 while (1)
2676 /* Skip nodes while their cost does not reach that amount. */
2677 if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
2678 i--;
2679 i--;
2680 if (i <= 0)
2681 break;
2682 npp = &(*npp)->right;
2685 *head = np = *npp;
2686 *npp = 0;
2687 np->parent = parent;
2688 np->left = left;
2690 /* Optimize each of the two split parts. */
2691 balance_case_nodes (&np->left, np);
2692 balance_case_nodes (&np->right, np);
2694 else
2696 /* Else leave this branch as one level,
2697 but fill in `parent' fields. */
2698 np = *head;
2699 np->parent = parent;
2700 for (; np->right; np = np->right)
2701 np->right->parent = np;
2706 /* Search the parent sections of the case node tree
2707 to see if a test for the lower bound of NODE would be redundant.
2708 INDEX_TYPE is the type of the index expression.
2710 The instructions to generate the case decision tree are
2711 output in the same order as nodes are processed so it is
2712 known that if a parent node checks the range of the current
2713 node minus one that the current node is bounded at its lower
2714 span. Thus the test would be redundant. */
2716 static int
2717 node_has_low_bound (case_node_ptr node, tree index_type)
2719 tree low_minus_one;
2720 case_node_ptr pnode;
2722 /* If the lower bound of this node is the lowest value in the index type,
2723 we need not test it. */
2725 if (tree_int_cst_equal (node->low, TYPE_MIN_VALUE (index_type)))
2726 return 1;
2728 /* If this node has a left branch, the value at the left must be less
2729 than that at this node, so it cannot be bounded at the bottom and
2730 we need not bother testing any further. */
2732 if (node->left)
2733 return 0;
2735 low_minus_one = fold_build2 (MINUS_EXPR, TREE_TYPE (node->low),
2736 node->low,
2737 build_int_cst (TREE_TYPE (node->low), 1));
2739 /* If the subtraction above overflowed, we can't verify anything.
2740 Otherwise, look for a parent that tests our value - 1. */
2742 if (! tree_int_cst_lt (low_minus_one, node->low))
2743 return 0;
2745 for (pnode = node->parent; pnode; pnode = pnode->parent)
2746 if (tree_int_cst_equal (low_minus_one, pnode->high))
2747 return 1;
2749 return 0;
2752 /* Search the parent sections of the case node tree
2753 to see if a test for the upper bound of NODE would be redundant.
2754 INDEX_TYPE is the type of the index expression.
2756 The instructions to generate the case decision tree are
2757 output in the same order as nodes are processed so it is
2758 known that if a parent node checks the range of the current
2759 node plus one that the current node is bounded at its upper
2760 span. Thus the test would be redundant. */
2762 static int
2763 node_has_high_bound (case_node_ptr node, tree index_type)
2765 tree high_plus_one;
2766 case_node_ptr pnode;
2768 /* If there is no upper bound, obviously no test is needed. */
2770 if (TYPE_MAX_VALUE (index_type) == NULL)
2771 return 1;
2773 /* If the upper bound of this node is the highest value in the type
2774 of the index expression, we need not test against it. */
2776 if (tree_int_cst_equal (node->high, TYPE_MAX_VALUE (index_type)))
2777 return 1;
2779 /* If this node has a right branch, the value at the right must be greater
2780 than that at this node, so it cannot be bounded at the top and
2781 we need not bother testing any further. */
2783 if (node->right)
2784 return 0;
2786 high_plus_one = fold_build2 (PLUS_EXPR, TREE_TYPE (node->high),
2787 node->high,
2788 build_int_cst (TREE_TYPE (node->high), 1));
2790 /* If the addition above overflowed, we can't verify anything.
2791 Otherwise, look for a parent that tests our value + 1. */
2793 if (! tree_int_cst_lt (node->high, high_plus_one))
2794 return 0;
2796 for (pnode = node->parent; pnode; pnode = pnode->parent)
2797 if (tree_int_cst_equal (high_plus_one, pnode->low))
2798 return 1;
2800 return 0;
2803 /* Search the parent sections of the
2804 case node tree to see if both tests for the upper and lower
2805 bounds of NODE would be redundant. */
2807 static int
2808 node_is_bounded (case_node_ptr node, tree index_type)
2810 return (node_has_low_bound (node, index_type)
2811 && node_has_high_bound (node, index_type));
2814 /* Emit step-by-step code to select a case for the value of INDEX.
2815 The thus generated decision tree follows the form of the
2816 case-node binary tree NODE, whose nodes represent test conditions.
2817 INDEX_TYPE is the type of the index of the switch.
2819 Care is taken to prune redundant tests from the decision tree
2820 by detecting any boundary conditions already checked by
2821 emitted rtx. (See node_has_high_bound, node_has_low_bound
2822 and node_is_bounded, above.)
2824 Where the test conditions can be shown to be redundant we emit
2825 an unconditional jump to the target code. As a further
2826 optimization, the subordinates of a tree node are examined to
2827 check for bounded nodes. In this case conditional and/or
2828 unconditional jumps as a result of the boundary check for the
2829 current node are arranged to target the subordinates associated
2830 code for out of bound conditions on the current node.
2832 We can assume that when control reaches the code generated here,
2833 the index value has already been compared with the parents
2834 of this node, and determined to be on the same side of each parent
2835 as this node is. Thus, if this node tests for the value 51,
2836 and a parent tested for 52, we don't need to consider
2837 the possibility of a value greater than 51. If another parent
2838 tests for the value 50, then this node need not test anything. */
2840 static void
2841 emit_case_nodes (rtx index, case_node_ptr node, rtx default_label,
2842 tree index_type)
2844 /* If INDEX has an unsigned type, we must make unsigned branches. */
2845 int unsignedp = TYPE_UNSIGNED (index_type);
2846 enum machine_mode mode = GET_MODE (index);
2847 enum machine_mode imode = TYPE_MODE (index_type);
2849 /* Handle indices detected as constant during RTL expansion. */
2850 if (mode == VOIDmode)
2851 mode = imode;
2853 /* See if our parents have already tested everything for us.
2854 If they have, emit an unconditional jump for this node. */
2855 if (node_is_bounded (node, index_type))
2856 emit_jump (label_rtx (node->code_label));
2858 else if (tree_int_cst_equal (node->low, node->high))
2860 /* Node is single valued. First see if the index expression matches
2861 this node and then check our children, if any. */
2863 do_jump_if_equal (mode, index,
2864 convert_modes (mode, imode,
2865 expand_normal (node->low),
2866 unsignedp),
2867 label_rtx (node->code_label), unsignedp);
2869 if (node->right != 0 && node->left != 0)
2871 /* This node has children on both sides.
2872 Dispatch to one side or the other
2873 by comparing the index value with this node's value.
2874 If one subtree is bounded, check that one first,
2875 so we can avoid real branches in the tree. */
2877 if (node_is_bounded (node->right, index_type))
2879 emit_cmp_and_jump_insns (index,
2880 convert_modes
2881 (mode, imode,
2882 expand_normal (node->high),
2883 unsignedp),
2884 GT, NULL_RTX, mode, unsignedp,
2885 label_rtx (node->right->code_label));
2886 emit_case_nodes (index, node->left, default_label, index_type);
2889 else if (node_is_bounded (node->left, index_type))
2891 emit_cmp_and_jump_insns (index,
2892 convert_modes
2893 (mode, imode,
2894 expand_normal (node->high),
2895 unsignedp),
2896 LT, NULL_RTX, mode, unsignedp,
2897 label_rtx (node->left->code_label));
2898 emit_case_nodes (index, node->right, default_label, index_type);
2901 /* If both children are single-valued cases with no
2902 children, finish up all the work. This way, we can save
2903 one ordered comparison. */
2904 else if (tree_int_cst_equal (node->right->low, node->right->high)
2905 && node->right->left == 0
2906 && node->right->right == 0
2907 && tree_int_cst_equal (node->left->low, node->left->high)
2908 && node->left->left == 0
2909 && node->left->right == 0)
2911 /* Neither node is bounded. First distinguish the two sides;
2912 then emit the code for one side at a time. */
2914 /* See if the value matches what the right hand side
2915 wants. */
2916 do_jump_if_equal (mode, index,
2917 convert_modes (mode, imode,
2918 expand_normal (node->right->low),
2919 unsignedp),
2920 label_rtx (node->right->code_label),
2921 unsignedp);
2923 /* See if the value matches what the left hand side
2924 wants. */
2925 do_jump_if_equal (mode, index,
2926 convert_modes (mode, imode,
2927 expand_normal (node->left->low),
2928 unsignedp),
2929 label_rtx (node->left->code_label),
2930 unsignedp);
2933 else
2935 /* Neither node is bounded. First distinguish the two sides;
2936 then emit the code for one side at a time. */
2938 tree test_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
2940 /* See if the value is on the right. */
2941 emit_cmp_and_jump_insns (index,
2942 convert_modes
2943 (mode, imode,
2944 expand_normal (node->high),
2945 unsignedp),
2946 GT, NULL_RTX, mode, unsignedp,
2947 label_rtx (test_label));
2949 /* Value must be on the left.
2950 Handle the left-hand subtree. */
2951 emit_case_nodes (index, node->left, default_label, index_type);
2952 /* If left-hand subtree does nothing,
2953 go to default. */
2954 if (default_label)
2955 emit_jump (default_label);
2957 /* Code branches here for the right-hand subtree. */
2958 expand_label (test_label);
2959 emit_case_nodes (index, node->right, default_label, index_type);
2963 else if (node->right != 0 && node->left == 0)
2965 /* Here we have a right child but no left so we issue a conditional
2966 branch to default and process the right child.
2968 Omit the conditional branch to default if the right child
2969 does not have any children and is single valued; it would
2970 cost too much space to save so little time. */
2972 if (node->right->right || node->right->left
2973 || !tree_int_cst_equal (node->right->low, node->right->high))
2975 if (!node_has_low_bound (node, index_type))
2977 emit_cmp_and_jump_insns (index,
2978 convert_modes
2979 (mode, imode,
2980 expand_normal (node->high),
2981 unsignedp),
2982 LT, NULL_RTX, mode, unsignedp,
2983 default_label);
2986 emit_case_nodes (index, node->right, default_label, index_type);
2988 else
2989 /* We cannot process node->right normally
2990 since we haven't ruled out the numbers less than
2991 this node's value. So handle node->right explicitly. */
2992 do_jump_if_equal (mode, index,
2993 convert_modes
2994 (mode, imode,
2995 expand_normal (node->right->low),
2996 unsignedp),
2997 label_rtx (node->right->code_label), unsignedp);
3000 else if (node->right == 0 && node->left != 0)
3002 /* Just one subtree, on the left. */
3003 if (node->left->left || node->left->right
3004 || !tree_int_cst_equal (node->left->low, node->left->high))
3006 if (!node_has_high_bound (node, index_type))
3008 emit_cmp_and_jump_insns (index,
3009 convert_modes
3010 (mode, imode,
3011 expand_normal (node->high),
3012 unsignedp),
3013 GT, NULL_RTX, mode, unsignedp,
3014 default_label);
3017 emit_case_nodes (index, node->left, default_label, index_type);
3019 else
3020 /* We cannot process node->left normally
3021 since we haven't ruled out the numbers less than
3022 this node's value. So handle node->left explicitly. */
3023 do_jump_if_equal (mode, index,
3024 convert_modes
3025 (mode, imode,
3026 expand_normal (node->left->low),
3027 unsignedp),
3028 label_rtx (node->left->code_label), unsignedp);
3031 else
3033 /* Node is a range. These cases are very similar to those for a single
3034 value, except that we do not start by testing whether this node
3035 is the one to branch to. */
3037 if (node->right != 0 && node->left != 0)
3039 /* Node has subtrees on both sides.
3040 If the right-hand subtree is bounded,
3041 test for it first, since we can go straight there.
3042 Otherwise, we need to make a branch in the control structure,
3043 then handle the two subtrees. */
3044 tree test_label = 0;
3046 if (node_is_bounded (node->right, index_type))
3047 /* Right hand node is fully bounded so we can eliminate any
3048 testing and branch directly to the target code. */
3049 emit_cmp_and_jump_insns (index,
3050 convert_modes
3051 (mode, imode,
3052 expand_normal (node->high),
3053 unsignedp),
3054 GT, NULL_RTX, mode, unsignedp,
3055 label_rtx (node->right->code_label));
3056 else
3058 /* Right hand node requires testing.
3059 Branch to a label where we will handle it later. */
3061 test_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
3062 emit_cmp_and_jump_insns (index,
3063 convert_modes
3064 (mode, imode,
3065 expand_normal (node->high),
3066 unsignedp),
3067 GT, NULL_RTX, mode, unsignedp,
3068 label_rtx (test_label));
3071 /* Value belongs to this node or to the left-hand subtree. */
3073 emit_cmp_and_jump_insns (index,
3074 convert_modes
3075 (mode, imode,
3076 expand_normal (node->low),
3077 unsignedp),
3078 GE, NULL_RTX, mode, unsignedp,
3079 label_rtx (node->code_label));
3081 /* Handle the left-hand subtree. */
3082 emit_case_nodes (index, node->left, default_label, index_type);
3084 /* If right node had to be handled later, do that now. */
3086 if (test_label)
3088 /* If the left-hand subtree fell through,
3089 don't let it fall into the right-hand subtree. */
3090 if (default_label)
3091 emit_jump (default_label);
3093 expand_label (test_label);
3094 emit_case_nodes (index, node->right, default_label, index_type);
3098 else if (node->right != 0 && node->left == 0)
3100 /* Deal with values to the left of this node,
3101 if they are possible. */
3102 if (!node_has_low_bound (node, index_type))
3104 emit_cmp_and_jump_insns (index,
3105 convert_modes
3106 (mode, imode,
3107 expand_normal (node->low),
3108 unsignedp),
3109 LT, NULL_RTX, mode, unsignedp,
3110 default_label);
3113 /* Value belongs to this node or to the right-hand subtree. */
3115 emit_cmp_and_jump_insns (index,
3116 convert_modes
3117 (mode, imode,
3118 expand_normal (node->high),
3119 unsignedp),
3120 LE, NULL_RTX, mode, unsignedp,
3121 label_rtx (node->code_label));
3123 emit_case_nodes (index, node->right, default_label, index_type);
3126 else if (node->right == 0 && node->left != 0)
3128 /* Deal with values to the right of this node,
3129 if they are possible. */
3130 if (!node_has_high_bound (node, index_type))
3132 emit_cmp_and_jump_insns (index,
3133 convert_modes
3134 (mode, imode,
3135 expand_normal (node->high),
3136 unsignedp),
3137 GT, NULL_RTX, mode, unsignedp,
3138 default_label);
3141 /* Value belongs to this node or to the left-hand subtree. */
3143 emit_cmp_and_jump_insns (index,
3144 convert_modes
3145 (mode, imode,
3146 expand_normal (node->low),
3147 unsignedp),
3148 GE, NULL_RTX, mode, unsignedp,
3149 label_rtx (node->code_label));
3151 emit_case_nodes (index, node->left, default_label, index_type);
3154 else
3156 /* Node has no children so we check low and high bounds to remove
3157 redundant tests. Only one of the bounds can exist,
3158 since otherwise this node is bounded--a case tested already. */
3159 int high_bound = node_has_high_bound (node, index_type);
3160 int low_bound = node_has_low_bound (node, index_type);
3162 if (!high_bound && low_bound)
3164 emit_cmp_and_jump_insns (index,
3165 convert_modes
3166 (mode, imode,
3167 expand_normal (node->high),
3168 unsignedp),
3169 GT, NULL_RTX, mode, unsignedp,
3170 default_label);
3173 else if (!low_bound && high_bound)
3175 emit_cmp_and_jump_insns (index,
3176 convert_modes
3177 (mode, imode,
3178 expand_normal (node->low),
3179 unsignedp),
3180 LT, NULL_RTX, mode, unsignedp,
3181 default_label);
3183 else if (!low_bound && !high_bound)
3185 /* Widen LOW and HIGH to the same width as INDEX. */
3186 tree type = lang_hooks.types.type_for_mode (mode, unsignedp);
3187 tree low = build1 (CONVERT_EXPR, type, node->low);
3188 tree high = build1 (CONVERT_EXPR, type, node->high);
3189 rtx low_rtx, new_index, new_bound;
3191 /* Instead of doing two branches, emit one unsigned branch for
3192 (index-low) > (high-low). */
3193 low_rtx = expand_expr (low, NULL_RTX, mode, EXPAND_NORMAL);
3194 new_index = expand_simple_binop (mode, MINUS, index, low_rtx,
3195 NULL_RTX, unsignedp,
3196 OPTAB_WIDEN);
3197 new_bound = expand_expr (fold_build2 (MINUS_EXPR, type,
3198 high, low),
3199 NULL_RTX, mode, EXPAND_NORMAL);
3201 emit_cmp_and_jump_insns (new_index, new_bound, GT, NULL_RTX,
3202 mode, 1, default_label);
3205 emit_jump (label_rtx (node->code_label));