1 /* Expand builtin functions.
2 Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
24 #include "coretypes.h"
32 #include "hard-reg-set.h"
35 #include "insn-config.h"
41 #include "typeclass.h"
46 #include "langhooks.h"
48 #define CALLED_AS_BUILT_IN(NODE) \
49 (!strncmp (IDENTIFIER_POINTER (DECL_NAME (NODE)), "__builtin_", 10))
51 /* Register mappings for target machines without register windows. */
52 #ifndef INCOMING_REGNO
53 #define INCOMING_REGNO(OUT) (OUT)
55 #ifndef OUTGOING_REGNO
56 #define OUTGOING_REGNO(IN) (IN)
59 #ifndef PAD_VARARGS_DOWN
60 #define PAD_VARARGS_DOWN BYTES_BIG_ENDIAN
63 /* Define the names of the builtin function types and codes. */
64 const char *const built_in_class_names[4]
65 = {"NOT_BUILT_IN", "BUILT_IN_FRONTEND", "BUILT_IN_MD", "BUILT_IN_NORMAL"};
67 #define DEF_BUILTIN(X, N, C, T, LT, B, F, NA, AT, IM) STRINGX(X),
68 const char *const built_in_names[(int) END_BUILTINS] =
70 #include "builtins.def"
74 /* Setup an array of _DECL trees, make sure each element is
75 initialized to NULL_TREE. */
76 tree built_in_decls[(int) END_BUILTINS];
77 /* Declarations used when constructing the builtin implicitly in the compiler.
78 It may be NULL_TREE when this is invalid (for instance runtime is not
79 required to implement the function call in all cases. */
80 tree implicit_built_in_decls[(int) END_BUILTINS];
82 static int get_pointer_alignment PARAMS ((tree, unsigned int));
83 static tree c_strlen PARAMS ((tree));
84 static const char *c_getstr PARAMS ((tree));
85 static rtx c_readstr PARAMS ((const char *,
87 static int target_char_cast PARAMS ((tree, char *));
88 static rtx get_memory_rtx PARAMS ((tree));
89 static int apply_args_size PARAMS ((void));
90 static int apply_result_size PARAMS ((void));
91 #if defined (HAVE_untyped_call) || defined (HAVE_untyped_return)
92 static rtx result_vector PARAMS ((int, rtx));
94 static rtx expand_builtin_setjmp PARAMS ((tree, rtx));
95 static void expand_builtin_prefetch PARAMS ((tree));
96 static rtx expand_builtin_apply_args PARAMS ((void));
97 static rtx expand_builtin_apply_args_1 PARAMS ((void));
98 static rtx expand_builtin_apply PARAMS ((rtx, rtx, rtx));
99 static void expand_builtin_return PARAMS ((rtx));
100 static enum type_class type_to_class PARAMS ((tree));
101 static rtx expand_builtin_classify_type PARAMS ((tree));
102 static void expand_errno_check PARAMS ((tree, rtx));
103 static rtx expand_builtin_mathfn PARAMS ((tree, rtx, rtx));
104 static rtx expand_builtin_mathfn_2 PARAMS ((tree, rtx, rtx));
105 static rtx expand_builtin_constant_p PARAMS ((tree, enum machine_mode));
106 static rtx expand_builtin_args_info PARAMS ((tree));
107 static rtx expand_builtin_next_arg PARAMS ((tree));
108 static rtx expand_builtin_va_start PARAMS ((tree));
109 static rtx expand_builtin_va_end PARAMS ((tree));
110 static rtx expand_builtin_va_copy PARAMS ((tree));
111 static rtx expand_builtin_memcmp PARAMS ((tree, tree, rtx,
113 static rtx expand_builtin_strcmp PARAMS ((tree, rtx,
115 static rtx expand_builtin_strncmp PARAMS ((tree, rtx,
117 static rtx builtin_memcpy_read_str PARAMS ((PTR, HOST_WIDE_INT,
119 static rtx expand_builtin_strcat PARAMS ((tree, rtx,
121 static rtx expand_builtin_strncat PARAMS ((tree, rtx,
123 static rtx expand_builtin_strspn PARAMS ((tree, rtx,
125 static rtx expand_builtin_strcspn PARAMS ((tree, rtx,
127 static rtx expand_builtin_memcpy PARAMS ((tree, rtx,
128 enum machine_mode, int));
129 static rtx expand_builtin_mempcpy PARAMS ((tree, rtx,
131 static rtx expand_builtin_memmove PARAMS ((tree, rtx,
133 static rtx expand_builtin_bcopy PARAMS ((tree));
134 static rtx expand_builtin_strcpy PARAMS ((tree, rtx,
136 static rtx expand_builtin_stpcpy PARAMS ((tree, rtx,
138 static rtx builtin_strncpy_read_str PARAMS ((PTR, HOST_WIDE_INT,
140 static rtx expand_builtin_strncpy PARAMS ((tree, rtx,
142 static rtx builtin_memset_read_str PARAMS ((PTR, HOST_WIDE_INT,
144 static rtx builtin_memset_gen_str PARAMS ((PTR, HOST_WIDE_INT,
146 static rtx expand_builtin_memset PARAMS ((tree, rtx,
148 static rtx expand_builtin_bzero PARAMS ((tree));
149 static rtx expand_builtin_strlen PARAMS ((tree, rtx, enum machine_mode));
150 static rtx expand_builtin_strstr PARAMS ((tree, rtx,
152 static rtx expand_builtin_strpbrk PARAMS ((tree, rtx,
154 static rtx expand_builtin_strchr PARAMS ((tree, rtx,
156 static rtx expand_builtin_strrchr PARAMS ((tree, rtx,
158 static rtx expand_builtin_alloca PARAMS ((tree, rtx));
159 static rtx expand_builtin_unop PARAMS ((enum machine_mode,
160 tree, rtx, rtx, optab));
161 static rtx expand_builtin_frame_address PARAMS ((tree, tree));
162 static rtx expand_builtin_fputs PARAMS ((tree, int, int));
163 static tree stabilize_va_list PARAMS ((tree, int));
164 static rtx expand_builtin_expect PARAMS ((tree, rtx));
165 static tree fold_builtin_constant_p PARAMS ((tree));
166 static tree fold_builtin_classify_type PARAMS ((tree));
167 static tree fold_builtin_inf PARAMS ((tree, int));
168 static tree fold_builtin_nan PARAMS ((tree, tree, int));
169 static int validate_arglist PARAMS ((tree, ...));
170 static tree fold_trunc_transparent_mathfn PARAMS ((tree));
172 /* Return the alignment in bits of EXP, a pointer valued expression.
173 But don't return more than MAX_ALIGN no matter what.
174 The alignment returned is, by default, the alignment of the thing that
175 EXP points to. If it is not a POINTER_TYPE, 0 is returned.
177 Otherwise, look at the expression to see if we can do better, i.e., if the
178 expression is actually pointing at an object whose alignment is tighter. */
181 get_pointer_alignment (exp, max_align)
183 unsigned int max_align;
185 unsigned int align, inner;
187 if (TREE_CODE (TREE_TYPE (exp)) != POINTER_TYPE)
190 align = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (exp)));
191 align = MIN (align, max_align);
195 switch (TREE_CODE (exp))
199 case NON_LVALUE_EXPR:
200 exp = TREE_OPERAND (exp, 0);
201 if (TREE_CODE (TREE_TYPE (exp)) != POINTER_TYPE)
204 inner = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (exp)));
205 align = MIN (inner, max_align);
209 /* If sum of pointer + int, restrict our maximum alignment to that
210 imposed by the integer. If not, we can't do any better than
212 if (! host_integerp (TREE_OPERAND (exp, 1), 1))
215 while (((tree_low_cst (TREE_OPERAND (exp, 1), 1))
216 & (max_align / BITS_PER_UNIT - 1))
220 exp = TREE_OPERAND (exp, 0);
224 /* See what we are pointing at and look at its alignment. */
225 exp = TREE_OPERAND (exp, 0);
226 if (TREE_CODE (exp) == FUNCTION_DECL)
227 align = FUNCTION_BOUNDARY;
228 else if (DECL_P (exp))
229 align = DECL_ALIGN (exp);
230 #ifdef CONSTANT_ALIGNMENT
231 else if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c')
232 align = CONSTANT_ALIGNMENT (exp, align);
234 return MIN (align, max_align);
242 /* Compute the length of a C string. TREE_STRING_LENGTH is not the right
243 way, because it could contain a zero byte in the middle.
244 TREE_STRING_LENGTH is the size of the character array, not the string.
246 The value returned is of type `ssizetype'.
248 Unfortunately, string_constant can't access the values of const char
249 arrays with initializers, so neither can we do so here. */
256 HOST_WIDE_INT offset;
260 src = string_constant (src, &offset_node);
264 max = TREE_STRING_LENGTH (src) - 1;
265 ptr = TREE_STRING_POINTER (src);
267 if (offset_node && TREE_CODE (offset_node) != INTEGER_CST)
269 /* If the string has an internal zero byte (e.g., "foo\0bar"), we can't
270 compute the offset to the following null if we don't know where to
271 start searching for it. */
274 for (i = 0; i < max; i++)
278 /* We don't know the starting offset, but we do know that the string
279 has no internal zero bytes. We can assume that the offset falls
280 within the bounds of the string; otherwise, the programmer deserves
281 what he gets. Subtract the offset from the length of the string,
282 and return that. This would perhaps not be valid if we were dealing
283 with named arrays in addition to literal string constants. */
285 return size_diffop (size_int (max), offset_node);
288 /* We have a known offset into the string. Start searching there for
289 a null character if we can represent it as a single HOST_WIDE_INT. */
290 if (offset_node == 0)
292 else if (! host_integerp (offset_node, 0))
295 offset = tree_low_cst (offset_node, 0);
297 /* If the offset is known to be out of bounds, warn, and call strlen at
299 if (offset < 0 || offset > max)
301 warning ("offset outside bounds of constant string");
305 /* Use strlen to search for the first zero byte. Since any strings
306 constructed with build_string will have nulls appended, we win even
307 if we get handed something like (char[4])"abcd".
309 Since OFFSET is our starting index into the string, no further
310 calculation is needed. */
311 return ssize_int (strlen (ptr + offset));
314 /* Return a char pointer for a C string if it is a string constant
315 or sum of string constant and integer constant. */
323 src = string_constant (src, &offset_node);
327 if (offset_node == 0)
328 return TREE_STRING_POINTER (src);
329 else if (!host_integerp (offset_node, 1)
330 || compare_tree_int (offset_node, TREE_STRING_LENGTH (src) - 1) > 0)
333 return TREE_STRING_POINTER (src) + tree_low_cst (offset_node, 1);
336 /* Return a CONST_INT or CONST_DOUBLE corresponding to target reading
337 GET_MODE_BITSIZE (MODE) bits from string constant STR. */
340 c_readstr (str, mode)
342 enum machine_mode mode;
348 if (GET_MODE_CLASS (mode) != MODE_INT)
353 for (i = 0; i < GET_MODE_SIZE (mode); i++)
356 if (WORDS_BIG_ENDIAN)
357 j = GET_MODE_SIZE (mode) - i - 1;
358 if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN
359 && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
360 j = j + UNITS_PER_WORD - 2 * (j % UNITS_PER_WORD) - 1;
362 if (j > 2 * HOST_BITS_PER_WIDE_INT)
365 ch = (unsigned char) str[i];
366 c[j / HOST_BITS_PER_WIDE_INT] |= ch << (j % HOST_BITS_PER_WIDE_INT);
368 return immed_double_const (c[0], c[1], mode);
371 /* Cast a target constant CST to target CHAR and if that value fits into
372 host char type, return zero and put that value into variable pointed by
376 target_char_cast (cst, p)
380 unsigned HOST_WIDE_INT val, hostval;
382 if (!host_integerp (cst, 1)
383 || CHAR_TYPE_SIZE > HOST_BITS_PER_WIDE_INT)
386 val = tree_low_cst (cst, 1);
387 if (CHAR_TYPE_SIZE < HOST_BITS_PER_WIDE_INT)
388 val &= (((unsigned HOST_WIDE_INT) 1) << CHAR_TYPE_SIZE) - 1;
391 if (HOST_BITS_PER_CHAR < HOST_BITS_PER_WIDE_INT)
392 hostval &= (((unsigned HOST_WIDE_INT) 1) << HOST_BITS_PER_CHAR) - 1;
401 /* Given TEM, a pointer to a stack frame, follow the dynamic chain COUNT
402 times to get the address of either a higher stack frame, or a return
403 address located within it (depending on FNDECL_CODE). */
406 expand_builtin_return_addr (fndecl_code, count, tem)
407 enum built_in_function fndecl_code;
413 /* Some machines need special handling before we can access
414 arbitrary frames. For example, on the sparc, we must first flush
415 all register windows to the stack. */
416 #ifdef SETUP_FRAME_ADDRESSES
418 SETUP_FRAME_ADDRESSES ();
421 /* On the sparc, the return address is not in the frame, it is in a
422 register. There is no way to access it off of the current frame
423 pointer, but it can be accessed off the previous frame pointer by
424 reading the value from the register window save area. */
425 #ifdef RETURN_ADDR_IN_PREVIOUS_FRAME
426 if (fndecl_code == BUILT_IN_RETURN_ADDRESS)
430 /* Scan back COUNT frames to the specified frame. */
431 for (i = 0; i < count; i++)
433 /* Assume the dynamic chain pointer is in the word that the
434 frame address points to, unless otherwise specified. */
435 #ifdef DYNAMIC_CHAIN_ADDRESS
436 tem = DYNAMIC_CHAIN_ADDRESS (tem);
438 tem = memory_address (Pmode, tem);
439 tem = gen_rtx_MEM (Pmode, tem);
440 set_mem_alias_set (tem, get_frame_alias_set ());
441 tem = copy_to_reg (tem);
444 /* For __builtin_frame_address, return what we've got. */
445 if (fndecl_code == BUILT_IN_FRAME_ADDRESS)
448 /* For __builtin_return_address, Get the return address from that
450 #ifdef RETURN_ADDR_RTX
451 tem = RETURN_ADDR_RTX (count, tem);
453 tem = memory_address (Pmode,
454 plus_constant (tem, GET_MODE_SIZE (Pmode)));
455 tem = gen_rtx_MEM (Pmode, tem);
456 set_mem_alias_set (tem, get_frame_alias_set ());
461 /* Alias set used for setjmp buffer. */
462 static HOST_WIDE_INT setjmp_alias_set = -1;
464 /* Construct the leading half of a __builtin_setjmp call. Control will
465 return to RECEIVER_LABEL. This is used directly by sjlj exception
469 expand_builtin_setjmp_setup (buf_addr, receiver_label)
473 enum machine_mode sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
477 if (setjmp_alias_set == -1)
478 setjmp_alias_set = new_alias_set ();
480 #ifdef POINTERS_EXTEND_UNSIGNED
481 if (GET_MODE (buf_addr) != Pmode)
482 buf_addr = convert_memory_address (Pmode, buf_addr);
485 buf_addr = force_reg (Pmode, force_operand (buf_addr, NULL_RTX));
489 /* We store the frame pointer and the address of receiver_label in
490 the buffer and use the rest of it for the stack save area, which
491 is machine-dependent. */
493 #ifndef BUILTIN_SETJMP_FRAME_VALUE
494 #define BUILTIN_SETJMP_FRAME_VALUE virtual_stack_vars_rtx
497 mem = gen_rtx_MEM (Pmode, buf_addr);
498 set_mem_alias_set (mem, setjmp_alias_set);
499 emit_move_insn (mem, BUILTIN_SETJMP_FRAME_VALUE);
501 mem = gen_rtx_MEM (Pmode, plus_constant (buf_addr, GET_MODE_SIZE (Pmode))),
502 set_mem_alias_set (mem, setjmp_alias_set);
504 emit_move_insn (validize_mem (mem),
505 force_reg (Pmode, gen_rtx_LABEL_REF (Pmode, receiver_label)));
507 stack_save = gen_rtx_MEM (sa_mode,
508 plus_constant (buf_addr,
509 2 * GET_MODE_SIZE (Pmode)));
510 set_mem_alias_set (stack_save, setjmp_alias_set);
511 emit_stack_save (SAVE_NONLOCAL, &stack_save, NULL_RTX);
513 /* If there is further processing to do, do it. */
514 #ifdef HAVE_builtin_setjmp_setup
515 if (HAVE_builtin_setjmp_setup)
516 emit_insn (gen_builtin_setjmp_setup (buf_addr));
519 /* Tell optimize_save_area_alloca that extra work is going to
520 need to go on during alloca. */
521 current_function_calls_setjmp = 1;
523 /* Set this so all the registers get saved in our frame; we need to be
524 able to copy the saved values for any registers from frames we unwind. */
525 current_function_has_nonlocal_label = 1;
528 /* Construct the trailing part of a __builtin_setjmp call.
529 This is used directly by sjlj exception handling code. */
532 expand_builtin_setjmp_receiver (receiver_label)
533 rtx receiver_label ATTRIBUTE_UNUSED;
535 /* Clobber the FP when we get here, so we have to make sure it's
536 marked as used by this function. */
537 emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
539 /* Mark the static chain as clobbered here so life information
540 doesn't get messed up for it. */
541 emit_insn (gen_rtx_CLOBBER (VOIDmode, static_chain_rtx));
543 /* Now put in the code to restore the frame pointer, and argument
544 pointer, if needed. The code below is from expand_end_bindings
545 in stmt.c; see detailed documentation there. */
546 #ifdef HAVE_nonlocal_goto
547 if (! HAVE_nonlocal_goto)
549 emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
551 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
552 if (fixed_regs[ARG_POINTER_REGNUM])
554 #ifdef ELIMINABLE_REGS
556 static const struct elims {const int from, to;} elim_regs[] = ELIMINABLE_REGS;
558 for (i = 0; i < ARRAY_SIZE (elim_regs); i++)
559 if (elim_regs[i].from == ARG_POINTER_REGNUM
560 && elim_regs[i].to == HARD_FRAME_POINTER_REGNUM)
563 if (i == ARRAY_SIZE (elim_regs))
566 /* Now restore our arg pointer from the address at which it
567 was saved in our stack frame. */
568 emit_move_insn (virtual_incoming_args_rtx,
569 copy_to_reg (get_arg_pointer_save_area (cfun)));
574 #ifdef HAVE_builtin_setjmp_receiver
575 if (HAVE_builtin_setjmp_receiver)
576 emit_insn (gen_builtin_setjmp_receiver (receiver_label));
579 #ifdef HAVE_nonlocal_goto_receiver
580 if (HAVE_nonlocal_goto_receiver)
581 emit_insn (gen_nonlocal_goto_receiver ());
586 /* @@@ This is a kludge. Not all machine descriptions define a blockage
587 insn, but we must not allow the code we just generated to be reordered
588 by scheduling. Specifically, the update of the frame pointer must
589 happen immediately, not later. So emit an ASM_INPUT to act as blockage
591 emit_insn (gen_rtx_ASM_INPUT (VOIDmode, ""));
594 /* __builtin_setjmp is passed a pointer to an array of five words (not
595 all will be used on all machines). It operates similarly to the C
596 library function of the same name, but is more efficient. Much of
597 the code below (and for longjmp) is copied from the handling of
600 NOTE: This is intended for use by GNAT and the exception handling
601 scheme in the compiler and will only work in the method used by
605 expand_builtin_setjmp (arglist, target)
609 rtx buf_addr, next_lab, cont_lab;
611 if (!validate_arglist (arglist, POINTER_TYPE, VOID_TYPE))
614 if (target == 0 || GET_CODE (target) != REG
615 || REGNO (target) < FIRST_PSEUDO_REGISTER)
616 target = gen_reg_rtx (TYPE_MODE (integer_type_node));
618 buf_addr = expand_expr (TREE_VALUE (arglist), NULL_RTX, VOIDmode, 0);
620 next_lab = gen_label_rtx ();
621 cont_lab = gen_label_rtx ();
623 expand_builtin_setjmp_setup (buf_addr, next_lab);
625 /* Set TARGET to zero and branch to the continue label. */
626 emit_move_insn (target, const0_rtx);
627 emit_jump_insn (gen_jump (cont_lab));
629 emit_label (next_lab);
631 expand_builtin_setjmp_receiver (next_lab);
633 /* Set TARGET to one. */
634 emit_move_insn (target, const1_rtx);
635 emit_label (cont_lab);
637 /* Tell flow about the strange goings on. Putting `next_lab' on
638 `nonlocal_goto_handler_labels' to indicates that function
639 calls may traverse the arc back to this label. */
641 current_function_has_nonlocal_label = 1;
642 nonlocal_goto_handler_labels
643 = gen_rtx_EXPR_LIST (VOIDmode, next_lab, nonlocal_goto_handler_labels);
648 /* __builtin_longjmp is passed a pointer to an array of five words (not
649 all will be used on all machines). It operates similarly to the C
650 library function of the same name, but is more efficient. Much of
651 the code below is copied from the handling of non-local gotos.
653 NOTE: This is intended for use by GNAT and the exception handling
654 scheme in the compiler and will only work in the method used by
658 expand_builtin_longjmp (buf_addr, value)
661 rtx fp, lab, stack, insn, last;
662 enum machine_mode sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
664 if (setjmp_alias_set == -1)
665 setjmp_alias_set = new_alias_set ();
667 #ifdef POINTERS_EXTEND_UNSIGNED
668 if (GET_MODE (buf_addr) != Pmode)
669 buf_addr = convert_memory_address (Pmode, buf_addr);
672 buf_addr = force_reg (Pmode, buf_addr);
674 /* We used to store value in static_chain_rtx, but that fails if pointers
675 are smaller than integers. We instead require that the user must pass
676 a second argument of 1, because that is what builtin_setjmp will
677 return. This also makes EH slightly more efficient, since we are no
678 longer copying around a value that we don't care about. */
679 if (value != const1_rtx)
682 current_function_calls_longjmp = 1;
684 last = get_last_insn ();
685 #ifdef HAVE_builtin_longjmp
686 if (HAVE_builtin_longjmp)
687 emit_insn (gen_builtin_longjmp (buf_addr));
691 fp = gen_rtx_MEM (Pmode, buf_addr);
692 lab = gen_rtx_MEM (Pmode, plus_constant (buf_addr,
693 GET_MODE_SIZE (Pmode)));
695 stack = gen_rtx_MEM (sa_mode, plus_constant (buf_addr,
696 2 * GET_MODE_SIZE (Pmode)));
697 set_mem_alias_set (fp, setjmp_alias_set);
698 set_mem_alias_set (lab, setjmp_alias_set);
699 set_mem_alias_set (stack, setjmp_alias_set);
701 /* Pick up FP, label, and SP from the block and jump. This code is
702 from expand_goto in stmt.c; see there for detailed comments. */
703 #if HAVE_nonlocal_goto
704 if (HAVE_nonlocal_goto)
705 /* We have to pass a value to the nonlocal_goto pattern that will
706 get copied into the static_chain pointer, but it does not matter
707 what that value is, because builtin_setjmp does not use it. */
708 emit_insn (gen_nonlocal_goto (value, lab, stack, fp));
712 lab = copy_to_reg (lab);
714 emit_move_insn (hard_frame_pointer_rtx, fp);
715 emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
717 emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
718 emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
719 emit_indirect_jump (lab);
723 /* Search backwards and mark the jump insn as a non-local goto.
724 Note that this precludes the use of __builtin_longjmp to a
725 __builtin_setjmp target in the same function. However, we've
726 already cautioned the user that these functions are for
727 internal exception handling use only. */
728 for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
732 if (GET_CODE (insn) == JUMP_INSN)
734 REG_NOTES (insn) = alloc_EXPR_LIST (REG_NON_LOCAL_GOTO, const0_rtx,
738 else if (GET_CODE (insn) == CALL_INSN)
743 /* Expand a call to __builtin_prefetch. For a target that does not support
744 data prefetch, evaluate the memory address argument in case it has side
748 expand_builtin_prefetch (arglist)
751 tree arg0, arg1, arg2;
754 if (!validate_arglist (arglist, POINTER_TYPE, 0))
757 arg0 = TREE_VALUE (arglist);
758 /* Arguments 1 and 2 are optional; argument 1 (read/write) defaults to
759 zero (read) and argument 2 (locality) defaults to 3 (high degree of
761 if (TREE_CHAIN (arglist))
763 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
764 if (TREE_CHAIN (TREE_CHAIN (arglist)))
765 arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
767 arg2 = build_int_2 (3, 0);
771 arg1 = integer_zero_node;
772 arg2 = build_int_2 (3, 0);
775 /* Argument 0 is an address. */
776 op0 = expand_expr (arg0, NULL_RTX, Pmode, EXPAND_NORMAL);
778 /* Argument 1 (read/write flag) must be a compile-time constant int. */
779 if (TREE_CODE (arg1) != INTEGER_CST)
781 error ("second arg to `__builtin_prefetch' must be a constant");
782 arg1 = integer_zero_node;
784 op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
785 /* Argument 1 must be either zero or one. */
786 if (INTVAL (op1) != 0 && INTVAL (op1) != 1)
788 warning ("invalid second arg to __builtin_prefetch; using zero");
792 /* Argument 2 (locality) must be a compile-time constant int. */
793 if (TREE_CODE (arg2) != INTEGER_CST)
795 error ("third arg to `__builtin_prefetch' must be a constant");
796 arg2 = integer_zero_node;
798 op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
799 /* Argument 2 must be 0, 1, 2, or 3. */
800 if (INTVAL (op2) < 0 || INTVAL (op2) > 3)
802 warning ("invalid third arg to __builtin_prefetch; using zero");
809 if ((! (*insn_data[(int) CODE_FOR_prefetch].operand[0].predicate)
811 insn_data[(int) CODE_FOR_prefetch].operand[0].mode))
812 || (GET_MODE(op0) != Pmode))
814 #ifdef POINTERS_EXTEND_UNSIGNED
815 if (GET_MODE(op0) != Pmode)
816 op0 = convert_memory_address (Pmode, op0);
818 op0 = force_reg (Pmode, op0);
820 emit_insn (gen_prefetch (op0, op1, op2));
824 op0 = protect_from_queue (op0, 0);
825 /* Don't do anything with direct references to volatile memory, but
826 generate code to handle other side effects. */
827 if (GET_CODE (op0) != MEM && side_effects_p (op0))
831 /* Get a MEM rtx for expression EXP which is the address of an operand
832 to be used to be used in a string instruction (cmpstrsi, movstrsi, ..). */
838 rtx addr = expand_expr (exp, NULL_RTX, ptr_mode, EXPAND_SUM);
841 #ifdef POINTERS_EXTEND_UNSIGNED
842 if (GET_MODE (addr) != Pmode)
843 addr = convert_memory_address (Pmode, addr);
846 mem = gen_rtx_MEM (BLKmode, memory_address (BLKmode, addr));
848 /* Get an expression we can use to find the attributes to assign to MEM.
849 If it is an ADDR_EXPR, use the operand. Otherwise, dereference it if
850 we can. First remove any nops. */
851 while ((TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
852 || TREE_CODE (exp) == NON_LVALUE_EXPR)
853 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (exp, 0))))
854 exp = TREE_OPERAND (exp, 0);
856 if (TREE_CODE (exp) == ADDR_EXPR)
858 exp = TREE_OPERAND (exp, 0);
859 set_mem_attributes (mem, exp, 0);
861 else if (POINTER_TYPE_P (TREE_TYPE (exp)))
863 exp = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (exp)), exp);
864 /* memcpy, memset and other builtin stringops can alias with anything. */
865 set_mem_alias_set (mem, 0);
871 /* Built-in functions to perform an untyped call and return. */
873 /* For each register that may be used for calling a function, this
874 gives a mode used to copy the register's value. VOIDmode indicates
875 the register is not used for calling a function. If the machine
876 has register windows, this gives only the outbound registers.
877 INCOMING_REGNO gives the corresponding inbound register. */
878 static enum machine_mode apply_args_mode[FIRST_PSEUDO_REGISTER];
880 /* For each register that may be used for returning values, this gives
881 a mode used to copy the register's value. VOIDmode indicates the
882 register is not used for returning values. If the machine has
883 register windows, this gives only the outbound registers.
884 INCOMING_REGNO gives the corresponding inbound register. */
885 static enum machine_mode apply_result_mode[FIRST_PSEUDO_REGISTER];
887 /* For each register that may be used for calling a function, this
888 gives the offset of that register into the block returned by
889 __builtin_apply_args. 0 indicates that the register is not
890 used for calling a function. */
891 static int apply_args_reg_offset[FIRST_PSEUDO_REGISTER];
893 /* Return the offset of register REGNO into the block returned by
894 __builtin_apply_args. This is not declared static, since it is
895 needed in objc-act.c. */
898 apply_args_register_offset (regno)
903 /* Arguments are always put in outgoing registers (in the argument
904 block) if such make sense. */
905 #ifdef OUTGOING_REGNO
906 regno = OUTGOING_REGNO (regno);
908 return apply_args_reg_offset[regno];
911 /* Return the size required for the block returned by __builtin_apply_args,
912 and initialize apply_args_mode. */
917 static int size = -1;
920 enum machine_mode mode;
922 /* The values computed by this function never change. */
925 /* The first value is the incoming arg-pointer. */
926 size = GET_MODE_SIZE (Pmode);
928 /* The second value is the structure value address unless this is
929 passed as an "invisible" first argument. */
930 if (struct_value_rtx)
931 size += GET_MODE_SIZE (Pmode);
933 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
934 if (FUNCTION_ARG_REGNO_P (regno))
936 /* Search for the proper mode for copying this register's
937 value. I'm not sure this is right, but it works so far. */
938 enum machine_mode best_mode = VOIDmode;
940 for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
942 mode = GET_MODE_WIDER_MODE (mode))
943 if (HARD_REGNO_MODE_OK (regno, mode)
944 && HARD_REGNO_NREGS (regno, mode) == 1)
947 if (best_mode == VOIDmode)
948 for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
950 mode = GET_MODE_WIDER_MODE (mode))
951 if (HARD_REGNO_MODE_OK (regno, mode)
952 && have_insn_for (SET, mode))
955 if (best_mode == VOIDmode)
956 for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FLOAT);
958 mode = GET_MODE_WIDER_MODE (mode))
959 if (HARD_REGNO_MODE_OK (regno, mode)
960 && have_insn_for (SET, mode))
963 if (best_mode == VOIDmode)
964 for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_INT);
966 mode = GET_MODE_WIDER_MODE (mode))
967 if (HARD_REGNO_MODE_OK (regno, mode)
968 && have_insn_for (SET, mode))
972 if (mode == VOIDmode)
975 align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
976 if (size % align != 0)
977 size = CEIL (size, align) * align;
978 apply_args_reg_offset[regno] = size;
979 size += GET_MODE_SIZE (mode);
980 apply_args_mode[regno] = mode;
984 apply_args_mode[regno] = VOIDmode;
985 apply_args_reg_offset[regno] = 0;
991 /* Return the size required for the block returned by __builtin_apply,
992 and initialize apply_result_mode. */
997 static int size = -1;
999 enum machine_mode mode;
1001 /* The values computed by this function never change. */
1006 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1007 if (FUNCTION_VALUE_REGNO_P (regno))
1009 /* Search for the proper mode for copying this register's
1010 value. I'm not sure this is right, but it works so far. */
1011 enum machine_mode best_mode = VOIDmode;
1013 for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
1015 mode = GET_MODE_WIDER_MODE (mode))
1016 if (HARD_REGNO_MODE_OK (regno, mode))
1019 if (best_mode == VOIDmode)
1020 for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
1022 mode = GET_MODE_WIDER_MODE (mode))
1023 if (HARD_REGNO_MODE_OK (regno, mode)
1024 && have_insn_for (SET, mode))
1027 if (best_mode == VOIDmode)
1028 for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FLOAT);
1030 mode = GET_MODE_WIDER_MODE (mode))
1031 if (HARD_REGNO_MODE_OK (regno, mode)
1032 && have_insn_for (SET, mode))
1035 if (best_mode == VOIDmode)
1036 for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_INT);
1038 mode = GET_MODE_WIDER_MODE (mode))
1039 if (HARD_REGNO_MODE_OK (regno, mode)
1040 && have_insn_for (SET, mode))
1044 if (mode == VOIDmode)
1047 align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1048 if (size % align != 0)
1049 size = CEIL (size, align) * align;
1050 size += GET_MODE_SIZE (mode);
1051 apply_result_mode[regno] = mode;
1054 apply_result_mode[regno] = VOIDmode;
1056 /* Allow targets that use untyped_call and untyped_return to override
1057 the size so that machine-specific information can be stored here. */
1058 #ifdef APPLY_RESULT_SIZE
1059 size = APPLY_RESULT_SIZE;
1065 #if defined (HAVE_untyped_call) || defined (HAVE_untyped_return)
1066 /* Create a vector describing the result block RESULT. If SAVEP is true,
1067 the result block is used to save the values; otherwise it is used to
1068 restore the values. */
1071 result_vector (savep, result)
1075 int regno, size, align, nelts;
1076 enum machine_mode mode;
1078 rtx *savevec = (rtx *) alloca (FIRST_PSEUDO_REGISTER * sizeof (rtx));
1081 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1082 if ((mode = apply_result_mode[regno]) != VOIDmode)
1084 align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1085 if (size % align != 0)
1086 size = CEIL (size, align) * align;
1087 reg = gen_rtx_REG (mode, savep ? regno : INCOMING_REGNO (regno));
1088 mem = adjust_address (result, mode, size);
1089 savevec[nelts++] = (savep
1090 ? gen_rtx_SET (VOIDmode, mem, reg)
1091 : gen_rtx_SET (VOIDmode, reg, mem));
1092 size += GET_MODE_SIZE (mode);
1094 return gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelts, savevec));
1096 #endif /* HAVE_untyped_call or HAVE_untyped_return */
1098 /* Save the state required to perform an untyped call with the same
1099 arguments as were passed to the current function. */
1102 expand_builtin_apply_args_1 ()
1105 int size, align, regno;
1106 enum machine_mode mode;
1108 /* Create a block where the arg-pointer, structure value address,
1109 and argument registers can be saved. */
1110 registers = assign_stack_local (BLKmode, apply_args_size (), -1);
1112 /* Walk past the arg-pointer and structure value address. */
1113 size = GET_MODE_SIZE (Pmode);
1114 if (struct_value_rtx)
1115 size += GET_MODE_SIZE (Pmode);
1117 /* Save each register used in calling a function to the block. */
1118 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1119 if ((mode = apply_args_mode[regno]) != VOIDmode)
1123 align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1124 if (size % align != 0)
1125 size = CEIL (size, align) * align;
1127 tem = gen_rtx_REG (mode, INCOMING_REGNO (regno));
1129 emit_move_insn (adjust_address (registers, mode, size), tem);
1130 size += GET_MODE_SIZE (mode);
1133 /* Save the arg pointer to the block. */
1134 emit_move_insn (adjust_address (registers, Pmode, 0),
1135 copy_to_reg (virtual_incoming_args_rtx));
1136 size = GET_MODE_SIZE (Pmode);
1138 /* Save the structure value address unless this is passed as an
1139 "invisible" first argument. */
1140 if (struct_value_incoming_rtx)
1142 emit_move_insn (adjust_address (registers, Pmode, size),
1143 copy_to_reg (struct_value_incoming_rtx));
1144 size += GET_MODE_SIZE (Pmode);
1147 /* Return the address of the block. */
1148 return copy_addr_to_reg (XEXP (registers, 0));
1151 /* __builtin_apply_args returns block of memory allocated on
1152 the stack into which is stored the arg pointer, structure
1153 value address, static chain, and all the registers that might
1154 possibly be used in performing a function call. The code is
1155 moved to the start of the function so the incoming values are
1159 expand_builtin_apply_args ()
1161 /* Don't do __builtin_apply_args more than once in a function.
1162 Save the result of the first call and reuse it. */
1163 if (apply_args_value != 0)
1164 return apply_args_value;
1166 /* When this function is called, it means that registers must be
1167 saved on entry to this function. So we migrate the
1168 call to the first insn of this function. */
1173 temp = expand_builtin_apply_args_1 ();
1177 apply_args_value = temp;
1179 /* Put the insns after the NOTE that starts the function.
1180 If this is inside a start_sequence, make the outer-level insn
1181 chain current, so the code is placed at the start of the
1183 push_topmost_sequence ();
1184 emit_insn_before (seq, NEXT_INSN (get_insns ()));
1185 pop_topmost_sequence ();
1190 /* Perform an untyped call and save the state required to perform an
1191 untyped return of whatever value was returned by the given function. */
1194 expand_builtin_apply (function, arguments, argsize)
1195 rtx function, arguments, argsize;
1197 int size, align, regno;
1198 enum machine_mode mode;
1199 rtx incoming_args, result, reg, dest, src, call_insn;
1200 rtx old_stack_level = 0;
1201 rtx call_fusage = 0;
1203 #ifdef POINTERS_EXTEND_UNSIGNED
1204 if (GET_MODE (arguments) != Pmode)
1205 arguments = convert_memory_address (Pmode, arguments);
1208 /* Create a block where the return registers can be saved. */
1209 result = assign_stack_local (BLKmode, apply_result_size (), -1);
1211 /* Fetch the arg pointer from the ARGUMENTS block. */
1212 incoming_args = gen_reg_rtx (Pmode);
1213 emit_move_insn (incoming_args, gen_rtx_MEM (Pmode, arguments));
1214 #ifndef STACK_GROWS_DOWNWARD
1215 incoming_args = expand_simple_binop (Pmode, MINUS, incoming_args, argsize,
1216 incoming_args, 0, OPTAB_LIB_WIDEN);
1219 /* Perform postincrements before actually calling the function. */
1222 /* Push a new argument block and copy the arguments. Do not allow
1223 the (potential) memcpy call below to interfere with our stack
1225 do_pending_stack_adjust ();
1228 /* Save the stack with nonlocal if available */
1229 #ifdef HAVE_save_stack_nonlocal
1230 if (HAVE_save_stack_nonlocal)
1231 emit_stack_save (SAVE_NONLOCAL, &old_stack_level, NULL_RTX);
1234 emit_stack_save (SAVE_BLOCK, &old_stack_level, NULL_RTX);
1236 /* Push a block of memory onto the stack to store the memory arguments.
1237 Save the address in a register, and copy the memory arguments. ??? I
1238 haven't figured out how the calling convention macros effect this,
1239 but it's likely that the source and/or destination addresses in
1240 the block copy will need updating in machine specific ways. */
1241 dest = allocate_dynamic_stack_space (argsize, 0, BITS_PER_UNIT);
1242 dest = gen_rtx_MEM (BLKmode, dest);
1243 set_mem_align (dest, PARM_BOUNDARY);
1244 src = gen_rtx_MEM (BLKmode, incoming_args);
1245 set_mem_align (src, PARM_BOUNDARY);
1246 emit_block_move (dest, src, argsize, BLOCK_OP_NORMAL);
1248 /* Refer to the argument block. */
1250 arguments = gen_rtx_MEM (BLKmode, arguments);
1251 set_mem_align (arguments, PARM_BOUNDARY);
1253 /* Walk past the arg-pointer and structure value address. */
1254 size = GET_MODE_SIZE (Pmode);
1255 if (struct_value_rtx)
1256 size += GET_MODE_SIZE (Pmode);
1258 /* Restore each of the registers previously saved. Make USE insns
1259 for each of these registers for use in making the call. */
1260 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1261 if ((mode = apply_args_mode[regno]) != VOIDmode)
1263 align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1264 if (size % align != 0)
1265 size = CEIL (size, align) * align;
1266 reg = gen_rtx_REG (mode, regno);
1267 emit_move_insn (reg, adjust_address (arguments, mode, size));
1268 use_reg (&call_fusage, reg);
1269 size += GET_MODE_SIZE (mode);
1272 /* Restore the structure value address unless this is passed as an
1273 "invisible" first argument. */
1274 size = GET_MODE_SIZE (Pmode);
1275 if (struct_value_rtx)
1277 rtx value = gen_reg_rtx (Pmode);
1278 emit_move_insn (value, adjust_address (arguments, Pmode, size));
1279 emit_move_insn (struct_value_rtx, value);
1280 if (GET_CODE (struct_value_rtx) == REG)
1281 use_reg (&call_fusage, struct_value_rtx);
1282 size += GET_MODE_SIZE (Pmode);
1285 /* All arguments and registers used for the call are set up by now! */
1286 function = prepare_call_address (function, NULL_TREE, &call_fusage, 0, 0);
1288 /* Ensure address is valid. SYMBOL_REF is already valid, so no need,
1289 and we don't want to load it into a register as an optimization,
1290 because prepare_call_address already did it if it should be done. */
1291 if (GET_CODE (function) != SYMBOL_REF)
1292 function = memory_address (FUNCTION_MODE, function);
1294 /* Generate the actual call instruction and save the return value. */
1295 #ifdef HAVE_untyped_call
1296 if (HAVE_untyped_call)
1297 emit_call_insn (gen_untyped_call (gen_rtx_MEM (FUNCTION_MODE, function),
1298 result, result_vector (1, result)));
1301 #ifdef HAVE_call_value
1302 if (HAVE_call_value)
1306 /* Locate the unique return register. It is not possible to
1307 express a call that sets more than one return register using
1308 call_value; use untyped_call for that. In fact, untyped_call
1309 only needs to save the return registers in the given block. */
1310 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1311 if ((mode = apply_result_mode[regno]) != VOIDmode)
1314 abort (); /* HAVE_untyped_call required. */
1315 valreg = gen_rtx_REG (mode, regno);
1318 emit_call_insn (GEN_CALL_VALUE (valreg,
1319 gen_rtx_MEM (FUNCTION_MODE, function),
1320 const0_rtx, NULL_RTX, const0_rtx));
1322 emit_move_insn (adjust_address (result, GET_MODE (valreg), 0), valreg);
1328 /* Find the CALL insn we just emitted, and attach the register usage
1330 call_insn = last_call_insn ();
1331 add_function_usage_to (call_insn, call_fusage);
1333 /* Restore the stack. */
1334 #ifdef HAVE_save_stack_nonlocal
1335 if (HAVE_save_stack_nonlocal)
1336 emit_stack_restore (SAVE_NONLOCAL, old_stack_level, NULL_RTX);
1339 emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX);
1343 /* Return the address of the result block. */
1344 return copy_addr_to_reg (XEXP (result, 0));
1347 /* Perform an untyped return. */
1350 expand_builtin_return (result)
1353 int size, align, regno;
1354 enum machine_mode mode;
1356 rtx call_fusage = 0;
1358 #ifdef POINTERS_EXTEND_UNSIGNED
1359 if (GET_MODE (result) != Pmode)
1360 result = convert_memory_address (Pmode, result);
1363 apply_result_size ();
1364 result = gen_rtx_MEM (BLKmode, result);
1366 #ifdef HAVE_untyped_return
1367 if (HAVE_untyped_return)
1369 emit_jump_insn (gen_untyped_return (result, result_vector (0, result)));
1375 /* Restore the return value and note that each value is used. */
1377 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1378 if ((mode = apply_result_mode[regno]) != VOIDmode)
1380 align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1381 if (size % align != 0)
1382 size = CEIL (size, align) * align;
1383 reg = gen_rtx_REG (mode, INCOMING_REGNO (regno));
1384 emit_move_insn (reg, adjust_address (result, mode, size));
1386 push_to_sequence (call_fusage);
1387 emit_insn (gen_rtx_USE (VOIDmode, reg));
1388 call_fusage = get_insns ();
1390 size += GET_MODE_SIZE (mode);
1393 /* Put the USE insns before the return. */
1394 emit_insn (call_fusage);
1396 /* Return whatever values was restored by jumping directly to the end
1398 expand_null_return ();
1401 /* Used by expand_builtin_classify_type and fold_builtin_classify_type. */
1403 static enum type_class
1404 type_to_class (type)
1407 switch (TREE_CODE (type))
1409 case VOID_TYPE: return void_type_class;
1410 case INTEGER_TYPE: return integer_type_class;
1411 case CHAR_TYPE: return char_type_class;
1412 case ENUMERAL_TYPE: return enumeral_type_class;
1413 case BOOLEAN_TYPE: return boolean_type_class;
1414 case POINTER_TYPE: return pointer_type_class;
1415 case REFERENCE_TYPE: return reference_type_class;
1416 case OFFSET_TYPE: return offset_type_class;
1417 case REAL_TYPE: return real_type_class;
1418 case COMPLEX_TYPE: return complex_type_class;
1419 case FUNCTION_TYPE: return function_type_class;
1420 case METHOD_TYPE: return method_type_class;
1421 case RECORD_TYPE: return record_type_class;
1423 case QUAL_UNION_TYPE: return union_type_class;
1424 case ARRAY_TYPE: return (TYPE_STRING_FLAG (type)
1425 ? string_type_class : array_type_class);
1426 case SET_TYPE: return set_type_class;
1427 case FILE_TYPE: return file_type_class;
1428 case LANG_TYPE: return lang_type_class;
1429 default: return no_type_class;
1433 /* Expand a call to __builtin_classify_type with arguments found in
1437 expand_builtin_classify_type (arglist)
1441 return GEN_INT (type_to_class (TREE_TYPE (TREE_VALUE (arglist))));
1442 return GEN_INT (no_type_class);
1445 /* Expand expression EXP, which is a call to __builtin_constant_p. */
1448 expand_builtin_constant_p (arglist, target_mode)
1450 enum machine_mode target_mode;
1456 arglist = TREE_VALUE (arglist);
1458 /* We have taken care of the easy cases during constant folding. This
1459 case is not obvious, so emit (constant_p_rtx (ARGLIST)) and let CSE
1460 get a chance to see if it can deduce whether ARGLIST is constant. */
1462 current_function_calls_constant_p = 1;
1464 tmp = expand_expr (arglist, NULL_RTX, VOIDmode, 0);
1465 tmp = gen_rtx_CONSTANT_P_RTX (target_mode, tmp);
1469 /* Return mathematic function equivalent to FN but operating directly on TYPE,
1472 mathfn_built_in (type, fn)
1474 enum built_in_function fn;
1476 enum built_in_function fcode = NOT_BUILT_IN;
1477 if (TYPE_MODE (type) == TYPE_MODE (double_type_node))
1481 case BUILT_IN_SQRTF:
1482 case BUILT_IN_SQRTL:
1483 fcode = BUILT_IN_SQRT;
1488 fcode = BUILT_IN_SIN;
1493 fcode = BUILT_IN_COS;
1498 fcode = BUILT_IN_EXP;
1503 fcode = BUILT_IN_LOG;
1505 case BUILT_IN_FLOOR:
1506 case BUILT_IN_FLOORF:
1507 case BUILT_IN_FLOORL:
1508 fcode = BUILT_IN_FLOOR;
1511 case BUILT_IN_CEILF:
1512 case BUILT_IN_CEILL:
1513 fcode = BUILT_IN_CEIL;
1515 case BUILT_IN_TRUNC:
1516 case BUILT_IN_TRUNCF:
1517 case BUILT_IN_TRUNCL:
1518 fcode = BUILT_IN_TRUNC;
1520 case BUILT_IN_ROUND:
1521 case BUILT_IN_ROUNDF:
1522 case BUILT_IN_ROUNDL:
1523 fcode = BUILT_IN_ROUND;
1525 case BUILT_IN_NEARBYINT:
1526 case BUILT_IN_NEARBYINTF:
1527 case BUILT_IN_NEARBYINTL:
1528 fcode = BUILT_IN_NEARBYINT;
1533 else if (TYPE_MODE (type) == TYPE_MODE (float_type_node))
1537 case BUILT_IN_SQRTF:
1538 case BUILT_IN_SQRTL:
1539 fcode = BUILT_IN_SQRTF;
1544 fcode = BUILT_IN_SINF;
1549 fcode = BUILT_IN_COSF;
1554 fcode = BUILT_IN_EXPF;
1559 fcode = BUILT_IN_LOGF;
1561 case BUILT_IN_FLOOR:
1562 case BUILT_IN_FLOORF:
1563 case BUILT_IN_FLOORL:
1564 fcode = BUILT_IN_FLOORF;
1567 case BUILT_IN_CEILF:
1568 case BUILT_IN_CEILL:
1569 fcode = BUILT_IN_CEILF;
1571 case BUILT_IN_TRUNC:
1572 case BUILT_IN_TRUNCF:
1573 case BUILT_IN_TRUNCL:
1574 fcode = BUILT_IN_TRUNCF;
1576 case BUILT_IN_ROUND:
1577 case BUILT_IN_ROUNDF:
1578 case BUILT_IN_ROUNDL:
1579 fcode = BUILT_IN_ROUNDF;
1581 case BUILT_IN_NEARBYINT:
1582 case BUILT_IN_NEARBYINTF:
1583 case BUILT_IN_NEARBYINTL:
1584 fcode = BUILT_IN_NEARBYINTF;
1589 else if (TYPE_MODE (type) == TYPE_MODE (long_double_type_node))
1593 case BUILT_IN_SQRTF:
1594 case BUILT_IN_SQRTL:
1595 fcode = BUILT_IN_SQRTL;
1600 fcode = BUILT_IN_SINL;
1605 fcode = BUILT_IN_COSL;
1610 fcode = BUILT_IN_EXPL;
1615 fcode = BUILT_IN_LOGL;
1617 case BUILT_IN_FLOOR:
1618 case BUILT_IN_FLOORF:
1619 case BUILT_IN_FLOORL:
1620 fcode = BUILT_IN_FLOORL;
1623 case BUILT_IN_CEILF:
1624 case BUILT_IN_CEILL:
1625 fcode = BUILT_IN_CEILL;
1627 case BUILT_IN_TRUNC:
1628 case BUILT_IN_TRUNCF:
1629 case BUILT_IN_TRUNCL:
1630 fcode = BUILT_IN_TRUNCL;
1632 case BUILT_IN_ROUND:
1633 case BUILT_IN_ROUNDF:
1634 case BUILT_IN_ROUNDL:
1635 fcode = BUILT_IN_ROUNDL;
1637 case BUILT_IN_NEARBYINT:
1638 case BUILT_IN_NEARBYINTF:
1639 case BUILT_IN_NEARBYINTL:
1640 fcode = BUILT_IN_NEARBYINTL;
1645 return implicit_built_in_decls[fcode];
1648 /* If errno must be maintained, expand the RTL to check if the result,
1649 TARGET, of a built-in function call, EXP, is NaN, and if so set
1653 expand_errno_check (exp, target)
1659 if (flag_errno_math && HONOR_NANS (GET_MODE (target)))
1661 lab = gen_label_rtx ();
1663 /* Test the result; if it is NaN, set errno=EDOM because
1664 the argument was not in the domain. */
1665 emit_cmp_and_jump_insns (target, target, EQ, 0, GET_MODE (target),
1670 #ifdef GEN_ERRNO_RTX
1671 rtx errno_rtx = GEN_ERRNO_RTX;
1674 = gen_rtx_MEM (word_mode, gen_rtx_SYMBOL_REF (Pmode, "errno"));
1677 emit_move_insn (errno_rtx, GEN_INT (TARGET_EDOM));
1680 /* We can't set errno=EDOM directly; let the library call do it.
1681 Pop the arguments right away in case the call gets deleted. */
1683 expand_call (exp, target, 0);
1692 /* Expand a call to one of the builtin math functions (sin, cos, or sqrt).
1693 Return 0 if a normal call should be emitted rather than expanding the
1694 function in-line. EXP is the expression that is a call to the builtin
1695 function; if convenient, the result should be placed in TARGET.
1696 SUBTARGET may be used as the target for computing one of EXP's operands. */
1699 expand_builtin_mathfn (exp, target, subtarget)
1701 rtx target, subtarget;
1703 optab builtin_optab;
1705 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
1706 tree arglist = TREE_OPERAND (exp, 1);
1707 enum machine_mode argmode;
1708 bool errno_set = true;
1710 if (!validate_arglist (arglist, REAL_TYPE, VOID_TYPE))
1713 /* Stabilize and compute the argument. */
1714 if (TREE_CODE (TREE_VALUE (arglist)) != VAR_DECL
1715 && TREE_CODE (TREE_VALUE (arglist)) != PARM_DECL)
1717 exp = copy_node (exp);
1718 TREE_OPERAND (exp, 1) = arglist;
1719 /* Wrap the computation of the argument in a SAVE_EXPR. That
1720 way, if we need to expand the argument again (as in the
1721 flag_errno_math case below where we cannot directly set
1722 errno), we will not perform side-effects more than once.
1723 Note that here we're mutating the original EXP as well as the
1724 copy; that's the right thing to do in case the original EXP
1725 is expanded later. */
1726 TREE_VALUE (arglist) = save_expr (TREE_VALUE (arglist));
1727 arglist = copy_node (arglist);
1729 op0 = expand_expr (TREE_VALUE (arglist), subtarget, VOIDmode, 0);
1731 /* Make a suitable register to place result in. */
1732 target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp)));
1737 switch (DECL_FUNCTION_CODE (fndecl))
1742 builtin_optab = sin_optab; break;
1746 builtin_optab = cos_optab; break;
1748 case BUILT_IN_SQRTF:
1749 case BUILT_IN_SQRTL:
1750 builtin_optab = sqrt_optab; break;
1754 builtin_optab = exp_optab; break;
1758 builtin_optab = log_optab; break;
1759 case BUILT_IN_FLOOR:
1760 case BUILT_IN_FLOORF:
1761 case BUILT_IN_FLOORL:
1762 errno_set = false ; builtin_optab = floor_optab; break;
1764 case BUILT_IN_CEILF:
1765 case BUILT_IN_CEILL:
1766 errno_set = false ; builtin_optab = ceil_optab; break;
1767 case BUILT_IN_TRUNC:
1768 case BUILT_IN_TRUNCF:
1769 case BUILT_IN_TRUNCL:
1770 errno_set = false ; builtin_optab = trunc_optab; break;
1771 case BUILT_IN_ROUND:
1772 case BUILT_IN_ROUNDF:
1773 case BUILT_IN_ROUNDL:
1774 errno_set = false ; builtin_optab = round_optab; break;
1775 case BUILT_IN_NEARBYINT:
1776 case BUILT_IN_NEARBYINTF:
1777 case BUILT_IN_NEARBYINTL:
1778 errno_set = false ; builtin_optab = nearbyint_optab; break;
1783 /* Compute into TARGET.
1784 Set TARGET to wherever the result comes back. */
1785 argmode = TYPE_MODE (TREE_TYPE (TREE_VALUE (arglist)));
1786 target = expand_unop (argmode, builtin_optab, op0, target, 0);
1788 /* If we were unable to expand via the builtin, stop the
1789 sequence (without outputting the insns) and return 0, causing
1790 a call to the library function. */
1798 expand_errno_check (exp, target);
1800 /* Output the entire sequence. */
1801 insns = get_insns ();
1808 /* Expand a call to the builtin binary math functions (pow and atan2).
1809 Return 0 if a normal call should be emitted rather than expanding the
1810 function in-line. EXP is the expression that is a call to the builtin
1811 function; if convenient, the result should be placed in TARGET.
1812 SUBTARGET may be used as the target for computing one of EXP's
1816 expand_builtin_mathfn_2 (exp, target, subtarget)
1818 rtx target, subtarget;
1820 optab builtin_optab;
1821 rtx op0, op1, insns;
1822 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
1823 tree arglist = TREE_OPERAND (exp, 1);
1825 enum machine_mode argmode;
1826 bool errno_set = true;
1829 if (!validate_arglist (arglist, REAL_TYPE, REAL_TYPE, VOID_TYPE))
1832 arg0 = TREE_VALUE (arglist);
1833 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
1835 /* Stabilize the arguments. */
1836 if (TREE_CODE (arg0) != VAR_DECL && TREE_CODE (arg0) != PARM_DECL)
1838 arg0 = save_expr (arg0);
1839 TREE_VALUE (arglist) = arg0;
1842 if (TREE_CODE (arg1) != VAR_DECL && TREE_CODE (arg1) != PARM_DECL)
1844 arg1 = save_expr (arg1);
1845 TREE_VALUE (TREE_CHAIN (arglist)) = arg1;
1851 exp = copy_node (exp);
1852 arglist = tree_cons (NULL_TREE, arg0,
1853 build_tree_list (NULL_TREE, arg1));
1854 TREE_OPERAND (exp, 1) = arglist;
1857 op0 = expand_expr (arg0, subtarget, VOIDmode, 0);
1858 op1 = expand_expr (arg1, 0, VOIDmode, 0);
1860 /* Make a suitable register to place result in. */
1861 target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp)));
1866 switch (DECL_FUNCTION_CODE (fndecl))
1871 builtin_optab = pow_optab; break;
1872 case BUILT_IN_ATAN2:
1873 case BUILT_IN_ATAN2F:
1874 case BUILT_IN_ATAN2L:
1875 builtin_optab = atan2_optab; break;
1880 /* Compute into TARGET.
1881 Set TARGET to wherever the result comes back. */
1882 argmode = TYPE_MODE (TREE_TYPE (arg0));
1883 target = expand_binop (argmode, builtin_optab, op0, op1,
1884 target, 0, OPTAB_DIRECT);
1886 /* If we were unable to expand via the builtin, stop the
1887 sequence (without outputting the insns) and return 0, causing
1888 a call to the library function. */
1896 expand_errno_check (exp, target);
1898 /* Output the entire sequence. */
1899 insns = get_insns ();
1906 /* Expand expression EXP which is a call to the strlen builtin. Return 0
1907 if we failed the caller should emit a normal call, otherwise
1908 try to get the result in TARGET, if convenient. */
1911 expand_builtin_strlen (arglist, target, target_mode)
1914 enum machine_mode target_mode;
1916 if (!validate_arglist (arglist, POINTER_TYPE, VOID_TYPE))
1921 tree len, src = TREE_VALUE (arglist);
1922 rtx result, src_reg, char_rtx, before_strlen;
1923 enum machine_mode insn_mode = target_mode, char_mode;
1924 enum insn_code icode = CODE_FOR_nothing;
1927 /* If the length can be computed at compile-time, return it. */
1928 len = c_strlen (src);
1930 return expand_expr (len, target, target_mode, EXPAND_NORMAL);
1932 align = get_pointer_alignment (src, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
1934 /* If SRC is not a pointer type, don't do this operation inline. */
1938 /* Bail out if we can't compute strlen in the right mode. */
1939 while (insn_mode != VOIDmode)
1941 icode = strlen_optab->handlers[(int) insn_mode].insn_code;
1942 if (icode != CODE_FOR_nothing)
1945 insn_mode = GET_MODE_WIDER_MODE (insn_mode);
1947 if (insn_mode == VOIDmode)
1950 /* Make a place to write the result of the instruction. */
1953 && GET_CODE (result) == REG
1954 && GET_MODE (result) == insn_mode
1955 && REGNO (result) >= FIRST_PSEUDO_REGISTER))
1956 result = gen_reg_rtx (insn_mode);
1958 /* Make a place to hold the source address. We will not expand
1959 the actual source until we are sure that the expansion will
1960 not fail -- there are trees that cannot be expanded twice. */
1961 src_reg = gen_reg_rtx (Pmode);
1963 /* Mark the beginning of the strlen sequence so we can emit the
1964 source operand later. */
1965 before_strlen = get_last_insn ();
1967 char_rtx = const0_rtx;
1968 char_mode = insn_data[(int) icode].operand[2].mode;
1969 if (! (*insn_data[(int) icode].operand[2].predicate) (char_rtx,
1971 char_rtx = copy_to_mode_reg (char_mode, char_rtx);
1973 pat = GEN_FCN (icode) (result, gen_rtx_MEM (BLKmode, src_reg),
1974 char_rtx, GEN_INT (align));
1979 /* Now that we are assured of success, expand the source. */
1981 pat = memory_address (BLKmode,
1982 expand_expr (src, src_reg, ptr_mode, EXPAND_SUM));
1984 emit_move_insn (src_reg, pat);
1989 emit_insn_after (pat, before_strlen);
1991 emit_insn_before (pat, get_insns ());
1993 /* Return the value in the proper mode for this function. */
1994 if (GET_MODE (result) == target_mode)
1996 else if (target != 0)
1997 convert_move (target, result, 0);
1999 target = convert_to_mode (target_mode, result, 0);
2005 /* Expand a call to the strstr builtin. Return 0 if we failed the
2006 caller should emit a normal call, otherwise try to get the result
2007 in TARGET, if convenient (and in mode MODE if that's convenient). */
2010 expand_builtin_strstr (arglist, target, mode)
2013 enum machine_mode mode;
2015 if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
2019 tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
2021 const char *p1, *p2;
2030 const char *r = strstr (p1, p2);
2035 /* Return an offset into the constant string argument. */
2036 return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1),
2037 s1, ssize_int (r - p1))),
2038 target, mode, EXPAND_NORMAL);
2042 return expand_expr (s1, target, mode, EXPAND_NORMAL);
2047 fn = implicit_built_in_decls[BUILT_IN_STRCHR];
2051 /* New argument list transforming strstr(s1, s2) to
2052 strchr(s1, s2[0]). */
2054 build_tree_list (NULL_TREE, build_int_2 (p2[0], 0));
2055 arglist = tree_cons (NULL_TREE, s1, arglist);
2056 return expand_expr (build_function_call_expr (fn, arglist),
2057 target, mode, EXPAND_NORMAL);
2061 /* Expand a call to the strchr builtin. Return 0 if we failed the
2062 caller should emit a normal call, otherwise try to get the result
2063 in TARGET, if convenient (and in mode MODE if that's convenient). */
2066 expand_builtin_strchr (arglist, target, mode)
2069 enum machine_mode mode;
2071 if (!validate_arglist (arglist, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
2075 tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
2078 if (TREE_CODE (s2) != INTEGER_CST)
2087 if (target_char_cast (s2, &c))
2095 /* Return an offset into the constant string argument. */
2096 return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1),
2097 s1, ssize_int (r - p1))),
2098 target, mode, EXPAND_NORMAL);
2101 /* FIXME: Should use here strchrM optab so that ports can optimize
2107 /* Expand a call to the strrchr builtin. Return 0 if we failed the
2108 caller should emit a normal call, otherwise try to get the result
2109 in TARGET, if convenient (and in mode MODE if that's convenient). */
2112 expand_builtin_strrchr (arglist, target, mode)
2115 enum machine_mode mode;
2117 if (!validate_arglist (arglist, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
2121 tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
2125 if (TREE_CODE (s2) != INTEGER_CST)
2134 if (target_char_cast (s2, &c))
2137 r = strrchr (p1, c);
2142 /* Return an offset into the constant string argument. */
2143 return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1),
2144 s1, ssize_int (r - p1))),
2145 target, mode, EXPAND_NORMAL);
2148 if (! integer_zerop (s2))
2151 fn = implicit_built_in_decls[BUILT_IN_STRCHR];
2155 /* Transform strrchr(s1, '\0') to strchr(s1, '\0'). */
2156 return expand_expr (build_function_call_expr (fn, arglist),
2157 target, mode, EXPAND_NORMAL);
2161 /* Expand a call to the strpbrk builtin. Return 0 if we failed the
2162 caller should emit a normal call, otherwise try to get the result
2163 in TARGET, if convenient (and in mode MODE if that's convenient). */
2166 expand_builtin_strpbrk (arglist, target, mode)
2169 enum machine_mode mode;
2171 if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
2175 tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
2177 const char *p1, *p2;
2186 const char *r = strpbrk (p1, p2);
2191 /* Return an offset into the constant string argument. */
2192 return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1),
2193 s1, ssize_int (r - p1))),
2194 target, mode, EXPAND_NORMAL);
2199 /* strpbrk(x, "") == NULL.
2200 Evaluate and ignore the arguments in case they had
2202 expand_expr (s1, const0_rtx, VOIDmode, EXPAND_NORMAL);
2207 return 0; /* Really call strpbrk. */
2209 fn = implicit_built_in_decls[BUILT_IN_STRCHR];
2213 /* New argument list transforming strpbrk(s1, s2) to
2214 strchr(s1, s2[0]). */
2216 build_tree_list (NULL_TREE, build_int_2 (p2[0], 0));
2217 arglist = tree_cons (NULL_TREE, s1, arglist);
2218 return expand_expr (build_function_call_expr (fn, arglist),
2219 target, mode, EXPAND_NORMAL);
2223 /* Callback routine for store_by_pieces. Read GET_MODE_BITSIZE (MODE)
2224 bytes from constant string DATA + OFFSET and return it as target
2228 builtin_memcpy_read_str (data, offset, mode)
2230 HOST_WIDE_INT offset;
2231 enum machine_mode mode;
2233 const char *str = (const char *) data;
2236 || ((unsigned HOST_WIDE_INT) offset + GET_MODE_SIZE (mode)
2237 > strlen (str) + 1))
2238 abort (); /* Attempt to read past the end of constant string. */
2240 return c_readstr (str + offset, mode);
2243 /* Expand a call to the memcpy builtin, with arguments in ARGLIST.
2244 Return 0 if we failed, the caller should emit a normal call,
2245 otherwise try to get the result in TARGET, if convenient (and in
2246 mode MODE if that's convenient). If ENDP is 0 return the
2247 destination pointer, if ENDP is 1 return the end pointer ala
2248 mempcpy, and if ENDP is 2 return the end pointer minus one ala
2251 expand_builtin_memcpy (arglist, target, mode, endp)
2254 enum machine_mode mode;
2257 if (!validate_arglist (arglist,
2258 POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
2262 tree dest = TREE_VALUE (arglist);
2263 tree src = TREE_VALUE (TREE_CHAIN (arglist));
2264 tree len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
2265 const char *src_str;
2267 unsigned int src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
2268 unsigned int dest_align
2269 = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
2270 rtx dest_mem, src_mem, dest_addr, len_rtx;
2272 /* If DEST is not a pointer type, call the normal function. */
2273 if (dest_align == 0)
2276 /* If the LEN parameter is zero, return DEST. */
2277 if (host_integerp (len, 1) && tree_low_cst (len, 1) == 0)
2279 /* Evaluate and ignore SRC in case it has side-effects. */
2280 expand_expr (src, const0_rtx, VOIDmode, EXPAND_NORMAL);
2281 return expand_expr (dest, target, mode, EXPAND_NORMAL);
2284 /* If either SRC is not a pointer type, don't do this
2285 operation in-line. */
2289 dest_mem = get_memory_rtx (dest);
2290 set_mem_align (dest_mem, dest_align);
2291 len_rtx = expand_expr (len, NULL_RTX, VOIDmode, 0);
2292 src_str = c_getstr (src);
2294 /* If SRC is a string constant and block move would be done
2295 by pieces, we can avoid loading the string from memory
2296 and only stored the computed constants. */
2298 && GET_CODE (len_rtx) == CONST_INT
2299 && (unsigned HOST_WIDE_INT) INTVAL (len_rtx) <= strlen (src_str) + 1
2300 && can_store_by_pieces (INTVAL (len_rtx), builtin_memcpy_read_str,
2301 (PTR) src_str, dest_align))
2303 store_by_pieces (dest_mem, INTVAL (len_rtx),
2304 builtin_memcpy_read_str,
2305 (PTR) src_str, dest_align);
2306 dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
2307 #ifdef POINTERS_EXTEND_UNSIGNED
2308 if (GET_MODE (dest_mem) != ptr_mode)
2309 dest_mem = convert_memory_address (ptr_mode, dest_mem);
2313 rtx result = gen_rtx_PLUS (GET_MODE (dest_mem), dest_mem, len_rtx);
2315 result = simplify_gen_binary (MINUS, GET_MODE (result), result, const1_rtx);
2322 src_mem = get_memory_rtx (src);
2323 set_mem_align (src_mem, src_align);
2325 /* Copy word part most expediently. */
2326 dest_addr = emit_block_move (dest_mem, src_mem, len_rtx,
2331 dest_addr = force_operand (XEXP (dest_mem, 0), NULL_RTX);
2332 #ifdef POINTERS_EXTEND_UNSIGNED
2333 if (GET_MODE (dest_addr) != ptr_mode)
2334 dest_addr = convert_memory_address (ptr_mode, dest_addr);
2340 rtx result = gen_rtx_PLUS (GET_MODE (dest_addr), dest_addr, len_rtx);
2342 result = simplify_gen_binary (MINUS, GET_MODE (result), result, const1_rtx);
2350 /* Expand a call to the mempcpy builtin, with arguments in ARGLIST.
2351 Return 0 if we failed the caller should emit a normal call,
2352 otherwise try to get the result in TARGET, if convenient (and in
2353 mode MODE if that's convenient). */
2356 expand_builtin_mempcpy (arglist, target, mode)
2359 enum machine_mode mode;
2361 if (!validate_arglist (arglist,
2362 POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
2366 /* If return value is ignored, transform mempcpy into memcpy. */
2367 if (target == const0_rtx)
2370 rtx ret = expand_builtin_memcpy (arglist, target, mode, /*endp=*/0);
2375 fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
2379 return expand_expr (build_function_call_expr (fn, arglist),
2380 target, mode, EXPAND_NORMAL);
2383 return expand_builtin_memcpy (arglist, target, mode, /*endp=*/1);
2387 /* Expand expression EXP, which is a call to the memmove builtin. Return 0
2388 if we failed the caller should emit a normal call. */
2391 expand_builtin_memmove (arglist, target, mode)
2394 enum machine_mode mode;
2396 if (!validate_arglist (arglist,
2397 POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
2401 tree dest = TREE_VALUE (arglist);
2402 tree src = TREE_VALUE (TREE_CHAIN (arglist));
2403 tree len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
2405 unsigned int src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
2406 unsigned int dest_align
2407 = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
2409 /* If DEST is not a pointer type, call the normal function. */
2410 if (dest_align == 0)
2413 /* If the LEN parameter is zero, return DEST. */
2414 if (host_integerp (len, 1) && tree_low_cst (len, 1) == 0)
2416 /* Evaluate and ignore SRC in case it has side-effects. */
2417 expand_expr (src, const0_rtx, VOIDmode, EXPAND_NORMAL);
2418 return expand_expr (dest, target, mode, EXPAND_NORMAL);
2421 /* If either SRC is not a pointer type, don't do this
2422 operation in-line. */
2426 /* If src is a string constant and strings are not writable,
2427 we can use normal memcpy. */
2428 if (!flag_writable_strings && c_getstr (src))
2429 return expand_builtin_memcpy (arglist, target, mode, 0);
2431 /* Otherwise, call the normal function. */
2436 /* Expand expression EXP, which is a call to the bcopy builtin. Return 0
2437 if we failed the caller should emit a normal call. */
2440 expand_builtin_bcopy (arglist)
2443 tree src, dest, size, newarglist;
2445 if (!validate_arglist (arglist,
2446 POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
2449 src = TREE_VALUE (arglist);
2450 dest = TREE_VALUE (TREE_CHAIN (arglist));
2451 size = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
2453 /* New argument list transforming bcopy(ptr x, ptr y, int z) to
2454 memmove(ptr y, ptr x, size_t z). This is done this way
2455 so that if it isn't expanded inline, we fallback to
2456 calling bcopy instead of memmove. */
2458 newarglist = build_tree_list (NULL_TREE, convert (sizetype, size));
2459 newarglist = tree_cons (NULL_TREE, src, newarglist);
2460 newarglist = tree_cons (NULL_TREE, dest, newarglist);
2462 return expand_builtin_memmove (newarglist, const0_rtx, VOIDmode);
2465 /* Expand expression EXP, which is a call to the strcpy builtin. Return 0
2466 if we failed the caller should emit a normal call, otherwise try to get
2467 the result in TARGET, if convenient (and in mode MODE if that's
2471 expand_builtin_strcpy (arglist, target, mode)
2474 enum machine_mode mode;
2478 if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
2481 fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
2485 len = c_strlen (TREE_VALUE (TREE_CHAIN (arglist)));
2489 len = size_binop (PLUS_EXPR, len, ssize_int (1));
2490 chainon (arglist, build_tree_list (NULL_TREE, len));
2491 return expand_expr (build_function_call_expr (fn, arglist),
2492 target, mode, EXPAND_NORMAL);
2495 /* Expand a call to the stpcpy builtin, with arguments in ARGLIST.
2496 Return 0 if we failed the caller should emit a normal call,
2497 otherwise try to get the result in TARGET, if convenient (and in
2498 mode MODE if that's convenient). */
2501 expand_builtin_stpcpy (arglist, target, mode)
2504 enum machine_mode mode;
2506 if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
2513 /* If return value is ignored, transform stpcpy into strcpy. */
2514 if (target == const0_rtx)
2517 rtx ret = expand_builtin_strcpy (arglist, target, mode);
2522 fn = implicit_built_in_decls[BUILT_IN_STRCPY];
2526 return expand_expr (build_function_call_expr (fn, arglist),
2527 target, mode, EXPAND_NORMAL);
2530 len = c_strlen (TREE_VALUE (TREE_CHAIN (arglist)));
2534 len = fold (size_binop (PLUS_EXPR, len, ssize_int (1)));
2535 newarglist = copy_list (arglist);
2536 chainon (newarglist, build_tree_list (NULL_TREE, len));
2537 return expand_builtin_memcpy (newarglist, target, mode, /*endp=*/2);
2541 /* Callback routine for store_by_pieces. Read GET_MODE_BITSIZE (MODE)
2542 bytes from constant string DATA + OFFSET and return it as target
2546 builtin_strncpy_read_str (data, offset, mode)
2548 HOST_WIDE_INT offset;
2549 enum machine_mode mode;
2551 const char *str = (const char *) data;
2553 if ((unsigned HOST_WIDE_INT) offset > strlen (str))
2556 return c_readstr (str + offset, mode);
2559 /* Expand expression EXP, which is a call to the strncpy builtin. Return 0
2560 if we failed the caller should emit a normal call. */
2563 expand_builtin_strncpy (arglist, target, mode)
2566 enum machine_mode mode;
2568 if (!validate_arglist (arglist,
2569 POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
2573 tree slen = c_strlen (TREE_VALUE (TREE_CHAIN (arglist)));
2574 tree len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
2577 /* We must be passed a constant len parameter. */
2578 if (TREE_CODE (len) != INTEGER_CST)
2581 /* If the len parameter is zero, return the dst parameter. */
2582 if (integer_zerop (len))
2584 /* Evaluate and ignore the src argument in case it has
2586 expand_expr (TREE_VALUE (TREE_CHAIN (arglist)), const0_rtx,
2587 VOIDmode, EXPAND_NORMAL);
2588 /* Return the dst parameter. */
2589 return expand_expr (TREE_VALUE (arglist), target, mode,
2593 /* Now, we must be passed a constant src ptr parameter. */
2594 if (slen == 0 || TREE_CODE (slen) != INTEGER_CST)
2597 slen = size_binop (PLUS_EXPR, slen, ssize_int (1));
2599 /* We're required to pad with trailing zeros if the requested
2600 len is greater than strlen(s2)+1. In that case try to
2601 use store_by_pieces, if it fails, punt. */
2602 if (tree_int_cst_lt (slen, len))
2604 tree dest = TREE_VALUE (arglist);
2605 unsigned int dest_align
2606 = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
2607 const char *p = c_getstr (TREE_VALUE (TREE_CHAIN (arglist)));
2610 if (!p || dest_align == 0 || !host_integerp (len, 1)
2611 || !can_store_by_pieces (tree_low_cst (len, 1),
2612 builtin_strncpy_read_str,
2613 (PTR) p, dest_align))
2616 dest_mem = get_memory_rtx (dest);
2617 store_by_pieces (dest_mem, tree_low_cst (len, 1),
2618 builtin_strncpy_read_str,
2619 (PTR) p, dest_align);
2620 dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
2621 #ifdef POINTERS_EXTEND_UNSIGNED
2622 if (GET_MODE (dest_mem) != ptr_mode)
2623 dest_mem = convert_memory_address (ptr_mode, dest_mem);
2628 /* OK transform into builtin memcpy. */
2629 fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
2632 return expand_expr (build_function_call_expr (fn, arglist),
2633 target, mode, EXPAND_NORMAL);
2637 /* Callback routine for store_by_pieces. Read GET_MODE_BITSIZE (MODE)
2638 bytes from constant string DATA + OFFSET and return it as target
2642 builtin_memset_read_str (data, offset, mode)
2644 HOST_WIDE_INT offset ATTRIBUTE_UNUSED;
2645 enum machine_mode mode;
2647 const char *c = (const char *) data;
2648 char *p = alloca (GET_MODE_SIZE (mode));
2650 memset (p, *c, GET_MODE_SIZE (mode));
2652 return c_readstr (p, mode);
2655 /* Callback routine for store_by_pieces. Return the RTL of a register
2656 containing GET_MODE_SIZE (MODE) consecutive copies of the unsigned
2657 char value given in the RTL register data. For example, if mode is
2658 4 bytes wide, return the RTL for 0x01010101*data. */
2661 builtin_memset_gen_str (data, offset, mode)
2663 HOST_WIDE_INT offset ATTRIBUTE_UNUSED;
2664 enum machine_mode mode;
2670 size = GET_MODE_SIZE (mode);
2675 memset (p, 1, size);
2676 coeff = c_readstr (p, mode);
2678 target = convert_to_mode (mode, (rtx) data, 1);
2679 target = expand_mult (mode, target, coeff, NULL_RTX, 1);
2680 return force_reg (mode, target);
2683 /* Expand expression EXP, which is a call to the memset builtin. Return 0
2684 if we failed the caller should emit a normal call, otherwise try to get
2685 the result in TARGET, if convenient (and in mode MODE if that's
2689 expand_builtin_memset (arglist, target, mode)
2692 enum machine_mode mode;
2694 if (!validate_arglist (arglist,
2695 POINTER_TYPE, INTEGER_TYPE, INTEGER_TYPE, VOID_TYPE))
2699 tree dest = TREE_VALUE (arglist);
2700 tree val = TREE_VALUE (TREE_CHAIN (arglist));
2701 tree len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
2704 unsigned int dest_align
2705 = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
2706 rtx dest_mem, dest_addr, len_rtx;
2708 /* If DEST is not a pointer type, don't do this
2709 operation in-line. */
2710 if (dest_align == 0)
2713 /* If the LEN parameter is zero, return DEST. */
2714 if (host_integerp (len, 1) && tree_low_cst (len, 1) == 0)
2716 /* Evaluate and ignore VAL in case it has side-effects. */
2717 expand_expr (val, const0_rtx, VOIDmode, EXPAND_NORMAL);
2718 return expand_expr (dest, target, mode, EXPAND_NORMAL);
2721 if (TREE_CODE (val) != INTEGER_CST)
2725 if (!host_integerp (len, 1))
2728 if (optimize_size && tree_low_cst (len, 1) > 1)
2731 /* Assume that we can memset by pieces if we can store the
2732 * the coefficients by pieces (in the required modes).
2733 * We can't pass builtin_memset_gen_str as that emits RTL. */
2735 if (!can_store_by_pieces (tree_low_cst (len, 1),
2736 builtin_memset_read_str,
2737 (PTR) &c, dest_align))
2740 val = fold (build1 (CONVERT_EXPR, unsigned_char_type_node, val));
2741 val_rtx = expand_expr (val, NULL_RTX, VOIDmode, 0);
2742 val_rtx = force_reg (TYPE_MODE (unsigned_char_type_node),
2744 dest_mem = get_memory_rtx (dest);
2745 store_by_pieces (dest_mem, tree_low_cst (len, 1),
2746 builtin_memset_gen_str,
2747 (PTR) val_rtx, dest_align);
2748 dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
2749 #ifdef POINTERS_EXTEND_UNSIGNED
2750 if (GET_MODE (dest_mem) != ptr_mode)
2751 dest_mem = convert_memory_address (ptr_mode, dest_mem);
2756 if (target_char_cast (val, &c))
2761 if (!host_integerp (len, 1))
2763 if (!can_store_by_pieces (tree_low_cst (len, 1),
2764 builtin_memset_read_str, (PTR) &c,
2768 dest_mem = get_memory_rtx (dest);
2769 store_by_pieces (dest_mem, tree_low_cst (len, 1),
2770 builtin_memset_read_str,
2771 (PTR) &c, dest_align);
2772 dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
2773 #ifdef POINTERS_EXTEND_UNSIGNED
2774 if (GET_MODE (dest_mem) != ptr_mode)
2775 dest_mem = convert_memory_address (ptr_mode, dest_mem);
2780 len_rtx = expand_expr (len, NULL_RTX, VOIDmode, 0);
2782 dest_mem = get_memory_rtx (dest);
2783 set_mem_align (dest_mem, dest_align);
2784 dest_addr = clear_storage (dest_mem, len_rtx);
2788 dest_addr = force_operand (XEXP (dest_mem, 0), NULL_RTX);
2789 #ifdef POINTERS_EXTEND_UNSIGNED
2790 if (GET_MODE (dest_addr) != ptr_mode)
2791 dest_addr = convert_memory_address (ptr_mode, dest_addr);
2799 /* Expand expression EXP, which is a call to the bzero builtin. Return 0
2800 if we failed the caller should emit a normal call. */
2803 expand_builtin_bzero (arglist)
2806 tree dest, size, newarglist;
2808 if (!validate_arglist (arglist, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
2811 dest = TREE_VALUE (arglist);
2812 size = TREE_VALUE (TREE_CHAIN (arglist));
2814 /* New argument list transforming bzero(ptr x, int y) to
2815 memset(ptr x, int 0, size_t y). This is done this way
2816 so that if it isn't expanded inline, we fallback to
2817 calling bzero instead of memset. */
2819 newarglist = build_tree_list (NULL_TREE, convert (sizetype, size));
2820 newarglist = tree_cons (NULL_TREE, integer_zero_node, newarglist);
2821 newarglist = tree_cons (NULL_TREE, dest, newarglist);
2823 return expand_builtin_memset (newarglist, const0_rtx, VOIDmode);
2826 /* Expand expression EXP, which is a call to the memcmp built-in function.
2827 ARGLIST is the argument list for this call. Return 0 if we failed and the
2828 caller should emit a normal call, otherwise try to get the result in
2829 TARGET, if convenient (and in mode MODE, if that's convenient). */
2832 expand_builtin_memcmp (exp, arglist, target, mode)
2833 tree exp ATTRIBUTE_UNUSED;
2836 enum machine_mode mode;
2838 tree arg1, arg2, len;
2839 const char *p1, *p2;
2841 if (!validate_arglist (arglist,
2842 POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
2845 arg1 = TREE_VALUE (arglist);
2846 arg2 = TREE_VALUE (TREE_CHAIN (arglist));
2847 len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
2849 /* If the len parameter is zero, return zero. */
2850 if (host_integerp (len, 1) && tree_low_cst (len, 1) == 0)
2852 /* Evaluate and ignore arg1 and arg2 in case they have
2854 expand_expr (arg1, const0_rtx, VOIDmode, EXPAND_NORMAL);
2855 expand_expr (arg2, const0_rtx, VOIDmode, EXPAND_NORMAL);
2859 p1 = c_getstr (arg1);
2860 p2 = c_getstr (arg2);
2862 /* If all arguments are constant, and the value of len is not greater
2863 than the lengths of arg1 and arg2, evaluate at compile-time. */
2864 if (host_integerp (len, 1) && p1 && p2
2865 && compare_tree_int (len, strlen (p1) + 1) <= 0
2866 && compare_tree_int (len, strlen (p2) + 1) <= 0)
2868 const int r = memcmp (p1, p2, tree_low_cst (len, 1));
2870 return (r < 0 ? constm1_rtx : (r > 0 ? const1_rtx : const0_rtx));
2873 /* If len parameter is one, return an expression corresponding to
2874 (*(const unsigned char*)arg1 - (const unsigned char*)arg2). */
2875 if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
2877 tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
2878 tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
2880 fold (build1 (CONVERT_EXPR, integer_type_node,
2881 build1 (INDIRECT_REF, cst_uchar_node,
2882 build1 (NOP_EXPR, cst_uchar_ptr_node, arg1))));
2884 fold (build1 (CONVERT_EXPR, integer_type_node,
2885 build1 (INDIRECT_REF, cst_uchar_node,
2886 build1 (NOP_EXPR, cst_uchar_ptr_node, arg2))));
2887 tree result = fold (build (MINUS_EXPR, integer_type_node, ind1, ind2));
2888 return expand_expr (result, target, mode, EXPAND_NORMAL);
2891 #ifdef HAVE_cmpstrsi
2893 rtx arg1_rtx, arg2_rtx, arg3_rtx;
2898 = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
2900 = get_pointer_alignment (arg2, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
2901 enum machine_mode insn_mode
2902 = insn_data[(int) CODE_FOR_cmpstrsi].operand[0].mode;
2904 /* If we don't have POINTER_TYPE, call the function. */
2905 if (arg1_align == 0 || arg2_align == 0)
2908 /* Make a place to write the result of the instruction. */
2911 && GET_CODE (result) == REG && GET_MODE (result) == insn_mode
2912 && REGNO (result) >= FIRST_PSEUDO_REGISTER))
2913 result = gen_reg_rtx (insn_mode);
2915 arg1_rtx = get_memory_rtx (arg1);
2916 arg2_rtx = get_memory_rtx (arg2);
2917 arg3_rtx = expand_expr (len, NULL_RTX, VOIDmode, 0);
2921 insn = gen_cmpstrsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
2922 GEN_INT (MIN (arg1_align, arg2_align)));
2927 emit_library_call_value (memcmp_libfunc, result, LCT_PURE_MAKE_BLOCK,
2928 TYPE_MODE (integer_type_node), 3,
2929 XEXP (arg1_rtx, 0), Pmode,
2930 XEXP (arg2_rtx, 0), Pmode,
2931 convert_to_mode (TYPE_MODE (sizetype), arg3_rtx,
2932 TREE_UNSIGNED (sizetype)),
2933 TYPE_MODE (sizetype));
2935 /* Return the value in the proper mode for this function. */
2936 mode = TYPE_MODE (TREE_TYPE (exp));
2937 if (GET_MODE (result) == mode)
2939 else if (target != 0)
2941 convert_move (target, result, 0);
2945 return convert_to_mode (mode, result, 0);
2952 /* Expand expression EXP, which is a call to the strcmp builtin. Return 0
2953 if we failed the caller should emit a normal call, otherwise try to get
2954 the result in TARGET, if convenient. */
2957 expand_builtin_strcmp (exp, target, mode)
2960 enum machine_mode mode;
2962 tree arglist = TREE_OPERAND (exp, 1);
2964 const char *p1, *p2;
2966 if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
2969 arg1 = TREE_VALUE (arglist);
2970 arg2 = TREE_VALUE (TREE_CHAIN (arglist));
2972 p1 = c_getstr (arg1);
2973 p2 = c_getstr (arg2);
2977 const int i = strcmp (p1, p2);
2978 return (i < 0 ? constm1_rtx : (i > 0 ? const1_rtx : const0_rtx));
2981 /* If either arg is "", return an expression corresponding to
2982 (*(const unsigned char*)arg1 - (const unsigned char*)arg2). */
2983 if ((p1 && *p1 == '\0') || (p2 && *p2 == '\0'))
2985 tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
2986 tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
2988 fold (build1 (CONVERT_EXPR, integer_type_node,
2989 build1 (INDIRECT_REF, cst_uchar_node,
2990 build1 (NOP_EXPR, cst_uchar_ptr_node, arg1))));
2992 fold (build1 (CONVERT_EXPR, integer_type_node,
2993 build1 (INDIRECT_REF, cst_uchar_node,
2994 build1 (NOP_EXPR, cst_uchar_ptr_node, arg2))));
2995 tree result = fold (build (MINUS_EXPR, integer_type_node, ind1, ind2));
2996 return expand_expr (result, target, mode, EXPAND_NORMAL);
2999 #ifdef HAVE_cmpstrsi
3002 tree len, len1, len2;
3003 rtx arg1_rtx, arg2_rtx, arg3_rtx;
3007 = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
3009 = get_pointer_alignment (arg2, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
3010 enum machine_mode insn_mode
3011 = insn_data[(int) CODE_FOR_cmpstrsi].operand[0].mode;
3013 len1 = c_strlen (arg1);
3014 len2 = c_strlen (arg2);
3017 len1 = size_binop (PLUS_EXPR, ssize_int (1), len1);
3019 len2 = size_binop (PLUS_EXPR, ssize_int (1), len2);
3021 /* If we don't have a constant length for the first, use the length
3022 of the second, if we know it. We don't require a constant for
3023 this case; some cost analysis could be done if both are available
3024 but neither is constant. For now, assume they're equally cheap,
3025 unless one has side effects. If both strings have constant lengths,
3032 else if (TREE_SIDE_EFFECTS (len1))
3034 else if (TREE_SIDE_EFFECTS (len2))
3036 else if (TREE_CODE (len1) != INTEGER_CST)
3038 else if (TREE_CODE (len2) != INTEGER_CST)
3040 else if (tree_int_cst_lt (len1, len2))
3045 /* If both arguments have side effects, we cannot optimize. */
3046 if (!len || TREE_SIDE_EFFECTS (len))
3049 /* If we don't have POINTER_TYPE, call the function. */
3050 if (arg1_align == 0 || arg2_align == 0)
3053 /* Make a place to write the result of the instruction. */
3056 && GET_CODE (result) == REG && GET_MODE (result) == insn_mode
3057 && REGNO (result) >= FIRST_PSEUDO_REGISTER))
3058 result = gen_reg_rtx (insn_mode);
3060 arg1_rtx = get_memory_rtx (arg1);
3061 arg2_rtx = get_memory_rtx (arg2);
3062 arg3_rtx = expand_expr (len, NULL_RTX, VOIDmode, 0);
3063 insn = gen_cmpstrsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
3064 GEN_INT (MIN (arg1_align, arg2_align)));
3070 /* Return the value in the proper mode for this function. */
3071 mode = TYPE_MODE (TREE_TYPE (exp));
3072 if (GET_MODE (result) == mode)
3075 return convert_to_mode (mode, result, 0);
3076 convert_move (target, result, 0);
3083 /* Expand expression EXP, which is a call to the strncmp builtin. Return 0
3084 if we failed the caller should emit a normal call, otherwise try to get
3085 the result in TARGET, if convenient. */
3088 expand_builtin_strncmp (exp, target, mode)
3091 enum machine_mode mode;
3093 tree arglist = TREE_OPERAND (exp, 1);
3094 tree arg1, arg2, arg3;
3095 const char *p1, *p2;
3097 if (!validate_arglist (arglist,
3098 POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
3101 arg1 = TREE_VALUE (arglist);
3102 arg2 = TREE_VALUE (TREE_CHAIN (arglist));
3103 arg3 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
3105 /* If the len parameter is zero, return zero. */
3106 if (host_integerp (arg3, 1) && tree_low_cst (arg3, 1) == 0)
3108 /* Evaluate and ignore arg1 and arg2 in case they have
3110 expand_expr (arg1, const0_rtx, VOIDmode, EXPAND_NORMAL);
3111 expand_expr (arg2, const0_rtx, VOIDmode, EXPAND_NORMAL);
3115 p1 = c_getstr (arg1);
3116 p2 = c_getstr (arg2);
3118 /* If all arguments are constant, evaluate at compile-time. */
3119 if (host_integerp (arg3, 1) && p1 && p2)
3121 const int r = strncmp (p1, p2, tree_low_cst (arg3, 1));
3122 return (r < 0 ? constm1_rtx : (r > 0 ? const1_rtx : const0_rtx));
3125 /* If len == 1 or (either string parameter is "" and (len >= 1)),
3126 return (*(const u_char*)arg1 - *(const u_char*)arg2). */
3127 if (host_integerp (arg3, 1)
3128 && (tree_low_cst (arg3, 1) == 1
3129 || (tree_low_cst (arg3, 1) > 1
3130 && ((p1 && *p1 == '\0') || (p2 && *p2 == '\0')))))
3132 tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
3133 tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
3135 fold (build1 (CONVERT_EXPR, integer_type_node,
3136 build1 (INDIRECT_REF, cst_uchar_node,
3137 build1 (NOP_EXPR, cst_uchar_ptr_node, arg1))));
3139 fold (build1 (CONVERT_EXPR, integer_type_node,
3140 build1 (INDIRECT_REF, cst_uchar_node,
3141 build1 (NOP_EXPR, cst_uchar_ptr_node, arg2))));
3142 tree result = fold (build (MINUS_EXPR, integer_type_node, ind1, ind2));
3143 return expand_expr (result, target, mode, EXPAND_NORMAL);
3146 /* If c_strlen can determine an expression for one of the string
3147 lengths, and it doesn't have side effects, then emit cmpstrsi
3148 using length MIN(strlen(string)+1, arg3). */
3149 #ifdef HAVE_cmpstrsi
3152 tree len, len1, len2;
3153 rtx arg1_rtx, arg2_rtx, arg3_rtx;
3157 = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
3159 = get_pointer_alignment (arg2, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
3160 enum machine_mode insn_mode
3161 = insn_data[(int) CODE_FOR_cmpstrsi].operand[0].mode;
3163 len1 = c_strlen (arg1);
3164 len2 = c_strlen (arg2);
3167 len1 = size_binop (PLUS_EXPR, ssize_int (1), len1);
3169 len2 = size_binop (PLUS_EXPR, ssize_int (1), len2);
3171 /* If we don't have a constant length for the first, use the length
3172 of the second, if we know it. We don't require a constant for
3173 this case; some cost analysis could be done if both are available
3174 but neither is constant. For now, assume they're equally cheap,
3175 unless one has side effects. If both strings have constant lengths,
3182 else if (TREE_SIDE_EFFECTS (len1))
3184 else if (TREE_SIDE_EFFECTS (len2))
3186 else if (TREE_CODE (len1) != INTEGER_CST)
3188 else if (TREE_CODE (len2) != INTEGER_CST)
3190 else if (tree_int_cst_lt (len1, len2))
3195 /* If both arguments have side effects, we cannot optimize. */
3196 if (!len || TREE_SIDE_EFFECTS (len))
3199 /* The actual new length parameter is MIN(len,arg3). */
3200 len = fold (build (MIN_EXPR, TREE_TYPE (len), len, arg3));
3202 /* If we don't have POINTER_TYPE, call the function. */
3203 if (arg1_align == 0 || arg2_align == 0)
3206 /* Make a place to write the result of the instruction. */
3209 && GET_CODE (result) == REG && GET_MODE (result) == insn_mode
3210 && REGNO (result) >= FIRST_PSEUDO_REGISTER))
3211 result = gen_reg_rtx (insn_mode);
3213 arg1_rtx = get_memory_rtx (arg1);
3214 arg2_rtx = get_memory_rtx (arg2);
3215 arg3_rtx = expand_expr (len, NULL_RTX, VOIDmode, 0);
3216 insn = gen_cmpstrsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
3217 GEN_INT (MIN (arg1_align, arg2_align)));
3223 /* Return the value in the proper mode for this function. */
3224 mode = TYPE_MODE (TREE_TYPE (exp));
3225 if (GET_MODE (result) == mode)
3228 return convert_to_mode (mode, result, 0);
3229 convert_move (target, result, 0);
3236 /* Expand expression EXP, which is a call to the strcat builtin.
3237 Return 0 if we failed the caller should emit a normal call,
3238 otherwise try to get the result in TARGET, if convenient. */
3241 expand_builtin_strcat (arglist, target, mode)
3244 enum machine_mode mode;
3246 if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
3250 tree dst = TREE_VALUE (arglist),
3251 src = TREE_VALUE (TREE_CHAIN (arglist));
3252 const char *p = c_getstr (src);
3254 /* If the string length is zero, return the dst parameter. */
3255 if (p && *p == '\0')
3256 return expand_expr (dst, target, mode, EXPAND_NORMAL);
3262 /* Expand expression EXP, which is a call to the strncat builtin.
3263 Return 0 if we failed the caller should emit a normal call,
3264 otherwise try to get the result in TARGET, if convenient. */
3267 expand_builtin_strncat (arglist, target, mode)
3270 enum machine_mode mode;
3272 if (!validate_arglist (arglist,
3273 POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
3277 tree dst = TREE_VALUE (arglist),
3278 src = TREE_VALUE (TREE_CHAIN (arglist)),
3279 len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
3280 const char *p = c_getstr (src);
3282 /* If the requested length is zero, or the src parameter string
3283 length is zero, return the dst parameter. */
3284 if (integer_zerop (len) || (p && *p == '\0'))
3286 /* Evaluate and ignore the src and len parameters in case
3287 they have side-effects. */
3288 expand_expr (src, const0_rtx, VOIDmode, EXPAND_NORMAL);
3289 expand_expr (len, const0_rtx, VOIDmode, EXPAND_NORMAL);
3290 return expand_expr (dst, target, mode, EXPAND_NORMAL);
3293 /* If the requested len is greater than or equal to the string
3294 length, call strcat. */
3295 if (TREE_CODE (len) == INTEGER_CST && p
3296 && compare_tree_int (len, strlen (p)) >= 0)
3299 = tree_cons (NULL_TREE, dst, build_tree_list (NULL_TREE, src));
3300 tree fn = implicit_built_in_decls[BUILT_IN_STRCAT];
3302 /* If the replacement _DECL isn't initialized, don't do the
3307 return expand_expr (build_function_call_expr (fn, newarglist),
3308 target, mode, EXPAND_NORMAL);
3314 /* Expand expression EXP, which is a call to the strspn builtin.
3315 Return 0 if we failed the caller should emit a normal call,
3316 otherwise try to get the result in TARGET, if convenient. */
3319 expand_builtin_strspn (arglist, target, mode)
3322 enum machine_mode mode;
3324 if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
3328 tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
3329 const char *p1 = c_getstr (s1), *p2 = c_getstr (s2);
3331 /* If both arguments are constants, evaluate at compile-time. */
3334 const size_t r = strspn (p1, p2);
3335 return expand_expr (size_int (r), target, mode, EXPAND_NORMAL);
3338 /* If either argument is "", return 0. */
3339 if ((p1 && *p1 == '\0') || (p2 && *p2 == '\0'))
3341 /* Evaluate and ignore both arguments in case either one has
3343 expand_expr (s1, const0_rtx, VOIDmode, EXPAND_NORMAL);
3344 expand_expr (s2, const0_rtx, VOIDmode, EXPAND_NORMAL);
3351 /* Expand expression EXP, which is a call to the strcspn builtin.
3352 Return 0 if we failed the caller should emit a normal call,
3353 otherwise try to get the result in TARGET, if convenient. */
3356 expand_builtin_strcspn (arglist, target, mode)
3359 enum machine_mode mode;
3361 if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
3365 tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
3366 const char *p1 = c_getstr (s1), *p2 = c_getstr (s2);
3368 /* If both arguments are constants, evaluate at compile-time. */
3371 const size_t r = strcspn (p1, p2);
3372 return expand_expr (size_int (r), target, mode, EXPAND_NORMAL);
3375 /* If the first argument is "", return 0. */
3376 if (p1 && *p1 == '\0')
3378 /* Evaluate and ignore argument s2 in case it has
3380 expand_expr (s2, const0_rtx, VOIDmode, EXPAND_NORMAL);
3384 /* If the second argument is "", return __builtin_strlen(s1). */
3385 if (p2 && *p2 == '\0')
3387 tree newarglist = build_tree_list (NULL_TREE, s1),
3388 fn = implicit_built_in_decls[BUILT_IN_STRLEN];
3390 /* If the replacement _DECL isn't initialized, don't do the
3395 return expand_expr (build_function_call_expr (fn, newarglist),
3396 target, mode, EXPAND_NORMAL);
3402 /* Expand a call to __builtin_saveregs, generating the result in TARGET,
3403 if that's convenient. */
3406 expand_builtin_saveregs ()
3410 /* Don't do __builtin_saveregs more than once in a function.
3411 Save the result of the first call and reuse it. */
3412 if (saveregs_value != 0)
3413 return saveregs_value;
3415 /* When this function is called, it means that registers must be
3416 saved on entry to this function. So we migrate the call to the
3417 first insn of this function. */
3421 #ifdef EXPAND_BUILTIN_SAVEREGS
3422 /* Do whatever the machine needs done in this case. */
3423 val = EXPAND_BUILTIN_SAVEREGS ();
3425 /* ??? We used to try and build up a call to the out of line function,
3426 guessing about what registers needed saving etc. This became much
3427 harder with __builtin_va_start, since we don't have a tree for a
3428 call to __builtin_saveregs to fall back on. There was exactly one
3429 port (i860) that used this code, and I'm unconvinced it could actually
3430 handle the general case. So we no longer try to handle anything
3431 weird and make the backend absorb the evil. */
3433 error ("__builtin_saveregs not supported by this target");
3440 saveregs_value = val;
3442 /* Put the insns after the NOTE that starts the function. If this
3443 is inside a start_sequence, make the outer-level insn chain current, so
3444 the code is placed at the start of the function. */
3445 push_topmost_sequence ();
3446 emit_insn_after (seq, get_insns ());
3447 pop_topmost_sequence ();
3452 /* __builtin_args_info (N) returns word N of the arg space info
3453 for the current function. The number and meanings of words
3454 is controlled by the definition of CUMULATIVE_ARGS. */
3457 expand_builtin_args_info (arglist)
3460 int nwords = sizeof (CUMULATIVE_ARGS) / sizeof (int);
3461 int *word_ptr = (int *) ¤t_function_args_info;
3463 if (sizeof (CUMULATIVE_ARGS) % sizeof (int) != 0)
3468 if (!host_integerp (TREE_VALUE (arglist), 0))
3469 error ("argument of `__builtin_args_info' must be constant");
3472 HOST_WIDE_INT wordnum = tree_low_cst (TREE_VALUE (arglist), 0);
3474 if (wordnum < 0 || wordnum >= nwords)
3475 error ("argument of `__builtin_args_info' out of range");
3477 return GEN_INT (word_ptr[wordnum]);
3481 error ("missing argument in `__builtin_args_info'");
3486 /* Expand ARGLIST, from a call to __builtin_next_arg. */
3489 expand_builtin_next_arg (arglist)
3492 tree fntype = TREE_TYPE (current_function_decl);
3494 if (TYPE_ARG_TYPES (fntype) == 0
3495 || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
3498 error ("`va_start' used in function with fixed args");
3504 tree last_parm = tree_last (DECL_ARGUMENTS (current_function_decl));
3505 tree arg = TREE_VALUE (arglist);
3507 /* Strip off all nops for the sake of the comparison. This
3508 is not quite the same as STRIP_NOPS. It does more.
3509 We must also strip off INDIRECT_EXPR for C++ reference
3511 while (TREE_CODE (arg) == NOP_EXPR
3512 || TREE_CODE (arg) == CONVERT_EXPR
3513 || TREE_CODE (arg) == NON_LVALUE_EXPR
3514 || TREE_CODE (arg) == INDIRECT_REF)
3515 arg = TREE_OPERAND (arg, 0);
3516 if (arg != last_parm)
3517 warning ("second parameter of `va_start' not last named argument");
3520 /* Evidently an out of date version of <stdarg.h>; can't validate
3521 va_start's second argument, but can still work as intended. */
3522 warning ("`__builtin_next_arg' called without an argument");
3524 return expand_binop (Pmode, add_optab,
3525 current_function_internal_arg_pointer,
3526 current_function_arg_offset_rtx,
3527 NULL_RTX, 0, OPTAB_LIB_WIDEN);
3530 /* Make it easier for the backends by protecting the valist argument
3531 from multiple evaluations. */
3534 stabilize_va_list (valist, needs_lvalue)
3538 if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
3540 if (TREE_SIDE_EFFECTS (valist))
3541 valist = save_expr (valist);
3543 /* For this case, the backends will be expecting a pointer to
3544 TREE_TYPE (va_list_type_node), but it's possible we've
3545 actually been given an array (an actual va_list_type_node).
3547 if (TREE_CODE (TREE_TYPE (valist)) == ARRAY_TYPE)
3549 tree p1 = build_pointer_type (TREE_TYPE (va_list_type_node));
3550 tree p2 = build_pointer_type (va_list_type_node);
3552 valist = build1 (ADDR_EXPR, p2, valist);
3553 valist = fold (build1 (NOP_EXPR, p1, valist));
3562 if (! TREE_SIDE_EFFECTS (valist))
3565 pt = build_pointer_type (va_list_type_node);
3566 valist = fold (build1 (ADDR_EXPR, pt, valist));
3567 TREE_SIDE_EFFECTS (valist) = 1;
3570 if (TREE_SIDE_EFFECTS (valist))
3571 valist = save_expr (valist);
3572 valist = fold (build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)),
3579 /* The "standard" implementation of va_start: just assign `nextarg' to
3583 std_expand_builtin_va_start (valist, nextarg)
3589 t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
3590 make_tree (ptr_type_node, nextarg));
3591 TREE_SIDE_EFFECTS (t) = 1;
3593 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3596 /* Expand ARGLIST, from a call to __builtin_va_start. */
3599 expand_builtin_va_start (arglist)
3605 chain = TREE_CHAIN (arglist);
3607 if (TREE_CHAIN (chain))
3608 error ("too many arguments to function `va_start'");
3610 nextarg = expand_builtin_next_arg (chain);
3611 valist = stabilize_va_list (TREE_VALUE (arglist), 1);
3613 #ifdef EXPAND_BUILTIN_VA_START
3614 EXPAND_BUILTIN_VA_START (valist, nextarg);
3616 std_expand_builtin_va_start (valist, nextarg);
3622 /* The "standard" implementation of va_arg: read the value from the
3623 current (padded) address and increment by the (padded) size. */
3626 std_expand_builtin_va_arg (valist, type)
3629 tree addr_tree, t, type_size = NULL;
3630 tree align, alignm1;
3634 /* Compute the rounded size of the type. */
3635 align = size_int (PARM_BOUNDARY / BITS_PER_UNIT);
3636 alignm1 = size_int (PARM_BOUNDARY / BITS_PER_UNIT - 1);
3637 if (type == error_mark_node
3638 || (type_size = TYPE_SIZE_UNIT (TYPE_MAIN_VARIANT (type))) == NULL
3639 || TREE_OVERFLOW (type_size))
3640 rounded_size = size_zero_node;
3642 rounded_size = fold (build (MULT_EXPR, sizetype,
3643 fold (build (TRUNC_DIV_EXPR, sizetype,
3644 fold (build (PLUS_EXPR, sizetype,
3645 type_size, alignm1)),
3651 if (PAD_VARARGS_DOWN && ! integer_zerop (rounded_size))
3653 /* Small args are padded downward. */
3654 addr_tree = fold (build (PLUS_EXPR, TREE_TYPE (addr_tree), addr_tree,
3655 fold (build (COND_EXPR, sizetype,
3656 fold (build (GT_EXPR, sizetype,
3660 fold (build (MINUS_EXPR, sizetype,
3665 addr = expand_expr (addr_tree, NULL_RTX, Pmode, EXPAND_NORMAL);
3666 addr = copy_to_reg (addr);
3668 /* Compute new value for AP. */
3669 if (! integer_zerop (rounded_size))
3671 t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
3672 build (PLUS_EXPR, TREE_TYPE (valist), valist,
3674 TREE_SIDE_EFFECTS (t) = 1;
3675 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3681 /* Expand __builtin_va_arg, which is not really a builtin function, but
3682 a very special sort of operator. */
3685 expand_builtin_va_arg (valist, type)
3689 tree promoted_type, want_va_type, have_va_type;
3691 /* Verify that valist is of the proper type. */
3693 want_va_type = va_list_type_node;
3694 have_va_type = TREE_TYPE (valist);
3695 if (TREE_CODE (want_va_type) == ARRAY_TYPE)
3697 /* If va_list is an array type, the argument may have decayed
3698 to a pointer type, e.g. by being passed to another function.
3699 In that case, unwrap both types so that we can compare the
3700 underlying records. */
3701 if (TREE_CODE (have_va_type) == ARRAY_TYPE
3702 || TREE_CODE (have_va_type) == POINTER_TYPE)
3704 want_va_type = TREE_TYPE (want_va_type);
3705 have_va_type = TREE_TYPE (have_va_type);
3708 if (TYPE_MAIN_VARIANT (want_va_type) != TYPE_MAIN_VARIANT (have_va_type))
3710 error ("first argument to `va_arg' not of type `va_list'");
3714 /* Generate a diagnostic for requesting data of a type that cannot
3715 be passed through `...' due to type promotion at the call site. */
3716 else if ((promoted_type = (*lang_hooks.types.type_promotes_to) (type))
3719 const char *name = "<anonymous type>", *pname = 0;
3720 static bool gave_help;
3722 if (TYPE_NAME (type))
3724 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
3725 name = IDENTIFIER_POINTER (TYPE_NAME (type));
3726 else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
3727 && DECL_NAME (TYPE_NAME (type)))
3728 name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
3730 if (TYPE_NAME (promoted_type))
3732 if (TREE_CODE (TYPE_NAME (promoted_type)) == IDENTIFIER_NODE)
3733 pname = IDENTIFIER_POINTER (TYPE_NAME (promoted_type));
3734 else if (TREE_CODE (TYPE_NAME (promoted_type)) == TYPE_DECL
3735 && DECL_NAME (TYPE_NAME (promoted_type)))
3736 pname = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (promoted_type)));
3739 /* Unfortunately, this is merely undefined, rather than a constraint
3740 violation, so we cannot make this an error. If this call is never
3741 executed, the program is still strictly conforming. */
3742 warning ("`%s' is promoted to `%s' when passed through `...'",
3747 warning ("(so you should pass `%s' not `%s' to `va_arg')",
3751 /* We can, however, treat "undefined" any way we please.
3752 Call abort to encourage the user to fix the program. */
3753 expand_builtin_trap ();
3755 /* This is dead code, but go ahead and finish so that the
3756 mode of the result comes out right. */
3761 /* Make it easier for the backends by protecting the valist argument
3762 from multiple evaluations. */
3763 valist = stabilize_va_list (valist, 0);
3765 #ifdef EXPAND_BUILTIN_VA_ARG
3766 addr = EXPAND_BUILTIN_VA_ARG (valist, type);
3768 addr = std_expand_builtin_va_arg (valist, type);
3772 #ifdef POINTERS_EXTEND_UNSIGNED
3773 if (GET_MODE (addr) != Pmode)
3774 addr = convert_memory_address (Pmode, addr);
3777 result = gen_rtx_MEM (TYPE_MODE (type), addr);
3778 set_mem_alias_set (result, get_varargs_alias_set ());
3783 /* Expand ARGLIST, from a call to __builtin_va_end. */
3786 expand_builtin_va_end (arglist)
3789 tree valist = TREE_VALUE (arglist);
3791 #ifdef EXPAND_BUILTIN_VA_END
3792 valist = stabilize_va_list (valist, 0);
3793 EXPAND_BUILTIN_VA_END (arglist);
3795 /* Evaluate for side effects, if needed. I hate macros that don't
3797 if (TREE_SIDE_EFFECTS (valist))
3798 expand_expr (valist, const0_rtx, VOIDmode, EXPAND_NORMAL);
3804 /* Expand ARGLIST, from a call to __builtin_va_copy. We do this as a
3805 builtin rather than just as an assignment in stdarg.h because of the
3806 nastiness of array-type va_list types. */
3809 expand_builtin_va_copy (arglist)
3814 dst = TREE_VALUE (arglist);
3815 src = TREE_VALUE (TREE_CHAIN (arglist));
3817 dst = stabilize_va_list (dst, 1);
3818 src = stabilize_va_list (src, 0);
3820 if (TREE_CODE (va_list_type_node) != ARRAY_TYPE)
3822 t = build (MODIFY_EXPR, va_list_type_node, dst, src);
3823 TREE_SIDE_EFFECTS (t) = 1;
3824 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3828 rtx dstb, srcb, size;
3830 /* Evaluate to pointers. */
3831 dstb = expand_expr (dst, NULL_RTX, Pmode, EXPAND_NORMAL);
3832 srcb = expand_expr (src, NULL_RTX, Pmode, EXPAND_NORMAL);
3833 size = expand_expr (TYPE_SIZE_UNIT (va_list_type_node), NULL_RTX,
3834 VOIDmode, EXPAND_NORMAL);
3836 #ifdef POINTERS_EXTEND_UNSIGNED
3837 if (GET_MODE (dstb) != Pmode)
3838 dstb = convert_memory_address (Pmode, dstb);
3840 if (GET_MODE (srcb) != Pmode)
3841 srcb = convert_memory_address (Pmode, srcb);
3844 /* "Dereference" to BLKmode memories. */
3845 dstb = gen_rtx_MEM (BLKmode, dstb);
3846 set_mem_alias_set (dstb, get_alias_set (TREE_TYPE (TREE_TYPE (dst))));
3847 set_mem_align (dstb, TYPE_ALIGN (va_list_type_node));
3848 srcb = gen_rtx_MEM (BLKmode, srcb);
3849 set_mem_alias_set (srcb, get_alias_set (TREE_TYPE (TREE_TYPE (src))));
3850 set_mem_align (srcb, TYPE_ALIGN (va_list_type_node));
3853 emit_block_move (dstb, srcb, size, BLOCK_OP_NORMAL);
3859 /* Expand a call to one of the builtin functions __builtin_frame_address or
3860 __builtin_return_address. */
3863 expand_builtin_frame_address (fndecl, arglist)
3864 tree fndecl, arglist;
3866 /* The argument must be a nonnegative integer constant.
3867 It counts the number of frames to scan up the stack.
3868 The value is the return address saved in that frame. */
3870 /* Warning about missing arg was already issued. */
3872 else if (! host_integerp (TREE_VALUE (arglist), 1))
3874 if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FRAME_ADDRESS)
3875 error ("invalid arg to `__builtin_frame_address'");
3877 error ("invalid arg to `__builtin_return_address'");
3883 = expand_builtin_return_addr (DECL_FUNCTION_CODE (fndecl),
3884 tree_low_cst (TREE_VALUE (arglist), 1),
3885 hard_frame_pointer_rtx);
3887 /* Some ports cannot access arbitrary stack frames. */
3890 if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FRAME_ADDRESS)
3891 warning ("unsupported arg to `__builtin_frame_address'");
3893 warning ("unsupported arg to `__builtin_return_address'");
3897 /* For __builtin_frame_address, return what we've got. */
3898 if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FRAME_ADDRESS)
3901 if (GET_CODE (tem) != REG
3902 && ! CONSTANT_P (tem))
3903 tem = copy_to_mode_reg (Pmode, tem);
3908 /* Expand a call to the alloca builtin, with arguments ARGLIST. Return 0 if
3909 we failed and the caller should emit a normal call, otherwise try to get
3910 the result in TARGET, if convenient. */
3913 expand_builtin_alloca (arglist, target)
3920 if (!validate_arglist (arglist, INTEGER_TYPE, VOID_TYPE))
3923 /* Compute the argument. */
3924 op0 = expand_expr (TREE_VALUE (arglist), NULL_RTX, VOIDmode, 0);
3926 /* Allocate the desired space. */
3927 result = allocate_dynamic_stack_space (op0, target, BITS_PER_UNIT);
3929 #ifdef POINTERS_EXTEND_UNSIGNED
3930 if (GET_MODE (result) != ptr_mode)
3931 result = convert_memory_address (ptr_mode, result);
3937 /* Expand a call to a unary builtin. The arguments are in ARGLIST.
3938 Return 0 if a normal call should be emitted rather than expanding the
3939 function in-line. If convenient, the result should be placed in TARGET.
3940 SUBTARGET may be used as the target for computing one of EXP's operands. */
3943 expand_builtin_unop (target_mode, arglist, target, subtarget, op_optab)
3944 enum machine_mode target_mode;
3946 rtx target, subtarget;
3950 if (!validate_arglist (arglist, INTEGER_TYPE, VOID_TYPE))
3953 /* Compute the argument. */
3954 op0 = expand_expr (TREE_VALUE (arglist), subtarget, VOIDmode, 0);
3955 /* Compute op, into TARGET if possible.
3956 Set TARGET to wherever the result comes back. */
3957 target = expand_unop (TYPE_MODE (TREE_TYPE (TREE_VALUE (arglist))),
3958 op_optab, op0, target, 1);
3962 return convert_to_mode (target_mode, target, 0);
3965 /* If the string passed to fputs is a constant and is one character
3966 long, we attempt to transform this call into __builtin_fputc(). */
3969 expand_builtin_fputs (arglist, ignore, unlocked)
3975 tree fn_fputc = unlocked ? implicit_built_in_decls[BUILT_IN_FPUTC_UNLOCKED]
3976 : implicit_built_in_decls[BUILT_IN_FPUTC];
3977 tree fn_fwrite = unlocked ? implicit_built_in_decls[BUILT_IN_FWRITE_UNLOCKED]
3978 : implicit_built_in_decls[BUILT_IN_FWRITE];
3980 /* If the return value is used, or the replacement _DECL isn't
3981 initialized, don't do the transformation. */
3982 if (!ignore || !fn_fputc || !fn_fwrite)
3985 /* Verify the arguments in the original call. */
3986 if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
3989 /* Get the length of the string passed to fputs. If the length
3990 can't be determined, punt. */
3991 if (!(len = c_strlen (TREE_VALUE (arglist)))
3992 || TREE_CODE (len) != INTEGER_CST)
3995 switch (compare_tree_int (len, 1))
3997 case -1: /* length is 0, delete the call entirely . */
3999 /* Evaluate and ignore the argument in case it has
4001 expand_expr (TREE_VALUE (TREE_CHAIN (arglist)), const0_rtx,
4002 VOIDmode, EXPAND_NORMAL);
4005 case 0: /* length is 1, call fputc. */
4007 const char *p = c_getstr (TREE_VALUE (arglist));
4011 /* New argument list transforming fputs(string, stream) to
4012 fputc(string[0], stream). */
4014 build_tree_list (NULL_TREE, TREE_VALUE (TREE_CHAIN (arglist)));
4016 tree_cons (NULL_TREE, build_int_2 (p[0], 0), arglist);
4022 case 1: /* length is greater than 1, call fwrite. */
4026 /* If optimizing for size keep fputs. */
4029 string_arg = TREE_VALUE (arglist);
4030 /* New argument list transforming fputs(string, stream) to
4031 fwrite(string, 1, len, stream). */
4032 arglist = build_tree_list (NULL_TREE, TREE_VALUE (TREE_CHAIN (arglist)));
4033 arglist = tree_cons (NULL_TREE, len, arglist);
4034 arglist = tree_cons (NULL_TREE, size_one_node, arglist);
4035 arglist = tree_cons (NULL_TREE, string_arg, arglist);
4043 return expand_expr (build_function_call_expr (fn, arglist),
4044 (ignore ? const0_rtx : NULL_RTX),
4045 VOIDmode, EXPAND_NORMAL);
4048 /* Expand a call to __builtin_expect. We return our argument and emit a
4049 NOTE_INSN_EXPECTED_VALUE note. This is the expansion of __builtin_expect in
4050 a non-jump context. */
4053 expand_builtin_expect (arglist, target)
4060 if (arglist == NULL_TREE
4061 || TREE_CHAIN (arglist) == NULL_TREE)
4063 exp = TREE_VALUE (arglist);
4064 c = TREE_VALUE (TREE_CHAIN (arglist));
4066 if (TREE_CODE (c) != INTEGER_CST)
4068 error ("second arg to `__builtin_expect' must be a constant");
4069 c = integer_zero_node;
4072 target = expand_expr (exp, target, VOIDmode, EXPAND_NORMAL);
4074 /* Don't bother with expected value notes for integral constants. */
4075 if (flag_guess_branch_prob && GET_CODE (target) != CONST_INT)
4077 /* We do need to force this into a register so that we can be
4078 moderately sure to be able to correctly interpret the branch
4080 target = force_reg (GET_MODE (target), target);
4082 rtx_c = expand_expr (c, NULL_RTX, GET_MODE (target), EXPAND_NORMAL);
4084 note = emit_note (NULL, NOTE_INSN_EXPECTED_VALUE);
4085 NOTE_EXPECTED_VALUE (note) = gen_rtx_EQ (VOIDmode, target, rtx_c);
4091 /* Like expand_builtin_expect, except do this in a jump context. This is
4092 called from do_jump if the conditional is a __builtin_expect. Return either
4093 a list of insns to emit the jump or NULL if we cannot optimize
4094 __builtin_expect. We need to optimize this at jump time so that machines
4095 like the PowerPC don't turn the test into a SCC operation, and then jump
4096 based on the test being 0/1. */
4099 expand_builtin_expect_jump (exp, if_false_label, if_true_label)
4104 tree arglist = TREE_OPERAND (exp, 1);
4105 tree arg0 = TREE_VALUE (arglist);
4106 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
4109 /* Only handle __builtin_expect (test, 0) and
4110 __builtin_expect (test, 1). */
4111 if (TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE
4112 && (integer_zerop (arg1) || integer_onep (arg1)))
4117 /* If we fail to locate an appropriate conditional jump, we'll
4118 fall back to normal evaluation. Ensure that the expression
4119 can be re-evaluated. */
4120 switch (unsafe_for_reeval (arg0))
4125 case 1: /* Mildly unsafe. */
4126 arg0 = unsave_expr (arg0);
4129 case 2: /* Wildly unsafe. */
4133 /* Expand the jump insns. */
4135 do_jump (arg0, if_false_label, if_true_label);
4139 /* Now that the __builtin_expect has been validated, go through and add
4140 the expect's to each of the conditional jumps. If we run into an
4141 error, just give up and generate the 'safe' code of doing a SCC
4142 operation and then doing a branch on that. */
4144 while (insn != NULL_RTX)
4146 rtx next = NEXT_INSN (insn);
4149 if (GET_CODE (insn) == JUMP_INSN && any_condjump_p (insn)
4150 && (pattern = pc_set (insn)) != NULL_RTX)
4152 rtx ifelse = SET_SRC (pattern);
4156 if (GET_CODE (ifelse) != IF_THEN_ELSE)
4159 if (GET_CODE (XEXP (ifelse, 1)) == LABEL_REF)
4162 label = XEXP (XEXP (ifelse, 1), 0);
4164 /* An inverted jump reverses the probabilities. */
4165 else if (GET_CODE (XEXP (ifelse, 2)) == LABEL_REF)
4168 label = XEXP (XEXP (ifelse, 2), 0);
4170 /* We shouldn't have to worry about conditional returns during
4171 the expansion stage, but handle it gracefully anyway. */
4172 else if (GET_CODE (XEXP (ifelse, 1)) == RETURN)
4177 /* An inverted return reverses the probabilities. */
4178 else if (GET_CODE (XEXP (ifelse, 2)) == RETURN)
4186 /* If the test is expected to fail, reverse the
4188 if (integer_zerop (arg1))
4191 /* If we are jumping to the false label, reverse the
4193 if (label == NULL_RTX)
4194 ; /* conditional return */
4195 else if (label == if_false_label)
4197 else if (label != if_true_label)
4201 predict_insn_def (insn, PRED_BUILTIN_EXPECT, taken);
4208 /* If no jumps were modified, fail and do __builtin_expect the normal
4218 expand_builtin_trap ()
4222 emit_insn (gen_trap ());
4225 emit_library_call (abort_libfunc, LCT_NORETURN, VOIDmode, 0);
4229 /* Expand an expression EXP that calls a built-in function,
4230 with result going to TARGET if that's convenient
4231 (and in mode MODE if that's convenient).
4232 SUBTARGET may be used as the target for computing one of EXP's operands.
4233 IGNORE is nonzero if the value is to be ignored. */
4236 expand_builtin (exp, target, subtarget, mode, ignore)
4240 enum machine_mode mode;
4243 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4244 tree arglist = TREE_OPERAND (exp, 1);
4245 enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
4246 enum machine_mode target_mode = TYPE_MODE (TREE_TYPE (exp));
4248 /* Perform postincrements before expanding builtin functions. Â */
4251 if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
4252 return (*targetm.expand_builtin) (exp, target, subtarget, mode, ignore);
4254 /* When not optimizing, generate calls to library functions for a certain
4256 if (!optimize && !CALLED_AS_BUILT_IN (fndecl))
4260 case BUILT_IN_SQRTF:
4261 case BUILT_IN_SQRTL:
4277 case BUILT_IN_ATAN2:
4278 case BUILT_IN_ATAN2F:
4279 case BUILT_IN_ATAN2L:
4280 case BUILT_IN_MEMSET:
4281 case BUILT_IN_MEMCPY:
4282 case BUILT_IN_MEMCMP:
4283 case BUILT_IN_MEMPCPY:
4284 case BUILT_IN_MEMMOVE:
4286 case BUILT_IN_BZERO:
4287 case BUILT_IN_BCOPY:
4288 case BUILT_IN_INDEX:
4289 case BUILT_IN_RINDEX:
4290 case BUILT_IN_STPCPY:
4291 case BUILT_IN_STRCHR:
4292 case BUILT_IN_STRRCHR:
4293 case BUILT_IN_STRLEN:
4294 case BUILT_IN_STRCPY:
4295 case BUILT_IN_STRNCPY:
4296 case BUILT_IN_STRNCMP:
4297 case BUILT_IN_STRSTR:
4298 case BUILT_IN_STRPBRK:
4299 case BUILT_IN_STRCAT:
4300 case BUILT_IN_STRNCAT:
4301 case BUILT_IN_STRSPN:
4302 case BUILT_IN_STRCSPN:
4303 case BUILT_IN_STRCMP:
4305 case BUILT_IN_PUTCHAR:
4307 case BUILT_IN_PRINTF:
4308 case BUILT_IN_FPUTC:
4309 case BUILT_IN_FPUTS:
4310 case BUILT_IN_FWRITE:
4311 case BUILT_IN_PUTCHAR_UNLOCKED:
4312 case BUILT_IN_PUTS_UNLOCKED:
4313 case BUILT_IN_PRINTF_UNLOCKED:
4314 case BUILT_IN_FPUTC_UNLOCKED:
4315 case BUILT_IN_FPUTS_UNLOCKED:
4316 case BUILT_IN_FWRITE_UNLOCKED:
4317 case BUILT_IN_FLOOR:
4318 case BUILT_IN_FLOORF:
4319 case BUILT_IN_FLOORL:
4321 case BUILT_IN_CEILF:
4322 case BUILT_IN_CEILL:
4323 case BUILT_IN_TRUNC:
4324 case BUILT_IN_TRUNCF:
4325 case BUILT_IN_TRUNCL:
4326 case BUILT_IN_ROUND:
4327 case BUILT_IN_ROUNDF:
4328 case BUILT_IN_ROUNDL:
4329 case BUILT_IN_NEARBYINT:
4330 case BUILT_IN_NEARBYINTF:
4331 case BUILT_IN_NEARBYINTL:
4332 return expand_call (exp, target, ignore);
4338 /* The built-in function expanders test for target == const0_rtx
4339 to determine whether the function's result will be ignored. */
4341 target = const0_rtx;
4343 /* If the result of a pure or const built-in function is ignored, and
4344 none of its arguments are volatile, we can avoid expanding the
4345 built-in call and just evaluate the arguments for side-effects. */
4346 if (target == const0_rtx
4347 && (DECL_IS_PURE (fndecl) || TREE_READONLY (fndecl)))
4349 bool volatilep = false;
4352 for (arg = arglist; arg; arg = TREE_CHAIN (arg))
4353 if (TREE_THIS_VOLATILE (TREE_VALUE (arg)))
4361 for (arg = arglist; arg; arg = TREE_CHAIN (arg))
4362 expand_expr (TREE_VALUE (arg), const0_rtx,
4363 VOIDmode, EXPAND_NORMAL);
4372 case BUILT_IN_LLABS:
4373 case BUILT_IN_IMAXABS:
4375 case BUILT_IN_FABSF:
4376 case BUILT_IN_FABSL:
4377 /* build_function_call changes these into ABS_EXPR. */
4381 case BUILT_IN_CONJF:
4382 case BUILT_IN_CONJL:
4383 case BUILT_IN_CREAL:
4384 case BUILT_IN_CREALF:
4385 case BUILT_IN_CREALL:
4386 case BUILT_IN_CIMAG:
4387 case BUILT_IN_CIMAGF:
4388 case BUILT_IN_CIMAGL:
4389 /* expand_tree_builtin changes these into CONJ_EXPR, REALPART_EXPR
4390 and IMAGPART_EXPR. */
4405 /* Treat these like sqrt only if unsafe math optimizations are allowed,
4406 because of possible accuracy problems. */
4407 if (! flag_unsafe_math_optimizations)
4410 case BUILT_IN_SQRTF:
4411 case BUILT_IN_SQRTL:
4412 case BUILT_IN_FLOOR:
4413 case BUILT_IN_FLOORF:
4414 case BUILT_IN_FLOORL:
4416 case BUILT_IN_CEILF:
4417 case BUILT_IN_CEILL:
4418 case BUILT_IN_TRUNC:
4419 case BUILT_IN_TRUNCF:
4420 case BUILT_IN_TRUNCL:
4421 case BUILT_IN_ROUND:
4422 case BUILT_IN_ROUNDF:
4423 case BUILT_IN_ROUNDL:
4424 case BUILT_IN_NEARBYINT:
4425 case BUILT_IN_NEARBYINTF:
4426 case BUILT_IN_NEARBYINTL:
4427 target = expand_builtin_mathfn (exp, target, subtarget);
4435 case BUILT_IN_ATAN2:
4436 case BUILT_IN_ATAN2F:
4437 case BUILT_IN_ATAN2L:
4438 if (! flag_unsafe_math_optimizations)
4440 target = expand_builtin_mathfn_2 (exp, target, subtarget);
4445 case BUILT_IN_APPLY_ARGS:
4446 return expand_builtin_apply_args ();
4448 /* __builtin_apply (FUNCTION, ARGUMENTS, ARGSIZE) invokes
4449 FUNCTION with a copy of the parameters described by
4450 ARGUMENTS, and ARGSIZE. It returns a block of memory
4451 allocated on the stack into which is stored all the registers
4452 that might possibly be used for returning the result of a
4453 function. ARGUMENTS is the value returned by
4454 __builtin_apply_args. ARGSIZE is the number of bytes of
4455 arguments that must be copied. ??? How should this value be
4456 computed? We'll also need a safe worst case value for varargs
4458 case BUILT_IN_APPLY:
4459 if (!validate_arglist (arglist, POINTER_TYPE,
4460 POINTER_TYPE, INTEGER_TYPE, VOID_TYPE)
4461 && !validate_arglist (arglist, REFERENCE_TYPE,
4462 POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
4470 for (t = arglist, i = 0; t; t = TREE_CHAIN (t), i++)
4471 ops[i] = expand_expr (TREE_VALUE (t), NULL_RTX, VOIDmode, 0);
4473 return expand_builtin_apply (ops[0], ops[1], ops[2]);
4476 /* __builtin_return (RESULT) causes the function to return the
4477 value described by RESULT. RESULT is address of the block of
4478 memory returned by __builtin_apply. */
4479 case BUILT_IN_RETURN:
4480 if (validate_arglist (arglist, POINTER_TYPE, VOID_TYPE))
4481 expand_builtin_return (expand_expr (TREE_VALUE (arglist),
4482 NULL_RTX, VOIDmode, 0));
4485 case BUILT_IN_SAVEREGS:
4486 return expand_builtin_saveregs ();
4488 case BUILT_IN_ARGS_INFO:
4489 return expand_builtin_args_info (arglist);
4491 /* Return the address of the first anonymous stack arg. */
4492 case BUILT_IN_NEXT_ARG:
4493 return expand_builtin_next_arg (arglist);
4495 case BUILT_IN_CLASSIFY_TYPE:
4496 return expand_builtin_classify_type (arglist);
4498 case BUILT_IN_CONSTANT_P:
4499 return expand_builtin_constant_p (arglist, target_mode);
4501 case BUILT_IN_FRAME_ADDRESS:
4502 case BUILT_IN_RETURN_ADDRESS:
4503 return expand_builtin_frame_address (fndecl, arglist);
4505 /* Returns the address of the area where the structure is returned.
4507 case BUILT_IN_AGGREGATE_INCOMING_ADDRESS:
4509 || ! AGGREGATE_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl)))
4510 || GET_CODE (DECL_RTL (DECL_RESULT (current_function_decl))) != MEM)
4513 return XEXP (DECL_RTL (DECL_RESULT (current_function_decl)), 0);
4515 case BUILT_IN_ALLOCA:
4516 target = expand_builtin_alloca (arglist, target);
4523 case BUILT_IN_FFSLL:
4524 target = expand_builtin_unop (target_mode, arglist, target,
4525 subtarget, ffs_optab);
4532 case BUILT_IN_CLZLL:
4533 target = expand_builtin_unop (target_mode, arglist, target,
4534 subtarget, clz_optab);
4541 case BUILT_IN_CTZLL:
4542 target = expand_builtin_unop (target_mode, arglist, target,
4543 subtarget, ctz_optab);
4548 case BUILT_IN_POPCOUNT:
4549 case BUILT_IN_POPCOUNTL:
4550 case BUILT_IN_POPCOUNTLL:
4551 target = expand_builtin_unop (target_mode, arglist, target,
4552 subtarget, popcount_optab);
4557 case BUILT_IN_PARITY:
4558 case BUILT_IN_PARITYL:
4559 case BUILT_IN_PARITYLL:
4560 target = expand_builtin_unop (target_mode, arglist, target,
4561 subtarget, parity_optab);
4566 case BUILT_IN_STRLEN:
4567 target = expand_builtin_strlen (arglist, target, target_mode);
4572 case BUILT_IN_STRCPY:
4573 target = expand_builtin_strcpy (arglist, target, mode);
4578 case BUILT_IN_STRNCPY:
4579 target = expand_builtin_strncpy (arglist, target, mode);
4584 case BUILT_IN_STPCPY:
4585 target = expand_builtin_stpcpy (arglist, target, mode);
4590 case BUILT_IN_STRCAT:
4591 target = expand_builtin_strcat (arglist, target, mode);
4596 case BUILT_IN_STRNCAT:
4597 target = expand_builtin_strncat (arglist, target, mode);
4602 case BUILT_IN_STRSPN:
4603 target = expand_builtin_strspn (arglist, target, mode);
4608 case BUILT_IN_STRCSPN:
4609 target = expand_builtin_strcspn (arglist, target, mode);
4614 case BUILT_IN_STRSTR:
4615 target = expand_builtin_strstr (arglist, target, mode);
4620 case BUILT_IN_STRPBRK:
4621 target = expand_builtin_strpbrk (arglist, target, mode);
4626 case BUILT_IN_INDEX:
4627 case BUILT_IN_STRCHR:
4628 target = expand_builtin_strchr (arglist, target, mode);
4633 case BUILT_IN_RINDEX:
4634 case BUILT_IN_STRRCHR:
4635 target = expand_builtin_strrchr (arglist, target, mode);
4640 case BUILT_IN_MEMCPY:
4641 target = expand_builtin_memcpy (arglist, target, mode, /*endp=*/0);
4646 case BUILT_IN_MEMPCPY:
4647 target = expand_builtin_mempcpy (arglist, target, mode);
4652 case BUILT_IN_MEMMOVE:
4653 target = expand_builtin_memmove (arglist, target, mode);
4658 case BUILT_IN_BCOPY:
4659 target = expand_builtin_bcopy (arglist);
4664 case BUILT_IN_MEMSET:
4665 target = expand_builtin_memset (arglist, target, mode);
4670 case BUILT_IN_BZERO:
4671 target = expand_builtin_bzero (arglist);
4676 case BUILT_IN_STRCMP:
4677 target = expand_builtin_strcmp (exp, target, mode);
4682 case BUILT_IN_STRNCMP:
4683 target = expand_builtin_strncmp (exp, target, mode);
4689 case BUILT_IN_MEMCMP:
4690 target = expand_builtin_memcmp (exp, arglist, target, mode);
4695 case BUILT_IN_SETJMP:
4696 target = expand_builtin_setjmp (arglist, target);
4701 /* __builtin_longjmp is passed a pointer to an array of five words.
4702 It's similar to the C library longjmp function but works with
4703 __builtin_setjmp above. */
4704 case BUILT_IN_LONGJMP:
4705 if (!validate_arglist (arglist, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
4709 rtx buf_addr = expand_expr (TREE_VALUE (arglist), subtarget,
4711 rtx value = expand_expr (TREE_VALUE (TREE_CHAIN (arglist)),
4712 NULL_RTX, VOIDmode, 0);
4714 if (value != const1_rtx)
4716 error ("__builtin_longjmp second argument must be 1");
4720 expand_builtin_longjmp (buf_addr, value);
4725 expand_builtin_trap ();
4728 case BUILT_IN_FPUTS:
4729 target = expand_builtin_fputs (arglist, ignore,/*unlocked=*/ 0);
4733 case BUILT_IN_FPUTS_UNLOCKED:
4734 target = expand_builtin_fputs (arglist, ignore,/*unlocked=*/ 1);
4739 /* Various hooks for the DWARF 2 __throw routine. */
4740 case BUILT_IN_UNWIND_INIT:
4741 expand_builtin_unwind_init ();
4743 case BUILT_IN_DWARF_CFA:
4744 return virtual_cfa_rtx;
4745 #ifdef DWARF2_UNWIND_INFO
4746 case BUILT_IN_DWARF_SP_COLUMN:
4747 return expand_builtin_dwarf_sp_column ();
4748 case BUILT_IN_INIT_DWARF_REG_SIZES:
4749 expand_builtin_init_dwarf_reg_sizes (TREE_VALUE (arglist));
4752 case BUILT_IN_FROB_RETURN_ADDR:
4753 return expand_builtin_frob_return_addr (TREE_VALUE (arglist));
4754 case BUILT_IN_EXTRACT_RETURN_ADDR:
4755 return expand_builtin_extract_return_addr (TREE_VALUE (arglist));
4756 case BUILT_IN_EH_RETURN:
4757 expand_builtin_eh_return (TREE_VALUE (arglist),
4758 TREE_VALUE (TREE_CHAIN (arglist)));
4760 #ifdef EH_RETURN_DATA_REGNO
4761 case BUILT_IN_EH_RETURN_DATA_REGNO:
4762 return expand_builtin_eh_return_data_regno (arglist);
4764 case BUILT_IN_VA_START:
4765 case BUILT_IN_STDARG_START:
4766 return expand_builtin_va_start (arglist);
4767 case BUILT_IN_VA_END:
4768 return expand_builtin_va_end (arglist);
4769 case BUILT_IN_VA_COPY:
4770 return expand_builtin_va_copy (arglist);
4771 case BUILT_IN_EXPECT:
4772 return expand_builtin_expect (arglist, target);
4773 case BUILT_IN_PREFETCH:
4774 expand_builtin_prefetch (arglist);
4778 default: /* just do library call, if unknown builtin */
4779 if (!DECL_ASSEMBLER_NAME_SET_P (fndecl))
4780 error ("built-in function `%s' not currently supported",
4781 IDENTIFIER_POINTER (DECL_NAME (fndecl)));
4784 /* The switch statement above can drop through to cause the function
4785 to be called normally. */
4786 return expand_call (exp, target, ignore);
4789 /* Determine whether a tree node represents a call to a built-in
4790 math function. If the tree T is a call to a built-in function
4791 taking a single real argument, then the return value is the
4792 DECL_FUNCTION_CODE of the call, e.g. BUILT_IN_SQRT. Otherwise
4793 the return value is END_BUILTINS. */
4795 enum built_in_function
4796 builtin_mathfn_code (t)
4799 tree fndecl, arglist;
4801 if (TREE_CODE (t) != CALL_EXPR
4802 || TREE_CODE (TREE_OPERAND (t, 0)) != ADDR_EXPR)
4803 return END_BUILTINS;
4805 fndecl = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
4806 if (TREE_CODE (fndecl) != FUNCTION_DECL
4807 || ! DECL_BUILT_IN (fndecl)
4808 || DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
4809 return END_BUILTINS;
4811 arglist = TREE_OPERAND (t, 1);
4813 || TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != REAL_TYPE)
4814 return END_BUILTINS;
4816 arglist = TREE_CHAIN (arglist);
4817 switch (DECL_FUNCTION_CODE (fndecl))
4822 case BUILT_IN_ATAN2:
4823 case BUILT_IN_ATAN2F:
4824 case BUILT_IN_ATAN2L:
4826 || TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != REAL_TYPE
4827 || TREE_CHAIN (arglist))
4828 return END_BUILTINS;
4833 return END_BUILTINS;
4837 return DECL_FUNCTION_CODE (fndecl);
4840 /* Fold a call to __builtin_constant_p, if we know it will evaluate to a
4841 constant. ARGLIST is the argument list of the call. */
4844 fold_builtin_constant_p (arglist)
4850 arglist = TREE_VALUE (arglist);
4852 /* We return 1 for a numeric type that's known to be a constant
4853 value at compile-time or for an aggregate type that's a
4854 literal constant. */
4855 STRIP_NOPS (arglist);
4857 /* If we know this is a constant, emit the constant of one. */
4858 if (TREE_CODE_CLASS (TREE_CODE (arglist)) == 'c'
4859 || (TREE_CODE (arglist) == CONSTRUCTOR
4860 && TREE_CONSTANT (arglist))
4861 || (TREE_CODE (arglist) == ADDR_EXPR
4862 && TREE_CODE (TREE_OPERAND (arglist, 0)) == STRING_CST))
4863 return integer_one_node;
4865 /* If we aren't going to be running CSE or this expression
4866 has side effects, show we don't know it to be a constant.
4867 Likewise if it's a pointer or aggregate type since in those
4868 case we only want literals, since those are only optimized
4869 when generating RTL, not later.
4870 And finally, if we are compiling an initializer, not code, we
4871 need to return a definite result now; there's not going to be any
4872 more optimization done. */
4873 if (TREE_SIDE_EFFECTS (arglist) || cse_not_expected
4874 || AGGREGATE_TYPE_P (TREE_TYPE (arglist))
4875 || POINTER_TYPE_P (TREE_TYPE (arglist))
4877 return integer_zero_node;
4882 /* Fold a call to __builtin_classify_type. */
4885 fold_builtin_classify_type (arglist)
4889 return build_int_2 (no_type_class, 0);
4891 return build_int_2 (type_to_class (TREE_TYPE (TREE_VALUE (arglist))), 0);
4894 /* Fold a call to __builtin_inf or __builtin_huge_val. */
4897 fold_builtin_inf (type, warn)
4901 REAL_VALUE_TYPE real;
4903 if (!MODE_HAS_INFINITIES (TYPE_MODE (type)) && warn)
4904 warning ("target format does not support infinity");
4907 return build_real (type, real);
4910 /* Fold a call to __builtin_nan or __builtin_nans. */
4913 fold_builtin_nan (arglist, type, quiet)
4917 REAL_VALUE_TYPE real;
4920 if (!validate_arglist (arglist, POINTER_TYPE, VOID_TYPE))
4922 str = c_getstr (TREE_VALUE (arglist));
4926 if (!real_nan (&real, str, quiet, TYPE_MODE (type)))
4929 return build_real (type, real);
4932 /* EXP is assumed to me builtin call where truncation can be propagated
4933 across (for instance floor((double)f) == (double)floorf (f).
4934 Do the transformation. */
4936 fold_trunc_transparent_mathfn (exp)
4939 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4940 tree arglist = TREE_OPERAND (exp, 1);
4941 enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
4943 if (optimize && validate_arglist (arglist, REAL_TYPE, VOID_TYPE))
4945 tree arg0 = strip_float_extensions (TREE_VALUE (arglist));
4946 tree ftype = TREE_TYPE (exp);
4947 tree newtype = TREE_TYPE (arg0);
4950 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (ftype)
4951 && (decl = mathfn_built_in (newtype, fcode)))
4954 build_tree_list (NULL_TREE, fold (convert (newtype, arg0)));
4955 return convert (ftype,
4956 build_function_call_expr (decl, arglist));
4962 /* Used by constant folding to eliminate some builtin calls early. EXP is
4963 the CALL_EXPR of a call to a builtin function. */
4969 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4970 tree arglist = TREE_OPERAND (exp, 1);
4971 tree type = TREE_TYPE (TREE_TYPE (fndecl));
4973 if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
4976 switch (DECL_FUNCTION_CODE (fndecl))
4978 case BUILT_IN_CONSTANT_P:
4979 return fold_builtin_constant_p (arglist);
4981 case BUILT_IN_CLASSIFY_TYPE:
4982 return fold_builtin_classify_type (arglist);
4984 case BUILT_IN_STRLEN:
4985 if (validate_arglist (arglist, POINTER_TYPE, VOID_TYPE))
4987 tree len = c_strlen (TREE_VALUE (arglist));
4990 /* Convert from the internal "sizetype" type to "size_t". */
4992 len = convert (size_type_node, len);
4999 case BUILT_IN_SQRTF:
5000 case BUILT_IN_SQRTL:
5001 if (validate_arglist (arglist, REAL_TYPE, VOID_TYPE))
5003 enum built_in_function fcode;
5004 tree arg = TREE_VALUE (arglist);
5006 /* Optimize sqrt of constant value. */
5007 if (TREE_CODE (arg) == REAL_CST
5008 && ! TREE_CONSTANT_OVERFLOW (arg))
5010 enum machine_mode mode;
5011 REAL_VALUE_TYPE r, x;
5013 x = TREE_REAL_CST (arg);
5014 mode = TYPE_MODE (type);
5015 if (real_sqrt (&r, mode, &x)
5016 || (!flag_trapping_math && !flag_errno_math))
5017 return build_real (type, r);
5020 /* Optimize sqrt(exp(x)) = exp(x*0.5). */
5021 fcode = builtin_mathfn_code (arg);
5022 if (flag_unsafe_math_optimizations
5023 && (fcode == BUILT_IN_EXP
5024 || fcode == BUILT_IN_EXPF
5025 || fcode == BUILT_IN_EXPL))
5027 tree expfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
5028 arg = fold (build (MULT_EXPR, type,
5029 TREE_VALUE (TREE_OPERAND (arg, 1)),
5030 build_real (type, dconsthalf)));
5031 arglist = build_tree_list (NULL_TREE, arg);
5032 return build_function_call_expr (expfn, arglist);
5035 /* Optimize sqrt(pow(x,y)) = pow(x,y*0.5). */
5036 if (flag_unsafe_math_optimizations
5037 && (fcode == BUILT_IN_POW
5038 || fcode == BUILT_IN_POWF
5039 || fcode == BUILT_IN_POWL))
5041 tree powfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
5042 tree arg0 = TREE_VALUE (TREE_OPERAND (arg, 1));
5043 tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg, 1)));
5044 tree narg1 = fold (build (MULT_EXPR, type, arg1,
5045 build_real (type, dconsthalf)));
5046 arglist = tree_cons (NULL_TREE, arg0,
5047 build_tree_list (NULL_TREE, narg1));
5048 return build_function_call_expr (powfn, arglist);
5056 if (validate_arglist (arglist, REAL_TYPE, VOID_TYPE))
5058 tree arg = TREE_VALUE (arglist);
5060 /* Optimize sin(0.0) = 0.0. */
5061 if (real_zerop (arg))
5062 return build_real (type, dconst0);
5069 if (validate_arglist (arglist, REAL_TYPE, VOID_TYPE))
5071 tree arg = TREE_VALUE (arglist);
5073 /* Optimize cos(0.0) = 1.0. */
5074 if (real_zerop (arg))
5075 return build_real (type, dconst1);
5082 if (validate_arglist (arglist, REAL_TYPE, VOID_TYPE))
5084 enum built_in_function fcode;
5085 tree arg = TREE_VALUE (arglist);
5087 /* Optimize exp(0.0) = 1.0. */
5088 if (real_zerop (arg))
5089 return build_real (type, dconst1);
5091 /* Optimize exp(log(x)) = x. */
5092 fcode = builtin_mathfn_code (arg);
5093 if (flag_unsafe_math_optimizations
5094 && (fcode == BUILT_IN_LOG
5095 || fcode == BUILT_IN_LOGF
5096 || fcode == BUILT_IN_LOGL))
5097 return TREE_VALUE (TREE_OPERAND (arg, 1));
5104 if (validate_arglist (arglist, REAL_TYPE, VOID_TYPE))
5106 enum built_in_function fcode;
5107 tree arg = TREE_VALUE (arglist);
5109 /* Optimize log(1.0) = 0.0. */
5110 if (real_onep (arg))
5111 return build_real (type, dconst0);
5113 /* Optimize log(exp(x)) = x. */
5114 fcode = builtin_mathfn_code (arg);
5115 if (flag_unsafe_math_optimizations
5116 && (fcode == BUILT_IN_EXP
5117 || fcode == BUILT_IN_EXPF
5118 || fcode == BUILT_IN_EXPL))
5119 return TREE_VALUE (TREE_OPERAND (arg, 1));
5121 /* Optimize log(sqrt(x)) = log(x)*0.5. */
5122 if (flag_unsafe_math_optimizations
5123 && (fcode == BUILT_IN_SQRT
5124 || fcode == BUILT_IN_SQRTF
5125 || fcode == BUILT_IN_SQRTL))
5127 tree logfn = build_function_call_expr (fndecl,
5128 TREE_OPERAND (arg, 1));
5129 return fold (build (MULT_EXPR, type, logfn,
5130 build_real (type, dconsthalf)));
5133 /* Optimize log(pow(x,y)) = y*log(x). */
5134 if (flag_unsafe_math_optimizations
5135 && (fcode == BUILT_IN_POW
5136 || fcode == BUILT_IN_POWF
5137 || fcode == BUILT_IN_POWL))
5139 tree arg0, arg1, logfn;
5141 arg0 = TREE_VALUE (TREE_OPERAND (arg, 1));
5142 arg1 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg, 1)));
5143 arglist = build_tree_list (NULL_TREE, arg0);
5144 logfn = build_function_call_expr (fndecl, arglist);
5145 return fold (build (MULT_EXPR, type, arg1, logfn));
5153 if (validate_arglist (arglist, REAL_TYPE, REAL_TYPE, VOID_TYPE))
5155 enum built_in_function fcode;
5156 tree arg0 = TREE_VALUE (arglist);
5157 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
5159 /* Optimize pow(1.0,y) = 1.0. */
5160 if (real_onep (arg0))
5161 return omit_one_operand (type, build_real (type, dconst1), arg1);
5163 if (TREE_CODE (arg1) == REAL_CST
5164 && ! TREE_CONSTANT_OVERFLOW (arg1))
5167 c = TREE_REAL_CST (arg1);
5169 /* Optimize pow(x,0.0) = 1.0. */
5170 if (REAL_VALUES_EQUAL (c, dconst0))
5171 return omit_one_operand (type, build_real (type, dconst1),
5174 /* Optimize pow(x,1.0) = x. */
5175 if (REAL_VALUES_EQUAL (c, dconst1))
5178 /* Optimize pow(x,-1.0) = 1.0/x. */
5179 if (REAL_VALUES_EQUAL (c, dconstm1))
5180 return fold (build (RDIV_EXPR, type,
5181 build_real (type, dconst1),
5184 /* Optimize pow(x,2.0) = x*x. */
5185 if (REAL_VALUES_EQUAL (c, dconst2)
5186 && (*lang_hooks.decls.global_bindings_p) () == 0
5187 && ! contains_placeholder_p (arg0))
5189 arg0 = save_expr (arg0);
5190 return fold (build (MULT_EXPR, type, arg0, arg0));
5193 /* Optimize pow(x,-2.0) = 1.0/(x*x). */
5194 if (flag_unsafe_math_optimizations
5195 && REAL_VALUES_EQUAL (c, dconstm2)
5196 && (*lang_hooks.decls.global_bindings_p) () == 0
5197 && ! contains_placeholder_p (arg0))
5199 arg0 = save_expr (arg0);
5200 return fold (build (RDIV_EXPR, type,
5201 build_real (type, dconst1),
5202 fold (build (MULT_EXPR, type,
5206 /* Optimize pow(x,0.5) = sqrt(x). */
5207 if (flag_unsafe_math_optimizations
5208 && REAL_VALUES_EQUAL (c, dconsthalf))
5212 fcode = DECL_FUNCTION_CODE (fndecl);
5213 if (fcode == BUILT_IN_POW)
5214 sqrtfn = implicit_built_in_decls[BUILT_IN_SQRT];
5215 else if (fcode == BUILT_IN_POWF)
5216 sqrtfn = implicit_built_in_decls[BUILT_IN_SQRTF];
5217 else if (fcode == BUILT_IN_POWL)
5218 sqrtfn = implicit_built_in_decls[BUILT_IN_SQRTL];
5222 if (sqrtfn != NULL_TREE)
5224 tree arglist = build_tree_list (NULL_TREE, arg0);
5225 return build_function_call_expr (sqrtfn, arglist);
5230 /* Optimize pow(exp(x),y) = exp(x*y). */
5231 fcode = builtin_mathfn_code (arg0);
5232 if (flag_unsafe_math_optimizations
5233 && (fcode == BUILT_IN_EXP
5234 || fcode == BUILT_IN_EXPF
5235 || fcode == BUILT_IN_EXPL))
5237 tree expfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
5238 tree arg = TREE_VALUE (TREE_OPERAND (arg0, 1));
5239 arg = fold (build (MULT_EXPR, type, arg, arg1));
5240 arglist = build_tree_list (NULL_TREE, arg);
5241 return build_function_call_expr (expfn, arglist);
5244 /* Optimize pow(sqrt(x),y) = pow(x,y*0.5). */
5245 if (flag_unsafe_math_optimizations
5246 && (fcode == BUILT_IN_SQRT
5247 || fcode == BUILT_IN_SQRTF
5248 || fcode == BUILT_IN_SQRTL))
5250 tree narg0 = TREE_VALUE (TREE_OPERAND (arg0, 1));
5251 tree narg1 = fold (build (MULT_EXPR, type, arg1,
5252 build_real (type, dconsthalf)));
5254 arglist = tree_cons (NULL_TREE, narg0,
5255 build_tree_list (NULL_TREE, narg1));
5256 return build_function_call_expr (fndecl, arglist);
5259 /* Optimize pow(pow(x,y),z) = pow(x,y*z). */
5260 if (flag_unsafe_math_optimizations
5261 && (fcode == BUILT_IN_POW
5262 || fcode == BUILT_IN_POWF
5263 || fcode == BUILT_IN_POWL))
5265 tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
5266 tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0, 1)));
5267 tree narg1 = fold (build (MULT_EXPR, type, arg01, arg1));
5268 arglist = tree_cons (NULL_TREE, arg00,
5269 build_tree_list (NULL_TREE, narg1));
5270 return build_function_call_expr (fndecl, arglist);
5278 return fold_builtin_inf (type, true);
5280 case BUILT_IN_HUGE_VAL:
5281 case BUILT_IN_HUGE_VALF:
5282 case BUILT_IN_HUGE_VALL:
5283 return fold_builtin_inf (type, false);
5288 return fold_builtin_nan (arglist, type, true);
5291 case BUILT_IN_NANSF:
5292 case BUILT_IN_NANSL:
5293 return fold_builtin_nan (arglist, type, false);
5295 case BUILT_IN_FLOOR:
5296 case BUILT_IN_FLOORF:
5297 case BUILT_IN_FLOORL:
5299 case BUILT_IN_CEILF:
5300 case BUILT_IN_CEILL:
5301 case BUILT_IN_TRUNC:
5302 case BUILT_IN_TRUNCF:
5303 case BUILT_IN_TRUNCL:
5304 case BUILT_IN_ROUND:
5305 case BUILT_IN_ROUNDF:
5306 case BUILT_IN_ROUNDL:
5307 case BUILT_IN_NEARBYINT:
5308 case BUILT_IN_NEARBYINTF:
5309 case BUILT_IN_NEARBYINTL:
5310 return fold_trunc_transparent_mathfn (exp);
5319 /* Conveniently construct a function call expression. */
5322 build_function_call_expr (fn, arglist)
5327 call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
5328 call_expr = build (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)),
5329 call_expr, arglist);
5330 TREE_SIDE_EFFECTS (call_expr) = 1;
5331 return fold (call_expr);
5334 /* This function validates the types of a function call argument list
5335 represented as a tree chain of parameters against a specified list
5336 of tree_codes. If the last specifier is a 0, that represents an
5337 ellipses, otherwise the last specifier must be a VOID_TYPE. */
5340 validate_arglist VPARAMS ((tree arglist, ...))
5342 enum tree_code code;
5345 VA_OPEN (ap, arglist);
5346 VA_FIXEDARG (ap, tree, arglist);
5350 code = va_arg (ap, enum tree_code);
5354 /* This signifies an ellipses, any further arguments are all ok. */
5358 /* This signifies an endlink, if no arguments remain, return
5359 true, otherwise return false. */
5363 /* If no parameters remain or the parameter's code does not
5364 match the specified code, return false. Otherwise continue
5365 checking any remaining arguments. */
5367 || code != TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))))
5371 arglist = TREE_CHAIN (arglist);
5375 /* We need gotos here since we can only have one VA_CLOSE in a
5383 /* Default version of target-specific builtin setup that does nothing. */
5386 default_init_builtins ()
5390 /* Default target-specific builtin expander that does nothing. */
5393 default_expand_builtin (exp, target, subtarget, mode, ignore)
5394 tree exp ATTRIBUTE_UNUSED;
5395 rtx target ATTRIBUTE_UNUSED;
5396 rtx subtarget ATTRIBUTE_UNUSED;
5397 enum machine_mode mode ATTRIBUTE_UNUSED;
5398 int ignore ATTRIBUTE_UNUSED;
5403 /* Instantiate all remaining CONSTANT_P_RTX nodes. */
5406 purge_builtin_constant_p ()
5408 rtx insn, set, arg, new, note;
5410 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
5412 && (set = single_set (insn)) != NULL_RTX
5413 && (GET_CODE (arg = SET_SRC (set)) == CONSTANT_P_RTX
5414 || (GET_CODE (arg) == SUBREG
5415 && (GET_CODE (arg = SUBREG_REG (arg))
5416 == CONSTANT_P_RTX))))
5418 arg = XEXP (arg, 0);
5419 new = CONSTANT_P (arg) ? const1_rtx : const0_rtx;
5420 validate_change (insn, &SET_SRC (set), new, 0);
5422 /* Remove the REG_EQUAL note from the insn. */
5423 if ((note = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0)
5424 remove_note (insn, note);