]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/expr.c
Update copyright years.
[thirdparty/gcc.git] / gcc / expr.c
1 /* Convert tree expression to rtl instructions, for GNU compiler.
2 Copyright (C) 1988-2020 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "target.h"
25 #include "rtl.h"
26 #include "tree.h"
27 #include "gimple.h"
28 #include "predict.h"
29 #include "memmodel.h"
30 #include "tm_p.h"
31 #include "ssa.h"
32 #include "expmed.h"
33 #include "optabs.h"
34 #include "regs.h"
35 #include "emit-rtl.h"
36 #include "recog.h"
37 #include "cgraph.h"
38 #include "diagnostic.h"
39 #include "alias.h"
40 #include "fold-const.h"
41 #include "stor-layout.h"
42 #include "attribs.h"
43 #include "varasm.h"
44 #include "except.h"
45 #include "insn-attr.h"
46 #include "dojump.h"
47 #include "explow.h"
48 #include "calls.h"
49 #include "stmt.h"
50 /* Include expr.h after insn-config.h so we get HAVE_conditional_move. */
51 #include "expr.h"
52 #include "optabs-tree.h"
53 #include "libfuncs.h"
54 #include "reload.h"
55 #include "langhooks.h"
56 #include "common/common-target.h"
57 #include "tree-dfa.h"
58 #include "tree-ssa-live.h"
59 #include "tree-outof-ssa.h"
60 #include "tree-ssa-address.h"
61 #include "builtins.h"
62 #include "ccmp.h"
63 #include "gimple-fold.h"
64 #include "rtx-vector-builder.h"
65
66
67 /* If this is nonzero, we do not bother generating VOLATILE
68 around volatile memory references, and we are willing to
69 output indirect addresses. If cse is to follow, we reject
70 indirect addresses so a useful potential cse is generated;
71 if it is used only once, instruction combination will produce
72 the same indirect address eventually. */
73 int cse_not_expected;
74
75 static bool block_move_libcall_safe_for_call_parm (void);
76 static bool emit_block_move_via_pattern (rtx, rtx, rtx, unsigned, unsigned,
77 HOST_WIDE_INT, unsigned HOST_WIDE_INT,
78 unsigned HOST_WIDE_INT,
79 unsigned HOST_WIDE_INT, bool);
80 static void emit_block_move_via_loop (rtx, rtx, rtx, unsigned);
81 static void clear_by_pieces (rtx, unsigned HOST_WIDE_INT, unsigned int);
82 static rtx_insn *compress_float_constant (rtx, rtx);
83 static rtx get_subtarget (rtx);
84 static void store_constructor (tree, rtx, int, poly_int64, bool);
85 static rtx store_field (rtx, poly_int64, poly_int64, poly_uint64, poly_uint64,
86 machine_mode, tree, alias_set_type, bool, bool);
87
88 static unsigned HOST_WIDE_INT highest_pow2_factor_for_target (const_tree, const_tree);
89
90 static int is_aligning_offset (const_tree, const_tree);
91 static rtx reduce_to_bit_field_precision (rtx, rtx, tree);
92 static rtx do_store_flag (sepops, rtx, machine_mode);
93 #ifdef PUSH_ROUNDING
94 static void emit_single_push_insn (machine_mode, rtx, tree);
95 #endif
96 static void do_tablejump (rtx, machine_mode, rtx, rtx, rtx,
97 profile_probability);
98 static rtx const_vector_from_tree (tree);
99 static rtx const_scalar_mask_from_tree (scalar_int_mode, tree);
100 static tree tree_expr_size (const_tree);
101 static HOST_WIDE_INT int_expr_size (tree);
102 static void convert_mode_scalar (rtx, rtx, int);
103
104 \f
105 /* This is run to set up which modes can be used
106 directly in memory and to initialize the block move optab. It is run
107 at the beginning of compilation and when the target is reinitialized. */
108
109 void
110 init_expr_target (void)
111 {
112 rtx pat;
113 int num_clobbers;
114 rtx mem, mem1;
115 rtx reg;
116
117 /* Try indexing by frame ptr and try by stack ptr.
118 It is known that on the Convex the stack ptr isn't a valid index.
119 With luck, one or the other is valid on any machine. */
120 mem = gen_rtx_MEM (word_mode, stack_pointer_rtx);
121 mem1 = gen_rtx_MEM (word_mode, frame_pointer_rtx);
122
123 /* A scratch register we can modify in-place below to avoid
124 useless RTL allocations. */
125 reg = gen_rtx_REG (word_mode, LAST_VIRTUAL_REGISTER + 1);
126
127 rtx_insn *insn = as_a<rtx_insn *> (rtx_alloc (INSN));
128 pat = gen_rtx_SET (NULL_RTX, NULL_RTX);
129 PATTERN (insn) = pat;
130
131 for (machine_mode mode = VOIDmode; (int) mode < NUM_MACHINE_MODES;
132 mode = (machine_mode) ((int) mode + 1))
133 {
134 int regno;
135
136 direct_load[(int) mode] = direct_store[(int) mode] = 0;
137 PUT_MODE (mem, mode);
138 PUT_MODE (mem1, mode);
139
140 /* See if there is some register that can be used in this mode and
141 directly loaded or stored from memory. */
142
143 if (mode != VOIDmode && mode != BLKmode)
144 for (regno = 0; regno < FIRST_PSEUDO_REGISTER
145 && (direct_load[(int) mode] == 0 || direct_store[(int) mode] == 0);
146 regno++)
147 {
148 if (!targetm.hard_regno_mode_ok (regno, mode))
149 continue;
150
151 set_mode_and_regno (reg, mode, regno);
152
153 SET_SRC (pat) = mem;
154 SET_DEST (pat) = reg;
155 if (recog (pat, insn, &num_clobbers) >= 0)
156 direct_load[(int) mode] = 1;
157
158 SET_SRC (pat) = mem1;
159 SET_DEST (pat) = reg;
160 if (recog (pat, insn, &num_clobbers) >= 0)
161 direct_load[(int) mode] = 1;
162
163 SET_SRC (pat) = reg;
164 SET_DEST (pat) = mem;
165 if (recog (pat, insn, &num_clobbers) >= 0)
166 direct_store[(int) mode] = 1;
167
168 SET_SRC (pat) = reg;
169 SET_DEST (pat) = mem1;
170 if (recog (pat, insn, &num_clobbers) >= 0)
171 direct_store[(int) mode] = 1;
172 }
173 }
174
175 mem = gen_rtx_MEM (VOIDmode, gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1));
176
177 opt_scalar_float_mode mode_iter;
178 FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_FLOAT)
179 {
180 scalar_float_mode mode = mode_iter.require ();
181 scalar_float_mode srcmode;
182 FOR_EACH_MODE_UNTIL (srcmode, mode)
183 {
184 enum insn_code ic;
185
186 ic = can_extend_p (mode, srcmode, 0);
187 if (ic == CODE_FOR_nothing)
188 continue;
189
190 PUT_MODE (mem, srcmode);
191
192 if (insn_operand_matches (ic, 1, mem))
193 float_extend_from_mem[mode][srcmode] = true;
194 }
195 }
196 }
197
198 /* This is run at the start of compiling a function. */
199
200 void
201 init_expr (void)
202 {
203 memset (&crtl->expr, 0, sizeof (crtl->expr));
204 }
205 \f
206 /* Copy data from FROM to TO, where the machine modes are not the same.
207 Both modes may be integer, or both may be floating, or both may be
208 fixed-point.
209 UNSIGNEDP should be nonzero if FROM is an unsigned type.
210 This causes zero-extension instead of sign-extension. */
211
212 void
213 convert_move (rtx to, rtx from, int unsignedp)
214 {
215 machine_mode to_mode = GET_MODE (to);
216 machine_mode from_mode = GET_MODE (from);
217
218 gcc_assert (to_mode != BLKmode);
219 gcc_assert (from_mode != BLKmode);
220
221 /* If the source and destination are already the same, then there's
222 nothing to do. */
223 if (to == from)
224 return;
225
226 /* If FROM is a SUBREG that indicates that we have already done at least
227 the required extension, strip it. We don't handle such SUBREGs as
228 TO here. */
229
230 scalar_int_mode to_int_mode;
231 if (GET_CODE (from) == SUBREG
232 && SUBREG_PROMOTED_VAR_P (from)
233 && is_a <scalar_int_mode> (to_mode, &to_int_mode)
234 && (GET_MODE_PRECISION (subreg_promoted_mode (from))
235 >= GET_MODE_PRECISION (to_int_mode))
236 && SUBREG_CHECK_PROMOTED_SIGN (from, unsignedp))
237 {
238 from = gen_lowpart (to_int_mode, SUBREG_REG (from));
239 from_mode = to_int_mode;
240 }
241
242 gcc_assert (GET_CODE (to) != SUBREG || !SUBREG_PROMOTED_VAR_P (to));
243
244 if (to_mode == from_mode
245 || (from_mode == VOIDmode && CONSTANT_P (from)))
246 {
247 emit_move_insn (to, from);
248 return;
249 }
250
251 if (VECTOR_MODE_P (to_mode) || VECTOR_MODE_P (from_mode))
252 {
253 if (GET_MODE_UNIT_PRECISION (to_mode)
254 > GET_MODE_UNIT_PRECISION (from_mode))
255 {
256 optab op = unsignedp ? zext_optab : sext_optab;
257 insn_code icode = convert_optab_handler (op, to_mode, from_mode);
258 if (icode != CODE_FOR_nothing)
259 {
260 emit_unop_insn (icode, to, from,
261 unsignedp ? ZERO_EXTEND : SIGN_EXTEND);
262 return;
263 }
264 }
265
266 if (GET_MODE_UNIT_PRECISION (to_mode)
267 < GET_MODE_UNIT_PRECISION (from_mode))
268 {
269 insn_code icode = convert_optab_handler (trunc_optab,
270 to_mode, from_mode);
271 if (icode != CODE_FOR_nothing)
272 {
273 emit_unop_insn (icode, to, from, TRUNCATE);
274 return;
275 }
276 }
277
278 gcc_assert (known_eq (GET_MODE_BITSIZE (from_mode),
279 GET_MODE_BITSIZE (to_mode)));
280
281 if (VECTOR_MODE_P (to_mode))
282 from = simplify_gen_subreg (to_mode, from, GET_MODE (from), 0);
283 else
284 to = simplify_gen_subreg (from_mode, to, GET_MODE (to), 0);
285
286 emit_move_insn (to, from);
287 return;
288 }
289
290 if (GET_CODE (to) == CONCAT && GET_CODE (from) == CONCAT)
291 {
292 convert_move (XEXP (to, 0), XEXP (from, 0), unsignedp);
293 convert_move (XEXP (to, 1), XEXP (from, 1), unsignedp);
294 return;
295 }
296
297 convert_mode_scalar (to, from, unsignedp);
298 }
299
300 /* Like convert_move, but deals only with scalar modes. */
301
302 static void
303 convert_mode_scalar (rtx to, rtx from, int unsignedp)
304 {
305 /* Both modes should be scalar types. */
306 scalar_mode from_mode = as_a <scalar_mode> (GET_MODE (from));
307 scalar_mode to_mode = as_a <scalar_mode> (GET_MODE (to));
308 bool to_real = SCALAR_FLOAT_MODE_P (to_mode);
309 bool from_real = SCALAR_FLOAT_MODE_P (from_mode);
310 enum insn_code code;
311 rtx libcall;
312
313 gcc_assert (to_real == from_real);
314
315 /* rtx code for making an equivalent value. */
316 enum rtx_code equiv_code = (unsignedp < 0 ? UNKNOWN
317 : (unsignedp ? ZERO_EXTEND : SIGN_EXTEND));
318
319 if (to_real)
320 {
321 rtx value;
322 rtx_insn *insns;
323 convert_optab tab;
324
325 gcc_assert ((GET_MODE_PRECISION (from_mode)
326 != GET_MODE_PRECISION (to_mode))
327 || (DECIMAL_FLOAT_MODE_P (from_mode)
328 != DECIMAL_FLOAT_MODE_P (to_mode)));
329
330 if (GET_MODE_PRECISION (from_mode) == GET_MODE_PRECISION (to_mode))
331 /* Conversion between decimal float and binary float, same size. */
332 tab = DECIMAL_FLOAT_MODE_P (from_mode) ? trunc_optab : sext_optab;
333 else if (GET_MODE_PRECISION (from_mode) < GET_MODE_PRECISION (to_mode))
334 tab = sext_optab;
335 else
336 tab = trunc_optab;
337
338 /* Try converting directly if the insn is supported. */
339
340 code = convert_optab_handler (tab, to_mode, from_mode);
341 if (code != CODE_FOR_nothing)
342 {
343 emit_unop_insn (code, to, from,
344 tab == sext_optab ? FLOAT_EXTEND : FLOAT_TRUNCATE);
345 return;
346 }
347
348 /* Otherwise use a libcall. */
349 libcall = convert_optab_libfunc (tab, to_mode, from_mode);
350
351 /* Is this conversion implemented yet? */
352 gcc_assert (libcall);
353
354 start_sequence ();
355 value = emit_library_call_value (libcall, NULL_RTX, LCT_CONST, to_mode,
356 from, from_mode);
357 insns = get_insns ();
358 end_sequence ();
359 emit_libcall_block (insns, to, value,
360 tab == trunc_optab ? gen_rtx_FLOAT_TRUNCATE (to_mode,
361 from)
362 : gen_rtx_FLOAT_EXTEND (to_mode, from));
363 return;
364 }
365
366 /* Handle pointer conversion. */ /* SPEE 900220. */
367 /* If the target has a converter from FROM_MODE to TO_MODE, use it. */
368 {
369 convert_optab ctab;
370
371 if (GET_MODE_PRECISION (from_mode) > GET_MODE_PRECISION (to_mode))
372 ctab = trunc_optab;
373 else if (unsignedp)
374 ctab = zext_optab;
375 else
376 ctab = sext_optab;
377
378 if (convert_optab_handler (ctab, to_mode, from_mode)
379 != CODE_FOR_nothing)
380 {
381 emit_unop_insn (convert_optab_handler (ctab, to_mode, from_mode),
382 to, from, UNKNOWN);
383 return;
384 }
385 }
386
387 /* Targets are expected to provide conversion insns between PxImode and
388 xImode for all MODE_PARTIAL_INT modes they use, but no others. */
389 if (GET_MODE_CLASS (to_mode) == MODE_PARTIAL_INT)
390 {
391 scalar_int_mode full_mode
392 = smallest_int_mode_for_size (GET_MODE_BITSIZE (to_mode));
393
394 gcc_assert (convert_optab_handler (trunc_optab, to_mode, full_mode)
395 != CODE_FOR_nothing);
396
397 if (full_mode != from_mode)
398 from = convert_to_mode (full_mode, from, unsignedp);
399 emit_unop_insn (convert_optab_handler (trunc_optab, to_mode, full_mode),
400 to, from, UNKNOWN);
401 return;
402 }
403 if (GET_MODE_CLASS (from_mode) == MODE_PARTIAL_INT)
404 {
405 rtx new_from;
406 scalar_int_mode full_mode
407 = smallest_int_mode_for_size (GET_MODE_BITSIZE (from_mode));
408 convert_optab ctab = unsignedp ? zext_optab : sext_optab;
409 enum insn_code icode;
410
411 icode = convert_optab_handler (ctab, full_mode, from_mode);
412 gcc_assert (icode != CODE_FOR_nothing);
413
414 if (to_mode == full_mode)
415 {
416 emit_unop_insn (icode, to, from, UNKNOWN);
417 return;
418 }
419
420 new_from = gen_reg_rtx (full_mode);
421 emit_unop_insn (icode, new_from, from, UNKNOWN);
422
423 /* else proceed to integer conversions below. */
424 from_mode = full_mode;
425 from = new_from;
426 }
427
428 /* Make sure both are fixed-point modes or both are not. */
429 gcc_assert (ALL_SCALAR_FIXED_POINT_MODE_P (from_mode) ==
430 ALL_SCALAR_FIXED_POINT_MODE_P (to_mode));
431 if (ALL_SCALAR_FIXED_POINT_MODE_P (from_mode))
432 {
433 /* If we widen from_mode to to_mode and they are in the same class,
434 we won't saturate the result.
435 Otherwise, always saturate the result to play safe. */
436 if (GET_MODE_CLASS (from_mode) == GET_MODE_CLASS (to_mode)
437 && GET_MODE_SIZE (from_mode) < GET_MODE_SIZE (to_mode))
438 expand_fixed_convert (to, from, 0, 0);
439 else
440 expand_fixed_convert (to, from, 0, 1);
441 return;
442 }
443
444 /* Now both modes are integers. */
445
446 /* Handle expanding beyond a word. */
447 if (GET_MODE_PRECISION (from_mode) < GET_MODE_PRECISION (to_mode)
448 && GET_MODE_PRECISION (to_mode) > BITS_PER_WORD)
449 {
450 rtx_insn *insns;
451 rtx lowpart;
452 rtx fill_value;
453 rtx lowfrom;
454 int i;
455 scalar_mode lowpart_mode;
456 int nwords = CEIL (GET_MODE_SIZE (to_mode), UNITS_PER_WORD);
457
458 /* Try converting directly if the insn is supported. */
459 if ((code = can_extend_p (to_mode, from_mode, unsignedp))
460 != CODE_FOR_nothing)
461 {
462 /* If FROM is a SUBREG, put it into a register. Do this
463 so that we always generate the same set of insns for
464 better cse'ing; if an intermediate assignment occurred,
465 we won't be doing the operation directly on the SUBREG. */
466 if (optimize > 0 && GET_CODE (from) == SUBREG)
467 from = force_reg (from_mode, from);
468 emit_unop_insn (code, to, from, equiv_code);
469 return;
470 }
471 /* Next, try converting via full word. */
472 else if (GET_MODE_PRECISION (from_mode) < BITS_PER_WORD
473 && ((code = can_extend_p (to_mode, word_mode, unsignedp))
474 != CODE_FOR_nothing))
475 {
476 rtx word_to = gen_reg_rtx (word_mode);
477 if (REG_P (to))
478 {
479 if (reg_overlap_mentioned_p (to, from))
480 from = force_reg (from_mode, from);
481 emit_clobber (to);
482 }
483 convert_move (word_to, from, unsignedp);
484 emit_unop_insn (code, to, word_to, equiv_code);
485 return;
486 }
487
488 /* No special multiword conversion insn; do it by hand. */
489 start_sequence ();
490
491 /* Since we will turn this into a no conflict block, we must ensure
492 the source does not overlap the target so force it into an isolated
493 register when maybe so. Likewise for any MEM input, since the
494 conversion sequence might require several references to it and we
495 must ensure we're getting the same value every time. */
496
497 if (MEM_P (from) || reg_overlap_mentioned_p (to, from))
498 from = force_reg (from_mode, from);
499
500 /* Get a copy of FROM widened to a word, if necessary. */
501 if (GET_MODE_PRECISION (from_mode) < BITS_PER_WORD)
502 lowpart_mode = word_mode;
503 else
504 lowpart_mode = from_mode;
505
506 lowfrom = convert_to_mode (lowpart_mode, from, unsignedp);
507
508 lowpart = gen_lowpart (lowpart_mode, to);
509 emit_move_insn (lowpart, lowfrom);
510
511 /* Compute the value to put in each remaining word. */
512 if (unsignedp)
513 fill_value = const0_rtx;
514 else
515 fill_value = emit_store_flag_force (gen_reg_rtx (word_mode),
516 LT, lowfrom, const0_rtx,
517 lowpart_mode, 0, -1);
518
519 /* Fill the remaining words. */
520 for (i = GET_MODE_SIZE (lowpart_mode) / UNITS_PER_WORD; i < nwords; i++)
521 {
522 int index = (WORDS_BIG_ENDIAN ? nwords - i - 1 : i);
523 rtx subword = operand_subword (to, index, 1, to_mode);
524
525 gcc_assert (subword);
526
527 if (fill_value != subword)
528 emit_move_insn (subword, fill_value);
529 }
530
531 insns = get_insns ();
532 end_sequence ();
533
534 emit_insn (insns);
535 return;
536 }
537
538 /* Truncating multi-word to a word or less. */
539 if (GET_MODE_PRECISION (from_mode) > BITS_PER_WORD
540 && GET_MODE_PRECISION (to_mode) <= BITS_PER_WORD)
541 {
542 if (!((MEM_P (from)
543 && ! MEM_VOLATILE_P (from)
544 && direct_load[(int) to_mode]
545 && ! mode_dependent_address_p (XEXP (from, 0),
546 MEM_ADDR_SPACE (from)))
547 || REG_P (from)
548 || GET_CODE (from) == SUBREG))
549 from = force_reg (from_mode, from);
550 convert_move (to, gen_lowpart (word_mode, from), 0);
551 return;
552 }
553
554 /* Now follow all the conversions between integers
555 no more than a word long. */
556
557 /* For truncation, usually we can just refer to FROM in a narrower mode. */
558 if (GET_MODE_BITSIZE (to_mode) < GET_MODE_BITSIZE (from_mode)
559 && TRULY_NOOP_TRUNCATION_MODES_P (to_mode, from_mode))
560 {
561 if (!((MEM_P (from)
562 && ! MEM_VOLATILE_P (from)
563 && direct_load[(int) to_mode]
564 && ! mode_dependent_address_p (XEXP (from, 0),
565 MEM_ADDR_SPACE (from)))
566 || REG_P (from)
567 || GET_CODE (from) == SUBREG))
568 from = force_reg (from_mode, from);
569 if (REG_P (from) && REGNO (from) < FIRST_PSEUDO_REGISTER
570 && !targetm.hard_regno_mode_ok (REGNO (from), to_mode))
571 from = copy_to_reg (from);
572 emit_move_insn (to, gen_lowpart (to_mode, from));
573 return;
574 }
575
576 /* Handle extension. */
577 if (GET_MODE_PRECISION (to_mode) > GET_MODE_PRECISION (from_mode))
578 {
579 /* Convert directly if that works. */
580 if ((code = can_extend_p (to_mode, from_mode, unsignedp))
581 != CODE_FOR_nothing)
582 {
583 emit_unop_insn (code, to, from, equiv_code);
584 return;
585 }
586 else
587 {
588 rtx tmp;
589 int shift_amount;
590
591 /* Search for a mode to convert via. */
592 opt_scalar_mode intermediate_iter;
593 FOR_EACH_MODE_FROM (intermediate_iter, from_mode)
594 {
595 scalar_mode intermediate = intermediate_iter.require ();
596 if (((can_extend_p (to_mode, intermediate, unsignedp)
597 != CODE_FOR_nothing)
598 || (GET_MODE_SIZE (to_mode) < GET_MODE_SIZE (intermediate)
599 && TRULY_NOOP_TRUNCATION_MODES_P (to_mode,
600 intermediate)))
601 && (can_extend_p (intermediate, from_mode, unsignedp)
602 != CODE_FOR_nothing))
603 {
604 convert_move (to, convert_to_mode (intermediate, from,
605 unsignedp), unsignedp);
606 return;
607 }
608 }
609
610 /* No suitable intermediate mode.
611 Generate what we need with shifts. */
612 shift_amount = (GET_MODE_PRECISION (to_mode)
613 - GET_MODE_PRECISION (from_mode));
614 from = gen_lowpart (to_mode, force_reg (from_mode, from));
615 tmp = expand_shift (LSHIFT_EXPR, to_mode, from, shift_amount,
616 to, unsignedp);
617 tmp = expand_shift (RSHIFT_EXPR, to_mode, tmp, shift_amount,
618 to, unsignedp);
619 if (tmp != to)
620 emit_move_insn (to, tmp);
621 return;
622 }
623 }
624
625 /* Support special truncate insns for certain modes. */
626 if (convert_optab_handler (trunc_optab, to_mode,
627 from_mode) != CODE_FOR_nothing)
628 {
629 emit_unop_insn (convert_optab_handler (trunc_optab, to_mode, from_mode),
630 to, from, UNKNOWN);
631 return;
632 }
633
634 /* Handle truncation of volatile memrefs, and so on;
635 the things that couldn't be truncated directly,
636 and for which there was no special instruction.
637
638 ??? Code above formerly short-circuited this, for most integer
639 mode pairs, with a force_reg in from_mode followed by a recursive
640 call to this routine. Appears always to have been wrong. */
641 if (GET_MODE_PRECISION (to_mode) < GET_MODE_PRECISION (from_mode))
642 {
643 rtx temp = force_reg (to_mode, gen_lowpart (to_mode, from));
644 emit_move_insn (to, temp);
645 return;
646 }
647
648 /* Mode combination is not recognized. */
649 gcc_unreachable ();
650 }
651
652 /* Return an rtx for a value that would result
653 from converting X to mode MODE.
654 Both X and MODE may be floating, or both integer.
655 UNSIGNEDP is nonzero if X is an unsigned value.
656 This can be done by referring to a part of X in place
657 or by copying to a new temporary with conversion. */
658
659 rtx
660 convert_to_mode (machine_mode mode, rtx x, int unsignedp)
661 {
662 return convert_modes (mode, VOIDmode, x, unsignedp);
663 }
664
665 /* Return an rtx for a value that would result
666 from converting X from mode OLDMODE to mode MODE.
667 Both modes may be floating, or both integer.
668 UNSIGNEDP is nonzero if X is an unsigned value.
669
670 This can be done by referring to a part of X in place
671 or by copying to a new temporary with conversion.
672
673 You can give VOIDmode for OLDMODE, if you are sure X has a nonvoid mode. */
674
675 rtx
676 convert_modes (machine_mode mode, machine_mode oldmode, rtx x, int unsignedp)
677 {
678 rtx temp;
679 scalar_int_mode int_mode;
680
681 /* If FROM is a SUBREG that indicates that we have already done at least
682 the required extension, strip it. */
683
684 if (GET_CODE (x) == SUBREG
685 && SUBREG_PROMOTED_VAR_P (x)
686 && is_a <scalar_int_mode> (mode, &int_mode)
687 && (GET_MODE_PRECISION (subreg_promoted_mode (x))
688 >= GET_MODE_PRECISION (int_mode))
689 && SUBREG_CHECK_PROMOTED_SIGN (x, unsignedp))
690 x = gen_lowpart (int_mode, SUBREG_REG (x));
691
692 if (GET_MODE (x) != VOIDmode)
693 oldmode = GET_MODE (x);
694
695 if (mode == oldmode)
696 return x;
697
698 if (CONST_SCALAR_INT_P (x)
699 && is_int_mode (mode, &int_mode))
700 {
701 /* If the caller did not tell us the old mode, then there is not
702 much to do with respect to canonicalization. We have to
703 assume that all the bits are significant. */
704 if (GET_MODE_CLASS (oldmode) != MODE_INT)
705 oldmode = MAX_MODE_INT;
706 wide_int w = wide_int::from (rtx_mode_t (x, oldmode),
707 GET_MODE_PRECISION (int_mode),
708 unsignedp ? UNSIGNED : SIGNED);
709 return immed_wide_int_const (w, int_mode);
710 }
711
712 /* We can do this with a gen_lowpart if both desired and current modes
713 are integer, and this is either a constant integer, a register, or a
714 non-volatile MEM. */
715 scalar_int_mode int_oldmode;
716 if (is_int_mode (mode, &int_mode)
717 && is_int_mode (oldmode, &int_oldmode)
718 && GET_MODE_PRECISION (int_mode) <= GET_MODE_PRECISION (int_oldmode)
719 && ((MEM_P (x) && !MEM_VOLATILE_P (x) && direct_load[(int) int_mode])
720 || CONST_POLY_INT_P (x)
721 || (REG_P (x)
722 && (!HARD_REGISTER_P (x)
723 || targetm.hard_regno_mode_ok (REGNO (x), int_mode))
724 && TRULY_NOOP_TRUNCATION_MODES_P (int_mode, GET_MODE (x)))))
725 return gen_lowpart (int_mode, x);
726
727 /* Converting from integer constant into mode is always equivalent to an
728 subreg operation. */
729 if (VECTOR_MODE_P (mode) && GET_MODE (x) == VOIDmode)
730 {
731 gcc_assert (known_eq (GET_MODE_BITSIZE (mode),
732 GET_MODE_BITSIZE (oldmode)));
733 return simplify_gen_subreg (mode, x, oldmode, 0);
734 }
735
736 temp = gen_reg_rtx (mode);
737 convert_move (temp, x, unsignedp);
738 return temp;
739 }
740 \f
741 /* Return the largest alignment we can use for doing a move (or store)
742 of MAX_PIECES. ALIGN is the largest alignment we could use. */
743
744 static unsigned int
745 alignment_for_piecewise_move (unsigned int max_pieces, unsigned int align)
746 {
747 scalar_int_mode tmode
748 = int_mode_for_size (max_pieces * BITS_PER_UNIT, 1).require ();
749
750 if (align >= GET_MODE_ALIGNMENT (tmode))
751 align = GET_MODE_ALIGNMENT (tmode);
752 else
753 {
754 scalar_int_mode xmode = NARROWEST_INT_MODE;
755 opt_scalar_int_mode mode_iter;
756 FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_INT)
757 {
758 tmode = mode_iter.require ();
759 if (GET_MODE_SIZE (tmode) > max_pieces
760 || targetm.slow_unaligned_access (tmode, align))
761 break;
762 xmode = tmode;
763 }
764
765 align = MAX (align, GET_MODE_ALIGNMENT (xmode));
766 }
767
768 return align;
769 }
770
771 /* Return the widest integer mode that is narrower than SIZE bytes. */
772
773 static scalar_int_mode
774 widest_int_mode_for_size (unsigned int size)
775 {
776 scalar_int_mode result = NARROWEST_INT_MODE;
777
778 gcc_checking_assert (size > 1);
779
780 opt_scalar_int_mode tmode;
781 FOR_EACH_MODE_IN_CLASS (tmode, MODE_INT)
782 if (GET_MODE_SIZE (tmode.require ()) < size)
783 result = tmode.require ();
784
785 return result;
786 }
787
788 /* Determine whether an operation OP on LEN bytes with alignment ALIGN can
789 and should be performed piecewise. */
790
791 static bool
792 can_do_by_pieces (unsigned HOST_WIDE_INT len, unsigned int align,
793 enum by_pieces_operation op)
794 {
795 return targetm.use_by_pieces_infrastructure_p (len, align, op,
796 optimize_insn_for_speed_p ());
797 }
798
799 /* Determine whether the LEN bytes can be moved by using several move
800 instructions. Return nonzero if a call to move_by_pieces should
801 succeed. */
802
803 bool
804 can_move_by_pieces (unsigned HOST_WIDE_INT len, unsigned int align)
805 {
806 return can_do_by_pieces (len, align, MOVE_BY_PIECES);
807 }
808
809 /* Return number of insns required to perform operation OP by pieces
810 for L bytes. ALIGN (in bits) is maximum alignment we can assume. */
811
812 unsigned HOST_WIDE_INT
813 by_pieces_ninsns (unsigned HOST_WIDE_INT l, unsigned int align,
814 unsigned int max_size, by_pieces_operation op)
815 {
816 unsigned HOST_WIDE_INT n_insns = 0;
817
818 align = alignment_for_piecewise_move (MOVE_MAX_PIECES, align);
819
820 while (max_size > 1 && l > 0)
821 {
822 scalar_int_mode mode = widest_int_mode_for_size (max_size);
823 enum insn_code icode;
824
825 unsigned int modesize = GET_MODE_SIZE (mode);
826
827 icode = optab_handler (mov_optab, mode);
828 if (icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode))
829 {
830 unsigned HOST_WIDE_INT n_pieces = l / modesize;
831 l %= modesize;
832 switch (op)
833 {
834 default:
835 n_insns += n_pieces;
836 break;
837
838 case COMPARE_BY_PIECES:
839 int batch = targetm.compare_by_pieces_branch_ratio (mode);
840 int batch_ops = 4 * batch - 1;
841 unsigned HOST_WIDE_INT full = n_pieces / batch;
842 n_insns += full * batch_ops;
843 if (n_pieces % batch != 0)
844 n_insns++;
845 break;
846
847 }
848 }
849 max_size = modesize;
850 }
851
852 gcc_assert (!l);
853 return n_insns;
854 }
855
856 /* Used when performing piecewise block operations, holds information
857 about one of the memory objects involved. The member functions
858 can be used to generate code for loading from the object and
859 updating the address when iterating. */
860
861 class pieces_addr
862 {
863 /* The object being referenced, a MEM. Can be NULL_RTX to indicate
864 stack pushes. */
865 rtx m_obj;
866 /* The address of the object. Can differ from that seen in the
867 MEM rtx if we copied the address to a register. */
868 rtx m_addr;
869 /* Nonzero if the address on the object has an autoincrement already,
870 signifies whether that was an increment or decrement. */
871 signed char m_addr_inc;
872 /* Nonzero if we intend to use autoinc without the address already
873 having autoinc form. We will insert add insns around each memory
874 reference, expecting later passes to form autoinc addressing modes.
875 The only supported options are predecrement and postincrement. */
876 signed char m_explicit_inc;
877 /* True if we have either of the two possible cases of using
878 autoincrement. */
879 bool m_auto;
880 /* True if this is an address to be used for load operations rather
881 than stores. */
882 bool m_is_load;
883
884 /* Optionally, a function to obtain constants for any given offset into
885 the objects, and data associated with it. */
886 by_pieces_constfn m_constfn;
887 void *m_cfndata;
888 public:
889 pieces_addr (rtx, bool, by_pieces_constfn, void *);
890 rtx adjust (scalar_int_mode, HOST_WIDE_INT);
891 void increment_address (HOST_WIDE_INT);
892 void maybe_predec (HOST_WIDE_INT);
893 void maybe_postinc (HOST_WIDE_INT);
894 void decide_autoinc (machine_mode, bool, HOST_WIDE_INT);
895 int get_addr_inc ()
896 {
897 return m_addr_inc;
898 }
899 };
900
901 /* Initialize a pieces_addr structure from an object OBJ. IS_LOAD is
902 true if the operation to be performed on this object is a load
903 rather than a store. For stores, OBJ can be NULL, in which case we
904 assume the operation is a stack push. For loads, the optional
905 CONSTFN and its associated CFNDATA can be used in place of the
906 memory load. */
907
908 pieces_addr::pieces_addr (rtx obj, bool is_load, by_pieces_constfn constfn,
909 void *cfndata)
910 : m_obj (obj), m_is_load (is_load), m_constfn (constfn), m_cfndata (cfndata)
911 {
912 m_addr_inc = 0;
913 m_auto = false;
914 if (obj)
915 {
916 rtx addr = XEXP (obj, 0);
917 rtx_code code = GET_CODE (addr);
918 m_addr = addr;
919 bool dec = code == PRE_DEC || code == POST_DEC;
920 bool inc = code == PRE_INC || code == POST_INC;
921 m_auto = inc || dec;
922 if (m_auto)
923 m_addr_inc = dec ? -1 : 1;
924
925 /* While we have always looked for these codes here, the code
926 implementing the memory operation has never handled them.
927 Support could be added later if necessary or beneficial. */
928 gcc_assert (code != PRE_INC && code != POST_DEC);
929 }
930 else
931 {
932 m_addr = NULL_RTX;
933 if (!is_load)
934 {
935 m_auto = true;
936 if (STACK_GROWS_DOWNWARD)
937 m_addr_inc = -1;
938 else
939 m_addr_inc = 1;
940 }
941 else
942 gcc_assert (constfn != NULL);
943 }
944 m_explicit_inc = 0;
945 if (constfn)
946 gcc_assert (is_load);
947 }
948
949 /* Decide whether to use autoinc for an address involved in a memory op.
950 MODE is the mode of the accesses, REVERSE is true if we've decided to
951 perform the operation starting from the end, and LEN is the length of
952 the operation. Don't override an earlier decision to set m_auto. */
953
954 void
955 pieces_addr::decide_autoinc (machine_mode ARG_UNUSED (mode), bool reverse,
956 HOST_WIDE_INT len)
957 {
958 if (m_auto || m_obj == NULL_RTX)
959 return;
960
961 bool use_predec = (m_is_load
962 ? USE_LOAD_PRE_DECREMENT (mode)
963 : USE_STORE_PRE_DECREMENT (mode));
964 bool use_postinc = (m_is_load
965 ? USE_LOAD_POST_INCREMENT (mode)
966 : USE_STORE_POST_INCREMENT (mode));
967 machine_mode addr_mode = get_address_mode (m_obj);
968
969 if (use_predec && reverse)
970 {
971 m_addr = copy_to_mode_reg (addr_mode,
972 plus_constant (addr_mode,
973 m_addr, len));
974 m_auto = true;
975 m_explicit_inc = -1;
976 }
977 else if (use_postinc && !reverse)
978 {
979 m_addr = copy_to_mode_reg (addr_mode, m_addr);
980 m_auto = true;
981 m_explicit_inc = 1;
982 }
983 else if (CONSTANT_P (m_addr))
984 m_addr = copy_to_mode_reg (addr_mode, m_addr);
985 }
986
987 /* Adjust the address to refer to the data at OFFSET in MODE. If we
988 are using autoincrement for this address, we don't add the offset,
989 but we still modify the MEM's properties. */
990
991 rtx
992 pieces_addr::adjust (scalar_int_mode mode, HOST_WIDE_INT offset)
993 {
994 if (m_constfn)
995 return m_constfn (m_cfndata, offset, mode);
996 if (m_obj == NULL_RTX)
997 return NULL_RTX;
998 if (m_auto)
999 return adjust_automodify_address (m_obj, mode, m_addr, offset);
1000 else
1001 return adjust_address (m_obj, mode, offset);
1002 }
1003
1004 /* Emit an add instruction to increment the address by SIZE. */
1005
1006 void
1007 pieces_addr::increment_address (HOST_WIDE_INT size)
1008 {
1009 rtx amount = gen_int_mode (size, GET_MODE (m_addr));
1010 emit_insn (gen_add2_insn (m_addr, amount));
1011 }
1012
1013 /* If we are supposed to decrement the address after each access, emit code
1014 to do so now. Increment by SIZE (which has should have the correct sign
1015 already). */
1016
1017 void
1018 pieces_addr::maybe_predec (HOST_WIDE_INT size)
1019 {
1020 if (m_explicit_inc >= 0)
1021 return;
1022 gcc_assert (HAVE_PRE_DECREMENT);
1023 increment_address (size);
1024 }
1025
1026 /* If we are supposed to decrement the address after each access, emit code
1027 to do so now. Increment by SIZE. */
1028
1029 void
1030 pieces_addr::maybe_postinc (HOST_WIDE_INT size)
1031 {
1032 if (m_explicit_inc <= 0)
1033 return;
1034 gcc_assert (HAVE_POST_INCREMENT);
1035 increment_address (size);
1036 }
1037
1038 /* This structure is used by do_op_by_pieces to describe the operation
1039 to be performed. */
1040
1041 class op_by_pieces_d
1042 {
1043 protected:
1044 pieces_addr m_to, m_from;
1045 unsigned HOST_WIDE_INT m_len;
1046 HOST_WIDE_INT m_offset;
1047 unsigned int m_align;
1048 unsigned int m_max_size;
1049 bool m_reverse;
1050
1051 /* Virtual functions, overriden by derived classes for the specific
1052 operation. */
1053 virtual void generate (rtx, rtx, machine_mode) = 0;
1054 virtual bool prepare_mode (machine_mode, unsigned int) = 0;
1055 virtual void finish_mode (machine_mode)
1056 {
1057 }
1058
1059 public:
1060 op_by_pieces_d (rtx, bool, rtx, bool, by_pieces_constfn, void *,
1061 unsigned HOST_WIDE_INT, unsigned int);
1062 void run ();
1063 };
1064
1065 /* The constructor for an op_by_pieces_d structure. We require two
1066 objects named TO and FROM, which are identified as loads or stores
1067 by TO_LOAD and FROM_LOAD. If FROM is a load, the optional FROM_CFN
1068 and its associated FROM_CFN_DATA can be used to replace loads with
1069 constant values. LEN describes the length of the operation. */
1070
1071 op_by_pieces_d::op_by_pieces_d (rtx to, bool to_load,
1072 rtx from, bool from_load,
1073 by_pieces_constfn from_cfn,
1074 void *from_cfn_data,
1075 unsigned HOST_WIDE_INT len,
1076 unsigned int align)
1077 : m_to (to, to_load, NULL, NULL),
1078 m_from (from, from_load, from_cfn, from_cfn_data),
1079 m_len (len), m_max_size (MOVE_MAX_PIECES + 1)
1080 {
1081 int toi = m_to.get_addr_inc ();
1082 int fromi = m_from.get_addr_inc ();
1083 if (toi >= 0 && fromi >= 0)
1084 m_reverse = false;
1085 else if (toi <= 0 && fromi <= 0)
1086 m_reverse = true;
1087 else
1088 gcc_unreachable ();
1089
1090 m_offset = m_reverse ? len : 0;
1091 align = MIN (to ? MEM_ALIGN (to) : align,
1092 from ? MEM_ALIGN (from) : align);
1093
1094 /* If copying requires more than two move insns,
1095 copy addresses to registers (to make displacements shorter)
1096 and use post-increment if available. */
1097 if (by_pieces_ninsns (len, align, m_max_size, MOVE_BY_PIECES) > 2)
1098 {
1099 /* Find the mode of the largest comparison. */
1100 scalar_int_mode mode = widest_int_mode_for_size (m_max_size);
1101
1102 m_from.decide_autoinc (mode, m_reverse, len);
1103 m_to.decide_autoinc (mode, m_reverse, len);
1104 }
1105
1106 align = alignment_for_piecewise_move (MOVE_MAX_PIECES, align);
1107 m_align = align;
1108 }
1109
1110 /* This function contains the main loop used for expanding a block
1111 operation. First move what we can in the largest integer mode,
1112 then go to successively smaller modes. For every access, call
1113 GENFUN with the two operands and the EXTRA_DATA. */
1114
1115 void
1116 op_by_pieces_d::run ()
1117 {
1118 while (m_max_size > 1 && m_len > 0)
1119 {
1120 scalar_int_mode mode = widest_int_mode_for_size (m_max_size);
1121
1122 if (prepare_mode (mode, m_align))
1123 {
1124 unsigned int size = GET_MODE_SIZE (mode);
1125 rtx to1 = NULL_RTX, from1;
1126
1127 while (m_len >= size)
1128 {
1129 if (m_reverse)
1130 m_offset -= size;
1131
1132 to1 = m_to.adjust (mode, m_offset);
1133 from1 = m_from.adjust (mode, m_offset);
1134
1135 m_to.maybe_predec (-(HOST_WIDE_INT)size);
1136 m_from.maybe_predec (-(HOST_WIDE_INT)size);
1137
1138 generate (to1, from1, mode);
1139
1140 m_to.maybe_postinc (size);
1141 m_from.maybe_postinc (size);
1142
1143 if (!m_reverse)
1144 m_offset += size;
1145
1146 m_len -= size;
1147 }
1148
1149 finish_mode (mode);
1150 }
1151
1152 m_max_size = GET_MODE_SIZE (mode);
1153 }
1154
1155 /* The code above should have handled everything. */
1156 gcc_assert (!m_len);
1157 }
1158
1159 /* Derived class from op_by_pieces_d, providing support for block move
1160 operations. */
1161
1162 class move_by_pieces_d : public op_by_pieces_d
1163 {
1164 insn_gen_fn m_gen_fun;
1165 void generate (rtx, rtx, machine_mode);
1166 bool prepare_mode (machine_mode, unsigned int);
1167
1168 public:
1169 move_by_pieces_d (rtx to, rtx from, unsigned HOST_WIDE_INT len,
1170 unsigned int align)
1171 : op_by_pieces_d (to, false, from, true, NULL, NULL, len, align)
1172 {
1173 }
1174 rtx finish_retmode (memop_ret);
1175 };
1176
1177 /* Return true if MODE can be used for a set of copies, given an
1178 alignment ALIGN. Prepare whatever data is necessary for later
1179 calls to generate. */
1180
1181 bool
1182 move_by_pieces_d::prepare_mode (machine_mode mode, unsigned int align)
1183 {
1184 insn_code icode = optab_handler (mov_optab, mode);
1185 m_gen_fun = GEN_FCN (icode);
1186 return icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode);
1187 }
1188
1189 /* A callback used when iterating for a compare_by_pieces_operation.
1190 OP0 and OP1 are the values that have been loaded and should be
1191 compared in MODE. If OP0 is NULL, this means we should generate a
1192 push; otherwise EXTRA_DATA holds a pointer to a pointer to the insn
1193 gen function that should be used to generate the mode. */
1194
1195 void
1196 move_by_pieces_d::generate (rtx op0, rtx op1,
1197 machine_mode mode ATTRIBUTE_UNUSED)
1198 {
1199 #ifdef PUSH_ROUNDING
1200 if (op0 == NULL_RTX)
1201 {
1202 emit_single_push_insn (mode, op1, NULL);
1203 return;
1204 }
1205 #endif
1206 emit_insn (m_gen_fun (op0, op1));
1207 }
1208
1209 /* Perform the final adjustment at the end of a string to obtain the
1210 correct return value for the block operation.
1211 Return value is based on RETMODE argument. */
1212
1213 rtx
1214 move_by_pieces_d::finish_retmode (memop_ret retmode)
1215 {
1216 gcc_assert (!m_reverse);
1217 if (retmode == RETURN_END_MINUS_ONE)
1218 {
1219 m_to.maybe_postinc (-1);
1220 --m_offset;
1221 }
1222 return m_to.adjust (QImode, m_offset);
1223 }
1224
1225 /* Generate several move instructions to copy LEN bytes from block FROM to
1226 block TO. (These are MEM rtx's with BLKmode).
1227
1228 If PUSH_ROUNDING is defined and TO is NULL, emit_single_push_insn is
1229 used to push FROM to the stack.
1230
1231 ALIGN is maximum stack alignment we can assume.
1232
1233 Return value is based on RETMODE argument. */
1234
1235 rtx
1236 move_by_pieces (rtx to, rtx from, unsigned HOST_WIDE_INT len,
1237 unsigned int align, memop_ret retmode)
1238 {
1239 #ifndef PUSH_ROUNDING
1240 if (to == NULL)
1241 gcc_unreachable ();
1242 #endif
1243
1244 move_by_pieces_d data (to, from, len, align);
1245
1246 data.run ();
1247
1248 if (retmode != RETURN_BEGIN)
1249 return data.finish_retmode (retmode);
1250 else
1251 return to;
1252 }
1253
1254 /* Derived class from op_by_pieces_d, providing support for block move
1255 operations. */
1256
1257 class store_by_pieces_d : public op_by_pieces_d
1258 {
1259 insn_gen_fn m_gen_fun;
1260 void generate (rtx, rtx, machine_mode);
1261 bool prepare_mode (machine_mode, unsigned int);
1262
1263 public:
1264 store_by_pieces_d (rtx to, by_pieces_constfn cfn, void *cfn_data,
1265 unsigned HOST_WIDE_INT len, unsigned int align)
1266 : op_by_pieces_d (to, false, NULL_RTX, true, cfn, cfn_data, len, align)
1267 {
1268 }
1269 rtx finish_retmode (memop_ret);
1270 };
1271
1272 /* Return true if MODE can be used for a set of stores, given an
1273 alignment ALIGN. Prepare whatever data is necessary for later
1274 calls to generate. */
1275
1276 bool
1277 store_by_pieces_d::prepare_mode (machine_mode mode, unsigned int align)
1278 {
1279 insn_code icode = optab_handler (mov_optab, mode);
1280 m_gen_fun = GEN_FCN (icode);
1281 return icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode);
1282 }
1283
1284 /* A callback used when iterating for a store_by_pieces_operation.
1285 OP0 and OP1 are the values that have been loaded and should be
1286 compared in MODE. If OP0 is NULL, this means we should generate a
1287 push; otherwise EXTRA_DATA holds a pointer to a pointer to the insn
1288 gen function that should be used to generate the mode. */
1289
1290 void
1291 store_by_pieces_d::generate (rtx op0, rtx op1, machine_mode)
1292 {
1293 emit_insn (m_gen_fun (op0, op1));
1294 }
1295
1296 /* Perform the final adjustment at the end of a string to obtain the
1297 correct return value for the block operation.
1298 Return value is based on RETMODE argument. */
1299
1300 rtx
1301 store_by_pieces_d::finish_retmode (memop_ret retmode)
1302 {
1303 gcc_assert (!m_reverse);
1304 if (retmode == RETURN_END_MINUS_ONE)
1305 {
1306 m_to.maybe_postinc (-1);
1307 --m_offset;
1308 }
1309 return m_to.adjust (QImode, m_offset);
1310 }
1311
1312 /* Determine whether the LEN bytes generated by CONSTFUN can be
1313 stored to memory using several move instructions. CONSTFUNDATA is
1314 a pointer which will be passed as argument in every CONSTFUN call.
1315 ALIGN is maximum alignment we can assume. MEMSETP is true if this is
1316 a memset operation and false if it's a copy of a constant string.
1317 Return nonzero if a call to store_by_pieces should succeed. */
1318
1319 int
1320 can_store_by_pieces (unsigned HOST_WIDE_INT len,
1321 rtx (*constfun) (void *, HOST_WIDE_INT, scalar_int_mode),
1322 void *constfundata, unsigned int align, bool memsetp)
1323 {
1324 unsigned HOST_WIDE_INT l;
1325 unsigned int max_size;
1326 HOST_WIDE_INT offset = 0;
1327 enum insn_code icode;
1328 int reverse;
1329 /* cst is set but not used if LEGITIMATE_CONSTANT doesn't use it. */
1330 rtx cst ATTRIBUTE_UNUSED;
1331
1332 if (len == 0)
1333 return 1;
1334
1335 if (!targetm.use_by_pieces_infrastructure_p (len, align,
1336 memsetp
1337 ? SET_BY_PIECES
1338 : STORE_BY_PIECES,
1339 optimize_insn_for_speed_p ()))
1340 return 0;
1341
1342 align = alignment_for_piecewise_move (STORE_MAX_PIECES, align);
1343
1344 /* We would first store what we can in the largest integer mode, then go to
1345 successively smaller modes. */
1346
1347 for (reverse = 0;
1348 reverse <= (HAVE_PRE_DECREMENT || HAVE_POST_DECREMENT);
1349 reverse++)
1350 {
1351 l = len;
1352 max_size = STORE_MAX_PIECES + 1;
1353 while (max_size > 1 && l > 0)
1354 {
1355 scalar_int_mode mode = widest_int_mode_for_size (max_size);
1356
1357 icode = optab_handler (mov_optab, mode);
1358 if (icode != CODE_FOR_nothing
1359 && align >= GET_MODE_ALIGNMENT (mode))
1360 {
1361 unsigned int size = GET_MODE_SIZE (mode);
1362
1363 while (l >= size)
1364 {
1365 if (reverse)
1366 offset -= size;
1367
1368 cst = (*constfun) (constfundata, offset, mode);
1369 if (!targetm.legitimate_constant_p (mode, cst))
1370 return 0;
1371
1372 if (!reverse)
1373 offset += size;
1374
1375 l -= size;
1376 }
1377 }
1378
1379 max_size = GET_MODE_SIZE (mode);
1380 }
1381
1382 /* The code above should have handled everything. */
1383 gcc_assert (!l);
1384 }
1385
1386 return 1;
1387 }
1388
1389 /* Generate several move instructions to store LEN bytes generated by
1390 CONSTFUN to block TO. (A MEM rtx with BLKmode). CONSTFUNDATA is a
1391 pointer which will be passed as argument in every CONSTFUN call.
1392 ALIGN is maximum alignment we can assume. MEMSETP is true if this is
1393 a memset operation and false if it's a copy of a constant string.
1394 Return value is based on RETMODE argument. */
1395
1396 rtx
1397 store_by_pieces (rtx to, unsigned HOST_WIDE_INT len,
1398 rtx (*constfun) (void *, HOST_WIDE_INT, scalar_int_mode),
1399 void *constfundata, unsigned int align, bool memsetp,
1400 memop_ret retmode)
1401 {
1402 if (len == 0)
1403 {
1404 gcc_assert (retmode != RETURN_END_MINUS_ONE);
1405 return to;
1406 }
1407
1408 gcc_assert (targetm.use_by_pieces_infrastructure_p
1409 (len, align,
1410 memsetp ? SET_BY_PIECES : STORE_BY_PIECES,
1411 optimize_insn_for_speed_p ()));
1412
1413 store_by_pieces_d data (to, constfun, constfundata, len, align);
1414 data.run ();
1415
1416 if (retmode != RETURN_BEGIN)
1417 return data.finish_retmode (retmode);
1418 else
1419 return to;
1420 }
1421
1422 /* Callback routine for clear_by_pieces.
1423 Return const0_rtx unconditionally. */
1424
1425 static rtx
1426 clear_by_pieces_1 (void *, HOST_WIDE_INT, scalar_int_mode)
1427 {
1428 return const0_rtx;
1429 }
1430
1431 /* Generate several move instructions to clear LEN bytes of block TO. (A MEM
1432 rtx with BLKmode). ALIGN is maximum alignment we can assume. */
1433
1434 static void
1435 clear_by_pieces (rtx to, unsigned HOST_WIDE_INT len, unsigned int align)
1436 {
1437 if (len == 0)
1438 return;
1439
1440 store_by_pieces_d data (to, clear_by_pieces_1, NULL, len, align);
1441 data.run ();
1442 }
1443
1444 /* Context used by compare_by_pieces_genfn. It stores the fail label
1445 to jump to in case of miscomparison, and for branch ratios greater than 1,
1446 it stores an accumulator and the current and maximum counts before
1447 emitting another branch. */
1448
1449 class compare_by_pieces_d : public op_by_pieces_d
1450 {
1451 rtx_code_label *m_fail_label;
1452 rtx m_accumulator;
1453 int m_count, m_batch;
1454
1455 void generate (rtx, rtx, machine_mode);
1456 bool prepare_mode (machine_mode, unsigned int);
1457 void finish_mode (machine_mode);
1458 public:
1459 compare_by_pieces_d (rtx op0, rtx op1, by_pieces_constfn op1_cfn,
1460 void *op1_cfn_data, HOST_WIDE_INT len, int align,
1461 rtx_code_label *fail_label)
1462 : op_by_pieces_d (op0, true, op1, true, op1_cfn, op1_cfn_data, len, align)
1463 {
1464 m_fail_label = fail_label;
1465 }
1466 };
1467
1468 /* A callback used when iterating for a compare_by_pieces_operation.
1469 OP0 and OP1 are the values that have been loaded and should be
1470 compared in MODE. DATA holds a pointer to the compare_by_pieces_data
1471 context structure. */
1472
1473 void
1474 compare_by_pieces_d::generate (rtx op0, rtx op1, machine_mode mode)
1475 {
1476 if (m_batch > 1)
1477 {
1478 rtx temp = expand_binop (mode, sub_optab, op0, op1, NULL_RTX,
1479 true, OPTAB_LIB_WIDEN);
1480 if (m_count != 0)
1481 temp = expand_binop (mode, ior_optab, m_accumulator, temp, temp,
1482 true, OPTAB_LIB_WIDEN);
1483 m_accumulator = temp;
1484
1485 if (++m_count < m_batch)
1486 return;
1487
1488 m_count = 0;
1489 op0 = m_accumulator;
1490 op1 = const0_rtx;
1491 m_accumulator = NULL_RTX;
1492 }
1493 do_compare_rtx_and_jump (op0, op1, NE, true, mode, NULL_RTX, NULL,
1494 m_fail_label, profile_probability::uninitialized ());
1495 }
1496
1497 /* Return true if MODE can be used for a set of moves and comparisons,
1498 given an alignment ALIGN. Prepare whatever data is necessary for
1499 later calls to generate. */
1500
1501 bool
1502 compare_by_pieces_d::prepare_mode (machine_mode mode, unsigned int align)
1503 {
1504 insn_code icode = optab_handler (mov_optab, mode);
1505 if (icode == CODE_FOR_nothing
1506 || align < GET_MODE_ALIGNMENT (mode)
1507 || !can_compare_p (EQ, mode, ccp_jump))
1508 return false;
1509 m_batch = targetm.compare_by_pieces_branch_ratio (mode);
1510 if (m_batch < 0)
1511 return false;
1512 m_accumulator = NULL_RTX;
1513 m_count = 0;
1514 return true;
1515 }
1516
1517 /* Called after expanding a series of comparisons in MODE. If we have
1518 accumulated results for which we haven't emitted a branch yet, do
1519 so now. */
1520
1521 void
1522 compare_by_pieces_d::finish_mode (machine_mode mode)
1523 {
1524 if (m_accumulator != NULL_RTX)
1525 do_compare_rtx_and_jump (m_accumulator, const0_rtx, NE, true, mode,
1526 NULL_RTX, NULL, m_fail_label,
1527 profile_probability::uninitialized ());
1528 }
1529
1530 /* Generate several move instructions to compare LEN bytes from blocks
1531 ARG0 and ARG1. (These are MEM rtx's with BLKmode).
1532
1533 If PUSH_ROUNDING is defined and TO is NULL, emit_single_push_insn is
1534 used to push FROM to the stack.
1535
1536 ALIGN is maximum stack alignment we can assume.
1537
1538 Optionally, the caller can pass a constfn and associated data in A1_CFN
1539 and A1_CFN_DATA. describing that the second operand being compared is a
1540 known constant and how to obtain its data. */
1541
1542 static rtx
1543 compare_by_pieces (rtx arg0, rtx arg1, unsigned HOST_WIDE_INT len,
1544 rtx target, unsigned int align,
1545 by_pieces_constfn a1_cfn, void *a1_cfn_data)
1546 {
1547 rtx_code_label *fail_label = gen_label_rtx ();
1548 rtx_code_label *end_label = gen_label_rtx ();
1549
1550 if (target == NULL_RTX
1551 || !REG_P (target) || REGNO (target) < FIRST_PSEUDO_REGISTER)
1552 target = gen_reg_rtx (TYPE_MODE (integer_type_node));
1553
1554 compare_by_pieces_d data (arg0, arg1, a1_cfn, a1_cfn_data, len, align,
1555 fail_label);
1556
1557 data.run ();
1558
1559 emit_move_insn (target, const0_rtx);
1560 emit_jump (end_label);
1561 emit_barrier ();
1562 emit_label (fail_label);
1563 emit_move_insn (target, const1_rtx);
1564 emit_label (end_label);
1565
1566 return target;
1567 }
1568 \f
1569 /* Emit code to move a block Y to a block X. This may be done with
1570 string-move instructions, with multiple scalar move instructions,
1571 or with a library call.
1572
1573 Both X and Y must be MEM rtx's (perhaps inside VOLATILE) with mode BLKmode.
1574 SIZE is an rtx that says how long they are.
1575 ALIGN is the maximum alignment we can assume they have.
1576 METHOD describes what kind of copy this is, and what mechanisms may be used.
1577 MIN_SIZE is the minimal size of block to move
1578 MAX_SIZE is the maximal size of block to move, if it cannot be represented
1579 in unsigned HOST_WIDE_INT, than it is mask of all ones.
1580
1581 Return the address of the new block, if memcpy is called and returns it,
1582 0 otherwise. */
1583
1584 rtx
1585 emit_block_move_hints (rtx x, rtx y, rtx size, enum block_op_methods method,
1586 unsigned int expected_align, HOST_WIDE_INT expected_size,
1587 unsigned HOST_WIDE_INT min_size,
1588 unsigned HOST_WIDE_INT max_size,
1589 unsigned HOST_WIDE_INT probable_max_size,
1590 bool bail_out_libcall, bool *is_move_done,
1591 bool might_overlap)
1592 {
1593 int may_use_call;
1594 rtx retval = 0;
1595 unsigned int align;
1596
1597 if (is_move_done)
1598 *is_move_done = true;
1599
1600 gcc_assert (size);
1601 if (CONST_INT_P (size) && INTVAL (size) == 0)
1602 return 0;
1603
1604 switch (method)
1605 {
1606 case BLOCK_OP_NORMAL:
1607 case BLOCK_OP_TAILCALL:
1608 may_use_call = 1;
1609 break;
1610
1611 case BLOCK_OP_CALL_PARM:
1612 may_use_call = block_move_libcall_safe_for_call_parm ();
1613
1614 /* Make inhibit_defer_pop nonzero around the library call
1615 to force it to pop the arguments right away. */
1616 NO_DEFER_POP;
1617 break;
1618
1619 case BLOCK_OP_NO_LIBCALL:
1620 may_use_call = 0;
1621 break;
1622
1623 case BLOCK_OP_NO_LIBCALL_RET:
1624 may_use_call = -1;
1625 break;
1626
1627 default:
1628 gcc_unreachable ();
1629 }
1630
1631 gcc_assert (MEM_P (x) && MEM_P (y));
1632 align = MIN (MEM_ALIGN (x), MEM_ALIGN (y));
1633 gcc_assert (align >= BITS_PER_UNIT);
1634
1635 /* Make sure we've got BLKmode addresses; store_one_arg can decide that
1636 block copy is more efficient for other large modes, e.g. DCmode. */
1637 x = adjust_address (x, BLKmode, 0);
1638 y = adjust_address (y, BLKmode, 0);
1639
1640 /* Set MEM_SIZE as appropriate for this block copy. The main place this
1641 can be incorrect is coming from __builtin_memcpy. */
1642 poly_int64 const_size;
1643 if (poly_int_rtx_p (size, &const_size))
1644 {
1645 x = shallow_copy_rtx (x);
1646 y = shallow_copy_rtx (y);
1647 set_mem_size (x, const_size);
1648 set_mem_size (y, const_size);
1649 }
1650
1651 bool pieces_ok = CONST_INT_P (size)
1652 && can_move_by_pieces (INTVAL (size), align);
1653 bool pattern_ok = false;
1654
1655 if (!pieces_ok || might_overlap)
1656 {
1657 pattern_ok
1658 = emit_block_move_via_pattern (x, y, size, align,
1659 expected_align, expected_size,
1660 min_size, max_size, probable_max_size,
1661 might_overlap);
1662 if (!pattern_ok && might_overlap)
1663 {
1664 /* Do not try any of the other methods below as they are not safe
1665 for overlapping moves. */
1666 *is_move_done = false;
1667 return retval;
1668 }
1669 }
1670
1671 if (pattern_ok)
1672 ;
1673 else if (pieces_ok)
1674 move_by_pieces (x, y, INTVAL (size), align, RETURN_BEGIN);
1675 else if (may_use_call && !might_overlap
1676 && ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (x))
1677 && ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (y)))
1678 {
1679 if (bail_out_libcall)
1680 {
1681 if (is_move_done)
1682 *is_move_done = false;
1683 return retval;
1684 }
1685
1686 if (may_use_call < 0)
1687 return pc_rtx;
1688
1689 retval = emit_block_copy_via_libcall (x, y, size,
1690 method == BLOCK_OP_TAILCALL);
1691 }
1692 else if (might_overlap)
1693 *is_move_done = false;
1694 else
1695 emit_block_move_via_loop (x, y, size, align);
1696
1697 if (method == BLOCK_OP_CALL_PARM)
1698 OK_DEFER_POP;
1699
1700 return retval;
1701 }
1702
1703 rtx
1704 emit_block_move (rtx x, rtx y, rtx size, enum block_op_methods method)
1705 {
1706 unsigned HOST_WIDE_INT max, min = 0;
1707 if (GET_CODE (size) == CONST_INT)
1708 min = max = UINTVAL (size);
1709 else
1710 max = GET_MODE_MASK (GET_MODE (size));
1711 return emit_block_move_hints (x, y, size, method, 0, -1,
1712 min, max, max);
1713 }
1714
1715 /* A subroutine of emit_block_move. Returns true if calling the
1716 block move libcall will not clobber any parameters which may have
1717 already been placed on the stack. */
1718
1719 static bool
1720 block_move_libcall_safe_for_call_parm (void)
1721 {
1722 tree fn;
1723
1724 /* If arguments are pushed on the stack, then they're safe. */
1725 if (PUSH_ARGS)
1726 return true;
1727
1728 /* If registers go on the stack anyway, any argument is sure to clobber
1729 an outgoing argument. */
1730 #if defined (REG_PARM_STACK_SPACE)
1731 fn = builtin_decl_implicit (BUILT_IN_MEMCPY);
1732 /* Avoid set but not used warning if *REG_PARM_STACK_SPACE doesn't
1733 depend on its argument. */
1734 (void) fn;
1735 if (OUTGOING_REG_PARM_STACK_SPACE ((!fn ? NULL_TREE : TREE_TYPE (fn)))
1736 && REG_PARM_STACK_SPACE (fn) != 0)
1737 return false;
1738 #endif
1739
1740 /* If any argument goes in memory, then it might clobber an outgoing
1741 argument. */
1742 {
1743 CUMULATIVE_ARGS args_so_far_v;
1744 cumulative_args_t args_so_far;
1745 tree arg;
1746
1747 fn = builtin_decl_implicit (BUILT_IN_MEMCPY);
1748 INIT_CUMULATIVE_ARGS (args_so_far_v, TREE_TYPE (fn), NULL_RTX, 0, 3);
1749 args_so_far = pack_cumulative_args (&args_so_far_v);
1750
1751 arg = TYPE_ARG_TYPES (TREE_TYPE (fn));
1752 for ( ; arg != void_list_node ; arg = TREE_CHAIN (arg))
1753 {
1754 machine_mode mode = TYPE_MODE (TREE_VALUE (arg));
1755 function_arg_info arg_info (mode, /*named=*/true);
1756 rtx tmp = targetm.calls.function_arg (args_so_far, arg_info);
1757 if (!tmp || !REG_P (tmp))
1758 return false;
1759 if (targetm.calls.arg_partial_bytes (args_so_far, arg_info))
1760 return false;
1761 targetm.calls.function_arg_advance (args_so_far, arg_info);
1762 }
1763 }
1764 return true;
1765 }
1766
1767 /* A subroutine of emit_block_move. Expand a cpymem or movmem pattern;
1768 return true if successful.
1769
1770 X is the destination of the copy or move.
1771 Y is the source of the copy or move.
1772 SIZE is the size of the block to be moved.
1773
1774 MIGHT_OVERLAP indicates this originated with expansion of a
1775 builtin_memmove() and the source and destination blocks may
1776 overlap.
1777 */
1778
1779 static bool
1780 emit_block_move_via_pattern (rtx x, rtx y, rtx size, unsigned int align,
1781 unsigned int expected_align,
1782 HOST_WIDE_INT expected_size,
1783 unsigned HOST_WIDE_INT min_size,
1784 unsigned HOST_WIDE_INT max_size,
1785 unsigned HOST_WIDE_INT probable_max_size,
1786 bool might_overlap)
1787 {
1788 if (expected_align < align)
1789 expected_align = align;
1790 if (expected_size != -1)
1791 {
1792 if ((unsigned HOST_WIDE_INT)expected_size > probable_max_size)
1793 expected_size = probable_max_size;
1794 if ((unsigned HOST_WIDE_INT)expected_size < min_size)
1795 expected_size = min_size;
1796 }
1797
1798 /* Since this is a move insn, we don't care about volatility. */
1799 temporary_volatile_ok v (true);
1800
1801 /* Try the most limited insn first, because there's no point
1802 including more than one in the machine description unless
1803 the more limited one has some advantage. */
1804
1805 opt_scalar_int_mode mode_iter;
1806 FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_INT)
1807 {
1808 scalar_int_mode mode = mode_iter.require ();
1809 enum insn_code code;
1810 if (might_overlap)
1811 code = direct_optab_handler (movmem_optab, mode);
1812 else
1813 code = direct_optab_handler (cpymem_optab, mode);
1814
1815 if (code != CODE_FOR_nothing
1816 /* We don't need MODE to be narrower than BITS_PER_HOST_WIDE_INT
1817 here because if SIZE is less than the mode mask, as it is
1818 returned by the macro, it will definitely be less than the
1819 actual mode mask. Since SIZE is within the Pmode address
1820 space, we limit MODE to Pmode. */
1821 && ((CONST_INT_P (size)
1822 && ((unsigned HOST_WIDE_INT) INTVAL (size)
1823 <= (GET_MODE_MASK (mode) >> 1)))
1824 || max_size <= (GET_MODE_MASK (mode) >> 1)
1825 || GET_MODE_BITSIZE (mode) >= GET_MODE_BITSIZE (Pmode)))
1826 {
1827 class expand_operand ops[9];
1828 unsigned int nops;
1829
1830 /* ??? When called via emit_block_move_for_call, it'd be
1831 nice if there were some way to inform the backend, so
1832 that it doesn't fail the expansion because it thinks
1833 emitting the libcall would be more efficient. */
1834 nops = insn_data[(int) code].n_generator_args;
1835 gcc_assert (nops == 4 || nops == 6 || nops == 8 || nops == 9);
1836
1837 create_fixed_operand (&ops[0], x);
1838 create_fixed_operand (&ops[1], y);
1839 /* The check above guarantees that this size conversion is valid. */
1840 create_convert_operand_to (&ops[2], size, mode, true);
1841 create_integer_operand (&ops[3], align / BITS_PER_UNIT);
1842 if (nops >= 6)
1843 {
1844 create_integer_operand (&ops[4], expected_align / BITS_PER_UNIT);
1845 create_integer_operand (&ops[5], expected_size);
1846 }
1847 if (nops >= 8)
1848 {
1849 create_integer_operand (&ops[6], min_size);
1850 /* If we cannot represent the maximal size,
1851 make parameter NULL. */
1852 if ((HOST_WIDE_INT) max_size != -1)
1853 create_integer_operand (&ops[7], max_size);
1854 else
1855 create_fixed_operand (&ops[7], NULL);
1856 }
1857 if (nops == 9)
1858 {
1859 /* If we cannot represent the maximal size,
1860 make parameter NULL. */
1861 if ((HOST_WIDE_INT) probable_max_size != -1)
1862 create_integer_operand (&ops[8], probable_max_size);
1863 else
1864 create_fixed_operand (&ops[8], NULL);
1865 }
1866 if (maybe_expand_insn (code, nops, ops))
1867 return true;
1868 }
1869 }
1870
1871 return false;
1872 }
1873
1874 /* A subroutine of emit_block_move. Copy the data via an explicit
1875 loop. This is used only when libcalls are forbidden. */
1876 /* ??? It'd be nice to copy in hunks larger than QImode. */
1877
1878 static void
1879 emit_block_move_via_loop (rtx x, rtx y, rtx size,
1880 unsigned int align ATTRIBUTE_UNUSED)
1881 {
1882 rtx_code_label *cmp_label, *top_label;
1883 rtx iter, x_addr, y_addr, tmp;
1884 machine_mode x_addr_mode = get_address_mode (x);
1885 machine_mode y_addr_mode = get_address_mode (y);
1886 machine_mode iter_mode;
1887
1888 iter_mode = GET_MODE (size);
1889 if (iter_mode == VOIDmode)
1890 iter_mode = word_mode;
1891
1892 top_label = gen_label_rtx ();
1893 cmp_label = gen_label_rtx ();
1894 iter = gen_reg_rtx (iter_mode);
1895
1896 emit_move_insn (iter, const0_rtx);
1897
1898 x_addr = force_operand (XEXP (x, 0), NULL_RTX);
1899 y_addr = force_operand (XEXP (y, 0), NULL_RTX);
1900 do_pending_stack_adjust ();
1901
1902 emit_jump (cmp_label);
1903 emit_label (top_label);
1904
1905 tmp = convert_modes (x_addr_mode, iter_mode, iter, true);
1906 x_addr = simplify_gen_binary (PLUS, x_addr_mode, x_addr, tmp);
1907
1908 if (x_addr_mode != y_addr_mode)
1909 tmp = convert_modes (y_addr_mode, iter_mode, iter, true);
1910 y_addr = simplify_gen_binary (PLUS, y_addr_mode, y_addr, tmp);
1911
1912 x = change_address (x, QImode, x_addr);
1913 y = change_address (y, QImode, y_addr);
1914
1915 emit_move_insn (x, y);
1916
1917 tmp = expand_simple_binop (iter_mode, PLUS, iter, const1_rtx, iter,
1918 true, OPTAB_LIB_WIDEN);
1919 if (tmp != iter)
1920 emit_move_insn (iter, tmp);
1921
1922 emit_label (cmp_label);
1923
1924 emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode,
1925 true, top_label,
1926 profile_probability::guessed_always ()
1927 .apply_scale (9, 10));
1928 }
1929 \f
1930 /* Expand a call to memcpy or memmove or memcmp, and return the result.
1931 TAILCALL is true if this is a tail call. */
1932
1933 rtx
1934 emit_block_op_via_libcall (enum built_in_function fncode, rtx dst, rtx src,
1935 rtx size, bool tailcall)
1936 {
1937 rtx dst_addr, src_addr;
1938 tree call_expr, dst_tree, src_tree, size_tree;
1939 machine_mode size_mode;
1940
1941 /* Since dst and src are passed to a libcall, mark the corresponding
1942 tree EXPR as addressable. */
1943 tree dst_expr = MEM_EXPR (dst);
1944 tree src_expr = MEM_EXPR (src);
1945 if (dst_expr)
1946 mark_addressable (dst_expr);
1947 if (src_expr)
1948 mark_addressable (src_expr);
1949
1950 dst_addr = copy_addr_to_reg (XEXP (dst, 0));
1951 dst_addr = convert_memory_address (ptr_mode, dst_addr);
1952 dst_tree = make_tree (ptr_type_node, dst_addr);
1953
1954 src_addr = copy_addr_to_reg (XEXP (src, 0));
1955 src_addr = convert_memory_address (ptr_mode, src_addr);
1956 src_tree = make_tree (ptr_type_node, src_addr);
1957
1958 size_mode = TYPE_MODE (sizetype);
1959 size = convert_to_mode (size_mode, size, 1);
1960 size = copy_to_mode_reg (size_mode, size);
1961 size_tree = make_tree (sizetype, size);
1962
1963 /* It is incorrect to use the libcall calling conventions for calls to
1964 memcpy/memmove/memcmp because they can be provided by the user. */
1965 tree fn = builtin_decl_implicit (fncode);
1966 call_expr = build_call_expr (fn, 3, dst_tree, src_tree, size_tree);
1967 CALL_EXPR_TAILCALL (call_expr) = tailcall;
1968
1969 return expand_call (call_expr, NULL_RTX, false);
1970 }
1971
1972 /* Try to expand cmpstrn or cmpmem operation ICODE with the given operands.
1973 ARG3_TYPE is the type of ARG3_RTX. Return the result rtx on success,
1974 otherwise return null. */
1975
1976 rtx
1977 expand_cmpstrn_or_cmpmem (insn_code icode, rtx target, rtx arg1_rtx,
1978 rtx arg2_rtx, tree arg3_type, rtx arg3_rtx,
1979 HOST_WIDE_INT align)
1980 {
1981 machine_mode insn_mode = insn_data[icode].operand[0].mode;
1982
1983 if (target && (!REG_P (target) || HARD_REGISTER_P (target)))
1984 target = NULL_RTX;
1985
1986 class expand_operand ops[5];
1987 create_output_operand (&ops[0], target, insn_mode);
1988 create_fixed_operand (&ops[1], arg1_rtx);
1989 create_fixed_operand (&ops[2], arg2_rtx);
1990 create_convert_operand_from (&ops[3], arg3_rtx, TYPE_MODE (arg3_type),
1991 TYPE_UNSIGNED (arg3_type));
1992 create_integer_operand (&ops[4], align);
1993 if (maybe_expand_insn (icode, 5, ops))
1994 return ops[0].value;
1995 return NULL_RTX;
1996 }
1997
1998 /* Expand a block compare between X and Y with length LEN using the
1999 cmpmem optab, placing the result in TARGET. LEN_TYPE is the type
2000 of the expression that was used to calculate the length. ALIGN
2001 gives the known minimum common alignment. */
2002
2003 static rtx
2004 emit_block_cmp_via_cmpmem (rtx x, rtx y, rtx len, tree len_type, rtx target,
2005 unsigned align)
2006 {
2007 /* Note: The cmpstrnsi pattern, if it exists, is not suitable for
2008 implementing memcmp because it will stop if it encounters two
2009 zero bytes. */
2010 insn_code icode = direct_optab_handler (cmpmem_optab, SImode);
2011
2012 if (icode == CODE_FOR_nothing)
2013 return NULL_RTX;
2014
2015 return expand_cmpstrn_or_cmpmem (icode, target, x, y, len_type, len, align);
2016 }
2017
2018 /* Emit code to compare a block Y to a block X. This may be done with
2019 string-compare instructions, with multiple scalar instructions,
2020 or with a library call.
2021
2022 Both X and Y must be MEM rtx's. LEN is an rtx that says how long
2023 they are. LEN_TYPE is the type of the expression that was used to
2024 calculate it.
2025
2026 If EQUALITY_ONLY is true, it means we don't have to return the tri-state
2027 value of a normal memcmp call, instead we can just compare for equality.
2028 If FORCE_LIBCALL is true, we should emit a call to memcmp rather than
2029 returning NULL_RTX.
2030
2031 Optionally, the caller can pass a constfn and associated data in Y_CFN
2032 and Y_CFN_DATA. describing that the second operand being compared is a
2033 known constant and how to obtain its data.
2034 Return the result of the comparison, or NULL_RTX if we failed to
2035 perform the operation. */
2036
2037 rtx
2038 emit_block_cmp_hints (rtx x, rtx y, rtx len, tree len_type, rtx target,
2039 bool equality_only, by_pieces_constfn y_cfn,
2040 void *y_cfndata)
2041 {
2042 rtx result = 0;
2043
2044 if (CONST_INT_P (len) && INTVAL (len) == 0)
2045 return const0_rtx;
2046
2047 gcc_assert (MEM_P (x) && MEM_P (y));
2048 unsigned int align = MIN (MEM_ALIGN (x), MEM_ALIGN (y));
2049 gcc_assert (align >= BITS_PER_UNIT);
2050
2051 x = adjust_address (x, BLKmode, 0);
2052 y = adjust_address (y, BLKmode, 0);
2053
2054 if (equality_only
2055 && CONST_INT_P (len)
2056 && can_do_by_pieces (INTVAL (len), align, COMPARE_BY_PIECES))
2057 result = compare_by_pieces (x, y, INTVAL (len), target, align,
2058 y_cfn, y_cfndata);
2059 else
2060 result = emit_block_cmp_via_cmpmem (x, y, len, len_type, target, align);
2061
2062 return result;
2063 }
2064 \f
2065 /* Copy all or part of a value X into registers starting at REGNO.
2066 The number of registers to be filled is NREGS. */
2067
2068 void
2069 move_block_to_reg (int regno, rtx x, int nregs, machine_mode mode)
2070 {
2071 if (nregs == 0)
2072 return;
2073
2074 if (CONSTANT_P (x) && !targetm.legitimate_constant_p (mode, x))
2075 x = validize_mem (force_const_mem (mode, x));
2076
2077 /* See if the machine can do this with a load multiple insn. */
2078 if (targetm.have_load_multiple ())
2079 {
2080 rtx_insn *last = get_last_insn ();
2081 rtx first = gen_rtx_REG (word_mode, regno);
2082 if (rtx_insn *pat = targetm.gen_load_multiple (first, x,
2083 GEN_INT (nregs)))
2084 {
2085 emit_insn (pat);
2086 return;
2087 }
2088 else
2089 delete_insns_since (last);
2090 }
2091
2092 for (int i = 0; i < nregs; i++)
2093 emit_move_insn (gen_rtx_REG (word_mode, regno + i),
2094 operand_subword_force (x, i, mode));
2095 }
2096
2097 /* Copy all or part of a BLKmode value X out of registers starting at REGNO.
2098 The number of registers to be filled is NREGS. */
2099
2100 void
2101 move_block_from_reg (int regno, rtx x, int nregs)
2102 {
2103 if (nregs == 0)
2104 return;
2105
2106 /* See if the machine can do this with a store multiple insn. */
2107 if (targetm.have_store_multiple ())
2108 {
2109 rtx_insn *last = get_last_insn ();
2110 rtx first = gen_rtx_REG (word_mode, regno);
2111 if (rtx_insn *pat = targetm.gen_store_multiple (x, first,
2112 GEN_INT (nregs)))
2113 {
2114 emit_insn (pat);
2115 return;
2116 }
2117 else
2118 delete_insns_since (last);
2119 }
2120
2121 for (int i = 0; i < nregs; i++)
2122 {
2123 rtx tem = operand_subword (x, i, 1, BLKmode);
2124
2125 gcc_assert (tem);
2126
2127 emit_move_insn (tem, gen_rtx_REG (word_mode, regno + i));
2128 }
2129 }
2130
2131 /* Generate a PARALLEL rtx for a new non-consecutive group of registers from
2132 ORIG, where ORIG is a non-consecutive group of registers represented by
2133 a PARALLEL. The clone is identical to the original except in that the
2134 original set of registers is replaced by a new set of pseudo registers.
2135 The new set has the same modes as the original set. */
2136
2137 rtx
2138 gen_group_rtx (rtx orig)
2139 {
2140 int i, length;
2141 rtx *tmps;
2142
2143 gcc_assert (GET_CODE (orig) == PARALLEL);
2144
2145 length = XVECLEN (orig, 0);
2146 tmps = XALLOCAVEC (rtx, length);
2147
2148 /* Skip a NULL entry in first slot. */
2149 i = XEXP (XVECEXP (orig, 0, 0), 0) ? 0 : 1;
2150
2151 if (i)
2152 tmps[0] = 0;
2153
2154 for (; i < length; i++)
2155 {
2156 machine_mode mode = GET_MODE (XEXP (XVECEXP (orig, 0, i), 0));
2157 rtx offset = XEXP (XVECEXP (orig, 0, i), 1);
2158
2159 tmps[i] = gen_rtx_EXPR_LIST (VOIDmode, gen_reg_rtx (mode), offset);
2160 }
2161
2162 return gen_rtx_PARALLEL (GET_MODE (orig), gen_rtvec_v (length, tmps));
2163 }
2164
2165 /* A subroutine of emit_group_load. Arguments as for emit_group_load,
2166 except that values are placed in TMPS[i], and must later be moved
2167 into corresponding XEXP (XVECEXP (DST, 0, i), 0) element. */
2168
2169 static void
2170 emit_group_load_1 (rtx *tmps, rtx dst, rtx orig_src, tree type,
2171 poly_int64 ssize)
2172 {
2173 rtx src;
2174 int start, i;
2175 machine_mode m = GET_MODE (orig_src);
2176
2177 gcc_assert (GET_CODE (dst) == PARALLEL);
2178
2179 if (m != VOIDmode
2180 && !SCALAR_INT_MODE_P (m)
2181 && !MEM_P (orig_src)
2182 && GET_CODE (orig_src) != CONCAT)
2183 {
2184 scalar_int_mode imode;
2185 if (int_mode_for_mode (GET_MODE (orig_src)).exists (&imode))
2186 {
2187 src = gen_reg_rtx (imode);
2188 emit_move_insn (gen_lowpart (GET_MODE (orig_src), src), orig_src);
2189 }
2190 else
2191 {
2192 src = assign_stack_temp (GET_MODE (orig_src), ssize);
2193 emit_move_insn (src, orig_src);
2194 }
2195 emit_group_load_1 (tmps, dst, src, type, ssize);
2196 return;
2197 }
2198
2199 /* Check for a NULL entry, used to indicate that the parameter goes
2200 both on the stack and in registers. */
2201 if (XEXP (XVECEXP (dst, 0, 0), 0))
2202 start = 0;
2203 else
2204 start = 1;
2205
2206 /* Process the pieces. */
2207 for (i = start; i < XVECLEN (dst, 0); i++)
2208 {
2209 machine_mode mode = GET_MODE (XEXP (XVECEXP (dst, 0, i), 0));
2210 poly_int64 bytepos = rtx_to_poly_int64 (XEXP (XVECEXP (dst, 0, i), 1));
2211 poly_int64 bytelen = GET_MODE_SIZE (mode);
2212 poly_int64 shift = 0;
2213
2214 /* Handle trailing fragments that run over the size of the struct.
2215 It's the target's responsibility to make sure that the fragment
2216 cannot be strictly smaller in some cases and strictly larger
2217 in others. */
2218 gcc_checking_assert (ordered_p (bytepos + bytelen, ssize));
2219 if (known_size_p (ssize) && maybe_gt (bytepos + bytelen, ssize))
2220 {
2221 /* Arrange to shift the fragment to where it belongs.
2222 extract_bit_field loads to the lsb of the reg. */
2223 if (
2224 #ifdef BLOCK_REG_PADDING
2225 BLOCK_REG_PADDING (GET_MODE (orig_src), type, i == start)
2226 == (BYTES_BIG_ENDIAN ? PAD_UPWARD : PAD_DOWNWARD)
2227 #else
2228 BYTES_BIG_ENDIAN
2229 #endif
2230 )
2231 shift = (bytelen - (ssize - bytepos)) * BITS_PER_UNIT;
2232 bytelen = ssize - bytepos;
2233 gcc_assert (maybe_gt (bytelen, 0));
2234 }
2235
2236 /* If we won't be loading directly from memory, protect the real source
2237 from strange tricks we might play; but make sure that the source can
2238 be loaded directly into the destination. */
2239 src = orig_src;
2240 if (!MEM_P (orig_src)
2241 && (!CONSTANT_P (orig_src)
2242 || (GET_MODE (orig_src) != mode
2243 && GET_MODE (orig_src) != VOIDmode)))
2244 {
2245 if (GET_MODE (orig_src) == VOIDmode)
2246 src = gen_reg_rtx (mode);
2247 else
2248 src = gen_reg_rtx (GET_MODE (orig_src));
2249
2250 emit_move_insn (src, orig_src);
2251 }
2252
2253 /* Optimize the access just a bit. */
2254 if (MEM_P (src)
2255 && (! targetm.slow_unaligned_access (mode, MEM_ALIGN (src))
2256 || MEM_ALIGN (src) >= GET_MODE_ALIGNMENT (mode))
2257 && multiple_p (bytepos * BITS_PER_UNIT, GET_MODE_ALIGNMENT (mode))
2258 && known_eq (bytelen, GET_MODE_SIZE (mode)))
2259 {
2260 tmps[i] = gen_reg_rtx (mode);
2261 emit_move_insn (tmps[i], adjust_address (src, mode, bytepos));
2262 }
2263 else if (COMPLEX_MODE_P (mode)
2264 && GET_MODE (src) == mode
2265 && known_eq (bytelen, GET_MODE_SIZE (mode)))
2266 /* Let emit_move_complex do the bulk of the work. */
2267 tmps[i] = src;
2268 else if (GET_CODE (src) == CONCAT)
2269 {
2270 poly_int64 slen = GET_MODE_SIZE (GET_MODE (src));
2271 poly_int64 slen0 = GET_MODE_SIZE (GET_MODE (XEXP (src, 0)));
2272 unsigned int elt;
2273 poly_int64 subpos;
2274
2275 if (can_div_trunc_p (bytepos, slen0, &elt, &subpos)
2276 && known_le (subpos + bytelen, slen0))
2277 {
2278 /* The following assumes that the concatenated objects all
2279 have the same size. In this case, a simple calculation
2280 can be used to determine the object and the bit field
2281 to be extracted. */
2282 tmps[i] = XEXP (src, elt);
2283 if (maybe_ne (subpos, 0)
2284 || maybe_ne (subpos + bytelen, slen0)
2285 || (!CONSTANT_P (tmps[i])
2286 && (!REG_P (tmps[i]) || GET_MODE (tmps[i]) != mode)))
2287 tmps[i] = extract_bit_field (tmps[i], bytelen * BITS_PER_UNIT,
2288 subpos * BITS_PER_UNIT,
2289 1, NULL_RTX, mode, mode, false,
2290 NULL);
2291 }
2292 else
2293 {
2294 rtx mem;
2295
2296 gcc_assert (known_eq (bytepos, 0));
2297 mem = assign_stack_temp (GET_MODE (src), slen);
2298 emit_move_insn (mem, src);
2299 tmps[i] = extract_bit_field (mem, bytelen * BITS_PER_UNIT,
2300 0, 1, NULL_RTX, mode, mode, false,
2301 NULL);
2302 }
2303 }
2304 /* FIXME: A SIMD parallel will eventually lead to a subreg of a
2305 SIMD register, which is currently broken. While we get GCC
2306 to emit proper RTL for these cases, let's dump to memory. */
2307 else if (VECTOR_MODE_P (GET_MODE (dst))
2308 && REG_P (src))
2309 {
2310 poly_uint64 slen = GET_MODE_SIZE (GET_MODE (src));
2311 rtx mem;
2312
2313 mem = assign_stack_temp (GET_MODE (src), slen);
2314 emit_move_insn (mem, src);
2315 tmps[i] = adjust_address (mem, mode, bytepos);
2316 }
2317 else if (CONSTANT_P (src) && GET_MODE (dst) != BLKmode
2318 && XVECLEN (dst, 0) > 1)
2319 tmps[i] = simplify_gen_subreg (mode, src, GET_MODE (dst), bytepos);
2320 else if (CONSTANT_P (src))
2321 {
2322 if (known_eq (bytelen, ssize))
2323 tmps[i] = src;
2324 else
2325 {
2326 rtx first, second;
2327
2328 /* TODO: const_wide_int can have sizes other than this... */
2329 gcc_assert (known_eq (2 * bytelen, ssize));
2330 split_double (src, &first, &second);
2331 if (i)
2332 tmps[i] = second;
2333 else
2334 tmps[i] = first;
2335 }
2336 }
2337 else if (REG_P (src) && GET_MODE (src) == mode)
2338 tmps[i] = src;
2339 else
2340 tmps[i] = extract_bit_field (src, bytelen * BITS_PER_UNIT,
2341 bytepos * BITS_PER_UNIT, 1, NULL_RTX,
2342 mode, mode, false, NULL);
2343
2344 if (maybe_ne (shift, 0))
2345 tmps[i] = expand_shift (LSHIFT_EXPR, mode, tmps[i],
2346 shift, tmps[i], 0);
2347 }
2348 }
2349
2350 /* Emit code to move a block SRC of type TYPE to a block DST,
2351 where DST is non-consecutive registers represented by a PARALLEL.
2352 SSIZE represents the total size of block ORIG_SRC in bytes, or -1
2353 if not known. */
2354
2355 void
2356 emit_group_load (rtx dst, rtx src, tree type, poly_int64 ssize)
2357 {
2358 rtx *tmps;
2359 int i;
2360
2361 tmps = XALLOCAVEC (rtx, XVECLEN (dst, 0));
2362 emit_group_load_1 (tmps, dst, src, type, ssize);
2363
2364 /* Copy the extracted pieces into the proper (probable) hard regs. */
2365 for (i = 0; i < XVECLEN (dst, 0); i++)
2366 {
2367 rtx d = XEXP (XVECEXP (dst, 0, i), 0);
2368 if (d == NULL)
2369 continue;
2370 emit_move_insn (d, tmps[i]);
2371 }
2372 }
2373
2374 /* Similar, but load SRC into new pseudos in a format that looks like
2375 PARALLEL. This can later be fed to emit_group_move to get things
2376 in the right place. */
2377
2378 rtx
2379 emit_group_load_into_temps (rtx parallel, rtx src, tree type, poly_int64 ssize)
2380 {
2381 rtvec vec;
2382 int i;
2383
2384 vec = rtvec_alloc (XVECLEN (parallel, 0));
2385 emit_group_load_1 (&RTVEC_ELT (vec, 0), parallel, src, type, ssize);
2386
2387 /* Convert the vector to look just like the original PARALLEL, except
2388 with the computed values. */
2389 for (i = 0; i < XVECLEN (parallel, 0); i++)
2390 {
2391 rtx e = XVECEXP (parallel, 0, i);
2392 rtx d = XEXP (e, 0);
2393
2394 if (d)
2395 {
2396 d = force_reg (GET_MODE (d), RTVEC_ELT (vec, i));
2397 e = alloc_EXPR_LIST (REG_NOTE_KIND (e), d, XEXP (e, 1));
2398 }
2399 RTVEC_ELT (vec, i) = e;
2400 }
2401
2402 return gen_rtx_PARALLEL (GET_MODE (parallel), vec);
2403 }
2404
2405 /* Emit code to move a block SRC to block DST, where SRC and DST are
2406 non-consecutive groups of registers, each represented by a PARALLEL. */
2407
2408 void
2409 emit_group_move (rtx dst, rtx src)
2410 {
2411 int i;
2412
2413 gcc_assert (GET_CODE (src) == PARALLEL
2414 && GET_CODE (dst) == PARALLEL
2415 && XVECLEN (src, 0) == XVECLEN (dst, 0));
2416
2417 /* Skip first entry if NULL. */
2418 for (i = XEXP (XVECEXP (src, 0, 0), 0) ? 0 : 1; i < XVECLEN (src, 0); i++)
2419 emit_move_insn (XEXP (XVECEXP (dst, 0, i), 0),
2420 XEXP (XVECEXP (src, 0, i), 0));
2421 }
2422
2423 /* Move a group of registers represented by a PARALLEL into pseudos. */
2424
2425 rtx
2426 emit_group_move_into_temps (rtx src)
2427 {
2428 rtvec vec = rtvec_alloc (XVECLEN (src, 0));
2429 int i;
2430
2431 for (i = 0; i < XVECLEN (src, 0); i++)
2432 {
2433 rtx e = XVECEXP (src, 0, i);
2434 rtx d = XEXP (e, 0);
2435
2436 if (d)
2437 e = alloc_EXPR_LIST (REG_NOTE_KIND (e), copy_to_reg (d), XEXP (e, 1));
2438 RTVEC_ELT (vec, i) = e;
2439 }
2440
2441 return gen_rtx_PARALLEL (GET_MODE (src), vec);
2442 }
2443
2444 /* Emit code to move a block SRC to a block ORIG_DST of type TYPE,
2445 where SRC is non-consecutive registers represented by a PARALLEL.
2446 SSIZE represents the total size of block ORIG_DST, or -1 if not
2447 known. */
2448
2449 void
2450 emit_group_store (rtx orig_dst, rtx src, tree type ATTRIBUTE_UNUSED,
2451 poly_int64 ssize)
2452 {
2453 rtx *tmps, dst;
2454 int start, finish, i;
2455 machine_mode m = GET_MODE (orig_dst);
2456
2457 gcc_assert (GET_CODE (src) == PARALLEL);
2458
2459 if (!SCALAR_INT_MODE_P (m)
2460 && !MEM_P (orig_dst) && GET_CODE (orig_dst) != CONCAT)
2461 {
2462 scalar_int_mode imode;
2463 if (int_mode_for_mode (GET_MODE (orig_dst)).exists (&imode))
2464 {
2465 dst = gen_reg_rtx (imode);
2466 emit_group_store (dst, src, type, ssize);
2467 dst = gen_lowpart (GET_MODE (orig_dst), dst);
2468 }
2469 else
2470 {
2471 dst = assign_stack_temp (GET_MODE (orig_dst), ssize);
2472 emit_group_store (dst, src, type, ssize);
2473 }
2474 emit_move_insn (orig_dst, dst);
2475 return;
2476 }
2477
2478 /* Check for a NULL entry, used to indicate that the parameter goes
2479 both on the stack and in registers. */
2480 if (XEXP (XVECEXP (src, 0, 0), 0))
2481 start = 0;
2482 else
2483 start = 1;
2484 finish = XVECLEN (src, 0);
2485
2486 tmps = XALLOCAVEC (rtx, finish);
2487
2488 /* Copy the (probable) hard regs into pseudos. */
2489 for (i = start; i < finish; i++)
2490 {
2491 rtx reg = XEXP (XVECEXP (src, 0, i), 0);
2492 if (!REG_P (reg) || REGNO (reg) < FIRST_PSEUDO_REGISTER)
2493 {
2494 tmps[i] = gen_reg_rtx (GET_MODE (reg));
2495 emit_move_insn (tmps[i], reg);
2496 }
2497 else
2498 tmps[i] = reg;
2499 }
2500
2501 /* If we won't be storing directly into memory, protect the real destination
2502 from strange tricks we might play. */
2503 dst = orig_dst;
2504 if (GET_CODE (dst) == PARALLEL)
2505 {
2506 rtx temp;
2507
2508 /* We can get a PARALLEL dst if there is a conditional expression in
2509 a return statement. In that case, the dst and src are the same,
2510 so no action is necessary. */
2511 if (rtx_equal_p (dst, src))
2512 return;
2513
2514 /* It is unclear if we can ever reach here, but we may as well handle
2515 it. Allocate a temporary, and split this into a store/load to/from
2516 the temporary. */
2517 temp = assign_stack_temp (GET_MODE (dst), ssize);
2518 emit_group_store (temp, src, type, ssize);
2519 emit_group_load (dst, temp, type, ssize);
2520 return;
2521 }
2522 else if (!MEM_P (dst) && GET_CODE (dst) != CONCAT)
2523 {
2524 machine_mode outer = GET_MODE (dst);
2525 machine_mode inner;
2526 poly_int64 bytepos;
2527 bool done = false;
2528 rtx temp;
2529
2530 if (!REG_P (dst) || REGNO (dst) < FIRST_PSEUDO_REGISTER)
2531 dst = gen_reg_rtx (outer);
2532
2533 /* Make life a bit easier for combine. */
2534 /* If the first element of the vector is the low part
2535 of the destination mode, use a paradoxical subreg to
2536 initialize the destination. */
2537 if (start < finish)
2538 {
2539 inner = GET_MODE (tmps[start]);
2540 bytepos = subreg_lowpart_offset (inner, outer);
2541 if (known_eq (rtx_to_poly_int64 (XEXP (XVECEXP (src, 0, start), 1)),
2542 bytepos))
2543 {
2544 temp = simplify_gen_subreg (outer, tmps[start],
2545 inner, 0);
2546 if (temp)
2547 {
2548 emit_move_insn (dst, temp);
2549 done = true;
2550 start++;
2551 }
2552 }
2553 }
2554
2555 /* If the first element wasn't the low part, try the last. */
2556 if (!done
2557 && start < finish - 1)
2558 {
2559 inner = GET_MODE (tmps[finish - 1]);
2560 bytepos = subreg_lowpart_offset (inner, outer);
2561 if (known_eq (rtx_to_poly_int64 (XEXP (XVECEXP (src, 0,
2562 finish - 1), 1)),
2563 bytepos))
2564 {
2565 temp = simplify_gen_subreg (outer, tmps[finish - 1],
2566 inner, 0);
2567 if (temp)
2568 {
2569 emit_move_insn (dst, temp);
2570 done = true;
2571 finish--;
2572 }
2573 }
2574 }
2575
2576 /* Otherwise, simply initialize the result to zero. */
2577 if (!done)
2578 emit_move_insn (dst, CONST0_RTX (outer));
2579 }
2580
2581 /* Process the pieces. */
2582 for (i = start; i < finish; i++)
2583 {
2584 poly_int64 bytepos = rtx_to_poly_int64 (XEXP (XVECEXP (src, 0, i), 1));
2585 machine_mode mode = GET_MODE (tmps[i]);
2586 poly_int64 bytelen = GET_MODE_SIZE (mode);
2587 poly_uint64 adj_bytelen;
2588 rtx dest = dst;
2589
2590 /* Handle trailing fragments that run over the size of the struct.
2591 It's the target's responsibility to make sure that the fragment
2592 cannot be strictly smaller in some cases and strictly larger
2593 in others. */
2594 gcc_checking_assert (ordered_p (bytepos + bytelen, ssize));
2595 if (known_size_p (ssize) && maybe_gt (bytepos + bytelen, ssize))
2596 adj_bytelen = ssize - bytepos;
2597 else
2598 adj_bytelen = bytelen;
2599
2600 if (GET_CODE (dst) == CONCAT)
2601 {
2602 if (known_le (bytepos + adj_bytelen,
2603 GET_MODE_SIZE (GET_MODE (XEXP (dst, 0)))))
2604 dest = XEXP (dst, 0);
2605 else if (known_ge (bytepos, GET_MODE_SIZE (GET_MODE (XEXP (dst, 0)))))
2606 {
2607 bytepos -= GET_MODE_SIZE (GET_MODE (XEXP (dst, 0)));
2608 dest = XEXP (dst, 1);
2609 }
2610 else
2611 {
2612 machine_mode dest_mode = GET_MODE (dest);
2613 machine_mode tmp_mode = GET_MODE (tmps[i]);
2614
2615 gcc_assert (known_eq (bytepos, 0) && XVECLEN (src, 0));
2616
2617 if (GET_MODE_ALIGNMENT (dest_mode)
2618 >= GET_MODE_ALIGNMENT (tmp_mode))
2619 {
2620 dest = assign_stack_temp (dest_mode,
2621 GET_MODE_SIZE (dest_mode));
2622 emit_move_insn (adjust_address (dest,
2623 tmp_mode,
2624 bytepos),
2625 tmps[i]);
2626 dst = dest;
2627 }
2628 else
2629 {
2630 dest = assign_stack_temp (tmp_mode,
2631 GET_MODE_SIZE (tmp_mode));
2632 emit_move_insn (dest, tmps[i]);
2633 dst = adjust_address (dest, dest_mode, bytepos);
2634 }
2635 break;
2636 }
2637 }
2638
2639 /* Handle trailing fragments that run over the size of the struct. */
2640 if (known_size_p (ssize) && maybe_gt (bytepos + bytelen, ssize))
2641 {
2642 /* store_bit_field always takes its value from the lsb.
2643 Move the fragment to the lsb if it's not already there. */
2644 if (
2645 #ifdef BLOCK_REG_PADDING
2646 BLOCK_REG_PADDING (GET_MODE (orig_dst), type, i == start)
2647 == (BYTES_BIG_ENDIAN ? PAD_UPWARD : PAD_DOWNWARD)
2648 #else
2649 BYTES_BIG_ENDIAN
2650 #endif
2651 )
2652 {
2653 poly_int64 shift = (bytelen - (ssize - bytepos)) * BITS_PER_UNIT;
2654 tmps[i] = expand_shift (RSHIFT_EXPR, mode, tmps[i],
2655 shift, tmps[i], 0);
2656 }
2657
2658 /* Make sure not to write past the end of the struct. */
2659 store_bit_field (dest,
2660 adj_bytelen * BITS_PER_UNIT, bytepos * BITS_PER_UNIT,
2661 bytepos * BITS_PER_UNIT, ssize * BITS_PER_UNIT - 1,
2662 VOIDmode, tmps[i], false);
2663 }
2664
2665 /* Optimize the access just a bit. */
2666 else if (MEM_P (dest)
2667 && (!targetm.slow_unaligned_access (mode, MEM_ALIGN (dest))
2668 || MEM_ALIGN (dest) >= GET_MODE_ALIGNMENT (mode))
2669 && multiple_p (bytepos * BITS_PER_UNIT,
2670 GET_MODE_ALIGNMENT (mode))
2671 && known_eq (bytelen, GET_MODE_SIZE (mode)))
2672 emit_move_insn (adjust_address (dest, mode, bytepos), tmps[i]);
2673
2674 else
2675 store_bit_field (dest, bytelen * BITS_PER_UNIT, bytepos * BITS_PER_UNIT,
2676 0, 0, mode, tmps[i], false);
2677 }
2678
2679 /* Copy from the pseudo into the (probable) hard reg. */
2680 if (orig_dst != dst)
2681 emit_move_insn (orig_dst, dst);
2682 }
2683
2684 /* Return a form of X that does not use a PARALLEL. TYPE is the type
2685 of the value stored in X. */
2686
2687 rtx
2688 maybe_emit_group_store (rtx x, tree type)
2689 {
2690 machine_mode mode = TYPE_MODE (type);
2691 gcc_checking_assert (GET_MODE (x) == VOIDmode || GET_MODE (x) == mode);
2692 if (GET_CODE (x) == PARALLEL)
2693 {
2694 rtx result = gen_reg_rtx (mode);
2695 emit_group_store (result, x, type, int_size_in_bytes (type));
2696 return result;
2697 }
2698 return x;
2699 }
2700
2701 /* Copy a BLKmode object of TYPE out of a register SRCREG into TARGET.
2702
2703 This is used on targets that return BLKmode values in registers. */
2704
2705 static void
2706 copy_blkmode_from_reg (rtx target, rtx srcreg, tree type)
2707 {
2708 unsigned HOST_WIDE_INT bytes = int_size_in_bytes (type);
2709 rtx src = NULL, dst = NULL;
2710 unsigned HOST_WIDE_INT bitsize = MIN (TYPE_ALIGN (type), BITS_PER_WORD);
2711 unsigned HOST_WIDE_INT bitpos, xbitpos, padding_correction = 0;
2712 /* No current ABI uses variable-sized modes to pass a BLKmnode type. */
2713 fixed_size_mode mode = as_a <fixed_size_mode> (GET_MODE (srcreg));
2714 fixed_size_mode tmode = as_a <fixed_size_mode> (GET_MODE (target));
2715 fixed_size_mode copy_mode;
2716
2717 /* BLKmode registers created in the back-end shouldn't have survived. */
2718 gcc_assert (mode != BLKmode);
2719
2720 /* If the structure doesn't take up a whole number of words, see whether
2721 SRCREG is padded on the left or on the right. If it's on the left,
2722 set PADDING_CORRECTION to the number of bits to skip.
2723
2724 In most ABIs, the structure will be returned at the least end of
2725 the register, which translates to right padding on little-endian
2726 targets and left padding on big-endian targets. The opposite
2727 holds if the structure is returned at the most significant
2728 end of the register. */
2729 if (bytes % UNITS_PER_WORD != 0
2730 && (targetm.calls.return_in_msb (type)
2731 ? !BYTES_BIG_ENDIAN
2732 : BYTES_BIG_ENDIAN))
2733 padding_correction
2734 = (BITS_PER_WORD - ((bytes % UNITS_PER_WORD) * BITS_PER_UNIT));
2735
2736 /* We can use a single move if we have an exact mode for the size. */
2737 else if (MEM_P (target)
2738 && (!targetm.slow_unaligned_access (mode, MEM_ALIGN (target))
2739 || MEM_ALIGN (target) >= GET_MODE_ALIGNMENT (mode))
2740 && bytes == GET_MODE_SIZE (mode))
2741 {
2742 emit_move_insn (adjust_address (target, mode, 0), srcreg);
2743 return;
2744 }
2745
2746 /* And if we additionally have the same mode for a register. */
2747 else if (REG_P (target)
2748 && GET_MODE (target) == mode
2749 && bytes == GET_MODE_SIZE (mode))
2750 {
2751 emit_move_insn (target, srcreg);
2752 return;
2753 }
2754
2755 /* This code assumes srcreg is at least a full word. If it isn't, copy it
2756 into a new pseudo which is a full word. */
2757 if (GET_MODE_SIZE (mode) < UNITS_PER_WORD)
2758 {
2759 srcreg = convert_to_mode (word_mode, srcreg, TYPE_UNSIGNED (type));
2760 mode = word_mode;
2761 }
2762
2763 /* Copy the structure BITSIZE bits at a time. If the target lives in
2764 memory, take care of not reading/writing past its end by selecting
2765 a copy mode suited to BITSIZE. This should always be possible given
2766 how it is computed.
2767
2768 If the target lives in register, make sure not to select a copy mode
2769 larger than the mode of the register.
2770
2771 We could probably emit more efficient code for machines which do not use
2772 strict alignment, but it doesn't seem worth the effort at the current
2773 time. */
2774
2775 copy_mode = word_mode;
2776 if (MEM_P (target))
2777 {
2778 opt_scalar_int_mode mem_mode = int_mode_for_size (bitsize, 1);
2779 if (mem_mode.exists ())
2780 copy_mode = mem_mode.require ();
2781 }
2782 else if (REG_P (target) && GET_MODE_BITSIZE (tmode) < BITS_PER_WORD)
2783 copy_mode = tmode;
2784
2785 for (bitpos = 0, xbitpos = padding_correction;
2786 bitpos < bytes * BITS_PER_UNIT;
2787 bitpos += bitsize, xbitpos += bitsize)
2788 {
2789 /* We need a new source operand each time xbitpos is on a
2790 word boundary and when xbitpos == padding_correction
2791 (the first time through). */
2792 if (xbitpos % BITS_PER_WORD == 0 || xbitpos == padding_correction)
2793 src = operand_subword_force (srcreg, xbitpos / BITS_PER_WORD, mode);
2794
2795 /* We need a new destination operand each time bitpos is on
2796 a word boundary. */
2797 if (REG_P (target) && GET_MODE_BITSIZE (tmode) < BITS_PER_WORD)
2798 dst = target;
2799 else if (bitpos % BITS_PER_WORD == 0)
2800 dst = operand_subword (target, bitpos / BITS_PER_WORD, 1, tmode);
2801
2802 /* Use xbitpos for the source extraction (right justified) and
2803 bitpos for the destination store (left justified). */
2804 store_bit_field (dst, bitsize, bitpos % BITS_PER_WORD, 0, 0, copy_mode,
2805 extract_bit_field (src, bitsize,
2806 xbitpos % BITS_PER_WORD, 1,
2807 NULL_RTX, copy_mode, copy_mode,
2808 false, NULL),
2809 false);
2810 }
2811 }
2812
2813 /* Copy BLKmode value SRC into a register of mode MODE_IN. Return the
2814 register if it contains any data, otherwise return null.
2815
2816 This is used on targets that return BLKmode values in registers. */
2817
2818 rtx
2819 copy_blkmode_to_reg (machine_mode mode_in, tree src)
2820 {
2821 int i, n_regs;
2822 unsigned HOST_WIDE_INT bitpos, xbitpos, padding_correction = 0, bytes;
2823 unsigned int bitsize;
2824 rtx *dst_words, dst, x, src_word = NULL_RTX, dst_word = NULL_RTX;
2825 /* No current ABI uses variable-sized modes to pass a BLKmnode type. */
2826 fixed_size_mode mode = as_a <fixed_size_mode> (mode_in);
2827 fixed_size_mode dst_mode;
2828 scalar_int_mode min_mode;
2829
2830 gcc_assert (TYPE_MODE (TREE_TYPE (src)) == BLKmode);
2831
2832 x = expand_normal (src);
2833
2834 bytes = arg_int_size_in_bytes (TREE_TYPE (src));
2835 if (bytes == 0)
2836 return NULL_RTX;
2837
2838 /* If the structure doesn't take up a whole number of words, see
2839 whether the register value should be padded on the left or on
2840 the right. Set PADDING_CORRECTION to the number of padding
2841 bits needed on the left side.
2842
2843 In most ABIs, the structure will be returned at the least end of
2844 the register, which translates to right padding on little-endian
2845 targets and left padding on big-endian targets. The opposite
2846 holds if the structure is returned at the most significant
2847 end of the register. */
2848 if (bytes % UNITS_PER_WORD != 0
2849 && (targetm.calls.return_in_msb (TREE_TYPE (src))
2850 ? !BYTES_BIG_ENDIAN
2851 : BYTES_BIG_ENDIAN))
2852 padding_correction = (BITS_PER_WORD - ((bytes % UNITS_PER_WORD)
2853 * BITS_PER_UNIT));
2854
2855 n_regs = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2856 dst_words = XALLOCAVEC (rtx, n_regs);
2857 bitsize = MIN (TYPE_ALIGN (TREE_TYPE (src)), BITS_PER_WORD);
2858 min_mode = smallest_int_mode_for_size (bitsize);
2859
2860 /* Copy the structure BITSIZE bits at a time. */
2861 for (bitpos = 0, xbitpos = padding_correction;
2862 bitpos < bytes * BITS_PER_UNIT;
2863 bitpos += bitsize, xbitpos += bitsize)
2864 {
2865 /* We need a new destination pseudo each time xbitpos is
2866 on a word boundary and when xbitpos == padding_correction
2867 (the first time through). */
2868 if (xbitpos % BITS_PER_WORD == 0
2869 || xbitpos == padding_correction)
2870 {
2871 /* Generate an appropriate register. */
2872 dst_word = gen_reg_rtx (word_mode);
2873 dst_words[xbitpos / BITS_PER_WORD] = dst_word;
2874
2875 /* Clear the destination before we move anything into it. */
2876 emit_move_insn (dst_word, CONST0_RTX (word_mode));
2877 }
2878
2879 /* Find the largest integer mode that can be used to copy all or as
2880 many bits as possible of the structure if the target supports larger
2881 copies. There are too many corner cases here w.r.t to alignments on
2882 the read/writes. So if there is any padding just use single byte
2883 operations. */
2884 opt_scalar_int_mode mode_iter;
2885 if (padding_correction == 0 && !STRICT_ALIGNMENT)
2886 {
2887 FOR_EACH_MODE_FROM (mode_iter, min_mode)
2888 {
2889 unsigned int msize = GET_MODE_BITSIZE (mode_iter.require ());
2890 if (msize <= ((bytes * BITS_PER_UNIT) - bitpos)
2891 && msize <= BITS_PER_WORD)
2892 bitsize = msize;
2893 else
2894 break;
2895 }
2896 }
2897
2898 /* We need a new source operand each time bitpos is on a word
2899 boundary. */
2900 if (bitpos % BITS_PER_WORD == 0)
2901 src_word = operand_subword_force (x, bitpos / BITS_PER_WORD, BLKmode);
2902
2903 /* Use bitpos for the source extraction (left justified) and
2904 xbitpos for the destination store (right justified). */
2905 store_bit_field (dst_word, bitsize, xbitpos % BITS_PER_WORD,
2906 0, 0, word_mode,
2907 extract_bit_field (src_word, bitsize,
2908 bitpos % BITS_PER_WORD, 1,
2909 NULL_RTX, word_mode, word_mode,
2910 false, NULL),
2911 false);
2912 }
2913
2914 if (mode == BLKmode)
2915 {
2916 /* Find the smallest integer mode large enough to hold the
2917 entire structure. */
2918 opt_scalar_int_mode mode_iter;
2919 FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_INT)
2920 if (GET_MODE_SIZE (mode_iter.require ()) >= bytes)
2921 break;
2922
2923 /* A suitable mode should have been found. */
2924 mode = mode_iter.require ();
2925 }
2926
2927 if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (word_mode))
2928 dst_mode = word_mode;
2929 else
2930 dst_mode = mode;
2931 dst = gen_reg_rtx (dst_mode);
2932
2933 for (i = 0; i < n_regs; i++)
2934 emit_move_insn (operand_subword (dst, i, 0, dst_mode), dst_words[i]);
2935
2936 if (mode != dst_mode)
2937 dst = gen_lowpart (mode, dst);
2938
2939 return dst;
2940 }
2941
2942 /* Add a USE expression for REG to the (possibly empty) list pointed
2943 to by CALL_FUSAGE. REG must denote a hard register. */
2944
2945 void
2946 use_reg_mode (rtx *call_fusage, rtx reg, machine_mode mode)
2947 {
2948 gcc_assert (REG_P (reg));
2949
2950 if (!HARD_REGISTER_P (reg))
2951 return;
2952
2953 *call_fusage
2954 = gen_rtx_EXPR_LIST (mode, gen_rtx_USE (VOIDmode, reg), *call_fusage);
2955 }
2956
2957 /* Add a CLOBBER expression for REG to the (possibly empty) list pointed
2958 to by CALL_FUSAGE. REG must denote a hard register. */
2959
2960 void
2961 clobber_reg_mode (rtx *call_fusage, rtx reg, machine_mode mode)
2962 {
2963 gcc_assert (REG_P (reg) && REGNO (reg) < FIRST_PSEUDO_REGISTER);
2964
2965 *call_fusage
2966 = gen_rtx_EXPR_LIST (mode, gen_rtx_CLOBBER (VOIDmode, reg), *call_fusage);
2967 }
2968
2969 /* Add USE expressions to *CALL_FUSAGE for each of NREGS consecutive regs,
2970 starting at REGNO. All of these registers must be hard registers. */
2971
2972 void
2973 use_regs (rtx *call_fusage, int regno, int nregs)
2974 {
2975 int i;
2976
2977 gcc_assert (regno + nregs <= FIRST_PSEUDO_REGISTER);
2978
2979 for (i = 0; i < nregs; i++)
2980 use_reg (call_fusage, regno_reg_rtx[regno + i]);
2981 }
2982
2983 /* Add USE expressions to *CALL_FUSAGE for each REG contained in the
2984 PARALLEL REGS. This is for calls that pass values in multiple
2985 non-contiguous locations. The Irix 6 ABI has examples of this. */
2986
2987 void
2988 use_group_regs (rtx *call_fusage, rtx regs)
2989 {
2990 int i;
2991
2992 for (i = 0; i < XVECLEN (regs, 0); i++)
2993 {
2994 rtx reg = XEXP (XVECEXP (regs, 0, i), 0);
2995
2996 /* A NULL entry means the parameter goes both on the stack and in
2997 registers. This can also be a MEM for targets that pass values
2998 partially on the stack and partially in registers. */
2999 if (reg != 0 && REG_P (reg))
3000 use_reg (call_fusage, reg);
3001 }
3002 }
3003
3004 /* Return the defining gimple statement for SSA_NAME NAME if it is an
3005 assigment and the code of the expresion on the RHS is CODE. Return
3006 NULL otherwise. */
3007
3008 static gimple *
3009 get_def_for_expr (tree name, enum tree_code code)
3010 {
3011 gimple *def_stmt;
3012
3013 if (TREE_CODE (name) != SSA_NAME)
3014 return NULL;
3015
3016 def_stmt = get_gimple_for_ssa_name (name);
3017 if (!def_stmt
3018 || gimple_assign_rhs_code (def_stmt) != code)
3019 return NULL;
3020
3021 return def_stmt;
3022 }
3023
3024 /* Return the defining gimple statement for SSA_NAME NAME if it is an
3025 assigment and the class of the expresion on the RHS is CLASS. Return
3026 NULL otherwise. */
3027
3028 static gimple *
3029 get_def_for_expr_class (tree name, enum tree_code_class tclass)
3030 {
3031 gimple *def_stmt;
3032
3033 if (TREE_CODE (name) != SSA_NAME)
3034 return NULL;
3035
3036 def_stmt = get_gimple_for_ssa_name (name);
3037 if (!def_stmt
3038 || TREE_CODE_CLASS (gimple_assign_rhs_code (def_stmt)) != tclass)
3039 return NULL;
3040
3041 return def_stmt;
3042 }
3043 \f
3044 /* Write zeros through the storage of OBJECT. If OBJECT has BLKmode, SIZE is
3045 its length in bytes. */
3046
3047 rtx
3048 clear_storage_hints (rtx object, rtx size, enum block_op_methods method,
3049 unsigned int expected_align, HOST_WIDE_INT expected_size,
3050 unsigned HOST_WIDE_INT min_size,
3051 unsigned HOST_WIDE_INT max_size,
3052 unsigned HOST_WIDE_INT probable_max_size)
3053 {
3054 machine_mode mode = GET_MODE (object);
3055 unsigned int align;
3056
3057 gcc_assert (method == BLOCK_OP_NORMAL || method == BLOCK_OP_TAILCALL);
3058
3059 /* If OBJECT is not BLKmode and SIZE is the same size as its mode,
3060 just move a zero. Otherwise, do this a piece at a time. */
3061 poly_int64 size_val;
3062 if (mode != BLKmode
3063 && poly_int_rtx_p (size, &size_val)
3064 && known_eq (size_val, GET_MODE_SIZE (mode)))
3065 {
3066 rtx zero = CONST0_RTX (mode);
3067 if (zero != NULL)
3068 {
3069 emit_move_insn (object, zero);
3070 return NULL;
3071 }
3072
3073 if (COMPLEX_MODE_P (mode))
3074 {
3075 zero = CONST0_RTX (GET_MODE_INNER (mode));
3076 if (zero != NULL)
3077 {
3078 write_complex_part (object, zero, 0);
3079 write_complex_part (object, zero, 1);
3080 return NULL;
3081 }
3082 }
3083 }
3084
3085 if (size == const0_rtx)
3086 return NULL;
3087
3088 align = MEM_ALIGN (object);
3089
3090 if (CONST_INT_P (size)
3091 && targetm.use_by_pieces_infrastructure_p (INTVAL (size), align,
3092 CLEAR_BY_PIECES,
3093 optimize_insn_for_speed_p ()))
3094 clear_by_pieces (object, INTVAL (size), align);
3095 else if (set_storage_via_setmem (object, size, const0_rtx, align,
3096 expected_align, expected_size,
3097 min_size, max_size, probable_max_size))
3098 ;
3099 else if (ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (object)))
3100 return set_storage_via_libcall (object, size, const0_rtx,
3101 method == BLOCK_OP_TAILCALL);
3102 else
3103 gcc_unreachable ();
3104
3105 return NULL;
3106 }
3107
3108 rtx
3109 clear_storage (rtx object, rtx size, enum block_op_methods method)
3110 {
3111 unsigned HOST_WIDE_INT max, min = 0;
3112 if (GET_CODE (size) == CONST_INT)
3113 min = max = UINTVAL (size);
3114 else
3115 max = GET_MODE_MASK (GET_MODE (size));
3116 return clear_storage_hints (object, size, method, 0, -1, min, max, max);
3117 }
3118
3119
3120 /* A subroutine of clear_storage. Expand a call to memset.
3121 Return the return value of memset, 0 otherwise. */
3122
3123 rtx
3124 set_storage_via_libcall (rtx object, rtx size, rtx val, bool tailcall)
3125 {
3126 tree call_expr, fn, object_tree, size_tree, val_tree;
3127 machine_mode size_mode;
3128
3129 object = copy_addr_to_reg (XEXP (object, 0));
3130 object_tree = make_tree (ptr_type_node, object);
3131
3132 if (!CONST_INT_P (val))
3133 val = convert_to_mode (TYPE_MODE (integer_type_node), val, 1);
3134 val_tree = make_tree (integer_type_node, val);
3135
3136 size_mode = TYPE_MODE (sizetype);
3137 size = convert_to_mode (size_mode, size, 1);
3138 size = copy_to_mode_reg (size_mode, size);
3139 size_tree = make_tree (sizetype, size);
3140
3141 /* It is incorrect to use the libcall calling conventions for calls to
3142 memset because it can be provided by the user. */
3143 fn = builtin_decl_implicit (BUILT_IN_MEMSET);
3144 call_expr = build_call_expr (fn, 3, object_tree, val_tree, size_tree);
3145 CALL_EXPR_TAILCALL (call_expr) = tailcall;
3146
3147 return expand_call (call_expr, NULL_RTX, false);
3148 }
3149 \f
3150 /* Expand a setmem pattern; return true if successful. */
3151
3152 bool
3153 set_storage_via_setmem (rtx object, rtx size, rtx val, unsigned int align,
3154 unsigned int expected_align, HOST_WIDE_INT expected_size,
3155 unsigned HOST_WIDE_INT min_size,
3156 unsigned HOST_WIDE_INT max_size,
3157 unsigned HOST_WIDE_INT probable_max_size)
3158 {
3159 /* Try the most limited insn first, because there's no point
3160 including more than one in the machine description unless
3161 the more limited one has some advantage. */
3162
3163 if (expected_align < align)
3164 expected_align = align;
3165 if (expected_size != -1)
3166 {
3167 if ((unsigned HOST_WIDE_INT)expected_size > max_size)
3168 expected_size = max_size;
3169 if ((unsigned HOST_WIDE_INT)expected_size < min_size)
3170 expected_size = min_size;
3171 }
3172
3173 opt_scalar_int_mode mode_iter;
3174 FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_INT)
3175 {
3176 scalar_int_mode mode = mode_iter.require ();
3177 enum insn_code code = direct_optab_handler (setmem_optab, mode);
3178
3179 if (code != CODE_FOR_nothing
3180 /* We don't need MODE to be narrower than BITS_PER_HOST_WIDE_INT
3181 here because if SIZE is less than the mode mask, as it is
3182 returned by the macro, it will definitely be less than the
3183 actual mode mask. Since SIZE is within the Pmode address
3184 space, we limit MODE to Pmode. */
3185 && ((CONST_INT_P (size)
3186 && ((unsigned HOST_WIDE_INT) INTVAL (size)
3187 <= (GET_MODE_MASK (mode) >> 1)))
3188 || max_size <= (GET_MODE_MASK (mode) >> 1)
3189 || GET_MODE_BITSIZE (mode) >= GET_MODE_BITSIZE (Pmode)))
3190 {
3191 class expand_operand ops[9];
3192 unsigned int nops;
3193
3194 nops = insn_data[(int) code].n_generator_args;
3195 gcc_assert (nops == 4 || nops == 6 || nops == 8 || nops == 9);
3196
3197 create_fixed_operand (&ops[0], object);
3198 /* The check above guarantees that this size conversion is valid. */
3199 create_convert_operand_to (&ops[1], size, mode, true);
3200 create_convert_operand_from (&ops[2], val, byte_mode, true);
3201 create_integer_operand (&ops[3], align / BITS_PER_UNIT);
3202 if (nops >= 6)
3203 {
3204 create_integer_operand (&ops[4], expected_align / BITS_PER_UNIT);
3205 create_integer_operand (&ops[5], expected_size);
3206 }
3207 if (nops >= 8)
3208 {
3209 create_integer_operand (&ops[6], min_size);
3210 /* If we cannot represent the maximal size,
3211 make parameter NULL. */
3212 if ((HOST_WIDE_INT) max_size != -1)
3213 create_integer_operand (&ops[7], max_size);
3214 else
3215 create_fixed_operand (&ops[7], NULL);
3216 }
3217 if (nops == 9)
3218 {
3219 /* If we cannot represent the maximal size,
3220 make parameter NULL. */
3221 if ((HOST_WIDE_INT) probable_max_size != -1)
3222 create_integer_operand (&ops[8], probable_max_size);
3223 else
3224 create_fixed_operand (&ops[8], NULL);
3225 }
3226 if (maybe_expand_insn (code, nops, ops))
3227 return true;
3228 }
3229 }
3230
3231 return false;
3232 }
3233
3234 \f
3235 /* Write to one of the components of the complex value CPLX. Write VAL to
3236 the real part if IMAG_P is false, and the imaginary part if its true. */
3237
3238 void
3239 write_complex_part (rtx cplx, rtx val, bool imag_p)
3240 {
3241 machine_mode cmode;
3242 scalar_mode imode;
3243 unsigned ibitsize;
3244
3245 if (GET_CODE (cplx) == CONCAT)
3246 {
3247 emit_move_insn (XEXP (cplx, imag_p), val);
3248 return;
3249 }
3250
3251 cmode = GET_MODE (cplx);
3252 imode = GET_MODE_INNER (cmode);
3253 ibitsize = GET_MODE_BITSIZE (imode);
3254
3255 /* For MEMs simplify_gen_subreg may generate an invalid new address
3256 because, e.g., the original address is considered mode-dependent
3257 by the target, which restricts simplify_subreg from invoking
3258 adjust_address_nv. Instead of preparing fallback support for an
3259 invalid address, we call adjust_address_nv directly. */
3260 if (MEM_P (cplx))
3261 {
3262 emit_move_insn (adjust_address_nv (cplx, imode,
3263 imag_p ? GET_MODE_SIZE (imode) : 0),
3264 val);
3265 return;
3266 }
3267
3268 /* If the sub-object is at least word sized, then we know that subregging
3269 will work. This special case is important, since store_bit_field
3270 wants to operate on integer modes, and there's rarely an OImode to
3271 correspond to TCmode. */
3272 if (ibitsize >= BITS_PER_WORD
3273 /* For hard regs we have exact predicates. Assume we can split
3274 the original object if it spans an even number of hard regs.
3275 This special case is important for SCmode on 64-bit platforms
3276 where the natural size of floating-point regs is 32-bit. */
3277 || (REG_P (cplx)
3278 && REGNO (cplx) < FIRST_PSEUDO_REGISTER
3279 && REG_NREGS (cplx) % 2 == 0))
3280 {
3281 rtx part = simplify_gen_subreg (imode, cplx, cmode,
3282 imag_p ? GET_MODE_SIZE (imode) : 0);
3283 if (part)
3284 {
3285 emit_move_insn (part, val);
3286 return;
3287 }
3288 else
3289 /* simplify_gen_subreg may fail for sub-word MEMs. */
3290 gcc_assert (MEM_P (cplx) && ibitsize < BITS_PER_WORD);
3291 }
3292
3293 store_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0, 0, 0, imode, val,
3294 false);
3295 }
3296
3297 /* Extract one of the components of the complex value CPLX. Extract the
3298 real part if IMAG_P is false, and the imaginary part if it's true. */
3299
3300 rtx
3301 read_complex_part (rtx cplx, bool imag_p)
3302 {
3303 machine_mode cmode;
3304 scalar_mode imode;
3305 unsigned ibitsize;
3306
3307 if (GET_CODE (cplx) == CONCAT)
3308 return XEXP (cplx, imag_p);
3309
3310 cmode = GET_MODE (cplx);
3311 imode = GET_MODE_INNER (cmode);
3312 ibitsize = GET_MODE_BITSIZE (imode);
3313
3314 /* Special case reads from complex constants that got spilled to memory. */
3315 if (MEM_P (cplx) && GET_CODE (XEXP (cplx, 0)) == SYMBOL_REF)
3316 {
3317 tree decl = SYMBOL_REF_DECL (XEXP (cplx, 0));
3318 if (decl && TREE_CODE (decl) == COMPLEX_CST)
3319 {
3320 tree part = imag_p ? TREE_IMAGPART (decl) : TREE_REALPART (decl);
3321 if (CONSTANT_CLASS_P (part))
3322 return expand_expr (part, NULL_RTX, imode, EXPAND_NORMAL);
3323 }
3324 }
3325
3326 /* For MEMs simplify_gen_subreg may generate an invalid new address
3327 because, e.g., the original address is considered mode-dependent
3328 by the target, which restricts simplify_subreg from invoking
3329 adjust_address_nv. Instead of preparing fallback support for an
3330 invalid address, we call adjust_address_nv directly. */
3331 if (MEM_P (cplx))
3332 return adjust_address_nv (cplx, imode,
3333 imag_p ? GET_MODE_SIZE (imode) : 0);
3334
3335 /* If the sub-object is at least word sized, then we know that subregging
3336 will work. This special case is important, since extract_bit_field
3337 wants to operate on integer modes, and there's rarely an OImode to
3338 correspond to TCmode. */
3339 if (ibitsize >= BITS_PER_WORD
3340 /* For hard regs we have exact predicates. Assume we can split
3341 the original object if it spans an even number of hard regs.
3342 This special case is important for SCmode on 64-bit platforms
3343 where the natural size of floating-point regs is 32-bit. */
3344 || (REG_P (cplx)
3345 && REGNO (cplx) < FIRST_PSEUDO_REGISTER
3346 && REG_NREGS (cplx) % 2 == 0))
3347 {
3348 rtx ret = simplify_gen_subreg (imode, cplx, cmode,
3349 imag_p ? GET_MODE_SIZE (imode) : 0);
3350 if (ret)
3351 return ret;
3352 else
3353 /* simplify_gen_subreg may fail for sub-word MEMs. */
3354 gcc_assert (MEM_P (cplx) && ibitsize < BITS_PER_WORD);
3355 }
3356
3357 return extract_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0,
3358 true, NULL_RTX, imode, imode, false, NULL);
3359 }
3360 \f
3361 /* A subroutine of emit_move_insn_1. Yet another lowpart generator.
3362 NEW_MODE and OLD_MODE are the same size. Return NULL if X cannot be
3363 represented in NEW_MODE. If FORCE is true, this will never happen, as
3364 we'll force-create a SUBREG if needed. */
3365
3366 static rtx
3367 emit_move_change_mode (machine_mode new_mode,
3368 machine_mode old_mode, rtx x, bool force)
3369 {
3370 rtx ret;
3371
3372 if (push_operand (x, GET_MODE (x)))
3373 {
3374 ret = gen_rtx_MEM (new_mode, XEXP (x, 0));
3375 MEM_COPY_ATTRIBUTES (ret, x);
3376 }
3377 else if (MEM_P (x))
3378 {
3379 /* We don't have to worry about changing the address since the
3380 size in bytes is supposed to be the same. */
3381 if (reload_in_progress)
3382 {
3383 /* Copy the MEM to change the mode and move any
3384 substitutions from the old MEM to the new one. */
3385 ret = adjust_address_nv (x, new_mode, 0);
3386 copy_replacements (x, ret);
3387 }
3388 else
3389 ret = adjust_address (x, new_mode, 0);
3390 }
3391 else
3392 {
3393 /* Note that we do want simplify_subreg's behavior of validating
3394 that the new mode is ok for a hard register. If we were to use
3395 simplify_gen_subreg, we would create the subreg, but would
3396 probably run into the target not being able to implement it. */
3397 /* Except, of course, when FORCE is true, when this is exactly what
3398 we want. Which is needed for CCmodes on some targets. */
3399 if (force)
3400 ret = simplify_gen_subreg (new_mode, x, old_mode, 0);
3401 else
3402 ret = simplify_subreg (new_mode, x, old_mode, 0);
3403 }
3404
3405 return ret;
3406 }
3407
3408 /* A subroutine of emit_move_insn_1. Generate a move from Y into X using
3409 an integer mode of the same size as MODE. Returns the instruction
3410 emitted, or NULL if such a move could not be generated. */
3411
3412 static rtx_insn *
3413 emit_move_via_integer (machine_mode mode, rtx x, rtx y, bool force)
3414 {
3415 scalar_int_mode imode;
3416 enum insn_code code;
3417
3418 /* There must exist a mode of the exact size we require. */
3419 if (!int_mode_for_mode (mode).exists (&imode))
3420 return NULL;
3421
3422 /* The target must support moves in this mode. */
3423 code = optab_handler (mov_optab, imode);
3424 if (code == CODE_FOR_nothing)
3425 return NULL;
3426
3427 x = emit_move_change_mode (imode, mode, x, force);
3428 if (x == NULL_RTX)
3429 return NULL;
3430 y = emit_move_change_mode (imode, mode, y, force);
3431 if (y == NULL_RTX)
3432 return NULL;
3433 return emit_insn (GEN_FCN (code) (x, y));
3434 }
3435
3436 /* A subroutine of emit_move_insn_1. X is a push_operand in MODE.
3437 Return an equivalent MEM that does not use an auto-increment. */
3438
3439 rtx
3440 emit_move_resolve_push (machine_mode mode, rtx x)
3441 {
3442 enum rtx_code code = GET_CODE (XEXP (x, 0));
3443 rtx temp;
3444
3445 poly_int64 adjust = GET_MODE_SIZE (mode);
3446 #ifdef PUSH_ROUNDING
3447 adjust = PUSH_ROUNDING (adjust);
3448 #endif
3449 if (code == PRE_DEC || code == POST_DEC)
3450 adjust = -adjust;
3451 else if (code == PRE_MODIFY || code == POST_MODIFY)
3452 {
3453 rtx expr = XEXP (XEXP (x, 0), 1);
3454
3455 gcc_assert (GET_CODE (expr) == PLUS || GET_CODE (expr) == MINUS);
3456 poly_int64 val = rtx_to_poly_int64 (XEXP (expr, 1));
3457 if (GET_CODE (expr) == MINUS)
3458 val = -val;
3459 gcc_assert (known_eq (adjust, val) || known_eq (adjust, -val));
3460 adjust = val;
3461 }
3462
3463 /* Do not use anti_adjust_stack, since we don't want to update
3464 stack_pointer_delta. */
3465 temp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
3466 gen_int_mode (adjust, Pmode), stack_pointer_rtx,
3467 0, OPTAB_LIB_WIDEN);
3468 if (temp != stack_pointer_rtx)
3469 emit_move_insn (stack_pointer_rtx, temp);
3470
3471 switch (code)
3472 {
3473 case PRE_INC:
3474 case PRE_DEC:
3475 case PRE_MODIFY:
3476 temp = stack_pointer_rtx;
3477 break;
3478 case POST_INC:
3479 case POST_DEC:
3480 case POST_MODIFY:
3481 temp = plus_constant (Pmode, stack_pointer_rtx, -adjust);
3482 break;
3483 default:
3484 gcc_unreachable ();
3485 }
3486
3487 return replace_equiv_address (x, temp);
3488 }
3489
3490 /* A subroutine of emit_move_complex. Generate a move from Y into X.
3491 X is known to satisfy push_operand, and MODE is known to be complex.
3492 Returns the last instruction emitted. */
3493
3494 rtx_insn *
3495 emit_move_complex_push (machine_mode mode, rtx x, rtx y)
3496 {
3497 scalar_mode submode = GET_MODE_INNER (mode);
3498 bool imag_first;
3499
3500 #ifdef PUSH_ROUNDING
3501 poly_int64 submodesize = GET_MODE_SIZE (submode);
3502
3503 /* In case we output to the stack, but the size is smaller than the
3504 machine can push exactly, we need to use move instructions. */
3505 if (maybe_ne (PUSH_ROUNDING (submodesize), submodesize))
3506 {
3507 x = emit_move_resolve_push (mode, x);
3508 return emit_move_insn (x, y);
3509 }
3510 #endif
3511
3512 /* Note that the real part always precedes the imag part in memory
3513 regardless of machine's endianness. */
3514 switch (GET_CODE (XEXP (x, 0)))
3515 {
3516 case PRE_DEC:
3517 case POST_DEC:
3518 imag_first = true;
3519 break;
3520 case PRE_INC:
3521 case POST_INC:
3522 imag_first = false;
3523 break;
3524 default:
3525 gcc_unreachable ();
3526 }
3527
3528 emit_move_insn (gen_rtx_MEM (submode, XEXP (x, 0)),
3529 read_complex_part (y, imag_first));
3530 return emit_move_insn (gen_rtx_MEM (submode, XEXP (x, 0)),
3531 read_complex_part (y, !imag_first));
3532 }
3533
3534 /* A subroutine of emit_move_complex. Perform the move from Y to X
3535 via two moves of the parts. Returns the last instruction emitted. */
3536
3537 rtx_insn *
3538 emit_move_complex_parts (rtx x, rtx y)
3539 {
3540 /* Show the output dies here. This is necessary for SUBREGs
3541 of pseudos since we cannot track their lifetimes correctly;
3542 hard regs shouldn't appear here except as return values. */
3543 if (!reload_completed && !reload_in_progress
3544 && REG_P (x) && !reg_overlap_mentioned_p (x, y))
3545 emit_clobber (x);
3546
3547 write_complex_part (x, read_complex_part (y, false), false);
3548 write_complex_part (x, read_complex_part (y, true), true);
3549
3550 return get_last_insn ();
3551 }
3552
3553 /* A subroutine of emit_move_insn_1. Generate a move from Y into X.
3554 MODE is known to be complex. Returns the last instruction emitted. */
3555
3556 static rtx_insn *
3557 emit_move_complex (machine_mode mode, rtx x, rtx y)
3558 {
3559 bool try_int;
3560
3561 /* Need to take special care for pushes, to maintain proper ordering
3562 of the data, and possibly extra padding. */
3563 if (push_operand (x, mode))
3564 return emit_move_complex_push (mode, x, y);
3565
3566 /* See if we can coerce the target into moving both values at once, except
3567 for floating point where we favor moving as parts if this is easy. */
3568 if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
3569 && optab_handler (mov_optab, GET_MODE_INNER (mode)) != CODE_FOR_nothing
3570 && !(REG_P (x)
3571 && HARD_REGISTER_P (x)
3572 && REG_NREGS (x) == 1)
3573 && !(REG_P (y)
3574 && HARD_REGISTER_P (y)
3575 && REG_NREGS (y) == 1))
3576 try_int = false;
3577 /* Not possible if the values are inherently not adjacent. */
3578 else if (GET_CODE (x) == CONCAT || GET_CODE (y) == CONCAT)
3579 try_int = false;
3580 /* Is possible if both are registers (or subregs of registers). */
3581 else if (register_operand (x, mode) && register_operand (y, mode))
3582 try_int = true;
3583 /* If one of the operands is a memory, and alignment constraints
3584 are friendly enough, we may be able to do combined memory operations.
3585 We do not attempt this if Y is a constant because that combination is
3586 usually better with the by-parts thing below. */
3587 else if ((MEM_P (x) ? !CONSTANT_P (y) : MEM_P (y))
3588 && (!STRICT_ALIGNMENT
3589 || get_mode_alignment (mode) == BIGGEST_ALIGNMENT))
3590 try_int = true;
3591 else
3592 try_int = false;
3593
3594 if (try_int)
3595 {
3596 rtx_insn *ret;
3597
3598 /* For memory to memory moves, optimal behavior can be had with the
3599 existing block move logic. But use normal expansion if optimizing
3600 for size. */
3601 if (MEM_P (x) && MEM_P (y))
3602 {
3603 emit_block_move (x, y, gen_int_mode (GET_MODE_SIZE (mode), Pmode),
3604 (optimize_insn_for_speed_p()
3605 ? BLOCK_OP_NO_LIBCALL : BLOCK_OP_NORMAL));
3606 return get_last_insn ();
3607 }
3608
3609 ret = emit_move_via_integer (mode, x, y, true);
3610 if (ret)
3611 return ret;
3612 }
3613
3614 return emit_move_complex_parts (x, y);
3615 }
3616
3617 /* A subroutine of emit_move_insn_1. Generate a move from Y into X.
3618 MODE is known to be MODE_CC. Returns the last instruction emitted. */
3619
3620 static rtx_insn *
3621 emit_move_ccmode (machine_mode mode, rtx x, rtx y)
3622 {
3623 rtx_insn *ret;
3624
3625 /* Assume all MODE_CC modes are equivalent; if we have movcc, use it. */
3626 if (mode != CCmode)
3627 {
3628 enum insn_code code = optab_handler (mov_optab, CCmode);
3629 if (code != CODE_FOR_nothing)
3630 {
3631 x = emit_move_change_mode (CCmode, mode, x, true);
3632 y = emit_move_change_mode (CCmode, mode, y, true);
3633 return emit_insn (GEN_FCN (code) (x, y));
3634 }
3635 }
3636
3637 /* Otherwise, find the MODE_INT mode of the same width. */
3638 ret = emit_move_via_integer (mode, x, y, false);
3639 gcc_assert (ret != NULL);
3640 return ret;
3641 }
3642
3643 /* Return true if word I of OP lies entirely in the
3644 undefined bits of a paradoxical subreg. */
3645
3646 static bool
3647 undefined_operand_subword_p (const_rtx op, int i)
3648 {
3649 if (GET_CODE (op) != SUBREG)
3650 return false;
3651 machine_mode innermostmode = GET_MODE (SUBREG_REG (op));
3652 poly_int64 offset = i * UNITS_PER_WORD + subreg_memory_offset (op);
3653 return (known_ge (offset, GET_MODE_SIZE (innermostmode))
3654 || known_le (offset, -UNITS_PER_WORD));
3655 }
3656
3657 /* A subroutine of emit_move_insn_1. Generate a move from Y into X.
3658 MODE is any multi-word or full-word mode that lacks a move_insn
3659 pattern. Note that you will get better code if you define such
3660 patterns, even if they must turn into multiple assembler instructions. */
3661
3662 static rtx_insn *
3663 emit_move_multi_word (machine_mode mode, rtx x, rtx y)
3664 {
3665 rtx_insn *last_insn = 0;
3666 rtx_insn *seq;
3667 rtx inner;
3668 bool need_clobber;
3669 int i, mode_size;
3670
3671 /* This function can only handle cases where the number of words is
3672 known at compile time. */
3673 mode_size = GET_MODE_SIZE (mode).to_constant ();
3674 gcc_assert (mode_size >= UNITS_PER_WORD);
3675
3676 /* If X is a push on the stack, do the push now and replace
3677 X with a reference to the stack pointer. */
3678 if (push_operand (x, mode))
3679 x = emit_move_resolve_push (mode, x);
3680
3681 /* If we are in reload, see if either operand is a MEM whose address
3682 is scheduled for replacement. */
3683 if (reload_in_progress && MEM_P (x)
3684 && (inner = find_replacement (&XEXP (x, 0))) != XEXP (x, 0))
3685 x = replace_equiv_address_nv (x, inner);
3686 if (reload_in_progress && MEM_P (y)
3687 && (inner = find_replacement (&XEXP (y, 0))) != XEXP (y, 0))
3688 y = replace_equiv_address_nv (y, inner);
3689
3690 start_sequence ();
3691
3692 need_clobber = false;
3693 for (i = 0; i < CEIL (mode_size, UNITS_PER_WORD); i++)
3694 {
3695 rtx xpart = operand_subword (x, i, 1, mode);
3696 rtx ypart;
3697
3698 /* Do not generate code for a move if it would come entirely
3699 from the undefined bits of a paradoxical subreg. */
3700 if (undefined_operand_subword_p (y, i))
3701 continue;
3702
3703 ypart = operand_subword (y, i, 1, mode);
3704
3705 /* If we can't get a part of Y, put Y into memory if it is a
3706 constant. Otherwise, force it into a register. Then we must
3707 be able to get a part of Y. */
3708 if (ypart == 0 && CONSTANT_P (y))
3709 {
3710 y = use_anchored_address (force_const_mem (mode, y));
3711 ypart = operand_subword (y, i, 1, mode);
3712 }
3713 else if (ypart == 0)
3714 ypart = operand_subword_force (y, i, mode);
3715
3716 gcc_assert (xpart && ypart);
3717
3718 need_clobber |= (GET_CODE (xpart) == SUBREG);
3719
3720 last_insn = emit_move_insn (xpart, ypart);
3721 }
3722
3723 seq = get_insns ();
3724 end_sequence ();
3725
3726 /* Show the output dies here. This is necessary for SUBREGs
3727 of pseudos since we cannot track their lifetimes correctly;
3728 hard regs shouldn't appear here except as return values.
3729 We never want to emit such a clobber after reload. */
3730 if (x != y
3731 && ! (reload_in_progress || reload_completed)
3732 && need_clobber != 0)
3733 emit_clobber (x);
3734
3735 emit_insn (seq);
3736
3737 return last_insn;
3738 }
3739
3740 /* Low level part of emit_move_insn.
3741 Called just like emit_move_insn, but assumes X and Y
3742 are basically valid. */
3743
3744 rtx_insn *
3745 emit_move_insn_1 (rtx x, rtx y)
3746 {
3747 machine_mode mode = GET_MODE (x);
3748 enum insn_code code;
3749
3750 gcc_assert ((unsigned int) mode < (unsigned int) MAX_MACHINE_MODE);
3751
3752 code = optab_handler (mov_optab, mode);
3753 if (code != CODE_FOR_nothing)
3754 return emit_insn (GEN_FCN (code) (x, y));
3755
3756 /* Expand complex moves by moving real part and imag part. */
3757 if (COMPLEX_MODE_P (mode))
3758 return emit_move_complex (mode, x, y);
3759
3760 if (GET_MODE_CLASS (mode) == MODE_DECIMAL_FLOAT
3761 || ALL_FIXED_POINT_MODE_P (mode))
3762 {
3763 rtx_insn *result = emit_move_via_integer (mode, x, y, true);
3764
3765 /* If we can't find an integer mode, use multi words. */
3766 if (result)
3767 return result;
3768 else
3769 return emit_move_multi_word (mode, x, y);
3770 }
3771
3772 if (GET_MODE_CLASS (mode) == MODE_CC)
3773 return emit_move_ccmode (mode, x, y);
3774
3775 /* Try using a move pattern for the corresponding integer mode. This is
3776 only safe when simplify_subreg can convert MODE constants into integer
3777 constants. At present, it can only do this reliably if the value
3778 fits within a HOST_WIDE_INT. */
3779 if (!CONSTANT_P (y)
3780 || known_le (GET_MODE_BITSIZE (mode), HOST_BITS_PER_WIDE_INT))
3781 {
3782 rtx_insn *ret = emit_move_via_integer (mode, x, y, lra_in_progress);
3783
3784 if (ret)
3785 {
3786 if (! lra_in_progress || recog (PATTERN (ret), ret, 0) >= 0)
3787 return ret;
3788 }
3789 }
3790
3791 return emit_move_multi_word (mode, x, y);
3792 }
3793
3794 /* Generate code to copy Y into X.
3795 Both Y and X must have the same mode, except that
3796 Y can be a constant with VOIDmode.
3797 This mode cannot be BLKmode; use emit_block_move for that.
3798
3799 Return the last instruction emitted. */
3800
3801 rtx_insn *
3802 emit_move_insn (rtx x, rtx y)
3803 {
3804 machine_mode mode = GET_MODE (x);
3805 rtx y_cst = NULL_RTX;
3806 rtx_insn *last_insn;
3807 rtx set;
3808
3809 gcc_assert (mode != BLKmode
3810 && (GET_MODE (y) == mode || GET_MODE (y) == VOIDmode));
3811
3812 if (CONSTANT_P (y))
3813 {
3814 if (optimize
3815 && SCALAR_FLOAT_MODE_P (GET_MODE (x))
3816 && (last_insn = compress_float_constant (x, y)))
3817 return last_insn;
3818
3819 y_cst = y;
3820
3821 if (!targetm.legitimate_constant_p (mode, y))
3822 {
3823 y = force_const_mem (mode, y);
3824
3825 /* If the target's cannot_force_const_mem prevented the spill,
3826 assume that the target's move expanders will also take care
3827 of the non-legitimate constant. */
3828 if (!y)
3829 y = y_cst;
3830 else
3831 y = use_anchored_address (y);
3832 }
3833 }
3834
3835 /* If X or Y are memory references, verify that their addresses are valid
3836 for the machine. */
3837 if (MEM_P (x)
3838 && (! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
3839 MEM_ADDR_SPACE (x))
3840 && ! push_operand (x, GET_MODE (x))))
3841 x = validize_mem (x);
3842
3843 if (MEM_P (y)
3844 && ! memory_address_addr_space_p (GET_MODE (y), XEXP (y, 0),
3845 MEM_ADDR_SPACE (y)))
3846 y = validize_mem (y);
3847
3848 gcc_assert (mode != BLKmode);
3849
3850 last_insn = emit_move_insn_1 (x, y);
3851
3852 if (y_cst && REG_P (x)
3853 && (set = single_set (last_insn)) != NULL_RTX
3854 && SET_DEST (set) == x
3855 && ! rtx_equal_p (y_cst, SET_SRC (set)))
3856 set_unique_reg_note (last_insn, REG_EQUAL, copy_rtx (y_cst));
3857
3858 return last_insn;
3859 }
3860
3861 /* Generate the body of an instruction to copy Y into X.
3862 It may be a list of insns, if one insn isn't enough. */
3863
3864 rtx_insn *
3865 gen_move_insn (rtx x, rtx y)
3866 {
3867 rtx_insn *seq;
3868
3869 start_sequence ();
3870 emit_move_insn_1 (x, y);
3871 seq = get_insns ();
3872 end_sequence ();
3873 return seq;
3874 }
3875
3876 /* If Y is representable exactly in a narrower mode, and the target can
3877 perform the extension directly from constant or memory, then emit the
3878 move as an extension. */
3879
3880 static rtx_insn *
3881 compress_float_constant (rtx x, rtx y)
3882 {
3883 machine_mode dstmode = GET_MODE (x);
3884 machine_mode orig_srcmode = GET_MODE (y);
3885 machine_mode srcmode;
3886 const REAL_VALUE_TYPE *r;
3887 int oldcost, newcost;
3888 bool speed = optimize_insn_for_speed_p ();
3889
3890 r = CONST_DOUBLE_REAL_VALUE (y);
3891
3892 if (targetm.legitimate_constant_p (dstmode, y))
3893 oldcost = set_src_cost (y, orig_srcmode, speed);
3894 else
3895 oldcost = set_src_cost (force_const_mem (dstmode, y), dstmode, speed);
3896
3897 FOR_EACH_MODE_UNTIL (srcmode, orig_srcmode)
3898 {
3899 enum insn_code ic;
3900 rtx trunc_y;
3901 rtx_insn *last_insn;
3902
3903 /* Skip if the target can't extend this way. */
3904 ic = can_extend_p (dstmode, srcmode, 0);
3905 if (ic == CODE_FOR_nothing)
3906 continue;
3907
3908 /* Skip if the narrowed value isn't exact. */
3909 if (! exact_real_truncate (srcmode, r))
3910 continue;
3911
3912 trunc_y = const_double_from_real_value (*r, srcmode);
3913
3914 if (targetm.legitimate_constant_p (srcmode, trunc_y))
3915 {
3916 /* Skip if the target needs extra instructions to perform
3917 the extension. */
3918 if (!insn_operand_matches (ic, 1, trunc_y))
3919 continue;
3920 /* This is valid, but may not be cheaper than the original. */
3921 newcost = set_src_cost (gen_rtx_FLOAT_EXTEND (dstmode, trunc_y),
3922 dstmode, speed);
3923 if (oldcost < newcost)
3924 continue;
3925 }
3926 else if (float_extend_from_mem[dstmode][srcmode])
3927 {
3928 trunc_y = force_const_mem (srcmode, trunc_y);
3929 /* This is valid, but may not be cheaper than the original. */
3930 newcost = set_src_cost (gen_rtx_FLOAT_EXTEND (dstmode, trunc_y),
3931 dstmode, speed);
3932 if (oldcost < newcost)
3933 continue;
3934 trunc_y = validize_mem (trunc_y);
3935 }
3936 else
3937 continue;
3938
3939 /* For CSE's benefit, force the compressed constant pool entry
3940 into a new pseudo. This constant may be used in different modes,
3941 and if not, combine will put things back together for us. */
3942 trunc_y = force_reg (srcmode, trunc_y);
3943
3944 /* If x is a hard register, perform the extension into a pseudo,
3945 so that e.g. stack realignment code is aware of it. */
3946 rtx target = x;
3947 if (REG_P (x) && HARD_REGISTER_P (x))
3948 target = gen_reg_rtx (dstmode);
3949
3950 emit_unop_insn (ic, target, trunc_y, UNKNOWN);
3951 last_insn = get_last_insn ();
3952
3953 if (REG_P (target))
3954 set_unique_reg_note (last_insn, REG_EQUAL, y);
3955
3956 if (target != x)
3957 return emit_move_insn (x, target);
3958 return last_insn;
3959 }
3960
3961 return NULL;
3962 }
3963 \f
3964 /* Pushing data onto the stack. */
3965
3966 /* Push a block of length SIZE (perhaps variable)
3967 and return an rtx to address the beginning of the block.
3968 The value may be virtual_outgoing_args_rtx.
3969
3970 EXTRA is the number of bytes of padding to push in addition to SIZE.
3971 BELOW nonzero means this padding comes at low addresses;
3972 otherwise, the padding comes at high addresses. */
3973
3974 rtx
3975 push_block (rtx size, poly_int64 extra, int below)
3976 {
3977 rtx temp;
3978
3979 size = convert_modes (Pmode, ptr_mode, size, 1);
3980 if (CONSTANT_P (size))
3981 anti_adjust_stack (plus_constant (Pmode, size, extra));
3982 else if (REG_P (size) && known_eq (extra, 0))
3983 anti_adjust_stack (size);
3984 else
3985 {
3986 temp = copy_to_mode_reg (Pmode, size);
3987 if (maybe_ne (extra, 0))
3988 temp = expand_binop (Pmode, add_optab, temp,
3989 gen_int_mode (extra, Pmode),
3990 temp, 0, OPTAB_LIB_WIDEN);
3991 anti_adjust_stack (temp);
3992 }
3993
3994 if (STACK_GROWS_DOWNWARD)
3995 {
3996 temp = virtual_outgoing_args_rtx;
3997 if (maybe_ne (extra, 0) && below)
3998 temp = plus_constant (Pmode, temp, extra);
3999 }
4000 else
4001 {
4002 poly_int64 csize;
4003 if (poly_int_rtx_p (size, &csize))
4004 temp = plus_constant (Pmode, virtual_outgoing_args_rtx,
4005 -csize - (below ? 0 : extra));
4006 else if (maybe_ne (extra, 0) && !below)
4007 temp = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx,
4008 negate_rtx (Pmode, plus_constant (Pmode, size,
4009 extra)));
4010 else
4011 temp = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx,
4012 negate_rtx (Pmode, size));
4013 }
4014
4015 return memory_address (NARROWEST_INT_MODE, temp);
4016 }
4017
4018 /* A utility routine that returns the base of an auto-inc memory, or NULL. */
4019
4020 static rtx
4021 mem_autoinc_base (rtx mem)
4022 {
4023 if (MEM_P (mem))
4024 {
4025 rtx addr = XEXP (mem, 0);
4026 if (GET_RTX_CLASS (GET_CODE (addr)) == RTX_AUTOINC)
4027 return XEXP (addr, 0);
4028 }
4029 return NULL;
4030 }
4031
4032 /* A utility routine used here, in reload, and in try_split. The insns
4033 after PREV up to and including LAST are known to adjust the stack,
4034 with a final value of END_ARGS_SIZE. Iterate backward from LAST
4035 placing notes as appropriate. PREV may be NULL, indicating the
4036 entire insn sequence prior to LAST should be scanned.
4037
4038 The set of allowed stack pointer modifications is small:
4039 (1) One or more auto-inc style memory references (aka pushes),
4040 (2) One or more addition/subtraction with the SP as destination,
4041 (3) A single move insn with the SP as destination,
4042 (4) A call_pop insn,
4043 (5) Noreturn call insns if !ACCUMULATE_OUTGOING_ARGS.
4044
4045 Insns in the sequence that do not modify the SP are ignored,
4046 except for noreturn calls.
4047
4048 The return value is the amount of adjustment that can be trivially
4049 verified, via immediate operand or auto-inc. If the adjustment
4050 cannot be trivially extracted, the return value is HOST_WIDE_INT_MIN. */
4051
4052 poly_int64
4053 find_args_size_adjust (rtx_insn *insn)
4054 {
4055 rtx dest, set, pat;
4056 int i;
4057
4058 pat = PATTERN (insn);
4059 set = NULL;
4060
4061 /* Look for a call_pop pattern. */
4062 if (CALL_P (insn))
4063 {
4064 /* We have to allow non-call_pop patterns for the case
4065 of emit_single_push_insn of a TLS address. */
4066 if (GET_CODE (pat) != PARALLEL)
4067 return 0;
4068
4069 /* All call_pop have a stack pointer adjust in the parallel.
4070 The call itself is always first, and the stack adjust is
4071 usually last, so search from the end. */
4072 for (i = XVECLEN (pat, 0) - 1; i > 0; --i)
4073 {
4074 set = XVECEXP (pat, 0, i);
4075 if (GET_CODE (set) != SET)
4076 continue;
4077 dest = SET_DEST (set);
4078 if (dest == stack_pointer_rtx)
4079 break;
4080 }
4081 /* We'd better have found the stack pointer adjust. */
4082 if (i == 0)
4083 return 0;
4084 /* Fall through to process the extracted SET and DEST
4085 as if it was a standalone insn. */
4086 }
4087 else if (GET_CODE (pat) == SET)
4088 set = pat;
4089 else if ((set = single_set (insn)) != NULL)
4090 ;
4091 else if (GET_CODE (pat) == PARALLEL)
4092 {
4093 /* ??? Some older ports use a parallel with a stack adjust
4094 and a store for a PUSH_ROUNDING pattern, rather than a
4095 PRE/POST_MODIFY rtx. Don't force them to update yet... */
4096 /* ??? See h8300 and m68k, pushqi1. */
4097 for (i = XVECLEN (pat, 0) - 1; i >= 0; --i)
4098 {
4099 set = XVECEXP (pat, 0, i);
4100 if (GET_CODE (set) != SET)
4101 continue;
4102 dest = SET_DEST (set);
4103 if (dest == stack_pointer_rtx)
4104 break;
4105
4106 /* We do not expect an auto-inc of the sp in the parallel. */
4107 gcc_checking_assert (mem_autoinc_base (dest) != stack_pointer_rtx);
4108 gcc_checking_assert (mem_autoinc_base (SET_SRC (set))
4109 != stack_pointer_rtx);
4110 }
4111 if (i < 0)
4112 return 0;
4113 }
4114 else
4115 return 0;
4116
4117 dest = SET_DEST (set);
4118
4119 /* Look for direct modifications of the stack pointer. */
4120 if (REG_P (dest) && REGNO (dest) == STACK_POINTER_REGNUM)
4121 {
4122 /* Look for a trivial adjustment, otherwise assume nothing. */
4123 /* Note that the SPU restore_stack_block pattern refers to
4124 the stack pointer in V4SImode. Consider that non-trivial. */
4125 poly_int64 offset;
4126 if (SCALAR_INT_MODE_P (GET_MODE (dest))
4127 && strip_offset (SET_SRC (set), &offset) == stack_pointer_rtx)
4128 return offset;
4129 /* ??? Reload can generate no-op moves, which will be cleaned
4130 up later. Recognize it and continue searching. */
4131 else if (rtx_equal_p (dest, SET_SRC (set)))
4132 return 0;
4133 else
4134 return HOST_WIDE_INT_MIN;
4135 }
4136 else
4137 {
4138 rtx mem, addr;
4139
4140 /* Otherwise only think about autoinc patterns. */
4141 if (mem_autoinc_base (dest) == stack_pointer_rtx)
4142 {
4143 mem = dest;
4144 gcc_checking_assert (mem_autoinc_base (SET_SRC (set))
4145 != stack_pointer_rtx);
4146 }
4147 else if (mem_autoinc_base (SET_SRC (set)) == stack_pointer_rtx)
4148 mem = SET_SRC (set);
4149 else
4150 return 0;
4151
4152 addr = XEXP (mem, 0);
4153 switch (GET_CODE (addr))
4154 {
4155 case PRE_INC:
4156 case POST_INC:
4157 return GET_MODE_SIZE (GET_MODE (mem));
4158 case PRE_DEC:
4159 case POST_DEC:
4160 return -GET_MODE_SIZE (GET_MODE (mem));
4161 case PRE_MODIFY:
4162 case POST_MODIFY:
4163 addr = XEXP (addr, 1);
4164 gcc_assert (GET_CODE (addr) == PLUS);
4165 gcc_assert (XEXP (addr, 0) == stack_pointer_rtx);
4166 return rtx_to_poly_int64 (XEXP (addr, 1));
4167 default:
4168 gcc_unreachable ();
4169 }
4170 }
4171 }
4172
4173 poly_int64
4174 fixup_args_size_notes (rtx_insn *prev, rtx_insn *last,
4175 poly_int64 end_args_size)
4176 {
4177 poly_int64 args_size = end_args_size;
4178 bool saw_unknown = false;
4179 rtx_insn *insn;
4180
4181 for (insn = last; insn != prev; insn = PREV_INSN (insn))
4182 {
4183 if (!NONDEBUG_INSN_P (insn))
4184 continue;
4185
4186 /* We might have existing REG_ARGS_SIZE notes, e.g. when pushing
4187 a call argument containing a TLS address that itself requires
4188 a call to __tls_get_addr. The handling of stack_pointer_delta
4189 in emit_single_push_insn is supposed to ensure that any such
4190 notes are already correct. */
4191 rtx note = find_reg_note (insn, REG_ARGS_SIZE, NULL_RTX);
4192 gcc_assert (!note || known_eq (args_size, get_args_size (note)));
4193
4194 poly_int64 this_delta = find_args_size_adjust (insn);
4195 if (known_eq (this_delta, 0))
4196 {
4197 if (!CALL_P (insn)
4198 || ACCUMULATE_OUTGOING_ARGS
4199 || find_reg_note (insn, REG_NORETURN, NULL_RTX) == NULL_RTX)
4200 continue;
4201 }
4202
4203 gcc_assert (!saw_unknown);
4204 if (known_eq (this_delta, HOST_WIDE_INT_MIN))
4205 saw_unknown = true;
4206
4207 if (!note)
4208 add_args_size_note (insn, args_size);
4209 if (STACK_GROWS_DOWNWARD)
4210 this_delta = -poly_uint64 (this_delta);
4211
4212 if (saw_unknown)
4213 args_size = HOST_WIDE_INT_MIN;
4214 else
4215 args_size -= this_delta;
4216 }
4217
4218 return args_size;
4219 }
4220
4221 #ifdef PUSH_ROUNDING
4222 /* Emit single push insn. */
4223
4224 static void
4225 emit_single_push_insn_1 (machine_mode mode, rtx x, tree type)
4226 {
4227 rtx dest_addr;
4228 poly_int64 rounded_size = PUSH_ROUNDING (GET_MODE_SIZE (mode));
4229 rtx dest;
4230 enum insn_code icode;
4231
4232 /* If there is push pattern, use it. Otherwise try old way of throwing
4233 MEM representing push operation to move expander. */
4234 icode = optab_handler (push_optab, mode);
4235 if (icode != CODE_FOR_nothing)
4236 {
4237 class expand_operand ops[1];
4238
4239 create_input_operand (&ops[0], x, mode);
4240 if (maybe_expand_insn (icode, 1, ops))
4241 return;
4242 }
4243 if (known_eq (GET_MODE_SIZE (mode), rounded_size))
4244 dest_addr = gen_rtx_fmt_e (STACK_PUSH_CODE, Pmode, stack_pointer_rtx);
4245 /* If we are to pad downward, adjust the stack pointer first and
4246 then store X into the stack location using an offset. This is
4247 because emit_move_insn does not know how to pad; it does not have
4248 access to type. */
4249 else if (targetm.calls.function_arg_padding (mode, type) == PAD_DOWNWARD)
4250 {
4251 emit_move_insn (stack_pointer_rtx,
4252 expand_binop (Pmode,
4253 STACK_GROWS_DOWNWARD ? sub_optab
4254 : add_optab,
4255 stack_pointer_rtx,
4256 gen_int_mode (rounded_size, Pmode),
4257 NULL_RTX, 0, OPTAB_LIB_WIDEN));
4258
4259 poly_int64 offset = rounded_size - GET_MODE_SIZE (mode);
4260 if (STACK_GROWS_DOWNWARD && STACK_PUSH_CODE == POST_DEC)
4261 /* We have already decremented the stack pointer, so get the
4262 previous value. */
4263 offset += rounded_size;
4264
4265 if (!STACK_GROWS_DOWNWARD && STACK_PUSH_CODE == POST_INC)
4266 /* We have already incremented the stack pointer, so get the
4267 previous value. */
4268 offset -= rounded_size;
4269
4270 dest_addr = plus_constant (Pmode, stack_pointer_rtx, offset);
4271 }
4272 else
4273 {
4274 if (STACK_GROWS_DOWNWARD)
4275 /* ??? This seems wrong if STACK_PUSH_CODE == POST_DEC. */
4276 dest_addr = plus_constant (Pmode, stack_pointer_rtx, -rounded_size);
4277 else
4278 /* ??? This seems wrong if STACK_PUSH_CODE == POST_INC. */
4279 dest_addr = plus_constant (Pmode, stack_pointer_rtx, rounded_size);
4280
4281 dest_addr = gen_rtx_PRE_MODIFY (Pmode, stack_pointer_rtx, dest_addr);
4282 }
4283
4284 dest = gen_rtx_MEM (mode, dest_addr);
4285
4286 if (type != 0)
4287 {
4288 set_mem_attributes (dest, type, 1);
4289
4290 if (cfun->tail_call_marked)
4291 /* Function incoming arguments may overlap with sibling call
4292 outgoing arguments and we cannot allow reordering of reads
4293 from function arguments with stores to outgoing arguments
4294 of sibling calls. */
4295 set_mem_alias_set (dest, 0);
4296 }
4297 emit_move_insn (dest, x);
4298 }
4299
4300 /* Emit and annotate a single push insn. */
4301
4302 static void
4303 emit_single_push_insn (machine_mode mode, rtx x, tree type)
4304 {
4305 poly_int64 delta, old_delta = stack_pointer_delta;
4306 rtx_insn *prev = get_last_insn ();
4307 rtx_insn *last;
4308
4309 emit_single_push_insn_1 (mode, x, type);
4310
4311 /* Adjust stack_pointer_delta to describe the situation after the push
4312 we just performed. Note that we must do this after the push rather
4313 than before the push in case calculating X needs pushes and pops of
4314 its own (e.g. if calling __tls_get_addr). The REG_ARGS_SIZE notes
4315 for such pushes and pops must not include the effect of the future
4316 push of X. */
4317 stack_pointer_delta += PUSH_ROUNDING (GET_MODE_SIZE (mode));
4318
4319 last = get_last_insn ();
4320
4321 /* Notice the common case where we emitted exactly one insn. */
4322 if (PREV_INSN (last) == prev)
4323 {
4324 add_args_size_note (last, stack_pointer_delta);
4325 return;
4326 }
4327
4328 delta = fixup_args_size_notes (prev, last, stack_pointer_delta);
4329 gcc_assert (known_eq (delta, HOST_WIDE_INT_MIN)
4330 || known_eq (delta, old_delta));
4331 }
4332 #endif
4333
4334 /* If reading SIZE bytes from X will end up reading from
4335 Y return the number of bytes that overlap. Return -1
4336 if there is no overlap or -2 if we can't determine
4337 (for example when X and Y have different base registers). */
4338
4339 static int
4340 memory_load_overlap (rtx x, rtx y, HOST_WIDE_INT size)
4341 {
4342 rtx tmp = plus_constant (Pmode, x, size);
4343 rtx sub = simplify_gen_binary (MINUS, Pmode, tmp, y);
4344
4345 if (!CONST_INT_P (sub))
4346 return -2;
4347
4348 HOST_WIDE_INT val = INTVAL (sub);
4349
4350 return IN_RANGE (val, 1, size) ? val : -1;
4351 }
4352
4353 /* Generate code to push X onto the stack, assuming it has mode MODE and
4354 type TYPE.
4355 MODE is redundant except when X is a CONST_INT (since they don't
4356 carry mode info).
4357 SIZE is an rtx for the size of data to be copied (in bytes),
4358 needed only if X is BLKmode.
4359 Return true if successful. May return false if asked to push a
4360 partial argument during a sibcall optimization (as specified by
4361 SIBCALL_P) and the incoming and outgoing pointers cannot be shown
4362 to not overlap.
4363
4364 ALIGN (in bits) is maximum alignment we can assume.
4365
4366 If PARTIAL and REG are both nonzero, then copy that many of the first
4367 bytes of X into registers starting with REG, and push the rest of X.
4368 The amount of space pushed is decreased by PARTIAL bytes.
4369 REG must be a hard register in this case.
4370 If REG is zero but PARTIAL is not, take any all others actions for an
4371 argument partially in registers, but do not actually load any
4372 registers.
4373
4374 EXTRA is the amount in bytes of extra space to leave next to this arg.
4375 This is ignored if an argument block has already been allocated.
4376
4377 On a machine that lacks real push insns, ARGS_ADDR is the address of
4378 the bottom of the argument block for this call. We use indexing off there
4379 to store the arg. On machines with push insns, ARGS_ADDR is 0 when a
4380 argument block has not been preallocated.
4381
4382 ARGS_SO_FAR is the size of args previously pushed for this call.
4383
4384 REG_PARM_STACK_SPACE is nonzero if functions require stack space
4385 for arguments passed in registers. If nonzero, it will be the number
4386 of bytes required. */
4387
4388 bool
4389 emit_push_insn (rtx x, machine_mode mode, tree type, rtx size,
4390 unsigned int align, int partial, rtx reg, poly_int64 extra,
4391 rtx args_addr, rtx args_so_far, int reg_parm_stack_space,
4392 rtx alignment_pad, bool sibcall_p)
4393 {
4394 rtx xinner;
4395 pad_direction stack_direction
4396 = STACK_GROWS_DOWNWARD ? PAD_DOWNWARD : PAD_UPWARD;
4397
4398 /* Decide where to pad the argument: PAD_DOWNWARD for below,
4399 PAD_UPWARD for above, or PAD_NONE for don't pad it.
4400 Default is below for small data on big-endian machines; else above. */
4401 pad_direction where_pad = targetm.calls.function_arg_padding (mode, type);
4402
4403 /* Invert direction if stack is post-decrement.
4404 FIXME: why? */
4405 if (STACK_PUSH_CODE == POST_DEC)
4406 if (where_pad != PAD_NONE)
4407 where_pad = (where_pad == PAD_DOWNWARD ? PAD_UPWARD : PAD_DOWNWARD);
4408
4409 xinner = x;
4410
4411 int nregs = partial / UNITS_PER_WORD;
4412 rtx *tmp_regs = NULL;
4413 int overlapping = 0;
4414
4415 if (mode == BLKmode
4416 || (STRICT_ALIGNMENT && align < GET_MODE_ALIGNMENT (mode)))
4417 {
4418 /* Copy a block into the stack, entirely or partially. */
4419
4420 rtx temp;
4421 int used;
4422 int offset;
4423 int skip;
4424
4425 offset = partial % (PARM_BOUNDARY / BITS_PER_UNIT);
4426 used = partial - offset;
4427
4428 if (mode != BLKmode)
4429 {
4430 /* A value is to be stored in an insufficiently aligned
4431 stack slot; copy via a suitably aligned slot if
4432 necessary. */
4433 size = gen_int_mode (GET_MODE_SIZE (mode), Pmode);
4434 if (!MEM_P (xinner))
4435 {
4436 temp = assign_temp (type, 1, 1);
4437 emit_move_insn (temp, xinner);
4438 xinner = temp;
4439 }
4440 }
4441
4442 gcc_assert (size);
4443
4444 /* USED is now the # of bytes we need not copy to the stack
4445 because registers will take care of them. */
4446
4447 if (partial != 0)
4448 xinner = adjust_address (xinner, BLKmode, used);
4449
4450 /* If the partial register-part of the arg counts in its stack size,
4451 skip the part of stack space corresponding to the registers.
4452 Otherwise, start copying to the beginning of the stack space,
4453 by setting SKIP to 0. */
4454 skip = (reg_parm_stack_space == 0) ? 0 : used;
4455
4456 #ifdef PUSH_ROUNDING
4457 /* Do it with several push insns if that doesn't take lots of insns
4458 and if there is no difficulty with push insns that skip bytes
4459 on the stack for alignment purposes. */
4460 if (args_addr == 0
4461 && PUSH_ARGS
4462 && CONST_INT_P (size)
4463 && skip == 0
4464 && MEM_ALIGN (xinner) >= align
4465 && can_move_by_pieces ((unsigned) INTVAL (size) - used, align)
4466 /* Here we avoid the case of a structure whose weak alignment
4467 forces many pushes of a small amount of data,
4468 and such small pushes do rounding that causes trouble. */
4469 && ((!targetm.slow_unaligned_access (word_mode, align))
4470 || align >= BIGGEST_ALIGNMENT
4471 || known_eq (PUSH_ROUNDING (align / BITS_PER_UNIT),
4472 align / BITS_PER_UNIT))
4473 && known_eq (PUSH_ROUNDING (INTVAL (size)), INTVAL (size)))
4474 {
4475 /* Push padding now if padding above and stack grows down,
4476 or if padding below and stack grows up.
4477 But if space already allocated, this has already been done. */
4478 if (maybe_ne (extra, 0)
4479 && args_addr == 0
4480 && where_pad != PAD_NONE
4481 && where_pad != stack_direction)
4482 anti_adjust_stack (gen_int_mode (extra, Pmode));
4483
4484 move_by_pieces (NULL, xinner, INTVAL (size) - used, align,
4485 RETURN_BEGIN);
4486 }
4487 else
4488 #endif /* PUSH_ROUNDING */
4489 {
4490 rtx target;
4491
4492 /* Otherwise make space on the stack and copy the data
4493 to the address of that space. */
4494
4495 /* Deduct words put into registers from the size we must copy. */
4496 if (partial != 0)
4497 {
4498 if (CONST_INT_P (size))
4499 size = GEN_INT (INTVAL (size) - used);
4500 else
4501 size = expand_binop (GET_MODE (size), sub_optab, size,
4502 gen_int_mode (used, GET_MODE (size)),
4503 NULL_RTX, 0, OPTAB_LIB_WIDEN);
4504 }
4505
4506 /* Get the address of the stack space.
4507 In this case, we do not deal with EXTRA separately.
4508 A single stack adjust will do. */
4509 poly_int64 const_args_so_far;
4510 if (! args_addr)
4511 {
4512 temp = push_block (size, extra, where_pad == PAD_DOWNWARD);
4513 extra = 0;
4514 }
4515 else if (poly_int_rtx_p (args_so_far, &const_args_so_far))
4516 temp = memory_address (BLKmode,
4517 plus_constant (Pmode, args_addr,
4518 skip + const_args_so_far));
4519 else
4520 temp = memory_address (BLKmode,
4521 plus_constant (Pmode,
4522 gen_rtx_PLUS (Pmode,
4523 args_addr,
4524 args_so_far),
4525 skip));
4526
4527 if (!ACCUMULATE_OUTGOING_ARGS)
4528 {
4529 /* If the source is referenced relative to the stack pointer,
4530 copy it to another register to stabilize it. We do not need
4531 to do this if we know that we won't be changing sp. */
4532
4533 if (reg_mentioned_p (virtual_stack_dynamic_rtx, temp)
4534 || reg_mentioned_p (virtual_outgoing_args_rtx, temp))
4535 temp = copy_to_reg (temp);
4536 }
4537
4538 target = gen_rtx_MEM (BLKmode, temp);
4539
4540 /* We do *not* set_mem_attributes here, because incoming arguments
4541 may overlap with sibling call outgoing arguments and we cannot
4542 allow reordering of reads from function arguments with stores
4543 to outgoing arguments of sibling calls. We do, however, want
4544 to record the alignment of the stack slot. */
4545 /* ALIGN may well be better aligned than TYPE, e.g. due to
4546 PARM_BOUNDARY. Assume the caller isn't lying. */
4547 set_mem_align (target, align);
4548
4549 /* If part should go in registers and pushing to that part would
4550 overwrite some of the values that need to go into regs, load the
4551 overlapping values into temporary pseudos to be moved into the hard
4552 regs at the end after the stack pushing has completed.
4553 We cannot load them directly into the hard regs here because
4554 they can be clobbered by the block move expansions.
4555 See PR 65358. */
4556
4557 if (partial > 0 && reg != 0 && mode == BLKmode
4558 && GET_CODE (reg) != PARALLEL)
4559 {
4560 overlapping = memory_load_overlap (XEXP (x, 0), temp, partial);
4561 if (overlapping > 0)
4562 {
4563 gcc_assert (overlapping % UNITS_PER_WORD == 0);
4564 overlapping /= UNITS_PER_WORD;
4565
4566 tmp_regs = XALLOCAVEC (rtx, overlapping);
4567
4568 for (int i = 0; i < overlapping; i++)
4569 tmp_regs[i] = gen_reg_rtx (word_mode);
4570
4571 for (int i = 0; i < overlapping; i++)
4572 emit_move_insn (tmp_regs[i],
4573 operand_subword_force (target, i, mode));
4574 }
4575 else if (overlapping == -1)
4576 overlapping = 0;
4577 /* Could not determine whether there is overlap.
4578 Fail the sibcall. */
4579 else
4580 {
4581 overlapping = 0;
4582 if (sibcall_p)
4583 return false;
4584 }
4585 }
4586 emit_block_move (target, xinner, size, BLOCK_OP_CALL_PARM);
4587 }
4588 }
4589 else if (partial > 0)
4590 {
4591 /* Scalar partly in registers. This case is only supported
4592 for fixed-wdth modes. */
4593 int num_words = GET_MODE_SIZE (mode).to_constant ();
4594 num_words /= UNITS_PER_WORD;
4595 int i;
4596 int not_stack;
4597 /* # bytes of start of argument
4598 that we must make space for but need not store. */
4599 int offset = partial % (PARM_BOUNDARY / BITS_PER_UNIT);
4600 int args_offset = INTVAL (args_so_far);
4601 int skip;
4602
4603 /* Push padding now if padding above and stack grows down,
4604 or if padding below and stack grows up.
4605 But if space already allocated, this has already been done. */
4606 if (maybe_ne (extra, 0)
4607 && args_addr == 0
4608 && where_pad != PAD_NONE
4609 && where_pad != stack_direction)
4610 anti_adjust_stack (gen_int_mode (extra, Pmode));
4611
4612 /* If we make space by pushing it, we might as well push
4613 the real data. Otherwise, we can leave OFFSET nonzero
4614 and leave the space uninitialized. */
4615 if (args_addr == 0)
4616 offset = 0;
4617
4618 /* Now NOT_STACK gets the number of words that we don't need to
4619 allocate on the stack. Convert OFFSET to words too. */
4620 not_stack = (partial - offset) / UNITS_PER_WORD;
4621 offset /= UNITS_PER_WORD;
4622
4623 /* If the partial register-part of the arg counts in its stack size,
4624 skip the part of stack space corresponding to the registers.
4625 Otherwise, start copying to the beginning of the stack space,
4626 by setting SKIP to 0. */
4627 skip = (reg_parm_stack_space == 0) ? 0 : not_stack;
4628
4629 if (CONSTANT_P (x) && !targetm.legitimate_constant_p (mode, x))
4630 x = validize_mem (force_const_mem (mode, x));
4631
4632 /* If X is a hard register in a non-integer mode, copy it into a pseudo;
4633 SUBREGs of such registers are not allowed. */
4634 if ((REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER
4635 && GET_MODE_CLASS (GET_MODE (x)) != MODE_INT))
4636 x = copy_to_reg (x);
4637
4638 /* Loop over all the words allocated on the stack for this arg. */
4639 /* We can do it by words, because any scalar bigger than a word
4640 has a size a multiple of a word. */
4641 for (i = num_words - 1; i >= not_stack; i--)
4642 if (i >= not_stack + offset)
4643 if (!emit_push_insn (operand_subword_force (x, i, mode),
4644 word_mode, NULL_TREE, NULL_RTX, align, 0, NULL_RTX,
4645 0, args_addr,
4646 GEN_INT (args_offset + ((i - not_stack + skip)
4647 * UNITS_PER_WORD)),
4648 reg_parm_stack_space, alignment_pad, sibcall_p))
4649 return false;
4650 }
4651 else
4652 {
4653 rtx addr;
4654 rtx dest;
4655
4656 /* Push padding now if padding above and stack grows down,
4657 or if padding below and stack grows up.
4658 But if space already allocated, this has already been done. */
4659 if (maybe_ne (extra, 0)
4660 && args_addr == 0
4661 && where_pad != PAD_NONE
4662 && where_pad != stack_direction)
4663 anti_adjust_stack (gen_int_mode (extra, Pmode));
4664
4665 #ifdef PUSH_ROUNDING
4666 if (args_addr == 0 && PUSH_ARGS)
4667 emit_single_push_insn (mode, x, type);
4668 else
4669 #endif
4670 {
4671 addr = simplify_gen_binary (PLUS, Pmode, args_addr, args_so_far);
4672 dest = gen_rtx_MEM (mode, memory_address (mode, addr));
4673
4674 /* We do *not* set_mem_attributes here, because incoming arguments
4675 may overlap with sibling call outgoing arguments and we cannot
4676 allow reordering of reads from function arguments with stores
4677 to outgoing arguments of sibling calls. We do, however, want
4678 to record the alignment of the stack slot. */
4679 /* ALIGN may well be better aligned than TYPE, e.g. due to
4680 PARM_BOUNDARY. Assume the caller isn't lying. */
4681 set_mem_align (dest, align);
4682
4683 emit_move_insn (dest, x);
4684 }
4685 }
4686
4687 /* Move the partial arguments into the registers and any overlapping
4688 values that we moved into the pseudos in tmp_regs. */
4689 if (partial > 0 && reg != 0)
4690 {
4691 /* Handle calls that pass values in multiple non-contiguous locations.
4692 The Irix 6 ABI has examples of this. */
4693 if (GET_CODE (reg) == PARALLEL)
4694 emit_group_load (reg, x, type, -1);
4695 else
4696 {
4697 gcc_assert (partial % UNITS_PER_WORD == 0);
4698 move_block_to_reg (REGNO (reg), x, nregs - overlapping, mode);
4699
4700 for (int i = 0; i < overlapping; i++)
4701 emit_move_insn (gen_rtx_REG (word_mode, REGNO (reg)
4702 + nregs - overlapping + i),
4703 tmp_regs[i]);
4704
4705 }
4706 }
4707
4708 if (maybe_ne (extra, 0) && args_addr == 0 && where_pad == stack_direction)
4709 anti_adjust_stack (gen_int_mode (extra, Pmode));
4710
4711 if (alignment_pad && args_addr == 0)
4712 anti_adjust_stack (alignment_pad);
4713
4714 return true;
4715 }
4716 \f
4717 /* Return X if X can be used as a subtarget in a sequence of arithmetic
4718 operations. */
4719
4720 static rtx
4721 get_subtarget (rtx x)
4722 {
4723 return (optimize
4724 || x == 0
4725 /* Only registers can be subtargets. */
4726 || !REG_P (x)
4727 /* Don't use hard regs to avoid extending their life. */
4728 || REGNO (x) < FIRST_PSEUDO_REGISTER
4729 ? 0 : x);
4730 }
4731
4732 /* A subroutine of expand_assignment. Optimize FIELD op= VAL, where
4733 FIELD is a bitfield. Returns true if the optimization was successful,
4734 and there's nothing else to do. */
4735
4736 static bool
4737 optimize_bitfield_assignment_op (poly_uint64 pbitsize,
4738 poly_uint64 pbitpos,
4739 poly_uint64 pbitregion_start,
4740 poly_uint64 pbitregion_end,
4741 machine_mode mode1, rtx str_rtx,
4742 tree to, tree src, bool reverse)
4743 {
4744 /* str_mode is not guaranteed to be a scalar type. */
4745 machine_mode str_mode = GET_MODE (str_rtx);
4746 unsigned int str_bitsize;
4747 tree op0, op1;
4748 rtx value, result;
4749 optab binop;
4750 gimple *srcstmt;
4751 enum tree_code code;
4752
4753 unsigned HOST_WIDE_INT bitsize, bitpos, bitregion_start, bitregion_end;
4754 if (mode1 != VOIDmode
4755 || !pbitsize.is_constant (&bitsize)
4756 || !pbitpos.is_constant (&bitpos)
4757 || !pbitregion_start.is_constant (&bitregion_start)
4758 || !pbitregion_end.is_constant (&bitregion_end)
4759 || bitsize >= BITS_PER_WORD
4760 || !GET_MODE_BITSIZE (str_mode).is_constant (&str_bitsize)
4761 || str_bitsize > BITS_PER_WORD
4762 || TREE_SIDE_EFFECTS (to)
4763 || TREE_THIS_VOLATILE (to))
4764 return false;
4765
4766 STRIP_NOPS (src);
4767 if (TREE_CODE (src) != SSA_NAME)
4768 return false;
4769 if (TREE_CODE (TREE_TYPE (src)) != INTEGER_TYPE)
4770 return false;
4771
4772 srcstmt = get_gimple_for_ssa_name (src);
4773 if (!srcstmt
4774 || TREE_CODE_CLASS (gimple_assign_rhs_code (srcstmt)) != tcc_binary)
4775 return false;
4776
4777 code = gimple_assign_rhs_code (srcstmt);
4778
4779 op0 = gimple_assign_rhs1 (srcstmt);
4780
4781 /* If OP0 is an SSA_NAME, then we want to walk the use-def chain
4782 to find its initialization. Hopefully the initialization will
4783 be from a bitfield load. */
4784 if (TREE_CODE (op0) == SSA_NAME)
4785 {
4786 gimple *op0stmt = get_gimple_for_ssa_name (op0);
4787
4788 /* We want to eventually have OP0 be the same as TO, which
4789 should be a bitfield. */
4790 if (!op0stmt
4791 || !is_gimple_assign (op0stmt)
4792 || gimple_assign_rhs_code (op0stmt) != TREE_CODE (to))
4793 return false;
4794 op0 = gimple_assign_rhs1 (op0stmt);
4795 }
4796
4797 op1 = gimple_assign_rhs2 (srcstmt);
4798
4799 if (!operand_equal_p (to, op0, 0))
4800 return false;
4801
4802 if (MEM_P (str_rtx))
4803 {
4804 unsigned HOST_WIDE_INT offset1;
4805
4806 if (str_bitsize == 0 || str_bitsize > BITS_PER_WORD)
4807 str_bitsize = BITS_PER_WORD;
4808
4809 scalar_int_mode best_mode;
4810 if (!get_best_mode (bitsize, bitpos, bitregion_start, bitregion_end,
4811 MEM_ALIGN (str_rtx), str_bitsize, false, &best_mode))
4812 return false;
4813 str_mode = best_mode;
4814 str_bitsize = GET_MODE_BITSIZE (best_mode);
4815
4816 offset1 = bitpos;
4817 bitpos %= str_bitsize;
4818 offset1 = (offset1 - bitpos) / BITS_PER_UNIT;
4819 str_rtx = adjust_address (str_rtx, str_mode, offset1);
4820 }
4821 else if (!REG_P (str_rtx) && GET_CODE (str_rtx) != SUBREG)
4822 return false;
4823
4824 /* If the bit field covers the whole REG/MEM, store_field
4825 will likely generate better code. */
4826 if (bitsize >= str_bitsize)
4827 return false;
4828
4829 /* We can't handle fields split across multiple entities. */
4830 if (bitpos + bitsize > str_bitsize)
4831 return false;
4832
4833 if (reverse ? !BYTES_BIG_ENDIAN : BYTES_BIG_ENDIAN)
4834 bitpos = str_bitsize - bitpos - bitsize;
4835
4836 switch (code)
4837 {
4838 case PLUS_EXPR:
4839 case MINUS_EXPR:
4840 /* For now, just optimize the case of the topmost bitfield
4841 where we don't need to do any masking and also
4842 1 bit bitfields where xor can be used.
4843 We might win by one instruction for the other bitfields
4844 too if insv/extv instructions aren't used, so that
4845 can be added later. */
4846 if ((reverse || bitpos + bitsize != str_bitsize)
4847 && (bitsize != 1 || TREE_CODE (op1) != INTEGER_CST))
4848 break;
4849
4850 value = expand_expr (op1, NULL_RTX, str_mode, EXPAND_NORMAL);
4851 value = convert_modes (str_mode,
4852 TYPE_MODE (TREE_TYPE (op1)), value,
4853 TYPE_UNSIGNED (TREE_TYPE (op1)));
4854
4855 /* We may be accessing data outside the field, which means
4856 we can alias adjacent data. */
4857 if (MEM_P (str_rtx))
4858 {
4859 str_rtx = shallow_copy_rtx (str_rtx);
4860 set_mem_alias_set (str_rtx, 0);
4861 set_mem_expr (str_rtx, 0);
4862 }
4863
4864 if (bitsize == 1 && (reverse || bitpos + bitsize != str_bitsize))
4865 {
4866 value = expand_and (str_mode, value, const1_rtx, NULL);
4867 binop = xor_optab;
4868 }
4869 else
4870 binop = code == PLUS_EXPR ? add_optab : sub_optab;
4871
4872 value = expand_shift (LSHIFT_EXPR, str_mode, value, bitpos, NULL_RTX, 1);
4873 if (reverse)
4874 value = flip_storage_order (str_mode, value);
4875 result = expand_binop (str_mode, binop, str_rtx,
4876 value, str_rtx, 1, OPTAB_WIDEN);
4877 if (result != str_rtx)
4878 emit_move_insn (str_rtx, result);
4879 return true;
4880
4881 case BIT_IOR_EXPR:
4882 case BIT_XOR_EXPR:
4883 if (TREE_CODE (op1) != INTEGER_CST)
4884 break;
4885 value = expand_expr (op1, NULL_RTX, str_mode, EXPAND_NORMAL);
4886 value = convert_modes (str_mode,
4887 TYPE_MODE (TREE_TYPE (op1)), value,
4888 TYPE_UNSIGNED (TREE_TYPE (op1)));
4889
4890 /* We may be accessing data outside the field, which means
4891 we can alias adjacent data. */
4892 if (MEM_P (str_rtx))
4893 {
4894 str_rtx = shallow_copy_rtx (str_rtx);
4895 set_mem_alias_set (str_rtx, 0);
4896 set_mem_expr (str_rtx, 0);
4897 }
4898
4899 binop = code == BIT_IOR_EXPR ? ior_optab : xor_optab;
4900 if (bitpos + bitsize != str_bitsize)
4901 {
4902 rtx mask = gen_int_mode ((HOST_WIDE_INT_1U << bitsize) - 1,
4903 str_mode);
4904 value = expand_and (str_mode, value, mask, NULL_RTX);
4905 }
4906 value = expand_shift (LSHIFT_EXPR, str_mode, value, bitpos, NULL_RTX, 1);
4907 if (reverse)
4908 value = flip_storage_order (str_mode, value);
4909 result = expand_binop (str_mode, binop, str_rtx,
4910 value, str_rtx, 1, OPTAB_WIDEN);
4911 if (result != str_rtx)
4912 emit_move_insn (str_rtx, result);
4913 return true;
4914
4915 default:
4916 break;
4917 }
4918
4919 return false;
4920 }
4921
4922 /* In the C++ memory model, consecutive bit fields in a structure are
4923 considered one memory location.
4924
4925 Given a COMPONENT_REF EXP at position (BITPOS, OFFSET), this function
4926 returns the bit range of consecutive bits in which this COMPONENT_REF
4927 belongs. The values are returned in *BITSTART and *BITEND. *BITPOS
4928 and *OFFSET may be adjusted in the process.
4929
4930 If the access does not need to be restricted, 0 is returned in both
4931 *BITSTART and *BITEND. */
4932
4933 void
4934 get_bit_range (poly_uint64_pod *bitstart, poly_uint64_pod *bitend, tree exp,
4935 poly_int64_pod *bitpos, tree *offset)
4936 {
4937 poly_int64 bitoffset;
4938 tree field, repr;
4939
4940 gcc_assert (TREE_CODE (exp) == COMPONENT_REF);
4941
4942 field = TREE_OPERAND (exp, 1);
4943 repr = DECL_BIT_FIELD_REPRESENTATIVE (field);
4944 /* If we do not have a DECL_BIT_FIELD_REPRESENTATIVE there is no
4945 need to limit the range we can access. */
4946 if (!repr)
4947 {
4948 *bitstart = *bitend = 0;
4949 return;
4950 }
4951
4952 /* If we have a DECL_BIT_FIELD_REPRESENTATIVE but the enclosing record is
4953 part of a larger bit field, then the representative does not serve any
4954 useful purpose. This can occur in Ada. */
4955 if (handled_component_p (TREE_OPERAND (exp, 0)))
4956 {
4957 machine_mode rmode;
4958 poly_int64 rbitsize, rbitpos;
4959 tree roffset;
4960 int unsignedp, reversep, volatilep = 0;
4961 get_inner_reference (TREE_OPERAND (exp, 0), &rbitsize, &rbitpos,
4962 &roffset, &rmode, &unsignedp, &reversep,
4963 &volatilep);
4964 if (!multiple_p (rbitpos, BITS_PER_UNIT))
4965 {
4966 *bitstart = *bitend = 0;
4967 return;
4968 }
4969 }
4970
4971 /* Compute the adjustment to bitpos from the offset of the field
4972 relative to the representative. DECL_FIELD_OFFSET of field and
4973 repr are the same by construction if they are not constants,
4974 see finish_bitfield_layout. */
4975 poly_uint64 field_offset, repr_offset;
4976 if (poly_int_tree_p (DECL_FIELD_OFFSET (field), &field_offset)
4977 && poly_int_tree_p (DECL_FIELD_OFFSET (repr), &repr_offset))
4978 bitoffset = (field_offset - repr_offset) * BITS_PER_UNIT;
4979 else
4980 bitoffset = 0;
4981 bitoffset += (tree_to_uhwi (DECL_FIELD_BIT_OFFSET (field))
4982 - tree_to_uhwi (DECL_FIELD_BIT_OFFSET (repr)));
4983
4984 /* If the adjustment is larger than bitpos, we would have a negative bit
4985 position for the lower bound and this may wreak havoc later. Adjust
4986 offset and bitpos to make the lower bound non-negative in that case. */
4987 if (maybe_gt (bitoffset, *bitpos))
4988 {
4989 poly_int64 adjust_bits = upper_bound (bitoffset, *bitpos) - *bitpos;
4990 poly_int64 adjust_bytes = exact_div (adjust_bits, BITS_PER_UNIT);
4991
4992 *bitpos += adjust_bits;
4993 if (*offset == NULL_TREE)
4994 *offset = size_int (-adjust_bytes);
4995 else
4996 *offset = size_binop (MINUS_EXPR, *offset, size_int (adjust_bytes));
4997 *bitstart = 0;
4998 }
4999 else
5000 *bitstart = *bitpos - bitoffset;
5001
5002 *bitend = *bitstart + tree_to_poly_uint64 (DECL_SIZE (repr)) - 1;
5003 }
5004
5005 /* Returns true if BASE is a DECL that does not reside in memory and
5006 has non-BLKmode. DECL_RTL must not be a MEM; if
5007 DECL_RTL was not set yet, return false. */
5008
5009 static inline bool
5010 non_mem_decl_p (tree base)
5011 {
5012 if (!DECL_P (base)
5013 || TREE_ADDRESSABLE (base)
5014 || DECL_MODE (base) == BLKmode)
5015 return false;
5016
5017 if (!DECL_RTL_SET_P (base))
5018 return false;
5019
5020 return (!MEM_P (DECL_RTL (base)));
5021 }
5022
5023 /* Returns true if REF refers to an object that does not
5024 reside in memory and has non-BLKmode. */
5025
5026 static inline bool
5027 mem_ref_refers_to_non_mem_p (tree ref)
5028 {
5029 tree base;
5030
5031 if (TREE_CODE (ref) == MEM_REF
5032 || TREE_CODE (ref) == TARGET_MEM_REF)
5033 {
5034 tree addr = TREE_OPERAND (ref, 0);
5035
5036 if (TREE_CODE (addr) != ADDR_EXPR)
5037 return false;
5038
5039 base = TREE_OPERAND (addr, 0);
5040 }
5041 else
5042 base = ref;
5043
5044 return non_mem_decl_p (base);
5045 }
5046
5047 /* Expand an assignment that stores the value of FROM into TO. If NONTEMPORAL
5048 is true, try generating a nontemporal store. */
5049
5050 void
5051 expand_assignment (tree to, tree from, bool nontemporal)
5052 {
5053 rtx to_rtx = 0;
5054 rtx result;
5055 machine_mode mode;
5056 unsigned int align;
5057 enum insn_code icode;
5058
5059 /* Don't crash if the lhs of the assignment was erroneous. */
5060 if (TREE_CODE (to) == ERROR_MARK)
5061 {
5062 expand_normal (from);
5063 return;
5064 }
5065
5066 /* Optimize away no-op moves without side-effects. */
5067 if (operand_equal_p (to, from, 0))
5068 return;
5069
5070 /* Handle misaligned stores. */
5071 mode = TYPE_MODE (TREE_TYPE (to));
5072 if ((TREE_CODE (to) == MEM_REF
5073 || TREE_CODE (to) == TARGET_MEM_REF
5074 || DECL_P (to))
5075 && mode != BLKmode
5076 && !mem_ref_refers_to_non_mem_p (to)
5077 && ((align = get_object_alignment (to))
5078 < GET_MODE_ALIGNMENT (mode))
5079 && (((icode = optab_handler (movmisalign_optab, mode))
5080 != CODE_FOR_nothing)
5081 || targetm.slow_unaligned_access (mode, align)))
5082 {
5083 rtx reg, mem;
5084
5085 reg = expand_expr (from, NULL_RTX, VOIDmode, EXPAND_NORMAL);
5086 reg = force_not_mem (reg);
5087 mem = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE);
5088 if (TREE_CODE (to) == MEM_REF && REF_REVERSE_STORAGE_ORDER (to))
5089 reg = flip_storage_order (mode, reg);
5090
5091 if (icode != CODE_FOR_nothing)
5092 {
5093 class expand_operand ops[2];
5094
5095 create_fixed_operand (&ops[0], mem);
5096 create_input_operand (&ops[1], reg, mode);
5097 /* The movmisalign<mode> pattern cannot fail, else the assignment
5098 would silently be omitted. */
5099 expand_insn (icode, 2, ops);
5100 }
5101 else
5102 store_bit_field (mem, GET_MODE_BITSIZE (mode), 0, 0, 0, mode, reg,
5103 false);
5104 return;
5105 }
5106
5107 /* Assignment of a structure component needs special treatment
5108 if the structure component's rtx is not simply a MEM.
5109 Assignment of an array element at a constant index, and assignment of
5110 an array element in an unaligned packed structure field, has the same
5111 problem. Same for (partially) storing into a non-memory object. */
5112 if (handled_component_p (to)
5113 || (TREE_CODE (to) == MEM_REF
5114 && (REF_REVERSE_STORAGE_ORDER (to)
5115 || mem_ref_refers_to_non_mem_p (to)))
5116 || TREE_CODE (TREE_TYPE (to)) == ARRAY_TYPE)
5117 {
5118 machine_mode mode1;
5119 poly_int64 bitsize, bitpos;
5120 poly_uint64 bitregion_start = 0;
5121 poly_uint64 bitregion_end = 0;
5122 tree offset;
5123 int unsignedp, reversep, volatilep = 0;
5124 tree tem;
5125
5126 push_temp_slots ();
5127 tem = get_inner_reference (to, &bitsize, &bitpos, &offset, &mode1,
5128 &unsignedp, &reversep, &volatilep);
5129
5130 /* Make sure bitpos is not negative, it can wreak havoc later. */
5131 if (maybe_lt (bitpos, 0))
5132 {
5133 gcc_assert (offset == NULL_TREE);
5134 offset = size_int (bits_to_bytes_round_down (bitpos));
5135 bitpos = num_trailing_bits (bitpos);
5136 }
5137
5138 if (TREE_CODE (to) == COMPONENT_REF
5139 && DECL_BIT_FIELD_TYPE (TREE_OPERAND (to, 1)))
5140 get_bit_range (&bitregion_start, &bitregion_end, to, &bitpos, &offset);
5141 /* The C++ memory model naturally applies to byte-aligned fields.
5142 However, if we do not have a DECL_BIT_FIELD_TYPE but BITPOS or
5143 BITSIZE are not byte-aligned, there is no need to limit the range
5144 we can access. This can occur with packed structures in Ada. */
5145 else if (maybe_gt (bitsize, 0)
5146 && multiple_p (bitsize, BITS_PER_UNIT)
5147 && multiple_p (bitpos, BITS_PER_UNIT))
5148 {
5149 bitregion_start = bitpos;
5150 bitregion_end = bitpos + bitsize - 1;
5151 }
5152
5153 to_rtx = expand_expr (tem, NULL_RTX, VOIDmode, EXPAND_WRITE);
5154
5155 /* If the field has a mode, we want to access it in the
5156 field's mode, not the computed mode.
5157 If a MEM has VOIDmode (external with incomplete type),
5158 use BLKmode for it instead. */
5159 if (MEM_P (to_rtx))
5160 {
5161 if (mode1 != VOIDmode)
5162 to_rtx = adjust_address (to_rtx, mode1, 0);
5163 else if (GET_MODE (to_rtx) == VOIDmode)
5164 to_rtx = adjust_address (to_rtx, BLKmode, 0);
5165 }
5166
5167 if (offset != 0)
5168 {
5169 machine_mode address_mode;
5170 rtx offset_rtx;
5171
5172 if (!MEM_P (to_rtx))
5173 {
5174 /* We can get constant negative offsets into arrays with broken
5175 user code. Translate this to a trap instead of ICEing. */
5176 gcc_assert (TREE_CODE (offset) == INTEGER_CST);
5177 expand_builtin_trap ();
5178 to_rtx = gen_rtx_MEM (BLKmode, const0_rtx);
5179 }
5180
5181 offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode, EXPAND_SUM);
5182 address_mode = get_address_mode (to_rtx);
5183 if (GET_MODE (offset_rtx) != address_mode)
5184 {
5185 /* We cannot be sure that the RTL in offset_rtx is valid outside
5186 of a memory address context, so force it into a register
5187 before attempting to convert it to the desired mode. */
5188 offset_rtx = force_operand (offset_rtx, NULL_RTX);
5189 offset_rtx = convert_to_mode (address_mode, offset_rtx, 0);
5190 }
5191
5192 /* If we have an expression in OFFSET_RTX and a non-zero
5193 byte offset in BITPOS, adding the byte offset before the
5194 OFFSET_RTX results in better intermediate code, which makes
5195 later rtl optimization passes perform better.
5196
5197 We prefer intermediate code like this:
5198
5199 r124:DI=r123:DI+0x18
5200 [r124:DI]=r121:DI
5201
5202 ... instead of ...
5203
5204 r124:DI=r123:DI+0x10
5205 [r124:DI+0x8]=r121:DI
5206
5207 This is only done for aligned data values, as these can
5208 be expected to result in single move instructions. */
5209 poly_int64 bytepos;
5210 if (mode1 != VOIDmode
5211 && maybe_ne (bitpos, 0)
5212 && maybe_gt (bitsize, 0)
5213 && multiple_p (bitpos, BITS_PER_UNIT, &bytepos)
5214 && multiple_p (bitpos, bitsize)
5215 && multiple_p (bitsize, GET_MODE_ALIGNMENT (mode1))
5216 && MEM_ALIGN (to_rtx) >= GET_MODE_ALIGNMENT (mode1))
5217 {
5218 to_rtx = adjust_address (to_rtx, mode1, bytepos);
5219 bitregion_start = 0;
5220 if (known_ge (bitregion_end, poly_uint64 (bitpos)))
5221 bitregion_end -= bitpos;
5222 bitpos = 0;
5223 }
5224
5225 to_rtx = offset_address (to_rtx, offset_rtx,
5226 highest_pow2_factor_for_target (to,
5227 offset));
5228 }
5229
5230 /* No action is needed if the target is not a memory and the field
5231 lies completely outside that target. This can occur if the source
5232 code contains an out-of-bounds access to a small array. */
5233 if (!MEM_P (to_rtx)
5234 && GET_MODE (to_rtx) != BLKmode
5235 && known_ge (bitpos, GET_MODE_PRECISION (GET_MODE (to_rtx))))
5236 {
5237 expand_normal (from);
5238 result = NULL;
5239 }
5240 /* Handle expand_expr of a complex value returning a CONCAT. */
5241 else if (GET_CODE (to_rtx) == CONCAT)
5242 {
5243 machine_mode to_mode = GET_MODE (to_rtx);
5244 gcc_checking_assert (COMPLEX_MODE_P (to_mode));
5245 poly_int64 mode_bitsize = GET_MODE_BITSIZE (to_mode);
5246 unsigned short inner_bitsize = GET_MODE_UNIT_BITSIZE (to_mode);
5247 if (TYPE_MODE (TREE_TYPE (from)) == to_mode
5248 && known_eq (bitpos, 0)
5249 && known_eq (bitsize, mode_bitsize))
5250 result = store_expr (from, to_rtx, false, nontemporal, reversep);
5251 else if (TYPE_MODE (TREE_TYPE (from)) == GET_MODE_INNER (to_mode)
5252 && known_eq (bitsize, inner_bitsize)
5253 && (known_eq (bitpos, 0)
5254 || known_eq (bitpos, inner_bitsize)))
5255 result = store_expr (from, XEXP (to_rtx, maybe_ne (bitpos, 0)),
5256 false, nontemporal, reversep);
5257 else if (known_le (bitpos + bitsize, inner_bitsize))
5258 result = store_field (XEXP (to_rtx, 0), bitsize, bitpos,
5259 bitregion_start, bitregion_end,
5260 mode1, from, get_alias_set (to),
5261 nontemporal, reversep);
5262 else if (known_ge (bitpos, inner_bitsize))
5263 result = store_field (XEXP (to_rtx, 1), bitsize,
5264 bitpos - inner_bitsize,
5265 bitregion_start, bitregion_end,
5266 mode1, from, get_alias_set (to),
5267 nontemporal, reversep);
5268 else if (known_eq (bitpos, 0) && known_eq (bitsize, mode_bitsize))
5269 {
5270 result = expand_normal (from);
5271 if (GET_CODE (result) == CONCAT)
5272 {
5273 to_mode = GET_MODE_INNER (to_mode);
5274 machine_mode from_mode = GET_MODE_INNER (GET_MODE (result));
5275 rtx from_real
5276 = simplify_gen_subreg (to_mode, XEXP (result, 0),
5277 from_mode, 0);
5278 rtx from_imag
5279 = simplify_gen_subreg (to_mode, XEXP (result, 1),
5280 from_mode, 0);
5281 if (!from_real || !from_imag)
5282 goto concat_store_slow;
5283 emit_move_insn (XEXP (to_rtx, 0), from_real);
5284 emit_move_insn (XEXP (to_rtx, 1), from_imag);
5285 }
5286 else
5287 {
5288 machine_mode from_mode
5289 = GET_MODE (result) == VOIDmode
5290 ? TYPE_MODE (TREE_TYPE (from))
5291 : GET_MODE (result);
5292 rtx from_rtx;
5293 if (MEM_P (result))
5294 from_rtx = change_address (result, to_mode, NULL_RTX);
5295 else
5296 from_rtx
5297 = simplify_gen_subreg (to_mode, result, from_mode, 0);
5298 if (from_rtx)
5299 {
5300 emit_move_insn (XEXP (to_rtx, 0),
5301 read_complex_part (from_rtx, false));
5302 emit_move_insn (XEXP (to_rtx, 1),
5303 read_complex_part (from_rtx, true));
5304 }
5305 else
5306 {
5307 to_mode = GET_MODE_INNER (to_mode);
5308 rtx from_real
5309 = simplify_gen_subreg (to_mode, result, from_mode, 0);
5310 rtx from_imag
5311 = simplify_gen_subreg (to_mode, result, from_mode,
5312 GET_MODE_SIZE (to_mode));
5313 if (!from_real || !from_imag)
5314 goto concat_store_slow;
5315 emit_move_insn (XEXP (to_rtx, 0), from_real);
5316 emit_move_insn (XEXP (to_rtx, 1), from_imag);
5317 }
5318 }
5319 }
5320 else
5321 {
5322 concat_store_slow:;
5323 rtx temp = assign_stack_temp (GET_MODE (to_rtx),
5324 GET_MODE_SIZE (GET_MODE (to_rtx)));
5325 write_complex_part (temp, XEXP (to_rtx, 0), false);
5326 write_complex_part (temp, XEXP (to_rtx, 1), true);
5327 result = store_field (temp, bitsize, bitpos,
5328 bitregion_start, bitregion_end,
5329 mode1, from, get_alias_set (to),
5330 nontemporal, reversep);
5331 emit_move_insn (XEXP (to_rtx, 0), read_complex_part (temp, false));
5332 emit_move_insn (XEXP (to_rtx, 1), read_complex_part (temp, true));
5333 }
5334 }
5335 /* For calls to functions returning variable length structures, if TO_RTX
5336 is not a MEM, go through a MEM because we must not create temporaries
5337 of the VLA type. */
5338 else if (!MEM_P (to_rtx)
5339 && TREE_CODE (from) == CALL_EXPR
5340 && COMPLETE_TYPE_P (TREE_TYPE (from))
5341 && TREE_CODE (TYPE_SIZE (TREE_TYPE (from))) != INTEGER_CST)
5342 {
5343 rtx temp = assign_stack_temp (GET_MODE (to_rtx),
5344 GET_MODE_SIZE (GET_MODE (to_rtx)));
5345 result = store_field (temp, bitsize, bitpos, bitregion_start,
5346 bitregion_end, mode1, from, get_alias_set (to),
5347 nontemporal, reversep);
5348 emit_move_insn (to_rtx, temp);
5349 }
5350 else
5351 {
5352 if (MEM_P (to_rtx))
5353 {
5354 /* If the field is at offset zero, we could have been given the
5355 DECL_RTX of the parent struct. Don't munge it. */
5356 to_rtx = shallow_copy_rtx (to_rtx);
5357 set_mem_attributes_minus_bitpos (to_rtx, to, 0, bitpos);
5358 if (volatilep)
5359 MEM_VOLATILE_P (to_rtx) = 1;
5360 }
5361
5362 gcc_checking_assert (known_ge (bitpos, 0));
5363 if (optimize_bitfield_assignment_op (bitsize, bitpos,
5364 bitregion_start, bitregion_end,
5365 mode1, to_rtx, to, from,
5366 reversep))
5367 result = NULL;
5368 else
5369 result = store_field (to_rtx, bitsize, bitpos,
5370 bitregion_start, bitregion_end,
5371 mode1, from, get_alias_set (to),
5372 nontemporal, reversep);
5373 }
5374
5375 if (result)
5376 preserve_temp_slots (result);
5377 pop_temp_slots ();
5378 return;
5379 }
5380
5381 /* If the rhs is a function call and its value is not an aggregate,
5382 call the function before we start to compute the lhs.
5383 This is needed for correct code for cases such as
5384 val = setjmp (buf) on machines where reference to val
5385 requires loading up part of an address in a separate insn.
5386
5387 Don't do this if TO is a VAR_DECL or PARM_DECL whose DECL_RTL is REG
5388 since it might be a promoted variable where the zero- or sign- extension
5389 needs to be done. Handling this in the normal way is safe because no
5390 computation is done before the call. The same is true for SSA names. */
5391 if (TREE_CODE (from) == CALL_EXPR && ! aggregate_value_p (from, from)
5392 && COMPLETE_TYPE_P (TREE_TYPE (from))
5393 && TREE_CODE (TYPE_SIZE (TREE_TYPE (from))) == INTEGER_CST
5394 && ! (((VAR_P (to)
5395 || TREE_CODE (to) == PARM_DECL
5396 || TREE_CODE (to) == RESULT_DECL)
5397 && REG_P (DECL_RTL (to)))
5398 || TREE_CODE (to) == SSA_NAME))
5399 {
5400 rtx value;
5401
5402 push_temp_slots ();
5403 value = expand_normal (from);
5404
5405 if (to_rtx == 0)
5406 to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE);
5407
5408 /* Handle calls that return values in multiple non-contiguous locations.
5409 The Irix 6 ABI has examples of this. */
5410 if (GET_CODE (to_rtx) == PARALLEL)
5411 {
5412 if (GET_CODE (value) == PARALLEL)
5413 emit_group_move (to_rtx, value);
5414 else
5415 emit_group_load (to_rtx, value, TREE_TYPE (from),
5416 int_size_in_bytes (TREE_TYPE (from)));
5417 }
5418 else if (GET_CODE (value) == PARALLEL)
5419 emit_group_store (to_rtx, value, TREE_TYPE (from),
5420 int_size_in_bytes (TREE_TYPE (from)));
5421 else if (GET_MODE (to_rtx) == BLKmode)
5422 {
5423 /* Handle calls that return BLKmode values in registers. */
5424 if (REG_P (value))
5425 copy_blkmode_from_reg (to_rtx, value, TREE_TYPE (from));
5426 else
5427 emit_block_move (to_rtx, value, expr_size (from), BLOCK_OP_NORMAL);
5428 }
5429 else
5430 {
5431 if (POINTER_TYPE_P (TREE_TYPE (to)))
5432 value = convert_memory_address_addr_space
5433 (as_a <scalar_int_mode> (GET_MODE (to_rtx)), value,
5434 TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (to))));
5435
5436 emit_move_insn (to_rtx, value);
5437 }
5438
5439 preserve_temp_slots (to_rtx);
5440 pop_temp_slots ();
5441 return;
5442 }
5443
5444 /* Ordinary treatment. Expand TO to get a REG or MEM rtx. */
5445 to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE);
5446
5447 /* Don't move directly into a return register. */
5448 if (TREE_CODE (to) == RESULT_DECL
5449 && (REG_P (to_rtx) || GET_CODE (to_rtx) == PARALLEL))
5450 {
5451 rtx temp;
5452
5453 push_temp_slots ();
5454
5455 /* If the source is itself a return value, it still is in a pseudo at
5456 this point so we can move it back to the return register directly. */
5457 if (REG_P (to_rtx)
5458 && TYPE_MODE (TREE_TYPE (from)) == BLKmode
5459 && TREE_CODE (from) != CALL_EXPR)
5460 temp = copy_blkmode_to_reg (GET_MODE (to_rtx), from);
5461 else
5462 temp = expand_expr (from, NULL_RTX, GET_MODE (to_rtx), EXPAND_NORMAL);
5463
5464 /* Handle calls that return values in multiple non-contiguous locations.
5465 The Irix 6 ABI has examples of this. */
5466 if (GET_CODE (to_rtx) == PARALLEL)
5467 {
5468 if (GET_CODE (temp) == PARALLEL)
5469 emit_group_move (to_rtx, temp);
5470 else
5471 emit_group_load (to_rtx, temp, TREE_TYPE (from),
5472 int_size_in_bytes (TREE_TYPE (from)));
5473 }
5474 else if (temp)
5475 emit_move_insn (to_rtx, temp);
5476
5477 preserve_temp_slots (to_rtx);
5478 pop_temp_slots ();
5479 return;
5480 }
5481
5482 /* In case we are returning the contents of an object which overlaps
5483 the place the value is being stored, use a safe function when copying
5484 a value through a pointer into a structure value return block. */
5485 if (TREE_CODE (to) == RESULT_DECL
5486 && TREE_CODE (from) == INDIRECT_REF
5487 && ADDR_SPACE_GENERIC_P
5488 (TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (from, 0)))))
5489 && refs_may_alias_p (to, from)
5490 && cfun->returns_struct
5491 && !cfun->returns_pcc_struct)
5492 {
5493 rtx from_rtx, size;
5494
5495 push_temp_slots ();
5496 size = expr_size (from);
5497 from_rtx = expand_normal (from);
5498
5499 emit_block_move_via_libcall (XEXP (to_rtx, 0), XEXP (from_rtx, 0), size);
5500
5501 preserve_temp_slots (to_rtx);
5502 pop_temp_slots ();
5503 return;
5504 }
5505
5506 /* Compute FROM and store the value in the rtx we got. */
5507
5508 push_temp_slots ();
5509 result = store_expr (from, to_rtx, 0, nontemporal, false);
5510 preserve_temp_slots (result);
5511 pop_temp_slots ();
5512 return;
5513 }
5514
5515 /* Emits nontemporal store insn that moves FROM to TO. Returns true if this
5516 succeeded, false otherwise. */
5517
5518 bool
5519 emit_storent_insn (rtx to, rtx from)
5520 {
5521 class expand_operand ops[2];
5522 machine_mode mode = GET_MODE (to);
5523 enum insn_code code = optab_handler (storent_optab, mode);
5524
5525 if (code == CODE_FOR_nothing)
5526 return false;
5527
5528 create_fixed_operand (&ops[0], to);
5529 create_input_operand (&ops[1], from, mode);
5530 return maybe_expand_insn (code, 2, ops);
5531 }
5532
5533 /* Helper function for store_expr storing of STRING_CST. */
5534
5535 static rtx
5536 string_cst_read_str (void *data, HOST_WIDE_INT offset, scalar_int_mode mode)
5537 {
5538 tree str = (tree) data;
5539
5540 gcc_assert (offset >= 0);
5541 if (offset >= TREE_STRING_LENGTH (str))
5542 return const0_rtx;
5543
5544 if ((unsigned HOST_WIDE_INT) offset + GET_MODE_SIZE (mode)
5545 > (unsigned HOST_WIDE_INT) TREE_STRING_LENGTH (str))
5546 {
5547 char *p = XALLOCAVEC (char, GET_MODE_SIZE (mode));
5548 size_t l = TREE_STRING_LENGTH (str) - offset;
5549 memcpy (p, TREE_STRING_POINTER (str) + offset, l);
5550 memset (p + l, '\0', GET_MODE_SIZE (mode) - l);
5551 return c_readstr (p, mode, false);
5552 }
5553
5554 return c_readstr (TREE_STRING_POINTER (str) + offset, mode, false);
5555 }
5556
5557 /* Generate code for computing expression EXP,
5558 and storing the value into TARGET.
5559
5560 If the mode is BLKmode then we may return TARGET itself.
5561 It turns out that in BLKmode it doesn't cause a problem.
5562 because C has no operators that could combine two different
5563 assignments into the same BLKmode object with different values
5564 with no sequence point. Will other languages need this to
5565 be more thorough?
5566
5567 If CALL_PARAM_P is nonzero, this is a store into a call param on the
5568 stack, and block moves may need to be treated specially.
5569
5570 If NONTEMPORAL is true, try using a nontemporal store instruction.
5571
5572 If REVERSE is true, the store is to be done in reverse order. */
5573
5574 rtx
5575 store_expr (tree exp, rtx target, int call_param_p,
5576 bool nontemporal, bool reverse)
5577 {
5578 rtx temp;
5579 rtx alt_rtl = NULL_RTX;
5580 location_t loc = curr_insn_location ();
5581
5582 if (VOID_TYPE_P (TREE_TYPE (exp)))
5583 {
5584 /* C++ can generate ?: expressions with a throw expression in one
5585 branch and an rvalue in the other. Here, we resolve attempts to
5586 store the throw expression's nonexistent result. */
5587 gcc_assert (!call_param_p);
5588 expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL);
5589 return NULL_RTX;
5590 }
5591 if (TREE_CODE (exp) == COMPOUND_EXPR)
5592 {
5593 /* Perform first part of compound expression, then assign from second
5594 part. */
5595 expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
5596 call_param_p ? EXPAND_STACK_PARM : EXPAND_NORMAL);
5597 return store_expr (TREE_OPERAND (exp, 1), target,
5598 call_param_p, nontemporal, reverse);
5599 }
5600 else if (TREE_CODE (exp) == COND_EXPR && GET_MODE (target) == BLKmode)
5601 {
5602 /* For conditional expression, get safe form of the target. Then
5603 test the condition, doing the appropriate assignment on either
5604 side. This avoids the creation of unnecessary temporaries.
5605 For non-BLKmode, it is more efficient not to do this. */
5606
5607 rtx_code_label *lab1 = gen_label_rtx (), *lab2 = gen_label_rtx ();
5608
5609 do_pending_stack_adjust ();
5610 NO_DEFER_POP;
5611 jumpifnot (TREE_OPERAND (exp, 0), lab1,
5612 profile_probability::uninitialized ());
5613 store_expr (TREE_OPERAND (exp, 1), target, call_param_p,
5614 nontemporal, reverse);
5615 emit_jump_insn (targetm.gen_jump (lab2));
5616 emit_barrier ();
5617 emit_label (lab1);
5618 store_expr (TREE_OPERAND (exp, 2), target, call_param_p,
5619 nontemporal, reverse);
5620 emit_label (lab2);
5621 OK_DEFER_POP;
5622
5623 return NULL_RTX;
5624 }
5625 else if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target))
5626 /* If this is a scalar in a register that is stored in a wider mode
5627 than the declared mode, compute the result into its declared mode
5628 and then convert to the wider mode. Our value is the computed
5629 expression. */
5630 {
5631 rtx inner_target = 0;
5632 scalar_int_mode outer_mode = subreg_unpromoted_mode (target);
5633 scalar_int_mode inner_mode = subreg_promoted_mode (target);
5634
5635 /* We can do the conversion inside EXP, which will often result
5636 in some optimizations. Do the conversion in two steps: first
5637 change the signedness, if needed, then the extend. But don't
5638 do this if the type of EXP is a subtype of something else
5639 since then the conversion might involve more than just
5640 converting modes. */
5641 if (INTEGRAL_TYPE_P (TREE_TYPE (exp))
5642 && TREE_TYPE (TREE_TYPE (exp)) == 0
5643 && GET_MODE_PRECISION (outer_mode)
5644 == TYPE_PRECISION (TREE_TYPE (exp)))
5645 {
5646 if (!SUBREG_CHECK_PROMOTED_SIGN (target,
5647 TYPE_UNSIGNED (TREE_TYPE (exp))))
5648 {
5649 /* Some types, e.g. Fortran's logical*4, won't have a signed
5650 version, so use the mode instead. */
5651 tree ntype
5652 = (signed_or_unsigned_type_for
5653 (SUBREG_PROMOTED_SIGN (target), TREE_TYPE (exp)));
5654 if (ntype == NULL)
5655 ntype = lang_hooks.types.type_for_mode
5656 (TYPE_MODE (TREE_TYPE (exp)),
5657 SUBREG_PROMOTED_SIGN (target));
5658
5659 exp = fold_convert_loc (loc, ntype, exp);
5660 }
5661
5662 exp = fold_convert_loc (loc, lang_hooks.types.type_for_mode
5663 (inner_mode, SUBREG_PROMOTED_SIGN (target)),
5664 exp);
5665
5666 inner_target = SUBREG_REG (target);
5667 }
5668
5669 temp = expand_expr (exp, inner_target, VOIDmode,
5670 call_param_p ? EXPAND_STACK_PARM : EXPAND_NORMAL);
5671
5672
5673 /* If TEMP is a VOIDmode constant, use convert_modes to make
5674 sure that we properly convert it. */
5675 if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode)
5676 {
5677 temp = convert_modes (outer_mode, TYPE_MODE (TREE_TYPE (exp)),
5678 temp, SUBREG_PROMOTED_SIGN (target));
5679 temp = convert_modes (inner_mode, outer_mode, temp,
5680 SUBREG_PROMOTED_SIGN (target));
5681 }
5682
5683 convert_move (SUBREG_REG (target), temp,
5684 SUBREG_PROMOTED_SIGN (target));
5685
5686 return NULL_RTX;
5687 }
5688 else if ((TREE_CODE (exp) == STRING_CST
5689 || (TREE_CODE (exp) == MEM_REF
5690 && TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
5691 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
5692 == STRING_CST
5693 && integer_zerop (TREE_OPERAND (exp, 1))))
5694 && !nontemporal && !call_param_p
5695 && MEM_P (target))
5696 {
5697 /* Optimize initialization of an array with a STRING_CST. */
5698 HOST_WIDE_INT exp_len, str_copy_len;
5699 rtx dest_mem;
5700 tree str = TREE_CODE (exp) == STRING_CST
5701 ? exp : TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
5702
5703 exp_len = int_expr_size (exp);
5704 if (exp_len <= 0)
5705 goto normal_expr;
5706
5707 if (TREE_STRING_LENGTH (str) <= 0)
5708 goto normal_expr;
5709
5710 if (can_store_by_pieces (exp_len, string_cst_read_str, (void *) str,
5711 MEM_ALIGN (target), false))
5712 {
5713 store_by_pieces (target, exp_len, string_cst_read_str, (void *) str,
5714 MEM_ALIGN (target), false, RETURN_BEGIN);
5715 return NULL_RTX;
5716 }
5717
5718 str_copy_len = TREE_STRING_LENGTH (str);
5719 if ((STORE_MAX_PIECES & (STORE_MAX_PIECES - 1)) == 0)
5720 {
5721 str_copy_len += STORE_MAX_PIECES - 1;
5722 str_copy_len &= ~(STORE_MAX_PIECES - 1);
5723 }
5724 if (str_copy_len >= exp_len)
5725 goto normal_expr;
5726
5727 if (!can_store_by_pieces (str_copy_len, string_cst_read_str,
5728 (void *) str, MEM_ALIGN (target), false))
5729 goto normal_expr;
5730
5731 dest_mem = store_by_pieces (target, str_copy_len, string_cst_read_str,
5732 (void *) str, MEM_ALIGN (target), false,
5733 RETURN_END);
5734 clear_storage (adjust_address_1 (dest_mem, BLKmode, 0, 1, 1, 0,
5735 exp_len - str_copy_len),
5736 GEN_INT (exp_len - str_copy_len), BLOCK_OP_NORMAL);
5737 return NULL_RTX;
5738 }
5739 else
5740 {
5741 rtx tmp_target;
5742
5743 normal_expr:
5744 /* If we want to use a nontemporal or a reverse order store, force the
5745 value into a register first. */
5746 tmp_target = nontemporal || reverse ? NULL_RTX : target;
5747 temp = expand_expr_real (exp, tmp_target, GET_MODE (target),
5748 (call_param_p
5749 ? EXPAND_STACK_PARM : EXPAND_NORMAL),
5750 &alt_rtl, false);
5751 }
5752
5753 /* If TEMP is a VOIDmode constant and the mode of the type of EXP is not
5754 the same as that of TARGET, adjust the constant. This is needed, for
5755 example, in case it is a CONST_DOUBLE or CONST_WIDE_INT and we want
5756 only a word-sized value. */
5757 if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode
5758 && TREE_CODE (exp) != ERROR_MARK
5759 && GET_MODE (target) != TYPE_MODE (TREE_TYPE (exp)))
5760 {
5761 if (GET_MODE_CLASS (GET_MODE (target))
5762 != GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (exp)))
5763 && known_eq (GET_MODE_BITSIZE (GET_MODE (target)),
5764 GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (exp)))))
5765 {
5766 rtx t = simplify_gen_subreg (GET_MODE (target), temp,
5767 TYPE_MODE (TREE_TYPE (exp)), 0);
5768 if (t)
5769 temp = t;
5770 }
5771 if (GET_MODE (temp) == VOIDmode)
5772 temp = convert_modes (GET_MODE (target), TYPE_MODE (TREE_TYPE (exp)),
5773 temp, TYPE_UNSIGNED (TREE_TYPE (exp)));
5774 }
5775
5776 /* If value was not generated in the target, store it there.
5777 Convert the value to TARGET's type first if necessary and emit the
5778 pending incrementations that have been queued when expanding EXP.
5779 Note that we cannot emit the whole queue blindly because this will
5780 effectively disable the POST_INC optimization later.
5781
5782 If TEMP and TARGET compare equal according to rtx_equal_p, but
5783 one or both of them are volatile memory refs, we have to distinguish
5784 two cases:
5785 - expand_expr has used TARGET. In this case, we must not generate
5786 another copy. This can be detected by TARGET being equal according
5787 to == .
5788 - expand_expr has not used TARGET - that means that the source just
5789 happens to have the same RTX form. Since temp will have been created
5790 by expand_expr, it will compare unequal according to == .
5791 We must generate a copy in this case, to reach the correct number
5792 of volatile memory references. */
5793
5794 if ((! rtx_equal_p (temp, target)
5795 || (temp != target && (side_effects_p (temp)
5796 || side_effects_p (target))))
5797 && TREE_CODE (exp) != ERROR_MARK
5798 /* If store_expr stores a DECL whose DECL_RTL(exp) == TARGET,
5799 but TARGET is not valid memory reference, TEMP will differ
5800 from TARGET although it is really the same location. */
5801 && !(alt_rtl
5802 && rtx_equal_p (alt_rtl, target)
5803 && !side_effects_p (alt_rtl)
5804 && !side_effects_p (target))
5805 /* If there's nothing to copy, don't bother. Don't call
5806 expr_size unless necessary, because some front-ends (C++)
5807 expr_size-hook must not be given objects that are not
5808 supposed to be bit-copied or bit-initialized. */
5809 && expr_size (exp) != const0_rtx)
5810 {
5811 if (GET_MODE (temp) != GET_MODE (target) && GET_MODE (temp) != VOIDmode)
5812 {
5813 if (GET_MODE (target) == BLKmode)
5814 {
5815 /* Handle calls that return BLKmode values in registers. */
5816 if (REG_P (temp) && TREE_CODE (exp) == CALL_EXPR)
5817 copy_blkmode_from_reg (target, temp, TREE_TYPE (exp));
5818 else
5819 store_bit_field (target,
5820 rtx_to_poly_int64 (expr_size (exp))
5821 * BITS_PER_UNIT,
5822 0, 0, 0, GET_MODE (temp), temp, reverse);
5823 }
5824 else
5825 convert_move (target, temp, TYPE_UNSIGNED (TREE_TYPE (exp)));
5826 }
5827
5828 else if (GET_MODE (temp) == BLKmode && TREE_CODE (exp) == STRING_CST)
5829 {
5830 /* Handle copying a string constant into an array. The string
5831 constant may be shorter than the array. So copy just the string's
5832 actual length, and clear the rest. First get the size of the data
5833 type of the string, which is actually the size of the target. */
5834 rtx size = expr_size (exp);
5835
5836 if (CONST_INT_P (size)
5837 && INTVAL (size) < TREE_STRING_LENGTH (exp))
5838 emit_block_move (target, temp, size,
5839 (call_param_p
5840 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
5841 else
5842 {
5843 machine_mode pointer_mode
5844 = targetm.addr_space.pointer_mode (MEM_ADDR_SPACE (target));
5845 machine_mode address_mode = get_address_mode (target);
5846
5847 /* Compute the size of the data to copy from the string. */
5848 tree copy_size
5849 = size_binop_loc (loc, MIN_EXPR,
5850 make_tree (sizetype, size),
5851 size_int (TREE_STRING_LENGTH (exp)));
5852 rtx copy_size_rtx
5853 = expand_expr (copy_size, NULL_RTX, VOIDmode,
5854 (call_param_p
5855 ? EXPAND_STACK_PARM : EXPAND_NORMAL));
5856 rtx_code_label *label = 0;
5857
5858 /* Copy that much. */
5859 copy_size_rtx = convert_to_mode (pointer_mode, copy_size_rtx,
5860 TYPE_UNSIGNED (sizetype));
5861 emit_block_move (target, temp, copy_size_rtx,
5862 (call_param_p
5863 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
5864
5865 /* Figure out how much is left in TARGET that we have to clear.
5866 Do all calculations in pointer_mode. */
5867 poly_int64 const_copy_size;
5868 if (poly_int_rtx_p (copy_size_rtx, &const_copy_size))
5869 {
5870 size = plus_constant (address_mode, size, -const_copy_size);
5871 target = adjust_address (target, BLKmode, const_copy_size);
5872 }
5873 else
5874 {
5875 size = expand_binop (TYPE_MODE (sizetype), sub_optab, size,
5876 copy_size_rtx, NULL_RTX, 0,
5877 OPTAB_LIB_WIDEN);
5878
5879 if (GET_MODE (copy_size_rtx) != address_mode)
5880 copy_size_rtx = convert_to_mode (address_mode,
5881 copy_size_rtx,
5882 TYPE_UNSIGNED (sizetype));
5883
5884 target = offset_address (target, copy_size_rtx,
5885 highest_pow2_factor (copy_size));
5886 label = gen_label_rtx ();
5887 emit_cmp_and_jump_insns (size, const0_rtx, LT, NULL_RTX,
5888 GET_MODE (size), 0, label);
5889 }
5890
5891 if (size != const0_rtx)
5892 clear_storage (target, size, BLOCK_OP_NORMAL);
5893
5894 if (label)
5895 emit_label (label);
5896 }
5897 }
5898 /* Handle calls that return values in multiple non-contiguous locations.
5899 The Irix 6 ABI has examples of this. */
5900 else if (GET_CODE (target) == PARALLEL)
5901 {
5902 if (GET_CODE (temp) == PARALLEL)
5903 emit_group_move (target, temp);
5904 else
5905 emit_group_load (target, temp, TREE_TYPE (exp),
5906 int_size_in_bytes (TREE_TYPE (exp)));
5907 }
5908 else if (GET_CODE (temp) == PARALLEL)
5909 emit_group_store (target, temp, TREE_TYPE (exp),
5910 int_size_in_bytes (TREE_TYPE (exp)));
5911 else if (GET_MODE (temp) == BLKmode)
5912 emit_block_move (target, temp, expr_size (exp),
5913 (call_param_p
5914 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
5915 /* If we emit a nontemporal store, there is nothing else to do. */
5916 else if (nontemporal && emit_storent_insn (target, temp))
5917 ;
5918 else
5919 {
5920 if (reverse)
5921 temp = flip_storage_order (GET_MODE (target), temp);
5922 temp = force_operand (temp, target);
5923 if (temp != target)
5924 emit_move_insn (target, temp);
5925 }
5926 }
5927
5928 return NULL_RTX;
5929 }
5930 \f
5931 /* Return true if field F of structure TYPE is a flexible array. */
5932
5933 static bool
5934 flexible_array_member_p (const_tree f, const_tree type)
5935 {
5936 const_tree tf;
5937
5938 tf = TREE_TYPE (f);
5939 return (DECL_CHAIN (f) == NULL
5940 && TREE_CODE (tf) == ARRAY_TYPE
5941 && TYPE_DOMAIN (tf)
5942 && TYPE_MIN_VALUE (TYPE_DOMAIN (tf))
5943 && integer_zerop (TYPE_MIN_VALUE (TYPE_DOMAIN (tf)))
5944 && !TYPE_MAX_VALUE (TYPE_DOMAIN (tf))
5945 && int_size_in_bytes (type) >= 0);
5946 }
5947
5948 /* If FOR_CTOR_P, return the number of top-level elements that a constructor
5949 must have in order for it to completely initialize a value of type TYPE.
5950 Return -1 if the number isn't known.
5951
5952 If !FOR_CTOR_P, return an estimate of the number of scalars in TYPE. */
5953
5954 static HOST_WIDE_INT
5955 count_type_elements (const_tree type, bool for_ctor_p)
5956 {
5957 switch (TREE_CODE (type))
5958 {
5959 case ARRAY_TYPE:
5960 {
5961 tree nelts;
5962
5963 nelts = array_type_nelts (type);
5964 if (nelts && tree_fits_uhwi_p (nelts))
5965 {
5966 unsigned HOST_WIDE_INT n;
5967
5968 n = tree_to_uhwi (nelts) + 1;
5969 if (n == 0 || for_ctor_p)
5970 return n;
5971 else
5972 return n * count_type_elements (TREE_TYPE (type), false);
5973 }
5974 return for_ctor_p ? -1 : 1;
5975 }
5976
5977 case RECORD_TYPE:
5978 {
5979 unsigned HOST_WIDE_INT n;
5980 tree f;
5981
5982 n = 0;
5983 for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
5984 if (TREE_CODE (f) == FIELD_DECL)
5985 {
5986 if (!for_ctor_p)
5987 n += count_type_elements (TREE_TYPE (f), false);
5988 else if (!flexible_array_member_p (f, type))
5989 /* Don't count flexible arrays, which are not supposed
5990 to be initialized. */
5991 n += 1;
5992 }
5993
5994 return n;
5995 }
5996
5997 case UNION_TYPE:
5998 case QUAL_UNION_TYPE:
5999 {
6000 tree f;
6001 HOST_WIDE_INT n, m;
6002
6003 gcc_assert (!for_ctor_p);
6004 /* Estimate the number of scalars in each field and pick the
6005 maximum. Other estimates would do instead; the idea is simply
6006 to make sure that the estimate is not sensitive to the ordering
6007 of the fields. */
6008 n = 1;
6009 for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
6010 if (TREE_CODE (f) == FIELD_DECL)
6011 {
6012 m = count_type_elements (TREE_TYPE (f), false);
6013 /* If the field doesn't span the whole union, add an extra
6014 scalar for the rest. */
6015 if (simple_cst_equal (TYPE_SIZE (TREE_TYPE (f)),
6016 TYPE_SIZE (type)) != 1)
6017 m++;
6018 if (n < m)
6019 n = m;
6020 }
6021 return n;
6022 }
6023
6024 case COMPLEX_TYPE:
6025 return 2;
6026
6027 case VECTOR_TYPE:
6028 {
6029 unsigned HOST_WIDE_INT nelts;
6030 if (TYPE_VECTOR_SUBPARTS (type).is_constant (&nelts))
6031 return nelts;
6032 else
6033 return -1;
6034 }
6035
6036 case INTEGER_TYPE:
6037 case REAL_TYPE:
6038 case FIXED_POINT_TYPE:
6039 case ENUMERAL_TYPE:
6040 case BOOLEAN_TYPE:
6041 case POINTER_TYPE:
6042 case OFFSET_TYPE:
6043 case REFERENCE_TYPE:
6044 case NULLPTR_TYPE:
6045 return 1;
6046
6047 case ERROR_MARK:
6048 return 0;
6049
6050 case VOID_TYPE:
6051 case METHOD_TYPE:
6052 case FUNCTION_TYPE:
6053 case LANG_TYPE:
6054 default:
6055 gcc_unreachable ();
6056 }
6057 }
6058
6059 /* Helper for categorize_ctor_elements. Identical interface. */
6060
6061 static bool
6062 categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts,
6063 HOST_WIDE_INT *p_unique_nz_elts,
6064 HOST_WIDE_INT *p_init_elts, bool *p_complete)
6065 {
6066 unsigned HOST_WIDE_INT idx;
6067 HOST_WIDE_INT nz_elts, unique_nz_elts, init_elts, num_fields;
6068 tree value, purpose, elt_type;
6069
6070 /* Whether CTOR is a valid constant initializer, in accordance with what
6071 initializer_constant_valid_p does. If inferred from the constructor
6072 elements, true until proven otherwise. */
6073 bool const_from_elts_p = constructor_static_from_elts_p (ctor);
6074 bool const_p = const_from_elts_p ? true : TREE_STATIC (ctor);
6075
6076 nz_elts = 0;
6077 unique_nz_elts = 0;
6078 init_elts = 0;
6079 num_fields = 0;
6080 elt_type = NULL_TREE;
6081
6082 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), idx, purpose, value)
6083 {
6084 HOST_WIDE_INT mult = 1;
6085
6086 if (purpose && TREE_CODE (purpose) == RANGE_EXPR)
6087 {
6088 tree lo_index = TREE_OPERAND (purpose, 0);
6089 tree hi_index = TREE_OPERAND (purpose, 1);
6090
6091 if (tree_fits_uhwi_p (lo_index) && tree_fits_uhwi_p (hi_index))
6092 mult = (tree_to_uhwi (hi_index)
6093 - tree_to_uhwi (lo_index) + 1);
6094 }
6095 num_fields += mult;
6096 elt_type = TREE_TYPE (value);
6097
6098 switch (TREE_CODE (value))
6099 {
6100 case CONSTRUCTOR:
6101 {
6102 HOST_WIDE_INT nz = 0, unz = 0, ic = 0;
6103
6104 bool const_elt_p = categorize_ctor_elements_1 (value, &nz, &unz,
6105 &ic, p_complete);
6106
6107 nz_elts += mult * nz;
6108 unique_nz_elts += unz;
6109 init_elts += mult * ic;
6110
6111 if (const_from_elts_p && const_p)
6112 const_p = const_elt_p;
6113 }
6114 break;
6115
6116 case INTEGER_CST:
6117 case REAL_CST:
6118 case FIXED_CST:
6119 if (!initializer_zerop (value))
6120 {
6121 nz_elts += mult;
6122 unique_nz_elts++;
6123 }
6124 init_elts += mult;
6125 break;
6126
6127 case STRING_CST:
6128 nz_elts += mult * TREE_STRING_LENGTH (value);
6129 unique_nz_elts += TREE_STRING_LENGTH (value);
6130 init_elts += mult * TREE_STRING_LENGTH (value);
6131 break;
6132
6133 case COMPLEX_CST:
6134 if (!initializer_zerop (TREE_REALPART (value)))
6135 {
6136 nz_elts += mult;
6137 unique_nz_elts++;
6138 }
6139 if (!initializer_zerop (TREE_IMAGPART (value)))
6140 {
6141 nz_elts += mult;
6142 unique_nz_elts++;
6143 }
6144 init_elts += 2 * mult;
6145 break;
6146
6147 case VECTOR_CST:
6148 {
6149 /* We can only construct constant-length vectors using
6150 CONSTRUCTOR. */
6151 unsigned int nunits = VECTOR_CST_NELTS (value).to_constant ();
6152 for (unsigned int i = 0; i < nunits; ++i)
6153 {
6154 tree v = VECTOR_CST_ELT (value, i);
6155 if (!initializer_zerop (v))
6156 {
6157 nz_elts += mult;
6158 unique_nz_elts++;
6159 }
6160 init_elts += mult;
6161 }
6162 }
6163 break;
6164
6165 default:
6166 {
6167 HOST_WIDE_INT tc = count_type_elements (elt_type, false);
6168 nz_elts += mult * tc;
6169 unique_nz_elts += tc;
6170 init_elts += mult * tc;
6171
6172 if (const_from_elts_p && const_p)
6173 const_p
6174 = initializer_constant_valid_p (value,
6175 elt_type,
6176 TYPE_REVERSE_STORAGE_ORDER
6177 (TREE_TYPE (ctor)))
6178 != NULL_TREE;
6179 }
6180 break;
6181 }
6182 }
6183
6184 if (*p_complete && !complete_ctor_at_level_p (TREE_TYPE (ctor),
6185 num_fields, elt_type))
6186 *p_complete = false;
6187
6188 *p_nz_elts += nz_elts;
6189 *p_unique_nz_elts += unique_nz_elts;
6190 *p_init_elts += init_elts;
6191
6192 return const_p;
6193 }
6194
6195 /* Examine CTOR to discover:
6196 * how many scalar fields are set to nonzero values,
6197 and place it in *P_NZ_ELTS;
6198 * the same, but counting RANGE_EXPRs as multiplier of 1 instead of
6199 high - low + 1 (this can be useful for callers to determine ctors
6200 that could be cheaply initialized with - perhaps nested - loops
6201 compared to copied from huge read-only data),
6202 and place it in *P_UNIQUE_NZ_ELTS;
6203 * how many scalar fields in total are in CTOR,
6204 and place it in *P_ELT_COUNT.
6205 * whether the constructor is complete -- in the sense that every
6206 meaningful byte is explicitly given a value --
6207 and place it in *P_COMPLETE.
6208
6209 Return whether or not CTOR is a valid static constant initializer, the same
6210 as "initializer_constant_valid_p (CTOR, TREE_TYPE (CTOR)) != 0". */
6211
6212 bool
6213 categorize_ctor_elements (const_tree ctor, HOST_WIDE_INT *p_nz_elts,
6214 HOST_WIDE_INT *p_unique_nz_elts,
6215 HOST_WIDE_INT *p_init_elts, bool *p_complete)
6216 {
6217 *p_nz_elts = 0;
6218 *p_unique_nz_elts = 0;
6219 *p_init_elts = 0;
6220 *p_complete = true;
6221
6222 return categorize_ctor_elements_1 (ctor, p_nz_elts, p_unique_nz_elts,
6223 p_init_elts, p_complete);
6224 }
6225
6226 /* TYPE is initialized by a constructor with NUM_ELTS elements, the last
6227 of which had type LAST_TYPE. Each element was itself a complete
6228 initializer, in the sense that every meaningful byte was explicitly
6229 given a value. Return true if the same is true for the constructor
6230 as a whole. */
6231
6232 bool
6233 complete_ctor_at_level_p (const_tree type, HOST_WIDE_INT num_elts,
6234 const_tree last_type)
6235 {
6236 if (TREE_CODE (type) == UNION_TYPE
6237 || TREE_CODE (type) == QUAL_UNION_TYPE)
6238 {
6239 if (num_elts == 0)
6240 return false;
6241
6242 gcc_assert (num_elts == 1 && last_type);
6243
6244 /* ??? We could look at each element of the union, and find the
6245 largest element. Which would avoid comparing the size of the
6246 initialized element against any tail padding in the union.
6247 Doesn't seem worth the effort... */
6248 return simple_cst_equal (TYPE_SIZE (type), TYPE_SIZE (last_type)) == 1;
6249 }
6250
6251 return count_type_elements (type, true) == num_elts;
6252 }
6253
6254 /* Return 1 if EXP contains mostly (3/4) zeros. */
6255
6256 static int
6257 mostly_zeros_p (const_tree exp)
6258 {
6259 if (TREE_CODE (exp) == CONSTRUCTOR)
6260 {
6261 HOST_WIDE_INT nz_elts, unz_elts, init_elts;
6262 bool complete_p;
6263
6264 categorize_ctor_elements (exp, &nz_elts, &unz_elts, &init_elts,
6265 &complete_p);
6266 return !complete_p || nz_elts < init_elts / 4;
6267 }
6268
6269 return initializer_zerop (exp);
6270 }
6271
6272 /* Return 1 if EXP contains all zeros. */
6273
6274 static int
6275 all_zeros_p (const_tree exp)
6276 {
6277 if (TREE_CODE (exp) == CONSTRUCTOR)
6278 {
6279 HOST_WIDE_INT nz_elts, unz_elts, init_elts;
6280 bool complete_p;
6281
6282 categorize_ctor_elements (exp, &nz_elts, &unz_elts, &init_elts,
6283 &complete_p);
6284 return nz_elts == 0;
6285 }
6286
6287 return initializer_zerop (exp);
6288 }
6289 \f
6290 /* Helper function for store_constructor.
6291 TARGET, BITSIZE, BITPOS, MODE, EXP are as for store_field.
6292 CLEARED is as for store_constructor.
6293 ALIAS_SET is the alias set to use for any stores.
6294 If REVERSE is true, the store is to be done in reverse order.
6295
6296 This provides a recursive shortcut back to store_constructor when it isn't
6297 necessary to go through store_field. This is so that we can pass through
6298 the cleared field to let store_constructor know that we may not have to
6299 clear a substructure if the outer structure has already been cleared. */
6300
6301 static void
6302 store_constructor_field (rtx target, poly_uint64 bitsize, poly_int64 bitpos,
6303 poly_uint64 bitregion_start,
6304 poly_uint64 bitregion_end,
6305 machine_mode mode,
6306 tree exp, int cleared,
6307 alias_set_type alias_set, bool reverse)
6308 {
6309 poly_int64 bytepos;
6310 poly_uint64 bytesize;
6311 if (TREE_CODE (exp) == CONSTRUCTOR
6312 /* We can only call store_constructor recursively if the size and
6313 bit position are on a byte boundary. */
6314 && multiple_p (bitpos, BITS_PER_UNIT, &bytepos)
6315 && maybe_ne (bitsize, 0U)
6316 && multiple_p (bitsize, BITS_PER_UNIT, &bytesize)
6317 /* If we have a nonzero bitpos for a register target, then we just
6318 let store_field do the bitfield handling. This is unlikely to
6319 generate unnecessary clear instructions anyways. */
6320 && (known_eq (bitpos, 0) || MEM_P (target)))
6321 {
6322 if (MEM_P (target))
6323 {
6324 machine_mode target_mode = GET_MODE (target);
6325 if (target_mode != BLKmode
6326 && !multiple_p (bitpos, GET_MODE_ALIGNMENT (target_mode)))
6327 target_mode = BLKmode;
6328 target = adjust_address (target, target_mode, bytepos);
6329 }
6330
6331
6332 /* Update the alias set, if required. */
6333 if (MEM_P (target) && ! MEM_KEEP_ALIAS_SET_P (target)
6334 && MEM_ALIAS_SET (target) != 0)
6335 {
6336 target = copy_rtx (target);
6337 set_mem_alias_set (target, alias_set);
6338 }
6339
6340 store_constructor (exp, target, cleared, bytesize, reverse);
6341 }
6342 else
6343 store_field (target, bitsize, bitpos, bitregion_start, bitregion_end, mode,
6344 exp, alias_set, false, reverse);
6345 }
6346
6347
6348 /* Returns the number of FIELD_DECLs in TYPE. */
6349
6350 static int
6351 fields_length (const_tree type)
6352 {
6353 tree t = TYPE_FIELDS (type);
6354 int count = 0;
6355
6356 for (; t; t = DECL_CHAIN (t))
6357 if (TREE_CODE (t) == FIELD_DECL)
6358 ++count;
6359
6360 return count;
6361 }
6362
6363
6364 /* Store the value of constructor EXP into the rtx TARGET.
6365 TARGET is either a REG or a MEM; we know it cannot conflict, since
6366 safe_from_p has been called.
6367 CLEARED is true if TARGET is known to have been zero'd.
6368 SIZE is the number of bytes of TARGET we are allowed to modify: this
6369 may not be the same as the size of EXP if we are assigning to a field
6370 which has been packed to exclude padding bits.
6371 If REVERSE is true, the store is to be done in reverse order. */
6372
6373 static void
6374 store_constructor (tree exp, rtx target, int cleared, poly_int64 size,
6375 bool reverse)
6376 {
6377 tree type = TREE_TYPE (exp);
6378 HOST_WIDE_INT exp_size = int_size_in_bytes (type);
6379 poly_int64 bitregion_end = known_gt (size, 0) ? size * BITS_PER_UNIT - 1 : 0;
6380
6381 switch (TREE_CODE (type))
6382 {
6383 case RECORD_TYPE:
6384 case UNION_TYPE:
6385 case QUAL_UNION_TYPE:
6386 {
6387 unsigned HOST_WIDE_INT idx;
6388 tree field, value;
6389
6390 /* The storage order is specified for every aggregate type. */
6391 reverse = TYPE_REVERSE_STORAGE_ORDER (type);
6392
6393 /* If size is zero or the target is already cleared, do nothing. */
6394 if (known_eq (size, 0) || cleared)
6395 cleared = 1;
6396 /* We either clear the aggregate or indicate the value is dead. */
6397 else if ((TREE_CODE (type) == UNION_TYPE
6398 || TREE_CODE (type) == QUAL_UNION_TYPE)
6399 && ! CONSTRUCTOR_ELTS (exp))
6400 /* If the constructor is empty, clear the union. */
6401 {
6402 clear_storage (target, expr_size (exp), BLOCK_OP_NORMAL);
6403 cleared = 1;
6404 }
6405
6406 /* If we are building a static constructor into a register,
6407 set the initial value as zero so we can fold the value into
6408 a constant. But if more than one register is involved,
6409 this probably loses. */
6410 else if (REG_P (target) && TREE_STATIC (exp)
6411 && known_le (GET_MODE_SIZE (GET_MODE (target)),
6412 REGMODE_NATURAL_SIZE (GET_MODE (target))))
6413 {
6414 emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
6415 cleared = 1;
6416 }
6417
6418 /* If the constructor has fewer fields than the structure or
6419 if we are initializing the structure to mostly zeros, clear
6420 the whole structure first. Don't do this if TARGET is a
6421 register whose mode size isn't equal to SIZE since
6422 clear_storage can't handle this case. */
6423 else if (known_size_p (size)
6424 && (((int) CONSTRUCTOR_NELTS (exp) != fields_length (type))
6425 || mostly_zeros_p (exp))
6426 && (!REG_P (target)
6427 || known_eq (GET_MODE_SIZE (GET_MODE (target)), size)))
6428 {
6429 clear_storage (target, gen_int_mode (size, Pmode),
6430 BLOCK_OP_NORMAL);
6431 cleared = 1;
6432 }
6433
6434 if (REG_P (target) && !cleared)
6435 emit_clobber (target);
6436
6437 /* Store each element of the constructor into the
6438 corresponding field of TARGET. */
6439 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, field, value)
6440 {
6441 machine_mode mode;
6442 HOST_WIDE_INT bitsize;
6443 HOST_WIDE_INT bitpos = 0;
6444 tree offset;
6445 rtx to_rtx = target;
6446
6447 /* Just ignore missing fields. We cleared the whole
6448 structure, above, if any fields are missing. */
6449 if (field == 0)
6450 continue;
6451
6452 if (cleared && initializer_zerop (value))
6453 continue;
6454
6455 if (tree_fits_uhwi_p (DECL_SIZE (field)))
6456 bitsize = tree_to_uhwi (DECL_SIZE (field));
6457 else
6458 gcc_unreachable ();
6459
6460 mode = DECL_MODE (field);
6461 if (DECL_BIT_FIELD (field))
6462 mode = VOIDmode;
6463
6464 offset = DECL_FIELD_OFFSET (field);
6465 if (tree_fits_shwi_p (offset)
6466 && tree_fits_shwi_p (bit_position (field)))
6467 {
6468 bitpos = int_bit_position (field);
6469 offset = NULL_TREE;
6470 }
6471 else
6472 gcc_unreachable ();
6473
6474 /* If this initializes a field that is smaller than a
6475 word, at the start of a word, try to widen it to a full
6476 word. This special case allows us to output C++ member
6477 function initializations in a form that the optimizers
6478 can understand. */
6479 if (WORD_REGISTER_OPERATIONS
6480 && REG_P (target)
6481 && bitsize < BITS_PER_WORD
6482 && bitpos % BITS_PER_WORD == 0
6483 && GET_MODE_CLASS (mode) == MODE_INT
6484 && TREE_CODE (value) == INTEGER_CST
6485 && exp_size >= 0
6486 && bitpos + BITS_PER_WORD <= exp_size * BITS_PER_UNIT)
6487 {
6488 type = TREE_TYPE (value);
6489
6490 if (TYPE_PRECISION (type) < BITS_PER_WORD)
6491 {
6492 type = lang_hooks.types.type_for_mode
6493 (word_mode, TYPE_UNSIGNED (type));
6494 value = fold_convert (type, value);
6495 /* Make sure the bits beyond the original bitsize are zero
6496 so that we can correctly avoid extra zeroing stores in
6497 later constructor elements. */
6498 tree bitsize_mask
6499 = wide_int_to_tree (type, wi::mask (bitsize, false,
6500 BITS_PER_WORD));
6501 value = fold_build2 (BIT_AND_EXPR, type, value, bitsize_mask);
6502 }
6503
6504 if (BYTES_BIG_ENDIAN)
6505 value
6506 = fold_build2 (LSHIFT_EXPR, type, value,
6507 build_int_cst (type,
6508 BITS_PER_WORD - bitsize));
6509 bitsize = BITS_PER_WORD;
6510 mode = word_mode;
6511 }
6512
6513 if (MEM_P (to_rtx) && !MEM_KEEP_ALIAS_SET_P (to_rtx)
6514 && DECL_NONADDRESSABLE_P (field))
6515 {
6516 to_rtx = copy_rtx (to_rtx);
6517 MEM_KEEP_ALIAS_SET_P (to_rtx) = 1;
6518 }
6519
6520 store_constructor_field (to_rtx, bitsize, bitpos,
6521 0, bitregion_end, mode,
6522 value, cleared,
6523 get_alias_set (TREE_TYPE (field)),
6524 reverse);
6525 }
6526 break;
6527 }
6528 case ARRAY_TYPE:
6529 {
6530 tree value, index;
6531 unsigned HOST_WIDE_INT i;
6532 int need_to_clear;
6533 tree domain;
6534 tree elttype = TREE_TYPE (type);
6535 int const_bounds_p;
6536 HOST_WIDE_INT minelt = 0;
6537 HOST_WIDE_INT maxelt = 0;
6538
6539 /* The storage order is specified for every aggregate type. */
6540 reverse = TYPE_REVERSE_STORAGE_ORDER (type);
6541
6542 domain = TYPE_DOMAIN (type);
6543 const_bounds_p = (TYPE_MIN_VALUE (domain)
6544 && TYPE_MAX_VALUE (domain)
6545 && tree_fits_shwi_p (TYPE_MIN_VALUE (domain))
6546 && tree_fits_shwi_p (TYPE_MAX_VALUE (domain)));
6547
6548 /* If we have constant bounds for the range of the type, get them. */
6549 if (const_bounds_p)
6550 {
6551 minelt = tree_to_shwi (TYPE_MIN_VALUE (domain));
6552 maxelt = tree_to_shwi (TYPE_MAX_VALUE (domain));
6553 }
6554
6555 /* If the constructor has fewer elements than the array, clear
6556 the whole array first. Similarly if this is static
6557 constructor of a non-BLKmode object. */
6558 if (cleared)
6559 need_to_clear = 0;
6560 else if (REG_P (target) && TREE_STATIC (exp))
6561 need_to_clear = 1;
6562 else
6563 {
6564 unsigned HOST_WIDE_INT idx;
6565 HOST_WIDE_INT count = 0, zero_count = 0;
6566 need_to_clear = ! const_bounds_p;
6567
6568 /* This loop is a more accurate version of the loop in
6569 mostly_zeros_p (it handles RANGE_EXPR in an index). It
6570 is also needed to check for missing elements. */
6571 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, index, value)
6572 {
6573 HOST_WIDE_INT this_node_count;
6574
6575 if (need_to_clear)
6576 break;
6577
6578 if (index != NULL_TREE && TREE_CODE (index) == RANGE_EXPR)
6579 {
6580 tree lo_index = TREE_OPERAND (index, 0);
6581 tree hi_index = TREE_OPERAND (index, 1);
6582
6583 if (! tree_fits_uhwi_p (lo_index)
6584 || ! tree_fits_uhwi_p (hi_index))
6585 {
6586 need_to_clear = 1;
6587 break;
6588 }
6589
6590 this_node_count = (tree_to_uhwi (hi_index)
6591 - tree_to_uhwi (lo_index) + 1);
6592 }
6593 else
6594 this_node_count = 1;
6595
6596 count += this_node_count;
6597 if (mostly_zeros_p (value))
6598 zero_count += this_node_count;
6599 }
6600
6601 /* Clear the entire array first if there are any missing
6602 elements, or if the incidence of zero elements is >=
6603 75%. */
6604 if (! need_to_clear
6605 && (count < maxelt - minelt + 1
6606 || 4 * zero_count >= 3 * count))
6607 need_to_clear = 1;
6608 }
6609
6610 if (need_to_clear && maybe_gt (size, 0))
6611 {
6612 if (REG_P (target))
6613 emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
6614 else
6615 clear_storage (target, gen_int_mode (size, Pmode),
6616 BLOCK_OP_NORMAL);
6617 cleared = 1;
6618 }
6619
6620 if (!cleared && REG_P (target))
6621 /* Inform later passes that the old value is dead. */
6622 emit_clobber (target);
6623
6624 /* Store each element of the constructor into the
6625 corresponding element of TARGET, determined by counting the
6626 elements. */
6627 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), i, index, value)
6628 {
6629 machine_mode mode;
6630 poly_int64 bitsize;
6631 HOST_WIDE_INT bitpos;
6632 rtx xtarget = target;
6633
6634 if (cleared && initializer_zerop (value))
6635 continue;
6636
6637 mode = TYPE_MODE (elttype);
6638 if (mode != BLKmode)
6639 bitsize = GET_MODE_BITSIZE (mode);
6640 else if (!poly_int_tree_p (TYPE_SIZE (elttype), &bitsize))
6641 bitsize = -1;
6642
6643 if (index != NULL_TREE && TREE_CODE (index) == RANGE_EXPR)
6644 {
6645 tree lo_index = TREE_OPERAND (index, 0);
6646 tree hi_index = TREE_OPERAND (index, 1);
6647 rtx index_r, pos_rtx;
6648 HOST_WIDE_INT lo, hi, count;
6649 tree position;
6650
6651 /* If the range is constant and "small", unroll the loop. */
6652 if (const_bounds_p
6653 && tree_fits_shwi_p (lo_index)
6654 && tree_fits_shwi_p (hi_index)
6655 && (lo = tree_to_shwi (lo_index),
6656 hi = tree_to_shwi (hi_index),
6657 count = hi - lo + 1,
6658 (!MEM_P (target)
6659 || count <= 2
6660 || (tree_fits_uhwi_p (TYPE_SIZE (elttype))
6661 && (tree_to_uhwi (TYPE_SIZE (elttype)) * count
6662 <= 40 * 8)))))
6663 {
6664 lo -= minelt; hi -= minelt;
6665 for (; lo <= hi; lo++)
6666 {
6667 bitpos = lo * tree_to_shwi (TYPE_SIZE (elttype));
6668
6669 if (MEM_P (target)
6670 && !MEM_KEEP_ALIAS_SET_P (target)
6671 && TREE_CODE (type) == ARRAY_TYPE
6672 && TYPE_NONALIASED_COMPONENT (type))
6673 {
6674 target = copy_rtx (target);
6675 MEM_KEEP_ALIAS_SET_P (target) = 1;
6676 }
6677
6678 store_constructor_field
6679 (target, bitsize, bitpos, 0, bitregion_end,
6680 mode, value, cleared,
6681 get_alias_set (elttype), reverse);
6682 }
6683 }
6684 else
6685 {
6686 rtx_code_label *loop_start = gen_label_rtx ();
6687 rtx_code_label *loop_end = gen_label_rtx ();
6688 tree exit_cond;
6689
6690 expand_normal (hi_index);
6691
6692 index = build_decl (EXPR_LOCATION (exp),
6693 VAR_DECL, NULL_TREE, domain);
6694 index_r = gen_reg_rtx (promote_decl_mode (index, NULL));
6695 SET_DECL_RTL (index, index_r);
6696 store_expr (lo_index, index_r, 0, false, reverse);
6697
6698 /* Build the head of the loop. */
6699 do_pending_stack_adjust ();
6700 emit_label (loop_start);
6701
6702 /* Assign value to element index. */
6703 position =
6704 fold_convert (ssizetype,
6705 fold_build2 (MINUS_EXPR,
6706 TREE_TYPE (index),
6707 index,
6708 TYPE_MIN_VALUE (domain)));
6709
6710 position =
6711 size_binop (MULT_EXPR, position,
6712 fold_convert (ssizetype,
6713 TYPE_SIZE_UNIT (elttype)));
6714
6715 pos_rtx = expand_normal (position);
6716 xtarget = offset_address (target, pos_rtx,
6717 highest_pow2_factor (position));
6718 xtarget = adjust_address (xtarget, mode, 0);
6719 if (TREE_CODE (value) == CONSTRUCTOR)
6720 store_constructor (value, xtarget, cleared,
6721 exact_div (bitsize, BITS_PER_UNIT),
6722 reverse);
6723 else
6724 store_expr (value, xtarget, 0, false, reverse);
6725
6726 /* Generate a conditional jump to exit the loop. */
6727 exit_cond = build2 (LT_EXPR, integer_type_node,
6728 index, hi_index);
6729 jumpif (exit_cond, loop_end,
6730 profile_probability::uninitialized ());
6731
6732 /* Update the loop counter, and jump to the head of
6733 the loop. */
6734 expand_assignment (index,
6735 build2 (PLUS_EXPR, TREE_TYPE (index),
6736 index, integer_one_node),
6737 false);
6738
6739 emit_jump (loop_start);
6740
6741 /* Build the end of the loop. */
6742 emit_label (loop_end);
6743 }
6744 }
6745 else if ((index != 0 && ! tree_fits_shwi_p (index))
6746 || ! tree_fits_uhwi_p (TYPE_SIZE (elttype)))
6747 {
6748 tree position;
6749
6750 if (index == 0)
6751 index = ssize_int (1);
6752
6753 if (minelt)
6754 index = fold_convert (ssizetype,
6755 fold_build2 (MINUS_EXPR,
6756 TREE_TYPE (index),
6757 index,
6758 TYPE_MIN_VALUE (domain)));
6759
6760 position =
6761 size_binop (MULT_EXPR, index,
6762 fold_convert (ssizetype,
6763 TYPE_SIZE_UNIT (elttype)));
6764 xtarget = offset_address (target,
6765 expand_normal (position),
6766 highest_pow2_factor (position));
6767 xtarget = adjust_address (xtarget, mode, 0);
6768 store_expr (value, xtarget, 0, false, reverse);
6769 }
6770 else
6771 {
6772 if (index != 0)
6773 bitpos = ((tree_to_shwi (index) - minelt)
6774 * tree_to_uhwi (TYPE_SIZE (elttype)));
6775 else
6776 bitpos = (i * tree_to_uhwi (TYPE_SIZE (elttype)));
6777
6778 if (MEM_P (target) && !MEM_KEEP_ALIAS_SET_P (target)
6779 && TREE_CODE (type) == ARRAY_TYPE
6780 && TYPE_NONALIASED_COMPONENT (type))
6781 {
6782 target = copy_rtx (target);
6783 MEM_KEEP_ALIAS_SET_P (target) = 1;
6784 }
6785 store_constructor_field (target, bitsize, bitpos, 0,
6786 bitregion_end, mode, value,
6787 cleared, get_alias_set (elttype),
6788 reverse);
6789 }
6790 }
6791 break;
6792 }
6793
6794 case VECTOR_TYPE:
6795 {
6796 unsigned HOST_WIDE_INT idx;
6797 constructor_elt *ce;
6798 int i;
6799 int need_to_clear;
6800 insn_code icode = CODE_FOR_nothing;
6801 tree elt;
6802 tree elttype = TREE_TYPE (type);
6803 int elt_size = tree_to_uhwi (TYPE_SIZE (elttype));
6804 machine_mode eltmode = TYPE_MODE (elttype);
6805 HOST_WIDE_INT bitsize;
6806 HOST_WIDE_INT bitpos;
6807 rtvec vector = NULL;
6808 poly_uint64 n_elts;
6809 unsigned HOST_WIDE_INT const_n_elts;
6810 alias_set_type alias;
6811 bool vec_vec_init_p = false;
6812 machine_mode mode = GET_MODE (target);
6813
6814 gcc_assert (eltmode != BLKmode);
6815
6816 /* Try using vec_duplicate_optab for uniform vectors. */
6817 if (!TREE_SIDE_EFFECTS (exp)
6818 && VECTOR_MODE_P (mode)
6819 && eltmode == GET_MODE_INNER (mode)
6820 && ((icode = optab_handler (vec_duplicate_optab, mode))
6821 != CODE_FOR_nothing)
6822 && (elt = uniform_vector_p (exp)))
6823 {
6824 class expand_operand ops[2];
6825 create_output_operand (&ops[0], target, mode);
6826 create_input_operand (&ops[1], expand_normal (elt), eltmode);
6827 expand_insn (icode, 2, ops);
6828 if (!rtx_equal_p (target, ops[0].value))
6829 emit_move_insn (target, ops[0].value);
6830 break;
6831 }
6832
6833 n_elts = TYPE_VECTOR_SUBPARTS (type);
6834 if (REG_P (target)
6835 && VECTOR_MODE_P (mode)
6836 && n_elts.is_constant (&const_n_elts))
6837 {
6838 machine_mode emode = eltmode;
6839 bool vector_typed_elts_p = false;
6840
6841 if (CONSTRUCTOR_NELTS (exp)
6842 && (TREE_CODE (TREE_TYPE (CONSTRUCTOR_ELT (exp, 0)->value))
6843 == VECTOR_TYPE))
6844 {
6845 tree etype = TREE_TYPE (CONSTRUCTOR_ELT (exp, 0)->value);
6846 gcc_assert (known_eq (CONSTRUCTOR_NELTS (exp)
6847 * TYPE_VECTOR_SUBPARTS (etype),
6848 n_elts));
6849 emode = TYPE_MODE (etype);
6850 vector_typed_elts_p = true;
6851 }
6852 icode = convert_optab_handler (vec_init_optab, mode, emode);
6853 if (icode != CODE_FOR_nothing)
6854 {
6855 unsigned int n = const_n_elts;
6856
6857 if (vector_typed_elts_p)
6858 {
6859 n = CONSTRUCTOR_NELTS (exp);
6860 vec_vec_init_p = true;
6861 }
6862 vector = rtvec_alloc (n);
6863 for (unsigned int k = 0; k < n; k++)
6864 RTVEC_ELT (vector, k) = CONST0_RTX (emode);
6865 }
6866 }
6867
6868 /* If the constructor has fewer elements than the vector,
6869 clear the whole array first. Similarly if this is static
6870 constructor of a non-BLKmode object. */
6871 if (cleared)
6872 need_to_clear = 0;
6873 else if (REG_P (target) && TREE_STATIC (exp))
6874 need_to_clear = 1;
6875 else
6876 {
6877 unsigned HOST_WIDE_INT count = 0, zero_count = 0;
6878 tree value;
6879
6880 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
6881 {
6882 tree sz = TYPE_SIZE (TREE_TYPE (value));
6883 int n_elts_here
6884 = tree_to_uhwi (int_const_binop (TRUNC_DIV_EXPR, sz,
6885 TYPE_SIZE (elttype)));
6886
6887 count += n_elts_here;
6888 if (mostly_zeros_p (value))
6889 zero_count += n_elts_here;
6890 }
6891
6892 /* Clear the entire vector first if there are any missing elements,
6893 or if the incidence of zero elements is >= 75%. */
6894 need_to_clear = (maybe_lt (count, n_elts)
6895 || 4 * zero_count >= 3 * count);
6896 }
6897
6898 if (need_to_clear && maybe_gt (size, 0) && !vector)
6899 {
6900 if (REG_P (target))
6901 emit_move_insn (target, CONST0_RTX (mode));
6902 else
6903 clear_storage (target, gen_int_mode (size, Pmode),
6904 BLOCK_OP_NORMAL);
6905 cleared = 1;
6906 }
6907
6908 /* Inform later passes that the old value is dead. */
6909 if (!cleared && !vector && REG_P (target))
6910 emit_move_insn (target, CONST0_RTX (mode));
6911
6912 if (MEM_P (target))
6913 alias = MEM_ALIAS_SET (target);
6914 else
6915 alias = get_alias_set (elttype);
6916
6917 /* Store each element of the constructor into the corresponding
6918 element of TARGET, determined by counting the elements. */
6919 for (idx = 0, i = 0;
6920 vec_safe_iterate (CONSTRUCTOR_ELTS (exp), idx, &ce);
6921 idx++, i += bitsize / elt_size)
6922 {
6923 HOST_WIDE_INT eltpos;
6924 tree value = ce->value;
6925
6926 bitsize = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (value)));
6927 if (cleared && initializer_zerop (value))
6928 continue;
6929
6930 if (ce->index)
6931 eltpos = tree_to_uhwi (ce->index);
6932 else
6933 eltpos = i;
6934
6935 if (vector)
6936 {
6937 if (vec_vec_init_p)
6938 {
6939 gcc_assert (ce->index == NULL_TREE);
6940 gcc_assert (TREE_CODE (TREE_TYPE (value)) == VECTOR_TYPE);
6941 eltpos = idx;
6942 }
6943 else
6944 gcc_assert (TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE);
6945 RTVEC_ELT (vector, eltpos) = expand_normal (value);
6946 }
6947 else
6948 {
6949 machine_mode value_mode
6950 = (TREE_CODE (TREE_TYPE (value)) == VECTOR_TYPE
6951 ? TYPE_MODE (TREE_TYPE (value)) : eltmode);
6952 bitpos = eltpos * elt_size;
6953 store_constructor_field (target, bitsize, bitpos, 0,
6954 bitregion_end, value_mode,
6955 value, cleared, alias, reverse);
6956 }
6957 }
6958
6959 if (vector)
6960 emit_insn (GEN_FCN (icode) (target,
6961 gen_rtx_PARALLEL (mode, vector)));
6962 break;
6963 }
6964
6965 default:
6966 gcc_unreachable ();
6967 }
6968 }
6969
6970 /* Store the value of EXP (an expression tree)
6971 into a subfield of TARGET which has mode MODE and occupies
6972 BITSIZE bits, starting BITPOS bits from the start of TARGET.
6973 If MODE is VOIDmode, it means that we are storing into a bit-field.
6974
6975 BITREGION_START is bitpos of the first bitfield in this region.
6976 BITREGION_END is the bitpos of the ending bitfield in this region.
6977 These two fields are 0, if the C++ memory model does not apply,
6978 or we are not interested in keeping track of bitfield regions.
6979
6980 Always return const0_rtx unless we have something particular to
6981 return.
6982
6983 ALIAS_SET is the alias set for the destination. This value will
6984 (in general) be different from that for TARGET, since TARGET is a
6985 reference to the containing structure.
6986
6987 If NONTEMPORAL is true, try generating a nontemporal store.
6988
6989 If REVERSE is true, the store is to be done in reverse order. */
6990
6991 static rtx
6992 store_field (rtx target, poly_int64 bitsize, poly_int64 bitpos,
6993 poly_uint64 bitregion_start, poly_uint64 bitregion_end,
6994 machine_mode mode, tree exp,
6995 alias_set_type alias_set, bool nontemporal, bool reverse)
6996 {
6997 if (TREE_CODE (exp) == ERROR_MARK)
6998 return const0_rtx;
6999
7000 /* If we have nothing to store, do nothing unless the expression has
7001 side-effects. Don't do that for zero sized addressable lhs of
7002 calls. */
7003 if (known_eq (bitsize, 0)
7004 && (!TREE_ADDRESSABLE (TREE_TYPE (exp))
7005 || TREE_CODE (exp) != CALL_EXPR))
7006 return expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL);
7007
7008 if (GET_CODE (target) == CONCAT)
7009 {
7010 /* We're storing into a struct containing a single __complex. */
7011
7012 gcc_assert (known_eq (bitpos, 0));
7013 return store_expr (exp, target, 0, nontemporal, reverse);
7014 }
7015
7016 /* If the structure is in a register or if the component
7017 is a bit field, we cannot use addressing to access it.
7018 Use bit-field techniques or SUBREG to store in it. */
7019
7020 poly_int64 decl_bitsize;
7021 if (mode == VOIDmode
7022 || (mode != BLKmode && ! direct_store[(int) mode]
7023 && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
7024 && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT)
7025 || REG_P (target)
7026 || GET_CODE (target) == SUBREG
7027 /* If the field isn't aligned enough to store as an ordinary memref,
7028 store it as a bit field. */
7029 || (mode != BLKmode
7030 && ((((MEM_ALIGN (target) < GET_MODE_ALIGNMENT (mode))
7031 || !multiple_p (bitpos, GET_MODE_ALIGNMENT (mode)))
7032 && targetm.slow_unaligned_access (mode, MEM_ALIGN (target)))
7033 || !multiple_p (bitpos, BITS_PER_UNIT)))
7034 || (known_size_p (bitsize)
7035 && mode != BLKmode
7036 && maybe_gt (GET_MODE_BITSIZE (mode), bitsize))
7037 /* If the RHS and field are a constant size and the size of the
7038 RHS isn't the same size as the bitfield, we must use bitfield
7039 operations. */
7040 || (known_size_p (bitsize)
7041 && poly_int_tree_p (TYPE_SIZE (TREE_TYPE (exp)))
7042 && maybe_ne (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (exp))),
7043 bitsize)
7044 /* Except for initialization of full bytes from a CONSTRUCTOR, which
7045 we will handle specially below. */
7046 && !(TREE_CODE (exp) == CONSTRUCTOR
7047 && multiple_p (bitsize, BITS_PER_UNIT))
7048 /* And except for bitwise copying of TREE_ADDRESSABLE types,
7049 where the FIELD_DECL has the right bitsize, but TREE_TYPE (exp)
7050 includes some extra padding. store_expr / expand_expr will in
7051 that case call get_inner_reference that will have the bitsize
7052 we check here and thus the block move will not clobber the
7053 padding that shouldn't be clobbered. In the future we could
7054 replace the TREE_ADDRESSABLE check with a check that
7055 get_base_address needs to live in memory. */
7056 && (!TREE_ADDRESSABLE (TREE_TYPE (exp))
7057 || TREE_CODE (exp) != COMPONENT_REF
7058 || !multiple_p (bitsize, BITS_PER_UNIT)
7059 || !multiple_p (bitpos, BITS_PER_UNIT)
7060 || !poly_int_tree_p (DECL_SIZE (TREE_OPERAND (exp, 1)),
7061 &decl_bitsize)
7062 || maybe_ne (decl_bitsize, bitsize)))
7063 /* If we are expanding a MEM_REF of a non-BLKmode non-addressable
7064 decl we must use bitfield operations. */
7065 || (known_size_p (bitsize)
7066 && TREE_CODE (exp) == MEM_REF
7067 && TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
7068 && DECL_P (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
7069 && !TREE_ADDRESSABLE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
7070 && DECL_MODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) != BLKmode))
7071 {
7072 rtx temp;
7073 gimple *nop_def;
7074
7075 /* If EXP is a NOP_EXPR of precision less than its mode, then that
7076 implies a mask operation. If the precision is the same size as
7077 the field we're storing into, that mask is redundant. This is
7078 particularly common with bit field assignments generated by the
7079 C front end. */
7080 nop_def = get_def_for_expr (exp, NOP_EXPR);
7081 if (nop_def)
7082 {
7083 tree type = TREE_TYPE (exp);
7084 if (INTEGRAL_TYPE_P (type)
7085 && maybe_ne (TYPE_PRECISION (type),
7086 GET_MODE_BITSIZE (TYPE_MODE (type)))
7087 && known_eq (bitsize, TYPE_PRECISION (type)))
7088 {
7089 tree op = gimple_assign_rhs1 (nop_def);
7090 type = TREE_TYPE (op);
7091 if (INTEGRAL_TYPE_P (type)
7092 && known_ge (TYPE_PRECISION (type), bitsize))
7093 exp = op;
7094 }
7095 }
7096
7097 temp = expand_normal (exp);
7098
7099 /* We don't support variable-sized BLKmode bitfields, since our
7100 handling of BLKmode is bound up with the ability to break
7101 things into words. */
7102 gcc_assert (mode != BLKmode || bitsize.is_constant ());
7103
7104 /* Handle calls that return values in multiple non-contiguous locations.
7105 The Irix 6 ABI has examples of this. */
7106 if (GET_CODE (temp) == PARALLEL)
7107 {
7108 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
7109 machine_mode temp_mode = GET_MODE (temp);
7110 if (temp_mode == BLKmode || temp_mode == VOIDmode)
7111 temp_mode = smallest_int_mode_for_size (size * BITS_PER_UNIT);
7112 rtx temp_target = gen_reg_rtx (temp_mode);
7113 emit_group_store (temp_target, temp, TREE_TYPE (exp), size);
7114 temp = temp_target;
7115 }
7116
7117 /* Handle calls that return BLKmode values in registers. */
7118 else if (mode == BLKmode && REG_P (temp) && TREE_CODE (exp) == CALL_EXPR)
7119 {
7120 rtx temp_target = gen_reg_rtx (GET_MODE (temp));
7121 copy_blkmode_from_reg (temp_target, temp, TREE_TYPE (exp));
7122 temp = temp_target;
7123 }
7124
7125 /* If the value has aggregate type and an integral mode then, if BITSIZE
7126 is narrower than this mode and this is for big-endian data, we first
7127 need to put the value into the low-order bits for store_bit_field,
7128 except when MODE is BLKmode and BITSIZE larger than the word size
7129 (see the handling of fields larger than a word in store_bit_field).
7130 Moreover, the field may be not aligned on a byte boundary; in this
7131 case, if it has reverse storage order, it needs to be accessed as a
7132 scalar field with reverse storage order and we must first put the
7133 value into target order. */
7134 scalar_int_mode temp_mode;
7135 if (AGGREGATE_TYPE_P (TREE_TYPE (exp))
7136 && is_int_mode (GET_MODE (temp), &temp_mode))
7137 {
7138 HOST_WIDE_INT size = GET_MODE_BITSIZE (temp_mode);
7139
7140 reverse = TYPE_REVERSE_STORAGE_ORDER (TREE_TYPE (exp));
7141
7142 if (reverse)
7143 temp = flip_storage_order (temp_mode, temp);
7144
7145 gcc_checking_assert (known_le (bitsize, size));
7146 if (maybe_lt (bitsize, size)
7147 && reverse ? !BYTES_BIG_ENDIAN : BYTES_BIG_ENDIAN
7148 /* Use of to_constant for BLKmode was checked above. */
7149 && !(mode == BLKmode && bitsize.to_constant () > BITS_PER_WORD))
7150 temp = expand_shift (RSHIFT_EXPR, temp_mode, temp,
7151 size - bitsize, NULL_RTX, 1);
7152 }
7153
7154 /* Unless MODE is VOIDmode or BLKmode, convert TEMP to MODE. */
7155 if (mode != VOIDmode && mode != BLKmode
7156 && mode != TYPE_MODE (TREE_TYPE (exp)))
7157 temp = convert_modes (mode, TYPE_MODE (TREE_TYPE (exp)), temp, 1);
7158
7159 /* If the mode of TEMP and TARGET is BLKmode, both must be in memory
7160 and BITPOS must be aligned on a byte boundary. If so, we simply do
7161 a block copy. Likewise for a BLKmode-like TARGET. */
7162 if (GET_MODE (temp) == BLKmode
7163 && (GET_MODE (target) == BLKmode
7164 || (MEM_P (target)
7165 && GET_MODE_CLASS (GET_MODE (target)) == MODE_INT
7166 && multiple_p (bitpos, BITS_PER_UNIT)
7167 && multiple_p (bitsize, BITS_PER_UNIT))))
7168 {
7169 gcc_assert (MEM_P (target) && MEM_P (temp));
7170 poly_int64 bytepos = exact_div (bitpos, BITS_PER_UNIT);
7171 poly_int64 bytesize = bits_to_bytes_round_up (bitsize);
7172
7173 target = adjust_address (target, VOIDmode, bytepos);
7174 emit_block_move (target, temp,
7175 gen_int_mode (bytesize, Pmode),
7176 BLOCK_OP_NORMAL);
7177
7178 return const0_rtx;
7179 }
7180
7181 /* If the mode of TEMP is still BLKmode and BITSIZE not larger than the
7182 word size, we need to load the value (see again store_bit_field). */
7183 if (GET_MODE (temp) == BLKmode && known_le (bitsize, BITS_PER_WORD))
7184 {
7185 temp_mode = smallest_int_mode_for_size (bitsize);
7186 temp = extract_bit_field (temp, bitsize, 0, 1, NULL_RTX, temp_mode,
7187 temp_mode, false, NULL);
7188 }
7189
7190 /* Store the value in the bitfield. */
7191 gcc_checking_assert (known_ge (bitpos, 0));
7192 store_bit_field (target, bitsize, bitpos,
7193 bitregion_start, bitregion_end,
7194 mode, temp, reverse);
7195
7196 return const0_rtx;
7197 }
7198 else
7199 {
7200 /* Now build a reference to just the desired component. */
7201 rtx to_rtx = adjust_address (target, mode,
7202 exact_div (bitpos, BITS_PER_UNIT));
7203
7204 if (to_rtx == target)
7205 to_rtx = copy_rtx (to_rtx);
7206
7207 if (!MEM_KEEP_ALIAS_SET_P (to_rtx) && MEM_ALIAS_SET (to_rtx) != 0)
7208 set_mem_alias_set (to_rtx, alias_set);
7209
7210 /* Above we avoided using bitfield operations for storing a CONSTRUCTOR
7211 into a target smaller than its type; handle that case now. */
7212 if (TREE_CODE (exp) == CONSTRUCTOR && known_size_p (bitsize))
7213 {
7214 poly_int64 bytesize = exact_div (bitsize, BITS_PER_UNIT);
7215 store_constructor (exp, to_rtx, 0, bytesize, reverse);
7216 return to_rtx;
7217 }
7218
7219 return store_expr (exp, to_rtx, 0, nontemporal, reverse);
7220 }
7221 }
7222 \f
7223 /* Given an expression EXP that may be a COMPONENT_REF, a BIT_FIELD_REF,
7224 an ARRAY_REF, or an ARRAY_RANGE_REF, look for nested operations of these
7225 codes and find the ultimate containing object, which we return.
7226
7227 We set *PBITSIZE to the size in bits that we want, *PBITPOS to the
7228 bit position, *PUNSIGNEDP to the signedness and *PREVERSEP to the
7229 storage order of the field.
7230 If the position of the field is variable, we store a tree
7231 giving the variable offset (in units) in *POFFSET.
7232 This offset is in addition to the bit position.
7233 If the position is not variable, we store 0 in *POFFSET.
7234
7235 If any of the extraction expressions is volatile,
7236 we store 1 in *PVOLATILEP. Otherwise we don't change that.
7237
7238 If the field is a non-BLKmode bit-field, *PMODE is set to VOIDmode.
7239 Otherwise, it is a mode that can be used to access the field.
7240
7241 If the field describes a variable-sized object, *PMODE is set to
7242 BLKmode and *PBITSIZE is set to -1. An access cannot be made in
7243 this case, but the address of the object can be found. */
7244
7245 tree
7246 get_inner_reference (tree exp, poly_int64_pod *pbitsize,
7247 poly_int64_pod *pbitpos, tree *poffset,
7248 machine_mode *pmode, int *punsignedp,
7249 int *preversep, int *pvolatilep)
7250 {
7251 tree size_tree = 0;
7252 machine_mode mode = VOIDmode;
7253 bool blkmode_bitfield = false;
7254 tree offset = size_zero_node;
7255 poly_offset_int bit_offset = 0;
7256
7257 /* First get the mode, signedness, storage order and size. We do this from
7258 just the outermost expression. */
7259 *pbitsize = -1;
7260 if (TREE_CODE (exp) == COMPONENT_REF)
7261 {
7262 tree field = TREE_OPERAND (exp, 1);
7263 size_tree = DECL_SIZE (field);
7264 if (flag_strict_volatile_bitfields > 0
7265 && TREE_THIS_VOLATILE (exp)
7266 && DECL_BIT_FIELD_TYPE (field)
7267 && DECL_MODE (field) != BLKmode)
7268 /* Volatile bitfields should be accessed in the mode of the
7269 field's type, not the mode computed based on the bit
7270 size. */
7271 mode = TYPE_MODE (DECL_BIT_FIELD_TYPE (field));
7272 else if (!DECL_BIT_FIELD (field))
7273 {
7274 mode = DECL_MODE (field);
7275 /* For vector fields re-check the target flags, as DECL_MODE
7276 could have been set with different target flags than
7277 the current function has. */
7278 if (mode == BLKmode
7279 && VECTOR_TYPE_P (TREE_TYPE (field))
7280 && VECTOR_MODE_P (TYPE_MODE_RAW (TREE_TYPE (field))))
7281 mode = TYPE_MODE (TREE_TYPE (field));
7282 }
7283 else if (DECL_MODE (field) == BLKmode)
7284 blkmode_bitfield = true;
7285
7286 *punsignedp = DECL_UNSIGNED (field);
7287 }
7288 else if (TREE_CODE (exp) == BIT_FIELD_REF)
7289 {
7290 size_tree = TREE_OPERAND (exp, 1);
7291 *punsignedp = (! INTEGRAL_TYPE_P (TREE_TYPE (exp))
7292 || TYPE_UNSIGNED (TREE_TYPE (exp)));
7293
7294 /* For vector element types with the correct size of access or for
7295 vector typed accesses use the mode of the access type. */
7296 if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == VECTOR_TYPE
7297 && TREE_TYPE (exp) == TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)))
7298 && tree_int_cst_equal (size_tree, TYPE_SIZE (TREE_TYPE (exp))))
7299 || VECTOR_TYPE_P (TREE_TYPE (exp)))
7300 mode = TYPE_MODE (TREE_TYPE (exp));
7301 }
7302 else
7303 {
7304 mode = TYPE_MODE (TREE_TYPE (exp));
7305 *punsignedp = TYPE_UNSIGNED (TREE_TYPE (exp));
7306
7307 if (mode == BLKmode)
7308 size_tree = TYPE_SIZE (TREE_TYPE (exp));
7309 else
7310 *pbitsize = GET_MODE_BITSIZE (mode);
7311 }
7312
7313 if (size_tree != 0)
7314 {
7315 if (! tree_fits_uhwi_p (size_tree))
7316 mode = BLKmode, *pbitsize = -1;
7317 else
7318 *pbitsize = tree_to_uhwi (size_tree);
7319 }
7320
7321 *preversep = reverse_storage_order_for_component_p (exp);
7322
7323 /* Compute cumulative bit-offset for nested component-refs and array-refs,
7324 and find the ultimate containing object. */
7325 while (1)
7326 {
7327 switch (TREE_CODE (exp))
7328 {
7329 case BIT_FIELD_REF:
7330 bit_offset += wi::to_poly_offset (TREE_OPERAND (exp, 2));
7331 break;
7332
7333 case COMPONENT_REF:
7334 {
7335 tree field = TREE_OPERAND (exp, 1);
7336 tree this_offset = component_ref_field_offset (exp);
7337
7338 /* If this field hasn't been filled in yet, don't go past it.
7339 This should only happen when folding expressions made during
7340 type construction. */
7341 if (this_offset == 0)
7342 break;
7343
7344 offset = size_binop (PLUS_EXPR, offset, this_offset);
7345 bit_offset += wi::to_poly_offset (DECL_FIELD_BIT_OFFSET (field));
7346
7347 /* ??? Right now we don't do anything with DECL_OFFSET_ALIGN. */
7348 }
7349 break;
7350
7351 case ARRAY_REF:
7352 case ARRAY_RANGE_REF:
7353 {
7354 tree index = TREE_OPERAND (exp, 1);
7355 tree low_bound = array_ref_low_bound (exp);
7356 tree unit_size = array_ref_element_size (exp);
7357
7358 /* We assume all arrays have sizes that are a multiple of a byte.
7359 First subtract the lower bound, if any, in the type of the
7360 index, then convert to sizetype and multiply by the size of
7361 the array element. */
7362 if (! integer_zerop (low_bound))
7363 index = fold_build2 (MINUS_EXPR, TREE_TYPE (index),
7364 index, low_bound);
7365
7366 offset = size_binop (PLUS_EXPR, offset,
7367 size_binop (MULT_EXPR,
7368 fold_convert (sizetype, index),
7369 unit_size));
7370 }
7371 break;
7372
7373 case REALPART_EXPR:
7374 break;
7375
7376 case IMAGPART_EXPR:
7377 bit_offset += *pbitsize;
7378 break;
7379
7380 case VIEW_CONVERT_EXPR:
7381 break;
7382
7383 case MEM_REF:
7384 /* Hand back the decl for MEM[&decl, off]. */
7385 if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR)
7386 {
7387 tree off = TREE_OPERAND (exp, 1);
7388 if (!integer_zerop (off))
7389 {
7390 poly_offset_int boff = mem_ref_offset (exp);
7391 boff <<= LOG2_BITS_PER_UNIT;
7392 bit_offset += boff;
7393 }
7394 exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7395 }
7396 goto done;
7397
7398 default:
7399 goto done;
7400 }
7401
7402 /* If any reference in the chain is volatile, the effect is volatile. */
7403 if (TREE_THIS_VOLATILE (exp))
7404 *pvolatilep = 1;
7405
7406 exp = TREE_OPERAND (exp, 0);
7407 }
7408 done:
7409
7410 /* If OFFSET is constant, see if we can return the whole thing as a
7411 constant bit position. Make sure to handle overflow during
7412 this conversion. */
7413 if (poly_int_tree_p (offset))
7414 {
7415 poly_offset_int tem = wi::sext (wi::to_poly_offset (offset),
7416 TYPE_PRECISION (sizetype));
7417 tem <<= LOG2_BITS_PER_UNIT;
7418 tem += bit_offset;
7419 if (tem.to_shwi (pbitpos))
7420 *poffset = offset = NULL_TREE;
7421 }
7422
7423 /* Otherwise, split it up. */
7424 if (offset)
7425 {
7426 /* Avoid returning a negative bitpos as this may wreak havoc later. */
7427 if (!bit_offset.to_shwi (pbitpos) || maybe_lt (*pbitpos, 0))
7428 {
7429 *pbitpos = num_trailing_bits (bit_offset.force_shwi ());
7430 poly_offset_int bytes = bits_to_bytes_round_down (bit_offset);
7431 offset = size_binop (PLUS_EXPR, offset,
7432 build_int_cst (sizetype, bytes.force_shwi ()));
7433 }
7434
7435 *poffset = offset;
7436 }
7437
7438 /* We can use BLKmode for a byte-aligned BLKmode bitfield. */
7439 if (mode == VOIDmode
7440 && blkmode_bitfield
7441 && multiple_p (*pbitpos, BITS_PER_UNIT)
7442 && multiple_p (*pbitsize, BITS_PER_UNIT))
7443 *pmode = BLKmode;
7444 else
7445 *pmode = mode;
7446
7447 return exp;
7448 }
7449
7450 /* Alignment in bits the TARGET of an assignment may be assumed to have. */
7451
7452 static unsigned HOST_WIDE_INT
7453 target_align (const_tree target)
7454 {
7455 /* We might have a chain of nested references with intermediate misaligning
7456 bitfields components, so need to recurse to find out. */
7457
7458 unsigned HOST_WIDE_INT this_align, outer_align;
7459
7460 switch (TREE_CODE (target))
7461 {
7462 case BIT_FIELD_REF:
7463 return 1;
7464
7465 case COMPONENT_REF:
7466 this_align = DECL_ALIGN (TREE_OPERAND (target, 1));
7467 outer_align = target_align (TREE_OPERAND (target, 0));
7468 return MIN (this_align, outer_align);
7469
7470 case ARRAY_REF:
7471 case ARRAY_RANGE_REF:
7472 this_align = TYPE_ALIGN (TREE_TYPE (target));
7473 outer_align = target_align (TREE_OPERAND (target, 0));
7474 return MIN (this_align, outer_align);
7475
7476 CASE_CONVERT:
7477 case NON_LVALUE_EXPR:
7478 case VIEW_CONVERT_EXPR:
7479 this_align = TYPE_ALIGN (TREE_TYPE (target));
7480 outer_align = target_align (TREE_OPERAND (target, 0));
7481 return MAX (this_align, outer_align);
7482
7483 default:
7484 return TYPE_ALIGN (TREE_TYPE (target));
7485 }
7486 }
7487
7488 \f
7489 /* Given an rtx VALUE that may contain additions and multiplications, return
7490 an equivalent value that just refers to a register, memory, or constant.
7491 This is done by generating instructions to perform the arithmetic and
7492 returning a pseudo-register containing the value.
7493
7494 The returned value may be a REG, SUBREG, MEM or constant. */
7495
7496 rtx
7497 force_operand (rtx value, rtx target)
7498 {
7499 rtx op1, op2;
7500 /* Use subtarget as the target for operand 0 of a binary operation. */
7501 rtx subtarget = get_subtarget (target);
7502 enum rtx_code code = GET_CODE (value);
7503
7504 /* Check for subreg applied to an expression produced by loop optimizer. */
7505 if (code == SUBREG
7506 && !REG_P (SUBREG_REG (value))
7507 && !MEM_P (SUBREG_REG (value)))
7508 {
7509 value
7510 = simplify_gen_subreg (GET_MODE (value),
7511 force_reg (GET_MODE (SUBREG_REG (value)),
7512 force_operand (SUBREG_REG (value),
7513 NULL_RTX)),
7514 GET_MODE (SUBREG_REG (value)),
7515 SUBREG_BYTE (value));
7516 code = GET_CODE (value);
7517 }
7518
7519 /* Check for a PIC address load. */
7520 if ((code == PLUS || code == MINUS)
7521 && XEXP (value, 0) == pic_offset_table_rtx
7522 && (GET_CODE (XEXP (value, 1)) == SYMBOL_REF
7523 || GET_CODE (XEXP (value, 1)) == LABEL_REF
7524 || GET_CODE (XEXP (value, 1)) == CONST))
7525 {
7526 if (!subtarget)
7527 subtarget = gen_reg_rtx (GET_MODE (value));
7528 emit_move_insn (subtarget, value);
7529 return subtarget;
7530 }
7531
7532 if (ARITHMETIC_P (value))
7533 {
7534 op2 = XEXP (value, 1);
7535 if (!CONSTANT_P (op2) && !(REG_P (op2) && op2 != subtarget))
7536 subtarget = 0;
7537 if (code == MINUS && CONST_INT_P (op2))
7538 {
7539 code = PLUS;
7540 op2 = negate_rtx (GET_MODE (value), op2);
7541 }
7542
7543 /* Check for an addition with OP2 a constant integer and our first
7544 operand a PLUS of a virtual register and something else. In that
7545 case, we want to emit the sum of the virtual register and the
7546 constant first and then add the other value. This allows virtual
7547 register instantiation to simply modify the constant rather than
7548 creating another one around this addition. */
7549 if (code == PLUS && CONST_INT_P (op2)
7550 && GET_CODE (XEXP (value, 0)) == PLUS
7551 && REG_P (XEXP (XEXP (value, 0), 0))
7552 && REGNO (XEXP (XEXP (value, 0), 0)) >= FIRST_VIRTUAL_REGISTER
7553 && REGNO (XEXP (XEXP (value, 0), 0)) <= LAST_VIRTUAL_REGISTER)
7554 {
7555 rtx temp = expand_simple_binop (GET_MODE (value), code,
7556 XEXP (XEXP (value, 0), 0), op2,
7557 subtarget, 0, OPTAB_LIB_WIDEN);
7558 return expand_simple_binop (GET_MODE (value), code, temp,
7559 force_operand (XEXP (XEXP (value,
7560 0), 1), 0),
7561 target, 0, OPTAB_LIB_WIDEN);
7562 }
7563
7564 op1 = force_operand (XEXP (value, 0), subtarget);
7565 op2 = force_operand (op2, NULL_RTX);
7566 switch (code)
7567 {
7568 case MULT:
7569 return expand_mult (GET_MODE (value), op1, op2, target, 1);
7570 case DIV:
7571 if (!INTEGRAL_MODE_P (GET_MODE (value)))
7572 return expand_simple_binop (GET_MODE (value), code, op1, op2,
7573 target, 1, OPTAB_LIB_WIDEN);
7574 else
7575 return expand_divmod (0,
7576 FLOAT_MODE_P (GET_MODE (value))
7577 ? RDIV_EXPR : TRUNC_DIV_EXPR,
7578 GET_MODE (value), op1, op2, target, 0);
7579 case MOD:
7580 return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2,
7581 target, 0);
7582 case UDIV:
7583 return expand_divmod (0, TRUNC_DIV_EXPR, GET_MODE (value), op1, op2,
7584 target, 1);
7585 case UMOD:
7586 return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2,
7587 target, 1);
7588 case ASHIFTRT:
7589 return expand_simple_binop (GET_MODE (value), code, op1, op2,
7590 target, 0, OPTAB_LIB_WIDEN);
7591 default:
7592 return expand_simple_binop (GET_MODE (value), code, op1, op2,
7593 target, 1, OPTAB_LIB_WIDEN);
7594 }
7595 }
7596 if (UNARY_P (value))
7597 {
7598 if (!target)
7599 target = gen_reg_rtx (GET_MODE (value));
7600 op1 = force_operand (XEXP (value, 0), NULL_RTX);
7601 switch (code)
7602 {
7603 case ZERO_EXTEND:
7604 case SIGN_EXTEND:
7605 case TRUNCATE:
7606 case FLOAT_EXTEND:
7607 case FLOAT_TRUNCATE:
7608 convert_move (target, op1, code == ZERO_EXTEND);
7609 return target;
7610
7611 case FIX:
7612 case UNSIGNED_FIX:
7613 expand_fix (target, op1, code == UNSIGNED_FIX);
7614 return target;
7615
7616 case FLOAT:
7617 case UNSIGNED_FLOAT:
7618 expand_float (target, op1, code == UNSIGNED_FLOAT);
7619 return target;
7620
7621 default:
7622 return expand_simple_unop (GET_MODE (value), code, op1, target, 0);
7623 }
7624 }
7625
7626 #ifdef INSN_SCHEDULING
7627 /* On machines that have insn scheduling, we want all memory reference to be
7628 explicit, so we need to deal with such paradoxical SUBREGs. */
7629 if (paradoxical_subreg_p (value) && MEM_P (SUBREG_REG (value)))
7630 value
7631 = simplify_gen_subreg (GET_MODE (value),
7632 force_reg (GET_MODE (SUBREG_REG (value)),
7633 force_operand (SUBREG_REG (value),
7634 NULL_RTX)),
7635 GET_MODE (SUBREG_REG (value)),
7636 SUBREG_BYTE (value));
7637 #endif
7638
7639 return value;
7640 }
7641 \f
7642 /* Subroutine of expand_expr: return nonzero iff there is no way that
7643 EXP can reference X, which is being modified. TOP_P is nonzero if this
7644 call is going to be used to determine whether we need a temporary
7645 for EXP, as opposed to a recursive call to this function.
7646
7647 It is always safe for this routine to return zero since it merely
7648 searches for optimization opportunities. */
7649
7650 int
7651 safe_from_p (const_rtx x, tree exp, int top_p)
7652 {
7653 rtx exp_rtl = 0;
7654 int i, nops;
7655
7656 if (x == 0
7657 /* If EXP has varying size, we MUST use a target since we currently
7658 have no way of allocating temporaries of variable size
7659 (except for arrays that have TYPE_ARRAY_MAX_SIZE set).
7660 So we assume here that something at a higher level has prevented a
7661 clash. This is somewhat bogus, but the best we can do. Only
7662 do this when X is BLKmode and when we are at the top level. */
7663 || (top_p && TREE_TYPE (exp) != 0 && COMPLETE_TYPE_P (TREE_TYPE (exp))
7664 && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST
7665 && (TREE_CODE (TREE_TYPE (exp)) != ARRAY_TYPE
7666 || TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)) == NULL_TREE
7667 || TREE_CODE (TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)))
7668 != INTEGER_CST)
7669 && GET_MODE (x) == BLKmode)
7670 /* If X is in the outgoing argument area, it is always safe. */
7671 || (MEM_P (x)
7672 && (XEXP (x, 0) == virtual_outgoing_args_rtx
7673 || (GET_CODE (XEXP (x, 0)) == PLUS
7674 && XEXP (XEXP (x, 0), 0) == virtual_outgoing_args_rtx))))
7675 return 1;
7676
7677 /* If this is a subreg of a hard register, declare it unsafe, otherwise,
7678 find the underlying pseudo. */
7679 if (GET_CODE (x) == SUBREG)
7680 {
7681 x = SUBREG_REG (x);
7682 if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
7683 return 0;
7684 }
7685
7686 /* Now look at our tree code and possibly recurse. */
7687 switch (TREE_CODE_CLASS (TREE_CODE (exp)))
7688 {
7689 case tcc_declaration:
7690 exp_rtl = DECL_RTL_IF_SET (exp);
7691 break;
7692
7693 case tcc_constant:
7694 return 1;
7695
7696 case tcc_exceptional:
7697 if (TREE_CODE (exp) == TREE_LIST)
7698 {
7699 while (1)
7700 {
7701 if (TREE_VALUE (exp) && !safe_from_p (x, TREE_VALUE (exp), 0))
7702 return 0;
7703 exp = TREE_CHAIN (exp);
7704 if (!exp)
7705 return 1;
7706 if (TREE_CODE (exp) != TREE_LIST)
7707 return safe_from_p (x, exp, 0);
7708 }
7709 }
7710 else if (TREE_CODE (exp) == CONSTRUCTOR)
7711 {
7712 constructor_elt *ce;
7713 unsigned HOST_WIDE_INT idx;
7714
7715 FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (exp), idx, ce)
7716 if ((ce->index != NULL_TREE && !safe_from_p (x, ce->index, 0))
7717 || !safe_from_p (x, ce->value, 0))
7718 return 0;
7719 return 1;
7720 }
7721 else if (TREE_CODE (exp) == ERROR_MARK)
7722 return 1; /* An already-visited SAVE_EXPR? */
7723 else
7724 return 0;
7725
7726 case tcc_statement:
7727 /* The only case we look at here is the DECL_INITIAL inside a
7728 DECL_EXPR. */
7729 return (TREE_CODE (exp) != DECL_EXPR
7730 || TREE_CODE (DECL_EXPR_DECL (exp)) != VAR_DECL
7731 || !DECL_INITIAL (DECL_EXPR_DECL (exp))
7732 || safe_from_p (x, DECL_INITIAL (DECL_EXPR_DECL (exp)), 0));
7733
7734 case tcc_binary:
7735 case tcc_comparison:
7736 if (!safe_from_p (x, TREE_OPERAND (exp, 1), 0))
7737 return 0;
7738 /* Fall through. */
7739
7740 case tcc_unary:
7741 return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
7742
7743 case tcc_expression:
7744 case tcc_reference:
7745 case tcc_vl_exp:
7746 /* Now do code-specific tests. EXP_RTL is set to any rtx we find in
7747 the expression. If it is set, we conflict iff we are that rtx or
7748 both are in memory. Otherwise, we check all operands of the
7749 expression recursively. */
7750
7751 switch (TREE_CODE (exp))
7752 {
7753 case ADDR_EXPR:
7754 /* If the operand is static or we are static, we can't conflict.
7755 Likewise if we don't conflict with the operand at all. */
7756 if (staticp (TREE_OPERAND (exp, 0))
7757 || TREE_STATIC (exp)
7758 || safe_from_p (x, TREE_OPERAND (exp, 0), 0))
7759 return 1;
7760
7761 /* Otherwise, the only way this can conflict is if we are taking
7762 the address of a DECL a that address if part of X, which is
7763 very rare. */
7764 exp = TREE_OPERAND (exp, 0);
7765 if (DECL_P (exp))
7766 {
7767 if (!DECL_RTL_SET_P (exp)
7768 || !MEM_P (DECL_RTL (exp)))
7769 return 0;
7770 else
7771 exp_rtl = XEXP (DECL_RTL (exp), 0);
7772 }
7773 break;
7774
7775 case MEM_REF:
7776 if (MEM_P (x)
7777 && alias_sets_conflict_p (MEM_ALIAS_SET (x),
7778 get_alias_set (exp)))
7779 return 0;
7780 break;
7781
7782 case CALL_EXPR:
7783 /* Assume that the call will clobber all hard registers and
7784 all of memory. */
7785 if ((REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
7786 || MEM_P (x))
7787 return 0;
7788 break;
7789
7790 case WITH_CLEANUP_EXPR:
7791 case CLEANUP_POINT_EXPR:
7792 /* Lowered by gimplify.c. */
7793 gcc_unreachable ();
7794
7795 case SAVE_EXPR:
7796 return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
7797
7798 default:
7799 break;
7800 }
7801
7802 /* If we have an rtx, we do not need to scan our operands. */
7803 if (exp_rtl)
7804 break;
7805
7806 nops = TREE_OPERAND_LENGTH (exp);
7807 for (i = 0; i < nops; i++)
7808 if (TREE_OPERAND (exp, i) != 0
7809 && ! safe_from_p (x, TREE_OPERAND (exp, i), 0))
7810 return 0;
7811
7812 break;
7813
7814 case tcc_type:
7815 /* Should never get a type here. */
7816 gcc_unreachable ();
7817 }
7818
7819 /* If we have an rtl, find any enclosed object. Then see if we conflict
7820 with it. */
7821 if (exp_rtl)
7822 {
7823 if (GET_CODE (exp_rtl) == SUBREG)
7824 {
7825 exp_rtl = SUBREG_REG (exp_rtl);
7826 if (REG_P (exp_rtl)
7827 && REGNO (exp_rtl) < FIRST_PSEUDO_REGISTER)
7828 return 0;
7829 }
7830
7831 /* If the rtl is X, then it is not safe. Otherwise, it is unless both
7832 are memory and they conflict. */
7833 return ! (rtx_equal_p (x, exp_rtl)
7834 || (MEM_P (x) && MEM_P (exp_rtl)
7835 && true_dependence (exp_rtl, VOIDmode, x)));
7836 }
7837
7838 /* If we reach here, it is safe. */
7839 return 1;
7840 }
7841
7842 \f
7843 /* Return the highest power of two that EXP is known to be a multiple of.
7844 This is used in updating alignment of MEMs in array references. */
7845
7846 unsigned HOST_WIDE_INT
7847 highest_pow2_factor (const_tree exp)
7848 {
7849 unsigned HOST_WIDE_INT ret;
7850 int trailing_zeros = tree_ctz (exp);
7851 if (trailing_zeros >= HOST_BITS_PER_WIDE_INT)
7852 return BIGGEST_ALIGNMENT;
7853 ret = HOST_WIDE_INT_1U << trailing_zeros;
7854 if (ret > BIGGEST_ALIGNMENT)
7855 return BIGGEST_ALIGNMENT;
7856 return ret;
7857 }
7858
7859 /* Similar, except that the alignment requirements of TARGET are
7860 taken into account. Assume it is at least as aligned as its
7861 type, unless it is a COMPONENT_REF in which case the layout of
7862 the structure gives the alignment. */
7863
7864 static unsigned HOST_WIDE_INT
7865 highest_pow2_factor_for_target (const_tree target, const_tree exp)
7866 {
7867 unsigned HOST_WIDE_INT talign = target_align (target) / BITS_PER_UNIT;
7868 unsigned HOST_WIDE_INT factor = highest_pow2_factor (exp);
7869
7870 return MAX (factor, talign);
7871 }
7872 \f
7873 /* Convert the tree comparison code TCODE to the rtl one where the
7874 signedness is UNSIGNEDP. */
7875
7876 static enum rtx_code
7877 convert_tree_comp_to_rtx (enum tree_code tcode, int unsignedp)
7878 {
7879 enum rtx_code code;
7880 switch (tcode)
7881 {
7882 case EQ_EXPR:
7883 code = EQ;
7884 break;
7885 case NE_EXPR:
7886 code = NE;
7887 break;
7888 case LT_EXPR:
7889 code = unsignedp ? LTU : LT;
7890 break;
7891 case LE_EXPR:
7892 code = unsignedp ? LEU : LE;
7893 break;
7894 case GT_EXPR:
7895 code = unsignedp ? GTU : GT;
7896 break;
7897 case GE_EXPR:
7898 code = unsignedp ? GEU : GE;
7899 break;
7900 case UNORDERED_EXPR:
7901 code = UNORDERED;
7902 break;
7903 case ORDERED_EXPR:
7904 code = ORDERED;
7905 break;
7906 case UNLT_EXPR:
7907 code = UNLT;
7908 break;
7909 case UNLE_EXPR:
7910 code = UNLE;
7911 break;
7912 case UNGT_EXPR:
7913 code = UNGT;
7914 break;
7915 case UNGE_EXPR:
7916 code = UNGE;
7917 break;
7918 case UNEQ_EXPR:
7919 code = UNEQ;
7920 break;
7921 case LTGT_EXPR:
7922 code = LTGT;
7923 break;
7924
7925 default:
7926 gcc_unreachable ();
7927 }
7928 return code;
7929 }
7930
7931 /* Subroutine of expand_expr. Expand the two operands of a binary
7932 expression EXP0 and EXP1 placing the results in OP0 and OP1.
7933 The value may be stored in TARGET if TARGET is nonzero. The
7934 MODIFIER argument is as documented by expand_expr. */
7935
7936 void
7937 expand_operands (tree exp0, tree exp1, rtx target, rtx *op0, rtx *op1,
7938 enum expand_modifier modifier)
7939 {
7940 if (! safe_from_p (target, exp1, 1))
7941 target = 0;
7942 if (operand_equal_p (exp0, exp1, 0))
7943 {
7944 *op0 = expand_expr (exp0, target, VOIDmode, modifier);
7945 *op1 = copy_rtx (*op0);
7946 }
7947 else
7948 {
7949 *op0 = expand_expr (exp0, target, VOIDmode, modifier);
7950 *op1 = expand_expr (exp1, NULL_RTX, VOIDmode, modifier);
7951 }
7952 }
7953
7954 \f
7955 /* Return a MEM that contains constant EXP. DEFER is as for
7956 output_constant_def and MODIFIER is as for expand_expr. */
7957
7958 static rtx
7959 expand_expr_constant (tree exp, int defer, enum expand_modifier modifier)
7960 {
7961 rtx mem;
7962
7963 mem = output_constant_def (exp, defer);
7964 if (modifier != EXPAND_INITIALIZER)
7965 mem = use_anchored_address (mem);
7966 return mem;
7967 }
7968
7969 /* A subroutine of expand_expr_addr_expr. Evaluate the address of EXP.
7970 The TARGET, TMODE and MODIFIER arguments are as for expand_expr. */
7971
7972 static rtx
7973 expand_expr_addr_expr_1 (tree exp, rtx target, scalar_int_mode tmode,
7974 enum expand_modifier modifier, addr_space_t as)
7975 {
7976 rtx result, subtarget;
7977 tree inner, offset;
7978 poly_int64 bitsize, bitpos;
7979 int unsignedp, reversep, volatilep = 0;
7980 machine_mode mode1;
7981
7982 /* If we are taking the address of a constant and are at the top level,
7983 we have to use output_constant_def since we can't call force_const_mem
7984 at top level. */
7985 /* ??? This should be considered a front-end bug. We should not be
7986 generating ADDR_EXPR of something that isn't an LVALUE. The only
7987 exception here is STRING_CST. */
7988 if (CONSTANT_CLASS_P (exp))
7989 {
7990 result = XEXP (expand_expr_constant (exp, 0, modifier), 0);
7991 if (modifier < EXPAND_SUM)
7992 result = force_operand (result, target);
7993 return result;
7994 }
7995
7996 /* Everything must be something allowed by is_gimple_addressable. */
7997 switch (TREE_CODE (exp))
7998 {
7999 case INDIRECT_REF:
8000 /* This case will happen via recursion for &a->b. */
8001 return expand_expr (TREE_OPERAND (exp, 0), target, tmode, modifier);
8002
8003 case MEM_REF:
8004 {
8005 tree tem = TREE_OPERAND (exp, 0);
8006 if (!integer_zerop (TREE_OPERAND (exp, 1)))
8007 tem = fold_build_pointer_plus (tem, TREE_OPERAND (exp, 1));
8008 return expand_expr (tem, target, tmode, modifier);
8009 }
8010
8011 case TARGET_MEM_REF:
8012 return addr_for_mem_ref (exp, as, true);
8013
8014 case CONST_DECL:
8015 /* Expand the initializer like constants above. */
8016 result = XEXP (expand_expr_constant (DECL_INITIAL (exp),
8017 0, modifier), 0);
8018 if (modifier < EXPAND_SUM)
8019 result = force_operand (result, target);
8020 return result;
8021
8022 case REALPART_EXPR:
8023 /* The real part of the complex number is always first, therefore
8024 the address is the same as the address of the parent object. */
8025 offset = 0;
8026 bitpos = 0;
8027 inner = TREE_OPERAND (exp, 0);
8028 break;
8029
8030 case IMAGPART_EXPR:
8031 /* The imaginary part of the complex number is always second.
8032 The expression is therefore always offset by the size of the
8033 scalar type. */
8034 offset = 0;
8035 bitpos = GET_MODE_BITSIZE (SCALAR_TYPE_MODE (TREE_TYPE (exp)));
8036 inner = TREE_OPERAND (exp, 0);
8037 break;
8038
8039 case COMPOUND_LITERAL_EXPR:
8040 /* Allow COMPOUND_LITERAL_EXPR in initializers or coming from
8041 initializers, if e.g. rtl_for_decl_init is called on DECL_INITIAL
8042 with COMPOUND_LITERAL_EXPRs in it, or ARRAY_REF on a const static
8043 array with address of COMPOUND_LITERAL_EXPR in DECL_INITIAL;
8044 the initializers aren't gimplified. */
8045 if (COMPOUND_LITERAL_EXPR_DECL (exp)
8046 && TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (exp)))
8047 return expand_expr_addr_expr_1 (COMPOUND_LITERAL_EXPR_DECL (exp),
8048 target, tmode, modifier, as);
8049 /* FALLTHRU */
8050 default:
8051 /* If the object is a DECL, then expand it for its rtl. Don't bypass
8052 expand_expr, as that can have various side effects; LABEL_DECLs for
8053 example, may not have their DECL_RTL set yet. Expand the rtl of
8054 CONSTRUCTORs too, which should yield a memory reference for the
8055 constructor's contents. Assume language specific tree nodes can
8056 be expanded in some interesting way. */
8057 gcc_assert (TREE_CODE (exp) < LAST_AND_UNUSED_TREE_CODE);
8058 if (DECL_P (exp)
8059 || TREE_CODE (exp) == CONSTRUCTOR
8060 || TREE_CODE (exp) == COMPOUND_LITERAL_EXPR)
8061 {
8062 result = expand_expr (exp, target, tmode,
8063 modifier == EXPAND_INITIALIZER
8064 ? EXPAND_INITIALIZER : EXPAND_CONST_ADDRESS);
8065
8066 /* If the DECL isn't in memory, then the DECL wasn't properly
8067 marked TREE_ADDRESSABLE, which will be either a front-end
8068 or a tree optimizer bug. */
8069
8070 gcc_assert (MEM_P (result));
8071 result = XEXP (result, 0);
8072
8073 /* ??? Is this needed anymore? */
8074 if (DECL_P (exp))
8075 TREE_USED (exp) = 1;
8076
8077 if (modifier != EXPAND_INITIALIZER
8078 && modifier != EXPAND_CONST_ADDRESS
8079 && modifier != EXPAND_SUM)
8080 result = force_operand (result, target);
8081 return result;
8082 }
8083
8084 /* Pass FALSE as the last argument to get_inner_reference although
8085 we are expanding to RTL. The rationale is that we know how to
8086 handle "aligning nodes" here: we can just bypass them because
8087 they won't change the final object whose address will be returned
8088 (they actually exist only for that purpose). */
8089 inner = get_inner_reference (exp, &bitsize, &bitpos, &offset, &mode1,
8090 &unsignedp, &reversep, &volatilep);
8091 break;
8092 }
8093
8094 /* We must have made progress. */
8095 gcc_assert (inner != exp);
8096
8097 subtarget = offset || maybe_ne (bitpos, 0) ? NULL_RTX : target;
8098 /* For VIEW_CONVERT_EXPR, where the outer alignment is bigger than
8099 inner alignment, force the inner to be sufficiently aligned. */
8100 if (CONSTANT_CLASS_P (inner)
8101 && TYPE_ALIGN (TREE_TYPE (inner)) < TYPE_ALIGN (TREE_TYPE (exp)))
8102 {
8103 inner = copy_node (inner);
8104 TREE_TYPE (inner) = copy_node (TREE_TYPE (inner));
8105 SET_TYPE_ALIGN (TREE_TYPE (inner), TYPE_ALIGN (TREE_TYPE (exp)));
8106 TYPE_USER_ALIGN (TREE_TYPE (inner)) = 1;
8107 }
8108 result = expand_expr_addr_expr_1 (inner, subtarget, tmode, modifier, as);
8109
8110 if (offset)
8111 {
8112 rtx tmp;
8113
8114 if (modifier != EXPAND_NORMAL)
8115 result = force_operand (result, NULL);
8116 tmp = expand_expr (offset, NULL_RTX, tmode,
8117 modifier == EXPAND_INITIALIZER
8118 ? EXPAND_INITIALIZER : EXPAND_NORMAL);
8119
8120 /* expand_expr is allowed to return an object in a mode other
8121 than TMODE. If it did, we need to convert. */
8122 if (GET_MODE (tmp) != VOIDmode && tmode != GET_MODE (tmp))
8123 tmp = convert_modes (tmode, GET_MODE (tmp),
8124 tmp, TYPE_UNSIGNED (TREE_TYPE (offset)));
8125 result = convert_memory_address_addr_space (tmode, result, as);
8126 tmp = convert_memory_address_addr_space (tmode, tmp, as);
8127
8128 if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
8129 result = simplify_gen_binary (PLUS, tmode, result, tmp);
8130 else
8131 {
8132 subtarget = maybe_ne (bitpos, 0) ? NULL_RTX : target;
8133 result = expand_simple_binop (tmode, PLUS, result, tmp, subtarget,
8134 1, OPTAB_LIB_WIDEN);
8135 }
8136 }
8137
8138 if (maybe_ne (bitpos, 0))
8139 {
8140 /* Someone beforehand should have rejected taking the address
8141 of an object that isn't byte-aligned. */
8142 poly_int64 bytepos = exact_div (bitpos, BITS_PER_UNIT);
8143 result = convert_memory_address_addr_space (tmode, result, as);
8144 result = plus_constant (tmode, result, bytepos);
8145 if (modifier < EXPAND_SUM)
8146 result = force_operand (result, target);
8147 }
8148
8149 return result;
8150 }
8151
8152 /* A subroutine of expand_expr. Evaluate EXP, which is an ADDR_EXPR.
8153 The TARGET, TMODE and MODIFIER arguments are as for expand_expr. */
8154
8155 static rtx
8156 expand_expr_addr_expr (tree exp, rtx target, machine_mode tmode,
8157 enum expand_modifier modifier)
8158 {
8159 addr_space_t as = ADDR_SPACE_GENERIC;
8160 scalar_int_mode address_mode = Pmode;
8161 scalar_int_mode pointer_mode = ptr_mode;
8162 machine_mode rmode;
8163 rtx result;
8164
8165 /* Target mode of VOIDmode says "whatever's natural". */
8166 if (tmode == VOIDmode)
8167 tmode = TYPE_MODE (TREE_TYPE (exp));
8168
8169 if (POINTER_TYPE_P (TREE_TYPE (exp)))
8170 {
8171 as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp)));
8172 address_mode = targetm.addr_space.address_mode (as);
8173 pointer_mode = targetm.addr_space.pointer_mode (as);
8174 }
8175
8176 /* We can get called with some Weird Things if the user does silliness
8177 like "(short) &a". In that case, convert_memory_address won't do
8178 the right thing, so ignore the given target mode. */
8179 scalar_int_mode new_tmode = (tmode == pointer_mode
8180 ? pointer_mode
8181 : address_mode);
8182
8183 result = expand_expr_addr_expr_1 (TREE_OPERAND (exp, 0), target,
8184 new_tmode, modifier, as);
8185
8186 /* Despite expand_expr claims concerning ignoring TMODE when not
8187 strictly convenient, stuff breaks if we don't honor it. Note
8188 that combined with the above, we only do this for pointer modes. */
8189 rmode = GET_MODE (result);
8190 if (rmode == VOIDmode)
8191 rmode = new_tmode;
8192 if (rmode != new_tmode)
8193 result = convert_memory_address_addr_space (new_tmode, result, as);
8194
8195 return result;
8196 }
8197
8198 /* Generate code for computing CONSTRUCTOR EXP.
8199 An rtx for the computed value is returned. If AVOID_TEMP_MEM
8200 is TRUE, instead of creating a temporary variable in memory
8201 NULL is returned and the caller needs to handle it differently. */
8202
8203 static rtx
8204 expand_constructor (tree exp, rtx target, enum expand_modifier modifier,
8205 bool avoid_temp_mem)
8206 {
8207 tree type = TREE_TYPE (exp);
8208 machine_mode mode = TYPE_MODE (type);
8209
8210 /* Try to avoid creating a temporary at all. This is possible
8211 if all of the initializer is zero.
8212 FIXME: try to handle all [0..255] initializers we can handle
8213 with memset. */
8214 if (TREE_STATIC (exp)
8215 && !TREE_ADDRESSABLE (exp)
8216 && target != 0 && mode == BLKmode
8217 && all_zeros_p (exp))
8218 {
8219 clear_storage (target, expr_size (exp), BLOCK_OP_NORMAL);
8220 return target;
8221 }
8222
8223 /* All elts simple constants => refer to a constant in memory. But
8224 if this is a non-BLKmode mode, let it store a field at a time
8225 since that should make a CONST_INT, CONST_WIDE_INT or
8226 CONST_DOUBLE when we fold. Likewise, if we have a target we can
8227 use, it is best to store directly into the target unless the type
8228 is large enough that memcpy will be used. If we are making an
8229 initializer and all operands are constant, put it in memory as
8230 well.
8231
8232 FIXME: Avoid trying to fill vector constructors piece-meal.
8233 Output them with output_constant_def below unless we're sure
8234 they're zeros. This should go away when vector initializers
8235 are treated like VECTOR_CST instead of arrays. */
8236 if ((TREE_STATIC (exp)
8237 && ((mode == BLKmode
8238 && ! (target != 0 && safe_from_p (target, exp, 1)))
8239 || TREE_ADDRESSABLE (exp)
8240 || (tree_fits_uhwi_p (TYPE_SIZE_UNIT (type))
8241 && (! can_move_by_pieces
8242 (tree_to_uhwi (TYPE_SIZE_UNIT (type)),
8243 TYPE_ALIGN (type)))
8244 && ! mostly_zeros_p (exp))))
8245 || ((modifier == EXPAND_INITIALIZER || modifier == EXPAND_CONST_ADDRESS)
8246 && TREE_CONSTANT (exp)))
8247 {
8248 rtx constructor;
8249
8250 if (avoid_temp_mem)
8251 return NULL_RTX;
8252
8253 constructor = expand_expr_constant (exp, 1, modifier);
8254
8255 if (modifier != EXPAND_CONST_ADDRESS
8256 && modifier != EXPAND_INITIALIZER
8257 && modifier != EXPAND_SUM)
8258 constructor = validize_mem (constructor);
8259
8260 return constructor;
8261 }
8262
8263 /* Handle calls that pass values in multiple non-contiguous
8264 locations. The Irix 6 ABI has examples of this. */
8265 if (target == 0 || ! safe_from_p (target, exp, 1)
8266 || GET_CODE (target) == PARALLEL || modifier == EXPAND_STACK_PARM)
8267 {
8268 if (avoid_temp_mem)
8269 return NULL_RTX;
8270
8271 target = assign_temp (type, TREE_ADDRESSABLE (exp), 1);
8272 }
8273
8274 store_constructor (exp, target, 0, int_expr_size (exp), false);
8275 return target;
8276 }
8277
8278
8279 /* expand_expr: generate code for computing expression EXP.
8280 An rtx for the computed value is returned. The value is never null.
8281 In the case of a void EXP, const0_rtx is returned.
8282
8283 The value may be stored in TARGET if TARGET is nonzero.
8284 TARGET is just a suggestion; callers must assume that
8285 the rtx returned may not be the same as TARGET.
8286
8287 If TARGET is CONST0_RTX, it means that the value will be ignored.
8288
8289 If TMODE is not VOIDmode, it suggests generating the
8290 result in mode TMODE. But this is done only when convenient.
8291 Otherwise, TMODE is ignored and the value generated in its natural mode.
8292 TMODE is just a suggestion; callers must assume that
8293 the rtx returned may not have mode TMODE.
8294
8295 Note that TARGET may have neither TMODE nor MODE. In that case, it
8296 probably will not be used.
8297
8298 If MODIFIER is EXPAND_SUM then when EXP is an addition
8299 we can return an rtx of the form (MULT (REG ...) (CONST_INT ...))
8300 or a nest of (PLUS ...) and (MINUS ...) where the terms are
8301 products as above, or REG or MEM, or constant.
8302 Ordinarily in such cases we would output mul or add instructions
8303 and then return a pseudo reg containing the sum.
8304
8305 EXPAND_INITIALIZER is much like EXPAND_SUM except that
8306 it also marks a label as absolutely required (it can't be dead).
8307 It also makes a ZERO_EXTEND or SIGN_EXTEND instead of emitting extend insns.
8308 This is used for outputting expressions used in initializers.
8309
8310 EXPAND_CONST_ADDRESS says that it is okay to return a MEM
8311 with a constant address even if that address is not normally legitimate.
8312 EXPAND_INITIALIZER and EXPAND_SUM also have this effect.
8313
8314 EXPAND_STACK_PARM is used when expanding to a TARGET on the stack for
8315 a call parameter. Such targets require special care as we haven't yet
8316 marked TARGET so that it's safe from being trashed by libcalls. We
8317 don't want to use TARGET for anything but the final result;
8318 Intermediate values must go elsewhere. Additionally, calls to
8319 emit_block_move will be flagged with BLOCK_OP_CALL_PARM.
8320
8321 If EXP is a VAR_DECL whose DECL_RTL was a MEM with an invalid
8322 address, and ALT_RTL is non-NULL, then *ALT_RTL is set to the
8323 DECL_RTL of the VAR_DECL. *ALT_RTL is also set if EXP is a
8324 COMPOUND_EXPR whose second argument is such a VAR_DECL, and so on
8325 recursively.
8326 If the result can be stored at TARGET, and ALT_RTL is non-NULL,
8327 then *ALT_RTL is set to TARGET (before legitimziation).
8328
8329 If INNER_REFERENCE_P is true, we are expanding an inner reference.
8330 In this case, we don't adjust a returned MEM rtx that wouldn't be
8331 sufficiently aligned for its mode; instead, it's up to the caller
8332 to deal with it afterwards. This is used to make sure that unaligned
8333 base objects for which out-of-bounds accesses are supported, for
8334 example record types with trailing arrays, aren't realigned behind
8335 the back of the caller.
8336 The normal operating mode is to pass FALSE for this parameter. */
8337
8338 rtx
8339 expand_expr_real (tree exp, rtx target, machine_mode tmode,
8340 enum expand_modifier modifier, rtx *alt_rtl,
8341 bool inner_reference_p)
8342 {
8343 rtx ret;
8344
8345 /* Handle ERROR_MARK before anybody tries to access its type. */
8346 if (TREE_CODE (exp) == ERROR_MARK
8347 || (TREE_CODE (TREE_TYPE (exp)) == ERROR_MARK))
8348 {
8349 ret = CONST0_RTX (tmode);
8350 return ret ? ret : const0_rtx;
8351 }
8352
8353 ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl,
8354 inner_reference_p);
8355 return ret;
8356 }
8357
8358 /* Try to expand the conditional expression which is represented by
8359 TREEOP0 ? TREEOP1 : TREEOP2 using conditonal moves. If it succeeds
8360 return the rtl reg which represents the result. Otherwise return
8361 NULL_RTX. */
8362
8363 static rtx
8364 expand_cond_expr_using_cmove (tree treeop0 ATTRIBUTE_UNUSED,
8365 tree treeop1 ATTRIBUTE_UNUSED,
8366 tree treeop2 ATTRIBUTE_UNUSED)
8367 {
8368 rtx insn;
8369 rtx op00, op01, op1, op2;
8370 enum rtx_code comparison_code;
8371 machine_mode comparison_mode;
8372 gimple *srcstmt;
8373 rtx temp;
8374 tree type = TREE_TYPE (treeop1);
8375 int unsignedp = TYPE_UNSIGNED (type);
8376 machine_mode mode = TYPE_MODE (type);
8377 machine_mode orig_mode = mode;
8378 static bool expanding_cond_expr_using_cmove = false;
8379
8380 /* Conditional move expansion can end up TERing two operands which,
8381 when recursively hitting conditional expressions can result in
8382 exponential behavior if the cmove expansion ultimatively fails.
8383 It's hardly profitable to TER a cmove into a cmove so avoid doing
8384 that by failing early if we end up recursing. */
8385 if (expanding_cond_expr_using_cmove)
8386 return NULL_RTX;
8387
8388 /* If we cannot do a conditional move on the mode, try doing it
8389 with the promoted mode. */
8390 if (!can_conditionally_move_p (mode))
8391 {
8392 mode = promote_mode (type, mode, &unsignedp);
8393 if (!can_conditionally_move_p (mode))
8394 return NULL_RTX;
8395 temp = assign_temp (type, 0, 0); /* Use promoted mode for temp. */
8396 }
8397 else
8398 temp = assign_temp (type, 0, 1);
8399
8400 expanding_cond_expr_using_cmove = true;
8401 start_sequence ();
8402 expand_operands (treeop1, treeop2,
8403 temp, &op1, &op2, EXPAND_NORMAL);
8404
8405 if (TREE_CODE (treeop0) == SSA_NAME
8406 && (srcstmt = get_def_for_expr_class (treeop0, tcc_comparison)))
8407 {
8408 type = TREE_TYPE (gimple_assign_rhs1 (srcstmt));
8409 enum tree_code cmpcode = gimple_assign_rhs_code (srcstmt);
8410 op00 = expand_normal (gimple_assign_rhs1 (srcstmt));
8411 op01 = expand_normal (gimple_assign_rhs2 (srcstmt));
8412 comparison_mode = TYPE_MODE (type);
8413 unsignedp = TYPE_UNSIGNED (type);
8414 comparison_code = convert_tree_comp_to_rtx (cmpcode, unsignedp);
8415 }
8416 else if (COMPARISON_CLASS_P (treeop0))
8417 {
8418 type = TREE_TYPE (TREE_OPERAND (treeop0, 0));
8419 enum tree_code cmpcode = TREE_CODE (treeop0);
8420 op00 = expand_normal (TREE_OPERAND (treeop0, 0));
8421 op01 = expand_normal (TREE_OPERAND (treeop0, 1));
8422 unsignedp = TYPE_UNSIGNED (type);
8423 comparison_mode = TYPE_MODE (type);
8424 comparison_code = convert_tree_comp_to_rtx (cmpcode, unsignedp);
8425 }
8426 else
8427 {
8428 op00 = expand_normal (treeop0);
8429 op01 = const0_rtx;
8430 comparison_code = NE;
8431 comparison_mode = GET_MODE (op00);
8432 if (comparison_mode == VOIDmode)
8433 comparison_mode = TYPE_MODE (TREE_TYPE (treeop0));
8434 }
8435 expanding_cond_expr_using_cmove = false;
8436
8437 if (GET_MODE (op1) != mode)
8438 op1 = gen_lowpart (mode, op1);
8439
8440 if (GET_MODE (op2) != mode)
8441 op2 = gen_lowpart (mode, op2);
8442
8443 /* Try to emit the conditional move. */
8444 insn = emit_conditional_move (temp, comparison_code,
8445 op00, op01, comparison_mode,
8446 op1, op2, mode,
8447 unsignedp);
8448
8449 /* If we could do the conditional move, emit the sequence,
8450 and return. */
8451 if (insn)
8452 {
8453 rtx_insn *seq = get_insns ();
8454 end_sequence ();
8455 emit_insn (seq);
8456 return convert_modes (orig_mode, mode, temp, 0);
8457 }
8458
8459 /* Otherwise discard the sequence and fall back to code with
8460 branches. */
8461 end_sequence ();
8462 return NULL_RTX;
8463 }
8464
8465 /* A helper function for expand_expr_real_2 to be used with a
8466 misaligned mem_ref TEMP. Assume an unsigned type if UNSIGNEDP
8467 is nonzero, with alignment ALIGN in bits.
8468 Store the value at TARGET if possible (if TARGET is nonzero).
8469 Regardless of TARGET, we return the rtx for where the value is placed.
8470 If the result can be stored at TARGET, and ALT_RTL is non-NULL,
8471 then *ALT_RTL is set to TARGET (before legitimziation). */
8472
8473 static rtx
8474 expand_misaligned_mem_ref (rtx temp, machine_mode mode, int unsignedp,
8475 unsigned int align, rtx target, rtx *alt_rtl)
8476 {
8477 enum insn_code icode;
8478
8479 if ((icode = optab_handler (movmisalign_optab, mode))
8480 != CODE_FOR_nothing)
8481 {
8482 class expand_operand ops[2];
8483
8484 /* We've already validated the memory, and we're creating a
8485 new pseudo destination. The predicates really can't fail,
8486 nor can the generator. */
8487 create_output_operand (&ops[0], NULL_RTX, mode);
8488 create_fixed_operand (&ops[1], temp);
8489 expand_insn (icode, 2, ops);
8490 temp = ops[0].value;
8491 }
8492 else if (targetm.slow_unaligned_access (mode, align))
8493 temp = extract_bit_field (temp, GET_MODE_BITSIZE (mode),
8494 0, unsignedp, target,
8495 mode, mode, false, alt_rtl);
8496 return temp;
8497 }
8498
8499 rtx
8500 expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode,
8501 enum expand_modifier modifier)
8502 {
8503 rtx op0, op1, op2, temp;
8504 rtx_code_label *lab;
8505 tree type;
8506 int unsignedp;
8507 machine_mode mode;
8508 scalar_int_mode int_mode;
8509 enum tree_code code = ops->code;
8510 optab this_optab;
8511 rtx subtarget, original_target;
8512 int ignore;
8513 bool reduce_bit_field;
8514 location_t loc = ops->location;
8515 tree treeop0, treeop1, treeop2;
8516 #define REDUCE_BIT_FIELD(expr) (reduce_bit_field \
8517 ? reduce_to_bit_field_precision ((expr), \
8518 target, \
8519 type) \
8520 : (expr))
8521
8522 type = ops->type;
8523 mode = TYPE_MODE (type);
8524 unsignedp = TYPE_UNSIGNED (type);
8525
8526 treeop0 = ops->op0;
8527 treeop1 = ops->op1;
8528 treeop2 = ops->op2;
8529
8530 /* We should be called only on simple (binary or unary) expressions,
8531 exactly those that are valid in gimple expressions that aren't
8532 GIMPLE_SINGLE_RHS (or invalid). */
8533 gcc_assert (get_gimple_rhs_class (code) == GIMPLE_UNARY_RHS
8534 || get_gimple_rhs_class (code) == GIMPLE_BINARY_RHS
8535 || get_gimple_rhs_class (code) == GIMPLE_TERNARY_RHS);
8536
8537 ignore = (target == const0_rtx
8538 || ((CONVERT_EXPR_CODE_P (code)
8539 || code == COND_EXPR || code == VIEW_CONVERT_EXPR)
8540 && TREE_CODE (type) == VOID_TYPE));
8541
8542 /* We should be called only if we need the result. */
8543 gcc_assert (!ignore);
8544
8545 /* An operation in what may be a bit-field type needs the
8546 result to be reduced to the precision of the bit-field type,
8547 which is narrower than that of the type's mode. */
8548 reduce_bit_field = (INTEGRAL_TYPE_P (type)
8549 && !type_has_mode_precision_p (type));
8550
8551 if (reduce_bit_field && modifier == EXPAND_STACK_PARM)
8552 target = 0;
8553
8554 /* Use subtarget as the target for operand 0 of a binary operation. */
8555 subtarget = get_subtarget (target);
8556 original_target = target;
8557
8558 switch (code)
8559 {
8560 case NON_LVALUE_EXPR:
8561 case PAREN_EXPR:
8562 CASE_CONVERT:
8563 if (treeop0 == error_mark_node)
8564 return const0_rtx;
8565
8566 if (TREE_CODE (type) == UNION_TYPE)
8567 {
8568 tree valtype = TREE_TYPE (treeop0);
8569
8570 /* If both input and output are BLKmode, this conversion isn't doing
8571 anything except possibly changing memory attribute. */
8572 if (mode == BLKmode && TYPE_MODE (valtype) == BLKmode)
8573 {
8574 rtx result = expand_expr (treeop0, target, tmode,
8575 modifier);
8576
8577 result = copy_rtx (result);
8578 set_mem_attributes (result, type, 0);
8579 return result;
8580 }
8581
8582 if (target == 0)
8583 {
8584 if (TYPE_MODE (type) != BLKmode)
8585 target = gen_reg_rtx (TYPE_MODE (type));
8586 else
8587 target = assign_temp (type, 1, 1);
8588 }
8589
8590 if (MEM_P (target))
8591 /* Store data into beginning of memory target. */
8592 store_expr (treeop0,
8593 adjust_address (target, TYPE_MODE (valtype), 0),
8594 modifier == EXPAND_STACK_PARM,
8595 false, TYPE_REVERSE_STORAGE_ORDER (type));
8596
8597 else
8598 {
8599 gcc_assert (REG_P (target)
8600 && !TYPE_REVERSE_STORAGE_ORDER (type));
8601
8602 /* Store this field into a union of the proper type. */
8603 poly_uint64 op0_size
8604 = tree_to_poly_uint64 (TYPE_SIZE (TREE_TYPE (treeop0)));
8605 poly_uint64 union_size = GET_MODE_BITSIZE (mode);
8606 store_field (target,
8607 /* The conversion must be constructed so that
8608 we know at compile time how many bits
8609 to preserve. */
8610 ordered_min (op0_size, union_size),
8611 0, 0, 0, TYPE_MODE (valtype), treeop0, 0,
8612 false, false);
8613 }
8614
8615 /* Return the entire union. */
8616 return target;
8617 }
8618
8619 if (mode == TYPE_MODE (TREE_TYPE (treeop0)))
8620 {
8621 op0 = expand_expr (treeop0, target, VOIDmode,
8622 modifier);
8623
8624 /* If the signedness of the conversion differs and OP0 is
8625 a promoted SUBREG, clear that indication since we now
8626 have to do the proper extension. */
8627 if (TYPE_UNSIGNED (TREE_TYPE (treeop0)) != unsignedp
8628 && GET_CODE (op0) == SUBREG)
8629 SUBREG_PROMOTED_VAR_P (op0) = 0;
8630
8631 return REDUCE_BIT_FIELD (op0);
8632 }
8633
8634 op0 = expand_expr (treeop0, NULL_RTX, mode,
8635 modifier == EXPAND_SUM ? EXPAND_NORMAL : modifier);
8636 if (GET_MODE (op0) == mode)
8637 ;
8638
8639 /* If OP0 is a constant, just convert it into the proper mode. */
8640 else if (CONSTANT_P (op0))
8641 {
8642 tree inner_type = TREE_TYPE (treeop0);
8643 machine_mode inner_mode = GET_MODE (op0);
8644
8645 if (inner_mode == VOIDmode)
8646 inner_mode = TYPE_MODE (inner_type);
8647
8648 if (modifier == EXPAND_INITIALIZER)
8649 op0 = lowpart_subreg (mode, op0, inner_mode);
8650 else
8651 op0= convert_modes (mode, inner_mode, op0,
8652 TYPE_UNSIGNED (inner_type));
8653 }
8654
8655 else if (modifier == EXPAND_INITIALIZER)
8656 op0 = gen_rtx_fmt_e (TYPE_UNSIGNED (TREE_TYPE (treeop0))
8657 ? ZERO_EXTEND : SIGN_EXTEND, mode, op0);
8658
8659 else if (target == 0)
8660 op0 = convert_to_mode (mode, op0,
8661 TYPE_UNSIGNED (TREE_TYPE
8662 (treeop0)));
8663 else
8664 {
8665 convert_move (target, op0,
8666 TYPE_UNSIGNED (TREE_TYPE (treeop0)));
8667 op0 = target;
8668 }
8669
8670 return REDUCE_BIT_FIELD (op0);
8671
8672 case ADDR_SPACE_CONVERT_EXPR:
8673 {
8674 tree treeop0_type = TREE_TYPE (treeop0);
8675
8676 gcc_assert (POINTER_TYPE_P (type));
8677 gcc_assert (POINTER_TYPE_P (treeop0_type));
8678
8679 addr_space_t as_to = TYPE_ADDR_SPACE (TREE_TYPE (type));
8680 addr_space_t as_from = TYPE_ADDR_SPACE (TREE_TYPE (treeop0_type));
8681
8682 /* Conversions between pointers to the same address space should
8683 have been implemented via CONVERT_EXPR / NOP_EXPR. */
8684 gcc_assert (as_to != as_from);
8685
8686 op0 = expand_expr (treeop0, NULL_RTX, VOIDmode, modifier);
8687
8688 /* Ask target code to handle conversion between pointers
8689 to overlapping address spaces. */
8690 if (targetm.addr_space.subset_p (as_to, as_from)
8691 || targetm.addr_space.subset_p (as_from, as_to))
8692 {
8693 op0 = targetm.addr_space.convert (op0, treeop0_type, type);
8694 }
8695 else
8696 {
8697 /* For disjoint address spaces, converting anything but a null
8698 pointer invokes undefined behavior. We truncate or extend the
8699 value as if we'd converted via integers, which handles 0 as
8700 required, and all others as the programmer likely expects. */
8701 #ifndef POINTERS_EXTEND_UNSIGNED
8702 const int POINTERS_EXTEND_UNSIGNED = 1;
8703 #endif
8704 op0 = convert_modes (mode, TYPE_MODE (treeop0_type),
8705 op0, POINTERS_EXTEND_UNSIGNED);
8706 }
8707 gcc_assert (op0);
8708 return op0;
8709 }
8710
8711 case POINTER_PLUS_EXPR:
8712 /* Even though the sizetype mode and the pointer's mode can be different
8713 expand is able to handle this correctly and get the correct result out
8714 of the PLUS_EXPR code. */
8715 /* Make sure to sign-extend the sizetype offset in a POINTER_PLUS_EXPR
8716 if sizetype precision is smaller than pointer precision. */
8717 if (TYPE_PRECISION (sizetype) < TYPE_PRECISION (type))
8718 treeop1 = fold_convert_loc (loc, type,
8719 fold_convert_loc (loc, ssizetype,
8720 treeop1));
8721 /* If sizetype precision is larger than pointer precision, truncate the
8722 offset to have matching modes. */
8723 else if (TYPE_PRECISION (sizetype) > TYPE_PRECISION (type))
8724 treeop1 = fold_convert_loc (loc, type, treeop1);
8725 /* FALLTHRU */
8726
8727 case PLUS_EXPR:
8728 /* If we are adding a constant, a VAR_DECL that is sp, fp, or ap, and
8729 something else, make sure we add the register to the constant and
8730 then to the other thing. This case can occur during strength
8731 reduction and doing it this way will produce better code if the
8732 frame pointer or argument pointer is eliminated.
8733
8734 fold-const.c will ensure that the constant is always in the inner
8735 PLUS_EXPR, so the only case we need to do anything about is if
8736 sp, ap, or fp is our second argument, in which case we must swap
8737 the innermost first argument and our second argument. */
8738
8739 if (TREE_CODE (treeop0) == PLUS_EXPR
8740 && TREE_CODE (TREE_OPERAND (treeop0, 1)) == INTEGER_CST
8741 && VAR_P (treeop1)
8742 && (DECL_RTL (treeop1) == frame_pointer_rtx
8743 || DECL_RTL (treeop1) == stack_pointer_rtx
8744 || DECL_RTL (treeop1) == arg_pointer_rtx))
8745 {
8746 gcc_unreachable ();
8747 }
8748
8749 /* If the result is to be ptr_mode and we are adding an integer to
8750 something, we might be forming a constant. So try to use
8751 plus_constant. If it produces a sum and we can't accept it,
8752 use force_operand. This allows P = &ARR[const] to generate
8753 efficient code on machines where a SYMBOL_REF is not a valid
8754 address.
8755
8756 If this is an EXPAND_SUM call, always return the sum. */
8757 if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER
8758 || (mode == ptr_mode && (unsignedp || ! flag_trapv)))
8759 {
8760 if (modifier == EXPAND_STACK_PARM)
8761 target = 0;
8762 if (TREE_CODE (treeop0) == INTEGER_CST
8763 && HWI_COMPUTABLE_MODE_P (mode)
8764 && TREE_CONSTANT (treeop1))
8765 {
8766 rtx constant_part;
8767 HOST_WIDE_INT wc;
8768 machine_mode wmode = TYPE_MODE (TREE_TYPE (treeop1));
8769
8770 op1 = expand_expr (treeop1, subtarget, VOIDmode,
8771 EXPAND_SUM);
8772 /* Use wi::shwi to ensure that the constant is
8773 truncated according to the mode of OP1, then sign extended
8774 to a HOST_WIDE_INT. Using the constant directly can result
8775 in non-canonical RTL in a 64x32 cross compile. */
8776 wc = TREE_INT_CST_LOW (treeop0);
8777 constant_part =
8778 immed_wide_int_const (wi::shwi (wc, wmode), wmode);
8779 op1 = plus_constant (mode, op1, INTVAL (constant_part));
8780 if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
8781 op1 = force_operand (op1, target);
8782 return REDUCE_BIT_FIELD (op1);
8783 }
8784
8785 else if (TREE_CODE (treeop1) == INTEGER_CST
8786 && HWI_COMPUTABLE_MODE_P (mode)
8787 && TREE_CONSTANT (treeop0))
8788 {
8789 rtx constant_part;
8790 HOST_WIDE_INT wc;
8791 machine_mode wmode = TYPE_MODE (TREE_TYPE (treeop0));
8792
8793 op0 = expand_expr (treeop0, subtarget, VOIDmode,
8794 (modifier == EXPAND_INITIALIZER
8795 ? EXPAND_INITIALIZER : EXPAND_SUM));
8796 if (! CONSTANT_P (op0))
8797 {
8798 op1 = expand_expr (treeop1, NULL_RTX,
8799 VOIDmode, modifier);
8800 /* Return a PLUS if modifier says it's OK. */
8801 if (modifier == EXPAND_SUM
8802 || modifier == EXPAND_INITIALIZER)
8803 return simplify_gen_binary (PLUS, mode, op0, op1);
8804 goto binop2;
8805 }
8806 /* Use wi::shwi to ensure that the constant is
8807 truncated according to the mode of OP1, then sign extended
8808 to a HOST_WIDE_INT. Using the constant directly can result
8809 in non-canonical RTL in a 64x32 cross compile. */
8810 wc = TREE_INT_CST_LOW (treeop1);
8811 constant_part
8812 = immed_wide_int_const (wi::shwi (wc, wmode), wmode);
8813 op0 = plus_constant (mode, op0, INTVAL (constant_part));
8814 if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
8815 op0 = force_operand (op0, target);
8816 return REDUCE_BIT_FIELD (op0);
8817 }
8818 }
8819
8820 /* Use TER to expand pointer addition of a negated value
8821 as pointer subtraction. */
8822 if ((POINTER_TYPE_P (TREE_TYPE (treeop0))
8823 || (TREE_CODE (TREE_TYPE (treeop0)) == VECTOR_TYPE
8824 && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (treeop0)))))
8825 && TREE_CODE (treeop1) == SSA_NAME
8826 && TYPE_MODE (TREE_TYPE (treeop0))
8827 == TYPE_MODE (TREE_TYPE (treeop1)))
8828 {
8829 gimple *def = get_def_for_expr (treeop1, NEGATE_EXPR);
8830 if (def)
8831 {
8832 treeop1 = gimple_assign_rhs1 (def);
8833 code = MINUS_EXPR;
8834 goto do_minus;
8835 }
8836 }
8837
8838 /* No sense saving up arithmetic to be done
8839 if it's all in the wrong mode to form part of an address.
8840 And force_operand won't know whether to sign-extend or
8841 zero-extend. */
8842 if (modifier != EXPAND_INITIALIZER
8843 && (modifier != EXPAND_SUM || mode != ptr_mode))
8844 {
8845 expand_operands (treeop0, treeop1,
8846 subtarget, &op0, &op1, modifier);
8847 if (op0 == const0_rtx)
8848 return op1;
8849 if (op1 == const0_rtx)
8850 return op0;
8851 goto binop2;
8852 }
8853
8854 expand_operands (treeop0, treeop1,
8855 subtarget, &op0, &op1, modifier);
8856 return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1));
8857
8858 case MINUS_EXPR:
8859 case POINTER_DIFF_EXPR:
8860 do_minus:
8861 /* For initializers, we are allowed to return a MINUS of two
8862 symbolic constants. Here we handle all cases when both operands
8863 are constant. */
8864 /* Handle difference of two symbolic constants,
8865 for the sake of an initializer. */
8866 if ((modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
8867 && really_constant_p (treeop0)
8868 && really_constant_p (treeop1))
8869 {
8870 expand_operands (treeop0, treeop1,
8871 NULL_RTX, &op0, &op1, modifier);
8872 return simplify_gen_binary (MINUS, mode, op0, op1);
8873 }
8874
8875 /* No sense saving up arithmetic to be done
8876 if it's all in the wrong mode to form part of an address.
8877 And force_operand won't know whether to sign-extend or
8878 zero-extend. */
8879 if (modifier != EXPAND_INITIALIZER
8880 && (modifier != EXPAND_SUM || mode != ptr_mode))
8881 goto binop;
8882
8883 expand_operands (treeop0, treeop1,
8884 subtarget, &op0, &op1, modifier);
8885
8886 /* Convert A - const to A + (-const). */
8887 if (CONST_INT_P (op1))
8888 {
8889 op1 = negate_rtx (mode, op1);
8890 return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1));
8891 }
8892
8893 goto binop2;
8894
8895 case WIDEN_MULT_PLUS_EXPR:
8896 case WIDEN_MULT_MINUS_EXPR:
8897 expand_operands (treeop0, treeop1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
8898 op2 = expand_normal (treeop2);
8899 target = expand_widen_pattern_expr (ops, op0, op1, op2,
8900 target, unsignedp);
8901 return target;
8902
8903 case WIDEN_MULT_EXPR:
8904 /* If first operand is constant, swap them.
8905 Thus the following special case checks need only
8906 check the second operand. */
8907 if (TREE_CODE (treeop0) == INTEGER_CST)
8908 std::swap (treeop0, treeop1);
8909
8910 /* First, check if we have a multiplication of one signed and one
8911 unsigned operand. */
8912 if (TREE_CODE (treeop1) != INTEGER_CST
8913 && (TYPE_UNSIGNED (TREE_TYPE (treeop0))
8914 != TYPE_UNSIGNED (TREE_TYPE (treeop1))))
8915 {
8916 machine_mode innermode = TYPE_MODE (TREE_TYPE (treeop0));
8917 this_optab = usmul_widen_optab;
8918 if (find_widening_optab_handler (this_optab, mode, innermode)
8919 != CODE_FOR_nothing)
8920 {
8921 if (TYPE_UNSIGNED (TREE_TYPE (treeop0)))
8922 expand_operands (treeop0, treeop1, NULL_RTX, &op0, &op1,
8923 EXPAND_NORMAL);
8924 else
8925 expand_operands (treeop0, treeop1, NULL_RTX, &op1, &op0,
8926 EXPAND_NORMAL);
8927 /* op0 and op1 might still be constant, despite the above
8928 != INTEGER_CST check. Handle it. */
8929 if (GET_MODE (op0) == VOIDmode && GET_MODE (op1) == VOIDmode)
8930 {
8931 op0 = convert_modes (mode, innermode, op0, true);
8932 op1 = convert_modes (mode, innermode, op1, false);
8933 return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1,
8934 target, unsignedp));
8935 }
8936 goto binop3;
8937 }
8938 }
8939 /* Check for a multiplication with matching signedness. */
8940 else if ((TREE_CODE (treeop1) == INTEGER_CST
8941 && int_fits_type_p (treeop1, TREE_TYPE (treeop0)))
8942 || (TYPE_UNSIGNED (TREE_TYPE (treeop1))
8943 == TYPE_UNSIGNED (TREE_TYPE (treeop0))))
8944 {
8945 tree op0type = TREE_TYPE (treeop0);
8946 machine_mode innermode = TYPE_MODE (op0type);
8947 bool zextend_p = TYPE_UNSIGNED (op0type);
8948 optab other_optab = zextend_p ? smul_widen_optab : umul_widen_optab;
8949 this_optab = zextend_p ? umul_widen_optab : smul_widen_optab;
8950
8951 if (TREE_CODE (treeop0) != INTEGER_CST)
8952 {
8953 if (find_widening_optab_handler (this_optab, mode, innermode)
8954 != CODE_FOR_nothing)
8955 {
8956 expand_operands (treeop0, treeop1, NULL_RTX, &op0, &op1,
8957 EXPAND_NORMAL);
8958 /* op0 and op1 might still be constant, despite the above
8959 != INTEGER_CST check. Handle it. */
8960 if (GET_MODE (op0) == VOIDmode && GET_MODE (op1) == VOIDmode)
8961 {
8962 widen_mult_const:
8963 op0 = convert_modes (mode, innermode, op0, zextend_p);
8964 op1
8965 = convert_modes (mode, innermode, op1,
8966 TYPE_UNSIGNED (TREE_TYPE (treeop1)));
8967 return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1,
8968 target,
8969 unsignedp));
8970 }
8971 temp = expand_widening_mult (mode, op0, op1, target,
8972 unsignedp, this_optab);
8973 return REDUCE_BIT_FIELD (temp);
8974 }
8975 if (find_widening_optab_handler (other_optab, mode, innermode)
8976 != CODE_FOR_nothing
8977 && innermode == word_mode)
8978 {
8979 rtx htem, hipart;
8980 op0 = expand_normal (treeop0);
8981 op1 = expand_normal (treeop1);
8982 /* op0 and op1 might be constants, despite the above
8983 != INTEGER_CST check. Handle it. */
8984 if (GET_MODE (op0) == VOIDmode && GET_MODE (op1) == VOIDmode)
8985 goto widen_mult_const;
8986 temp = expand_binop (mode, other_optab, op0, op1, target,
8987 unsignedp, OPTAB_LIB_WIDEN);
8988 hipart = gen_highpart (word_mode, temp);
8989 htem = expand_mult_highpart_adjust (word_mode, hipart,
8990 op0, op1, hipart,
8991 zextend_p);
8992 if (htem != hipart)
8993 emit_move_insn (hipart, htem);
8994 return REDUCE_BIT_FIELD (temp);
8995 }
8996 }
8997 }
8998 treeop0 = fold_build1 (CONVERT_EXPR, type, treeop0);
8999 treeop1 = fold_build1 (CONVERT_EXPR, type, treeop1);
9000 expand_operands (treeop0, treeop1, subtarget, &op0, &op1, EXPAND_NORMAL);
9001 return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1, target, unsignedp));
9002
9003 case MULT_EXPR:
9004 /* If this is a fixed-point operation, then we cannot use the code
9005 below because "expand_mult" doesn't support sat/no-sat fixed-point
9006 multiplications. */
9007 if (ALL_FIXED_POINT_MODE_P (mode))
9008 goto binop;
9009
9010 /* If first operand is constant, swap them.
9011 Thus the following special case checks need only
9012 check the second operand. */
9013 if (TREE_CODE (treeop0) == INTEGER_CST)
9014 std::swap (treeop0, treeop1);
9015
9016 /* Attempt to return something suitable for generating an
9017 indexed address, for machines that support that. */
9018
9019 if (modifier == EXPAND_SUM && mode == ptr_mode
9020 && tree_fits_shwi_p (treeop1))
9021 {
9022 tree exp1 = treeop1;
9023
9024 op0 = expand_expr (treeop0, subtarget, VOIDmode,
9025 EXPAND_SUM);
9026
9027 if (!REG_P (op0))
9028 op0 = force_operand (op0, NULL_RTX);
9029 if (!REG_P (op0))
9030 op0 = copy_to_mode_reg (mode, op0);
9031
9032 return REDUCE_BIT_FIELD (gen_rtx_MULT (mode, op0,
9033 gen_int_mode (tree_to_shwi (exp1),
9034 TYPE_MODE (TREE_TYPE (exp1)))));
9035 }
9036
9037 if (modifier == EXPAND_STACK_PARM)
9038 target = 0;
9039
9040 expand_operands (treeop0, treeop1, subtarget, &op0, &op1, EXPAND_NORMAL);
9041 return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1, target, unsignedp));
9042
9043 case TRUNC_MOD_EXPR:
9044 case FLOOR_MOD_EXPR:
9045 case CEIL_MOD_EXPR:
9046 case ROUND_MOD_EXPR:
9047
9048 case TRUNC_DIV_EXPR:
9049 case FLOOR_DIV_EXPR:
9050 case CEIL_DIV_EXPR:
9051 case ROUND_DIV_EXPR:
9052 case EXACT_DIV_EXPR:
9053 {
9054 /* If this is a fixed-point operation, then we cannot use the code
9055 below because "expand_divmod" doesn't support sat/no-sat fixed-point
9056 divisions. */
9057 if (ALL_FIXED_POINT_MODE_P (mode))
9058 goto binop;
9059
9060 if (modifier == EXPAND_STACK_PARM)
9061 target = 0;
9062 /* Possible optimization: compute the dividend with EXPAND_SUM
9063 then if the divisor is constant can optimize the case
9064 where some terms of the dividend have coeffs divisible by it. */
9065 expand_operands (treeop0, treeop1,
9066 subtarget, &op0, &op1, EXPAND_NORMAL);
9067 bool mod_p = code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR
9068 || code == CEIL_MOD_EXPR || code == ROUND_MOD_EXPR;
9069 if (SCALAR_INT_MODE_P (mode)
9070 && optimize >= 2
9071 && get_range_pos_neg (treeop0) == 1
9072 && get_range_pos_neg (treeop1) == 1)
9073 {
9074 /* If both arguments are known to be positive when interpreted
9075 as signed, we can expand it as both signed and unsigned
9076 division or modulo. Choose the cheaper sequence in that case. */
9077 bool speed_p = optimize_insn_for_speed_p ();
9078 do_pending_stack_adjust ();
9079 start_sequence ();
9080 rtx uns_ret = expand_divmod (mod_p, code, mode, op0, op1, target, 1);
9081 rtx_insn *uns_insns = get_insns ();
9082 end_sequence ();
9083 start_sequence ();
9084 rtx sgn_ret = expand_divmod (mod_p, code, mode, op0, op1, target, 0);
9085 rtx_insn *sgn_insns = get_insns ();
9086 end_sequence ();
9087 unsigned uns_cost = seq_cost (uns_insns, speed_p);
9088 unsigned sgn_cost = seq_cost (sgn_insns, speed_p);
9089
9090 /* If costs are the same then use as tie breaker the other
9091 other factor. */
9092 if (uns_cost == sgn_cost)
9093 {
9094 uns_cost = seq_cost (uns_insns, !speed_p);
9095 sgn_cost = seq_cost (sgn_insns, !speed_p);
9096 }
9097
9098 if (uns_cost < sgn_cost || (uns_cost == sgn_cost && unsignedp))
9099 {
9100 emit_insn (uns_insns);
9101 return uns_ret;
9102 }
9103 emit_insn (sgn_insns);
9104 return sgn_ret;
9105 }
9106 return expand_divmod (mod_p, code, mode, op0, op1, target, unsignedp);
9107 }
9108 case RDIV_EXPR:
9109 goto binop;
9110
9111 case MULT_HIGHPART_EXPR:
9112 expand_operands (treeop0, treeop1, subtarget, &op0, &op1, EXPAND_NORMAL);
9113 temp = expand_mult_highpart (mode, op0, op1, target, unsignedp);
9114 gcc_assert (temp);
9115 return temp;
9116
9117 case FIXED_CONVERT_EXPR:
9118 op0 = expand_normal (treeop0);
9119 if (target == 0 || modifier == EXPAND_STACK_PARM)
9120 target = gen_reg_rtx (mode);
9121
9122 if ((TREE_CODE (TREE_TYPE (treeop0)) == INTEGER_TYPE
9123 && TYPE_UNSIGNED (TREE_TYPE (treeop0)))
9124 || (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type)))
9125 expand_fixed_convert (target, op0, 1, TYPE_SATURATING (type));
9126 else
9127 expand_fixed_convert (target, op0, 0, TYPE_SATURATING (type));
9128 return target;
9129
9130 case FIX_TRUNC_EXPR:
9131 op0 = expand_normal (treeop0);
9132 if (target == 0 || modifier == EXPAND_STACK_PARM)
9133 target = gen_reg_rtx (mode);
9134 expand_fix (target, op0, unsignedp);
9135 return target;
9136
9137 case FLOAT_EXPR:
9138 op0 = expand_normal (treeop0);
9139 if (target == 0 || modifier == EXPAND_STACK_PARM)
9140 target = gen_reg_rtx (mode);
9141 /* expand_float can't figure out what to do if FROM has VOIDmode.
9142 So give it the correct mode. With -O, cse will optimize this. */
9143 if (GET_MODE (op0) == VOIDmode)
9144 op0 = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (treeop0)),
9145 op0);
9146 expand_float (target, op0,
9147 TYPE_UNSIGNED (TREE_TYPE (treeop0)));
9148 return target;
9149
9150 case NEGATE_EXPR:
9151 op0 = expand_expr (treeop0, subtarget,
9152 VOIDmode, EXPAND_NORMAL);
9153 if (modifier == EXPAND_STACK_PARM)
9154 target = 0;
9155 temp = expand_unop (mode,
9156 optab_for_tree_code (NEGATE_EXPR, type,
9157 optab_default),
9158 op0, target, 0);
9159 gcc_assert (temp);
9160 return REDUCE_BIT_FIELD (temp);
9161
9162 case ABS_EXPR:
9163 case ABSU_EXPR:
9164 op0 = expand_expr (treeop0, subtarget,
9165 VOIDmode, EXPAND_NORMAL);
9166 if (modifier == EXPAND_STACK_PARM)
9167 target = 0;
9168
9169 /* ABS_EXPR is not valid for complex arguments. */
9170 gcc_assert (GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
9171 && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT);
9172
9173 /* Unsigned abs is simply the operand. Testing here means we don't
9174 risk generating incorrect code below. */
9175 if (TYPE_UNSIGNED (TREE_TYPE (treeop0)))
9176 return op0;
9177
9178 return expand_abs (mode, op0, target, unsignedp,
9179 safe_from_p (target, treeop0, 1));
9180
9181 case MAX_EXPR:
9182 case MIN_EXPR:
9183 target = original_target;
9184 if (target == 0
9185 || modifier == EXPAND_STACK_PARM
9186 || (MEM_P (target) && MEM_VOLATILE_P (target))
9187 || GET_MODE (target) != mode
9188 || (REG_P (target)
9189 && REGNO (target) < FIRST_PSEUDO_REGISTER))
9190 target = gen_reg_rtx (mode);
9191 expand_operands (treeop0, treeop1,
9192 target, &op0, &op1, EXPAND_NORMAL);
9193
9194 /* First try to do it with a special MIN or MAX instruction.
9195 If that does not win, use a conditional jump to select the proper
9196 value. */
9197 this_optab = optab_for_tree_code (code, type, optab_default);
9198 temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp,
9199 OPTAB_WIDEN);
9200 if (temp != 0)
9201 return temp;
9202
9203 /* For vector MIN <x, y>, expand it a VEC_COND_EXPR <x <= y, x, y>
9204 and similarly for MAX <x, y>. */
9205 if (VECTOR_TYPE_P (type))
9206 {
9207 tree t0 = make_tree (type, op0);
9208 tree t1 = make_tree (type, op1);
9209 tree comparison = build2 (code == MIN_EXPR ? LE_EXPR : GE_EXPR,
9210 type, t0, t1);
9211 return expand_vec_cond_expr (type, comparison, t0, t1,
9212 original_target);
9213 }
9214
9215 /* At this point, a MEM target is no longer useful; we will get better
9216 code without it. */
9217
9218 if (! REG_P (target))
9219 target = gen_reg_rtx (mode);
9220
9221 /* If op1 was placed in target, swap op0 and op1. */
9222 if (target != op0 && target == op1)
9223 std::swap (op0, op1);
9224
9225 /* We generate better code and avoid problems with op1 mentioning
9226 target by forcing op1 into a pseudo if it isn't a constant. */
9227 if (! CONSTANT_P (op1))
9228 op1 = force_reg (mode, op1);
9229
9230 {
9231 enum rtx_code comparison_code;
9232 rtx cmpop1 = op1;
9233
9234 if (code == MAX_EXPR)
9235 comparison_code = unsignedp ? GEU : GE;
9236 else
9237 comparison_code = unsignedp ? LEU : LE;
9238
9239 /* Canonicalize to comparisons against 0. */
9240 if (op1 == const1_rtx)
9241 {
9242 /* Converting (a >= 1 ? a : 1) into (a > 0 ? a : 1)
9243 or (a != 0 ? a : 1) for unsigned.
9244 For MIN we are safe converting (a <= 1 ? a : 1)
9245 into (a <= 0 ? a : 1) */
9246 cmpop1 = const0_rtx;
9247 if (code == MAX_EXPR)
9248 comparison_code = unsignedp ? NE : GT;
9249 }
9250 if (op1 == constm1_rtx && !unsignedp)
9251 {
9252 /* Converting (a >= -1 ? a : -1) into (a >= 0 ? a : -1)
9253 and (a <= -1 ? a : -1) into (a < 0 ? a : -1) */
9254 cmpop1 = const0_rtx;
9255 if (code == MIN_EXPR)
9256 comparison_code = LT;
9257 }
9258
9259 /* Use a conditional move if possible. */
9260 if (can_conditionally_move_p (mode))
9261 {
9262 rtx insn;
9263
9264 start_sequence ();
9265
9266 /* Try to emit the conditional move. */
9267 insn = emit_conditional_move (target, comparison_code,
9268 op0, cmpop1, mode,
9269 op0, op1, mode,
9270 unsignedp);
9271
9272 /* If we could do the conditional move, emit the sequence,
9273 and return. */
9274 if (insn)
9275 {
9276 rtx_insn *seq = get_insns ();
9277 end_sequence ();
9278 emit_insn (seq);
9279 return target;
9280 }
9281
9282 /* Otherwise discard the sequence and fall back to code with
9283 branches. */
9284 end_sequence ();
9285 }
9286
9287 if (target != op0)
9288 emit_move_insn (target, op0);
9289
9290 lab = gen_label_rtx ();
9291 do_compare_rtx_and_jump (target, cmpop1, comparison_code,
9292 unsignedp, mode, NULL_RTX, NULL, lab,
9293 profile_probability::uninitialized ());
9294 }
9295 emit_move_insn (target, op1);
9296 emit_label (lab);
9297 return target;
9298
9299 case BIT_NOT_EXPR:
9300 op0 = expand_expr (treeop0, subtarget,
9301 VOIDmode, EXPAND_NORMAL);
9302 if (modifier == EXPAND_STACK_PARM)
9303 target = 0;
9304 /* In case we have to reduce the result to bitfield precision
9305 for unsigned bitfield expand this as XOR with a proper constant
9306 instead. */
9307 if (reduce_bit_field && TYPE_UNSIGNED (type))
9308 {
9309 int_mode = SCALAR_INT_TYPE_MODE (type);
9310 wide_int mask = wi::mask (TYPE_PRECISION (type),
9311 false, GET_MODE_PRECISION (int_mode));
9312
9313 temp = expand_binop (int_mode, xor_optab, op0,
9314 immed_wide_int_const (mask, int_mode),
9315 target, 1, OPTAB_LIB_WIDEN);
9316 }
9317 else
9318 temp = expand_unop (mode, one_cmpl_optab, op0, target, 1);
9319 gcc_assert (temp);
9320 return temp;
9321
9322 /* ??? Can optimize bitwise operations with one arg constant.
9323 Can optimize (a bitwise1 n) bitwise2 (a bitwise3 b)
9324 and (a bitwise1 b) bitwise2 b (etc)
9325 but that is probably not worth while. */
9326
9327 case BIT_AND_EXPR:
9328 case BIT_IOR_EXPR:
9329 case BIT_XOR_EXPR:
9330 goto binop;
9331
9332 case LROTATE_EXPR:
9333 case RROTATE_EXPR:
9334 gcc_assert (VECTOR_MODE_P (TYPE_MODE (type))
9335 || type_has_mode_precision_p (type));
9336 /* fall through */
9337
9338 case LSHIFT_EXPR:
9339 case RSHIFT_EXPR:
9340 {
9341 /* If this is a fixed-point operation, then we cannot use the code
9342 below because "expand_shift" doesn't support sat/no-sat fixed-point
9343 shifts. */
9344 if (ALL_FIXED_POINT_MODE_P (mode))
9345 goto binop;
9346
9347 if (! safe_from_p (subtarget, treeop1, 1))
9348 subtarget = 0;
9349 if (modifier == EXPAND_STACK_PARM)
9350 target = 0;
9351 op0 = expand_expr (treeop0, subtarget,
9352 VOIDmode, EXPAND_NORMAL);
9353
9354 /* Left shift optimization when shifting across word_size boundary.
9355
9356 If mode == GET_MODE_WIDER_MODE (word_mode), then normally
9357 there isn't native instruction to support this wide mode
9358 left shift. Given below scenario:
9359
9360 Type A = (Type) B << C
9361
9362 |< T >|
9363 | dest_high | dest_low |
9364
9365 | word_size |
9366
9367 If the shift amount C caused we shift B to across the word
9368 size boundary, i.e part of B shifted into high half of
9369 destination register, and part of B remains in the low
9370 half, then GCC will use the following left shift expand
9371 logic:
9372
9373 1. Initialize dest_low to B.
9374 2. Initialize every bit of dest_high to the sign bit of B.
9375 3. Logic left shift dest_low by C bit to finalize dest_low.
9376 The value of dest_low before this shift is kept in a temp D.
9377 4. Logic left shift dest_high by C.
9378 5. Logic right shift D by (word_size - C).
9379 6. Or the result of 4 and 5 to finalize dest_high.
9380
9381 While, by checking gimple statements, if operand B is
9382 coming from signed extension, then we can simplify above
9383 expand logic into:
9384
9385 1. dest_high = src_low >> (word_size - C).
9386 2. dest_low = src_low << C.
9387
9388 We can use one arithmetic right shift to finish all the
9389 purpose of steps 2, 4, 5, 6, thus we reduce the steps
9390 needed from 6 into 2.
9391
9392 The case is similar for zero extension, except that we
9393 initialize dest_high to zero rather than copies of the sign
9394 bit from B. Furthermore, we need to use a logical right shift
9395 in this case.
9396
9397 The choice of sign-extension versus zero-extension is
9398 determined entirely by whether or not B is signed and is
9399 independent of the current setting of unsignedp. */
9400
9401 temp = NULL_RTX;
9402 if (code == LSHIFT_EXPR
9403 && target
9404 && REG_P (target)
9405 && GET_MODE_2XWIDER_MODE (word_mode).exists (&int_mode)
9406 && mode == int_mode
9407 && TREE_CONSTANT (treeop1)
9408 && TREE_CODE (treeop0) == SSA_NAME)
9409 {
9410 gimple *def = SSA_NAME_DEF_STMT (treeop0);
9411 if (is_gimple_assign (def)
9412 && gimple_assign_rhs_code (def) == NOP_EXPR)
9413 {
9414 scalar_int_mode rmode = SCALAR_INT_TYPE_MODE
9415 (TREE_TYPE (gimple_assign_rhs1 (def)));
9416
9417 if (GET_MODE_SIZE (rmode) < GET_MODE_SIZE (int_mode)
9418 && TREE_INT_CST_LOW (treeop1) < GET_MODE_BITSIZE (word_mode)
9419 && ((TREE_INT_CST_LOW (treeop1) + GET_MODE_BITSIZE (rmode))
9420 >= GET_MODE_BITSIZE (word_mode)))
9421 {
9422 rtx_insn *seq, *seq_old;
9423 poly_uint64 high_off = subreg_highpart_offset (word_mode,
9424 int_mode);
9425 bool extend_unsigned
9426 = TYPE_UNSIGNED (TREE_TYPE (gimple_assign_rhs1 (def)));
9427 rtx low = lowpart_subreg (word_mode, op0, int_mode);
9428 rtx dest_low = lowpart_subreg (word_mode, target, int_mode);
9429 rtx dest_high = simplify_gen_subreg (word_mode, target,
9430 int_mode, high_off);
9431 HOST_WIDE_INT ramount = (BITS_PER_WORD
9432 - TREE_INT_CST_LOW (treeop1));
9433 tree rshift = build_int_cst (TREE_TYPE (treeop1), ramount);
9434
9435 start_sequence ();
9436 /* dest_high = src_low >> (word_size - C). */
9437 temp = expand_variable_shift (RSHIFT_EXPR, word_mode, low,
9438 rshift, dest_high,
9439 extend_unsigned);
9440 if (temp != dest_high)
9441 emit_move_insn (dest_high, temp);
9442
9443 /* dest_low = src_low << C. */
9444 temp = expand_variable_shift (LSHIFT_EXPR, word_mode, low,
9445 treeop1, dest_low, unsignedp);
9446 if (temp != dest_low)
9447 emit_move_insn (dest_low, temp);
9448
9449 seq = get_insns ();
9450 end_sequence ();
9451 temp = target ;
9452
9453 if (have_insn_for (ASHIFT, int_mode))
9454 {
9455 bool speed_p = optimize_insn_for_speed_p ();
9456 start_sequence ();
9457 rtx ret_old = expand_variable_shift (code, int_mode,
9458 op0, treeop1,
9459 target,
9460 unsignedp);
9461
9462 seq_old = get_insns ();
9463 end_sequence ();
9464 if (seq_cost (seq, speed_p)
9465 >= seq_cost (seq_old, speed_p))
9466 {
9467 seq = seq_old;
9468 temp = ret_old;
9469 }
9470 }
9471 emit_insn (seq);
9472 }
9473 }
9474 }
9475
9476 if (temp == NULL_RTX)
9477 temp = expand_variable_shift (code, mode, op0, treeop1, target,
9478 unsignedp);
9479 if (code == LSHIFT_EXPR)
9480 temp = REDUCE_BIT_FIELD (temp);
9481 return temp;
9482 }
9483
9484 /* Could determine the answer when only additive constants differ. Also,
9485 the addition of one can be handled by changing the condition. */
9486 case LT_EXPR:
9487 case LE_EXPR:
9488 case GT_EXPR:
9489 case GE_EXPR:
9490 case EQ_EXPR:
9491 case NE_EXPR:
9492 case UNORDERED_EXPR:
9493 case ORDERED_EXPR:
9494 case UNLT_EXPR:
9495 case UNLE_EXPR:
9496 case UNGT_EXPR:
9497 case UNGE_EXPR:
9498 case UNEQ_EXPR:
9499 case LTGT_EXPR:
9500 {
9501 temp = do_store_flag (ops,
9502 modifier != EXPAND_STACK_PARM ? target : NULL_RTX,
9503 tmode != VOIDmode ? tmode : mode);
9504 if (temp)
9505 return temp;
9506
9507 /* Use a compare and a jump for BLKmode comparisons, or for function
9508 type comparisons is have_canonicalize_funcptr_for_compare. */
9509
9510 if ((target == 0
9511 || modifier == EXPAND_STACK_PARM
9512 || ! safe_from_p (target, treeop0, 1)
9513 || ! safe_from_p (target, treeop1, 1)
9514 /* Make sure we don't have a hard reg (such as function's return
9515 value) live across basic blocks, if not optimizing. */
9516 || (!optimize && REG_P (target)
9517 && REGNO (target) < FIRST_PSEUDO_REGISTER)))
9518 target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
9519
9520 emit_move_insn (target, const0_rtx);
9521
9522 rtx_code_label *lab1 = gen_label_rtx ();
9523 jumpifnot_1 (code, treeop0, treeop1, lab1,
9524 profile_probability::uninitialized ());
9525
9526 if (TYPE_PRECISION (type) == 1 && !TYPE_UNSIGNED (type))
9527 emit_move_insn (target, constm1_rtx);
9528 else
9529 emit_move_insn (target, const1_rtx);
9530
9531 emit_label (lab1);
9532 return target;
9533 }
9534 case COMPLEX_EXPR:
9535 /* Get the rtx code of the operands. */
9536 op0 = expand_normal (treeop0);
9537 op1 = expand_normal (treeop1);
9538
9539 if (!target)
9540 target = gen_reg_rtx (TYPE_MODE (type));
9541 else
9542 /* If target overlaps with op1, then either we need to force
9543 op1 into a pseudo (if target also overlaps with op0),
9544 or write the complex parts in reverse order. */
9545 switch (GET_CODE (target))
9546 {
9547 case CONCAT:
9548 if (reg_overlap_mentioned_p (XEXP (target, 0), op1))
9549 {
9550 if (reg_overlap_mentioned_p (XEXP (target, 1), op0))
9551 {
9552 complex_expr_force_op1:
9553 temp = gen_reg_rtx (GET_MODE_INNER (GET_MODE (target)));
9554 emit_move_insn (temp, op1);
9555 op1 = temp;
9556 break;
9557 }
9558 complex_expr_swap_order:
9559 /* Move the imaginary (op1) and real (op0) parts to their
9560 location. */
9561 write_complex_part (target, op1, true);
9562 write_complex_part (target, op0, false);
9563
9564 return target;
9565 }
9566 break;
9567 case MEM:
9568 temp = adjust_address_nv (target,
9569 GET_MODE_INNER (GET_MODE (target)), 0);
9570 if (reg_overlap_mentioned_p (temp, op1))
9571 {
9572 scalar_mode imode = GET_MODE_INNER (GET_MODE (target));
9573 temp = adjust_address_nv (target, imode,
9574 GET_MODE_SIZE (imode));
9575 if (reg_overlap_mentioned_p (temp, op0))
9576 goto complex_expr_force_op1;
9577 goto complex_expr_swap_order;
9578 }
9579 break;
9580 default:
9581 if (reg_overlap_mentioned_p (target, op1))
9582 {
9583 if (reg_overlap_mentioned_p (target, op0))
9584 goto complex_expr_force_op1;
9585 goto complex_expr_swap_order;
9586 }
9587 break;
9588 }
9589
9590 /* Move the real (op0) and imaginary (op1) parts to their location. */
9591 write_complex_part (target, op0, false);
9592 write_complex_part (target, op1, true);
9593
9594 return target;
9595
9596 case WIDEN_SUM_EXPR:
9597 {
9598 tree oprnd0 = treeop0;
9599 tree oprnd1 = treeop1;
9600
9601 expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9602 target = expand_widen_pattern_expr (ops, op0, NULL_RTX, op1,
9603 target, unsignedp);
9604 return target;
9605 }
9606
9607 case VEC_UNPACK_HI_EXPR:
9608 case VEC_UNPACK_LO_EXPR:
9609 case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
9610 case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
9611 {
9612 op0 = expand_normal (treeop0);
9613 temp = expand_widen_pattern_expr (ops, op0, NULL_RTX, NULL_RTX,
9614 target, unsignedp);
9615 gcc_assert (temp);
9616 return temp;
9617 }
9618
9619 case VEC_UNPACK_FLOAT_HI_EXPR:
9620 case VEC_UNPACK_FLOAT_LO_EXPR:
9621 {
9622 op0 = expand_normal (treeop0);
9623 /* The signedness is determined from input operand. */
9624 temp = expand_widen_pattern_expr
9625 (ops, op0, NULL_RTX, NULL_RTX,
9626 target, TYPE_UNSIGNED (TREE_TYPE (treeop0)));
9627
9628 gcc_assert (temp);
9629 return temp;
9630 }
9631
9632 case VEC_WIDEN_MULT_HI_EXPR:
9633 case VEC_WIDEN_MULT_LO_EXPR:
9634 case VEC_WIDEN_MULT_EVEN_EXPR:
9635 case VEC_WIDEN_MULT_ODD_EXPR:
9636 case VEC_WIDEN_LSHIFT_HI_EXPR:
9637 case VEC_WIDEN_LSHIFT_LO_EXPR:
9638 expand_operands (treeop0, treeop1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9639 target = expand_widen_pattern_expr (ops, op0, op1, NULL_RTX,
9640 target, unsignedp);
9641 gcc_assert (target);
9642 return target;
9643
9644 case VEC_PACK_SAT_EXPR:
9645 case VEC_PACK_FIX_TRUNC_EXPR:
9646 mode = TYPE_MODE (TREE_TYPE (treeop0));
9647 goto binop;
9648
9649 case VEC_PACK_TRUNC_EXPR:
9650 if (VECTOR_BOOLEAN_TYPE_P (type)
9651 && VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (treeop0))
9652 && mode == TYPE_MODE (TREE_TYPE (treeop0))
9653 && SCALAR_INT_MODE_P (mode))
9654 {
9655 class expand_operand eops[4];
9656 machine_mode imode = TYPE_MODE (TREE_TYPE (treeop0));
9657 expand_operands (treeop0, treeop1,
9658 subtarget, &op0, &op1, EXPAND_NORMAL);
9659 this_optab = vec_pack_sbool_trunc_optab;
9660 enum insn_code icode = optab_handler (this_optab, imode);
9661 create_output_operand (&eops[0], target, mode);
9662 create_convert_operand_from (&eops[1], op0, imode, false);
9663 create_convert_operand_from (&eops[2], op1, imode, false);
9664 temp = GEN_INT (TYPE_VECTOR_SUBPARTS (type).to_constant ());
9665 create_input_operand (&eops[3], temp, imode);
9666 expand_insn (icode, 4, eops);
9667 return eops[0].value;
9668 }
9669 mode = TYPE_MODE (TREE_TYPE (treeop0));
9670 goto binop;
9671
9672 case VEC_PACK_FLOAT_EXPR:
9673 mode = TYPE_MODE (TREE_TYPE (treeop0));
9674 expand_operands (treeop0, treeop1,
9675 subtarget, &op0, &op1, EXPAND_NORMAL);
9676 this_optab = optab_for_tree_code (code, TREE_TYPE (treeop0),
9677 optab_default);
9678 target = expand_binop (mode, this_optab, op0, op1, target,
9679 TYPE_UNSIGNED (TREE_TYPE (treeop0)),
9680 OPTAB_LIB_WIDEN);
9681 gcc_assert (target);
9682 return target;
9683
9684 case VEC_PERM_EXPR:
9685 {
9686 expand_operands (treeop0, treeop1, target, &op0, &op1, EXPAND_NORMAL);
9687 vec_perm_builder sel;
9688 if (TREE_CODE (treeop2) == VECTOR_CST
9689 && tree_to_vec_perm_builder (&sel, treeop2))
9690 {
9691 machine_mode sel_mode = TYPE_MODE (TREE_TYPE (treeop2));
9692 temp = expand_vec_perm_const (mode, op0, op1, sel,
9693 sel_mode, target);
9694 }
9695 else
9696 {
9697 op2 = expand_normal (treeop2);
9698 temp = expand_vec_perm_var (mode, op0, op1, op2, target);
9699 }
9700 gcc_assert (temp);
9701 return temp;
9702 }
9703
9704 case DOT_PROD_EXPR:
9705 {
9706 tree oprnd0 = treeop0;
9707 tree oprnd1 = treeop1;
9708 tree oprnd2 = treeop2;
9709
9710 expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9711 op2 = expand_normal (oprnd2);
9712 target = expand_widen_pattern_expr (ops, op0, op1, op2,
9713 target, unsignedp);
9714 return target;
9715 }
9716
9717 case SAD_EXPR:
9718 {
9719 tree oprnd0 = treeop0;
9720 tree oprnd1 = treeop1;
9721 tree oprnd2 = treeop2;
9722
9723 expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9724 op2 = expand_normal (oprnd2);
9725 target = expand_widen_pattern_expr (ops, op0, op1, op2,
9726 target, unsignedp);
9727 return target;
9728 }
9729
9730 case REALIGN_LOAD_EXPR:
9731 {
9732 tree oprnd0 = treeop0;
9733 tree oprnd1 = treeop1;
9734 tree oprnd2 = treeop2;
9735
9736 this_optab = optab_for_tree_code (code, type, optab_default);
9737 expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9738 op2 = expand_normal (oprnd2);
9739 temp = expand_ternary_op (mode, this_optab, op0, op1, op2,
9740 target, unsignedp);
9741 gcc_assert (temp);
9742 return temp;
9743 }
9744
9745 case COND_EXPR:
9746 {
9747 /* A COND_EXPR with its type being VOID_TYPE represents a
9748 conditional jump and is handled in
9749 expand_gimple_cond_expr. */
9750 gcc_assert (!VOID_TYPE_P (type));
9751
9752 /* Note that COND_EXPRs whose type is a structure or union
9753 are required to be constructed to contain assignments of
9754 a temporary variable, so that we can evaluate them here
9755 for side effect only. If type is void, we must do likewise. */
9756
9757 gcc_assert (!TREE_ADDRESSABLE (type)
9758 && !ignore
9759 && TREE_TYPE (treeop1) != void_type_node
9760 && TREE_TYPE (treeop2) != void_type_node);
9761
9762 temp = expand_cond_expr_using_cmove (treeop0, treeop1, treeop2);
9763 if (temp)
9764 return temp;
9765
9766 /* If we are not to produce a result, we have no target. Otherwise,
9767 if a target was specified use it; it will not be used as an
9768 intermediate target unless it is safe. If no target, use a
9769 temporary. */
9770
9771 if (modifier != EXPAND_STACK_PARM
9772 && original_target
9773 && safe_from_p (original_target, treeop0, 1)
9774 && GET_MODE (original_target) == mode
9775 && !MEM_P (original_target))
9776 temp = original_target;
9777 else
9778 temp = assign_temp (type, 0, 1);
9779
9780 do_pending_stack_adjust ();
9781 NO_DEFER_POP;
9782 rtx_code_label *lab0 = gen_label_rtx ();
9783 rtx_code_label *lab1 = gen_label_rtx ();
9784 jumpifnot (treeop0, lab0,
9785 profile_probability::uninitialized ());
9786 store_expr (treeop1, temp,
9787 modifier == EXPAND_STACK_PARM,
9788 false, false);
9789
9790 emit_jump_insn (targetm.gen_jump (lab1));
9791 emit_barrier ();
9792 emit_label (lab0);
9793 store_expr (treeop2, temp,
9794 modifier == EXPAND_STACK_PARM,
9795 false, false);
9796
9797 emit_label (lab1);
9798 OK_DEFER_POP;
9799 return temp;
9800 }
9801
9802 case VEC_COND_EXPR:
9803 target = expand_vec_cond_expr (type, treeop0, treeop1, treeop2, target);
9804 return target;
9805
9806 case VEC_DUPLICATE_EXPR:
9807 op0 = expand_expr (treeop0, NULL_RTX, VOIDmode, modifier);
9808 target = expand_vector_broadcast (mode, op0);
9809 gcc_assert (target);
9810 return target;
9811
9812 case VEC_SERIES_EXPR:
9813 expand_operands (treeop0, treeop1, NULL_RTX, &op0, &op1, modifier);
9814 return expand_vec_series_expr (mode, op0, op1, target);
9815
9816 case BIT_INSERT_EXPR:
9817 {
9818 unsigned bitpos = tree_to_uhwi (treeop2);
9819 unsigned bitsize;
9820 if (INTEGRAL_TYPE_P (TREE_TYPE (treeop1)))
9821 bitsize = TYPE_PRECISION (TREE_TYPE (treeop1));
9822 else
9823 bitsize = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (treeop1)));
9824 op0 = expand_normal (treeop0);
9825 op1 = expand_normal (treeop1);
9826 rtx dst = gen_reg_rtx (mode);
9827 emit_move_insn (dst, op0);
9828 store_bit_field (dst, bitsize, bitpos, 0, 0,
9829 TYPE_MODE (TREE_TYPE (treeop1)), op1, false);
9830 return dst;
9831 }
9832
9833 default:
9834 gcc_unreachable ();
9835 }
9836
9837 /* Here to do an ordinary binary operator. */
9838 binop:
9839 expand_operands (treeop0, treeop1,
9840 subtarget, &op0, &op1, EXPAND_NORMAL);
9841 binop2:
9842 this_optab = optab_for_tree_code (code, type, optab_default);
9843 binop3:
9844 if (modifier == EXPAND_STACK_PARM)
9845 target = 0;
9846 temp = expand_binop (mode, this_optab, op0, op1, target,
9847 unsignedp, OPTAB_LIB_WIDEN);
9848 gcc_assert (temp);
9849 /* Bitwise operations do not need bitfield reduction as we expect their
9850 operands being properly truncated. */
9851 if (code == BIT_XOR_EXPR
9852 || code == BIT_AND_EXPR
9853 || code == BIT_IOR_EXPR)
9854 return temp;
9855 return REDUCE_BIT_FIELD (temp);
9856 }
9857 #undef REDUCE_BIT_FIELD
9858
9859
9860 /* Return TRUE if expression STMT is suitable for replacement.
9861 Never consider memory loads as replaceable, because those don't ever lead
9862 into constant expressions. */
9863
9864 static bool
9865 stmt_is_replaceable_p (gimple *stmt)
9866 {
9867 if (ssa_is_replaceable_p (stmt))
9868 {
9869 /* Don't move around loads. */
9870 if (!gimple_assign_single_p (stmt)
9871 || is_gimple_val (gimple_assign_rhs1 (stmt)))
9872 return true;
9873 }
9874 return false;
9875 }
9876
9877 rtx
9878 expand_expr_real_1 (tree exp, rtx target, machine_mode tmode,
9879 enum expand_modifier modifier, rtx *alt_rtl,
9880 bool inner_reference_p)
9881 {
9882 rtx op0, op1, temp, decl_rtl;
9883 tree type;
9884 int unsignedp;
9885 machine_mode mode, dmode;
9886 enum tree_code code = TREE_CODE (exp);
9887 rtx subtarget, original_target;
9888 int ignore;
9889 tree context;
9890 bool reduce_bit_field;
9891 location_t loc = EXPR_LOCATION (exp);
9892 struct separate_ops ops;
9893 tree treeop0, treeop1, treeop2;
9894 tree ssa_name = NULL_TREE;
9895 gimple *g;
9896
9897 type = TREE_TYPE (exp);
9898 mode = TYPE_MODE (type);
9899 unsignedp = TYPE_UNSIGNED (type);
9900
9901 treeop0 = treeop1 = treeop2 = NULL_TREE;
9902 if (!VL_EXP_CLASS_P (exp))
9903 switch (TREE_CODE_LENGTH (code))
9904 {
9905 default:
9906 case 3: treeop2 = TREE_OPERAND (exp, 2); /* FALLTHRU */
9907 case 2: treeop1 = TREE_OPERAND (exp, 1); /* FALLTHRU */
9908 case 1: treeop0 = TREE_OPERAND (exp, 0); /* FALLTHRU */
9909 case 0: break;
9910 }
9911 ops.code = code;
9912 ops.type = type;
9913 ops.op0 = treeop0;
9914 ops.op1 = treeop1;
9915 ops.op2 = treeop2;
9916 ops.location = loc;
9917
9918 ignore = (target == const0_rtx
9919 || ((CONVERT_EXPR_CODE_P (code)
9920 || code == COND_EXPR || code == VIEW_CONVERT_EXPR)
9921 && TREE_CODE (type) == VOID_TYPE));
9922
9923 /* An operation in what may be a bit-field type needs the
9924 result to be reduced to the precision of the bit-field type,
9925 which is narrower than that of the type's mode. */
9926 reduce_bit_field = (!ignore
9927 && INTEGRAL_TYPE_P (type)
9928 && !type_has_mode_precision_p (type));
9929
9930 /* If we are going to ignore this result, we need only do something
9931 if there is a side-effect somewhere in the expression. If there
9932 is, short-circuit the most common cases here. Note that we must
9933 not call expand_expr with anything but const0_rtx in case this
9934 is an initial expansion of a size that contains a PLACEHOLDER_EXPR. */
9935
9936 if (ignore)
9937 {
9938 if (! TREE_SIDE_EFFECTS (exp))
9939 return const0_rtx;
9940
9941 /* Ensure we reference a volatile object even if value is ignored, but
9942 don't do this if all we are doing is taking its address. */
9943 if (TREE_THIS_VOLATILE (exp)
9944 && TREE_CODE (exp) != FUNCTION_DECL
9945 && mode != VOIDmode && mode != BLKmode
9946 && modifier != EXPAND_CONST_ADDRESS)
9947 {
9948 temp = expand_expr (exp, NULL_RTX, VOIDmode, modifier);
9949 if (MEM_P (temp))
9950 copy_to_reg (temp);
9951 return const0_rtx;
9952 }
9953
9954 if (TREE_CODE_CLASS (code) == tcc_unary
9955 || code == BIT_FIELD_REF
9956 || code == COMPONENT_REF
9957 || code == INDIRECT_REF)
9958 return expand_expr (treeop0, const0_rtx, VOIDmode,
9959 modifier);
9960
9961 else if (TREE_CODE_CLASS (code) == tcc_binary
9962 || TREE_CODE_CLASS (code) == tcc_comparison
9963 || code == ARRAY_REF || code == ARRAY_RANGE_REF)
9964 {
9965 expand_expr (treeop0, const0_rtx, VOIDmode, modifier);
9966 expand_expr (treeop1, const0_rtx, VOIDmode, modifier);
9967 return const0_rtx;
9968 }
9969
9970 target = 0;
9971 }
9972
9973 if (reduce_bit_field && modifier == EXPAND_STACK_PARM)
9974 target = 0;
9975
9976 /* Use subtarget as the target for operand 0 of a binary operation. */
9977 subtarget = get_subtarget (target);
9978 original_target = target;
9979
9980 switch (code)
9981 {
9982 case LABEL_DECL:
9983 {
9984 tree function = decl_function_context (exp);
9985
9986 temp = label_rtx (exp);
9987 temp = gen_rtx_LABEL_REF (Pmode, temp);
9988
9989 if (function != current_function_decl
9990 && function != 0)
9991 LABEL_REF_NONLOCAL_P (temp) = 1;
9992
9993 temp = gen_rtx_MEM (FUNCTION_MODE, temp);
9994 return temp;
9995 }
9996
9997 case SSA_NAME:
9998 /* ??? ivopts calls expander, without any preparation from
9999 out-of-ssa. So fake instructions as if this was an access to the
10000 base variable. This unnecessarily allocates a pseudo, see how we can
10001 reuse it, if partition base vars have it set already. */
10002 if (!currently_expanding_to_rtl)
10003 {
10004 tree var = SSA_NAME_VAR (exp);
10005 if (var && DECL_RTL_SET_P (var))
10006 return DECL_RTL (var);
10007 return gen_raw_REG (TYPE_MODE (TREE_TYPE (exp)),
10008 LAST_VIRTUAL_REGISTER + 1);
10009 }
10010
10011 g = get_gimple_for_ssa_name (exp);
10012 /* For EXPAND_INITIALIZER try harder to get something simpler. */
10013 if (g == NULL
10014 && modifier == EXPAND_INITIALIZER
10015 && !SSA_NAME_IS_DEFAULT_DEF (exp)
10016 && (optimize || !SSA_NAME_VAR (exp)
10017 || DECL_IGNORED_P (SSA_NAME_VAR (exp)))
10018 && stmt_is_replaceable_p (SSA_NAME_DEF_STMT (exp)))
10019 g = SSA_NAME_DEF_STMT (exp);
10020 if (g)
10021 {
10022 rtx r;
10023 location_t saved_loc = curr_insn_location ();
10024 loc = gimple_location (g);
10025 if (loc != UNKNOWN_LOCATION)
10026 set_curr_insn_location (loc);
10027 ops.code = gimple_assign_rhs_code (g);
10028 switch (get_gimple_rhs_class (ops.code))
10029 {
10030 case GIMPLE_TERNARY_RHS:
10031 ops.op2 = gimple_assign_rhs3 (g);
10032 /* Fallthru */
10033 case GIMPLE_BINARY_RHS:
10034 ops.op1 = gimple_assign_rhs2 (g);
10035
10036 /* Try to expand conditonal compare. */
10037 if (targetm.gen_ccmp_first)
10038 {
10039 gcc_checking_assert (targetm.gen_ccmp_next != NULL);
10040 r = expand_ccmp_expr (g, mode);
10041 if (r)
10042 break;
10043 }
10044 /* Fallthru */
10045 case GIMPLE_UNARY_RHS:
10046 ops.op0 = gimple_assign_rhs1 (g);
10047 ops.type = TREE_TYPE (gimple_assign_lhs (g));
10048 ops.location = loc;
10049 r = expand_expr_real_2 (&ops, target, tmode, modifier);
10050 break;
10051 case GIMPLE_SINGLE_RHS:
10052 {
10053 r = expand_expr_real (gimple_assign_rhs1 (g), target,
10054 tmode, modifier, alt_rtl,
10055 inner_reference_p);
10056 break;
10057 }
10058 default:
10059 gcc_unreachable ();
10060 }
10061 set_curr_insn_location (saved_loc);
10062 if (REG_P (r) && !REG_EXPR (r))
10063 set_reg_attrs_for_decl_rtl (SSA_NAME_VAR (exp), r);
10064 return r;
10065 }
10066
10067 ssa_name = exp;
10068 decl_rtl = get_rtx_for_ssa_name (ssa_name);
10069 exp = SSA_NAME_VAR (ssa_name);
10070 goto expand_decl_rtl;
10071
10072 case PARM_DECL:
10073 case VAR_DECL:
10074 /* If a static var's type was incomplete when the decl was written,
10075 but the type is complete now, lay out the decl now. */
10076 if (DECL_SIZE (exp) == 0
10077 && COMPLETE_OR_UNBOUND_ARRAY_TYPE_P (TREE_TYPE (exp))
10078 && (TREE_STATIC (exp) || DECL_EXTERNAL (exp)))
10079 layout_decl (exp, 0);
10080
10081 /* fall through */
10082
10083 case FUNCTION_DECL:
10084 case RESULT_DECL:
10085 decl_rtl = DECL_RTL (exp);
10086 expand_decl_rtl:
10087 gcc_assert (decl_rtl);
10088
10089 /* DECL_MODE might change when TYPE_MODE depends on attribute target
10090 settings for VECTOR_TYPE_P that might switch for the function. */
10091 if (currently_expanding_to_rtl
10092 && code == VAR_DECL && MEM_P (decl_rtl)
10093 && VECTOR_TYPE_P (type) && exp && DECL_MODE (exp) != mode)
10094 decl_rtl = change_address (decl_rtl, TYPE_MODE (type), 0);
10095 else
10096 decl_rtl = copy_rtx (decl_rtl);
10097
10098 /* Record writes to register variables. */
10099 if (modifier == EXPAND_WRITE
10100 && REG_P (decl_rtl)
10101 && HARD_REGISTER_P (decl_rtl))
10102 add_to_hard_reg_set (&crtl->asm_clobbers,
10103 GET_MODE (decl_rtl), REGNO (decl_rtl));
10104
10105 /* Ensure variable marked as used even if it doesn't go through
10106 a parser. If it hasn't be used yet, write out an external
10107 definition. */
10108 if (exp)
10109 TREE_USED (exp) = 1;
10110
10111 /* Show we haven't gotten RTL for this yet. */
10112 temp = 0;
10113
10114 /* Variables inherited from containing functions should have
10115 been lowered by this point. */
10116 if (exp)
10117 context = decl_function_context (exp);
10118 gcc_assert (!exp
10119 || SCOPE_FILE_SCOPE_P (context)
10120 || context == current_function_decl
10121 || TREE_STATIC (exp)
10122 || DECL_EXTERNAL (exp)
10123 /* ??? C++ creates functions that are not TREE_STATIC. */
10124 || TREE_CODE (exp) == FUNCTION_DECL);
10125
10126 /* This is the case of an array whose size is to be determined
10127 from its initializer, while the initializer is still being parsed.
10128 ??? We aren't parsing while expanding anymore. */
10129
10130 if (MEM_P (decl_rtl) && REG_P (XEXP (decl_rtl, 0)))
10131 temp = validize_mem (decl_rtl);
10132
10133 /* If DECL_RTL is memory, we are in the normal case and the
10134 address is not valid, get the address into a register. */
10135
10136 else if (MEM_P (decl_rtl) && modifier != EXPAND_INITIALIZER)
10137 {
10138 if (alt_rtl)
10139 *alt_rtl = decl_rtl;
10140 decl_rtl = use_anchored_address (decl_rtl);
10141 if (modifier != EXPAND_CONST_ADDRESS
10142 && modifier != EXPAND_SUM
10143 && !memory_address_addr_space_p (exp ? DECL_MODE (exp)
10144 : GET_MODE (decl_rtl),
10145 XEXP (decl_rtl, 0),
10146 MEM_ADDR_SPACE (decl_rtl)))
10147 temp = replace_equiv_address (decl_rtl,
10148 copy_rtx (XEXP (decl_rtl, 0)));
10149 }
10150
10151 /* If we got something, return it. But first, set the alignment
10152 if the address is a register. */
10153 if (temp != 0)
10154 {
10155 if (exp && MEM_P (temp) && REG_P (XEXP (temp, 0)))
10156 mark_reg_pointer (XEXP (temp, 0), DECL_ALIGN (exp));
10157 }
10158 else if (MEM_P (decl_rtl))
10159 temp = decl_rtl;
10160
10161 if (temp != 0)
10162 {
10163 if (MEM_P (temp)
10164 && modifier != EXPAND_WRITE
10165 && modifier != EXPAND_MEMORY
10166 && modifier != EXPAND_INITIALIZER
10167 && modifier != EXPAND_CONST_ADDRESS
10168 && modifier != EXPAND_SUM
10169 && !inner_reference_p
10170 && mode != BLKmode
10171 && MEM_ALIGN (temp) < GET_MODE_ALIGNMENT (mode))
10172 temp = expand_misaligned_mem_ref (temp, mode, unsignedp,
10173 MEM_ALIGN (temp), NULL_RTX, NULL);
10174
10175 return temp;
10176 }
10177
10178 if (exp)
10179 dmode = DECL_MODE (exp);
10180 else
10181 dmode = TYPE_MODE (TREE_TYPE (ssa_name));
10182
10183 /* If the mode of DECL_RTL does not match that of the decl,
10184 there are two cases: we are dealing with a BLKmode value
10185 that is returned in a register, or we are dealing with
10186 a promoted value. In the latter case, return a SUBREG
10187 of the wanted mode, but mark it so that we know that it
10188 was already extended. */
10189 if (REG_P (decl_rtl)
10190 && dmode != BLKmode
10191 && GET_MODE (decl_rtl) != dmode)
10192 {
10193 machine_mode pmode;
10194
10195 /* Get the signedness to be used for this variable. Ensure we get
10196 the same mode we got when the variable was declared. */
10197 if (code != SSA_NAME)
10198 pmode = promote_decl_mode (exp, &unsignedp);
10199 else if ((g = SSA_NAME_DEF_STMT (ssa_name))
10200 && gimple_code (g) == GIMPLE_CALL
10201 && !gimple_call_internal_p (g))
10202 pmode = promote_function_mode (type, mode, &unsignedp,
10203 gimple_call_fntype (g),
10204 2);
10205 else
10206 pmode = promote_ssa_mode (ssa_name, &unsignedp);
10207 gcc_assert (GET_MODE (decl_rtl) == pmode);
10208
10209 temp = gen_lowpart_SUBREG (mode, decl_rtl);
10210 SUBREG_PROMOTED_VAR_P (temp) = 1;
10211 SUBREG_PROMOTED_SET (temp, unsignedp);
10212 return temp;
10213 }
10214
10215 return decl_rtl;
10216
10217 case INTEGER_CST:
10218 {
10219 /* Given that TYPE_PRECISION (type) is not always equal to
10220 GET_MODE_PRECISION (TYPE_MODE (type)), we need to extend from
10221 the former to the latter according to the signedness of the
10222 type. */
10223 scalar_int_mode int_mode = SCALAR_INT_TYPE_MODE (type);
10224 temp = immed_wide_int_const
10225 (wi::to_wide (exp, GET_MODE_PRECISION (int_mode)), int_mode);
10226 return temp;
10227 }
10228
10229 case VECTOR_CST:
10230 {
10231 tree tmp = NULL_TREE;
10232 if (VECTOR_MODE_P (mode))
10233 return const_vector_from_tree (exp);
10234 scalar_int_mode int_mode;
10235 if (is_int_mode (mode, &int_mode))
10236 {
10237 if (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (exp)))
10238 return const_scalar_mask_from_tree (int_mode, exp);
10239 else
10240 {
10241 tree type_for_mode
10242 = lang_hooks.types.type_for_mode (int_mode, 1);
10243 if (type_for_mode)
10244 tmp = fold_unary_loc (loc, VIEW_CONVERT_EXPR,
10245 type_for_mode, exp);
10246 }
10247 }
10248 if (!tmp)
10249 {
10250 vec<constructor_elt, va_gc> *v;
10251 /* Constructors need to be fixed-length. FIXME. */
10252 unsigned int nunits = VECTOR_CST_NELTS (exp).to_constant ();
10253 vec_alloc (v, nunits);
10254 for (unsigned int i = 0; i < nunits; ++i)
10255 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, VECTOR_CST_ELT (exp, i));
10256 tmp = build_constructor (type, v);
10257 }
10258 return expand_expr (tmp, ignore ? const0_rtx : target,
10259 tmode, modifier);
10260 }
10261
10262 case CONST_DECL:
10263 if (modifier == EXPAND_WRITE)
10264 {
10265 /* Writing into CONST_DECL is always invalid, but handle it
10266 gracefully. */
10267 addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (exp));
10268 scalar_int_mode address_mode = targetm.addr_space.address_mode (as);
10269 op0 = expand_expr_addr_expr_1 (exp, NULL_RTX, address_mode,
10270 EXPAND_NORMAL, as);
10271 op0 = memory_address_addr_space (mode, op0, as);
10272 temp = gen_rtx_MEM (mode, op0);
10273 set_mem_addr_space (temp, as);
10274 return temp;
10275 }
10276 return expand_expr (DECL_INITIAL (exp), target, VOIDmode, modifier);
10277
10278 case REAL_CST:
10279 /* If optimized, generate immediate CONST_DOUBLE
10280 which will be turned into memory by reload if necessary.
10281
10282 We used to force a register so that loop.c could see it. But
10283 this does not allow gen_* patterns to perform optimizations with
10284 the constants. It also produces two insns in cases like "x = 1.0;".
10285 On most machines, floating-point constants are not permitted in
10286 many insns, so we'd end up copying it to a register in any case.
10287
10288 Now, we do the copying in expand_binop, if appropriate. */
10289 return const_double_from_real_value (TREE_REAL_CST (exp),
10290 TYPE_MODE (TREE_TYPE (exp)));
10291
10292 case FIXED_CST:
10293 return CONST_FIXED_FROM_FIXED_VALUE (TREE_FIXED_CST (exp),
10294 TYPE_MODE (TREE_TYPE (exp)));
10295
10296 case COMPLEX_CST:
10297 /* Handle evaluating a complex constant in a CONCAT target. */
10298 if (original_target && GET_CODE (original_target) == CONCAT)
10299 {
10300 rtx rtarg, itarg;
10301
10302 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
10303 rtarg = XEXP (original_target, 0);
10304 itarg = XEXP (original_target, 1);
10305
10306 /* Move the real and imaginary parts separately. */
10307 op0 = expand_expr (TREE_REALPART (exp), rtarg, mode, EXPAND_NORMAL);
10308 op1 = expand_expr (TREE_IMAGPART (exp), itarg, mode, EXPAND_NORMAL);
10309
10310 if (op0 != rtarg)
10311 emit_move_insn (rtarg, op0);
10312 if (op1 != itarg)
10313 emit_move_insn (itarg, op1);
10314
10315 return original_target;
10316 }
10317
10318 /* fall through */
10319
10320 case STRING_CST:
10321 temp = expand_expr_constant (exp, 1, modifier);
10322
10323 /* temp contains a constant address.
10324 On RISC machines where a constant address isn't valid,
10325 make some insns to get that address into a register. */
10326 if (modifier != EXPAND_CONST_ADDRESS
10327 && modifier != EXPAND_INITIALIZER
10328 && modifier != EXPAND_SUM
10329 && ! memory_address_addr_space_p (mode, XEXP (temp, 0),
10330 MEM_ADDR_SPACE (temp)))
10331 return replace_equiv_address (temp,
10332 copy_rtx (XEXP (temp, 0)));
10333 return temp;
10334
10335 case POLY_INT_CST:
10336 return immed_wide_int_const (poly_int_cst_value (exp), mode);
10337
10338 case SAVE_EXPR:
10339 {
10340 tree val = treeop0;
10341 rtx ret = expand_expr_real_1 (val, target, tmode, modifier, alt_rtl,
10342 inner_reference_p);
10343
10344 if (!SAVE_EXPR_RESOLVED_P (exp))
10345 {
10346 /* We can indeed still hit this case, typically via builtin
10347 expanders calling save_expr immediately before expanding
10348 something. Assume this means that we only have to deal
10349 with non-BLKmode values. */
10350 gcc_assert (GET_MODE (ret) != BLKmode);
10351
10352 val = build_decl (curr_insn_location (),
10353 VAR_DECL, NULL, TREE_TYPE (exp));
10354 DECL_ARTIFICIAL (val) = 1;
10355 DECL_IGNORED_P (val) = 1;
10356 treeop0 = val;
10357 TREE_OPERAND (exp, 0) = treeop0;
10358 SAVE_EXPR_RESOLVED_P (exp) = 1;
10359
10360 if (!CONSTANT_P (ret))
10361 ret = copy_to_reg (ret);
10362 SET_DECL_RTL (val, ret);
10363 }
10364
10365 return ret;
10366 }
10367
10368
10369 case CONSTRUCTOR:
10370 /* If we don't need the result, just ensure we evaluate any
10371 subexpressions. */
10372 if (ignore)
10373 {
10374 unsigned HOST_WIDE_INT idx;
10375 tree value;
10376
10377 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
10378 expand_expr (value, const0_rtx, VOIDmode, EXPAND_NORMAL);
10379
10380 return const0_rtx;
10381 }
10382
10383 return expand_constructor (exp, target, modifier, false);
10384
10385 case TARGET_MEM_REF:
10386 {
10387 addr_space_t as
10388 = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0))));
10389 unsigned int align;
10390
10391 op0 = addr_for_mem_ref (exp, as, true);
10392 op0 = memory_address_addr_space (mode, op0, as);
10393 temp = gen_rtx_MEM (mode, op0);
10394 set_mem_attributes (temp, exp, 0);
10395 set_mem_addr_space (temp, as);
10396 align = get_object_alignment (exp);
10397 if (modifier != EXPAND_WRITE
10398 && modifier != EXPAND_MEMORY
10399 && mode != BLKmode
10400 && align < GET_MODE_ALIGNMENT (mode))
10401 temp = expand_misaligned_mem_ref (temp, mode, unsignedp,
10402 align, NULL_RTX, NULL);
10403 return temp;
10404 }
10405
10406 case MEM_REF:
10407 {
10408 const bool reverse = REF_REVERSE_STORAGE_ORDER (exp);
10409 addr_space_t as
10410 = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0))));
10411 machine_mode address_mode;
10412 tree base = TREE_OPERAND (exp, 0);
10413 gimple *def_stmt;
10414 unsigned align;
10415 /* Handle expansion of non-aliased memory with non-BLKmode. That
10416 might end up in a register. */
10417 if (mem_ref_refers_to_non_mem_p (exp))
10418 {
10419 poly_int64 offset = mem_ref_offset (exp).force_shwi ();
10420 base = TREE_OPERAND (base, 0);
10421 poly_uint64 type_size;
10422 if (known_eq (offset, 0)
10423 && !reverse
10424 && poly_int_tree_p (TYPE_SIZE (type), &type_size)
10425 && known_eq (GET_MODE_BITSIZE (DECL_MODE (base)), type_size))
10426 return expand_expr (build1 (VIEW_CONVERT_EXPR, type, base),
10427 target, tmode, modifier);
10428 if (TYPE_MODE (type) == BLKmode)
10429 {
10430 temp = assign_stack_temp (DECL_MODE (base),
10431 GET_MODE_SIZE (DECL_MODE (base)));
10432 store_expr (base, temp, 0, false, false);
10433 temp = adjust_address (temp, BLKmode, offset);
10434 set_mem_size (temp, int_size_in_bytes (type));
10435 return temp;
10436 }
10437 exp = build3 (BIT_FIELD_REF, type, base, TYPE_SIZE (type),
10438 bitsize_int (offset * BITS_PER_UNIT));
10439 REF_REVERSE_STORAGE_ORDER (exp) = reverse;
10440 return expand_expr (exp, target, tmode, modifier);
10441 }
10442 address_mode = targetm.addr_space.address_mode (as);
10443 if ((def_stmt = get_def_for_expr (base, BIT_AND_EXPR)))
10444 {
10445 tree mask = gimple_assign_rhs2 (def_stmt);
10446 base = build2 (BIT_AND_EXPR, TREE_TYPE (base),
10447 gimple_assign_rhs1 (def_stmt), mask);
10448 TREE_OPERAND (exp, 0) = base;
10449 }
10450 align = get_object_alignment (exp);
10451 op0 = expand_expr (base, NULL_RTX, VOIDmode, EXPAND_SUM);
10452 op0 = memory_address_addr_space (mode, op0, as);
10453 if (!integer_zerop (TREE_OPERAND (exp, 1)))
10454 {
10455 rtx off = immed_wide_int_const (mem_ref_offset (exp), address_mode);
10456 op0 = simplify_gen_binary (PLUS, address_mode, op0, off);
10457 op0 = memory_address_addr_space (mode, op0, as);
10458 }
10459 temp = gen_rtx_MEM (mode, op0);
10460 set_mem_attributes (temp, exp, 0);
10461 set_mem_addr_space (temp, as);
10462 if (TREE_THIS_VOLATILE (exp))
10463 MEM_VOLATILE_P (temp) = 1;
10464 if (modifier != EXPAND_WRITE
10465 && modifier != EXPAND_MEMORY
10466 && !inner_reference_p
10467 && mode != BLKmode
10468 && align < GET_MODE_ALIGNMENT (mode))
10469 temp = expand_misaligned_mem_ref (temp, mode, unsignedp, align,
10470 modifier == EXPAND_STACK_PARM
10471 ? NULL_RTX : target, alt_rtl);
10472 if (reverse
10473 && modifier != EXPAND_MEMORY
10474 && modifier != EXPAND_WRITE)
10475 temp = flip_storage_order (mode, temp);
10476 return temp;
10477 }
10478
10479 case ARRAY_REF:
10480
10481 {
10482 tree array = treeop0;
10483 tree index = treeop1;
10484 tree init;
10485
10486 /* Fold an expression like: "foo"[2].
10487 This is not done in fold so it won't happen inside &.
10488 Don't fold if this is for wide characters since it's too
10489 difficult to do correctly and this is a very rare case. */
10490
10491 if (modifier != EXPAND_CONST_ADDRESS
10492 && modifier != EXPAND_INITIALIZER
10493 && modifier != EXPAND_MEMORY)
10494 {
10495 tree t = fold_read_from_constant_string (exp);
10496
10497 if (t)
10498 return expand_expr (t, target, tmode, modifier);
10499 }
10500
10501 /* If this is a constant index into a constant array,
10502 just get the value from the array. Handle both the cases when
10503 we have an explicit constructor and when our operand is a variable
10504 that was declared const. */
10505
10506 if (modifier != EXPAND_CONST_ADDRESS
10507 && modifier != EXPAND_INITIALIZER
10508 && modifier != EXPAND_MEMORY
10509 && TREE_CODE (array) == CONSTRUCTOR
10510 && ! TREE_SIDE_EFFECTS (array)
10511 && TREE_CODE (index) == INTEGER_CST)
10512 {
10513 unsigned HOST_WIDE_INT ix;
10514 tree field, value;
10515
10516 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (array), ix,
10517 field, value)
10518 if (tree_int_cst_equal (field, index))
10519 {
10520 if (!TREE_SIDE_EFFECTS (value))
10521 return expand_expr (fold (value), target, tmode, modifier);
10522 break;
10523 }
10524 }
10525
10526 else if (optimize >= 1
10527 && modifier != EXPAND_CONST_ADDRESS
10528 && modifier != EXPAND_INITIALIZER
10529 && modifier != EXPAND_MEMORY
10530 && TREE_READONLY (array) && ! TREE_SIDE_EFFECTS (array)
10531 && TREE_CODE (index) == INTEGER_CST
10532 && (VAR_P (array) || TREE_CODE (array) == CONST_DECL)
10533 && (init = ctor_for_folding (array)) != error_mark_node)
10534 {
10535 if (init == NULL_TREE)
10536 {
10537 tree value = build_zero_cst (type);
10538 if (TREE_CODE (value) == CONSTRUCTOR)
10539 {
10540 /* If VALUE is a CONSTRUCTOR, this optimization is only
10541 useful if this doesn't store the CONSTRUCTOR into
10542 memory. If it does, it is more efficient to just
10543 load the data from the array directly. */
10544 rtx ret = expand_constructor (value, target,
10545 modifier, true);
10546 if (ret == NULL_RTX)
10547 value = NULL_TREE;
10548 }
10549
10550 if (value)
10551 return expand_expr (value, target, tmode, modifier);
10552 }
10553 else if (TREE_CODE (init) == CONSTRUCTOR)
10554 {
10555 unsigned HOST_WIDE_INT ix;
10556 tree field, value;
10557
10558 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), ix,
10559 field, value)
10560 if (tree_int_cst_equal (field, index))
10561 {
10562 if (TREE_SIDE_EFFECTS (value))
10563 break;
10564
10565 if (TREE_CODE (value) == CONSTRUCTOR)
10566 {
10567 /* If VALUE is a CONSTRUCTOR, this
10568 optimization is only useful if
10569 this doesn't store the CONSTRUCTOR
10570 into memory. If it does, it is more
10571 efficient to just load the data from
10572 the array directly. */
10573 rtx ret = expand_constructor (value, target,
10574 modifier, true);
10575 if (ret == NULL_RTX)
10576 break;
10577 }
10578
10579 return
10580 expand_expr (fold (value), target, tmode, modifier);
10581 }
10582 }
10583 else if (TREE_CODE (init) == STRING_CST)
10584 {
10585 tree low_bound = array_ref_low_bound (exp);
10586 tree index1 = fold_convert_loc (loc, sizetype, treeop1);
10587
10588 /* Optimize the special case of a zero lower bound.
10589
10590 We convert the lower bound to sizetype to avoid problems
10591 with constant folding. E.g. suppose the lower bound is
10592 1 and its mode is QI. Without the conversion
10593 (ARRAY + (INDEX - (unsigned char)1))
10594 becomes
10595 (ARRAY + (-(unsigned char)1) + INDEX)
10596 which becomes
10597 (ARRAY + 255 + INDEX). Oops! */
10598 if (!integer_zerop (low_bound))
10599 index1 = size_diffop_loc (loc, index1,
10600 fold_convert_loc (loc, sizetype,
10601 low_bound));
10602
10603 if (tree_fits_uhwi_p (index1)
10604 && compare_tree_int (index1, TREE_STRING_LENGTH (init)) < 0)
10605 {
10606 tree char_type = TREE_TYPE (TREE_TYPE (init));
10607 scalar_int_mode char_mode;
10608
10609 if (is_int_mode (TYPE_MODE (char_type), &char_mode)
10610 && GET_MODE_SIZE (char_mode) == 1)
10611 return gen_int_mode (TREE_STRING_POINTER (init)
10612 [TREE_INT_CST_LOW (index1)],
10613 char_mode);
10614 }
10615 }
10616 }
10617 }
10618 goto normal_inner_ref;
10619
10620 case COMPONENT_REF:
10621 /* If the operand is a CONSTRUCTOR, we can just extract the
10622 appropriate field if it is present. */
10623 if (TREE_CODE (treeop0) == CONSTRUCTOR)
10624 {
10625 unsigned HOST_WIDE_INT idx;
10626 tree field, value;
10627 scalar_int_mode field_mode;
10628
10629 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (treeop0),
10630 idx, field, value)
10631 if (field == treeop1
10632 /* We can normally use the value of the field in the
10633 CONSTRUCTOR. However, if this is a bitfield in
10634 an integral mode that we can fit in a HOST_WIDE_INT,
10635 we must mask only the number of bits in the bitfield,
10636 since this is done implicitly by the constructor. If
10637 the bitfield does not meet either of those conditions,
10638 we can't do this optimization. */
10639 && (! DECL_BIT_FIELD (field)
10640 || (is_int_mode (DECL_MODE (field), &field_mode)
10641 && (GET_MODE_PRECISION (field_mode)
10642 <= HOST_BITS_PER_WIDE_INT))))
10643 {
10644 if (DECL_BIT_FIELD (field)
10645 && modifier == EXPAND_STACK_PARM)
10646 target = 0;
10647 op0 = expand_expr (value, target, tmode, modifier);
10648 if (DECL_BIT_FIELD (field))
10649 {
10650 HOST_WIDE_INT bitsize = TREE_INT_CST_LOW (DECL_SIZE (field));
10651 scalar_int_mode imode
10652 = SCALAR_INT_TYPE_MODE (TREE_TYPE (field));
10653
10654 if (TYPE_UNSIGNED (TREE_TYPE (field)))
10655 {
10656 op1 = gen_int_mode ((HOST_WIDE_INT_1 << bitsize) - 1,
10657 imode);
10658 op0 = expand_and (imode, op0, op1, target);
10659 }
10660 else
10661 {
10662 int count = GET_MODE_PRECISION (imode) - bitsize;
10663
10664 op0 = expand_shift (LSHIFT_EXPR, imode, op0, count,
10665 target, 0);
10666 op0 = expand_shift (RSHIFT_EXPR, imode, op0, count,
10667 target, 0);
10668 }
10669 }
10670
10671 return op0;
10672 }
10673 }
10674 goto normal_inner_ref;
10675
10676 case BIT_FIELD_REF:
10677 case ARRAY_RANGE_REF:
10678 normal_inner_ref:
10679 {
10680 machine_mode mode1, mode2;
10681 poly_int64 bitsize, bitpos, bytepos;
10682 tree offset;
10683 int reversep, volatilep = 0, must_force_mem;
10684 tree tem
10685 = get_inner_reference (exp, &bitsize, &bitpos, &offset, &mode1,
10686 &unsignedp, &reversep, &volatilep);
10687 rtx orig_op0, memloc;
10688 bool clear_mem_expr = false;
10689
10690 /* If we got back the original object, something is wrong. Perhaps
10691 we are evaluating an expression too early. In any event, don't
10692 infinitely recurse. */
10693 gcc_assert (tem != exp);
10694
10695 /* If TEM's type is a union of variable size, pass TARGET to the inner
10696 computation, since it will need a temporary and TARGET is known
10697 to have to do. This occurs in unchecked conversion in Ada. */
10698 orig_op0 = op0
10699 = expand_expr_real (tem,
10700 (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
10701 && COMPLETE_TYPE_P (TREE_TYPE (tem))
10702 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
10703 != INTEGER_CST)
10704 && modifier != EXPAND_STACK_PARM
10705 ? target : NULL_RTX),
10706 VOIDmode,
10707 modifier == EXPAND_SUM ? EXPAND_NORMAL : modifier,
10708 NULL, true);
10709
10710 /* If the field has a mode, we want to access it in the
10711 field's mode, not the computed mode.
10712 If a MEM has VOIDmode (external with incomplete type),
10713 use BLKmode for it instead. */
10714 if (MEM_P (op0))
10715 {
10716 if (mode1 != VOIDmode)
10717 op0 = adjust_address (op0, mode1, 0);
10718 else if (GET_MODE (op0) == VOIDmode)
10719 op0 = adjust_address (op0, BLKmode, 0);
10720 }
10721
10722 mode2
10723 = CONSTANT_P (op0) ? TYPE_MODE (TREE_TYPE (tem)) : GET_MODE (op0);
10724
10725 /* Make sure bitpos is not negative, it can wreak havoc later. */
10726 if (maybe_lt (bitpos, 0))
10727 {
10728 gcc_checking_assert (offset == NULL_TREE);
10729 offset = size_int (bits_to_bytes_round_down (bitpos));
10730 bitpos = num_trailing_bits (bitpos);
10731 }
10732
10733 /* If we have either an offset, a BLKmode result, or a reference
10734 outside the underlying object, we must force it to memory.
10735 Such a case can occur in Ada if we have unchecked conversion
10736 of an expression from a scalar type to an aggregate type or
10737 for an ARRAY_RANGE_REF whose type is BLKmode, or if we were
10738 passed a partially uninitialized object or a view-conversion
10739 to a larger size. */
10740 must_force_mem = (offset
10741 || mode1 == BLKmode
10742 || (mode == BLKmode
10743 && !int_mode_for_size (bitsize, 1).exists ())
10744 || maybe_gt (bitpos + bitsize,
10745 GET_MODE_BITSIZE (mode2)));
10746
10747 /* Handle CONCAT first. */
10748 if (GET_CODE (op0) == CONCAT && !must_force_mem)
10749 {
10750 if (known_eq (bitpos, 0)
10751 && known_eq (bitsize, GET_MODE_BITSIZE (GET_MODE (op0)))
10752 && COMPLEX_MODE_P (mode1)
10753 && COMPLEX_MODE_P (GET_MODE (op0))
10754 && (GET_MODE_PRECISION (GET_MODE_INNER (mode1))
10755 == GET_MODE_PRECISION (GET_MODE_INNER (GET_MODE (op0)))))
10756 {
10757 if (reversep)
10758 op0 = flip_storage_order (GET_MODE (op0), op0);
10759 if (mode1 != GET_MODE (op0))
10760 {
10761 rtx parts[2];
10762 for (int i = 0; i < 2; i++)
10763 {
10764 rtx op = read_complex_part (op0, i != 0);
10765 if (GET_CODE (op) == SUBREG)
10766 op = force_reg (GET_MODE (op), op);
10767 temp = gen_lowpart_common (GET_MODE_INNER (mode1), op);
10768 if (temp)
10769 op = temp;
10770 else
10771 {
10772 if (!REG_P (op) && !MEM_P (op))
10773 op = force_reg (GET_MODE (op), op);
10774 op = gen_lowpart (GET_MODE_INNER (mode1), op);
10775 }
10776 parts[i] = op;
10777 }
10778 op0 = gen_rtx_CONCAT (mode1, parts[0], parts[1]);
10779 }
10780 return op0;
10781 }
10782 if (known_eq (bitpos, 0)
10783 && known_eq (bitsize,
10784 GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))))
10785 && maybe_ne (bitsize, 0))
10786 {
10787 op0 = XEXP (op0, 0);
10788 mode2 = GET_MODE (op0);
10789 }
10790 else if (known_eq (bitpos,
10791 GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))))
10792 && known_eq (bitsize,
10793 GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 1))))
10794 && maybe_ne (bitpos, 0)
10795 && maybe_ne (bitsize, 0))
10796 {
10797 op0 = XEXP (op0, 1);
10798 bitpos = 0;
10799 mode2 = GET_MODE (op0);
10800 }
10801 else
10802 /* Otherwise force into memory. */
10803 must_force_mem = 1;
10804 }
10805
10806 /* If this is a constant, put it in a register if it is a legitimate
10807 constant and we don't need a memory reference. */
10808 if (CONSTANT_P (op0)
10809 && mode2 != BLKmode
10810 && targetm.legitimate_constant_p (mode2, op0)
10811 && !must_force_mem)
10812 op0 = force_reg (mode2, op0);
10813
10814 /* Otherwise, if this is a constant, try to force it to the constant
10815 pool. Note that back-ends, e.g. MIPS, may refuse to do so if it
10816 is a legitimate constant. */
10817 else if (CONSTANT_P (op0) && (memloc = force_const_mem (mode2, op0)))
10818 op0 = validize_mem (memloc);
10819
10820 /* Otherwise, if this is a constant or the object is not in memory
10821 and need be, put it there. */
10822 else if (CONSTANT_P (op0) || (!MEM_P (op0) && must_force_mem))
10823 {
10824 memloc = assign_temp (TREE_TYPE (tem), 1, 1);
10825 emit_move_insn (memloc, op0);
10826 op0 = memloc;
10827 clear_mem_expr = true;
10828 }
10829
10830 if (offset)
10831 {
10832 machine_mode address_mode;
10833 rtx offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode,
10834 EXPAND_SUM);
10835
10836 gcc_assert (MEM_P (op0));
10837
10838 address_mode = get_address_mode (op0);
10839 if (GET_MODE (offset_rtx) != address_mode)
10840 {
10841 /* We cannot be sure that the RTL in offset_rtx is valid outside
10842 of a memory address context, so force it into a register
10843 before attempting to convert it to the desired mode. */
10844 offset_rtx = force_operand (offset_rtx, NULL_RTX);
10845 offset_rtx = convert_to_mode (address_mode, offset_rtx, 0);
10846 }
10847
10848 /* See the comment in expand_assignment for the rationale. */
10849 if (mode1 != VOIDmode
10850 && maybe_ne (bitpos, 0)
10851 && maybe_gt (bitsize, 0)
10852 && multiple_p (bitpos, BITS_PER_UNIT, &bytepos)
10853 && multiple_p (bitpos, bitsize)
10854 && multiple_p (bitsize, GET_MODE_ALIGNMENT (mode1))
10855 && MEM_ALIGN (op0) >= GET_MODE_ALIGNMENT (mode1))
10856 {
10857 op0 = adjust_address (op0, mode1, bytepos);
10858 bitpos = 0;
10859 }
10860
10861 op0 = offset_address (op0, offset_rtx,
10862 highest_pow2_factor (offset));
10863 }
10864
10865 /* If OFFSET is making OP0 more aligned than BIGGEST_ALIGNMENT,
10866 record its alignment as BIGGEST_ALIGNMENT. */
10867 if (MEM_P (op0)
10868 && known_eq (bitpos, 0)
10869 && offset != 0
10870 && is_aligning_offset (offset, tem))
10871 set_mem_align (op0, BIGGEST_ALIGNMENT);
10872
10873 /* Don't forget about volatility even if this is a bitfield. */
10874 if (MEM_P (op0) && volatilep && ! MEM_VOLATILE_P (op0))
10875 {
10876 if (op0 == orig_op0)
10877 op0 = copy_rtx (op0);
10878
10879 MEM_VOLATILE_P (op0) = 1;
10880 }
10881
10882 if (MEM_P (op0) && TREE_CODE (tem) == FUNCTION_DECL)
10883 {
10884 if (op0 == orig_op0)
10885 op0 = copy_rtx (op0);
10886
10887 set_mem_align (op0, BITS_PER_UNIT);
10888 }
10889
10890 /* In cases where an aligned union has an unaligned object
10891 as a field, we might be extracting a BLKmode value from
10892 an integer-mode (e.g., SImode) object. Handle this case
10893 by doing the extract into an object as wide as the field
10894 (which we know to be the width of a basic mode), then
10895 storing into memory, and changing the mode to BLKmode. */
10896 if (mode1 == VOIDmode
10897 || REG_P (op0) || GET_CODE (op0) == SUBREG
10898 || (mode1 != BLKmode && ! direct_load[(int) mode1]
10899 && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
10900 && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT
10901 && modifier != EXPAND_CONST_ADDRESS
10902 && modifier != EXPAND_INITIALIZER
10903 && modifier != EXPAND_MEMORY)
10904 /* If the bitfield is volatile and the bitsize
10905 is narrower than the access size of the bitfield,
10906 we need to extract bitfields from the access. */
10907 || (volatilep && TREE_CODE (exp) == COMPONENT_REF
10908 && DECL_BIT_FIELD_TYPE (TREE_OPERAND (exp, 1))
10909 && mode1 != BLKmode
10910 && maybe_lt (bitsize, GET_MODE_SIZE (mode1) * BITS_PER_UNIT))
10911 /* If the field isn't aligned enough to fetch as a memref,
10912 fetch it as a bit field. */
10913 || (mode1 != BLKmode
10914 && (((MEM_P (op0)
10915 ? MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode1)
10916 || !multiple_p (bitpos, GET_MODE_ALIGNMENT (mode1))
10917 : TYPE_ALIGN (TREE_TYPE (tem)) < GET_MODE_ALIGNMENT (mode)
10918 || !multiple_p (bitpos, GET_MODE_ALIGNMENT (mode)))
10919 && modifier != EXPAND_MEMORY
10920 && ((modifier == EXPAND_CONST_ADDRESS
10921 || modifier == EXPAND_INITIALIZER)
10922 ? STRICT_ALIGNMENT
10923 : targetm.slow_unaligned_access (mode1,
10924 MEM_ALIGN (op0))))
10925 || !multiple_p (bitpos, BITS_PER_UNIT)))
10926 /* If the type and the field are a constant size and the
10927 size of the type isn't the same size as the bitfield,
10928 we must use bitfield operations. */
10929 || (known_size_p (bitsize)
10930 && TYPE_SIZE (TREE_TYPE (exp))
10931 && poly_int_tree_p (TYPE_SIZE (TREE_TYPE (exp)))
10932 && maybe_ne (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (exp))),
10933 bitsize)))
10934 {
10935 machine_mode ext_mode = mode;
10936
10937 if (ext_mode == BLKmode
10938 && ! (target != 0 && MEM_P (op0)
10939 && MEM_P (target)
10940 && multiple_p (bitpos, BITS_PER_UNIT)))
10941 ext_mode = int_mode_for_size (bitsize, 1).else_blk ();
10942
10943 if (ext_mode == BLKmode)
10944 {
10945 if (target == 0)
10946 target = assign_temp (type, 1, 1);
10947
10948 /* ??? Unlike the similar test a few lines below, this one is
10949 very likely obsolete. */
10950 if (known_eq (bitsize, 0))
10951 return target;
10952
10953 /* In this case, BITPOS must start at a byte boundary and
10954 TARGET, if specified, must be a MEM. */
10955 gcc_assert (MEM_P (op0)
10956 && (!target || MEM_P (target)));
10957
10958 bytepos = exact_div (bitpos, BITS_PER_UNIT);
10959 poly_int64 bytesize = bits_to_bytes_round_up (bitsize);
10960 emit_block_move (target,
10961 adjust_address (op0, VOIDmode, bytepos),
10962 gen_int_mode (bytesize, Pmode),
10963 (modifier == EXPAND_STACK_PARM
10964 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
10965
10966 return target;
10967 }
10968
10969 /* If we have nothing to extract, the result will be 0 for targets
10970 with SHIFT_COUNT_TRUNCATED == 0 and garbage otherwise. Always
10971 return 0 for the sake of consistency, as reading a zero-sized
10972 bitfield is valid in Ada and the value is fully specified. */
10973 if (known_eq (bitsize, 0))
10974 return const0_rtx;
10975
10976 op0 = validize_mem (op0);
10977
10978 if (MEM_P (op0) && REG_P (XEXP (op0, 0)))
10979 mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
10980
10981 /* If the result has aggregate type and the extraction is done in
10982 an integral mode, then the field may be not aligned on a byte
10983 boundary; in this case, if it has reverse storage order, it
10984 needs to be extracted as a scalar field with reverse storage
10985 order and put back into memory order afterwards. */
10986 if (AGGREGATE_TYPE_P (type)
10987 && GET_MODE_CLASS (ext_mode) == MODE_INT)
10988 reversep = TYPE_REVERSE_STORAGE_ORDER (type);
10989
10990 gcc_checking_assert (known_ge (bitpos, 0));
10991 op0 = extract_bit_field (op0, bitsize, bitpos, unsignedp,
10992 (modifier == EXPAND_STACK_PARM
10993 ? NULL_RTX : target),
10994 ext_mode, ext_mode, reversep, alt_rtl);
10995
10996 /* If the result has aggregate type and the mode of OP0 is an
10997 integral mode then, if BITSIZE is narrower than this mode
10998 and this is for big-endian data, we must put the field
10999 into the high-order bits. And we must also put it back
11000 into memory order if it has been previously reversed. */
11001 scalar_int_mode op0_mode;
11002 if (AGGREGATE_TYPE_P (type)
11003 && is_int_mode (GET_MODE (op0), &op0_mode))
11004 {
11005 HOST_WIDE_INT size = GET_MODE_BITSIZE (op0_mode);
11006
11007 gcc_checking_assert (known_le (bitsize, size));
11008 if (maybe_lt (bitsize, size)
11009 && reversep ? !BYTES_BIG_ENDIAN : BYTES_BIG_ENDIAN)
11010 op0 = expand_shift (LSHIFT_EXPR, op0_mode, op0,
11011 size - bitsize, op0, 1);
11012
11013 if (reversep)
11014 op0 = flip_storage_order (op0_mode, op0);
11015 }
11016
11017 /* If the result type is BLKmode, store the data into a temporary
11018 of the appropriate type, but with the mode corresponding to the
11019 mode for the data we have (op0's mode). */
11020 if (mode == BLKmode)
11021 {
11022 rtx new_rtx
11023 = assign_stack_temp_for_type (ext_mode,
11024 GET_MODE_BITSIZE (ext_mode),
11025 type);
11026 emit_move_insn (new_rtx, op0);
11027 op0 = copy_rtx (new_rtx);
11028 PUT_MODE (op0, BLKmode);
11029 }
11030
11031 return op0;
11032 }
11033
11034 /* If the result is BLKmode, use that to access the object
11035 now as well. */
11036 if (mode == BLKmode)
11037 mode1 = BLKmode;
11038
11039 /* Get a reference to just this component. */
11040 bytepos = bits_to_bytes_round_down (bitpos);
11041 if (modifier == EXPAND_CONST_ADDRESS
11042 || modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
11043 op0 = adjust_address_nv (op0, mode1, bytepos);
11044 else
11045 op0 = adjust_address (op0, mode1, bytepos);
11046
11047 if (op0 == orig_op0)
11048 op0 = copy_rtx (op0);
11049
11050 /* Don't set memory attributes if the base expression is
11051 SSA_NAME that got expanded as a MEM or a CONSTANT. In that case,
11052 we should just honor its original memory attributes. */
11053 if (!(TREE_CODE (tem) == SSA_NAME
11054 && (MEM_P (orig_op0) || CONSTANT_P (orig_op0))))
11055 set_mem_attributes (op0, exp, 0);
11056
11057 if (REG_P (XEXP (op0, 0)))
11058 mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
11059
11060 /* If op0 is a temporary because the original expressions was forced
11061 to memory, clear MEM_EXPR so that the original expression cannot
11062 be marked as addressable through MEM_EXPR of the temporary. */
11063 if (clear_mem_expr)
11064 set_mem_expr (op0, NULL_TREE);
11065
11066 MEM_VOLATILE_P (op0) |= volatilep;
11067
11068 if (reversep
11069 && modifier != EXPAND_MEMORY
11070 && modifier != EXPAND_WRITE)
11071 op0 = flip_storage_order (mode1, op0);
11072
11073 if (mode == mode1 || mode1 == BLKmode || mode1 == tmode
11074 || modifier == EXPAND_CONST_ADDRESS
11075 || modifier == EXPAND_INITIALIZER)
11076 return op0;
11077
11078 if (target == 0)
11079 target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
11080
11081 convert_move (target, op0, unsignedp);
11082 return target;
11083 }
11084
11085 case OBJ_TYPE_REF:
11086 return expand_expr (OBJ_TYPE_REF_EXPR (exp), target, tmode, modifier);
11087
11088 case CALL_EXPR:
11089 /* All valid uses of __builtin_va_arg_pack () are removed during
11090 inlining. */
11091 if (CALL_EXPR_VA_ARG_PACK (exp))
11092 error ("%Kinvalid use of %<__builtin_va_arg_pack ()%>", exp);
11093 {
11094 tree fndecl = get_callee_fndecl (exp), attr;
11095
11096 if (fndecl
11097 /* Don't diagnose the error attribute in thunks, those are
11098 artificially created. */
11099 && !CALL_FROM_THUNK_P (exp)
11100 && (attr = lookup_attribute ("error",
11101 DECL_ATTRIBUTES (fndecl))) != NULL)
11102 {
11103 const char *ident = lang_hooks.decl_printable_name (fndecl, 1);
11104 error ("%Kcall to %qs declared with attribute error: %s", exp,
11105 identifier_to_locale (ident),
11106 TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr))));
11107 }
11108 if (fndecl
11109 /* Don't diagnose the warning attribute in thunks, those are
11110 artificially created. */
11111 && !CALL_FROM_THUNK_P (exp)
11112 && (attr = lookup_attribute ("warning",
11113 DECL_ATTRIBUTES (fndecl))) != NULL)
11114 {
11115 const char *ident = lang_hooks.decl_printable_name (fndecl, 1);
11116 warning_at (tree_nonartificial_location (exp),
11117 OPT_Wattribute_warning,
11118 "%Kcall to %qs declared with attribute warning: %s",
11119 exp, identifier_to_locale (ident),
11120 TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr))));
11121 }
11122
11123 /* Check for a built-in function. */
11124 if (fndecl && fndecl_built_in_p (fndecl))
11125 {
11126 gcc_assert (DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_FRONTEND);
11127 return expand_builtin (exp, target, subtarget, tmode, ignore);
11128 }
11129 }
11130 return expand_call (exp, target, ignore);
11131
11132 case VIEW_CONVERT_EXPR:
11133 op0 = NULL_RTX;
11134
11135 /* If we are converting to BLKmode, try to avoid an intermediate
11136 temporary by fetching an inner memory reference. */
11137 if (mode == BLKmode
11138 && poly_int_tree_p (TYPE_SIZE (type))
11139 && TYPE_MODE (TREE_TYPE (treeop0)) != BLKmode
11140 && handled_component_p (treeop0))
11141 {
11142 machine_mode mode1;
11143 poly_int64 bitsize, bitpos, bytepos;
11144 tree offset;
11145 int reversep, volatilep = 0;
11146 tree tem
11147 = get_inner_reference (treeop0, &bitsize, &bitpos, &offset, &mode1,
11148 &unsignedp, &reversep, &volatilep);
11149
11150 /* ??? We should work harder and deal with non-zero offsets. */
11151 if (!offset
11152 && multiple_p (bitpos, BITS_PER_UNIT, &bytepos)
11153 && !reversep
11154 && known_size_p (bitsize)
11155 && known_eq (wi::to_poly_offset (TYPE_SIZE (type)), bitsize))
11156 {
11157 /* See the normal_inner_ref case for the rationale. */
11158 rtx orig_op0
11159 = expand_expr_real (tem,
11160 (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
11161 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
11162 != INTEGER_CST)
11163 && modifier != EXPAND_STACK_PARM
11164 ? target : NULL_RTX),
11165 VOIDmode,
11166 modifier == EXPAND_SUM ? EXPAND_NORMAL : modifier,
11167 NULL, true);
11168
11169 if (MEM_P (orig_op0))
11170 {
11171 op0 = orig_op0;
11172
11173 /* Get a reference to just this component. */
11174 if (modifier == EXPAND_CONST_ADDRESS
11175 || modifier == EXPAND_SUM
11176 || modifier == EXPAND_INITIALIZER)
11177 op0 = adjust_address_nv (op0, mode, bytepos);
11178 else
11179 op0 = adjust_address (op0, mode, bytepos);
11180
11181 if (op0 == orig_op0)
11182 op0 = copy_rtx (op0);
11183
11184 set_mem_attributes (op0, treeop0, 0);
11185 if (REG_P (XEXP (op0, 0)))
11186 mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
11187
11188 MEM_VOLATILE_P (op0) |= volatilep;
11189 }
11190 }
11191 }
11192
11193 if (!op0)
11194 op0 = expand_expr_real (treeop0, NULL_RTX, VOIDmode, modifier,
11195 NULL, inner_reference_p);
11196
11197 /* If the input and output modes are both the same, we are done. */
11198 if (mode == GET_MODE (op0))
11199 ;
11200 /* If neither mode is BLKmode, and both modes are the same size
11201 then we can use gen_lowpart. */
11202 else if (mode != BLKmode
11203 && GET_MODE (op0) != BLKmode
11204 && known_eq (GET_MODE_PRECISION (mode),
11205 GET_MODE_PRECISION (GET_MODE (op0)))
11206 && !COMPLEX_MODE_P (GET_MODE (op0)))
11207 {
11208 if (GET_CODE (op0) == SUBREG)
11209 op0 = force_reg (GET_MODE (op0), op0);
11210 temp = gen_lowpart_common (mode, op0);
11211 if (temp)
11212 op0 = temp;
11213 else
11214 {
11215 if (!REG_P (op0) && !MEM_P (op0))
11216 op0 = force_reg (GET_MODE (op0), op0);
11217 op0 = gen_lowpart (mode, op0);
11218 }
11219 }
11220 /* If both types are integral, convert from one mode to the other. */
11221 else if (INTEGRAL_TYPE_P (type) && INTEGRAL_TYPE_P (TREE_TYPE (treeop0)))
11222 op0 = convert_modes (mode, GET_MODE (op0), op0,
11223 TYPE_UNSIGNED (TREE_TYPE (treeop0)));
11224 /* If the output type is a bit-field type, do an extraction. */
11225 else if (reduce_bit_field)
11226 return extract_bit_field (op0, TYPE_PRECISION (type), 0,
11227 TYPE_UNSIGNED (type), NULL_RTX,
11228 mode, mode, false, NULL);
11229 /* As a last resort, spill op0 to memory, and reload it in a
11230 different mode. */
11231 else if (!MEM_P (op0))
11232 {
11233 /* If the operand is not a MEM, force it into memory. Since we
11234 are going to be changing the mode of the MEM, don't call
11235 force_const_mem for constants because we don't allow pool
11236 constants to change mode. */
11237 tree inner_type = TREE_TYPE (treeop0);
11238
11239 gcc_assert (!TREE_ADDRESSABLE (exp));
11240
11241 if (target == 0 || GET_MODE (target) != TYPE_MODE (inner_type))
11242 target
11243 = assign_stack_temp_for_type
11244 (TYPE_MODE (inner_type),
11245 GET_MODE_SIZE (TYPE_MODE (inner_type)), inner_type);
11246
11247 emit_move_insn (target, op0);
11248 op0 = target;
11249 }
11250
11251 /* If OP0 is (now) a MEM, we need to deal with alignment issues. If the
11252 output type is such that the operand is known to be aligned, indicate
11253 that it is. Otherwise, we need only be concerned about alignment for
11254 non-BLKmode results. */
11255 if (MEM_P (op0))
11256 {
11257 enum insn_code icode;
11258
11259 if (modifier != EXPAND_WRITE
11260 && modifier != EXPAND_MEMORY
11261 && !inner_reference_p
11262 && mode != BLKmode
11263 && MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode))
11264 {
11265 /* If the target does have special handling for unaligned
11266 loads of mode then use them. */
11267 if ((icode = optab_handler (movmisalign_optab, mode))
11268 != CODE_FOR_nothing)
11269 {
11270 rtx reg;
11271
11272 op0 = adjust_address (op0, mode, 0);
11273 /* We've already validated the memory, and we're creating a
11274 new pseudo destination. The predicates really can't
11275 fail. */
11276 reg = gen_reg_rtx (mode);
11277
11278 /* Nor can the insn generator. */
11279 rtx_insn *insn = GEN_FCN (icode) (reg, op0);
11280 emit_insn (insn);
11281 return reg;
11282 }
11283 else if (STRICT_ALIGNMENT)
11284 {
11285 poly_uint64 mode_size = GET_MODE_SIZE (mode);
11286 poly_uint64 temp_size = mode_size;
11287 if (GET_MODE (op0) != BLKmode)
11288 temp_size = upper_bound (temp_size,
11289 GET_MODE_SIZE (GET_MODE (op0)));
11290 rtx new_rtx
11291 = assign_stack_temp_for_type (mode, temp_size, type);
11292 rtx new_with_op0_mode
11293 = adjust_address (new_rtx, GET_MODE (op0), 0);
11294
11295 gcc_assert (!TREE_ADDRESSABLE (exp));
11296
11297 if (GET_MODE (op0) == BLKmode)
11298 {
11299 rtx size_rtx = gen_int_mode (mode_size, Pmode);
11300 emit_block_move (new_with_op0_mode, op0, size_rtx,
11301 (modifier == EXPAND_STACK_PARM
11302 ? BLOCK_OP_CALL_PARM
11303 : BLOCK_OP_NORMAL));
11304 }
11305 else
11306 emit_move_insn (new_with_op0_mode, op0);
11307
11308 op0 = new_rtx;
11309 }
11310 }
11311
11312 op0 = adjust_address (op0, mode, 0);
11313 }
11314
11315 return op0;
11316
11317 case MODIFY_EXPR:
11318 {
11319 tree lhs = treeop0;
11320 tree rhs = treeop1;
11321 gcc_assert (ignore);
11322
11323 /* Check for |= or &= of a bitfield of size one into another bitfield
11324 of size 1. In this case, (unless we need the result of the
11325 assignment) we can do this more efficiently with a
11326 test followed by an assignment, if necessary.
11327
11328 ??? At this point, we can't get a BIT_FIELD_REF here. But if
11329 things change so we do, this code should be enhanced to
11330 support it. */
11331 if (TREE_CODE (lhs) == COMPONENT_REF
11332 && (TREE_CODE (rhs) == BIT_IOR_EXPR
11333 || TREE_CODE (rhs) == BIT_AND_EXPR)
11334 && TREE_OPERAND (rhs, 0) == lhs
11335 && TREE_CODE (TREE_OPERAND (rhs, 1)) == COMPONENT_REF
11336 && integer_onep (DECL_SIZE (TREE_OPERAND (lhs, 1)))
11337 && integer_onep (DECL_SIZE (TREE_OPERAND (TREE_OPERAND (rhs, 1), 1))))
11338 {
11339 rtx_code_label *label = gen_label_rtx ();
11340 int value = TREE_CODE (rhs) == BIT_IOR_EXPR;
11341 profile_probability prob = profile_probability::uninitialized ();
11342 if (value)
11343 jumpifnot (TREE_OPERAND (rhs, 1), label, prob);
11344 else
11345 jumpif (TREE_OPERAND (rhs, 1), label, prob);
11346 expand_assignment (lhs, build_int_cst (TREE_TYPE (rhs), value),
11347 false);
11348 do_pending_stack_adjust ();
11349 emit_label (label);
11350 return const0_rtx;
11351 }
11352
11353 expand_assignment (lhs, rhs, false);
11354 return const0_rtx;
11355 }
11356
11357 case ADDR_EXPR:
11358 return expand_expr_addr_expr (exp, target, tmode, modifier);
11359
11360 case REALPART_EXPR:
11361 op0 = expand_normal (treeop0);
11362 return read_complex_part (op0, false);
11363
11364 case IMAGPART_EXPR:
11365 op0 = expand_normal (treeop0);
11366 return read_complex_part (op0, true);
11367
11368 case RETURN_EXPR:
11369 case LABEL_EXPR:
11370 case GOTO_EXPR:
11371 case SWITCH_EXPR:
11372 case ASM_EXPR:
11373 /* Expanded in cfgexpand.c. */
11374 gcc_unreachable ();
11375
11376 case TRY_CATCH_EXPR:
11377 case CATCH_EXPR:
11378 case EH_FILTER_EXPR:
11379 case TRY_FINALLY_EXPR:
11380 case EH_ELSE_EXPR:
11381 /* Lowered by tree-eh.c. */
11382 gcc_unreachable ();
11383
11384 case WITH_CLEANUP_EXPR:
11385 case CLEANUP_POINT_EXPR:
11386 case TARGET_EXPR:
11387 case CASE_LABEL_EXPR:
11388 case VA_ARG_EXPR:
11389 case BIND_EXPR:
11390 case INIT_EXPR:
11391 case CONJ_EXPR:
11392 case COMPOUND_EXPR:
11393 case PREINCREMENT_EXPR:
11394 case PREDECREMENT_EXPR:
11395 case POSTINCREMENT_EXPR:
11396 case POSTDECREMENT_EXPR:
11397 case LOOP_EXPR:
11398 case EXIT_EXPR:
11399 case COMPOUND_LITERAL_EXPR:
11400 /* Lowered by gimplify.c. */
11401 gcc_unreachable ();
11402
11403 case FDESC_EXPR:
11404 /* Function descriptors are not valid except for as
11405 initialization constants, and should not be expanded. */
11406 gcc_unreachable ();
11407
11408 case WITH_SIZE_EXPR:
11409 /* WITH_SIZE_EXPR expands to its first argument. The caller should
11410 have pulled out the size to use in whatever context it needed. */
11411 return expand_expr_real (treeop0, original_target, tmode,
11412 modifier, alt_rtl, inner_reference_p);
11413
11414 default:
11415 return expand_expr_real_2 (&ops, target, tmode, modifier);
11416 }
11417 }
11418 \f
11419 /* Subroutine of above: reduce EXP to the precision of TYPE (in the
11420 signedness of TYPE), possibly returning the result in TARGET.
11421 TYPE is known to be a partial integer type. */
11422 static rtx
11423 reduce_to_bit_field_precision (rtx exp, rtx target, tree type)
11424 {
11425 HOST_WIDE_INT prec = TYPE_PRECISION (type);
11426 if (target && GET_MODE (target) != GET_MODE (exp))
11427 target = 0;
11428 /* For constant values, reduce using build_int_cst_type. */
11429 poly_int64 const_exp;
11430 if (poly_int_rtx_p (exp, &const_exp))
11431 {
11432 tree t = build_int_cst_type (type, const_exp);
11433 return expand_expr (t, target, VOIDmode, EXPAND_NORMAL);
11434 }
11435 else if (TYPE_UNSIGNED (type))
11436 {
11437 scalar_int_mode mode = as_a <scalar_int_mode> (GET_MODE (exp));
11438 rtx mask = immed_wide_int_const
11439 (wi::mask (prec, false, GET_MODE_PRECISION (mode)), mode);
11440 return expand_and (mode, exp, mask, target);
11441 }
11442 else
11443 {
11444 scalar_int_mode mode = as_a <scalar_int_mode> (GET_MODE (exp));
11445 int count = GET_MODE_PRECISION (mode) - prec;
11446 exp = expand_shift (LSHIFT_EXPR, mode, exp, count, target, 0);
11447 return expand_shift (RSHIFT_EXPR, mode, exp, count, target, 0);
11448 }
11449 }
11450 \f
11451 /* Subroutine of above: returns 1 if OFFSET corresponds to an offset that
11452 when applied to the address of EXP produces an address known to be
11453 aligned more than BIGGEST_ALIGNMENT. */
11454
11455 static int
11456 is_aligning_offset (const_tree offset, const_tree exp)
11457 {
11458 /* Strip off any conversions. */
11459 while (CONVERT_EXPR_P (offset))
11460 offset = TREE_OPERAND (offset, 0);
11461
11462 /* We must now have a BIT_AND_EXPR with a constant that is one less than
11463 power of 2 and which is larger than BIGGEST_ALIGNMENT. */
11464 if (TREE_CODE (offset) != BIT_AND_EXPR
11465 || !tree_fits_uhwi_p (TREE_OPERAND (offset, 1))
11466 || compare_tree_int (TREE_OPERAND (offset, 1),
11467 BIGGEST_ALIGNMENT / BITS_PER_UNIT) <= 0
11468 || !pow2p_hwi (tree_to_uhwi (TREE_OPERAND (offset, 1)) + 1))
11469 return 0;
11470
11471 /* Look at the first operand of BIT_AND_EXPR and strip any conversion.
11472 It must be NEGATE_EXPR. Then strip any more conversions. */
11473 offset = TREE_OPERAND (offset, 0);
11474 while (CONVERT_EXPR_P (offset))
11475 offset = TREE_OPERAND (offset, 0);
11476
11477 if (TREE_CODE (offset) != NEGATE_EXPR)
11478 return 0;
11479
11480 offset = TREE_OPERAND (offset, 0);
11481 while (CONVERT_EXPR_P (offset))
11482 offset = TREE_OPERAND (offset, 0);
11483
11484 /* This must now be the address of EXP. */
11485 return TREE_CODE (offset) == ADDR_EXPR && TREE_OPERAND (offset, 0) == exp;
11486 }
11487 \f
11488 /* Return the tree node if an ARG corresponds to a string constant or zero
11489 if it doesn't. If we return nonzero, set *PTR_OFFSET to the (possibly
11490 non-constant) offset in bytes within the string that ARG is accessing.
11491 If MEM_SIZE is non-zero the storage size of the memory is returned.
11492 If DECL is non-zero the constant declaration is returned if available. */
11493
11494 tree
11495 string_constant (tree arg, tree *ptr_offset, tree *mem_size, tree *decl)
11496 {
11497 tree dummy = NULL_TREE;;
11498 if (!mem_size)
11499 mem_size = &dummy;
11500
11501 /* Store the type of the original expression before conversions
11502 via NOP_EXPR or POINTER_PLUS_EXPR to other types have been
11503 removed. */
11504 tree argtype = TREE_TYPE (arg);
11505
11506 tree array;
11507 STRIP_NOPS (arg);
11508
11509 /* Non-constant index into the character array in an ARRAY_REF
11510 expression or null. */
11511 tree varidx = NULL_TREE;
11512
11513 poly_int64 base_off = 0;
11514
11515 if (TREE_CODE (arg) == ADDR_EXPR)
11516 {
11517 arg = TREE_OPERAND (arg, 0);
11518 tree ref = arg;
11519 if (TREE_CODE (arg) == ARRAY_REF)
11520 {
11521 tree idx = TREE_OPERAND (arg, 1);
11522 if (TREE_CODE (idx) != INTEGER_CST)
11523 {
11524 /* From a pointer (but not array) argument extract the variable
11525 index to prevent get_addr_base_and_unit_offset() from failing
11526 due to it. Use it later to compute the non-constant offset
11527 into the string and return it to the caller. */
11528 varidx = idx;
11529 ref = TREE_OPERAND (arg, 0);
11530
11531 if (TREE_CODE (TREE_TYPE (arg)) == ARRAY_TYPE)
11532 return NULL_TREE;
11533
11534 if (!integer_zerop (array_ref_low_bound (arg)))
11535 return NULL_TREE;
11536
11537 if (!integer_onep (array_ref_element_size (arg)))
11538 return NULL_TREE;
11539 }
11540 }
11541 array = get_addr_base_and_unit_offset (ref, &base_off);
11542 if (!array
11543 || (TREE_CODE (array) != VAR_DECL
11544 && TREE_CODE (array) != CONST_DECL
11545 && TREE_CODE (array) != STRING_CST))
11546 return NULL_TREE;
11547 }
11548 else if (TREE_CODE (arg) == PLUS_EXPR || TREE_CODE (arg) == POINTER_PLUS_EXPR)
11549 {
11550 tree arg0 = TREE_OPERAND (arg, 0);
11551 tree arg1 = TREE_OPERAND (arg, 1);
11552
11553 tree offset;
11554 tree str = string_constant (arg0, &offset, mem_size, decl);
11555 if (!str)
11556 {
11557 str = string_constant (arg1, &offset, mem_size, decl);
11558 arg1 = arg0;
11559 }
11560
11561 if (str)
11562 {
11563 /* Avoid pointers to arrays (see bug 86622). */
11564 if (POINTER_TYPE_P (TREE_TYPE (arg))
11565 && TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) == ARRAY_TYPE
11566 && !(decl && !*decl)
11567 && !(decl && tree_fits_uhwi_p (DECL_SIZE_UNIT (*decl))
11568 && tree_fits_uhwi_p (*mem_size)
11569 && tree_int_cst_equal (*mem_size, DECL_SIZE_UNIT (*decl))))
11570 return NULL_TREE;
11571
11572 tree type = TREE_TYPE (offset);
11573 arg1 = fold_convert (type, arg1);
11574 *ptr_offset = fold_build2 (PLUS_EXPR, type, offset, arg1);
11575 return str;
11576 }
11577 return NULL_TREE;
11578 }
11579 else if (TREE_CODE (arg) == SSA_NAME)
11580 {
11581 gimple *stmt = SSA_NAME_DEF_STMT (arg);
11582 if (!is_gimple_assign (stmt))
11583 return NULL_TREE;
11584
11585 tree rhs1 = gimple_assign_rhs1 (stmt);
11586 tree_code code = gimple_assign_rhs_code (stmt);
11587 if (code == ADDR_EXPR)
11588 return string_constant (rhs1, ptr_offset, mem_size, decl);
11589 else if (code != POINTER_PLUS_EXPR)
11590 return NULL_TREE;
11591
11592 tree offset;
11593 if (tree str = string_constant (rhs1, &offset, mem_size, decl))
11594 {
11595 /* Avoid pointers to arrays (see bug 86622). */
11596 if (POINTER_TYPE_P (TREE_TYPE (rhs1))
11597 && TREE_CODE (TREE_TYPE (TREE_TYPE (rhs1))) == ARRAY_TYPE
11598 && !(decl && !*decl)
11599 && !(decl && tree_fits_uhwi_p (DECL_SIZE_UNIT (*decl))
11600 && tree_fits_uhwi_p (*mem_size)
11601 && tree_int_cst_equal (*mem_size, DECL_SIZE_UNIT (*decl))))
11602 return NULL_TREE;
11603
11604 tree rhs2 = gimple_assign_rhs2 (stmt);
11605 tree type = TREE_TYPE (offset);
11606 rhs2 = fold_convert (type, rhs2);
11607 *ptr_offset = fold_build2 (PLUS_EXPR, type, offset, rhs2);
11608 return str;
11609 }
11610 return NULL_TREE;
11611 }
11612 else if (DECL_P (arg))
11613 array = arg;
11614 else
11615 return NULL_TREE;
11616
11617 tree offset = wide_int_to_tree (sizetype, base_off);
11618 if (varidx)
11619 {
11620 if (TREE_CODE (TREE_TYPE (array)) != ARRAY_TYPE)
11621 return NULL_TREE;
11622
11623 gcc_assert (TREE_CODE (arg) == ARRAY_REF);
11624 tree chartype = TREE_TYPE (TREE_TYPE (TREE_OPERAND (arg, 0)));
11625 if (TREE_CODE (chartype) != INTEGER_TYPE)
11626 return NULL;
11627
11628 offset = fold_convert (sizetype, varidx);
11629 }
11630
11631 if (TREE_CODE (array) == STRING_CST)
11632 {
11633 *ptr_offset = fold_convert (sizetype, offset);
11634 *mem_size = TYPE_SIZE_UNIT (TREE_TYPE (array));
11635 if (decl)
11636 *decl = NULL_TREE;
11637 gcc_checking_assert (tree_to_shwi (TYPE_SIZE_UNIT (TREE_TYPE (array)))
11638 >= TREE_STRING_LENGTH (array));
11639 return array;
11640 }
11641
11642 if (!VAR_P (array) && TREE_CODE (array) != CONST_DECL)
11643 return NULL_TREE;
11644
11645 tree init = ctor_for_folding (array);
11646
11647 /* Handle variables initialized with string literals. */
11648 if (!init || init == error_mark_node)
11649 return NULL_TREE;
11650 if (TREE_CODE (init) == CONSTRUCTOR)
11651 {
11652 /* Convert the 64-bit constant offset to a wider type to avoid
11653 overflow. */
11654 offset_int wioff;
11655 if (!base_off.is_constant (&wioff))
11656 return NULL_TREE;
11657
11658 wioff *= BITS_PER_UNIT;
11659 if (!wi::fits_uhwi_p (wioff))
11660 return NULL_TREE;
11661
11662 base_off = wioff.to_uhwi ();
11663 unsigned HOST_WIDE_INT fieldoff = 0;
11664 init = fold_ctor_reference (TREE_TYPE (arg), init, base_off, 0, array,
11665 &fieldoff);
11666 HOST_WIDE_INT cstoff;
11667 if (!base_off.is_constant (&cstoff))
11668 return NULL_TREE;
11669
11670 cstoff = (cstoff - fieldoff) / BITS_PER_UNIT;
11671 tree off = build_int_cst (sizetype, cstoff);
11672 if (varidx)
11673 offset = fold_build2 (PLUS_EXPR, TREE_TYPE (offset), offset, off);
11674 else
11675 offset = off;
11676 }
11677
11678 if (!init)
11679 return NULL_TREE;
11680
11681 *ptr_offset = offset;
11682
11683 tree inittype = TREE_TYPE (init);
11684
11685 if (TREE_CODE (init) == INTEGER_CST
11686 && (TREE_CODE (TREE_TYPE (array)) == INTEGER_TYPE
11687 || TYPE_MAIN_VARIANT (inittype) == char_type_node))
11688 {
11689 /* For a reference to (address of) a single constant character,
11690 store the native representation of the character in CHARBUF.
11691 If the reference is to an element of an array or a member
11692 of a struct, only consider narrow characters until ctors
11693 for wide character arrays are transformed to STRING_CSTs
11694 like those for narrow arrays. */
11695 unsigned char charbuf[MAX_BITSIZE_MODE_ANY_MODE / BITS_PER_UNIT];
11696 int len = native_encode_expr (init, charbuf, sizeof charbuf, 0);
11697 if (len > 0)
11698 {
11699 /* Construct a string literal with elements of INITTYPE and
11700 the representation above. Then strip
11701 the ADDR_EXPR (ARRAY_REF (...)) around the STRING_CST. */
11702 init = build_string_literal (len, (char *)charbuf, inittype);
11703 init = TREE_OPERAND (TREE_OPERAND (init, 0), 0);
11704 }
11705 }
11706
11707 tree initsize = TYPE_SIZE_UNIT (inittype);
11708
11709 if (TREE_CODE (init) == CONSTRUCTOR && initializer_zerop (init))
11710 {
11711 /* Fold an empty/zero constructor for an implicitly initialized
11712 object or subobject into the empty string. */
11713
11714 /* Determine the character type from that of the original
11715 expression. */
11716 tree chartype = argtype;
11717 if (POINTER_TYPE_P (chartype))
11718 chartype = TREE_TYPE (chartype);
11719 while (TREE_CODE (chartype) == ARRAY_TYPE)
11720 chartype = TREE_TYPE (chartype);
11721 /* Convert a char array to an empty STRING_CST having an array
11722 of the expected type. */
11723 if (!initsize)
11724 initsize = integer_zero_node;
11725
11726 unsigned HOST_WIDE_INT size = tree_to_uhwi (initsize);
11727 init = build_string_literal (size ? 1 : 0, "", chartype, size);
11728 init = TREE_OPERAND (init, 0);
11729 init = TREE_OPERAND (init, 0);
11730
11731 *ptr_offset = integer_zero_node;
11732 }
11733
11734 if (decl)
11735 *decl = array;
11736
11737 if (TREE_CODE (init) != STRING_CST)
11738 return NULL_TREE;
11739
11740 *mem_size = initsize;
11741
11742 gcc_checking_assert (tree_to_shwi (initsize) >= TREE_STRING_LENGTH (init));
11743
11744 return init;
11745 }
11746 \f
11747 /* Compute the modular multiplicative inverse of A modulo M
11748 using extended Euclid's algorithm. Assumes A and M are coprime. */
11749 static wide_int
11750 mod_inv (const wide_int &a, const wide_int &b)
11751 {
11752 /* Verify the assumption. */
11753 gcc_checking_assert (wi::eq_p (wi::gcd (a, b), 1));
11754
11755 unsigned int p = a.get_precision () + 1;
11756 gcc_checking_assert (b.get_precision () + 1 == p);
11757 wide_int c = wide_int::from (a, p, UNSIGNED);
11758 wide_int d = wide_int::from (b, p, UNSIGNED);
11759 wide_int x0 = wide_int::from (0, p, UNSIGNED);
11760 wide_int x1 = wide_int::from (1, p, UNSIGNED);
11761
11762 if (wi::eq_p (b, 1))
11763 return wide_int::from (1, p, UNSIGNED);
11764
11765 while (wi::gt_p (c, 1, UNSIGNED))
11766 {
11767 wide_int t = d;
11768 wide_int q = wi::divmod_trunc (c, d, UNSIGNED, &d);
11769 c = t;
11770 wide_int s = x0;
11771 x0 = wi::sub (x1, wi::mul (q, x0));
11772 x1 = s;
11773 }
11774 if (wi::lt_p (x1, 0, SIGNED))
11775 x1 += d;
11776 return x1;
11777 }
11778
11779 /* Optimize x % C1 == C2 for signed modulo if C1 is a power of two and C2
11780 is non-zero and C3 ((1<<(prec-1)) | (C1 - 1)):
11781 for C2 > 0 to x & C3 == C2
11782 for C2 < 0 to x & C3 == (C2 & C3). */
11783 enum tree_code
11784 maybe_optimize_pow2p_mod_cmp (enum tree_code code, tree *arg0, tree *arg1)
11785 {
11786 gimple *stmt = get_def_for_expr (*arg0, TRUNC_MOD_EXPR);
11787 tree treeop0 = gimple_assign_rhs1 (stmt);
11788 tree treeop1 = gimple_assign_rhs2 (stmt);
11789 tree type = TREE_TYPE (*arg0);
11790 scalar_int_mode mode;
11791 if (!is_a <scalar_int_mode> (TYPE_MODE (type), &mode))
11792 return code;
11793 if (GET_MODE_BITSIZE (mode) != TYPE_PRECISION (type)
11794 || TYPE_PRECISION (type) <= 1
11795 || TYPE_UNSIGNED (type)
11796 /* Signed x % c == 0 should have been optimized into unsigned modulo
11797 earlier. */
11798 || integer_zerop (*arg1)
11799 /* If c is known to be non-negative, modulo will be expanded as unsigned
11800 modulo. */
11801 || get_range_pos_neg (treeop0) == 1)
11802 return code;
11803
11804 /* x % c == d where d < 0 && d <= -c should be always false. */
11805 if (tree_int_cst_sgn (*arg1) == -1
11806 && -wi::to_widest (treeop1) >= wi::to_widest (*arg1))
11807 return code;
11808
11809 int prec = TYPE_PRECISION (type);
11810 wide_int w = wi::to_wide (treeop1) - 1;
11811 w |= wi::shifted_mask (0, prec - 1, true, prec);
11812 tree c3 = wide_int_to_tree (type, w);
11813 tree c4 = *arg1;
11814 if (tree_int_cst_sgn (*arg1) == -1)
11815 c4 = wide_int_to_tree (type, w & wi::to_wide (*arg1));
11816
11817 rtx op0 = expand_normal (treeop0);
11818 treeop0 = make_tree (TREE_TYPE (treeop0), op0);
11819
11820 bool speed_p = optimize_insn_for_speed_p ();
11821
11822 do_pending_stack_adjust ();
11823
11824 location_t loc = gimple_location (stmt);
11825 struct separate_ops ops;
11826 ops.code = TRUNC_MOD_EXPR;
11827 ops.location = loc;
11828 ops.type = TREE_TYPE (treeop0);
11829 ops.op0 = treeop0;
11830 ops.op1 = treeop1;
11831 ops.op2 = NULL_TREE;
11832 start_sequence ();
11833 rtx mor = expand_expr_real_2 (&ops, NULL_RTX, TYPE_MODE (ops.type),
11834 EXPAND_NORMAL);
11835 rtx_insn *moinsns = get_insns ();
11836 end_sequence ();
11837
11838 unsigned mocost = seq_cost (moinsns, speed_p);
11839 mocost += rtx_cost (mor, mode, EQ, 0, speed_p);
11840 mocost += rtx_cost (expand_normal (*arg1), mode, EQ, 1, speed_p);
11841
11842 ops.code = BIT_AND_EXPR;
11843 ops.location = loc;
11844 ops.type = TREE_TYPE (treeop0);
11845 ops.op0 = treeop0;
11846 ops.op1 = c3;
11847 ops.op2 = NULL_TREE;
11848 start_sequence ();
11849 rtx mur = expand_expr_real_2 (&ops, NULL_RTX, TYPE_MODE (ops.type),
11850 EXPAND_NORMAL);
11851 rtx_insn *muinsns = get_insns ();
11852 end_sequence ();
11853
11854 unsigned mucost = seq_cost (muinsns, speed_p);
11855 mucost += rtx_cost (mur, mode, EQ, 0, speed_p);
11856 mucost += rtx_cost (expand_normal (c4), mode, EQ, 1, speed_p);
11857
11858 if (mocost <= mucost)
11859 {
11860 emit_insn (moinsns);
11861 *arg0 = make_tree (TREE_TYPE (*arg0), mor);
11862 return code;
11863 }
11864
11865 emit_insn (muinsns);
11866 *arg0 = make_tree (TREE_TYPE (*arg0), mur);
11867 *arg1 = c4;
11868 return code;
11869 }
11870
11871 /* Attempt to optimize unsigned (X % C1) == C2 (or (X % C1) != C2).
11872 If C1 is odd to:
11873 (X - C2) * C3 <= C4 (or >), where
11874 C3 is modular multiplicative inverse of C1 and 1<<prec and
11875 C4 is ((1<<prec) - 1) / C1 or ((1<<prec) - 1) / C1 - 1 (the latter
11876 if C2 > ((1<<prec) - 1) % C1).
11877 If C1 is even, S = ctz (C1) and C2 is 0, use
11878 ((X * C3) r>> S) <= C4, where C3 is modular multiplicative
11879 inverse of C1>>S and 1<<prec and C4 is (((1<<prec) - 1) / (C1>>S)) >> S.
11880
11881 For signed (X % C1) == 0 if C1 is odd to (all operations in it
11882 unsigned):
11883 (X * C3) + C4 <= 2 * C4, where
11884 C3 is modular multiplicative inverse of (unsigned) C1 and 1<<prec and
11885 C4 is ((1<<(prec - 1) - 1) / C1).
11886 If C1 is even, S = ctz(C1), use
11887 ((X * C3) + C4) r>> S <= (C4 >> (S - 1))
11888 where C3 is modular multiplicative inverse of (unsigned)(C1>>S) and 1<<prec
11889 and C4 is ((1<<(prec - 1) - 1) / (C1>>S)) & (-1<<S).
11890
11891 See the Hacker's Delight book, section 10-17. */
11892 enum tree_code
11893 maybe_optimize_mod_cmp (enum tree_code code, tree *arg0, tree *arg1)
11894 {
11895 gcc_checking_assert (code == EQ_EXPR || code == NE_EXPR);
11896 gcc_checking_assert (TREE_CODE (*arg1) == INTEGER_CST);
11897
11898 if (optimize < 2)
11899 return code;
11900
11901 gimple *stmt = get_def_for_expr (*arg0, TRUNC_MOD_EXPR);
11902 if (stmt == NULL)
11903 return code;
11904
11905 tree treeop0 = gimple_assign_rhs1 (stmt);
11906 tree treeop1 = gimple_assign_rhs2 (stmt);
11907 if (TREE_CODE (treeop0) != SSA_NAME
11908 || TREE_CODE (treeop1) != INTEGER_CST
11909 /* Don't optimize the undefined behavior case x % 0;
11910 x % 1 should have been optimized into zero, punt if
11911 it makes it here for whatever reason;
11912 x % -c should have been optimized into x % c. */
11913 || compare_tree_int (treeop1, 2) <= 0
11914 /* Likewise x % c == d where d >= c should be always false. */
11915 || tree_int_cst_le (treeop1, *arg1))
11916 return code;
11917
11918 /* Unsigned x % pow2 is handled right already, for signed
11919 modulo handle it in maybe_optimize_pow2p_mod_cmp. */
11920 if (integer_pow2p (treeop1))
11921 return maybe_optimize_pow2p_mod_cmp (code, arg0, arg1);
11922
11923 tree type = TREE_TYPE (*arg0);
11924 scalar_int_mode mode;
11925 if (!is_a <scalar_int_mode> (TYPE_MODE (type), &mode))
11926 return code;
11927 if (GET_MODE_BITSIZE (mode) != TYPE_PRECISION (type)
11928 || TYPE_PRECISION (type) <= 1)
11929 return code;
11930
11931 signop sgn = UNSIGNED;
11932 /* If both operands are known to have the sign bit clear, handle
11933 even the signed modulo case as unsigned. treeop1 is always
11934 positive >= 2, checked above. */
11935 if (!TYPE_UNSIGNED (type) && get_range_pos_neg (treeop0) != 1)
11936 sgn = SIGNED;
11937
11938 if (!TYPE_UNSIGNED (type))
11939 {
11940 if (tree_int_cst_sgn (*arg1) == -1)
11941 return code;
11942 type = unsigned_type_for (type);
11943 if (!type || TYPE_MODE (type) != TYPE_MODE (TREE_TYPE (*arg0)))
11944 return code;
11945 }
11946
11947 int prec = TYPE_PRECISION (type);
11948 wide_int w = wi::to_wide (treeop1);
11949 int shift = wi::ctz (w);
11950 /* Unsigned (X % C1) == C2 is equivalent to (X - C2) % C1 == 0 if
11951 C2 <= -1U % C1, because for any Z >= 0U - C2 in that case (Z % C1) != 0.
11952 If C1 is odd, we can handle all cases by subtracting
11953 C4 below. We could handle even the even C1 and C2 > -1U % C1 cases
11954 e.g. by testing for overflow on the subtraction, punt on that for now
11955 though. */
11956 if ((sgn == SIGNED || shift) && !integer_zerop (*arg1))
11957 {
11958 if (sgn == SIGNED)
11959 return code;
11960 wide_int x = wi::umod_trunc (wi::mask (prec, false, prec), w);
11961 if (wi::gtu_p (wi::to_wide (*arg1), x))
11962 return code;
11963 }
11964
11965 imm_use_iterator imm_iter;
11966 use_operand_p use_p;
11967 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, treeop0)
11968 {
11969 gimple *use_stmt = USE_STMT (use_p);
11970 /* Punt if treeop0 is used in the same bb in a division
11971 or another modulo with the same divisor. We should expect
11972 the division and modulo combined together. */
11973 if (use_stmt == stmt
11974 || gimple_bb (use_stmt) != gimple_bb (stmt))
11975 continue;
11976 if (!is_gimple_assign (use_stmt)
11977 || (gimple_assign_rhs_code (use_stmt) != TRUNC_DIV_EXPR
11978 && gimple_assign_rhs_code (use_stmt) != TRUNC_MOD_EXPR))
11979 continue;
11980 if (gimple_assign_rhs1 (use_stmt) != treeop0
11981 || !operand_equal_p (gimple_assign_rhs2 (use_stmt), treeop1, 0))
11982 continue;
11983 return code;
11984 }
11985
11986 w = wi::lrshift (w, shift);
11987 wide_int a = wide_int::from (w, prec + 1, UNSIGNED);
11988 wide_int b = wi::shifted_mask (prec, 1, false, prec + 1);
11989 wide_int m = wide_int::from (mod_inv (a, b), prec, UNSIGNED);
11990 tree c3 = wide_int_to_tree (type, m);
11991 tree c5 = NULL_TREE;
11992 wide_int d, e;
11993 if (sgn == UNSIGNED)
11994 {
11995 d = wi::divmod_trunc (wi::mask (prec, false, prec), w, UNSIGNED, &e);
11996 /* Use <= floor ((1<<prec) - 1) / C1 only if C2 <= ((1<<prec) - 1) % C1,
11997 otherwise use < or subtract one from C4. E.g. for
11998 x % 3U == 0 we transform this into x * 0xaaaaaaab <= 0x55555555, but
11999 x % 3U == 1 already needs to be
12000 (x - 1) * 0xaaaaaaabU <= 0x55555554. */
12001 if (!shift && wi::gtu_p (wi::to_wide (*arg1), e))
12002 d -= 1;
12003 if (shift)
12004 d = wi::lrshift (d, shift);
12005 }
12006 else
12007 {
12008 e = wi::udiv_trunc (wi::mask (prec - 1, false, prec), w);
12009 if (!shift)
12010 d = wi::lshift (e, 1);
12011 else
12012 {
12013 e = wi::bit_and (e, wi::mask (shift, true, prec));
12014 d = wi::lrshift (e, shift - 1);
12015 }
12016 c5 = wide_int_to_tree (type, e);
12017 }
12018 tree c4 = wide_int_to_tree (type, d);
12019
12020 rtx op0 = expand_normal (treeop0);
12021 treeop0 = make_tree (TREE_TYPE (treeop0), op0);
12022
12023 bool speed_p = optimize_insn_for_speed_p ();
12024
12025 do_pending_stack_adjust ();
12026
12027 location_t loc = gimple_location (stmt);
12028 struct separate_ops ops;
12029 ops.code = TRUNC_MOD_EXPR;
12030 ops.location = loc;
12031 ops.type = TREE_TYPE (treeop0);
12032 ops.op0 = treeop0;
12033 ops.op1 = treeop1;
12034 ops.op2 = NULL_TREE;
12035 start_sequence ();
12036 rtx mor = expand_expr_real_2 (&ops, NULL_RTX, TYPE_MODE (ops.type),
12037 EXPAND_NORMAL);
12038 rtx_insn *moinsns = get_insns ();
12039 end_sequence ();
12040
12041 unsigned mocost = seq_cost (moinsns, speed_p);
12042 mocost += rtx_cost (mor, mode, EQ, 0, speed_p);
12043 mocost += rtx_cost (expand_normal (*arg1), mode, EQ, 1, speed_p);
12044
12045 tree t = fold_convert_loc (loc, type, treeop0);
12046 if (!integer_zerop (*arg1))
12047 t = fold_build2_loc (loc, MINUS_EXPR, type, t, fold_convert (type, *arg1));
12048 t = fold_build2_loc (loc, MULT_EXPR, type, t, c3);
12049 if (sgn == SIGNED)
12050 t = fold_build2_loc (loc, PLUS_EXPR, type, t, c5);
12051 if (shift)
12052 {
12053 tree s = build_int_cst (NULL_TREE, shift);
12054 t = fold_build2_loc (loc, RROTATE_EXPR, type, t, s);
12055 }
12056
12057 start_sequence ();
12058 rtx mur = expand_normal (t);
12059 rtx_insn *muinsns = get_insns ();
12060 end_sequence ();
12061
12062 unsigned mucost = seq_cost (muinsns, speed_p);
12063 mucost += rtx_cost (mur, mode, LE, 0, speed_p);
12064 mucost += rtx_cost (expand_normal (c4), mode, LE, 1, speed_p);
12065
12066 if (mocost <= mucost)
12067 {
12068 emit_insn (moinsns);
12069 *arg0 = make_tree (TREE_TYPE (*arg0), mor);
12070 return code;
12071 }
12072
12073 emit_insn (muinsns);
12074 *arg0 = make_tree (type, mur);
12075 *arg1 = c4;
12076 return code == EQ_EXPR ? LE_EXPR : GT_EXPR;
12077 }
12078 \f
12079 /* Generate code to calculate OPS, and exploded expression
12080 using a store-flag instruction and return an rtx for the result.
12081 OPS reflects a comparison.
12082
12083 If TARGET is nonzero, store the result there if convenient.
12084
12085 Return zero if there is no suitable set-flag instruction
12086 available on this machine.
12087
12088 Once expand_expr has been called on the arguments of the comparison,
12089 we are committed to doing the store flag, since it is not safe to
12090 re-evaluate the expression. We emit the store-flag insn by calling
12091 emit_store_flag, but only expand the arguments if we have a reason
12092 to believe that emit_store_flag will be successful. If we think that
12093 it will, but it isn't, we have to simulate the store-flag with a
12094 set/jump/set sequence. */
12095
12096 static rtx
12097 do_store_flag (sepops ops, rtx target, machine_mode mode)
12098 {
12099 enum rtx_code code;
12100 tree arg0, arg1, type;
12101 machine_mode operand_mode;
12102 int unsignedp;
12103 rtx op0, op1;
12104 rtx subtarget = target;
12105 location_t loc = ops->location;
12106
12107 arg0 = ops->op0;
12108 arg1 = ops->op1;
12109
12110 /* Don't crash if the comparison was erroneous. */
12111 if (arg0 == error_mark_node || arg1 == error_mark_node)
12112 return const0_rtx;
12113
12114 type = TREE_TYPE (arg0);
12115 operand_mode = TYPE_MODE (type);
12116 unsignedp = TYPE_UNSIGNED (type);
12117
12118 /* We won't bother with BLKmode store-flag operations because it would mean
12119 passing a lot of information to emit_store_flag. */
12120 if (operand_mode == BLKmode)
12121 return 0;
12122
12123 /* We won't bother with store-flag operations involving function pointers
12124 when function pointers must be canonicalized before comparisons. */
12125 if (targetm.have_canonicalize_funcptr_for_compare ()
12126 && ((POINTER_TYPE_P (TREE_TYPE (arg0))
12127 && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (arg0))))
12128 || (POINTER_TYPE_P (TREE_TYPE (arg1))
12129 && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (arg1))))))
12130 return 0;
12131
12132 STRIP_NOPS (arg0);
12133 STRIP_NOPS (arg1);
12134
12135 /* For vector typed comparisons emit code to generate the desired
12136 all-ones or all-zeros mask. Conveniently use the VEC_COND_EXPR
12137 expander for this. */
12138 if (TREE_CODE (ops->type) == VECTOR_TYPE)
12139 {
12140 tree ifexp = build2 (ops->code, ops->type, arg0, arg1);
12141 if (VECTOR_BOOLEAN_TYPE_P (ops->type)
12142 && expand_vec_cmp_expr_p (TREE_TYPE (arg0), ops->type, ops->code))
12143 return expand_vec_cmp_expr (ops->type, ifexp, target);
12144 else
12145 {
12146 tree if_true = constant_boolean_node (true, ops->type);
12147 tree if_false = constant_boolean_node (false, ops->type);
12148 return expand_vec_cond_expr (ops->type, ifexp, if_true,
12149 if_false, target);
12150 }
12151 }
12152
12153 /* Optimize (x % C1) == C2 or (x % C1) != C2 if it is beneficial
12154 into (x - C2) * C3 < C4. */
12155 if ((ops->code == EQ_EXPR || ops->code == NE_EXPR)
12156 && TREE_CODE (arg0) == SSA_NAME
12157 && TREE_CODE (arg1) == INTEGER_CST)
12158 {
12159 enum tree_code new_code = maybe_optimize_mod_cmp (ops->code,
12160 &arg0, &arg1);
12161 if (new_code != ops->code)
12162 {
12163 struct separate_ops nops = *ops;
12164 nops.code = ops->code = new_code;
12165 nops.op0 = arg0;
12166 nops.op1 = arg1;
12167 nops.type = TREE_TYPE (arg0);
12168 return do_store_flag (&nops, target, mode);
12169 }
12170 }
12171
12172 /* Get the rtx comparison code to use. We know that EXP is a comparison
12173 operation of some type. Some comparisons against 1 and -1 can be
12174 converted to comparisons with zero. Do so here so that the tests
12175 below will be aware that we have a comparison with zero. These
12176 tests will not catch constants in the first operand, but constants
12177 are rarely passed as the first operand. */
12178
12179 switch (ops->code)
12180 {
12181 case EQ_EXPR:
12182 code = EQ;
12183 break;
12184 case NE_EXPR:
12185 code = NE;
12186 break;
12187 case LT_EXPR:
12188 if (integer_onep (arg1))
12189 arg1 = integer_zero_node, code = unsignedp ? LEU : LE;
12190 else
12191 code = unsignedp ? LTU : LT;
12192 break;
12193 case LE_EXPR:
12194 if (! unsignedp && integer_all_onesp (arg1))
12195 arg1 = integer_zero_node, code = LT;
12196 else
12197 code = unsignedp ? LEU : LE;
12198 break;
12199 case GT_EXPR:
12200 if (! unsignedp && integer_all_onesp (arg1))
12201 arg1 = integer_zero_node, code = GE;
12202 else
12203 code = unsignedp ? GTU : GT;
12204 break;
12205 case GE_EXPR:
12206 if (integer_onep (arg1))
12207 arg1 = integer_zero_node, code = unsignedp ? GTU : GT;
12208 else
12209 code = unsignedp ? GEU : GE;
12210 break;
12211
12212 case UNORDERED_EXPR:
12213 code = UNORDERED;
12214 break;
12215 case ORDERED_EXPR:
12216 code = ORDERED;
12217 break;
12218 case UNLT_EXPR:
12219 code = UNLT;
12220 break;
12221 case UNLE_EXPR:
12222 code = UNLE;
12223 break;
12224 case UNGT_EXPR:
12225 code = UNGT;
12226 break;
12227 case UNGE_EXPR:
12228 code = UNGE;
12229 break;
12230 case UNEQ_EXPR:
12231 code = UNEQ;
12232 break;
12233 case LTGT_EXPR:
12234 code = LTGT;
12235 break;
12236
12237 default:
12238 gcc_unreachable ();
12239 }
12240
12241 /* Put a constant second. */
12242 if (TREE_CODE (arg0) == REAL_CST || TREE_CODE (arg0) == INTEGER_CST
12243 || TREE_CODE (arg0) == FIXED_CST)
12244 {
12245 std::swap (arg0, arg1);
12246 code = swap_condition (code);
12247 }
12248
12249 /* If this is an equality or inequality test of a single bit, we can
12250 do this by shifting the bit being tested to the low-order bit and
12251 masking the result with the constant 1. If the condition was EQ,
12252 we xor it with 1. This does not require an scc insn and is faster
12253 than an scc insn even if we have it.
12254
12255 The code to make this transformation was moved into fold_single_bit_test,
12256 so we just call into the folder and expand its result. */
12257
12258 if ((code == NE || code == EQ)
12259 && integer_zerop (arg1)
12260 && (TYPE_PRECISION (ops->type) != 1 || TYPE_UNSIGNED (ops->type)))
12261 {
12262 gimple *srcstmt = get_def_for_expr (arg0, BIT_AND_EXPR);
12263 if (srcstmt
12264 && integer_pow2p (gimple_assign_rhs2 (srcstmt)))
12265 {
12266 enum tree_code tcode = code == NE ? NE_EXPR : EQ_EXPR;
12267 type = lang_hooks.types.type_for_mode (mode, unsignedp);
12268 tree temp = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg1),
12269 gimple_assign_rhs1 (srcstmt),
12270 gimple_assign_rhs2 (srcstmt));
12271 temp = fold_single_bit_test (loc, tcode, temp, arg1, type);
12272 if (temp)
12273 return expand_expr (temp, target, VOIDmode, EXPAND_NORMAL);
12274 }
12275 }
12276
12277 if (! get_subtarget (target)
12278 || GET_MODE (subtarget) != operand_mode)
12279 subtarget = 0;
12280
12281 expand_operands (arg0, arg1, subtarget, &op0, &op1, EXPAND_NORMAL);
12282
12283 if (target == 0)
12284 target = gen_reg_rtx (mode);
12285
12286 /* Try a cstore if possible. */
12287 return emit_store_flag_force (target, code, op0, op1,
12288 operand_mode, unsignedp,
12289 (TYPE_PRECISION (ops->type) == 1
12290 && !TYPE_UNSIGNED (ops->type)) ? -1 : 1);
12291 }
12292 \f
12293 /* Attempt to generate a casesi instruction. Returns 1 if successful,
12294 0 otherwise (i.e. if there is no casesi instruction).
12295
12296 DEFAULT_PROBABILITY is the probability of jumping to the default
12297 label. */
12298 int
12299 try_casesi (tree index_type, tree index_expr, tree minval, tree range,
12300 rtx table_label, rtx default_label, rtx fallback_label,
12301 profile_probability default_probability)
12302 {
12303 class expand_operand ops[5];
12304 scalar_int_mode index_mode = SImode;
12305 rtx op1, op2, index;
12306
12307 if (! targetm.have_casesi ())
12308 return 0;
12309
12310 /* The index must be some form of integer. Convert it to SImode. */
12311 scalar_int_mode omode = SCALAR_INT_TYPE_MODE (index_type);
12312 if (GET_MODE_BITSIZE (omode) > GET_MODE_BITSIZE (index_mode))
12313 {
12314 rtx rangertx = expand_normal (range);
12315
12316 /* We must handle the endpoints in the original mode. */
12317 index_expr = build2 (MINUS_EXPR, index_type,
12318 index_expr, minval);
12319 minval = integer_zero_node;
12320 index = expand_normal (index_expr);
12321 if (default_label)
12322 emit_cmp_and_jump_insns (rangertx, index, LTU, NULL_RTX,
12323 omode, 1, default_label,
12324 default_probability);
12325 /* Now we can safely truncate. */
12326 index = convert_to_mode (index_mode, index, 0);
12327 }
12328 else
12329 {
12330 if (omode != index_mode)
12331 {
12332 index_type = lang_hooks.types.type_for_mode (index_mode, 0);
12333 index_expr = fold_convert (index_type, index_expr);
12334 }
12335
12336 index = expand_normal (index_expr);
12337 }
12338
12339 do_pending_stack_adjust ();
12340
12341 op1 = expand_normal (minval);
12342 op2 = expand_normal (range);
12343
12344 create_input_operand (&ops[0], index, index_mode);
12345 create_convert_operand_from_type (&ops[1], op1, TREE_TYPE (minval));
12346 create_convert_operand_from_type (&ops[2], op2, TREE_TYPE (range));
12347 create_fixed_operand (&ops[3], table_label);
12348 create_fixed_operand (&ops[4], (default_label
12349 ? default_label
12350 : fallback_label));
12351 expand_jump_insn (targetm.code_for_casesi, 5, ops);
12352 return 1;
12353 }
12354
12355 /* Attempt to generate a tablejump instruction; same concept. */
12356 /* Subroutine of the next function.
12357
12358 INDEX is the value being switched on, with the lowest value
12359 in the table already subtracted.
12360 MODE is its expected mode (needed if INDEX is constant).
12361 RANGE is the length of the jump table.
12362 TABLE_LABEL is a CODE_LABEL rtx for the table itself.
12363
12364 DEFAULT_LABEL is a CODE_LABEL rtx to jump to if the
12365 index value is out of range.
12366 DEFAULT_PROBABILITY is the probability of jumping to
12367 the default label. */
12368
12369 static void
12370 do_tablejump (rtx index, machine_mode mode, rtx range, rtx table_label,
12371 rtx default_label, profile_probability default_probability)
12372 {
12373 rtx temp, vector;
12374
12375 if (INTVAL (range) > cfun->cfg->max_jumptable_ents)
12376 cfun->cfg->max_jumptable_ents = INTVAL (range);
12377
12378 /* Do an unsigned comparison (in the proper mode) between the index
12379 expression and the value which represents the length of the range.
12380 Since we just finished subtracting the lower bound of the range
12381 from the index expression, this comparison allows us to simultaneously
12382 check that the original index expression value is both greater than
12383 or equal to the minimum value of the range and less than or equal to
12384 the maximum value of the range. */
12385
12386 if (default_label)
12387 emit_cmp_and_jump_insns (index, range, GTU, NULL_RTX, mode, 1,
12388 default_label, default_probability);
12389
12390 /* If index is in range, it must fit in Pmode.
12391 Convert to Pmode so we can index with it. */
12392 if (mode != Pmode)
12393 {
12394 unsigned int width;
12395
12396 /* We know the value of INDEX is between 0 and RANGE. If we have a
12397 sign-extended subreg, and RANGE does not have the sign bit set, then
12398 we have a value that is valid for both sign and zero extension. In
12399 this case, we get better code if we sign extend. */
12400 if (GET_CODE (index) == SUBREG
12401 && SUBREG_PROMOTED_VAR_P (index)
12402 && SUBREG_PROMOTED_SIGNED_P (index)
12403 && ((width = GET_MODE_PRECISION (as_a <scalar_int_mode> (mode)))
12404 <= HOST_BITS_PER_WIDE_INT)
12405 && ! (UINTVAL (range) & (HOST_WIDE_INT_1U << (width - 1))))
12406 index = convert_to_mode (Pmode, index, 0);
12407 else
12408 index = convert_to_mode (Pmode, index, 1);
12409 }
12410
12411 /* Don't let a MEM slip through, because then INDEX that comes
12412 out of PIC_CASE_VECTOR_ADDRESS won't be a valid address,
12413 and break_out_memory_refs will go to work on it and mess it up. */
12414 #ifdef PIC_CASE_VECTOR_ADDRESS
12415 if (flag_pic && !REG_P (index))
12416 index = copy_to_mode_reg (Pmode, index);
12417 #endif
12418
12419 /* ??? The only correct use of CASE_VECTOR_MODE is the one inside the
12420 GET_MODE_SIZE, because this indicates how large insns are. The other
12421 uses should all be Pmode, because they are addresses. This code
12422 could fail if addresses and insns are not the same size. */
12423 index = simplify_gen_binary (MULT, Pmode, index,
12424 gen_int_mode (GET_MODE_SIZE (CASE_VECTOR_MODE),
12425 Pmode));
12426 index = simplify_gen_binary (PLUS, Pmode, index,
12427 gen_rtx_LABEL_REF (Pmode, table_label));
12428
12429 #ifdef PIC_CASE_VECTOR_ADDRESS
12430 if (flag_pic)
12431 index = PIC_CASE_VECTOR_ADDRESS (index);
12432 else
12433 #endif
12434 index = memory_address (CASE_VECTOR_MODE, index);
12435 temp = gen_reg_rtx (CASE_VECTOR_MODE);
12436 vector = gen_const_mem (CASE_VECTOR_MODE, index);
12437 convert_move (temp, vector, 0);
12438
12439 emit_jump_insn (targetm.gen_tablejump (temp, table_label));
12440
12441 /* If we are generating PIC code or if the table is PC-relative, the
12442 table and JUMP_INSN must be adjacent, so don't output a BARRIER. */
12443 if (! CASE_VECTOR_PC_RELATIVE && ! flag_pic)
12444 emit_barrier ();
12445 }
12446
12447 int
12448 try_tablejump (tree index_type, tree index_expr, tree minval, tree range,
12449 rtx table_label, rtx default_label,
12450 profile_probability default_probability)
12451 {
12452 rtx index;
12453
12454 if (! targetm.have_tablejump ())
12455 return 0;
12456
12457 index_expr = fold_build2 (MINUS_EXPR, index_type,
12458 fold_convert (index_type, index_expr),
12459 fold_convert (index_type, minval));
12460 index = expand_normal (index_expr);
12461 do_pending_stack_adjust ();
12462
12463 do_tablejump (index, TYPE_MODE (index_type),
12464 convert_modes (TYPE_MODE (index_type),
12465 TYPE_MODE (TREE_TYPE (range)),
12466 expand_normal (range),
12467 TYPE_UNSIGNED (TREE_TYPE (range))),
12468 table_label, default_label, default_probability);
12469 return 1;
12470 }
12471
12472 /* Return a CONST_VECTOR rtx representing vector mask for
12473 a VECTOR_CST of booleans. */
12474 static rtx
12475 const_vector_mask_from_tree (tree exp)
12476 {
12477 machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
12478 machine_mode inner = GET_MODE_INNER (mode);
12479
12480 rtx_vector_builder builder (mode, VECTOR_CST_NPATTERNS (exp),
12481 VECTOR_CST_NELTS_PER_PATTERN (exp));
12482 unsigned int count = builder.encoded_nelts ();
12483 for (unsigned int i = 0; i < count; ++i)
12484 {
12485 tree elt = VECTOR_CST_ELT (exp, i);
12486 gcc_assert (TREE_CODE (elt) == INTEGER_CST);
12487 if (integer_zerop (elt))
12488 builder.quick_push (CONST0_RTX (inner));
12489 else if (integer_onep (elt)
12490 || integer_minus_onep (elt))
12491 builder.quick_push (CONSTM1_RTX (inner));
12492 else
12493 gcc_unreachable ();
12494 }
12495 return builder.build ();
12496 }
12497
12498 /* EXP is a VECTOR_CST in which each element is either all-zeros or all-ones.
12499 Return a constant scalar rtx of mode MODE in which bit X is set if element
12500 X of EXP is nonzero. */
12501 static rtx
12502 const_scalar_mask_from_tree (scalar_int_mode mode, tree exp)
12503 {
12504 wide_int res = wi::zero (GET_MODE_PRECISION (mode));
12505 tree elt;
12506
12507 /* The result has a fixed number of bits so the input must too. */
12508 unsigned int nunits = VECTOR_CST_NELTS (exp).to_constant ();
12509 for (unsigned int i = 0; i < nunits; ++i)
12510 {
12511 elt = VECTOR_CST_ELT (exp, i);
12512 gcc_assert (TREE_CODE (elt) == INTEGER_CST);
12513 if (integer_all_onesp (elt))
12514 res = wi::set_bit (res, i);
12515 else
12516 gcc_assert (integer_zerop (elt));
12517 }
12518
12519 return immed_wide_int_const (res, mode);
12520 }
12521
12522 /* Return a CONST_VECTOR rtx for a VECTOR_CST tree. */
12523 static rtx
12524 const_vector_from_tree (tree exp)
12525 {
12526 machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
12527
12528 if (initializer_zerop (exp))
12529 return CONST0_RTX (mode);
12530
12531 if (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (exp)))
12532 return const_vector_mask_from_tree (exp);
12533
12534 machine_mode inner = GET_MODE_INNER (mode);
12535
12536 rtx_vector_builder builder (mode, VECTOR_CST_NPATTERNS (exp),
12537 VECTOR_CST_NELTS_PER_PATTERN (exp));
12538 unsigned int count = builder.encoded_nelts ();
12539 for (unsigned int i = 0; i < count; ++i)
12540 {
12541 tree elt = VECTOR_CST_ELT (exp, i);
12542 if (TREE_CODE (elt) == REAL_CST)
12543 builder.quick_push (const_double_from_real_value (TREE_REAL_CST (elt),
12544 inner));
12545 else if (TREE_CODE (elt) == FIXED_CST)
12546 builder.quick_push (CONST_FIXED_FROM_FIXED_VALUE (TREE_FIXED_CST (elt),
12547 inner));
12548 else
12549 builder.quick_push (immed_wide_int_const (wi::to_poly_wide (elt),
12550 inner));
12551 }
12552 return builder.build ();
12553 }
12554
12555 /* Build a decl for a personality function given a language prefix. */
12556
12557 tree
12558 build_personality_function (const char *lang)
12559 {
12560 const char *unwind_and_version;
12561 tree decl, type;
12562 char *name;
12563
12564 switch (targetm_common.except_unwind_info (&global_options))
12565 {
12566 case UI_NONE:
12567 return NULL;
12568 case UI_SJLJ:
12569 unwind_and_version = "_sj0";
12570 break;
12571 case UI_DWARF2:
12572 case UI_TARGET:
12573 unwind_and_version = "_v0";
12574 break;
12575 case UI_SEH:
12576 unwind_and_version = "_seh0";
12577 break;
12578 default:
12579 gcc_unreachable ();
12580 }
12581
12582 name = ACONCAT (("__", lang, "_personality", unwind_and_version, NULL));
12583
12584 type = build_function_type_list (unsigned_type_node,
12585 integer_type_node, integer_type_node,
12586 long_long_unsigned_type_node,
12587 ptr_type_node, ptr_type_node, NULL_TREE);
12588 decl = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL,
12589 get_identifier (name), type);
12590 DECL_ARTIFICIAL (decl) = 1;
12591 DECL_EXTERNAL (decl) = 1;
12592 TREE_PUBLIC (decl) = 1;
12593
12594 /* Zap the nonsensical SYMBOL_REF_DECL for this. What we're left with
12595 are the flags assigned by targetm.encode_section_info. */
12596 SET_SYMBOL_REF_DECL (XEXP (DECL_RTL (decl), 0), NULL);
12597
12598 return decl;
12599 }
12600
12601 /* Extracts the personality function of DECL and returns the corresponding
12602 libfunc. */
12603
12604 rtx
12605 get_personality_function (tree decl)
12606 {
12607 tree personality = DECL_FUNCTION_PERSONALITY (decl);
12608 enum eh_personality_kind pk;
12609
12610 pk = function_needs_eh_personality (DECL_STRUCT_FUNCTION (decl));
12611 if (pk == eh_personality_none)
12612 return NULL;
12613
12614 if (!personality
12615 && pk == eh_personality_any)
12616 personality = lang_hooks.eh_personality ();
12617
12618 if (pk == eh_personality_lang)
12619 gcc_assert (personality != NULL_TREE);
12620
12621 return XEXP (DECL_RTL (personality), 0);
12622 }
12623
12624 /* Returns a tree for the size of EXP in bytes. */
12625
12626 static tree
12627 tree_expr_size (const_tree exp)
12628 {
12629 if (DECL_P (exp)
12630 && DECL_SIZE_UNIT (exp) != 0)
12631 return DECL_SIZE_UNIT (exp);
12632 else
12633 return size_in_bytes (TREE_TYPE (exp));
12634 }
12635
12636 /* Return an rtx for the size in bytes of the value of EXP. */
12637
12638 rtx
12639 expr_size (tree exp)
12640 {
12641 tree size;
12642
12643 if (TREE_CODE (exp) == WITH_SIZE_EXPR)
12644 size = TREE_OPERAND (exp, 1);
12645 else
12646 {
12647 size = tree_expr_size (exp);
12648 gcc_assert (size);
12649 gcc_assert (size == SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, exp));
12650 }
12651
12652 return expand_expr (size, NULL_RTX, TYPE_MODE (sizetype), EXPAND_NORMAL);
12653 }
12654
12655 /* Return a wide integer for the size in bytes of the value of EXP, or -1
12656 if the size can vary or is larger than an integer. */
12657
12658 static HOST_WIDE_INT
12659 int_expr_size (tree exp)
12660 {
12661 tree size;
12662
12663 if (TREE_CODE (exp) == WITH_SIZE_EXPR)
12664 size = TREE_OPERAND (exp, 1);
12665 else
12666 {
12667 size = tree_expr_size (exp);
12668 gcc_assert (size);
12669 }
12670
12671 if (size == 0 || !tree_fits_shwi_p (size))
12672 return -1;
12673
12674 return tree_to_shwi (size);
12675 }