Mercurial > hg > CbC > CbC_gcc
comparison gcc/expr.c @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children | 58ad6c70ea60 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a06113de4d67 |
---|---|
1 /* Convert tree expression to rtl instructions, for GNU compiler. | |
2 Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, | |
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 | |
4 Free Software Foundation, Inc. | |
5 | |
6 This file is part of GCC. | |
7 | |
8 GCC is free software; you can redistribute it and/or modify it under | |
9 the terms of the GNU General Public License as published by the Free | |
10 Software Foundation; either version 3, or (at your option) any later | |
11 version. | |
12 | |
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with GCC; see the file COPYING3. If not see | |
20 <http://www.gnu.org/licenses/>. */ | |
21 | |
22 #include "config.h" | |
23 #include "system.h" | |
24 #include "coretypes.h" | |
25 #include "tm.h" | |
26 #include "machmode.h" | |
27 #include "real.h" | |
28 #include "rtl.h" | |
29 #include "tree.h" | |
30 #include "flags.h" | |
31 #include "regs.h" | |
32 #include "hard-reg-set.h" | |
33 #include "except.h" | |
34 #include "function.h" | |
35 #include "insn-config.h" | |
36 #include "insn-attr.h" | |
37 /* Include expr.h after insn-config.h so we get HAVE_conditional_move. */ | |
38 #include "expr.h" | |
39 #include "optabs.h" | |
40 #include "libfuncs.h" | |
41 #include "recog.h" | |
42 #include "reload.h" | |
43 #include "output.h" | |
44 #include "typeclass.h" | |
45 #include "toplev.h" | |
46 #include "ggc.h" | |
47 #include "langhooks.h" | |
48 #include "intl.h" | |
49 #include "tm_p.h" | |
50 #include "tree-iterator.h" | |
51 #include "tree-pass.h" | |
52 #include "tree-flow.h" | |
53 #include "target.h" | |
54 #include "timevar.h" | |
55 #include "df.h" | |
56 #include "diagnostic.h" | |
57 | |
58 /* Decide whether a function's arguments should be processed | |
59 from first to last or from last to first. | |
60 | |
61 They should if the stack and args grow in opposite directions, but | |
62 only if we have push insns. */ | |
63 | |
64 #ifdef PUSH_ROUNDING | |
65 | |
66 #ifndef PUSH_ARGS_REVERSED | |
67 #if defined (STACK_GROWS_DOWNWARD) != defined (ARGS_GROW_DOWNWARD) | |
68 #define PUSH_ARGS_REVERSED /* If it's last to first. */ | |
69 #endif | |
70 #endif | |
71 | |
72 #endif | |
73 | |
74 #ifndef STACK_PUSH_CODE | |
75 #ifdef STACK_GROWS_DOWNWARD | |
76 #define STACK_PUSH_CODE PRE_DEC | |
77 #else | |
78 #define STACK_PUSH_CODE PRE_INC | |
79 #endif | |
80 #endif | |
81 | |
82 | |
83 /* If this is nonzero, we do not bother generating VOLATILE | |
84 around volatile memory references, and we are willing to | |
85 output indirect addresses. If cse is to follow, we reject | |
86 indirect addresses so a useful potential cse is generated; | |
87 if it is used only once, instruction combination will produce | |
88 the same indirect address eventually. */ | |
89 int cse_not_expected; | |
90 | |
91 /* This structure is used by move_by_pieces to describe the move to | |
92 be performed. */ | |
93 struct move_by_pieces | |
94 { | |
95 rtx to; | |
96 rtx to_addr; | |
97 int autinc_to; | |
98 int explicit_inc_to; | |
99 rtx from; | |
100 rtx from_addr; | |
101 int autinc_from; | |
102 int explicit_inc_from; | |
103 unsigned HOST_WIDE_INT len; | |
104 HOST_WIDE_INT offset; | |
105 int reverse; | |
106 }; | |
107 | |
108 /* This structure is used by store_by_pieces to describe the clear to | |
109 be performed. */ | |
110 | |
111 struct store_by_pieces | |
112 { | |
113 rtx to; | |
114 rtx to_addr; | |
115 int autinc_to; | |
116 int explicit_inc_to; | |
117 unsigned HOST_WIDE_INT len; | |
118 HOST_WIDE_INT offset; | |
119 rtx (*constfun) (void *, HOST_WIDE_INT, enum machine_mode); | |
120 void *constfundata; | |
121 int reverse; | |
122 }; | |
123 | |
124 static unsigned HOST_WIDE_INT move_by_pieces_ninsns (unsigned HOST_WIDE_INT, | |
125 unsigned int, | |
126 unsigned int); | |
127 static void move_by_pieces_1 (rtx (*) (rtx, ...), enum machine_mode, | |
128 struct move_by_pieces *); | |
129 static bool block_move_libcall_safe_for_call_parm (void); | |
130 static bool emit_block_move_via_movmem (rtx, rtx, rtx, unsigned, unsigned, HOST_WIDE_INT); | |
131 static tree emit_block_move_libcall_fn (int); | |
132 static void emit_block_move_via_loop (rtx, rtx, rtx, unsigned); | |
133 static rtx clear_by_pieces_1 (void *, HOST_WIDE_INT, enum machine_mode); | |
134 static void clear_by_pieces (rtx, unsigned HOST_WIDE_INT, unsigned int); | |
135 static void store_by_pieces_1 (struct store_by_pieces *, unsigned int); | |
136 static void store_by_pieces_2 (rtx (*) (rtx, ...), enum machine_mode, | |
137 struct store_by_pieces *); | |
138 static tree clear_storage_libcall_fn (int); | |
139 static rtx compress_float_constant (rtx, rtx); | |
140 static rtx get_subtarget (rtx); | |
141 static void store_constructor_field (rtx, unsigned HOST_WIDE_INT, | |
142 HOST_WIDE_INT, enum machine_mode, | |
143 tree, tree, int, alias_set_type); | |
144 static void store_constructor (tree, rtx, int, HOST_WIDE_INT); | |
145 static rtx store_field (rtx, HOST_WIDE_INT, HOST_WIDE_INT, enum machine_mode, | |
146 tree, tree, alias_set_type, bool); | |
147 | |
148 static unsigned HOST_WIDE_INT highest_pow2_factor_for_target (const_tree, const_tree); | |
149 | |
150 static int is_aligning_offset (const_tree, const_tree); | |
151 static void expand_operands (tree, tree, rtx, rtx*, rtx*, | |
152 enum expand_modifier); | |
153 static rtx reduce_to_bit_field_precision (rtx, rtx, tree); | |
154 static rtx do_store_flag (tree, rtx, enum machine_mode, int); | |
155 #ifdef PUSH_ROUNDING | |
156 static void emit_single_push_insn (enum machine_mode, rtx, tree); | |
157 #endif | |
158 static void do_tablejump (rtx, enum machine_mode, rtx, rtx, rtx); | |
159 static rtx const_vector_from_tree (tree); | |
160 static void write_complex_part (rtx, rtx, bool); | |
161 | |
162 /* Record for each mode whether we can move a register directly to or | |
163 from an object of that mode in memory. If we can't, we won't try | |
164 to use that mode directly when accessing a field of that mode. */ | |
165 | |
166 static char direct_load[NUM_MACHINE_MODES]; | |
167 static char direct_store[NUM_MACHINE_MODES]; | |
168 | |
169 /* Record for each mode whether we can float-extend from memory. */ | |
170 | |
171 static bool float_extend_from_mem[NUM_MACHINE_MODES][NUM_MACHINE_MODES]; | |
172 | |
173 /* This macro is used to determine whether move_by_pieces should be called | |
174 to perform a structure copy. */ | |
175 #ifndef MOVE_BY_PIECES_P | |
176 #define MOVE_BY_PIECES_P(SIZE, ALIGN) \ | |
177 (move_by_pieces_ninsns (SIZE, ALIGN, MOVE_MAX_PIECES + 1) \ | |
178 < (unsigned int) MOVE_RATIO (optimize_insn_for_speed_p ())) | |
179 #endif | |
180 | |
181 /* This macro is used to determine whether clear_by_pieces should be | |
182 called to clear storage. */ | |
183 #ifndef CLEAR_BY_PIECES_P | |
184 #define CLEAR_BY_PIECES_P(SIZE, ALIGN) \ | |
185 (move_by_pieces_ninsns (SIZE, ALIGN, STORE_MAX_PIECES + 1) \ | |
186 < (unsigned int) CLEAR_RATIO (optimize_insn_for_speed_p ())) | |
187 #endif | |
188 | |
189 /* This macro is used to determine whether store_by_pieces should be | |
190 called to "memset" storage with byte values other than zero. */ | |
191 #ifndef SET_BY_PIECES_P | |
192 #define SET_BY_PIECES_P(SIZE, ALIGN) \ | |
193 (move_by_pieces_ninsns (SIZE, ALIGN, STORE_MAX_PIECES + 1) \ | |
194 < (unsigned int) SET_RATIO (optimize_insn_for_speed_p ())) | |
195 #endif | |
196 | |
197 /* This macro is used to determine whether store_by_pieces should be | |
198 called to "memcpy" storage when the source is a constant string. */ | |
199 #ifndef STORE_BY_PIECES_P | |
200 #define STORE_BY_PIECES_P(SIZE, ALIGN) \ | |
201 (move_by_pieces_ninsns (SIZE, ALIGN, STORE_MAX_PIECES + 1) \ | |
202 < (unsigned int) MOVE_RATIO (optimize_insn_for_speed_p ())) | |
203 #endif | |
204 | |
205 /* This array records the insn_code of insns to perform block moves. */ | |
206 enum insn_code movmem_optab[NUM_MACHINE_MODES]; | |
207 | |
208 /* This array records the insn_code of insns to perform block sets. */ | |
209 enum insn_code setmem_optab[NUM_MACHINE_MODES]; | |
210 | |
211 /* These arrays record the insn_code of three different kinds of insns | |
212 to perform block compares. */ | |
213 enum insn_code cmpstr_optab[NUM_MACHINE_MODES]; | |
214 enum insn_code cmpstrn_optab[NUM_MACHINE_MODES]; | |
215 enum insn_code cmpmem_optab[NUM_MACHINE_MODES]; | |
216 | |
217 /* Synchronization primitives. */ | |
218 enum insn_code sync_add_optab[NUM_MACHINE_MODES]; | |
219 enum insn_code sync_sub_optab[NUM_MACHINE_MODES]; | |
220 enum insn_code sync_ior_optab[NUM_MACHINE_MODES]; | |
221 enum insn_code sync_and_optab[NUM_MACHINE_MODES]; | |
222 enum insn_code sync_xor_optab[NUM_MACHINE_MODES]; | |
223 enum insn_code sync_nand_optab[NUM_MACHINE_MODES]; | |
224 enum insn_code sync_old_add_optab[NUM_MACHINE_MODES]; | |
225 enum insn_code sync_old_sub_optab[NUM_MACHINE_MODES]; | |
226 enum insn_code sync_old_ior_optab[NUM_MACHINE_MODES]; | |
227 enum insn_code sync_old_and_optab[NUM_MACHINE_MODES]; | |
228 enum insn_code sync_old_xor_optab[NUM_MACHINE_MODES]; | |
229 enum insn_code sync_old_nand_optab[NUM_MACHINE_MODES]; | |
230 enum insn_code sync_new_add_optab[NUM_MACHINE_MODES]; | |
231 enum insn_code sync_new_sub_optab[NUM_MACHINE_MODES]; | |
232 enum insn_code sync_new_ior_optab[NUM_MACHINE_MODES]; | |
233 enum insn_code sync_new_and_optab[NUM_MACHINE_MODES]; | |
234 enum insn_code sync_new_xor_optab[NUM_MACHINE_MODES]; | |
235 enum insn_code sync_new_nand_optab[NUM_MACHINE_MODES]; | |
236 enum insn_code sync_compare_and_swap[NUM_MACHINE_MODES]; | |
237 enum insn_code sync_compare_and_swap_cc[NUM_MACHINE_MODES]; | |
238 enum insn_code sync_lock_test_and_set[NUM_MACHINE_MODES]; | |
239 enum insn_code sync_lock_release[NUM_MACHINE_MODES]; | |
240 | |
241 /* SLOW_UNALIGNED_ACCESS is nonzero if unaligned accesses are very slow. */ | |
242 | |
243 #ifndef SLOW_UNALIGNED_ACCESS | |
244 #define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) STRICT_ALIGNMENT | |
245 #endif | |
246 | |
247 /* This is run to set up which modes can be used | |
248 directly in memory and to initialize the block move optab. It is run | |
249 at the beginning of compilation and when the target is reinitialized. */ | |
250 | |
251 void | |
252 init_expr_target (void) | |
253 { | |
254 rtx insn, pat; | |
255 enum machine_mode mode; | |
256 int num_clobbers; | |
257 rtx mem, mem1; | |
258 rtx reg; | |
259 | |
260 /* Try indexing by frame ptr and try by stack ptr. | |
261 It is known that on the Convex the stack ptr isn't a valid index. | |
262 With luck, one or the other is valid on any machine. */ | |
263 mem = gen_rtx_MEM (VOIDmode, stack_pointer_rtx); | |
264 mem1 = gen_rtx_MEM (VOIDmode, frame_pointer_rtx); | |
265 | |
266 /* A scratch register we can modify in-place below to avoid | |
267 useless RTL allocations. */ | |
268 reg = gen_rtx_REG (VOIDmode, -1); | |
269 | |
270 insn = rtx_alloc (INSN); | |
271 pat = gen_rtx_SET (0, NULL_RTX, NULL_RTX); | |
272 PATTERN (insn) = pat; | |
273 | |
274 for (mode = VOIDmode; (int) mode < NUM_MACHINE_MODES; | |
275 mode = (enum machine_mode) ((int) mode + 1)) | |
276 { | |
277 int regno; | |
278 | |
279 direct_load[(int) mode] = direct_store[(int) mode] = 0; | |
280 PUT_MODE (mem, mode); | |
281 PUT_MODE (mem1, mode); | |
282 PUT_MODE (reg, mode); | |
283 | |
284 /* See if there is some register that can be used in this mode and | |
285 directly loaded or stored from memory. */ | |
286 | |
287 if (mode != VOIDmode && mode != BLKmode) | |
288 for (regno = 0; regno < FIRST_PSEUDO_REGISTER | |
289 && (direct_load[(int) mode] == 0 || direct_store[(int) mode] == 0); | |
290 regno++) | |
291 { | |
292 if (! HARD_REGNO_MODE_OK (regno, mode)) | |
293 continue; | |
294 | |
295 SET_REGNO (reg, regno); | |
296 | |
297 SET_SRC (pat) = mem; | |
298 SET_DEST (pat) = reg; | |
299 if (recog (pat, insn, &num_clobbers) >= 0) | |
300 direct_load[(int) mode] = 1; | |
301 | |
302 SET_SRC (pat) = mem1; | |
303 SET_DEST (pat) = reg; | |
304 if (recog (pat, insn, &num_clobbers) >= 0) | |
305 direct_load[(int) mode] = 1; | |
306 | |
307 SET_SRC (pat) = reg; | |
308 SET_DEST (pat) = mem; | |
309 if (recog (pat, insn, &num_clobbers) >= 0) | |
310 direct_store[(int) mode] = 1; | |
311 | |
312 SET_SRC (pat) = reg; | |
313 SET_DEST (pat) = mem1; | |
314 if (recog (pat, insn, &num_clobbers) >= 0) | |
315 direct_store[(int) mode] = 1; | |
316 } | |
317 } | |
318 | |
319 mem = gen_rtx_MEM (VOIDmode, gen_rtx_raw_REG (Pmode, 10000)); | |
320 | |
321 for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode; | |
322 mode = GET_MODE_WIDER_MODE (mode)) | |
323 { | |
324 enum machine_mode srcmode; | |
325 for (srcmode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); srcmode != mode; | |
326 srcmode = GET_MODE_WIDER_MODE (srcmode)) | |
327 { | |
328 enum insn_code ic; | |
329 | |
330 ic = can_extend_p (mode, srcmode, 0); | |
331 if (ic == CODE_FOR_nothing) | |
332 continue; | |
333 | |
334 PUT_MODE (mem, srcmode); | |
335 | |
336 if ((*insn_data[ic].operand[1].predicate) (mem, srcmode)) | |
337 float_extend_from_mem[mode][srcmode] = true; | |
338 } | |
339 } | |
340 } | |
341 | |
342 /* This is run at the start of compiling a function. */ | |
343 | |
344 void | |
345 init_expr (void) | |
346 { | |
347 memset (&crtl->expr, 0, sizeof (crtl->expr)); | |
348 } | |
349 | |
350 /* Copy data from FROM to TO, where the machine modes are not the same. | |
351 Both modes may be integer, or both may be floating, or both may be | |
352 fixed-point. | |
353 UNSIGNEDP should be nonzero if FROM is an unsigned type. | |
354 This causes zero-extension instead of sign-extension. */ | |
355 | |
356 void | |
357 convert_move (rtx to, rtx from, int unsignedp) | |
358 { | |
359 enum machine_mode to_mode = GET_MODE (to); | |
360 enum machine_mode from_mode = GET_MODE (from); | |
361 int to_real = SCALAR_FLOAT_MODE_P (to_mode); | |
362 int from_real = SCALAR_FLOAT_MODE_P (from_mode); | |
363 enum insn_code code; | |
364 rtx libcall; | |
365 | |
366 /* rtx code for making an equivalent value. */ | |
367 enum rtx_code equiv_code = (unsignedp < 0 ? UNKNOWN | |
368 : (unsignedp ? ZERO_EXTEND : SIGN_EXTEND)); | |
369 | |
370 | |
371 gcc_assert (to_real == from_real); | |
372 gcc_assert (to_mode != BLKmode); | |
373 gcc_assert (from_mode != BLKmode); | |
374 | |
375 /* If the source and destination are already the same, then there's | |
376 nothing to do. */ | |
377 if (to == from) | |
378 return; | |
379 | |
380 /* If FROM is a SUBREG that indicates that we have already done at least | |
381 the required extension, strip it. We don't handle such SUBREGs as | |
382 TO here. */ | |
383 | |
384 if (GET_CODE (from) == SUBREG && SUBREG_PROMOTED_VAR_P (from) | |
385 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (from))) | |
386 >= GET_MODE_SIZE (to_mode)) | |
387 && SUBREG_PROMOTED_UNSIGNED_P (from) == unsignedp) | |
388 from = gen_lowpart (to_mode, from), from_mode = to_mode; | |
389 | |
390 gcc_assert (GET_CODE (to) != SUBREG || !SUBREG_PROMOTED_VAR_P (to)); | |
391 | |
392 if (to_mode == from_mode | |
393 || (from_mode == VOIDmode && CONSTANT_P (from))) | |
394 { | |
395 emit_move_insn (to, from); | |
396 return; | |
397 } | |
398 | |
399 if (VECTOR_MODE_P (to_mode) || VECTOR_MODE_P (from_mode)) | |
400 { | |
401 gcc_assert (GET_MODE_BITSIZE (from_mode) == GET_MODE_BITSIZE (to_mode)); | |
402 | |
403 if (VECTOR_MODE_P (to_mode)) | |
404 from = simplify_gen_subreg (to_mode, from, GET_MODE (from), 0); | |
405 else | |
406 to = simplify_gen_subreg (from_mode, to, GET_MODE (to), 0); | |
407 | |
408 emit_move_insn (to, from); | |
409 return; | |
410 } | |
411 | |
412 if (GET_CODE (to) == CONCAT && GET_CODE (from) == CONCAT) | |
413 { | |
414 convert_move (XEXP (to, 0), XEXP (from, 0), unsignedp); | |
415 convert_move (XEXP (to, 1), XEXP (from, 1), unsignedp); | |
416 return; | |
417 } | |
418 | |
419 if (to_real) | |
420 { | |
421 rtx value, insns; | |
422 convert_optab tab; | |
423 | |
424 gcc_assert ((GET_MODE_PRECISION (from_mode) | |
425 != GET_MODE_PRECISION (to_mode)) | |
426 || (DECIMAL_FLOAT_MODE_P (from_mode) | |
427 != DECIMAL_FLOAT_MODE_P (to_mode))); | |
428 | |
429 if (GET_MODE_PRECISION (from_mode) == GET_MODE_PRECISION (to_mode)) | |
430 /* Conversion between decimal float and binary float, same size. */ | |
431 tab = DECIMAL_FLOAT_MODE_P (from_mode) ? trunc_optab : sext_optab; | |
432 else if (GET_MODE_PRECISION (from_mode) < GET_MODE_PRECISION (to_mode)) | |
433 tab = sext_optab; | |
434 else | |
435 tab = trunc_optab; | |
436 | |
437 /* Try converting directly if the insn is supported. */ | |
438 | |
439 code = convert_optab_handler (tab, to_mode, from_mode)->insn_code; | |
440 if (code != CODE_FOR_nothing) | |
441 { | |
442 emit_unop_insn (code, to, from, | |
443 tab == sext_optab ? FLOAT_EXTEND : FLOAT_TRUNCATE); | |
444 return; | |
445 } | |
446 | |
447 /* Otherwise use a libcall. */ | |
448 libcall = convert_optab_libfunc (tab, to_mode, from_mode); | |
449 | |
450 /* Is this conversion implemented yet? */ | |
451 gcc_assert (libcall); | |
452 | |
453 start_sequence (); | |
454 value = emit_library_call_value (libcall, NULL_RTX, LCT_CONST, to_mode, | |
455 1, from, from_mode); | |
456 insns = get_insns (); | |
457 end_sequence (); | |
458 emit_libcall_block (insns, to, value, | |
459 tab == trunc_optab ? gen_rtx_FLOAT_TRUNCATE (to_mode, | |
460 from) | |
461 : gen_rtx_FLOAT_EXTEND (to_mode, from)); | |
462 return; | |
463 } | |
464 | |
465 /* Handle pointer conversion. */ /* SPEE 900220. */ | |
466 /* Targets are expected to provide conversion insns between PxImode and | |
467 xImode for all MODE_PARTIAL_INT modes they use, but no others. */ | |
468 if (GET_MODE_CLASS (to_mode) == MODE_PARTIAL_INT) | |
469 { | |
470 enum machine_mode full_mode | |
471 = smallest_mode_for_size (GET_MODE_BITSIZE (to_mode), MODE_INT); | |
472 | |
473 gcc_assert (convert_optab_handler (trunc_optab, to_mode, full_mode)->insn_code | |
474 != CODE_FOR_nothing); | |
475 | |
476 if (full_mode != from_mode) | |
477 from = convert_to_mode (full_mode, from, unsignedp); | |
478 emit_unop_insn (convert_optab_handler (trunc_optab, to_mode, full_mode)->insn_code, | |
479 to, from, UNKNOWN); | |
480 return; | |
481 } | |
482 if (GET_MODE_CLASS (from_mode) == MODE_PARTIAL_INT) | |
483 { | |
484 rtx new_from; | |
485 enum machine_mode full_mode | |
486 = smallest_mode_for_size (GET_MODE_BITSIZE (from_mode), MODE_INT); | |
487 | |
488 gcc_assert (convert_optab_handler (sext_optab, full_mode, from_mode)->insn_code | |
489 != CODE_FOR_nothing); | |
490 | |
491 if (to_mode == full_mode) | |
492 { | |
493 emit_unop_insn (convert_optab_handler (sext_optab, full_mode, from_mode)->insn_code, | |
494 to, from, UNKNOWN); | |
495 return; | |
496 } | |
497 | |
498 new_from = gen_reg_rtx (full_mode); | |
499 emit_unop_insn (convert_optab_handler (sext_optab, full_mode, from_mode)->insn_code, | |
500 new_from, from, UNKNOWN); | |
501 | |
502 /* else proceed to integer conversions below. */ | |
503 from_mode = full_mode; | |
504 from = new_from; | |
505 } | |
506 | |
507 /* Make sure both are fixed-point modes or both are not. */ | |
508 gcc_assert (ALL_SCALAR_FIXED_POINT_MODE_P (from_mode) == | |
509 ALL_SCALAR_FIXED_POINT_MODE_P (to_mode)); | |
510 if (ALL_SCALAR_FIXED_POINT_MODE_P (from_mode)) | |
511 { | |
512 /* If we widen from_mode to to_mode and they are in the same class, | |
513 we won't saturate the result. | |
514 Otherwise, always saturate the result to play safe. */ | |
515 if (GET_MODE_CLASS (from_mode) == GET_MODE_CLASS (to_mode) | |
516 && GET_MODE_SIZE (from_mode) < GET_MODE_SIZE (to_mode)) | |
517 expand_fixed_convert (to, from, 0, 0); | |
518 else | |
519 expand_fixed_convert (to, from, 0, 1); | |
520 return; | |
521 } | |
522 | |
523 /* Now both modes are integers. */ | |
524 | |
525 /* Handle expanding beyond a word. */ | |
526 if (GET_MODE_BITSIZE (from_mode) < GET_MODE_BITSIZE (to_mode) | |
527 && GET_MODE_BITSIZE (to_mode) > BITS_PER_WORD) | |
528 { | |
529 rtx insns; | |
530 rtx lowpart; | |
531 rtx fill_value; | |
532 rtx lowfrom; | |
533 int i; | |
534 enum machine_mode lowpart_mode; | |
535 int nwords = CEIL (GET_MODE_SIZE (to_mode), UNITS_PER_WORD); | |
536 | |
537 /* Try converting directly if the insn is supported. */ | |
538 if ((code = can_extend_p (to_mode, from_mode, unsignedp)) | |
539 != CODE_FOR_nothing) | |
540 { | |
541 /* If FROM is a SUBREG, put it into a register. Do this | |
542 so that we always generate the same set of insns for | |
543 better cse'ing; if an intermediate assignment occurred, | |
544 we won't be doing the operation directly on the SUBREG. */ | |
545 if (optimize > 0 && GET_CODE (from) == SUBREG) | |
546 from = force_reg (from_mode, from); | |
547 emit_unop_insn (code, to, from, equiv_code); | |
548 return; | |
549 } | |
550 /* Next, try converting via full word. */ | |
551 else if (GET_MODE_BITSIZE (from_mode) < BITS_PER_WORD | |
552 && ((code = can_extend_p (to_mode, word_mode, unsignedp)) | |
553 != CODE_FOR_nothing)) | |
554 { | |
555 rtx word_to = gen_reg_rtx (word_mode); | |
556 if (REG_P (to)) | |
557 { | |
558 if (reg_overlap_mentioned_p (to, from)) | |
559 from = force_reg (from_mode, from); | |
560 emit_clobber (to); | |
561 } | |
562 convert_move (word_to, from, unsignedp); | |
563 emit_unop_insn (code, to, word_to, equiv_code); | |
564 return; | |
565 } | |
566 | |
567 /* No special multiword conversion insn; do it by hand. */ | |
568 start_sequence (); | |
569 | |
570 /* Since we will turn this into a no conflict block, we must ensure | |
571 that the source does not overlap the target. */ | |
572 | |
573 if (reg_overlap_mentioned_p (to, from)) | |
574 from = force_reg (from_mode, from); | |
575 | |
576 /* Get a copy of FROM widened to a word, if necessary. */ | |
577 if (GET_MODE_BITSIZE (from_mode) < BITS_PER_WORD) | |
578 lowpart_mode = word_mode; | |
579 else | |
580 lowpart_mode = from_mode; | |
581 | |
582 lowfrom = convert_to_mode (lowpart_mode, from, unsignedp); | |
583 | |
584 lowpart = gen_lowpart (lowpart_mode, to); | |
585 emit_move_insn (lowpart, lowfrom); | |
586 | |
587 /* Compute the value to put in each remaining word. */ | |
588 if (unsignedp) | |
589 fill_value = const0_rtx; | |
590 else | |
591 { | |
592 #ifdef HAVE_slt | |
593 if (HAVE_slt | |
594 && insn_data[(int) CODE_FOR_slt].operand[0].mode == word_mode | |
595 && STORE_FLAG_VALUE == -1) | |
596 { | |
597 emit_cmp_insn (lowfrom, const0_rtx, NE, NULL_RTX, | |
598 lowpart_mode, 0); | |
599 fill_value = gen_reg_rtx (word_mode); | |
600 emit_insn (gen_slt (fill_value)); | |
601 } | |
602 else | |
603 #endif | |
604 { | |
605 fill_value | |
606 = expand_shift (RSHIFT_EXPR, lowpart_mode, lowfrom, | |
607 size_int (GET_MODE_BITSIZE (lowpart_mode) - 1), | |
608 NULL_RTX, 0); | |
609 fill_value = convert_to_mode (word_mode, fill_value, 1); | |
610 } | |
611 } | |
612 | |
613 /* Fill the remaining words. */ | |
614 for (i = GET_MODE_SIZE (lowpart_mode) / UNITS_PER_WORD; i < nwords; i++) | |
615 { | |
616 int index = (WORDS_BIG_ENDIAN ? nwords - i - 1 : i); | |
617 rtx subword = operand_subword (to, index, 1, to_mode); | |
618 | |
619 gcc_assert (subword); | |
620 | |
621 if (fill_value != subword) | |
622 emit_move_insn (subword, fill_value); | |
623 } | |
624 | |
625 insns = get_insns (); | |
626 end_sequence (); | |
627 | |
628 emit_insn (insns); | |
629 return; | |
630 } | |
631 | |
632 /* Truncating multi-word to a word or less. */ | |
633 if (GET_MODE_BITSIZE (from_mode) > BITS_PER_WORD | |
634 && GET_MODE_BITSIZE (to_mode) <= BITS_PER_WORD) | |
635 { | |
636 if (!((MEM_P (from) | |
637 && ! MEM_VOLATILE_P (from) | |
638 && direct_load[(int) to_mode] | |
639 && ! mode_dependent_address_p (XEXP (from, 0))) | |
640 || REG_P (from) | |
641 || GET_CODE (from) == SUBREG)) | |
642 from = force_reg (from_mode, from); | |
643 convert_move (to, gen_lowpart (word_mode, from), 0); | |
644 return; | |
645 } | |
646 | |
647 /* Now follow all the conversions between integers | |
648 no more than a word long. */ | |
649 | |
650 /* For truncation, usually we can just refer to FROM in a narrower mode. */ | |
651 if (GET_MODE_BITSIZE (to_mode) < GET_MODE_BITSIZE (from_mode) | |
652 && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (to_mode), | |
653 GET_MODE_BITSIZE (from_mode))) | |
654 { | |
655 if (!((MEM_P (from) | |
656 && ! MEM_VOLATILE_P (from) | |
657 && direct_load[(int) to_mode] | |
658 && ! mode_dependent_address_p (XEXP (from, 0))) | |
659 || REG_P (from) | |
660 || GET_CODE (from) == SUBREG)) | |
661 from = force_reg (from_mode, from); | |
662 if (REG_P (from) && REGNO (from) < FIRST_PSEUDO_REGISTER | |
663 && ! HARD_REGNO_MODE_OK (REGNO (from), to_mode)) | |
664 from = copy_to_reg (from); | |
665 emit_move_insn (to, gen_lowpart (to_mode, from)); | |
666 return; | |
667 } | |
668 | |
669 /* Handle extension. */ | |
670 if (GET_MODE_BITSIZE (to_mode) > GET_MODE_BITSIZE (from_mode)) | |
671 { | |
672 /* Convert directly if that works. */ | |
673 if ((code = can_extend_p (to_mode, from_mode, unsignedp)) | |
674 != CODE_FOR_nothing) | |
675 { | |
676 emit_unop_insn (code, to, from, equiv_code); | |
677 return; | |
678 } | |
679 else | |
680 { | |
681 enum machine_mode intermediate; | |
682 rtx tmp; | |
683 tree shift_amount; | |
684 | |
685 /* Search for a mode to convert via. */ | |
686 for (intermediate = from_mode; intermediate != VOIDmode; | |
687 intermediate = GET_MODE_WIDER_MODE (intermediate)) | |
688 if (((can_extend_p (to_mode, intermediate, unsignedp) | |
689 != CODE_FOR_nothing) | |
690 || (GET_MODE_SIZE (to_mode) < GET_MODE_SIZE (intermediate) | |
691 && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (to_mode), | |
692 GET_MODE_BITSIZE (intermediate)))) | |
693 && (can_extend_p (intermediate, from_mode, unsignedp) | |
694 != CODE_FOR_nothing)) | |
695 { | |
696 convert_move (to, convert_to_mode (intermediate, from, | |
697 unsignedp), unsignedp); | |
698 return; | |
699 } | |
700 | |
701 /* No suitable intermediate mode. | |
702 Generate what we need with shifts. */ | |
703 shift_amount = build_int_cst (NULL_TREE, | |
704 GET_MODE_BITSIZE (to_mode) | |
705 - GET_MODE_BITSIZE (from_mode)); | |
706 from = gen_lowpart (to_mode, force_reg (from_mode, from)); | |
707 tmp = expand_shift (LSHIFT_EXPR, to_mode, from, shift_amount, | |
708 to, unsignedp); | |
709 tmp = expand_shift (RSHIFT_EXPR, to_mode, tmp, shift_amount, | |
710 to, unsignedp); | |
711 if (tmp != to) | |
712 emit_move_insn (to, tmp); | |
713 return; | |
714 } | |
715 } | |
716 | |
717 /* Support special truncate insns for certain modes. */ | |
718 if (convert_optab_handler (trunc_optab, to_mode, from_mode)->insn_code != CODE_FOR_nothing) | |
719 { | |
720 emit_unop_insn (convert_optab_handler (trunc_optab, to_mode, from_mode)->insn_code, | |
721 to, from, UNKNOWN); | |
722 return; | |
723 } | |
724 | |
725 /* Handle truncation of volatile memrefs, and so on; | |
726 the things that couldn't be truncated directly, | |
727 and for which there was no special instruction. | |
728 | |
729 ??? Code above formerly short-circuited this, for most integer | |
730 mode pairs, with a force_reg in from_mode followed by a recursive | |
731 call to this routine. Appears always to have been wrong. */ | |
732 if (GET_MODE_BITSIZE (to_mode) < GET_MODE_BITSIZE (from_mode)) | |
733 { | |
734 rtx temp = force_reg (to_mode, gen_lowpart (to_mode, from)); | |
735 emit_move_insn (to, temp); | |
736 return; | |
737 } | |
738 | |
739 /* Mode combination is not recognized. */ | |
740 gcc_unreachable (); | |
741 } | |
742 | |
743 /* Return an rtx for a value that would result | |
744 from converting X to mode MODE. | |
745 Both X and MODE may be floating, or both integer. | |
746 UNSIGNEDP is nonzero if X is an unsigned value. | |
747 This can be done by referring to a part of X in place | |
748 or by copying to a new temporary with conversion. */ | |
749 | |
750 rtx | |
751 convert_to_mode (enum machine_mode mode, rtx x, int unsignedp) | |
752 { | |
753 return convert_modes (mode, VOIDmode, x, unsignedp); | |
754 } | |
755 | |
756 /* Return an rtx for a value that would result | |
757 from converting X from mode OLDMODE to mode MODE. | |
758 Both modes may be floating, or both integer. | |
759 UNSIGNEDP is nonzero if X is an unsigned value. | |
760 | |
761 This can be done by referring to a part of X in place | |
762 or by copying to a new temporary with conversion. | |
763 | |
764 You can give VOIDmode for OLDMODE, if you are sure X has a nonvoid mode. */ | |
765 | |
766 rtx | |
767 convert_modes (enum machine_mode mode, enum machine_mode oldmode, rtx x, int unsignedp) | |
768 { | |
769 rtx temp; | |
770 | |
771 /* If FROM is a SUBREG that indicates that we have already done at least | |
772 the required extension, strip it. */ | |
773 | |
774 if (GET_CODE (x) == SUBREG && SUBREG_PROMOTED_VAR_P (x) | |
775 && GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) >= GET_MODE_SIZE (mode) | |
776 && SUBREG_PROMOTED_UNSIGNED_P (x) == unsignedp) | |
777 x = gen_lowpart (mode, x); | |
778 | |
779 if (GET_MODE (x) != VOIDmode) | |
780 oldmode = GET_MODE (x); | |
781 | |
782 if (mode == oldmode) | |
783 return x; | |
784 | |
785 /* There is one case that we must handle specially: If we are converting | |
786 a CONST_INT into a mode whose size is twice HOST_BITS_PER_WIDE_INT and | |
787 we are to interpret the constant as unsigned, gen_lowpart will do | |
788 the wrong if the constant appears negative. What we want to do is | |
789 make the high-order word of the constant zero, not all ones. */ | |
790 | |
791 if (unsignedp && GET_MODE_CLASS (mode) == MODE_INT | |
792 && GET_MODE_BITSIZE (mode) == 2 * HOST_BITS_PER_WIDE_INT | |
793 && GET_CODE (x) == CONST_INT && INTVAL (x) < 0) | |
794 { | |
795 HOST_WIDE_INT val = INTVAL (x); | |
796 | |
797 if (oldmode != VOIDmode | |
798 && HOST_BITS_PER_WIDE_INT > GET_MODE_BITSIZE (oldmode)) | |
799 { | |
800 int width = GET_MODE_BITSIZE (oldmode); | |
801 | |
802 /* We need to zero extend VAL. */ | |
803 val &= ((HOST_WIDE_INT) 1 << width) - 1; | |
804 } | |
805 | |
806 return immed_double_const (val, (HOST_WIDE_INT) 0, mode); | |
807 } | |
808 | |
809 /* We can do this with a gen_lowpart if both desired and current modes | |
810 are integer, and this is either a constant integer, a register, or a | |
811 non-volatile MEM. Except for the constant case where MODE is no | |
812 wider than HOST_BITS_PER_WIDE_INT, we must be narrowing the operand. */ | |
813 | |
814 if ((GET_CODE (x) == CONST_INT | |
815 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) | |
816 || (GET_MODE_CLASS (mode) == MODE_INT | |
817 && GET_MODE_CLASS (oldmode) == MODE_INT | |
818 && (GET_CODE (x) == CONST_DOUBLE | |
819 || (GET_MODE_SIZE (mode) <= GET_MODE_SIZE (oldmode) | |
820 && ((MEM_P (x) && ! MEM_VOLATILE_P (x) | |
821 && direct_load[(int) mode]) | |
822 || (REG_P (x) | |
823 && (! HARD_REGISTER_P (x) | |
824 || HARD_REGNO_MODE_OK (REGNO (x), mode)) | |
825 && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode), | |
826 GET_MODE_BITSIZE (GET_MODE (x))))))))) | |
827 { | |
828 /* ?? If we don't know OLDMODE, we have to assume here that | |
829 X does not need sign- or zero-extension. This may not be | |
830 the case, but it's the best we can do. */ | |
831 if (GET_CODE (x) == CONST_INT && oldmode != VOIDmode | |
832 && GET_MODE_SIZE (mode) > GET_MODE_SIZE (oldmode)) | |
833 { | |
834 HOST_WIDE_INT val = INTVAL (x); | |
835 int width = GET_MODE_BITSIZE (oldmode); | |
836 | |
837 /* We must sign or zero-extend in this case. Start by | |
838 zero-extending, then sign extend if we need to. */ | |
839 val &= ((HOST_WIDE_INT) 1 << width) - 1; | |
840 if (! unsignedp | |
841 && (val & ((HOST_WIDE_INT) 1 << (width - 1)))) | |
842 val |= (HOST_WIDE_INT) (-1) << width; | |
843 | |
844 return gen_int_mode (val, mode); | |
845 } | |
846 | |
847 return gen_lowpart (mode, x); | |
848 } | |
849 | |
850 /* Converting from integer constant into mode is always equivalent to an | |
851 subreg operation. */ | |
852 if (VECTOR_MODE_P (mode) && GET_MODE (x) == VOIDmode) | |
853 { | |
854 gcc_assert (GET_MODE_BITSIZE (mode) == GET_MODE_BITSIZE (oldmode)); | |
855 return simplify_gen_subreg (mode, x, oldmode, 0); | |
856 } | |
857 | |
858 temp = gen_reg_rtx (mode); | |
859 convert_move (temp, x, unsignedp); | |
860 return temp; | |
861 } | |
862 | |
863 /* STORE_MAX_PIECES is the number of bytes at a time that we can | |
864 store efficiently. Due to internal GCC limitations, this is | |
865 MOVE_MAX_PIECES limited by the number of bytes GCC can represent | |
866 for an immediate constant. */ | |
867 | |
868 #define STORE_MAX_PIECES MIN (MOVE_MAX_PIECES, 2 * sizeof (HOST_WIDE_INT)) | |
869 | |
870 /* Determine whether the LEN bytes can be moved by using several move | |
871 instructions. Return nonzero if a call to move_by_pieces should | |
872 succeed. */ | |
873 | |
874 int | |
875 can_move_by_pieces (unsigned HOST_WIDE_INT len, | |
876 unsigned int align ATTRIBUTE_UNUSED) | |
877 { | |
878 return MOVE_BY_PIECES_P (len, align); | |
879 } | |
880 | |
881 /* Generate several move instructions to copy LEN bytes from block FROM to | |
882 block TO. (These are MEM rtx's with BLKmode). | |
883 | |
884 If PUSH_ROUNDING is defined and TO is NULL, emit_single_push_insn is | |
885 used to push FROM to the stack. | |
886 | |
887 ALIGN is maximum stack alignment we can assume. | |
888 | |
889 If ENDP is 0 return to, if ENDP is 1 return memory at the end ala | |
890 mempcpy, and if ENDP is 2 return memory the end minus one byte ala | |
891 stpcpy. */ | |
892 | |
893 rtx | |
894 move_by_pieces (rtx to, rtx from, unsigned HOST_WIDE_INT len, | |
895 unsigned int align, int endp) | |
896 { | |
897 struct move_by_pieces data; | |
898 rtx to_addr, from_addr = XEXP (from, 0); | |
899 unsigned int max_size = MOVE_MAX_PIECES + 1; | |
900 enum machine_mode mode = VOIDmode, tmode; | |
901 enum insn_code icode; | |
902 | |
903 align = MIN (to ? MEM_ALIGN (to) : align, MEM_ALIGN (from)); | |
904 | |
905 data.offset = 0; | |
906 data.from_addr = from_addr; | |
907 if (to) | |
908 { | |
909 to_addr = XEXP (to, 0); | |
910 data.to = to; | |
911 data.autinc_to | |
912 = (GET_CODE (to_addr) == PRE_INC || GET_CODE (to_addr) == PRE_DEC | |
913 || GET_CODE (to_addr) == POST_INC || GET_CODE (to_addr) == POST_DEC); | |
914 data.reverse | |
915 = (GET_CODE (to_addr) == PRE_DEC || GET_CODE (to_addr) == POST_DEC); | |
916 } | |
917 else | |
918 { | |
919 to_addr = NULL_RTX; | |
920 data.to = NULL_RTX; | |
921 data.autinc_to = 1; | |
922 #ifdef STACK_GROWS_DOWNWARD | |
923 data.reverse = 1; | |
924 #else | |
925 data.reverse = 0; | |
926 #endif | |
927 } | |
928 data.to_addr = to_addr; | |
929 data.from = from; | |
930 data.autinc_from | |
931 = (GET_CODE (from_addr) == PRE_INC || GET_CODE (from_addr) == PRE_DEC | |
932 || GET_CODE (from_addr) == POST_INC | |
933 || GET_CODE (from_addr) == POST_DEC); | |
934 | |
935 data.explicit_inc_from = 0; | |
936 data.explicit_inc_to = 0; | |
937 if (data.reverse) data.offset = len; | |
938 data.len = len; | |
939 | |
940 /* If copying requires more than two move insns, | |
941 copy addresses to registers (to make displacements shorter) | |
942 and use post-increment if available. */ | |
943 if (!(data.autinc_from && data.autinc_to) | |
944 && move_by_pieces_ninsns (len, align, max_size) > 2) | |
945 { | |
946 /* Find the mode of the largest move... */ | |
947 for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT); | |
948 tmode != VOIDmode; tmode = GET_MODE_WIDER_MODE (tmode)) | |
949 if (GET_MODE_SIZE (tmode) < max_size) | |
950 mode = tmode; | |
951 | |
952 if (USE_LOAD_PRE_DECREMENT (mode) && data.reverse && ! data.autinc_from) | |
953 { | |
954 data.from_addr = copy_addr_to_reg (plus_constant (from_addr, len)); | |
955 data.autinc_from = 1; | |
956 data.explicit_inc_from = -1; | |
957 } | |
958 if (USE_LOAD_POST_INCREMENT (mode) && ! data.autinc_from) | |
959 { | |
960 data.from_addr = copy_addr_to_reg (from_addr); | |
961 data.autinc_from = 1; | |
962 data.explicit_inc_from = 1; | |
963 } | |
964 if (!data.autinc_from && CONSTANT_P (from_addr)) | |
965 data.from_addr = copy_addr_to_reg (from_addr); | |
966 if (USE_STORE_PRE_DECREMENT (mode) && data.reverse && ! data.autinc_to) | |
967 { | |
968 data.to_addr = copy_addr_to_reg (plus_constant (to_addr, len)); | |
969 data.autinc_to = 1; | |
970 data.explicit_inc_to = -1; | |
971 } | |
972 if (USE_STORE_POST_INCREMENT (mode) && ! data.reverse && ! data.autinc_to) | |
973 { | |
974 data.to_addr = copy_addr_to_reg (to_addr); | |
975 data.autinc_to = 1; | |
976 data.explicit_inc_to = 1; | |
977 } | |
978 if (!data.autinc_to && CONSTANT_P (to_addr)) | |
979 data.to_addr = copy_addr_to_reg (to_addr); | |
980 } | |
981 | |
982 tmode = mode_for_size (MOVE_MAX_PIECES * BITS_PER_UNIT, MODE_INT, 1); | |
983 if (align >= GET_MODE_ALIGNMENT (tmode)) | |
984 align = GET_MODE_ALIGNMENT (tmode); | |
985 else | |
986 { | |
987 enum machine_mode xmode; | |
988 | |
989 for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT), xmode = tmode; | |
990 tmode != VOIDmode; | |
991 xmode = tmode, tmode = GET_MODE_WIDER_MODE (tmode)) | |
992 if (GET_MODE_SIZE (tmode) > MOVE_MAX_PIECES | |
993 || SLOW_UNALIGNED_ACCESS (tmode, align)) | |
994 break; | |
995 | |
996 align = MAX (align, GET_MODE_ALIGNMENT (xmode)); | |
997 } | |
998 | |
999 /* First move what we can in the largest integer mode, then go to | |
1000 successively smaller modes. */ | |
1001 | |
1002 while (max_size > 1) | |
1003 { | |
1004 for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT); | |
1005 tmode != VOIDmode; tmode = GET_MODE_WIDER_MODE (tmode)) | |
1006 if (GET_MODE_SIZE (tmode) < max_size) | |
1007 mode = tmode; | |
1008 | |
1009 if (mode == VOIDmode) | |
1010 break; | |
1011 | |
1012 icode = optab_handler (mov_optab, mode)->insn_code; | |
1013 if (icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode)) | |
1014 move_by_pieces_1 (GEN_FCN (icode), mode, &data); | |
1015 | |
1016 max_size = GET_MODE_SIZE (mode); | |
1017 } | |
1018 | |
1019 /* The code above should have handled everything. */ | |
1020 gcc_assert (!data.len); | |
1021 | |
1022 if (endp) | |
1023 { | |
1024 rtx to1; | |
1025 | |
1026 gcc_assert (!data.reverse); | |
1027 if (data.autinc_to) | |
1028 { | |
1029 if (endp == 2) | |
1030 { | |
1031 if (HAVE_POST_INCREMENT && data.explicit_inc_to > 0) | |
1032 emit_insn (gen_add2_insn (data.to_addr, constm1_rtx)); | |
1033 else | |
1034 data.to_addr = copy_addr_to_reg (plus_constant (data.to_addr, | |
1035 -1)); | |
1036 } | |
1037 to1 = adjust_automodify_address (data.to, QImode, data.to_addr, | |
1038 data.offset); | |
1039 } | |
1040 else | |
1041 { | |
1042 if (endp == 2) | |
1043 --data.offset; | |
1044 to1 = adjust_address (data.to, QImode, data.offset); | |
1045 } | |
1046 return to1; | |
1047 } | |
1048 else | |
1049 return data.to; | |
1050 } | |
1051 | |
1052 /* Return number of insns required to move L bytes by pieces. | |
1053 ALIGN (in bits) is maximum alignment we can assume. */ | |
1054 | |
1055 static unsigned HOST_WIDE_INT | |
1056 move_by_pieces_ninsns (unsigned HOST_WIDE_INT l, unsigned int align, | |
1057 unsigned int max_size) | |
1058 { | |
1059 unsigned HOST_WIDE_INT n_insns = 0; | |
1060 enum machine_mode tmode; | |
1061 | |
1062 tmode = mode_for_size (MOVE_MAX_PIECES * BITS_PER_UNIT, MODE_INT, 1); | |
1063 if (align >= GET_MODE_ALIGNMENT (tmode)) | |
1064 align = GET_MODE_ALIGNMENT (tmode); | |
1065 else | |
1066 { | |
1067 enum machine_mode tmode, xmode; | |
1068 | |
1069 for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT), xmode = tmode; | |
1070 tmode != VOIDmode; | |
1071 xmode = tmode, tmode = GET_MODE_WIDER_MODE (tmode)) | |
1072 if (GET_MODE_SIZE (tmode) > MOVE_MAX_PIECES | |
1073 || SLOW_UNALIGNED_ACCESS (tmode, align)) | |
1074 break; | |
1075 | |
1076 align = MAX (align, GET_MODE_ALIGNMENT (xmode)); | |
1077 } | |
1078 | |
1079 while (max_size > 1) | |
1080 { | |
1081 enum machine_mode mode = VOIDmode; | |
1082 enum insn_code icode; | |
1083 | |
1084 for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT); | |
1085 tmode != VOIDmode; tmode = GET_MODE_WIDER_MODE (tmode)) | |
1086 if (GET_MODE_SIZE (tmode) < max_size) | |
1087 mode = tmode; | |
1088 | |
1089 if (mode == VOIDmode) | |
1090 break; | |
1091 | |
1092 icode = optab_handler (mov_optab, mode)->insn_code; | |
1093 if (icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode)) | |
1094 n_insns += l / GET_MODE_SIZE (mode), l %= GET_MODE_SIZE (mode); | |
1095 | |
1096 max_size = GET_MODE_SIZE (mode); | |
1097 } | |
1098 | |
1099 gcc_assert (!l); | |
1100 return n_insns; | |
1101 } | |
1102 | |
1103 /* Subroutine of move_by_pieces. Move as many bytes as appropriate | |
1104 with move instructions for mode MODE. GENFUN is the gen_... function | |
1105 to make a move insn for that mode. DATA has all the other info. */ | |
1106 | |
1107 static void | |
1108 move_by_pieces_1 (rtx (*genfun) (rtx, ...), enum machine_mode mode, | |
1109 struct move_by_pieces *data) | |
1110 { | |
1111 unsigned int size = GET_MODE_SIZE (mode); | |
1112 rtx to1 = NULL_RTX, from1; | |
1113 | |
1114 while (data->len >= size) | |
1115 { | |
1116 if (data->reverse) | |
1117 data->offset -= size; | |
1118 | |
1119 if (data->to) | |
1120 { | |
1121 if (data->autinc_to) | |
1122 to1 = adjust_automodify_address (data->to, mode, data->to_addr, | |
1123 data->offset); | |
1124 else | |
1125 to1 = adjust_address (data->to, mode, data->offset); | |
1126 } | |
1127 | |
1128 if (data->autinc_from) | |
1129 from1 = adjust_automodify_address (data->from, mode, data->from_addr, | |
1130 data->offset); | |
1131 else | |
1132 from1 = adjust_address (data->from, mode, data->offset); | |
1133 | |
1134 if (HAVE_PRE_DECREMENT && data->explicit_inc_to < 0) | |
1135 emit_insn (gen_add2_insn (data->to_addr, | |
1136 GEN_INT (-(HOST_WIDE_INT)size))); | |
1137 if (HAVE_PRE_DECREMENT && data->explicit_inc_from < 0) | |
1138 emit_insn (gen_add2_insn (data->from_addr, | |
1139 GEN_INT (-(HOST_WIDE_INT)size))); | |
1140 | |
1141 if (data->to) | |
1142 emit_insn ((*genfun) (to1, from1)); | |
1143 else | |
1144 { | |
1145 #ifdef PUSH_ROUNDING | |
1146 emit_single_push_insn (mode, from1, NULL); | |
1147 #else | |
1148 gcc_unreachable (); | |
1149 #endif | |
1150 } | |
1151 | |
1152 if (HAVE_POST_INCREMENT && data->explicit_inc_to > 0) | |
1153 emit_insn (gen_add2_insn (data->to_addr, GEN_INT (size))); | |
1154 if (HAVE_POST_INCREMENT && data->explicit_inc_from > 0) | |
1155 emit_insn (gen_add2_insn (data->from_addr, GEN_INT (size))); | |
1156 | |
1157 if (! data->reverse) | |
1158 data->offset += size; | |
1159 | |
1160 data->len -= size; | |
1161 } | |
1162 } | |
1163 | |
1164 /* Emit code to move a block Y to a block X. This may be done with | |
1165 string-move instructions, with multiple scalar move instructions, | |
1166 or with a library call. | |
1167 | |
1168 Both X and Y must be MEM rtx's (perhaps inside VOLATILE) with mode BLKmode. | |
1169 SIZE is an rtx that says how long they are. | |
1170 ALIGN is the maximum alignment we can assume they have. | |
1171 METHOD describes what kind of copy this is, and what mechanisms may be used. | |
1172 | |
1173 Return the address of the new block, if memcpy is called and returns it, | |
1174 0 otherwise. */ | |
1175 | |
1176 rtx | |
1177 emit_block_move_hints (rtx x, rtx y, rtx size, enum block_op_methods method, | |
1178 unsigned int expected_align, HOST_WIDE_INT expected_size) | |
1179 { | |
1180 bool may_use_call; | |
1181 rtx retval = 0; | |
1182 unsigned int align; | |
1183 | |
1184 switch (method) | |
1185 { | |
1186 case BLOCK_OP_NORMAL: | |
1187 case BLOCK_OP_TAILCALL: | |
1188 may_use_call = true; | |
1189 break; | |
1190 | |
1191 case BLOCK_OP_CALL_PARM: | |
1192 may_use_call = block_move_libcall_safe_for_call_parm (); | |
1193 | |
1194 /* Make inhibit_defer_pop nonzero around the library call | |
1195 to force it to pop the arguments right away. */ | |
1196 NO_DEFER_POP; | |
1197 break; | |
1198 | |
1199 case BLOCK_OP_NO_LIBCALL: | |
1200 may_use_call = false; | |
1201 break; | |
1202 | |
1203 default: | |
1204 gcc_unreachable (); | |
1205 } | |
1206 | |
1207 align = MIN (MEM_ALIGN (x), MEM_ALIGN (y)); | |
1208 | |
1209 gcc_assert (MEM_P (x)); | |
1210 gcc_assert (MEM_P (y)); | |
1211 gcc_assert (size); | |
1212 | |
1213 /* Make sure we've got BLKmode addresses; store_one_arg can decide that | |
1214 block copy is more efficient for other large modes, e.g. DCmode. */ | |
1215 x = adjust_address (x, BLKmode, 0); | |
1216 y = adjust_address (y, BLKmode, 0); | |
1217 | |
1218 /* Set MEM_SIZE as appropriate for this block copy. The main place this | |
1219 can be incorrect is coming from __builtin_memcpy. */ | |
1220 if (GET_CODE (size) == CONST_INT) | |
1221 { | |
1222 if (INTVAL (size) == 0) | |
1223 return 0; | |
1224 | |
1225 x = shallow_copy_rtx (x); | |
1226 y = shallow_copy_rtx (y); | |
1227 set_mem_size (x, size); | |
1228 set_mem_size (y, size); | |
1229 } | |
1230 | |
1231 if (GET_CODE (size) == CONST_INT && MOVE_BY_PIECES_P (INTVAL (size), align)) | |
1232 move_by_pieces (x, y, INTVAL (size), align, 0); | |
1233 else if (emit_block_move_via_movmem (x, y, size, align, | |
1234 expected_align, expected_size)) | |
1235 ; | |
1236 else if (may_use_call) | |
1237 retval = emit_block_move_via_libcall (x, y, size, | |
1238 method == BLOCK_OP_TAILCALL); | |
1239 else | |
1240 emit_block_move_via_loop (x, y, size, align); | |
1241 | |
1242 if (method == BLOCK_OP_CALL_PARM) | |
1243 OK_DEFER_POP; | |
1244 | |
1245 return retval; | |
1246 } | |
1247 | |
1248 rtx | |
1249 emit_block_move (rtx x, rtx y, rtx size, enum block_op_methods method) | |
1250 { | |
1251 return emit_block_move_hints (x, y, size, method, 0, -1); | |
1252 } | |
1253 | |
1254 /* A subroutine of emit_block_move. Returns true if calling the | |
1255 block move libcall will not clobber any parameters which may have | |
1256 already been placed on the stack. */ | |
1257 | |
1258 static bool | |
1259 block_move_libcall_safe_for_call_parm (void) | |
1260 { | |
1261 #if defined (REG_PARM_STACK_SPACE) | |
1262 tree fn; | |
1263 #endif | |
1264 | |
1265 /* If arguments are pushed on the stack, then they're safe. */ | |
1266 if (PUSH_ARGS) | |
1267 return true; | |
1268 | |
1269 /* If registers go on the stack anyway, any argument is sure to clobber | |
1270 an outgoing argument. */ | |
1271 #if defined (REG_PARM_STACK_SPACE) | |
1272 fn = emit_block_move_libcall_fn (false); | |
1273 if (OUTGOING_REG_PARM_STACK_SPACE ((!fn ? NULL_TREE : TREE_TYPE (fn))) | |
1274 && REG_PARM_STACK_SPACE (fn) != 0) | |
1275 return false; | |
1276 #endif | |
1277 | |
1278 /* If any argument goes in memory, then it might clobber an outgoing | |
1279 argument. */ | |
1280 { | |
1281 CUMULATIVE_ARGS args_so_far; | |
1282 tree fn, arg; | |
1283 | |
1284 fn = emit_block_move_libcall_fn (false); | |
1285 INIT_CUMULATIVE_ARGS (args_so_far, TREE_TYPE (fn), NULL_RTX, 0, 3); | |
1286 | |
1287 arg = TYPE_ARG_TYPES (TREE_TYPE (fn)); | |
1288 for ( ; arg != void_list_node ; arg = TREE_CHAIN (arg)) | |
1289 { | |
1290 enum machine_mode mode = TYPE_MODE (TREE_VALUE (arg)); | |
1291 rtx tmp = FUNCTION_ARG (args_so_far, mode, NULL_TREE, 1); | |
1292 if (!tmp || !REG_P (tmp)) | |
1293 return false; | |
1294 if (targetm.calls.arg_partial_bytes (&args_so_far, mode, NULL, 1)) | |
1295 return false; | |
1296 FUNCTION_ARG_ADVANCE (args_so_far, mode, NULL_TREE, 1); | |
1297 } | |
1298 } | |
1299 return true; | |
1300 } | |
1301 | |
1302 /* A subroutine of emit_block_move. Expand a movmem pattern; | |
1303 return true if successful. */ | |
1304 | |
1305 static bool | |
1306 emit_block_move_via_movmem (rtx x, rtx y, rtx size, unsigned int align, | |
1307 unsigned int expected_align, HOST_WIDE_INT expected_size) | |
1308 { | |
1309 rtx opalign = GEN_INT (align / BITS_PER_UNIT); | |
1310 int save_volatile_ok = volatile_ok; | |
1311 enum machine_mode mode; | |
1312 | |
1313 if (expected_align < align) | |
1314 expected_align = align; | |
1315 | |
1316 /* Since this is a move insn, we don't care about volatility. */ | |
1317 volatile_ok = 1; | |
1318 | |
1319 /* Try the most limited insn first, because there's no point | |
1320 including more than one in the machine description unless | |
1321 the more limited one has some advantage. */ | |
1322 | |
1323 for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode; | |
1324 mode = GET_MODE_WIDER_MODE (mode)) | |
1325 { | |
1326 enum insn_code code = movmem_optab[(int) mode]; | |
1327 insn_operand_predicate_fn pred; | |
1328 | |
1329 if (code != CODE_FOR_nothing | |
1330 /* We don't need MODE to be narrower than BITS_PER_HOST_WIDE_INT | |
1331 here because if SIZE is less than the mode mask, as it is | |
1332 returned by the macro, it will definitely be less than the | |
1333 actual mode mask. */ | |
1334 && ((GET_CODE (size) == CONST_INT | |
1335 && ((unsigned HOST_WIDE_INT) INTVAL (size) | |
1336 <= (GET_MODE_MASK (mode) >> 1))) | |
1337 || GET_MODE_BITSIZE (mode) >= BITS_PER_WORD) | |
1338 && ((pred = insn_data[(int) code].operand[0].predicate) == 0 | |
1339 || (*pred) (x, BLKmode)) | |
1340 && ((pred = insn_data[(int) code].operand[1].predicate) == 0 | |
1341 || (*pred) (y, BLKmode)) | |
1342 && ((pred = insn_data[(int) code].operand[3].predicate) == 0 | |
1343 || (*pred) (opalign, VOIDmode))) | |
1344 { | |
1345 rtx op2; | |
1346 rtx last = get_last_insn (); | |
1347 rtx pat; | |
1348 | |
1349 op2 = convert_to_mode (mode, size, 1); | |
1350 pred = insn_data[(int) code].operand[2].predicate; | |
1351 if (pred != 0 && ! (*pred) (op2, mode)) | |
1352 op2 = copy_to_mode_reg (mode, op2); | |
1353 | |
1354 /* ??? When called via emit_block_move_for_call, it'd be | |
1355 nice if there were some way to inform the backend, so | |
1356 that it doesn't fail the expansion because it thinks | |
1357 emitting the libcall would be more efficient. */ | |
1358 | |
1359 if (insn_data[(int) code].n_operands == 4) | |
1360 pat = GEN_FCN ((int) code) (x, y, op2, opalign); | |
1361 else | |
1362 pat = GEN_FCN ((int) code) (x, y, op2, opalign, | |
1363 GEN_INT (expected_align | |
1364 / BITS_PER_UNIT), | |
1365 GEN_INT (expected_size)); | |
1366 if (pat) | |
1367 { | |
1368 emit_insn (pat); | |
1369 volatile_ok = save_volatile_ok; | |
1370 return true; | |
1371 } | |
1372 else | |
1373 delete_insns_since (last); | |
1374 } | |
1375 } | |
1376 | |
1377 volatile_ok = save_volatile_ok; | |
1378 return false; | |
1379 } | |
1380 | |
1381 /* A subroutine of emit_block_move. Expand a call to memcpy. | |
1382 Return the return value from memcpy, 0 otherwise. */ | |
1383 | |
1384 rtx | |
1385 emit_block_move_via_libcall (rtx dst, rtx src, rtx size, bool tailcall) | |
1386 { | |
1387 rtx dst_addr, src_addr; | |
1388 tree call_expr, fn, src_tree, dst_tree, size_tree; | |
1389 enum machine_mode size_mode; | |
1390 rtx retval; | |
1391 | |
1392 /* Emit code to copy the addresses of DST and SRC and SIZE into new | |
1393 pseudos. We can then place those new pseudos into a VAR_DECL and | |
1394 use them later. */ | |
1395 | |
1396 dst_addr = copy_to_mode_reg (Pmode, XEXP (dst, 0)); | |
1397 src_addr = copy_to_mode_reg (Pmode, XEXP (src, 0)); | |
1398 | |
1399 dst_addr = convert_memory_address (ptr_mode, dst_addr); | |
1400 src_addr = convert_memory_address (ptr_mode, src_addr); | |
1401 | |
1402 dst_tree = make_tree (ptr_type_node, dst_addr); | |
1403 src_tree = make_tree (ptr_type_node, src_addr); | |
1404 | |
1405 size_mode = TYPE_MODE (sizetype); | |
1406 | |
1407 size = convert_to_mode (size_mode, size, 1); | |
1408 size = copy_to_mode_reg (size_mode, size); | |
1409 | |
1410 /* It is incorrect to use the libcall calling conventions to call | |
1411 memcpy in this context. This could be a user call to memcpy and | |
1412 the user may wish to examine the return value from memcpy. For | |
1413 targets where libcalls and normal calls have different conventions | |
1414 for returning pointers, we could end up generating incorrect code. */ | |
1415 | |
1416 size_tree = make_tree (sizetype, size); | |
1417 | |
1418 fn = emit_block_move_libcall_fn (true); | |
1419 call_expr = build_call_expr (fn, 3, dst_tree, src_tree, size_tree); | |
1420 CALL_EXPR_TAILCALL (call_expr) = tailcall; | |
1421 | |
1422 retval = expand_normal (call_expr); | |
1423 | |
1424 return retval; | |
1425 } | |
1426 | |
1427 /* A subroutine of emit_block_move_via_libcall. Create the tree node | |
1428 for the function we use for block copies. The first time FOR_CALL | |
1429 is true, we call assemble_external. */ | |
1430 | |
1431 static GTY(()) tree block_move_fn; | |
1432 | |
1433 void | |
1434 init_block_move_fn (const char *asmspec) | |
1435 { | |
1436 if (!block_move_fn) | |
1437 { | |
1438 tree args, fn; | |
1439 | |
1440 fn = get_identifier ("memcpy"); | |
1441 args = build_function_type_list (ptr_type_node, ptr_type_node, | |
1442 const_ptr_type_node, sizetype, | |
1443 NULL_TREE); | |
1444 | |
1445 fn = build_decl (FUNCTION_DECL, fn, args); | |
1446 DECL_EXTERNAL (fn) = 1; | |
1447 TREE_PUBLIC (fn) = 1; | |
1448 DECL_ARTIFICIAL (fn) = 1; | |
1449 TREE_NOTHROW (fn) = 1; | |
1450 DECL_VISIBILITY (fn) = VISIBILITY_DEFAULT; | |
1451 DECL_VISIBILITY_SPECIFIED (fn) = 1; | |
1452 | |
1453 block_move_fn = fn; | |
1454 } | |
1455 | |
1456 if (asmspec) | |
1457 set_user_assembler_name (block_move_fn, asmspec); | |
1458 } | |
1459 | |
1460 static tree | |
1461 emit_block_move_libcall_fn (int for_call) | |
1462 { | |
1463 static bool emitted_extern; | |
1464 | |
1465 if (!block_move_fn) | |
1466 init_block_move_fn (NULL); | |
1467 | |
1468 if (for_call && !emitted_extern) | |
1469 { | |
1470 emitted_extern = true; | |
1471 make_decl_rtl (block_move_fn); | |
1472 assemble_external (block_move_fn); | |
1473 } | |
1474 | |
1475 return block_move_fn; | |
1476 } | |
1477 | |
1478 /* A subroutine of emit_block_move. Copy the data via an explicit | |
1479 loop. This is used only when libcalls are forbidden. */ | |
1480 /* ??? It'd be nice to copy in hunks larger than QImode. */ | |
1481 | |
1482 static void | |
1483 emit_block_move_via_loop (rtx x, rtx y, rtx size, | |
1484 unsigned int align ATTRIBUTE_UNUSED) | |
1485 { | |
1486 rtx cmp_label, top_label, iter, x_addr, y_addr, tmp; | |
1487 enum machine_mode iter_mode; | |
1488 | |
1489 iter_mode = GET_MODE (size); | |
1490 if (iter_mode == VOIDmode) | |
1491 iter_mode = word_mode; | |
1492 | |
1493 top_label = gen_label_rtx (); | |
1494 cmp_label = gen_label_rtx (); | |
1495 iter = gen_reg_rtx (iter_mode); | |
1496 | |
1497 emit_move_insn (iter, const0_rtx); | |
1498 | |
1499 x_addr = force_operand (XEXP (x, 0), NULL_RTX); | |
1500 y_addr = force_operand (XEXP (y, 0), NULL_RTX); | |
1501 do_pending_stack_adjust (); | |
1502 | |
1503 emit_jump (cmp_label); | |
1504 emit_label (top_label); | |
1505 | |
1506 tmp = convert_modes (Pmode, iter_mode, iter, true); | |
1507 x_addr = gen_rtx_PLUS (Pmode, x_addr, tmp); | |
1508 y_addr = gen_rtx_PLUS (Pmode, y_addr, tmp); | |
1509 x = change_address (x, QImode, x_addr); | |
1510 y = change_address (y, QImode, y_addr); | |
1511 | |
1512 emit_move_insn (x, y); | |
1513 | |
1514 tmp = expand_simple_binop (iter_mode, PLUS, iter, const1_rtx, iter, | |
1515 true, OPTAB_LIB_WIDEN); | |
1516 if (tmp != iter) | |
1517 emit_move_insn (iter, tmp); | |
1518 | |
1519 emit_label (cmp_label); | |
1520 | |
1521 emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode, | |
1522 true, top_label); | |
1523 } | |
1524 | |
1525 /* Copy all or part of a value X into registers starting at REGNO. | |
1526 The number of registers to be filled is NREGS. */ | |
1527 | |
1528 void | |
1529 move_block_to_reg (int regno, rtx x, int nregs, enum machine_mode mode) | |
1530 { | |
1531 int i; | |
1532 #ifdef HAVE_load_multiple | |
1533 rtx pat; | |
1534 rtx last; | |
1535 #endif | |
1536 | |
1537 if (nregs == 0) | |
1538 return; | |
1539 | |
1540 if (CONSTANT_P (x) && ! LEGITIMATE_CONSTANT_P (x)) | |
1541 x = validize_mem (force_const_mem (mode, x)); | |
1542 | |
1543 /* See if the machine can do this with a load multiple insn. */ | |
1544 #ifdef HAVE_load_multiple | |
1545 if (HAVE_load_multiple) | |
1546 { | |
1547 last = get_last_insn (); | |
1548 pat = gen_load_multiple (gen_rtx_REG (word_mode, regno), x, | |
1549 GEN_INT (nregs)); | |
1550 if (pat) | |
1551 { | |
1552 emit_insn (pat); | |
1553 return; | |
1554 } | |
1555 else | |
1556 delete_insns_since (last); | |
1557 } | |
1558 #endif | |
1559 | |
1560 for (i = 0; i < nregs; i++) | |
1561 emit_move_insn (gen_rtx_REG (word_mode, regno + i), | |
1562 operand_subword_force (x, i, mode)); | |
1563 } | |
1564 | |
1565 /* Copy all or part of a BLKmode value X out of registers starting at REGNO. | |
1566 The number of registers to be filled is NREGS. */ | |
1567 | |
1568 void | |
1569 move_block_from_reg (int regno, rtx x, int nregs) | |
1570 { | |
1571 int i; | |
1572 | |
1573 if (nregs == 0) | |
1574 return; | |
1575 | |
1576 /* See if the machine can do this with a store multiple insn. */ | |
1577 #ifdef HAVE_store_multiple | |
1578 if (HAVE_store_multiple) | |
1579 { | |
1580 rtx last = get_last_insn (); | |
1581 rtx pat = gen_store_multiple (x, gen_rtx_REG (word_mode, regno), | |
1582 GEN_INT (nregs)); | |
1583 if (pat) | |
1584 { | |
1585 emit_insn (pat); | |
1586 return; | |
1587 } | |
1588 else | |
1589 delete_insns_since (last); | |
1590 } | |
1591 #endif | |
1592 | |
1593 for (i = 0; i < nregs; i++) | |
1594 { | |
1595 rtx tem = operand_subword (x, i, 1, BLKmode); | |
1596 | |
1597 gcc_assert (tem); | |
1598 | |
1599 emit_move_insn (tem, gen_rtx_REG (word_mode, regno + i)); | |
1600 } | |
1601 } | |
1602 | |
1603 /* Generate a PARALLEL rtx for a new non-consecutive group of registers from | |
1604 ORIG, where ORIG is a non-consecutive group of registers represented by | |
1605 a PARALLEL. The clone is identical to the original except in that the | |
1606 original set of registers is replaced by a new set of pseudo registers. | |
1607 The new set has the same modes as the original set. */ | |
1608 | |
1609 rtx | |
1610 gen_group_rtx (rtx orig) | |
1611 { | |
1612 int i, length; | |
1613 rtx *tmps; | |
1614 | |
1615 gcc_assert (GET_CODE (orig) == PARALLEL); | |
1616 | |
1617 length = XVECLEN (orig, 0); | |
1618 tmps = XALLOCAVEC (rtx, length); | |
1619 | |
1620 /* Skip a NULL entry in first slot. */ | |
1621 i = XEXP (XVECEXP (orig, 0, 0), 0) ? 0 : 1; | |
1622 | |
1623 if (i) | |
1624 tmps[0] = 0; | |
1625 | |
1626 for (; i < length; i++) | |
1627 { | |
1628 enum machine_mode mode = GET_MODE (XEXP (XVECEXP (orig, 0, i), 0)); | |
1629 rtx offset = XEXP (XVECEXP (orig, 0, i), 1); | |
1630 | |
1631 tmps[i] = gen_rtx_EXPR_LIST (VOIDmode, gen_reg_rtx (mode), offset); | |
1632 } | |
1633 | |
1634 return gen_rtx_PARALLEL (GET_MODE (orig), gen_rtvec_v (length, tmps)); | |
1635 } | |
1636 | |
1637 /* A subroutine of emit_group_load. Arguments as for emit_group_load, | |
1638 except that values are placed in TMPS[i], and must later be moved | |
1639 into corresponding XEXP (XVECEXP (DST, 0, i), 0) element. */ | |
1640 | |
1641 static void | |
1642 emit_group_load_1 (rtx *tmps, rtx dst, rtx orig_src, tree type, int ssize) | |
1643 { | |
1644 rtx src; | |
1645 int start, i; | |
1646 enum machine_mode m = GET_MODE (orig_src); | |
1647 | |
1648 gcc_assert (GET_CODE (dst) == PARALLEL); | |
1649 | |
1650 if (m != VOIDmode | |
1651 && !SCALAR_INT_MODE_P (m) | |
1652 && !MEM_P (orig_src) | |
1653 && GET_CODE (orig_src) != CONCAT) | |
1654 { | |
1655 enum machine_mode imode = int_mode_for_mode (GET_MODE (orig_src)); | |
1656 if (imode == BLKmode) | |
1657 src = assign_stack_temp (GET_MODE (orig_src), ssize, 0); | |
1658 else | |
1659 src = gen_reg_rtx (imode); | |
1660 if (imode != BLKmode) | |
1661 src = gen_lowpart (GET_MODE (orig_src), src); | |
1662 emit_move_insn (src, orig_src); | |
1663 /* ...and back again. */ | |
1664 if (imode != BLKmode) | |
1665 src = gen_lowpart (imode, src); | |
1666 emit_group_load_1 (tmps, dst, src, type, ssize); | |
1667 return; | |
1668 } | |
1669 | |
1670 /* Check for a NULL entry, used to indicate that the parameter goes | |
1671 both on the stack and in registers. */ | |
1672 if (XEXP (XVECEXP (dst, 0, 0), 0)) | |
1673 start = 0; | |
1674 else | |
1675 start = 1; | |
1676 | |
1677 /* Process the pieces. */ | |
1678 for (i = start; i < XVECLEN (dst, 0); i++) | |
1679 { | |
1680 enum machine_mode mode = GET_MODE (XEXP (XVECEXP (dst, 0, i), 0)); | |
1681 HOST_WIDE_INT bytepos = INTVAL (XEXP (XVECEXP (dst, 0, i), 1)); | |
1682 unsigned int bytelen = GET_MODE_SIZE (mode); | |
1683 int shift = 0; | |
1684 | |
1685 /* Handle trailing fragments that run over the size of the struct. */ | |
1686 if (ssize >= 0 && bytepos + (HOST_WIDE_INT) bytelen > ssize) | |
1687 { | |
1688 /* Arrange to shift the fragment to where it belongs. | |
1689 extract_bit_field loads to the lsb of the reg. */ | |
1690 if ( | |
1691 #ifdef BLOCK_REG_PADDING | |
1692 BLOCK_REG_PADDING (GET_MODE (orig_src), type, i == start) | |
1693 == (BYTES_BIG_ENDIAN ? upward : downward) | |
1694 #else | |
1695 BYTES_BIG_ENDIAN | |
1696 #endif | |
1697 ) | |
1698 shift = (bytelen - (ssize - bytepos)) * BITS_PER_UNIT; | |
1699 bytelen = ssize - bytepos; | |
1700 gcc_assert (bytelen > 0); | |
1701 } | |
1702 | |
1703 /* If we won't be loading directly from memory, protect the real source | |
1704 from strange tricks we might play; but make sure that the source can | |
1705 be loaded directly into the destination. */ | |
1706 src = orig_src; | |
1707 if (!MEM_P (orig_src) | |
1708 && (!CONSTANT_P (orig_src) | |
1709 || (GET_MODE (orig_src) != mode | |
1710 && GET_MODE (orig_src) != VOIDmode))) | |
1711 { | |
1712 if (GET_MODE (orig_src) == VOIDmode) | |
1713 src = gen_reg_rtx (mode); | |
1714 else | |
1715 src = gen_reg_rtx (GET_MODE (orig_src)); | |
1716 | |
1717 emit_move_insn (src, orig_src); | |
1718 } | |
1719 | |
1720 /* Optimize the access just a bit. */ | |
1721 if (MEM_P (src) | |
1722 && (! SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (src)) | |
1723 || MEM_ALIGN (src) >= GET_MODE_ALIGNMENT (mode)) | |
1724 && bytepos * BITS_PER_UNIT % GET_MODE_ALIGNMENT (mode) == 0 | |
1725 && bytelen == GET_MODE_SIZE (mode)) | |
1726 { | |
1727 tmps[i] = gen_reg_rtx (mode); | |
1728 emit_move_insn (tmps[i], adjust_address (src, mode, bytepos)); | |
1729 } | |
1730 else if (COMPLEX_MODE_P (mode) | |
1731 && GET_MODE (src) == mode | |
1732 && bytelen == GET_MODE_SIZE (mode)) | |
1733 /* Let emit_move_complex do the bulk of the work. */ | |
1734 tmps[i] = src; | |
1735 else if (GET_CODE (src) == CONCAT) | |
1736 { | |
1737 unsigned int slen = GET_MODE_SIZE (GET_MODE (src)); | |
1738 unsigned int slen0 = GET_MODE_SIZE (GET_MODE (XEXP (src, 0))); | |
1739 | |
1740 if ((bytepos == 0 && bytelen == slen0) | |
1741 || (bytepos != 0 && bytepos + bytelen <= slen)) | |
1742 { | |
1743 /* The following assumes that the concatenated objects all | |
1744 have the same size. In this case, a simple calculation | |
1745 can be used to determine the object and the bit field | |
1746 to be extracted. */ | |
1747 tmps[i] = XEXP (src, bytepos / slen0); | |
1748 if (! CONSTANT_P (tmps[i]) | |
1749 && (!REG_P (tmps[i]) || GET_MODE (tmps[i]) != mode)) | |
1750 tmps[i] = extract_bit_field (tmps[i], bytelen * BITS_PER_UNIT, | |
1751 (bytepos % slen0) * BITS_PER_UNIT, | |
1752 1, NULL_RTX, mode, mode); | |
1753 } | |
1754 else | |
1755 { | |
1756 rtx mem; | |
1757 | |
1758 gcc_assert (!bytepos); | |
1759 mem = assign_stack_temp (GET_MODE (src), slen, 0); | |
1760 emit_move_insn (mem, src); | |
1761 tmps[i] = extract_bit_field (mem, bytelen * BITS_PER_UNIT, | |
1762 0, 1, NULL_RTX, mode, mode); | |
1763 } | |
1764 } | |
1765 /* FIXME: A SIMD parallel will eventually lead to a subreg of a | |
1766 SIMD register, which is currently broken. While we get GCC | |
1767 to emit proper RTL for these cases, let's dump to memory. */ | |
1768 else if (VECTOR_MODE_P (GET_MODE (dst)) | |
1769 && REG_P (src)) | |
1770 { | |
1771 int slen = GET_MODE_SIZE (GET_MODE (src)); | |
1772 rtx mem; | |
1773 | |
1774 mem = assign_stack_temp (GET_MODE (src), slen, 0); | |
1775 emit_move_insn (mem, src); | |
1776 tmps[i] = adjust_address (mem, mode, (int) bytepos); | |
1777 } | |
1778 else if (CONSTANT_P (src) && GET_MODE (dst) != BLKmode | |
1779 && XVECLEN (dst, 0) > 1) | |
1780 tmps[i] = simplify_gen_subreg (mode, src, GET_MODE(dst), bytepos); | |
1781 else if (CONSTANT_P (src)) | |
1782 { | |
1783 HOST_WIDE_INT len = (HOST_WIDE_INT) bytelen; | |
1784 | |
1785 if (len == ssize) | |
1786 tmps[i] = src; | |
1787 else | |
1788 { | |
1789 rtx first, second; | |
1790 | |
1791 gcc_assert (2 * len == ssize); | |
1792 split_double (src, &first, &second); | |
1793 if (i) | |
1794 tmps[i] = second; | |
1795 else | |
1796 tmps[i] = first; | |
1797 } | |
1798 } | |
1799 else if (REG_P (src) && GET_MODE (src) == mode) | |
1800 tmps[i] = src; | |
1801 else | |
1802 tmps[i] = extract_bit_field (src, bytelen * BITS_PER_UNIT, | |
1803 bytepos * BITS_PER_UNIT, 1, NULL_RTX, | |
1804 mode, mode); | |
1805 | |
1806 if (shift) | |
1807 tmps[i] = expand_shift (LSHIFT_EXPR, mode, tmps[i], | |
1808 build_int_cst (NULL_TREE, shift), tmps[i], 0); | |
1809 } | |
1810 } | |
1811 | |
1812 /* Emit code to move a block SRC of type TYPE to a block DST, | |
1813 where DST is non-consecutive registers represented by a PARALLEL. | |
1814 SSIZE represents the total size of block ORIG_SRC in bytes, or -1 | |
1815 if not known. */ | |
1816 | |
1817 void | |
1818 emit_group_load (rtx dst, rtx src, tree type, int ssize) | |
1819 { | |
1820 rtx *tmps; | |
1821 int i; | |
1822 | |
1823 tmps = XALLOCAVEC (rtx, XVECLEN (dst, 0)); | |
1824 emit_group_load_1 (tmps, dst, src, type, ssize); | |
1825 | |
1826 /* Copy the extracted pieces into the proper (probable) hard regs. */ | |
1827 for (i = 0; i < XVECLEN (dst, 0); i++) | |
1828 { | |
1829 rtx d = XEXP (XVECEXP (dst, 0, i), 0); | |
1830 if (d == NULL) | |
1831 continue; | |
1832 emit_move_insn (d, tmps[i]); | |
1833 } | |
1834 } | |
1835 | |
1836 /* Similar, but load SRC into new pseudos in a format that looks like | |
1837 PARALLEL. This can later be fed to emit_group_move to get things | |
1838 in the right place. */ | |
1839 | |
1840 rtx | |
1841 emit_group_load_into_temps (rtx parallel, rtx src, tree type, int ssize) | |
1842 { | |
1843 rtvec vec; | |
1844 int i; | |
1845 | |
1846 vec = rtvec_alloc (XVECLEN (parallel, 0)); | |
1847 emit_group_load_1 (&RTVEC_ELT (vec, 0), parallel, src, type, ssize); | |
1848 | |
1849 /* Convert the vector to look just like the original PARALLEL, except | |
1850 with the computed values. */ | |
1851 for (i = 0; i < XVECLEN (parallel, 0); i++) | |
1852 { | |
1853 rtx e = XVECEXP (parallel, 0, i); | |
1854 rtx d = XEXP (e, 0); | |
1855 | |
1856 if (d) | |
1857 { | |
1858 d = force_reg (GET_MODE (d), RTVEC_ELT (vec, i)); | |
1859 e = alloc_EXPR_LIST (REG_NOTE_KIND (e), d, XEXP (e, 1)); | |
1860 } | |
1861 RTVEC_ELT (vec, i) = e; | |
1862 } | |
1863 | |
1864 return gen_rtx_PARALLEL (GET_MODE (parallel), vec); | |
1865 } | |
1866 | |
1867 /* Emit code to move a block SRC to block DST, where SRC and DST are | |
1868 non-consecutive groups of registers, each represented by a PARALLEL. */ | |
1869 | |
1870 void | |
1871 emit_group_move (rtx dst, rtx src) | |
1872 { | |
1873 int i; | |
1874 | |
1875 gcc_assert (GET_CODE (src) == PARALLEL | |
1876 && GET_CODE (dst) == PARALLEL | |
1877 && XVECLEN (src, 0) == XVECLEN (dst, 0)); | |
1878 | |
1879 /* Skip first entry if NULL. */ | |
1880 for (i = XEXP (XVECEXP (src, 0, 0), 0) ? 0 : 1; i < XVECLEN (src, 0); i++) | |
1881 emit_move_insn (XEXP (XVECEXP (dst, 0, i), 0), | |
1882 XEXP (XVECEXP (src, 0, i), 0)); | |
1883 } | |
1884 | |
1885 /* Move a group of registers represented by a PARALLEL into pseudos. */ | |
1886 | |
1887 rtx | |
1888 emit_group_move_into_temps (rtx src) | |
1889 { | |
1890 rtvec vec = rtvec_alloc (XVECLEN (src, 0)); | |
1891 int i; | |
1892 | |
1893 for (i = 0; i < XVECLEN (src, 0); i++) | |
1894 { | |
1895 rtx e = XVECEXP (src, 0, i); | |
1896 rtx d = XEXP (e, 0); | |
1897 | |
1898 if (d) | |
1899 e = alloc_EXPR_LIST (REG_NOTE_KIND (e), copy_to_reg (d), XEXP (e, 1)); | |
1900 RTVEC_ELT (vec, i) = e; | |
1901 } | |
1902 | |
1903 return gen_rtx_PARALLEL (GET_MODE (src), vec); | |
1904 } | |
1905 | |
1906 /* Emit code to move a block SRC to a block ORIG_DST of type TYPE, | |
1907 where SRC is non-consecutive registers represented by a PARALLEL. | |
1908 SSIZE represents the total size of block ORIG_DST, or -1 if not | |
1909 known. */ | |
1910 | |
1911 void | |
1912 emit_group_store (rtx orig_dst, rtx src, tree type ATTRIBUTE_UNUSED, int ssize) | |
1913 { | |
1914 rtx *tmps, dst; | |
1915 int start, finish, i; | |
1916 enum machine_mode m = GET_MODE (orig_dst); | |
1917 | |
1918 gcc_assert (GET_CODE (src) == PARALLEL); | |
1919 | |
1920 if (!SCALAR_INT_MODE_P (m) | |
1921 && !MEM_P (orig_dst) && GET_CODE (orig_dst) != CONCAT) | |
1922 { | |
1923 enum machine_mode imode = int_mode_for_mode (GET_MODE (orig_dst)); | |
1924 if (imode == BLKmode) | |
1925 dst = assign_stack_temp (GET_MODE (orig_dst), ssize, 0); | |
1926 else | |
1927 dst = gen_reg_rtx (imode); | |
1928 emit_group_store (dst, src, type, ssize); | |
1929 if (imode != BLKmode) | |
1930 dst = gen_lowpart (GET_MODE (orig_dst), dst); | |
1931 emit_move_insn (orig_dst, dst); | |
1932 return; | |
1933 } | |
1934 | |
1935 /* Check for a NULL entry, used to indicate that the parameter goes | |
1936 both on the stack and in registers. */ | |
1937 if (XEXP (XVECEXP (src, 0, 0), 0)) | |
1938 start = 0; | |
1939 else | |
1940 start = 1; | |
1941 finish = XVECLEN (src, 0); | |
1942 | |
1943 tmps = XALLOCAVEC (rtx, finish); | |
1944 | |
1945 /* Copy the (probable) hard regs into pseudos. */ | |
1946 for (i = start; i < finish; i++) | |
1947 { | |
1948 rtx reg = XEXP (XVECEXP (src, 0, i), 0); | |
1949 if (!REG_P (reg) || REGNO (reg) < FIRST_PSEUDO_REGISTER) | |
1950 { | |
1951 tmps[i] = gen_reg_rtx (GET_MODE (reg)); | |
1952 emit_move_insn (tmps[i], reg); | |
1953 } | |
1954 else | |
1955 tmps[i] = reg; | |
1956 } | |
1957 | |
1958 /* If we won't be storing directly into memory, protect the real destination | |
1959 from strange tricks we might play. */ | |
1960 dst = orig_dst; | |
1961 if (GET_CODE (dst) == PARALLEL) | |
1962 { | |
1963 rtx temp; | |
1964 | |
1965 /* We can get a PARALLEL dst if there is a conditional expression in | |
1966 a return statement. In that case, the dst and src are the same, | |
1967 so no action is necessary. */ | |
1968 if (rtx_equal_p (dst, src)) | |
1969 return; | |
1970 | |
1971 /* It is unclear if we can ever reach here, but we may as well handle | |
1972 it. Allocate a temporary, and split this into a store/load to/from | |
1973 the temporary. */ | |
1974 | |
1975 temp = assign_stack_temp (GET_MODE (dst), ssize, 0); | |
1976 emit_group_store (temp, src, type, ssize); | |
1977 emit_group_load (dst, temp, type, ssize); | |
1978 return; | |
1979 } | |
1980 else if (!MEM_P (dst) && GET_CODE (dst) != CONCAT) | |
1981 { | |
1982 enum machine_mode outer = GET_MODE (dst); | |
1983 enum machine_mode inner; | |
1984 HOST_WIDE_INT bytepos; | |
1985 bool done = false; | |
1986 rtx temp; | |
1987 | |
1988 if (!REG_P (dst) || REGNO (dst) < FIRST_PSEUDO_REGISTER) | |
1989 dst = gen_reg_rtx (outer); | |
1990 | |
1991 /* Make life a bit easier for combine. */ | |
1992 /* If the first element of the vector is the low part | |
1993 of the destination mode, use a paradoxical subreg to | |
1994 initialize the destination. */ | |
1995 if (start < finish) | |
1996 { | |
1997 inner = GET_MODE (tmps[start]); | |
1998 bytepos = subreg_lowpart_offset (inner, outer); | |
1999 if (INTVAL (XEXP (XVECEXP (src, 0, start), 1)) == bytepos) | |
2000 { | |
2001 temp = simplify_gen_subreg (outer, tmps[start], | |
2002 inner, 0); | |
2003 if (temp) | |
2004 { | |
2005 emit_move_insn (dst, temp); | |
2006 done = true; | |
2007 start++; | |
2008 } | |
2009 } | |
2010 } | |
2011 | |
2012 /* If the first element wasn't the low part, try the last. */ | |
2013 if (!done | |
2014 && start < finish - 1) | |
2015 { | |
2016 inner = GET_MODE (tmps[finish - 1]); | |
2017 bytepos = subreg_lowpart_offset (inner, outer); | |
2018 if (INTVAL (XEXP (XVECEXP (src, 0, finish - 1), 1)) == bytepos) | |
2019 { | |
2020 temp = simplify_gen_subreg (outer, tmps[finish - 1], | |
2021 inner, 0); | |
2022 if (temp) | |
2023 { | |
2024 emit_move_insn (dst, temp); | |
2025 done = true; | |
2026 finish--; | |
2027 } | |
2028 } | |
2029 } | |
2030 | |
2031 /* Otherwise, simply initialize the result to zero. */ | |
2032 if (!done) | |
2033 emit_move_insn (dst, CONST0_RTX (outer)); | |
2034 } | |
2035 | |
2036 /* Process the pieces. */ | |
2037 for (i = start; i < finish; i++) | |
2038 { | |
2039 HOST_WIDE_INT bytepos = INTVAL (XEXP (XVECEXP (src, 0, i), 1)); | |
2040 enum machine_mode mode = GET_MODE (tmps[i]); | |
2041 unsigned int bytelen = GET_MODE_SIZE (mode); | |
2042 unsigned int adj_bytelen = bytelen; | |
2043 rtx dest = dst; | |
2044 | |
2045 /* Handle trailing fragments that run over the size of the struct. */ | |
2046 if (ssize >= 0 && bytepos + (HOST_WIDE_INT) bytelen > ssize) | |
2047 adj_bytelen = ssize - bytepos; | |
2048 | |
2049 if (GET_CODE (dst) == CONCAT) | |
2050 { | |
2051 if (bytepos + adj_bytelen | |
2052 <= GET_MODE_SIZE (GET_MODE (XEXP (dst, 0)))) | |
2053 dest = XEXP (dst, 0); | |
2054 else if (bytepos >= GET_MODE_SIZE (GET_MODE (XEXP (dst, 0)))) | |
2055 { | |
2056 bytepos -= GET_MODE_SIZE (GET_MODE (XEXP (dst, 0))); | |
2057 dest = XEXP (dst, 1); | |
2058 } | |
2059 else | |
2060 { | |
2061 enum machine_mode dest_mode = GET_MODE (dest); | |
2062 enum machine_mode tmp_mode = GET_MODE (tmps[i]); | |
2063 | |
2064 gcc_assert (bytepos == 0 && XVECLEN (src, 0)); | |
2065 | |
2066 if (GET_MODE_ALIGNMENT (dest_mode) | |
2067 >= GET_MODE_ALIGNMENT (tmp_mode)) | |
2068 { | |
2069 dest = assign_stack_temp (dest_mode, | |
2070 GET_MODE_SIZE (dest_mode), | |
2071 0); | |
2072 emit_move_insn (adjust_address (dest, | |
2073 tmp_mode, | |
2074 bytepos), | |
2075 tmps[i]); | |
2076 dst = dest; | |
2077 } | |
2078 else | |
2079 { | |
2080 dest = assign_stack_temp (tmp_mode, | |
2081 GET_MODE_SIZE (tmp_mode), | |
2082 0); | |
2083 emit_move_insn (dest, tmps[i]); | |
2084 dst = adjust_address (dest, dest_mode, bytepos); | |
2085 } | |
2086 break; | |
2087 } | |
2088 } | |
2089 | |
2090 if (ssize >= 0 && bytepos + (HOST_WIDE_INT) bytelen > ssize) | |
2091 { | |
2092 /* store_bit_field always takes its value from the lsb. | |
2093 Move the fragment to the lsb if it's not already there. */ | |
2094 if ( | |
2095 #ifdef BLOCK_REG_PADDING | |
2096 BLOCK_REG_PADDING (GET_MODE (orig_dst), type, i == start) | |
2097 == (BYTES_BIG_ENDIAN ? upward : downward) | |
2098 #else | |
2099 BYTES_BIG_ENDIAN | |
2100 #endif | |
2101 ) | |
2102 { | |
2103 int shift = (bytelen - (ssize - bytepos)) * BITS_PER_UNIT; | |
2104 tmps[i] = expand_shift (RSHIFT_EXPR, mode, tmps[i], | |
2105 build_int_cst (NULL_TREE, shift), | |
2106 tmps[i], 0); | |
2107 } | |
2108 bytelen = adj_bytelen; | |
2109 } | |
2110 | |
2111 /* Optimize the access just a bit. */ | |
2112 if (MEM_P (dest) | |
2113 && (! SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (dest)) | |
2114 || MEM_ALIGN (dest) >= GET_MODE_ALIGNMENT (mode)) | |
2115 && bytepos * BITS_PER_UNIT % GET_MODE_ALIGNMENT (mode) == 0 | |
2116 && bytelen == GET_MODE_SIZE (mode)) | |
2117 emit_move_insn (adjust_address (dest, mode, bytepos), tmps[i]); | |
2118 else | |
2119 store_bit_field (dest, bytelen * BITS_PER_UNIT, bytepos * BITS_PER_UNIT, | |
2120 mode, tmps[i]); | |
2121 } | |
2122 | |
2123 /* Copy from the pseudo into the (probable) hard reg. */ | |
2124 if (orig_dst != dst) | |
2125 emit_move_insn (orig_dst, dst); | |
2126 } | |
2127 | |
2128 /* Generate code to copy a BLKmode object of TYPE out of a | |
2129 set of registers starting with SRCREG into TGTBLK. If TGTBLK | |
2130 is null, a stack temporary is created. TGTBLK is returned. | |
2131 | |
2132 The purpose of this routine is to handle functions that return | |
2133 BLKmode structures in registers. Some machines (the PA for example) | |
2134 want to return all small structures in registers regardless of the | |
2135 structure's alignment. */ | |
2136 | |
2137 rtx | |
2138 copy_blkmode_from_reg (rtx tgtblk, rtx srcreg, tree type) | |
2139 { | |
2140 unsigned HOST_WIDE_INT bytes = int_size_in_bytes (type); | |
2141 rtx src = NULL, dst = NULL; | |
2142 unsigned HOST_WIDE_INT bitsize = MIN (TYPE_ALIGN (type), BITS_PER_WORD); | |
2143 unsigned HOST_WIDE_INT bitpos, xbitpos, padding_correction = 0; | |
2144 enum machine_mode copy_mode; | |
2145 | |
2146 if (tgtblk == 0) | |
2147 { | |
2148 tgtblk = assign_temp (build_qualified_type (type, | |
2149 (TYPE_QUALS (type) | |
2150 | TYPE_QUAL_CONST)), | |
2151 0, 1, 1); | |
2152 preserve_temp_slots (tgtblk); | |
2153 } | |
2154 | |
2155 /* This code assumes srcreg is at least a full word. If it isn't, copy it | |
2156 into a new pseudo which is a full word. */ | |
2157 | |
2158 if (GET_MODE (srcreg) != BLKmode | |
2159 && GET_MODE_SIZE (GET_MODE (srcreg)) < UNITS_PER_WORD) | |
2160 srcreg = convert_to_mode (word_mode, srcreg, TYPE_UNSIGNED (type)); | |
2161 | |
2162 /* If the structure doesn't take up a whole number of words, see whether | |
2163 SRCREG is padded on the left or on the right. If it's on the left, | |
2164 set PADDING_CORRECTION to the number of bits to skip. | |
2165 | |
2166 In most ABIs, the structure will be returned at the least end of | |
2167 the register, which translates to right padding on little-endian | |
2168 targets and left padding on big-endian targets. The opposite | |
2169 holds if the structure is returned at the most significant | |
2170 end of the register. */ | |
2171 if (bytes % UNITS_PER_WORD != 0 | |
2172 && (targetm.calls.return_in_msb (type) | |
2173 ? !BYTES_BIG_ENDIAN | |
2174 : BYTES_BIG_ENDIAN)) | |
2175 padding_correction | |
2176 = (BITS_PER_WORD - ((bytes % UNITS_PER_WORD) * BITS_PER_UNIT)); | |
2177 | |
2178 /* Copy the structure BITSIZE bits at a time. If the target lives in | |
2179 memory, take care of not reading/writing past its end by selecting | |
2180 a copy mode suited to BITSIZE. This should always be possible given | |
2181 how it is computed. | |
2182 | |
2183 We could probably emit more efficient code for machines which do not use | |
2184 strict alignment, but it doesn't seem worth the effort at the current | |
2185 time. */ | |
2186 | |
2187 copy_mode = word_mode; | |
2188 if (MEM_P (tgtblk)) | |
2189 { | |
2190 enum machine_mode mem_mode = mode_for_size (bitsize, MODE_INT, 1); | |
2191 if (mem_mode != BLKmode) | |
2192 copy_mode = mem_mode; | |
2193 } | |
2194 | |
2195 for (bitpos = 0, xbitpos = padding_correction; | |
2196 bitpos < bytes * BITS_PER_UNIT; | |
2197 bitpos += bitsize, xbitpos += bitsize) | |
2198 { | |
2199 /* We need a new source operand each time xbitpos is on a | |
2200 word boundary and when xbitpos == padding_correction | |
2201 (the first time through). */ | |
2202 if (xbitpos % BITS_PER_WORD == 0 | |
2203 || xbitpos == padding_correction) | |
2204 src = operand_subword_force (srcreg, xbitpos / BITS_PER_WORD, | |
2205 GET_MODE (srcreg)); | |
2206 | |
2207 /* We need a new destination operand each time bitpos is on | |
2208 a word boundary. */ | |
2209 if (bitpos % BITS_PER_WORD == 0) | |
2210 dst = operand_subword (tgtblk, bitpos / BITS_PER_WORD, 1, BLKmode); | |
2211 | |
2212 /* Use xbitpos for the source extraction (right justified) and | |
2213 bitpos for the destination store (left justified). */ | |
2214 store_bit_field (dst, bitsize, bitpos % BITS_PER_WORD, copy_mode, | |
2215 extract_bit_field (src, bitsize, | |
2216 xbitpos % BITS_PER_WORD, 1, | |
2217 NULL_RTX, copy_mode, copy_mode)); | |
2218 } | |
2219 | |
2220 return tgtblk; | |
2221 } | |
2222 | |
2223 /* Add a USE expression for REG to the (possibly empty) list pointed | |
2224 to by CALL_FUSAGE. REG must denote a hard register. */ | |
2225 | |
2226 void | |
2227 use_reg (rtx *call_fusage, rtx reg) | |
2228 { | |
2229 gcc_assert (REG_P (reg) && REGNO (reg) < FIRST_PSEUDO_REGISTER); | |
2230 | |
2231 *call_fusage | |
2232 = gen_rtx_EXPR_LIST (VOIDmode, | |
2233 gen_rtx_USE (VOIDmode, reg), *call_fusage); | |
2234 } | |
2235 | |
2236 /* Add USE expressions to *CALL_FUSAGE for each of NREGS consecutive regs, | |
2237 starting at REGNO. All of these registers must be hard registers. */ | |
2238 | |
2239 void | |
2240 use_regs (rtx *call_fusage, int regno, int nregs) | |
2241 { | |
2242 int i; | |
2243 | |
2244 gcc_assert (regno + nregs <= FIRST_PSEUDO_REGISTER); | |
2245 | |
2246 for (i = 0; i < nregs; i++) | |
2247 use_reg (call_fusage, regno_reg_rtx[regno + i]); | |
2248 } | |
2249 | |
2250 /* Add USE expressions to *CALL_FUSAGE for each REG contained in the | |
2251 PARALLEL REGS. This is for calls that pass values in multiple | |
2252 non-contiguous locations. The Irix 6 ABI has examples of this. */ | |
2253 | |
2254 void | |
2255 use_group_regs (rtx *call_fusage, rtx regs) | |
2256 { | |
2257 int i; | |
2258 | |
2259 for (i = 0; i < XVECLEN (regs, 0); i++) | |
2260 { | |
2261 rtx reg = XEXP (XVECEXP (regs, 0, i), 0); | |
2262 | |
2263 /* A NULL entry means the parameter goes both on the stack and in | |
2264 registers. This can also be a MEM for targets that pass values | |
2265 partially on the stack and partially in registers. */ | |
2266 if (reg != 0 && REG_P (reg)) | |
2267 use_reg (call_fusage, reg); | |
2268 } | |
2269 } | |
2270 | |
2271 | |
2272 /* Determine whether the LEN bytes generated by CONSTFUN can be | |
2273 stored to memory using several move instructions. CONSTFUNDATA is | |
2274 a pointer which will be passed as argument in every CONSTFUN call. | |
2275 ALIGN is maximum alignment we can assume. MEMSETP is true if this is | |
2276 a memset operation and false if it's a copy of a constant string. | |
2277 Return nonzero if a call to store_by_pieces should succeed. */ | |
2278 | |
2279 int | |
2280 can_store_by_pieces (unsigned HOST_WIDE_INT len, | |
2281 rtx (*constfun) (void *, HOST_WIDE_INT, enum machine_mode), | |
2282 void *constfundata, unsigned int align, bool memsetp) | |
2283 { | |
2284 unsigned HOST_WIDE_INT l; | |
2285 unsigned int max_size; | |
2286 HOST_WIDE_INT offset = 0; | |
2287 enum machine_mode mode, tmode; | |
2288 enum insn_code icode; | |
2289 int reverse; | |
2290 rtx cst; | |
2291 | |
2292 if (len == 0) | |
2293 return 1; | |
2294 | |
2295 if (! (memsetp | |
2296 ? SET_BY_PIECES_P (len, align) | |
2297 : STORE_BY_PIECES_P (len, align))) | |
2298 return 0; | |
2299 | |
2300 tmode = mode_for_size (STORE_MAX_PIECES * BITS_PER_UNIT, MODE_INT, 1); | |
2301 if (align >= GET_MODE_ALIGNMENT (tmode)) | |
2302 align = GET_MODE_ALIGNMENT (tmode); | |
2303 else | |
2304 { | |
2305 enum machine_mode xmode; | |
2306 | |
2307 for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT), xmode = tmode; | |
2308 tmode != VOIDmode; | |
2309 xmode = tmode, tmode = GET_MODE_WIDER_MODE (tmode)) | |
2310 if (GET_MODE_SIZE (tmode) > STORE_MAX_PIECES | |
2311 || SLOW_UNALIGNED_ACCESS (tmode, align)) | |
2312 break; | |
2313 | |
2314 align = MAX (align, GET_MODE_ALIGNMENT (xmode)); | |
2315 } | |
2316 | |
2317 /* We would first store what we can in the largest integer mode, then go to | |
2318 successively smaller modes. */ | |
2319 | |
2320 for (reverse = 0; | |
2321 reverse <= (HAVE_PRE_DECREMENT || HAVE_POST_DECREMENT); | |
2322 reverse++) | |
2323 { | |
2324 l = len; | |
2325 mode = VOIDmode; | |
2326 max_size = STORE_MAX_PIECES + 1; | |
2327 while (max_size > 1) | |
2328 { | |
2329 for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT); | |
2330 tmode != VOIDmode; tmode = GET_MODE_WIDER_MODE (tmode)) | |
2331 if (GET_MODE_SIZE (tmode) < max_size) | |
2332 mode = tmode; | |
2333 | |
2334 if (mode == VOIDmode) | |
2335 break; | |
2336 | |
2337 icode = optab_handler (mov_optab, mode)->insn_code; | |
2338 if (icode != CODE_FOR_nothing | |
2339 && align >= GET_MODE_ALIGNMENT (mode)) | |
2340 { | |
2341 unsigned int size = GET_MODE_SIZE (mode); | |
2342 | |
2343 while (l >= size) | |
2344 { | |
2345 if (reverse) | |
2346 offset -= size; | |
2347 | |
2348 cst = (*constfun) (constfundata, offset, mode); | |
2349 if (!LEGITIMATE_CONSTANT_P (cst)) | |
2350 return 0; | |
2351 | |
2352 if (!reverse) | |
2353 offset += size; | |
2354 | |
2355 l -= size; | |
2356 } | |
2357 } | |
2358 | |
2359 max_size = GET_MODE_SIZE (mode); | |
2360 } | |
2361 | |
2362 /* The code above should have handled everything. */ | |
2363 gcc_assert (!l); | |
2364 } | |
2365 | |
2366 return 1; | |
2367 } | |
2368 | |
2369 /* Generate several move instructions to store LEN bytes generated by | |
2370 CONSTFUN to block TO. (A MEM rtx with BLKmode). CONSTFUNDATA is a | |
2371 pointer which will be passed as argument in every CONSTFUN call. | |
2372 ALIGN is maximum alignment we can assume. MEMSETP is true if this is | |
2373 a memset operation and false if it's a copy of a constant string. | |
2374 If ENDP is 0 return to, if ENDP is 1 return memory at the end ala | |
2375 mempcpy, and if ENDP is 2 return memory the end minus one byte ala | |
2376 stpcpy. */ | |
2377 | |
2378 rtx | |
2379 store_by_pieces (rtx to, unsigned HOST_WIDE_INT len, | |
2380 rtx (*constfun) (void *, HOST_WIDE_INT, enum machine_mode), | |
2381 void *constfundata, unsigned int align, bool memsetp, int endp) | |
2382 { | |
2383 struct store_by_pieces data; | |
2384 | |
2385 if (len == 0) | |
2386 { | |
2387 gcc_assert (endp != 2); | |
2388 return to; | |
2389 } | |
2390 | |
2391 gcc_assert (memsetp | |
2392 ? SET_BY_PIECES_P (len, align) | |
2393 : STORE_BY_PIECES_P (len, align)); | |
2394 data.constfun = constfun; | |
2395 data.constfundata = constfundata; | |
2396 data.len = len; | |
2397 data.to = to; | |
2398 store_by_pieces_1 (&data, align); | |
2399 if (endp) | |
2400 { | |
2401 rtx to1; | |
2402 | |
2403 gcc_assert (!data.reverse); | |
2404 if (data.autinc_to) | |
2405 { | |
2406 if (endp == 2) | |
2407 { | |
2408 if (HAVE_POST_INCREMENT && data.explicit_inc_to > 0) | |
2409 emit_insn (gen_add2_insn (data.to_addr, constm1_rtx)); | |
2410 else | |
2411 data.to_addr = copy_addr_to_reg (plus_constant (data.to_addr, | |
2412 -1)); | |
2413 } | |
2414 to1 = adjust_automodify_address (data.to, QImode, data.to_addr, | |
2415 data.offset); | |
2416 } | |
2417 else | |
2418 { | |
2419 if (endp == 2) | |
2420 --data.offset; | |
2421 to1 = adjust_address (data.to, QImode, data.offset); | |
2422 } | |
2423 return to1; | |
2424 } | |
2425 else | |
2426 return data.to; | |
2427 } | |
2428 | |
2429 /* Generate several move instructions to clear LEN bytes of block TO. (A MEM | |
2430 rtx with BLKmode). ALIGN is maximum alignment we can assume. */ | |
2431 | |
2432 static void | |
2433 clear_by_pieces (rtx to, unsigned HOST_WIDE_INT len, unsigned int align) | |
2434 { | |
2435 struct store_by_pieces data; | |
2436 | |
2437 if (len == 0) | |
2438 return; | |
2439 | |
2440 data.constfun = clear_by_pieces_1; | |
2441 data.constfundata = NULL; | |
2442 data.len = len; | |
2443 data.to = to; | |
2444 store_by_pieces_1 (&data, align); | |
2445 } | |
2446 | |
2447 /* Callback routine for clear_by_pieces. | |
2448 Return const0_rtx unconditionally. */ | |
2449 | |
2450 static rtx | |
2451 clear_by_pieces_1 (void *data ATTRIBUTE_UNUSED, | |
2452 HOST_WIDE_INT offset ATTRIBUTE_UNUSED, | |
2453 enum machine_mode mode ATTRIBUTE_UNUSED) | |
2454 { | |
2455 return const0_rtx; | |
2456 } | |
2457 | |
2458 /* Subroutine of clear_by_pieces and store_by_pieces. | |
2459 Generate several move instructions to store LEN bytes of block TO. (A MEM | |
2460 rtx with BLKmode). ALIGN is maximum alignment we can assume. */ | |
2461 | |
2462 static void | |
2463 store_by_pieces_1 (struct store_by_pieces *data ATTRIBUTE_UNUSED, | |
2464 unsigned int align ATTRIBUTE_UNUSED) | |
2465 { | |
2466 rtx to_addr = XEXP (data->to, 0); | |
2467 unsigned int max_size = STORE_MAX_PIECES + 1; | |
2468 enum machine_mode mode = VOIDmode, tmode; | |
2469 enum insn_code icode; | |
2470 | |
2471 data->offset = 0; | |
2472 data->to_addr = to_addr; | |
2473 data->autinc_to | |
2474 = (GET_CODE (to_addr) == PRE_INC || GET_CODE (to_addr) == PRE_DEC | |
2475 || GET_CODE (to_addr) == POST_INC || GET_CODE (to_addr) == POST_DEC); | |
2476 | |
2477 data->explicit_inc_to = 0; | |
2478 data->reverse | |
2479 = (GET_CODE (to_addr) == PRE_DEC || GET_CODE (to_addr) == POST_DEC); | |
2480 if (data->reverse) | |
2481 data->offset = data->len; | |
2482 | |
2483 /* If storing requires more than two move insns, | |
2484 copy addresses to registers (to make displacements shorter) | |
2485 and use post-increment if available. */ | |
2486 if (!data->autinc_to | |
2487 && move_by_pieces_ninsns (data->len, align, max_size) > 2) | |
2488 { | |
2489 /* Determine the main mode we'll be using. */ | |
2490 for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT); | |
2491 tmode != VOIDmode; tmode = GET_MODE_WIDER_MODE (tmode)) | |
2492 if (GET_MODE_SIZE (tmode) < max_size) | |
2493 mode = tmode; | |
2494 | |
2495 if (USE_STORE_PRE_DECREMENT (mode) && data->reverse && ! data->autinc_to) | |
2496 { | |
2497 data->to_addr = copy_addr_to_reg (plus_constant (to_addr, data->len)); | |
2498 data->autinc_to = 1; | |
2499 data->explicit_inc_to = -1; | |
2500 } | |
2501 | |
2502 if (USE_STORE_POST_INCREMENT (mode) && ! data->reverse | |
2503 && ! data->autinc_to) | |
2504 { | |
2505 data->to_addr = copy_addr_to_reg (to_addr); | |
2506 data->autinc_to = 1; | |
2507 data->explicit_inc_to = 1; | |
2508 } | |
2509 | |
2510 if ( !data->autinc_to && CONSTANT_P (to_addr)) | |
2511 data->to_addr = copy_addr_to_reg (to_addr); | |
2512 } | |
2513 | |
2514 tmode = mode_for_size (STORE_MAX_PIECES * BITS_PER_UNIT, MODE_INT, 1); | |
2515 if (align >= GET_MODE_ALIGNMENT (tmode)) | |
2516 align = GET_MODE_ALIGNMENT (tmode); | |
2517 else | |
2518 { | |
2519 enum machine_mode xmode; | |
2520 | |
2521 for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT), xmode = tmode; | |
2522 tmode != VOIDmode; | |
2523 xmode = tmode, tmode = GET_MODE_WIDER_MODE (tmode)) | |
2524 if (GET_MODE_SIZE (tmode) > STORE_MAX_PIECES | |
2525 || SLOW_UNALIGNED_ACCESS (tmode, align)) | |
2526 break; | |
2527 | |
2528 align = MAX (align, GET_MODE_ALIGNMENT (xmode)); | |
2529 } | |
2530 | |
2531 /* First store what we can in the largest integer mode, then go to | |
2532 successively smaller modes. */ | |
2533 | |
2534 while (max_size > 1) | |
2535 { | |
2536 for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT); | |
2537 tmode != VOIDmode; tmode = GET_MODE_WIDER_MODE (tmode)) | |
2538 if (GET_MODE_SIZE (tmode) < max_size) | |
2539 mode = tmode; | |
2540 | |
2541 if (mode == VOIDmode) | |
2542 break; | |
2543 | |
2544 icode = optab_handler (mov_optab, mode)->insn_code; | |
2545 if (icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode)) | |
2546 store_by_pieces_2 (GEN_FCN (icode), mode, data); | |
2547 | |
2548 max_size = GET_MODE_SIZE (mode); | |
2549 } | |
2550 | |
2551 /* The code above should have handled everything. */ | |
2552 gcc_assert (!data->len); | |
2553 } | |
2554 | |
2555 /* Subroutine of store_by_pieces_1. Store as many bytes as appropriate | |
2556 with move instructions for mode MODE. GENFUN is the gen_... function | |
2557 to make a move insn for that mode. DATA has all the other info. */ | |
2558 | |
2559 static void | |
2560 store_by_pieces_2 (rtx (*genfun) (rtx, ...), enum machine_mode mode, | |
2561 struct store_by_pieces *data) | |
2562 { | |
2563 unsigned int size = GET_MODE_SIZE (mode); | |
2564 rtx to1, cst; | |
2565 | |
2566 while (data->len >= size) | |
2567 { | |
2568 if (data->reverse) | |
2569 data->offset -= size; | |
2570 | |
2571 if (data->autinc_to) | |
2572 to1 = adjust_automodify_address (data->to, mode, data->to_addr, | |
2573 data->offset); | |
2574 else | |
2575 to1 = adjust_address (data->to, mode, data->offset); | |
2576 | |
2577 if (HAVE_PRE_DECREMENT && data->explicit_inc_to < 0) | |
2578 emit_insn (gen_add2_insn (data->to_addr, | |
2579 GEN_INT (-(HOST_WIDE_INT) size))); | |
2580 | |
2581 cst = (*data->constfun) (data->constfundata, data->offset, mode); | |
2582 emit_insn ((*genfun) (to1, cst)); | |
2583 | |
2584 if (HAVE_POST_INCREMENT && data->explicit_inc_to > 0) | |
2585 emit_insn (gen_add2_insn (data->to_addr, GEN_INT (size))); | |
2586 | |
2587 if (! data->reverse) | |
2588 data->offset += size; | |
2589 | |
2590 data->len -= size; | |
2591 } | |
2592 } | |
2593 | |
2594 /* Write zeros through the storage of OBJECT. If OBJECT has BLKmode, SIZE is | |
2595 its length in bytes. */ | |
2596 | |
2597 rtx | |
2598 clear_storage_hints (rtx object, rtx size, enum block_op_methods method, | |
2599 unsigned int expected_align, HOST_WIDE_INT expected_size) | |
2600 { | |
2601 enum machine_mode mode = GET_MODE (object); | |
2602 unsigned int align; | |
2603 | |
2604 gcc_assert (method == BLOCK_OP_NORMAL || method == BLOCK_OP_TAILCALL); | |
2605 | |
2606 /* If OBJECT is not BLKmode and SIZE is the same size as its mode, | |
2607 just move a zero. Otherwise, do this a piece at a time. */ | |
2608 if (mode != BLKmode | |
2609 && GET_CODE (size) == CONST_INT | |
2610 && INTVAL (size) == (HOST_WIDE_INT) GET_MODE_SIZE (mode)) | |
2611 { | |
2612 rtx zero = CONST0_RTX (mode); | |
2613 if (zero != NULL) | |
2614 { | |
2615 emit_move_insn (object, zero); | |
2616 return NULL; | |
2617 } | |
2618 | |
2619 if (COMPLEX_MODE_P (mode)) | |
2620 { | |
2621 zero = CONST0_RTX (GET_MODE_INNER (mode)); | |
2622 if (zero != NULL) | |
2623 { | |
2624 write_complex_part (object, zero, 0); | |
2625 write_complex_part (object, zero, 1); | |
2626 return NULL; | |
2627 } | |
2628 } | |
2629 } | |
2630 | |
2631 if (size == const0_rtx) | |
2632 return NULL; | |
2633 | |
2634 align = MEM_ALIGN (object); | |
2635 | |
2636 if (GET_CODE (size) == CONST_INT | |
2637 && CLEAR_BY_PIECES_P (INTVAL (size), align)) | |
2638 clear_by_pieces (object, INTVAL (size), align); | |
2639 else if (set_storage_via_setmem (object, size, const0_rtx, align, | |
2640 expected_align, expected_size)) | |
2641 ; | |
2642 else | |
2643 return set_storage_via_libcall (object, size, const0_rtx, | |
2644 method == BLOCK_OP_TAILCALL); | |
2645 | |
2646 return NULL; | |
2647 } | |
2648 | |
2649 rtx | |
2650 clear_storage (rtx object, rtx size, enum block_op_methods method) | |
2651 { | |
2652 return clear_storage_hints (object, size, method, 0, -1); | |
2653 } | |
2654 | |
2655 | |
2656 /* A subroutine of clear_storage. Expand a call to memset. | |
2657 Return the return value of memset, 0 otherwise. */ | |
2658 | |
2659 rtx | |
2660 set_storage_via_libcall (rtx object, rtx size, rtx val, bool tailcall) | |
2661 { | |
2662 tree call_expr, fn, object_tree, size_tree, val_tree; | |
2663 enum machine_mode size_mode; | |
2664 rtx retval; | |
2665 | |
2666 /* Emit code to copy OBJECT and SIZE into new pseudos. We can then | |
2667 place those into new pseudos into a VAR_DECL and use them later. */ | |
2668 | |
2669 object = copy_to_mode_reg (Pmode, XEXP (object, 0)); | |
2670 | |
2671 size_mode = TYPE_MODE (sizetype); | |
2672 size = convert_to_mode (size_mode, size, 1); | |
2673 size = copy_to_mode_reg (size_mode, size); | |
2674 | |
2675 /* It is incorrect to use the libcall calling conventions to call | |
2676 memset in this context. This could be a user call to memset and | |
2677 the user may wish to examine the return value from memset. For | |
2678 targets where libcalls and normal calls have different conventions | |
2679 for returning pointers, we could end up generating incorrect code. */ | |
2680 | |
2681 object_tree = make_tree (ptr_type_node, object); | |
2682 if (GET_CODE (val) != CONST_INT) | |
2683 val = convert_to_mode (TYPE_MODE (integer_type_node), val, 1); | |
2684 size_tree = make_tree (sizetype, size); | |
2685 val_tree = make_tree (integer_type_node, val); | |
2686 | |
2687 fn = clear_storage_libcall_fn (true); | |
2688 call_expr = build_call_expr (fn, 3, | |
2689 object_tree, integer_zero_node, size_tree); | |
2690 CALL_EXPR_TAILCALL (call_expr) = tailcall; | |
2691 | |
2692 retval = expand_normal (call_expr); | |
2693 | |
2694 return retval; | |
2695 } | |
2696 | |
2697 /* A subroutine of set_storage_via_libcall. Create the tree node | |
2698 for the function we use for block clears. The first time FOR_CALL | |
2699 is true, we call assemble_external. */ | |
2700 | |
2701 tree block_clear_fn; | |
2702 | |
2703 void | |
2704 init_block_clear_fn (const char *asmspec) | |
2705 { | |
2706 if (!block_clear_fn) | |
2707 { | |
2708 tree fn, args; | |
2709 | |
2710 fn = get_identifier ("memset"); | |
2711 args = build_function_type_list (ptr_type_node, ptr_type_node, | |
2712 integer_type_node, sizetype, | |
2713 NULL_TREE); | |
2714 | |
2715 fn = build_decl (FUNCTION_DECL, fn, args); | |
2716 DECL_EXTERNAL (fn) = 1; | |
2717 TREE_PUBLIC (fn) = 1; | |
2718 DECL_ARTIFICIAL (fn) = 1; | |
2719 TREE_NOTHROW (fn) = 1; | |
2720 DECL_VISIBILITY (fn) = VISIBILITY_DEFAULT; | |
2721 DECL_VISIBILITY_SPECIFIED (fn) = 1; | |
2722 | |
2723 block_clear_fn = fn; | |
2724 } | |
2725 | |
2726 if (asmspec) | |
2727 set_user_assembler_name (block_clear_fn, asmspec); | |
2728 } | |
2729 | |
2730 static tree | |
2731 clear_storage_libcall_fn (int for_call) | |
2732 { | |
2733 static bool emitted_extern; | |
2734 | |
2735 if (!block_clear_fn) | |
2736 init_block_clear_fn (NULL); | |
2737 | |
2738 if (for_call && !emitted_extern) | |
2739 { | |
2740 emitted_extern = true; | |
2741 make_decl_rtl (block_clear_fn); | |
2742 assemble_external (block_clear_fn); | |
2743 } | |
2744 | |
2745 return block_clear_fn; | |
2746 } | |
2747 | |
2748 /* Expand a setmem pattern; return true if successful. */ | |
2749 | |
2750 bool | |
2751 set_storage_via_setmem (rtx object, rtx size, rtx val, unsigned int align, | |
2752 unsigned int expected_align, HOST_WIDE_INT expected_size) | |
2753 { | |
2754 /* Try the most limited insn first, because there's no point | |
2755 including more than one in the machine description unless | |
2756 the more limited one has some advantage. */ | |
2757 | |
2758 rtx opalign = GEN_INT (align / BITS_PER_UNIT); | |
2759 enum machine_mode mode; | |
2760 | |
2761 if (expected_align < align) | |
2762 expected_align = align; | |
2763 | |
2764 for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode; | |
2765 mode = GET_MODE_WIDER_MODE (mode)) | |
2766 { | |
2767 enum insn_code code = setmem_optab[(int) mode]; | |
2768 insn_operand_predicate_fn pred; | |
2769 | |
2770 if (code != CODE_FOR_nothing | |
2771 /* We don't need MODE to be narrower than | |
2772 BITS_PER_HOST_WIDE_INT here because if SIZE is less than | |
2773 the mode mask, as it is returned by the macro, it will | |
2774 definitely be less than the actual mode mask. */ | |
2775 && ((GET_CODE (size) == CONST_INT | |
2776 && ((unsigned HOST_WIDE_INT) INTVAL (size) | |
2777 <= (GET_MODE_MASK (mode) >> 1))) | |
2778 || GET_MODE_BITSIZE (mode) >= BITS_PER_WORD) | |
2779 && ((pred = insn_data[(int) code].operand[0].predicate) == 0 | |
2780 || (*pred) (object, BLKmode)) | |
2781 && ((pred = insn_data[(int) code].operand[3].predicate) == 0 | |
2782 || (*pred) (opalign, VOIDmode))) | |
2783 { | |
2784 rtx opsize, opchar; | |
2785 enum machine_mode char_mode; | |
2786 rtx last = get_last_insn (); | |
2787 rtx pat; | |
2788 | |
2789 opsize = convert_to_mode (mode, size, 1); | |
2790 pred = insn_data[(int) code].operand[1].predicate; | |
2791 if (pred != 0 && ! (*pred) (opsize, mode)) | |
2792 opsize = copy_to_mode_reg (mode, opsize); | |
2793 | |
2794 opchar = val; | |
2795 char_mode = insn_data[(int) code].operand[2].mode; | |
2796 if (char_mode != VOIDmode) | |
2797 { | |
2798 opchar = convert_to_mode (char_mode, opchar, 1); | |
2799 pred = insn_data[(int) code].operand[2].predicate; | |
2800 if (pred != 0 && ! (*pred) (opchar, char_mode)) | |
2801 opchar = copy_to_mode_reg (char_mode, opchar); | |
2802 } | |
2803 | |
2804 if (insn_data[(int) code].n_operands == 4) | |
2805 pat = GEN_FCN ((int) code) (object, opsize, opchar, opalign); | |
2806 else | |
2807 pat = GEN_FCN ((int) code) (object, opsize, opchar, opalign, | |
2808 GEN_INT (expected_align | |
2809 / BITS_PER_UNIT), | |
2810 GEN_INT (expected_size)); | |
2811 if (pat) | |
2812 { | |
2813 emit_insn (pat); | |
2814 return true; | |
2815 } | |
2816 else | |
2817 delete_insns_since (last); | |
2818 } | |
2819 } | |
2820 | |
2821 return false; | |
2822 } | |
2823 | |
2824 | |
2825 /* Write to one of the components of the complex value CPLX. Write VAL to | |
2826 the real part if IMAG_P is false, and the imaginary part if its true. */ | |
2827 | |
2828 static void | |
2829 write_complex_part (rtx cplx, rtx val, bool imag_p) | |
2830 { | |
2831 enum machine_mode cmode; | |
2832 enum machine_mode imode; | |
2833 unsigned ibitsize; | |
2834 | |
2835 if (GET_CODE (cplx) == CONCAT) | |
2836 { | |
2837 emit_move_insn (XEXP (cplx, imag_p), val); | |
2838 return; | |
2839 } | |
2840 | |
2841 cmode = GET_MODE (cplx); | |
2842 imode = GET_MODE_INNER (cmode); | |
2843 ibitsize = GET_MODE_BITSIZE (imode); | |
2844 | |
2845 /* For MEMs simplify_gen_subreg may generate an invalid new address | |
2846 because, e.g., the original address is considered mode-dependent | |
2847 by the target, which restricts simplify_subreg from invoking | |
2848 adjust_address_nv. Instead of preparing fallback support for an | |
2849 invalid address, we call adjust_address_nv directly. */ | |
2850 if (MEM_P (cplx)) | |
2851 { | |
2852 emit_move_insn (adjust_address_nv (cplx, imode, | |
2853 imag_p ? GET_MODE_SIZE (imode) : 0), | |
2854 val); | |
2855 return; | |
2856 } | |
2857 | |
2858 /* If the sub-object is at least word sized, then we know that subregging | |
2859 will work. This special case is important, since store_bit_field | |
2860 wants to operate on integer modes, and there's rarely an OImode to | |
2861 correspond to TCmode. */ | |
2862 if (ibitsize >= BITS_PER_WORD | |
2863 /* For hard regs we have exact predicates. Assume we can split | |
2864 the original object if it spans an even number of hard regs. | |
2865 This special case is important for SCmode on 64-bit platforms | |
2866 where the natural size of floating-point regs is 32-bit. */ | |
2867 || (REG_P (cplx) | |
2868 && REGNO (cplx) < FIRST_PSEUDO_REGISTER | |
2869 && hard_regno_nregs[REGNO (cplx)][cmode] % 2 == 0)) | |
2870 { | |
2871 rtx part = simplify_gen_subreg (imode, cplx, cmode, | |
2872 imag_p ? GET_MODE_SIZE (imode) : 0); | |
2873 if (part) | |
2874 { | |
2875 emit_move_insn (part, val); | |
2876 return; | |
2877 } | |
2878 else | |
2879 /* simplify_gen_subreg may fail for sub-word MEMs. */ | |
2880 gcc_assert (MEM_P (cplx) && ibitsize < BITS_PER_WORD); | |
2881 } | |
2882 | |
2883 store_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0, imode, val); | |
2884 } | |
2885 | |
2886 /* Extract one of the components of the complex value CPLX. Extract the | |
2887 real part if IMAG_P is false, and the imaginary part if it's true. */ | |
2888 | |
2889 static rtx | |
2890 read_complex_part (rtx cplx, bool imag_p) | |
2891 { | |
2892 enum machine_mode cmode, imode; | |
2893 unsigned ibitsize; | |
2894 | |
2895 if (GET_CODE (cplx) == CONCAT) | |
2896 return XEXP (cplx, imag_p); | |
2897 | |
2898 cmode = GET_MODE (cplx); | |
2899 imode = GET_MODE_INNER (cmode); | |
2900 ibitsize = GET_MODE_BITSIZE (imode); | |
2901 | |
2902 /* Special case reads from complex constants that got spilled to memory. */ | |
2903 if (MEM_P (cplx) && GET_CODE (XEXP (cplx, 0)) == SYMBOL_REF) | |
2904 { | |
2905 tree decl = SYMBOL_REF_DECL (XEXP (cplx, 0)); | |
2906 if (decl && TREE_CODE (decl) == COMPLEX_CST) | |
2907 { | |
2908 tree part = imag_p ? TREE_IMAGPART (decl) : TREE_REALPART (decl); | |
2909 if (CONSTANT_CLASS_P (part)) | |
2910 return expand_expr (part, NULL_RTX, imode, EXPAND_NORMAL); | |
2911 } | |
2912 } | |
2913 | |
2914 /* For MEMs simplify_gen_subreg may generate an invalid new address | |
2915 because, e.g., the original address is considered mode-dependent | |
2916 by the target, which restricts simplify_subreg from invoking | |
2917 adjust_address_nv. Instead of preparing fallback support for an | |
2918 invalid address, we call adjust_address_nv directly. */ | |
2919 if (MEM_P (cplx)) | |
2920 return adjust_address_nv (cplx, imode, | |
2921 imag_p ? GET_MODE_SIZE (imode) : 0); | |
2922 | |
2923 /* If the sub-object is at least word sized, then we know that subregging | |
2924 will work. This special case is important, since extract_bit_field | |
2925 wants to operate on integer modes, and there's rarely an OImode to | |
2926 correspond to TCmode. */ | |
2927 if (ibitsize >= BITS_PER_WORD | |
2928 /* For hard regs we have exact predicates. Assume we can split | |
2929 the original object if it spans an even number of hard regs. | |
2930 This special case is important for SCmode on 64-bit platforms | |
2931 where the natural size of floating-point regs is 32-bit. */ | |
2932 || (REG_P (cplx) | |
2933 && REGNO (cplx) < FIRST_PSEUDO_REGISTER | |
2934 && hard_regno_nregs[REGNO (cplx)][cmode] % 2 == 0)) | |
2935 { | |
2936 rtx ret = simplify_gen_subreg (imode, cplx, cmode, | |
2937 imag_p ? GET_MODE_SIZE (imode) : 0); | |
2938 if (ret) | |
2939 return ret; | |
2940 else | |
2941 /* simplify_gen_subreg may fail for sub-word MEMs. */ | |
2942 gcc_assert (MEM_P (cplx) && ibitsize < BITS_PER_WORD); | |
2943 } | |
2944 | |
2945 return extract_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0, | |
2946 true, NULL_RTX, imode, imode); | |
2947 } | |
2948 | |
2949 /* A subroutine of emit_move_insn_1. Yet another lowpart generator. | |
2950 NEW_MODE and OLD_MODE are the same size. Return NULL if X cannot be | |
2951 represented in NEW_MODE. If FORCE is true, this will never happen, as | |
2952 we'll force-create a SUBREG if needed. */ | |
2953 | |
2954 static rtx | |
2955 emit_move_change_mode (enum machine_mode new_mode, | |
2956 enum machine_mode old_mode, rtx x, bool force) | |
2957 { | |
2958 rtx ret; | |
2959 | |
2960 if (push_operand (x, GET_MODE (x))) | |
2961 { | |
2962 ret = gen_rtx_MEM (new_mode, XEXP (x, 0)); | |
2963 MEM_COPY_ATTRIBUTES (ret, x); | |
2964 } | |
2965 else if (MEM_P (x)) | |
2966 { | |
2967 /* We don't have to worry about changing the address since the | |
2968 size in bytes is supposed to be the same. */ | |
2969 if (reload_in_progress) | |
2970 { | |
2971 /* Copy the MEM to change the mode and move any | |
2972 substitutions from the old MEM to the new one. */ | |
2973 ret = adjust_address_nv (x, new_mode, 0); | |
2974 copy_replacements (x, ret); | |
2975 } | |
2976 else | |
2977 ret = adjust_address (x, new_mode, 0); | |
2978 } | |
2979 else | |
2980 { | |
2981 /* Note that we do want simplify_subreg's behavior of validating | |
2982 that the new mode is ok for a hard register. If we were to use | |
2983 simplify_gen_subreg, we would create the subreg, but would | |
2984 probably run into the target not being able to implement it. */ | |
2985 /* Except, of course, when FORCE is true, when this is exactly what | |
2986 we want. Which is needed for CCmodes on some targets. */ | |
2987 if (force) | |
2988 ret = simplify_gen_subreg (new_mode, x, old_mode, 0); | |
2989 else | |
2990 ret = simplify_subreg (new_mode, x, old_mode, 0); | |
2991 } | |
2992 | |
2993 return ret; | |
2994 } | |
2995 | |
2996 /* A subroutine of emit_move_insn_1. Generate a move from Y into X using | |
2997 an integer mode of the same size as MODE. Returns the instruction | |
2998 emitted, or NULL if such a move could not be generated. */ | |
2999 | |
3000 static rtx | |
3001 emit_move_via_integer (enum machine_mode mode, rtx x, rtx y, bool force) | |
3002 { | |
3003 enum machine_mode imode; | |
3004 enum insn_code code; | |
3005 | |
3006 /* There must exist a mode of the exact size we require. */ | |
3007 imode = int_mode_for_mode (mode); | |
3008 if (imode == BLKmode) | |
3009 return NULL_RTX; | |
3010 | |
3011 /* The target must support moves in this mode. */ | |
3012 code = optab_handler (mov_optab, imode)->insn_code; | |
3013 if (code == CODE_FOR_nothing) | |
3014 return NULL_RTX; | |
3015 | |
3016 x = emit_move_change_mode (imode, mode, x, force); | |
3017 if (x == NULL_RTX) | |
3018 return NULL_RTX; | |
3019 y = emit_move_change_mode (imode, mode, y, force); | |
3020 if (y == NULL_RTX) | |
3021 return NULL_RTX; | |
3022 return emit_insn (GEN_FCN (code) (x, y)); | |
3023 } | |
3024 | |
3025 /* A subroutine of emit_move_insn_1. X is a push_operand in MODE. | |
3026 Return an equivalent MEM that does not use an auto-increment. */ | |
3027 | |
3028 static rtx | |
3029 emit_move_resolve_push (enum machine_mode mode, rtx x) | |
3030 { | |
3031 enum rtx_code code = GET_CODE (XEXP (x, 0)); | |
3032 HOST_WIDE_INT adjust; | |
3033 rtx temp; | |
3034 | |
3035 adjust = GET_MODE_SIZE (mode); | |
3036 #ifdef PUSH_ROUNDING | |
3037 adjust = PUSH_ROUNDING (adjust); | |
3038 #endif | |
3039 if (code == PRE_DEC || code == POST_DEC) | |
3040 adjust = -adjust; | |
3041 else if (code == PRE_MODIFY || code == POST_MODIFY) | |
3042 { | |
3043 rtx expr = XEXP (XEXP (x, 0), 1); | |
3044 HOST_WIDE_INT val; | |
3045 | |
3046 gcc_assert (GET_CODE (expr) == PLUS || GET_CODE (expr) == MINUS); | |
3047 gcc_assert (GET_CODE (XEXP (expr, 1)) == CONST_INT); | |
3048 val = INTVAL (XEXP (expr, 1)); | |
3049 if (GET_CODE (expr) == MINUS) | |
3050 val = -val; | |
3051 gcc_assert (adjust == val || adjust == -val); | |
3052 adjust = val; | |
3053 } | |
3054 | |
3055 /* Do not use anti_adjust_stack, since we don't want to update | |
3056 stack_pointer_delta. */ | |
3057 temp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx, | |
3058 GEN_INT (adjust), stack_pointer_rtx, | |
3059 0, OPTAB_LIB_WIDEN); | |
3060 if (temp != stack_pointer_rtx) | |
3061 emit_move_insn (stack_pointer_rtx, temp); | |
3062 | |
3063 switch (code) | |
3064 { | |
3065 case PRE_INC: | |
3066 case PRE_DEC: | |
3067 case PRE_MODIFY: | |
3068 temp = stack_pointer_rtx; | |
3069 break; | |
3070 case POST_INC: | |
3071 case POST_DEC: | |
3072 case POST_MODIFY: | |
3073 temp = plus_constant (stack_pointer_rtx, -adjust); | |
3074 break; | |
3075 default: | |
3076 gcc_unreachable (); | |
3077 } | |
3078 | |
3079 return replace_equiv_address (x, temp); | |
3080 } | |
3081 | |
3082 /* A subroutine of emit_move_complex. Generate a move from Y into X. | |
3083 X is known to satisfy push_operand, and MODE is known to be complex. | |
3084 Returns the last instruction emitted. */ | |
3085 | |
3086 rtx | |
3087 emit_move_complex_push (enum machine_mode mode, rtx x, rtx y) | |
3088 { | |
3089 enum machine_mode submode = GET_MODE_INNER (mode); | |
3090 bool imag_first; | |
3091 | |
3092 #ifdef PUSH_ROUNDING | |
3093 unsigned int submodesize = GET_MODE_SIZE (submode); | |
3094 | |
3095 /* In case we output to the stack, but the size is smaller than the | |
3096 machine can push exactly, we need to use move instructions. */ | |
3097 if (PUSH_ROUNDING (submodesize) != submodesize) | |
3098 { | |
3099 x = emit_move_resolve_push (mode, x); | |
3100 return emit_move_insn (x, y); | |
3101 } | |
3102 #endif | |
3103 | |
3104 /* Note that the real part always precedes the imag part in memory | |
3105 regardless of machine's endianness. */ | |
3106 switch (GET_CODE (XEXP (x, 0))) | |
3107 { | |
3108 case PRE_DEC: | |
3109 case POST_DEC: | |
3110 imag_first = true; | |
3111 break; | |
3112 case PRE_INC: | |
3113 case POST_INC: | |
3114 imag_first = false; | |
3115 break; | |
3116 default: | |
3117 gcc_unreachable (); | |
3118 } | |
3119 | |
3120 emit_move_insn (gen_rtx_MEM (submode, XEXP (x, 0)), | |
3121 read_complex_part (y, imag_first)); | |
3122 return emit_move_insn (gen_rtx_MEM (submode, XEXP (x, 0)), | |
3123 read_complex_part (y, !imag_first)); | |
3124 } | |
3125 | |
3126 /* A subroutine of emit_move_complex. Perform the move from Y to X | |
3127 via two moves of the parts. Returns the last instruction emitted. */ | |
3128 | |
3129 rtx | |
3130 emit_move_complex_parts (rtx x, rtx y) | |
3131 { | |
3132 /* Show the output dies here. This is necessary for SUBREGs | |
3133 of pseudos since we cannot track their lifetimes correctly; | |
3134 hard regs shouldn't appear here except as return values. */ | |
3135 if (!reload_completed && !reload_in_progress | |
3136 && REG_P (x) && !reg_overlap_mentioned_p (x, y)) | |
3137 emit_clobber (x); | |
3138 | |
3139 write_complex_part (x, read_complex_part (y, false), false); | |
3140 write_complex_part (x, read_complex_part (y, true), true); | |
3141 | |
3142 return get_last_insn (); | |
3143 } | |
3144 | |
3145 /* A subroutine of emit_move_insn_1. Generate a move from Y into X. | |
3146 MODE is known to be complex. Returns the last instruction emitted. */ | |
3147 | |
3148 static rtx | |
3149 emit_move_complex (enum machine_mode mode, rtx x, rtx y) | |
3150 { | |
3151 bool try_int; | |
3152 | |
3153 /* Need to take special care for pushes, to maintain proper ordering | |
3154 of the data, and possibly extra padding. */ | |
3155 if (push_operand (x, mode)) | |
3156 return emit_move_complex_push (mode, x, y); | |
3157 | |
3158 /* See if we can coerce the target into moving both values at once. */ | |
3159 | |
3160 /* Move floating point as parts. */ | |
3161 if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT | |
3162 && optab_handler (mov_optab, GET_MODE_INNER (mode))->insn_code != CODE_FOR_nothing) | |
3163 try_int = false; | |
3164 /* Not possible if the values are inherently not adjacent. */ | |
3165 else if (GET_CODE (x) == CONCAT || GET_CODE (y) == CONCAT) | |
3166 try_int = false; | |
3167 /* Is possible if both are registers (or subregs of registers). */ | |
3168 else if (register_operand (x, mode) && register_operand (y, mode)) | |
3169 try_int = true; | |
3170 /* If one of the operands is a memory, and alignment constraints | |
3171 are friendly enough, we may be able to do combined memory operations. | |
3172 We do not attempt this if Y is a constant because that combination is | |
3173 usually better with the by-parts thing below. */ | |
3174 else if ((MEM_P (x) ? !CONSTANT_P (y) : MEM_P (y)) | |
3175 && (!STRICT_ALIGNMENT | |
3176 || get_mode_alignment (mode) == BIGGEST_ALIGNMENT)) | |
3177 try_int = true; | |
3178 else | |
3179 try_int = false; | |
3180 | |
3181 if (try_int) | |
3182 { | |
3183 rtx ret; | |
3184 | |
3185 /* For memory to memory moves, optimal behavior can be had with the | |
3186 existing block move logic. */ | |
3187 if (MEM_P (x) && MEM_P (y)) | |
3188 { | |
3189 emit_block_move (x, y, GEN_INT (GET_MODE_SIZE (mode)), | |
3190 BLOCK_OP_NO_LIBCALL); | |
3191 return get_last_insn (); | |
3192 } | |
3193 | |
3194 ret = emit_move_via_integer (mode, x, y, true); | |
3195 if (ret) | |
3196 return ret; | |
3197 } | |
3198 | |
3199 return emit_move_complex_parts (x, y); | |
3200 } | |
3201 | |
3202 /* A subroutine of emit_move_insn_1. Generate a move from Y into X. | |
3203 MODE is known to be MODE_CC. Returns the last instruction emitted. */ | |
3204 | |
3205 static rtx | |
3206 emit_move_ccmode (enum machine_mode mode, rtx x, rtx y) | |
3207 { | |
3208 rtx ret; | |
3209 | |
3210 /* Assume all MODE_CC modes are equivalent; if we have movcc, use it. */ | |
3211 if (mode != CCmode) | |
3212 { | |
3213 enum insn_code code = optab_handler (mov_optab, CCmode)->insn_code; | |
3214 if (code != CODE_FOR_nothing) | |
3215 { | |
3216 x = emit_move_change_mode (CCmode, mode, x, true); | |
3217 y = emit_move_change_mode (CCmode, mode, y, true); | |
3218 return emit_insn (GEN_FCN (code) (x, y)); | |
3219 } | |
3220 } | |
3221 | |
3222 /* Otherwise, find the MODE_INT mode of the same width. */ | |
3223 ret = emit_move_via_integer (mode, x, y, false); | |
3224 gcc_assert (ret != NULL); | |
3225 return ret; | |
3226 } | |
3227 | |
3228 /* Return true if word I of OP lies entirely in the | |
3229 undefined bits of a paradoxical subreg. */ | |
3230 | |
3231 static bool | |
3232 undefined_operand_subword_p (const_rtx op, int i) | |
3233 { | |
3234 enum machine_mode innermode, innermostmode; | |
3235 int offset; | |
3236 if (GET_CODE (op) != SUBREG) | |
3237 return false; | |
3238 innermode = GET_MODE (op); | |
3239 innermostmode = GET_MODE (SUBREG_REG (op)); | |
3240 offset = i * UNITS_PER_WORD + SUBREG_BYTE (op); | |
3241 /* The SUBREG_BYTE represents offset, as if the value were stored in | |
3242 memory, except for a paradoxical subreg where we define | |
3243 SUBREG_BYTE to be 0; undo this exception as in | |
3244 simplify_subreg. */ | |
3245 if (SUBREG_BYTE (op) == 0 | |
3246 && GET_MODE_SIZE (innermostmode) < GET_MODE_SIZE (innermode)) | |
3247 { | |
3248 int difference = (GET_MODE_SIZE (innermostmode) - GET_MODE_SIZE (innermode)); | |
3249 if (WORDS_BIG_ENDIAN) | |
3250 offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD; | |
3251 if (BYTES_BIG_ENDIAN) | |
3252 offset += difference % UNITS_PER_WORD; | |
3253 } | |
3254 if (offset >= GET_MODE_SIZE (innermostmode) | |
3255 || offset <= -GET_MODE_SIZE (word_mode)) | |
3256 return true; | |
3257 return false; | |
3258 } | |
3259 | |
3260 /* A subroutine of emit_move_insn_1. Generate a move from Y into X. | |
3261 MODE is any multi-word or full-word mode that lacks a move_insn | |
3262 pattern. Note that you will get better code if you define such | |
3263 patterns, even if they must turn into multiple assembler instructions. */ | |
3264 | |
3265 static rtx | |
3266 emit_move_multi_word (enum machine_mode mode, rtx x, rtx y) | |
3267 { | |
3268 rtx last_insn = 0; | |
3269 rtx seq, inner; | |
3270 bool need_clobber; | |
3271 int i; | |
3272 | |
3273 gcc_assert (GET_MODE_SIZE (mode) >= UNITS_PER_WORD); | |
3274 | |
3275 /* If X is a push on the stack, do the push now and replace | |
3276 X with a reference to the stack pointer. */ | |
3277 if (push_operand (x, mode)) | |
3278 x = emit_move_resolve_push (mode, x); | |
3279 | |
3280 /* If we are in reload, see if either operand is a MEM whose address | |
3281 is scheduled for replacement. */ | |
3282 if (reload_in_progress && MEM_P (x) | |
3283 && (inner = find_replacement (&XEXP (x, 0))) != XEXP (x, 0)) | |
3284 x = replace_equiv_address_nv (x, inner); | |
3285 if (reload_in_progress && MEM_P (y) | |
3286 && (inner = find_replacement (&XEXP (y, 0))) != XEXP (y, 0)) | |
3287 y = replace_equiv_address_nv (y, inner); | |
3288 | |
3289 start_sequence (); | |
3290 | |
3291 need_clobber = false; | |
3292 for (i = 0; | |
3293 i < (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD; | |
3294 i++) | |
3295 { | |
3296 rtx xpart = operand_subword (x, i, 1, mode); | |
3297 rtx ypart; | |
3298 | |
3299 /* Do not generate code for a move if it would come entirely | |
3300 from the undefined bits of a paradoxical subreg. */ | |
3301 if (undefined_operand_subword_p (y, i)) | |
3302 continue; | |
3303 | |
3304 ypart = operand_subword (y, i, 1, mode); | |
3305 | |
3306 /* If we can't get a part of Y, put Y into memory if it is a | |
3307 constant. Otherwise, force it into a register. Then we must | |
3308 be able to get a part of Y. */ | |
3309 if (ypart == 0 && CONSTANT_P (y)) | |
3310 { | |
3311 y = use_anchored_address (force_const_mem (mode, y)); | |
3312 ypart = operand_subword (y, i, 1, mode); | |
3313 } | |
3314 else if (ypart == 0) | |
3315 ypart = operand_subword_force (y, i, mode); | |
3316 | |
3317 gcc_assert (xpart && ypart); | |
3318 | |
3319 need_clobber |= (GET_CODE (xpart) == SUBREG); | |
3320 | |
3321 last_insn = emit_move_insn (xpart, ypart); | |
3322 } | |
3323 | |
3324 seq = get_insns (); | |
3325 end_sequence (); | |
3326 | |
3327 /* Show the output dies here. This is necessary for SUBREGs | |
3328 of pseudos since we cannot track their lifetimes correctly; | |
3329 hard regs shouldn't appear here except as return values. | |
3330 We never want to emit such a clobber after reload. */ | |
3331 if (x != y | |
3332 && ! (reload_in_progress || reload_completed) | |
3333 && need_clobber != 0) | |
3334 emit_clobber (x); | |
3335 | |
3336 emit_insn (seq); | |
3337 | |
3338 return last_insn; | |
3339 } | |
3340 | |
3341 /* Low level part of emit_move_insn. | |
3342 Called just like emit_move_insn, but assumes X and Y | |
3343 are basically valid. */ | |
3344 | |
3345 rtx | |
3346 emit_move_insn_1 (rtx x, rtx y) | |
3347 { | |
3348 enum machine_mode mode = GET_MODE (x); | |
3349 enum insn_code code; | |
3350 | |
3351 gcc_assert ((unsigned int) mode < (unsigned int) MAX_MACHINE_MODE); | |
3352 | |
3353 code = optab_handler (mov_optab, mode)->insn_code; | |
3354 if (code != CODE_FOR_nothing) | |
3355 return emit_insn (GEN_FCN (code) (x, y)); | |
3356 | |
3357 /* Expand complex moves by moving real part and imag part. */ | |
3358 if (COMPLEX_MODE_P (mode)) | |
3359 return emit_move_complex (mode, x, y); | |
3360 | |
3361 if (GET_MODE_CLASS (mode) == MODE_DECIMAL_FLOAT | |
3362 || ALL_FIXED_POINT_MODE_P (mode)) | |
3363 { | |
3364 rtx result = emit_move_via_integer (mode, x, y, true); | |
3365 | |
3366 /* If we can't find an integer mode, use multi words. */ | |
3367 if (result) | |
3368 return result; | |
3369 else | |
3370 return emit_move_multi_word (mode, x, y); | |
3371 } | |
3372 | |
3373 if (GET_MODE_CLASS (mode) == MODE_CC) | |
3374 return emit_move_ccmode (mode, x, y); | |
3375 | |
3376 /* Try using a move pattern for the corresponding integer mode. This is | |
3377 only safe when simplify_subreg can convert MODE constants into integer | |
3378 constants. At present, it can only do this reliably if the value | |
3379 fits within a HOST_WIDE_INT. */ | |
3380 if (!CONSTANT_P (y) || GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) | |
3381 { | |
3382 rtx ret = emit_move_via_integer (mode, x, y, false); | |
3383 if (ret) | |
3384 return ret; | |
3385 } | |
3386 | |
3387 return emit_move_multi_word (mode, x, y); | |
3388 } | |
3389 | |
3390 /* Generate code to copy Y into X. | |
3391 Both Y and X must have the same mode, except that | |
3392 Y can be a constant with VOIDmode. | |
3393 This mode cannot be BLKmode; use emit_block_move for that. | |
3394 | |
3395 Return the last instruction emitted. */ | |
3396 | |
3397 rtx | |
3398 emit_move_insn (rtx x, rtx y) | |
3399 { | |
3400 enum machine_mode mode = GET_MODE (x); | |
3401 rtx y_cst = NULL_RTX; | |
3402 rtx last_insn, set; | |
3403 | |
3404 gcc_assert (mode != BLKmode | |
3405 && (GET_MODE (y) == mode || GET_MODE (y) == VOIDmode)); | |
3406 | |
3407 if (CONSTANT_P (y)) | |
3408 { | |
3409 if (optimize | |
3410 && SCALAR_FLOAT_MODE_P (GET_MODE (x)) | |
3411 && (last_insn = compress_float_constant (x, y))) | |
3412 return last_insn; | |
3413 | |
3414 y_cst = y; | |
3415 | |
3416 if (!LEGITIMATE_CONSTANT_P (y)) | |
3417 { | |
3418 y = force_const_mem (mode, y); | |
3419 | |
3420 /* If the target's cannot_force_const_mem prevented the spill, | |
3421 assume that the target's move expanders will also take care | |
3422 of the non-legitimate constant. */ | |
3423 if (!y) | |
3424 y = y_cst; | |
3425 else | |
3426 y = use_anchored_address (y); | |
3427 } | |
3428 } | |
3429 | |
3430 /* If X or Y are memory references, verify that their addresses are valid | |
3431 for the machine. */ | |
3432 if (MEM_P (x) | |
3433 && (! memory_address_p (GET_MODE (x), XEXP (x, 0)) | |
3434 && ! push_operand (x, GET_MODE (x)))) | |
3435 x = validize_mem (x); | |
3436 | |
3437 if (MEM_P (y) | |
3438 && ! memory_address_p (GET_MODE (y), XEXP (y, 0))) | |
3439 y = validize_mem (y); | |
3440 | |
3441 gcc_assert (mode != BLKmode); | |
3442 | |
3443 last_insn = emit_move_insn_1 (x, y); | |
3444 | |
3445 if (y_cst && REG_P (x) | |
3446 && (set = single_set (last_insn)) != NULL_RTX | |
3447 && SET_DEST (set) == x | |
3448 && ! rtx_equal_p (y_cst, SET_SRC (set))) | |
3449 set_unique_reg_note (last_insn, REG_EQUAL, y_cst); | |
3450 | |
3451 return last_insn; | |
3452 } | |
3453 | |
3454 /* If Y is representable exactly in a narrower mode, and the target can | |
3455 perform the extension directly from constant or memory, then emit the | |
3456 move as an extension. */ | |
3457 | |
3458 static rtx | |
3459 compress_float_constant (rtx x, rtx y) | |
3460 { | |
3461 enum machine_mode dstmode = GET_MODE (x); | |
3462 enum machine_mode orig_srcmode = GET_MODE (y); | |
3463 enum machine_mode srcmode; | |
3464 REAL_VALUE_TYPE r; | |
3465 int oldcost, newcost; | |
3466 bool speed = optimize_insn_for_speed_p (); | |
3467 | |
3468 REAL_VALUE_FROM_CONST_DOUBLE (r, y); | |
3469 | |
3470 if (LEGITIMATE_CONSTANT_P (y)) | |
3471 oldcost = rtx_cost (y, SET, speed); | |
3472 else | |
3473 oldcost = rtx_cost (force_const_mem (dstmode, y), SET, speed); | |
3474 | |
3475 for (srcmode = GET_CLASS_NARROWEST_MODE (GET_MODE_CLASS (orig_srcmode)); | |
3476 srcmode != orig_srcmode; | |
3477 srcmode = GET_MODE_WIDER_MODE (srcmode)) | |
3478 { | |
3479 enum insn_code ic; | |
3480 rtx trunc_y, last_insn; | |
3481 | |
3482 /* Skip if the target can't extend this way. */ | |
3483 ic = can_extend_p (dstmode, srcmode, 0); | |
3484 if (ic == CODE_FOR_nothing) | |
3485 continue; | |
3486 | |
3487 /* Skip if the narrowed value isn't exact. */ | |
3488 if (! exact_real_truncate (srcmode, &r)) | |
3489 continue; | |
3490 | |
3491 trunc_y = CONST_DOUBLE_FROM_REAL_VALUE (r, srcmode); | |
3492 | |
3493 if (LEGITIMATE_CONSTANT_P (trunc_y)) | |
3494 { | |
3495 /* Skip if the target needs extra instructions to perform | |
3496 the extension. */ | |
3497 if (! (*insn_data[ic].operand[1].predicate) (trunc_y, srcmode)) | |
3498 continue; | |
3499 /* This is valid, but may not be cheaper than the original. */ | |
3500 newcost = rtx_cost (gen_rtx_FLOAT_EXTEND (dstmode, trunc_y), SET, speed); | |
3501 if (oldcost < newcost) | |
3502 continue; | |
3503 } | |
3504 else if (float_extend_from_mem[dstmode][srcmode]) | |
3505 { | |
3506 trunc_y = force_const_mem (srcmode, trunc_y); | |
3507 /* This is valid, but may not be cheaper than the original. */ | |
3508 newcost = rtx_cost (gen_rtx_FLOAT_EXTEND (dstmode, trunc_y), SET, speed); | |
3509 if (oldcost < newcost) | |
3510 continue; | |
3511 trunc_y = validize_mem (trunc_y); | |
3512 } | |
3513 else | |
3514 continue; | |
3515 | |
3516 /* For CSE's benefit, force the compressed constant pool entry | |
3517 into a new pseudo. This constant may be used in different modes, | |
3518 and if not, combine will put things back together for us. */ | |
3519 trunc_y = force_reg (srcmode, trunc_y); | |
3520 emit_unop_insn (ic, x, trunc_y, UNKNOWN); | |
3521 last_insn = get_last_insn (); | |
3522 | |
3523 if (REG_P (x)) | |
3524 set_unique_reg_note (last_insn, REG_EQUAL, y); | |
3525 | |
3526 return last_insn; | |
3527 } | |
3528 | |
3529 return NULL_RTX; | |
3530 } | |
3531 | |
3532 /* Pushing data onto the stack. */ | |
3533 | |
3534 /* Push a block of length SIZE (perhaps variable) | |
3535 and return an rtx to address the beginning of the block. | |
3536 The value may be virtual_outgoing_args_rtx. | |
3537 | |
3538 EXTRA is the number of bytes of padding to push in addition to SIZE. | |
3539 BELOW nonzero means this padding comes at low addresses; | |
3540 otherwise, the padding comes at high addresses. */ | |
3541 | |
3542 rtx | |
3543 push_block (rtx size, int extra, int below) | |
3544 { | |
3545 rtx temp; | |
3546 | |
3547 size = convert_modes (Pmode, ptr_mode, size, 1); | |
3548 if (CONSTANT_P (size)) | |
3549 anti_adjust_stack (plus_constant (size, extra)); | |
3550 else if (REG_P (size) && extra == 0) | |
3551 anti_adjust_stack (size); | |
3552 else | |
3553 { | |
3554 temp = copy_to_mode_reg (Pmode, size); | |
3555 if (extra != 0) | |
3556 temp = expand_binop (Pmode, add_optab, temp, GEN_INT (extra), | |
3557 temp, 0, OPTAB_LIB_WIDEN); | |
3558 anti_adjust_stack (temp); | |
3559 } | |
3560 | |
3561 #ifndef STACK_GROWS_DOWNWARD | |
3562 if (0) | |
3563 #else | |
3564 if (1) | |
3565 #endif | |
3566 { | |
3567 temp = virtual_outgoing_args_rtx; | |
3568 if (extra != 0 && below) | |
3569 temp = plus_constant (temp, extra); | |
3570 } | |
3571 else | |
3572 { | |
3573 if (GET_CODE (size) == CONST_INT) | |
3574 temp = plus_constant (virtual_outgoing_args_rtx, | |
3575 -INTVAL (size) - (below ? 0 : extra)); | |
3576 else if (extra != 0 && !below) | |
3577 temp = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx, | |
3578 negate_rtx (Pmode, plus_constant (size, extra))); | |
3579 else | |
3580 temp = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx, | |
3581 negate_rtx (Pmode, size)); | |
3582 } | |
3583 | |
3584 return memory_address (GET_CLASS_NARROWEST_MODE (MODE_INT), temp); | |
3585 } | |
3586 | |
3587 #ifdef PUSH_ROUNDING | |
3588 | |
3589 /* Emit single push insn. */ | |
3590 | |
3591 static void | |
3592 emit_single_push_insn (enum machine_mode mode, rtx x, tree type) | |
3593 { | |
3594 rtx dest_addr; | |
3595 unsigned rounded_size = PUSH_ROUNDING (GET_MODE_SIZE (mode)); | |
3596 rtx dest; | |
3597 enum insn_code icode; | |
3598 insn_operand_predicate_fn pred; | |
3599 | |
3600 stack_pointer_delta += PUSH_ROUNDING (GET_MODE_SIZE (mode)); | |
3601 /* If there is push pattern, use it. Otherwise try old way of throwing | |
3602 MEM representing push operation to move expander. */ | |
3603 icode = optab_handler (push_optab, mode)->insn_code; | |
3604 if (icode != CODE_FOR_nothing) | |
3605 { | |
3606 if (((pred = insn_data[(int) icode].operand[0].predicate) | |
3607 && !((*pred) (x, mode)))) | |
3608 x = force_reg (mode, x); | |
3609 emit_insn (GEN_FCN (icode) (x)); | |
3610 return; | |
3611 } | |
3612 if (GET_MODE_SIZE (mode) == rounded_size) | |
3613 dest_addr = gen_rtx_fmt_e (STACK_PUSH_CODE, Pmode, stack_pointer_rtx); | |
3614 /* If we are to pad downward, adjust the stack pointer first and | |
3615 then store X into the stack location using an offset. This is | |
3616 because emit_move_insn does not know how to pad; it does not have | |
3617 access to type. */ | |
3618 else if (FUNCTION_ARG_PADDING (mode, type) == downward) | |
3619 { | |
3620 unsigned padding_size = rounded_size - GET_MODE_SIZE (mode); | |
3621 HOST_WIDE_INT offset; | |
3622 | |
3623 emit_move_insn (stack_pointer_rtx, | |
3624 expand_binop (Pmode, | |
3625 #ifdef STACK_GROWS_DOWNWARD | |
3626 sub_optab, | |
3627 #else | |
3628 add_optab, | |
3629 #endif | |
3630 stack_pointer_rtx, | |
3631 GEN_INT (rounded_size), | |
3632 NULL_RTX, 0, OPTAB_LIB_WIDEN)); | |
3633 | |
3634 offset = (HOST_WIDE_INT) padding_size; | |
3635 #ifdef STACK_GROWS_DOWNWARD | |
3636 if (STACK_PUSH_CODE == POST_DEC) | |
3637 /* We have already decremented the stack pointer, so get the | |
3638 previous value. */ | |
3639 offset += (HOST_WIDE_INT) rounded_size; | |
3640 #else | |
3641 if (STACK_PUSH_CODE == POST_INC) | |
3642 /* We have already incremented the stack pointer, so get the | |
3643 previous value. */ | |
3644 offset -= (HOST_WIDE_INT) rounded_size; | |
3645 #endif | |
3646 dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (offset)); | |
3647 } | |
3648 else | |
3649 { | |
3650 #ifdef STACK_GROWS_DOWNWARD | |
3651 /* ??? This seems wrong if STACK_PUSH_CODE == POST_DEC. */ | |
3652 dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx, | |
3653 GEN_INT (-(HOST_WIDE_INT) rounded_size)); | |
3654 #else | |
3655 /* ??? This seems wrong if STACK_PUSH_CODE == POST_INC. */ | |
3656 dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx, | |
3657 GEN_INT (rounded_size)); | |
3658 #endif | |
3659 dest_addr = gen_rtx_PRE_MODIFY (Pmode, stack_pointer_rtx, dest_addr); | |
3660 } | |
3661 | |
3662 dest = gen_rtx_MEM (mode, dest_addr); | |
3663 | |
3664 if (type != 0) | |
3665 { | |
3666 set_mem_attributes (dest, type, 1); | |
3667 | |
3668 if (flag_optimize_sibling_calls) | |
3669 /* Function incoming arguments may overlap with sibling call | |
3670 outgoing arguments and we cannot allow reordering of reads | |
3671 from function arguments with stores to outgoing arguments | |
3672 of sibling calls. */ | |
3673 set_mem_alias_set (dest, 0); | |
3674 } | |
3675 emit_move_insn (dest, x); | |
3676 } | |
3677 #endif | |
3678 | |
3679 /* Generate code to push X onto the stack, assuming it has mode MODE and | |
3680 type TYPE. | |
3681 MODE is redundant except when X is a CONST_INT (since they don't | |
3682 carry mode info). | |
3683 SIZE is an rtx for the size of data to be copied (in bytes), | |
3684 needed only if X is BLKmode. | |
3685 | |
3686 ALIGN (in bits) is maximum alignment we can assume. | |
3687 | |
3688 If PARTIAL and REG are both nonzero, then copy that many of the first | |
3689 bytes of X into registers starting with REG, and push the rest of X. | |
3690 The amount of space pushed is decreased by PARTIAL bytes. | |
3691 REG must be a hard register in this case. | |
3692 If REG is zero but PARTIAL is not, take any all others actions for an | |
3693 argument partially in registers, but do not actually load any | |
3694 registers. | |
3695 | |
3696 EXTRA is the amount in bytes of extra space to leave next to this arg. | |
3697 This is ignored if an argument block has already been allocated. | |
3698 | |
3699 On a machine that lacks real push insns, ARGS_ADDR is the address of | |
3700 the bottom of the argument block for this call. We use indexing off there | |
3701 to store the arg. On machines with push insns, ARGS_ADDR is 0 when a | |
3702 argument block has not been preallocated. | |
3703 | |
3704 ARGS_SO_FAR is the size of args previously pushed for this call. | |
3705 | |
3706 REG_PARM_STACK_SPACE is nonzero if functions require stack space | |
3707 for arguments passed in registers. If nonzero, it will be the number | |
3708 of bytes required. */ | |
3709 | |
3710 void | |
3711 emit_push_insn (rtx x, enum machine_mode mode, tree type, rtx size, | |
3712 unsigned int align, int partial, rtx reg, int extra, | |
3713 rtx args_addr, rtx args_so_far, int reg_parm_stack_space, | |
3714 rtx alignment_pad) | |
3715 { | |
3716 rtx xinner; | |
3717 enum direction stack_direction | |
3718 #ifdef STACK_GROWS_DOWNWARD | |
3719 = downward; | |
3720 #else | |
3721 = upward; | |
3722 #endif | |
3723 | |
3724 /* Decide where to pad the argument: `downward' for below, | |
3725 `upward' for above, or `none' for don't pad it. | |
3726 Default is below for small data on big-endian machines; else above. */ | |
3727 enum direction where_pad = FUNCTION_ARG_PADDING (mode, type); | |
3728 | |
3729 /* Invert direction if stack is post-decrement. | |
3730 FIXME: why? */ | |
3731 if (STACK_PUSH_CODE == POST_DEC) | |
3732 if (where_pad != none) | |
3733 where_pad = (where_pad == downward ? upward : downward); | |
3734 | |
3735 xinner = x; | |
3736 | |
3737 if (mode == BLKmode | |
3738 || (STRICT_ALIGNMENT && align < GET_MODE_ALIGNMENT (mode))) | |
3739 { | |
3740 /* Copy a block into the stack, entirely or partially. */ | |
3741 | |
3742 rtx temp; | |
3743 int used; | |
3744 int offset; | |
3745 int skip; | |
3746 | |
3747 offset = partial % (PARM_BOUNDARY / BITS_PER_UNIT); | |
3748 used = partial - offset; | |
3749 | |
3750 if (mode != BLKmode) | |
3751 { | |
3752 /* A value is to be stored in an insufficiently aligned | |
3753 stack slot; copy via a suitably aligned slot if | |
3754 necessary. */ | |
3755 size = GEN_INT (GET_MODE_SIZE (mode)); | |
3756 if (!MEM_P (xinner)) | |
3757 { | |
3758 temp = assign_temp (type, 0, 1, 1); | |
3759 emit_move_insn (temp, xinner); | |
3760 xinner = temp; | |
3761 } | |
3762 } | |
3763 | |
3764 gcc_assert (size); | |
3765 | |
3766 /* USED is now the # of bytes we need not copy to the stack | |
3767 because registers will take care of them. */ | |
3768 | |
3769 if (partial != 0) | |
3770 xinner = adjust_address (xinner, BLKmode, used); | |
3771 | |
3772 /* If the partial register-part of the arg counts in its stack size, | |
3773 skip the part of stack space corresponding to the registers. | |
3774 Otherwise, start copying to the beginning of the stack space, | |
3775 by setting SKIP to 0. */ | |
3776 skip = (reg_parm_stack_space == 0) ? 0 : used; | |
3777 | |
3778 #ifdef PUSH_ROUNDING | |
3779 /* Do it with several push insns if that doesn't take lots of insns | |
3780 and if there is no difficulty with push insns that skip bytes | |
3781 on the stack for alignment purposes. */ | |
3782 if (args_addr == 0 | |
3783 && PUSH_ARGS | |
3784 && GET_CODE (size) == CONST_INT | |
3785 && skip == 0 | |
3786 && MEM_ALIGN (xinner) >= align | |
3787 && (MOVE_BY_PIECES_P ((unsigned) INTVAL (size) - used, align)) | |
3788 /* Here we avoid the case of a structure whose weak alignment | |
3789 forces many pushes of a small amount of data, | |
3790 and such small pushes do rounding that causes trouble. */ | |
3791 && ((! SLOW_UNALIGNED_ACCESS (word_mode, align)) | |
3792 || align >= BIGGEST_ALIGNMENT | |
3793 || (PUSH_ROUNDING (align / BITS_PER_UNIT) | |
3794 == (align / BITS_PER_UNIT))) | |
3795 && PUSH_ROUNDING (INTVAL (size)) == INTVAL (size)) | |
3796 { | |
3797 /* Push padding now if padding above and stack grows down, | |
3798 or if padding below and stack grows up. | |
3799 But if space already allocated, this has already been done. */ | |
3800 if (extra && args_addr == 0 | |
3801 && where_pad != none && where_pad != stack_direction) | |
3802 anti_adjust_stack (GEN_INT (extra)); | |
3803 | |
3804 move_by_pieces (NULL, xinner, INTVAL (size) - used, align, 0); | |
3805 } | |
3806 else | |
3807 #endif /* PUSH_ROUNDING */ | |
3808 { | |
3809 rtx target; | |
3810 | |
3811 /* Otherwise make space on the stack and copy the data | |
3812 to the address of that space. */ | |
3813 | |
3814 /* Deduct words put into registers from the size we must copy. */ | |
3815 if (partial != 0) | |
3816 { | |
3817 if (GET_CODE (size) == CONST_INT) | |
3818 size = GEN_INT (INTVAL (size) - used); | |
3819 else | |
3820 size = expand_binop (GET_MODE (size), sub_optab, size, | |
3821 GEN_INT (used), NULL_RTX, 0, | |
3822 OPTAB_LIB_WIDEN); | |
3823 } | |
3824 | |
3825 /* Get the address of the stack space. | |
3826 In this case, we do not deal with EXTRA separately. | |
3827 A single stack adjust will do. */ | |
3828 if (! args_addr) | |
3829 { | |
3830 temp = push_block (size, extra, where_pad == downward); | |
3831 extra = 0; | |
3832 } | |
3833 else if (GET_CODE (args_so_far) == CONST_INT) | |
3834 temp = memory_address (BLKmode, | |
3835 plus_constant (args_addr, | |
3836 skip + INTVAL (args_so_far))); | |
3837 else | |
3838 temp = memory_address (BLKmode, | |
3839 plus_constant (gen_rtx_PLUS (Pmode, | |
3840 args_addr, | |
3841 args_so_far), | |
3842 skip)); | |
3843 | |
3844 if (!ACCUMULATE_OUTGOING_ARGS) | |
3845 { | |
3846 /* If the source is referenced relative to the stack pointer, | |
3847 copy it to another register to stabilize it. We do not need | |
3848 to do this if we know that we won't be changing sp. */ | |
3849 | |
3850 if (reg_mentioned_p (virtual_stack_dynamic_rtx, temp) | |
3851 || reg_mentioned_p (virtual_outgoing_args_rtx, temp)) | |
3852 temp = copy_to_reg (temp); | |
3853 } | |
3854 | |
3855 target = gen_rtx_MEM (BLKmode, temp); | |
3856 | |
3857 /* We do *not* set_mem_attributes here, because incoming arguments | |
3858 may overlap with sibling call outgoing arguments and we cannot | |
3859 allow reordering of reads from function arguments with stores | |
3860 to outgoing arguments of sibling calls. We do, however, want | |
3861 to record the alignment of the stack slot. */ | |
3862 /* ALIGN may well be better aligned than TYPE, e.g. due to | |
3863 PARM_BOUNDARY. Assume the caller isn't lying. */ | |
3864 set_mem_align (target, align); | |
3865 | |
3866 emit_block_move (target, xinner, size, BLOCK_OP_CALL_PARM); | |
3867 } | |
3868 } | |
3869 else if (partial > 0) | |
3870 { | |
3871 /* Scalar partly in registers. */ | |
3872 | |
3873 int size = GET_MODE_SIZE (mode) / UNITS_PER_WORD; | |
3874 int i; | |
3875 int not_stack; | |
3876 /* # bytes of start of argument | |
3877 that we must make space for but need not store. */ | |
3878 int offset = partial % (PARM_BOUNDARY / BITS_PER_UNIT); | |
3879 int args_offset = INTVAL (args_so_far); | |
3880 int skip; | |
3881 | |
3882 /* Push padding now if padding above and stack grows down, | |
3883 or if padding below and stack grows up. | |
3884 But if space already allocated, this has already been done. */ | |
3885 if (extra && args_addr == 0 | |
3886 && where_pad != none && where_pad != stack_direction) | |
3887 anti_adjust_stack (GEN_INT (extra)); | |
3888 | |
3889 /* If we make space by pushing it, we might as well push | |
3890 the real data. Otherwise, we can leave OFFSET nonzero | |
3891 and leave the space uninitialized. */ | |
3892 if (args_addr == 0) | |
3893 offset = 0; | |
3894 | |
3895 /* Now NOT_STACK gets the number of words that we don't need to | |
3896 allocate on the stack. Convert OFFSET to words too. */ | |
3897 not_stack = (partial - offset) / UNITS_PER_WORD; | |
3898 offset /= UNITS_PER_WORD; | |
3899 | |
3900 /* If the partial register-part of the arg counts in its stack size, | |
3901 skip the part of stack space corresponding to the registers. | |
3902 Otherwise, start copying to the beginning of the stack space, | |
3903 by setting SKIP to 0. */ | |
3904 skip = (reg_parm_stack_space == 0) ? 0 : not_stack; | |
3905 | |
3906 if (CONSTANT_P (x) && ! LEGITIMATE_CONSTANT_P (x)) | |
3907 x = validize_mem (force_const_mem (mode, x)); | |
3908 | |
3909 /* If X is a hard register in a non-integer mode, copy it into a pseudo; | |
3910 SUBREGs of such registers are not allowed. */ | |
3911 if ((REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER | |
3912 && GET_MODE_CLASS (GET_MODE (x)) != MODE_INT)) | |
3913 x = copy_to_reg (x); | |
3914 | |
3915 /* Loop over all the words allocated on the stack for this arg. */ | |
3916 /* We can do it by words, because any scalar bigger than a word | |
3917 has a size a multiple of a word. */ | |
3918 #ifndef PUSH_ARGS_REVERSED | |
3919 for (i = not_stack; i < size; i++) | |
3920 #else | |
3921 for (i = size - 1; i >= not_stack; i--) | |
3922 #endif | |
3923 if (i >= not_stack + offset) | |
3924 emit_push_insn (operand_subword_force (x, i, mode), | |
3925 word_mode, NULL_TREE, NULL_RTX, align, 0, NULL_RTX, | |
3926 0, args_addr, | |
3927 GEN_INT (args_offset + ((i - not_stack + skip) | |
3928 * UNITS_PER_WORD)), | |
3929 reg_parm_stack_space, alignment_pad); | |
3930 } | |
3931 else | |
3932 { | |
3933 rtx addr; | |
3934 rtx dest; | |
3935 | |
3936 /* Push padding now if padding above and stack grows down, | |
3937 or if padding below and stack grows up. | |
3938 But if space already allocated, this has already been done. */ | |
3939 if (extra && args_addr == 0 | |
3940 && where_pad != none && where_pad != stack_direction) | |
3941 anti_adjust_stack (GEN_INT (extra)); | |
3942 | |
3943 #ifdef PUSH_ROUNDING | |
3944 if (args_addr == 0 && PUSH_ARGS) | |
3945 emit_single_push_insn (mode, x, type); | |
3946 else | |
3947 #endif | |
3948 { | |
3949 if (GET_CODE (args_so_far) == CONST_INT) | |
3950 addr | |
3951 = memory_address (mode, | |
3952 plus_constant (args_addr, | |
3953 INTVAL (args_so_far))); | |
3954 else | |
3955 addr = memory_address (mode, gen_rtx_PLUS (Pmode, args_addr, | |
3956 args_so_far)); | |
3957 dest = gen_rtx_MEM (mode, addr); | |
3958 | |
3959 /* We do *not* set_mem_attributes here, because incoming arguments | |
3960 may overlap with sibling call outgoing arguments and we cannot | |
3961 allow reordering of reads from function arguments with stores | |
3962 to outgoing arguments of sibling calls. We do, however, want | |
3963 to record the alignment of the stack slot. */ | |
3964 /* ALIGN may well be better aligned than TYPE, e.g. due to | |
3965 PARM_BOUNDARY. Assume the caller isn't lying. */ | |
3966 set_mem_align (dest, align); | |
3967 | |
3968 emit_move_insn (dest, x); | |
3969 } | |
3970 } | |
3971 | |
3972 /* If part should go in registers, copy that part | |
3973 into the appropriate registers. Do this now, at the end, | |
3974 since mem-to-mem copies above may do function calls. */ | |
3975 if (partial > 0 && reg != 0) | |
3976 { | |
3977 /* Handle calls that pass values in multiple non-contiguous locations. | |
3978 The Irix 6 ABI has examples of this. */ | |
3979 if (GET_CODE (reg) == PARALLEL) | |
3980 emit_group_load (reg, x, type, -1); | |
3981 else | |
3982 { | |
3983 gcc_assert (partial % UNITS_PER_WORD == 0); | |
3984 move_block_to_reg (REGNO (reg), x, partial / UNITS_PER_WORD, mode); | |
3985 } | |
3986 } | |
3987 | |
3988 if (extra && args_addr == 0 && where_pad == stack_direction) | |
3989 anti_adjust_stack (GEN_INT (extra)); | |
3990 | |
3991 if (alignment_pad && args_addr == 0) | |
3992 anti_adjust_stack (alignment_pad); | |
3993 } | |
3994 | |
3995 /* Return X if X can be used as a subtarget in a sequence of arithmetic | |
3996 operations. */ | |
3997 | |
3998 static rtx | |
3999 get_subtarget (rtx x) | |
4000 { | |
4001 return (optimize | |
4002 || x == 0 | |
4003 /* Only registers can be subtargets. */ | |
4004 || !REG_P (x) | |
4005 /* Don't use hard regs to avoid extending their life. */ | |
4006 || REGNO (x) < FIRST_PSEUDO_REGISTER | |
4007 ? 0 : x); | |
4008 } | |
4009 | |
4010 /* A subroutine of expand_assignment. Optimize FIELD op= VAL, where | |
4011 FIELD is a bitfield. Returns true if the optimization was successful, | |
4012 and there's nothing else to do. */ | |
4013 | |
4014 static bool | |
4015 optimize_bitfield_assignment_op (unsigned HOST_WIDE_INT bitsize, | |
4016 unsigned HOST_WIDE_INT bitpos, | |
4017 enum machine_mode mode1, rtx str_rtx, | |
4018 tree to, tree src) | |
4019 { | |
4020 enum machine_mode str_mode = GET_MODE (str_rtx); | |
4021 unsigned int str_bitsize = GET_MODE_BITSIZE (str_mode); | |
4022 tree op0, op1; | |
4023 rtx value, result; | |
4024 optab binop; | |
4025 | |
4026 if (mode1 != VOIDmode | |
4027 || bitsize >= BITS_PER_WORD | |
4028 || str_bitsize > BITS_PER_WORD | |
4029 || TREE_SIDE_EFFECTS (to) | |
4030 || TREE_THIS_VOLATILE (to)) | |
4031 return false; | |
4032 | |
4033 STRIP_NOPS (src); | |
4034 if (!BINARY_CLASS_P (src) | |
4035 || TREE_CODE (TREE_TYPE (src)) != INTEGER_TYPE) | |
4036 return false; | |
4037 | |
4038 op0 = TREE_OPERAND (src, 0); | |
4039 op1 = TREE_OPERAND (src, 1); | |
4040 STRIP_NOPS (op0); | |
4041 | |
4042 if (!operand_equal_p (to, op0, 0)) | |
4043 return false; | |
4044 | |
4045 if (MEM_P (str_rtx)) | |
4046 { | |
4047 unsigned HOST_WIDE_INT offset1; | |
4048 | |
4049 if (str_bitsize == 0 || str_bitsize > BITS_PER_WORD) | |
4050 str_mode = word_mode; | |
4051 str_mode = get_best_mode (bitsize, bitpos, | |
4052 MEM_ALIGN (str_rtx), str_mode, 0); | |
4053 if (str_mode == VOIDmode) | |
4054 return false; | |
4055 str_bitsize = GET_MODE_BITSIZE (str_mode); | |
4056 | |
4057 offset1 = bitpos; | |
4058 bitpos %= str_bitsize; | |
4059 offset1 = (offset1 - bitpos) / BITS_PER_UNIT; | |
4060 str_rtx = adjust_address (str_rtx, str_mode, offset1); | |
4061 } | |
4062 else if (!REG_P (str_rtx) && GET_CODE (str_rtx) != SUBREG) | |
4063 return false; | |
4064 | |
4065 /* If the bit field covers the whole REG/MEM, store_field | |
4066 will likely generate better code. */ | |
4067 if (bitsize >= str_bitsize) | |
4068 return false; | |
4069 | |
4070 /* We can't handle fields split across multiple entities. */ | |
4071 if (bitpos + bitsize > str_bitsize) | |
4072 return false; | |
4073 | |
4074 if (BYTES_BIG_ENDIAN) | |
4075 bitpos = str_bitsize - bitpos - bitsize; | |
4076 | |
4077 switch (TREE_CODE (src)) | |
4078 { | |
4079 case PLUS_EXPR: | |
4080 case MINUS_EXPR: | |
4081 /* For now, just optimize the case of the topmost bitfield | |
4082 where we don't need to do any masking and also | |
4083 1 bit bitfields where xor can be used. | |
4084 We might win by one instruction for the other bitfields | |
4085 too if insv/extv instructions aren't used, so that | |
4086 can be added later. */ | |
4087 if (bitpos + bitsize != str_bitsize | |
4088 && (bitsize != 1 || TREE_CODE (op1) != INTEGER_CST)) | |
4089 break; | |
4090 | |
4091 value = expand_expr (op1, NULL_RTX, str_mode, EXPAND_NORMAL); | |
4092 value = convert_modes (str_mode, | |
4093 TYPE_MODE (TREE_TYPE (op1)), value, | |
4094 TYPE_UNSIGNED (TREE_TYPE (op1))); | |
4095 | |
4096 /* We may be accessing data outside the field, which means | |
4097 we can alias adjacent data. */ | |
4098 if (MEM_P (str_rtx)) | |
4099 { | |
4100 str_rtx = shallow_copy_rtx (str_rtx); | |
4101 set_mem_alias_set (str_rtx, 0); | |
4102 set_mem_expr (str_rtx, 0); | |
4103 } | |
4104 | |
4105 binop = TREE_CODE (src) == PLUS_EXPR ? add_optab : sub_optab; | |
4106 if (bitsize == 1 && bitpos + bitsize != str_bitsize) | |
4107 { | |
4108 value = expand_and (str_mode, value, const1_rtx, NULL); | |
4109 binop = xor_optab; | |
4110 } | |
4111 value = expand_shift (LSHIFT_EXPR, str_mode, value, | |
4112 build_int_cst (NULL_TREE, bitpos), | |
4113 NULL_RTX, 1); | |
4114 result = expand_binop (str_mode, binop, str_rtx, | |
4115 value, str_rtx, 1, OPTAB_WIDEN); | |
4116 if (result != str_rtx) | |
4117 emit_move_insn (str_rtx, result); | |
4118 return true; | |
4119 | |
4120 case BIT_IOR_EXPR: | |
4121 case BIT_XOR_EXPR: | |
4122 if (TREE_CODE (op1) != INTEGER_CST) | |
4123 break; | |
4124 value = expand_expr (op1, NULL_RTX, GET_MODE (str_rtx), EXPAND_NORMAL); | |
4125 value = convert_modes (GET_MODE (str_rtx), | |
4126 TYPE_MODE (TREE_TYPE (op1)), value, | |
4127 TYPE_UNSIGNED (TREE_TYPE (op1))); | |
4128 | |
4129 /* We may be accessing data outside the field, which means | |
4130 we can alias adjacent data. */ | |
4131 if (MEM_P (str_rtx)) | |
4132 { | |
4133 str_rtx = shallow_copy_rtx (str_rtx); | |
4134 set_mem_alias_set (str_rtx, 0); | |
4135 set_mem_expr (str_rtx, 0); | |
4136 } | |
4137 | |
4138 binop = TREE_CODE (src) == BIT_IOR_EXPR ? ior_optab : xor_optab; | |
4139 if (bitpos + bitsize != GET_MODE_BITSIZE (GET_MODE (str_rtx))) | |
4140 { | |
4141 rtx mask = GEN_INT (((unsigned HOST_WIDE_INT) 1 << bitsize) | |
4142 - 1); | |
4143 value = expand_and (GET_MODE (str_rtx), value, mask, | |
4144 NULL_RTX); | |
4145 } | |
4146 value = expand_shift (LSHIFT_EXPR, GET_MODE (str_rtx), value, | |
4147 build_int_cst (NULL_TREE, bitpos), | |
4148 NULL_RTX, 1); | |
4149 result = expand_binop (GET_MODE (str_rtx), binop, str_rtx, | |
4150 value, str_rtx, 1, OPTAB_WIDEN); | |
4151 if (result != str_rtx) | |
4152 emit_move_insn (str_rtx, result); | |
4153 return true; | |
4154 | |
4155 default: | |
4156 break; | |
4157 } | |
4158 | |
4159 return false; | |
4160 } | |
4161 | |
4162 | |
4163 /* Expand an assignment that stores the value of FROM into TO. If NONTEMPORAL | |
4164 is true, try generating a nontemporal store. */ | |
4165 | |
4166 void | |
4167 expand_assignment (tree to, tree from, bool nontemporal) | |
4168 { | |
4169 rtx to_rtx = 0; | |
4170 rtx result; | |
4171 | |
4172 /* Don't crash if the lhs of the assignment was erroneous. */ | |
4173 if (TREE_CODE (to) == ERROR_MARK) | |
4174 { | |
4175 result = expand_normal (from); | |
4176 return; | |
4177 } | |
4178 | |
4179 /* Optimize away no-op moves without side-effects. */ | |
4180 if (operand_equal_p (to, from, 0)) | |
4181 return; | |
4182 | |
4183 /* Assignment of a structure component needs special treatment | |
4184 if the structure component's rtx is not simply a MEM. | |
4185 Assignment of an array element at a constant index, and assignment of | |
4186 an array element in an unaligned packed structure field, has the same | |
4187 problem. */ | |
4188 if (handled_component_p (to) | |
4189 || TREE_CODE (TREE_TYPE (to)) == ARRAY_TYPE) | |
4190 { | |
4191 enum machine_mode mode1; | |
4192 HOST_WIDE_INT bitsize, bitpos; | |
4193 tree offset; | |
4194 int unsignedp; | |
4195 int volatilep = 0; | |
4196 tree tem; | |
4197 | |
4198 push_temp_slots (); | |
4199 tem = get_inner_reference (to, &bitsize, &bitpos, &offset, &mode1, | |
4200 &unsignedp, &volatilep, true); | |
4201 | |
4202 /* If we are going to use store_bit_field and extract_bit_field, | |
4203 make sure to_rtx will be safe for multiple use. */ | |
4204 | |
4205 to_rtx = expand_normal (tem); | |
4206 | |
4207 if (offset != 0) | |
4208 { | |
4209 rtx offset_rtx; | |
4210 | |
4211 if (!MEM_P (to_rtx)) | |
4212 { | |
4213 /* We can get constant negative offsets into arrays with broken | |
4214 user code. Translate this to a trap instead of ICEing. */ | |
4215 gcc_assert (TREE_CODE (offset) == INTEGER_CST); | |
4216 expand_builtin_trap (); | |
4217 to_rtx = gen_rtx_MEM (BLKmode, const0_rtx); | |
4218 } | |
4219 | |
4220 offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode, EXPAND_SUM); | |
4221 #ifdef POINTERS_EXTEND_UNSIGNED | |
4222 if (GET_MODE (offset_rtx) != Pmode) | |
4223 offset_rtx = convert_to_mode (Pmode, offset_rtx, 0); | |
4224 #else | |
4225 if (GET_MODE (offset_rtx) != ptr_mode) | |
4226 offset_rtx = convert_to_mode (ptr_mode, offset_rtx, 0); | |
4227 #endif | |
4228 | |
4229 /* A constant address in TO_RTX can have VOIDmode, we must not try | |
4230 to call force_reg for that case. Avoid that case. */ | |
4231 if (MEM_P (to_rtx) | |
4232 && GET_MODE (to_rtx) == BLKmode | |
4233 && GET_MODE (XEXP (to_rtx, 0)) != VOIDmode | |
4234 && bitsize > 0 | |
4235 && (bitpos % bitsize) == 0 | |
4236 && (bitsize % GET_MODE_ALIGNMENT (mode1)) == 0 | |
4237 && MEM_ALIGN (to_rtx) == GET_MODE_ALIGNMENT (mode1)) | |
4238 { | |
4239 to_rtx = adjust_address (to_rtx, mode1, bitpos / BITS_PER_UNIT); | |
4240 bitpos = 0; | |
4241 } | |
4242 | |
4243 to_rtx = offset_address (to_rtx, offset_rtx, | |
4244 highest_pow2_factor_for_target (to, | |
4245 offset)); | |
4246 } | |
4247 | |
4248 /* Handle expand_expr of a complex value returning a CONCAT. */ | |
4249 if (GET_CODE (to_rtx) == CONCAT) | |
4250 { | |
4251 if (TREE_CODE (TREE_TYPE (from)) == COMPLEX_TYPE) | |
4252 { | |
4253 gcc_assert (bitpos == 0); | |
4254 result = store_expr (from, to_rtx, false, nontemporal); | |
4255 } | |
4256 else | |
4257 { | |
4258 gcc_assert (bitpos == 0 || bitpos == GET_MODE_BITSIZE (mode1)); | |
4259 result = store_expr (from, XEXP (to_rtx, bitpos != 0), false, | |
4260 nontemporal); | |
4261 } | |
4262 } | |
4263 else | |
4264 { | |
4265 if (MEM_P (to_rtx)) | |
4266 { | |
4267 /* If the field is at offset zero, we could have been given the | |
4268 DECL_RTX of the parent struct. Don't munge it. */ | |
4269 to_rtx = shallow_copy_rtx (to_rtx); | |
4270 | |
4271 set_mem_attributes_minus_bitpos (to_rtx, to, 0, bitpos); | |
4272 | |
4273 /* Deal with volatile and readonly fields. The former is only | |
4274 done for MEM. Also set MEM_KEEP_ALIAS_SET_P if needed. */ | |
4275 if (volatilep) | |
4276 MEM_VOLATILE_P (to_rtx) = 1; | |
4277 if (component_uses_parent_alias_set (to)) | |
4278 MEM_KEEP_ALIAS_SET_P (to_rtx) = 1; | |
4279 } | |
4280 | |
4281 if (optimize_bitfield_assignment_op (bitsize, bitpos, mode1, | |
4282 to_rtx, to, from)) | |
4283 result = NULL; | |
4284 else | |
4285 result = store_field (to_rtx, bitsize, bitpos, mode1, from, | |
4286 TREE_TYPE (tem), get_alias_set (to), | |
4287 nontemporal); | |
4288 } | |
4289 | |
4290 if (result) | |
4291 preserve_temp_slots (result); | |
4292 free_temp_slots (); | |
4293 pop_temp_slots (); | |
4294 return; | |
4295 } | |
4296 | |
4297 /* If the rhs is a function call and its value is not an aggregate, | |
4298 call the function before we start to compute the lhs. | |
4299 This is needed for correct code for cases such as | |
4300 val = setjmp (buf) on machines where reference to val | |
4301 requires loading up part of an address in a separate insn. | |
4302 | |
4303 Don't do this if TO is a VAR_DECL or PARM_DECL whose DECL_RTL is REG | |
4304 since it might be a promoted variable where the zero- or sign- extension | |
4305 needs to be done. Handling this in the normal way is safe because no | |
4306 computation is done before the call. */ | |
4307 if (TREE_CODE (from) == CALL_EXPR && ! aggregate_value_p (from, from) | |
4308 && COMPLETE_TYPE_P (TREE_TYPE (from)) | |
4309 && TREE_CODE (TYPE_SIZE (TREE_TYPE (from))) == INTEGER_CST | |
4310 && ! ((TREE_CODE (to) == VAR_DECL || TREE_CODE (to) == PARM_DECL) | |
4311 && REG_P (DECL_RTL (to)))) | |
4312 { | |
4313 rtx value; | |
4314 | |
4315 push_temp_slots (); | |
4316 value = expand_normal (from); | |
4317 if (to_rtx == 0) | |
4318 to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE); | |
4319 | |
4320 /* Handle calls that return values in multiple non-contiguous locations. | |
4321 The Irix 6 ABI has examples of this. */ | |
4322 if (GET_CODE (to_rtx) == PARALLEL) | |
4323 emit_group_load (to_rtx, value, TREE_TYPE (from), | |
4324 int_size_in_bytes (TREE_TYPE (from))); | |
4325 else if (GET_MODE (to_rtx) == BLKmode) | |
4326 emit_block_move (to_rtx, value, expr_size (from), BLOCK_OP_NORMAL); | |
4327 else | |
4328 { | |
4329 if (POINTER_TYPE_P (TREE_TYPE (to))) | |
4330 value = convert_memory_address (GET_MODE (to_rtx), value); | |
4331 emit_move_insn (to_rtx, value); | |
4332 } | |
4333 preserve_temp_slots (to_rtx); | |
4334 free_temp_slots (); | |
4335 pop_temp_slots (); | |
4336 return; | |
4337 } | |
4338 | |
4339 /* Ordinary treatment. Expand TO to get a REG or MEM rtx. | |
4340 Don't re-expand if it was expanded already (in COMPONENT_REF case). */ | |
4341 | |
4342 if (to_rtx == 0) | |
4343 to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE); | |
4344 | |
4345 /* Don't move directly into a return register. */ | |
4346 if (TREE_CODE (to) == RESULT_DECL | |
4347 && (REG_P (to_rtx) || GET_CODE (to_rtx) == PARALLEL)) | |
4348 { | |
4349 rtx temp; | |
4350 | |
4351 push_temp_slots (); | |
4352 temp = expand_expr (from, NULL_RTX, GET_MODE (to_rtx), EXPAND_NORMAL); | |
4353 | |
4354 if (GET_CODE (to_rtx) == PARALLEL) | |
4355 emit_group_load (to_rtx, temp, TREE_TYPE (from), | |
4356 int_size_in_bytes (TREE_TYPE (from))); | |
4357 else | |
4358 emit_move_insn (to_rtx, temp); | |
4359 | |
4360 preserve_temp_slots (to_rtx); | |
4361 free_temp_slots (); | |
4362 pop_temp_slots (); | |
4363 return; | |
4364 } | |
4365 | |
4366 /* In case we are returning the contents of an object which overlaps | |
4367 the place the value is being stored, use a safe function when copying | |
4368 a value through a pointer into a structure value return block. */ | |
4369 if (TREE_CODE (to) == RESULT_DECL && TREE_CODE (from) == INDIRECT_REF | |
4370 && cfun->returns_struct | |
4371 && !cfun->returns_pcc_struct) | |
4372 { | |
4373 rtx from_rtx, size; | |
4374 | |
4375 push_temp_slots (); | |
4376 size = expr_size (from); | |
4377 from_rtx = expand_normal (from); | |
4378 | |
4379 emit_library_call (memmove_libfunc, LCT_NORMAL, | |
4380 VOIDmode, 3, XEXP (to_rtx, 0), Pmode, | |
4381 XEXP (from_rtx, 0), Pmode, | |
4382 convert_to_mode (TYPE_MODE (sizetype), | |
4383 size, TYPE_UNSIGNED (sizetype)), | |
4384 TYPE_MODE (sizetype)); | |
4385 | |
4386 preserve_temp_slots (to_rtx); | |
4387 free_temp_slots (); | |
4388 pop_temp_slots (); | |
4389 return; | |
4390 } | |
4391 | |
4392 /* Compute FROM and store the value in the rtx we got. */ | |
4393 | |
4394 push_temp_slots (); | |
4395 result = store_expr (from, to_rtx, 0, nontemporal); | |
4396 preserve_temp_slots (result); | |
4397 free_temp_slots (); | |
4398 pop_temp_slots (); | |
4399 return; | |
4400 } | |
4401 | |
4402 /* Emits nontemporal store insn that moves FROM to TO. Returns true if this | |
4403 succeeded, false otherwise. */ | |
4404 | |
4405 static bool | |
4406 emit_storent_insn (rtx to, rtx from) | |
4407 { | |
4408 enum machine_mode mode = GET_MODE (to), imode; | |
4409 enum insn_code code = optab_handler (storent_optab, mode)->insn_code; | |
4410 rtx pattern; | |
4411 | |
4412 if (code == CODE_FOR_nothing) | |
4413 return false; | |
4414 | |
4415 imode = insn_data[code].operand[0].mode; | |
4416 if (!insn_data[code].operand[0].predicate (to, imode)) | |
4417 return false; | |
4418 | |
4419 imode = insn_data[code].operand[1].mode; | |
4420 if (!insn_data[code].operand[1].predicate (from, imode)) | |
4421 { | |
4422 from = copy_to_mode_reg (imode, from); | |
4423 if (!insn_data[code].operand[1].predicate (from, imode)) | |
4424 return false; | |
4425 } | |
4426 | |
4427 pattern = GEN_FCN (code) (to, from); | |
4428 if (pattern == NULL_RTX) | |
4429 return false; | |
4430 | |
4431 emit_insn (pattern); | |
4432 return true; | |
4433 } | |
4434 | |
4435 /* Generate code for computing expression EXP, | |
4436 and storing the value into TARGET. | |
4437 | |
4438 If the mode is BLKmode then we may return TARGET itself. | |
4439 It turns out that in BLKmode it doesn't cause a problem. | |
4440 because C has no operators that could combine two different | |
4441 assignments into the same BLKmode object with different values | |
4442 with no sequence point. Will other languages need this to | |
4443 be more thorough? | |
4444 | |
4445 If CALL_PARAM_P is nonzero, this is a store into a call param on the | |
4446 stack, and block moves may need to be treated specially. | |
4447 | |
4448 If NONTEMPORAL is true, try using a nontemporal store instruction. */ | |
4449 | |
4450 rtx | |
4451 store_expr (tree exp, rtx target, int call_param_p, bool nontemporal) | |
4452 { | |
4453 rtx temp; | |
4454 rtx alt_rtl = NULL_RTX; | |
4455 int dont_return_target = 0; | |
4456 | |
4457 if (VOID_TYPE_P (TREE_TYPE (exp))) | |
4458 { | |
4459 /* C++ can generate ?: expressions with a throw expression in one | |
4460 branch and an rvalue in the other. Here, we resolve attempts to | |
4461 store the throw expression's nonexistent result. */ | |
4462 gcc_assert (!call_param_p); | |
4463 expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL); | |
4464 return NULL_RTX; | |
4465 } | |
4466 if (TREE_CODE (exp) == COMPOUND_EXPR) | |
4467 { | |
4468 /* Perform first part of compound expression, then assign from second | |
4469 part. */ | |
4470 expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, | |
4471 call_param_p ? EXPAND_STACK_PARM : EXPAND_NORMAL); | |
4472 return store_expr (TREE_OPERAND (exp, 1), target, call_param_p, | |
4473 nontemporal); | |
4474 } | |
4475 else if (TREE_CODE (exp) == COND_EXPR && GET_MODE (target) == BLKmode) | |
4476 { | |
4477 /* For conditional expression, get safe form of the target. Then | |
4478 test the condition, doing the appropriate assignment on either | |
4479 side. This avoids the creation of unnecessary temporaries. | |
4480 For non-BLKmode, it is more efficient not to do this. */ | |
4481 | |
4482 rtx lab1 = gen_label_rtx (), lab2 = gen_label_rtx (); | |
4483 | |
4484 do_pending_stack_adjust (); | |
4485 NO_DEFER_POP; | |
4486 jumpifnot (TREE_OPERAND (exp, 0), lab1); | |
4487 store_expr (TREE_OPERAND (exp, 1), target, call_param_p, | |
4488 nontemporal); | |
4489 emit_jump_insn (gen_jump (lab2)); | |
4490 emit_barrier (); | |
4491 emit_label (lab1); | |
4492 store_expr (TREE_OPERAND (exp, 2), target, call_param_p, | |
4493 nontemporal); | |
4494 emit_label (lab2); | |
4495 OK_DEFER_POP; | |
4496 | |
4497 return NULL_RTX; | |
4498 } | |
4499 else if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target)) | |
4500 /* If this is a scalar in a register that is stored in a wider mode | |
4501 than the declared mode, compute the result into its declared mode | |
4502 and then convert to the wider mode. Our value is the computed | |
4503 expression. */ | |
4504 { | |
4505 rtx inner_target = 0; | |
4506 | |
4507 /* We can do the conversion inside EXP, which will often result | |
4508 in some optimizations. Do the conversion in two steps: first | |
4509 change the signedness, if needed, then the extend. But don't | |
4510 do this if the type of EXP is a subtype of something else | |
4511 since then the conversion might involve more than just | |
4512 converting modes. */ | |
4513 if (INTEGRAL_TYPE_P (TREE_TYPE (exp)) | |
4514 && TREE_TYPE (TREE_TYPE (exp)) == 0 | |
4515 && GET_MODE_PRECISION (GET_MODE (target)) | |
4516 == TYPE_PRECISION (TREE_TYPE (exp))) | |
4517 { | |
4518 if (TYPE_UNSIGNED (TREE_TYPE (exp)) | |
4519 != SUBREG_PROMOTED_UNSIGNED_P (target)) | |
4520 { | |
4521 /* Some types, e.g. Fortran's logical*4, won't have a signed | |
4522 version, so use the mode instead. */ | |
4523 tree ntype | |
4524 = (signed_or_unsigned_type_for | |
4525 (SUBREG_PROMOTED_UNSIGNED_P (target), TREE_TYPE (exp))); | |
4526 if (ntype == NULL) | |
4527 ntype = lang_hooks.types.type_for_mode | |
4528 (TYPE_MODE (TREE_TYPE (exp)), | |
4529 SUBREG_PROMOTED_UNSIGNED_P (target)); | |
4530 | |
4531 exp = fold_convert (ntype, exp); | |
4532 } | |
4533 | |
4534 exp = fold_convert (lang_hooks.types.type_for_mode | |
4535 (GET_MODE (SUBREG_REG (target)), | |
4536 SUBREG_PROMOTED_UNSIGNED_P (target)), | |
4537 exp); | |
4538 | |
4539 inner_target = SUBREG_REG (target); | |
4540 } | |
4541 | |
4542 temp = expand_expr (exp, inner_target, VOIDmode, | |
4543 call_param_p ? EXPAND_STACK_PARM : EXPAND_NORMAL); | |
4544 | |
4545 /* If TEMP is a VOIDmode constant, use convert_modes to make | |
4546 sure that we properly convert it. */ | |
4547 if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode) | |
4548 { | |
4549 temp = convert_modes (GET_MODE (target), TYPE_MODE (TREE_TYPE (exp)), | |
4550 temp, SUBREG_PROMOTED_UNSIGNED_P (target)); | |
4551 temp = convert_modes (GET_MODE (SUBREG_REG (target)), | |
4552 GET_MODE (target), temp, | |
4553 SUBREG_PROMOTED_UNSIGNED_P (target)); | |
4554 } | |
4555 | |
4556 convert_move (SUBREG_REG (target), temp, | |
4557 SUBREG_PROMOTED_UNSIGNED_P (target)); | |
4558 | |
4559 return NULL_RTX; | |
4560 } | |
4561 else if (TREE_CODE (exp) == STRING_CST | |
4562 && !nontemporal && !call_param_p | |
4563 && TREE_STRING_LENGTH (exp) > 0 | |
4564 && TYPE_MODE (TREE_TYPE (exp)) == BLKmode) | |
4565 { | |
4566 /* Optimize initialization of an array with a STRING_CST. */ | |
4567 HOST_WIDE_INT exp_len, str_copy_len; | |
4568 rtx dest_mem; | |
4569 | |
4570 exp_len = int_expr_size (exp); | |
4571 if (exp_len <= 0) | |
4572 goto normal_expr; | |
4573 | |
4574 str_copy_len = strlen (TREE_STRING_POINTER (exp)); | |
4575 if (str_copy_len < TREE_STRING_LENGTH (exp) - 1) | |
4576 goto normal_expr; | |
4577 | |
4578 str_copy_len = TREE_STRING_LENGTH (exp); | |
4579 if ((STORE_MAX_PIECES & (STORE_MAX_PIECES - 1)) == 0) | |
4580 { | |
4581 str_copy_len += STORE_MAX_PIECES - 1; | |
4582 str_copy_len &= ~(STORE_MAX_PIECES - 1); | |
4583 } | |
4584 str_copy_len = MIN (str_copy_len, exp_len); | |
4585 if (!can_store_by_pieces (str_copy_len, builtin_strncpy_read_str, | |
4586 CONST_CAST(char *, TREE_STRING_POINTER (exp)), | |
4587 MEM_ALIGN (target), false)) | |
4588 goto normal_expr; | |
4589 | |
4590 dest_mem = target; | |
4591 | |
4592 dest_mem = store_by_pieces (dest_mem, | |
4593 str_copy_len, builtin_strncpy_read_str, | |
4594 CONST_CAST(char *, TREE_STRING_POINTER (exp)), | |
4595 MEM_ALIGN (target), false, | |
4596 exp_len > str_copy_len ? 1 : 0); | |
4597 if (exp_len > str_copy_len) | |
4598 clear_storage (adjust_address (dest_mem, BLKmode, 0), | |
4599 GEN_INT (exp_len - str_copy_len), | |
4600 BLOCK_OP_NORMAL); | |
4601 return NULL_RTX; | |
4602 } | |
4603 else | |
4604 { | |
4605 rtx tmp_target; | |
4606 | |
4607 normal_expr: | |
4608 /* If we want to use a nontemporal store, force the value to | |
4609 register first. */ | |
4610 tmp_target = nontemporal ? NULL_RTX : target; | |
4611 temp = expand_expr_real (exp, tmp_target, GET_MODE (target), | |
4612 (call_param_p | |
4613 ? EXPAND_STACK_PARM : EXPAND_NORMAL), | |
4614 &alt_rtl); | |
4615 /* Return TARGET if it's a specified hardware register. | |
4616 If TARGET is a volatile mem ref, either return TARGET | |
4617 or return a reg copied *from* TARGET; ANSI requires this. | |
4618 | |
4619 Otherwise, if TEMP is not TARGET, return TEMP | |
4620 if it is constant (for efficiency), | |
4621 or if we really want the correct value. */ | |
4622 if (!(target && REG_P (target) | |
4623 && REGNO (target) < FIRST_PSEUDO_REGISTER) | |
4624 && !(MEM_P (target) && MEM_VOLATILE_P (target)) | |
4625 && ! rtx_equal_p (temp, target) | |
4626 && CONSTANT_P (temp)) | |
4627 dont_return_target = 1; | |
4628 } | |
4629 | |
4630 /* If TEMP is a VOIDmode constant and the mode of the type of EXP is not | |
4631 the same as that of TARGET, adjust the constant. This is needed, for | |
4632 example, in case it is a CONST_DOUBLE and we want only a word-sized | |
4633 value. */ | |
4634 if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode | |
4635 && TREE_CODE (exp) != ERROR_MARK | |
4636 && GET_MODE (target) != TYPE_MODE (TREE_TYPE (exp))) | |
4637 temp = convert_modes (GET_MODE (target), TYPE_MODE (TREE_TYPE (exp)), | |
4638 temp, TYPE_UNSIGNED (TREE_TYPE (exp))); | |
4639 | |
4640 /* If value was not generated in the target, store it there. | |
4641 Convert the value to TARGET's type first if necessary and emit the | |
4642 pending incrementations that have been queued when expanding EXP. | |
4643 Note that we cannot emit the whole queue blindly because this will | |
4644 effectively disable the POST_INC optimization later. | |
4645 | |
4646 If TEMP and TARGET compare equal according to rtx_equal_p, but | |
4647 one or both of them are volatile memory refs, we have to distinguish | |
4648 two cases: | |
4649 - expand_expr has used TARGET. In this case, we must not generate | |
4650 another copy. This can be detected by TARGET being equal according | |
4651 to == . | |
4652 - expand_expr has not used TARGET - that means that the source just | |
4653 happens to have the same RTX form. Since temp will have been created | |
4654 by expand_expr, it will compare unequal according to == . | |
4655 We must generate a copy in this case, to reach the correct number | |
4656 of volatile memory references. */ | |
4657 | |
4658 if ((! rtx_equal_p (temp, target) | |
4659 || (temp != target && (side_effects_p (temp) | |
4660 || side_effects_p (target)))) | |
4661 && TREE_CODE (exp) != ERROR_MARK | |
4662 /* If store_expr stores a DECL whose DECL_RTL(exp) == TARGET, | |
4663 but TARGET is not valid memory reference, TEMP will differ | |
4664 from TARGET although it is really the same location. */ | |
4665 && !(alt_rtl && rtx_equal_p (alt_rtl, target)) | |
4666 /* If there's nothing to copy, don't bother. Don't call | |
4667 expr_size unless necessary, because some front-ends (C++) | |
4668 expr_size-hook must not be given objects that are not | |
4669 supposed to be bit-copied or bit-initialized. */ | |
4670 && expr_size (exp) != const0_rtx) | |
4671 { | |
4672 if (GET_MODE (temp) != GET_MODE (target) | |
4673 && GET_MODE (temp) != VOIDmode) | |
4674 { | |
4675 int unsignedp = TYPE_UNSIGNED (TREE_TYPE (exp)); | |
4676 if (dont_return_target) | |
4677 { | |
4678 /* In this case, we will return TEMP, | |
4679 so make sure it has the proper mode. | |
4680 But don't forget to store the value into TARGET. */ | |
4681 temp = convert_to_mode (GET_MODE (target), temp, unsignedp); | |
4682 emit_move_insn (target, temp); | |
4683 } | |
4684 else if (GET_MODE (target) == BLKmode | |
4685 || GET_MODE (temp) == BLKmode) | |
4686 emit_block_move (target, temp, expr_size (exp), | |
4687 (call_param_p | |
4688 ? BLOCK_OP_CALL_PARM | |
4689 : BLOCK_OP_NORMAL)); | |
4690 else | |
4691 convert_move (target, temp, unsignedp); | |
4692 } | |
4693 | |
4694 else if (GET_MODE (temp) == BLKmode && TREE_CODE (exp) == STRING_CST) | |
4695 { | |
4696 /* Handle copying a string constant into an array. The string | |
4697 constant may be shorter than the array. So copy just the string's | |
4698 actual length, and clear the rest. First get the size of the data | |
4699 type of the string, which is actually the size of the target. */ | |
4700 rtx size = expr_size (exp); | |
4701 | |
4702 if (GET_CODE (size) == CONST_INT | |
4703 && INTVAL (size) < TREE_STRING_LENGTH (exp)) | |
4704 emit_block_move (target, temp, size, | |
4705 (call_param_p | |
4706 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL)); | |
4707 else | |
4708 { | |
4709 /* Compute the size of the data to copy from the string. */ | |
4710 tree copy_size | |
4711 = size_binop (MIN_EXPR, | |
4712 make_tree (sizetype, size), | |
4713 size_int (TREE_STRING_LENGTH (exp))); | |
4714 rtx copy_size_rtx | |
4715 = expand_expr (copy_size, NULL_RTX, VOIDmode, | |
4716 (call_param_p | |
4717 ? EXPAND_STACK_PARM : EXPAND_NORMAL)); | |
4718 rtx label = 0; | |
4719 | |
4720 /* Copy that much. */ | |
4721 copy_size_rtx = convert_to_mode (ptr_mode, copy_size_rtx, | |
4722 TYPE_UNSIGNED (sizetype)); | |
4723 emit_block_move (target, temp, copy_size_rtx, | |
4724 (call_param_p | |
4725 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL)); | |
4726 | |
4727 /* Figure out how much is left in TARGET that we have to clear. | |
4728 Do all calculations in ptr_mode. */ | |
4729 if (GET_CODE (copy_size_rtx) == CONST_INT) | |
4730 { | |
4731 size = plus_constant (size, -INTVAL (copy_size_rtx)); | |
4732 target = adjust_address (target, BLKmode, | |
4733 INTVAL (copy_size_rtx)); | |
4734 } | |
4735 else | |
4736 { | |
4737 size = expand_binop (TYPE_MODE (sizetype), sub_optab, size, | |
4738 copy_size_rtx, NULL_RTX, 0, | |
4739 OPTAB_LIB_WIDEN); | |
4740 | |
4741 #ifdef POINTERS_EXTEND_UNSIGNED | |
4742 if (GET_MODE (copy_size_rtx) != Pmode) | |
4743 copy_size_rtx = convert_to_mode (Pmode, copy_size_rtx, | |
4744 TYPE_UNSIGNED (sizetype)); | |
4745 #endif | |
4746 | |
4747 target = offset_address (target, copy_size_rtx, | |
4748 highest_pow2_factor (copy_size)); | |
4749 label = gen_label_rtx (); | |
4750 emit_cmp_and_jump_insns (size, const0_rtx, LT, NULL_RTX, | |
4751 GET_MODE (size), 0, label); | |
4752 } | |
4753 | |
4754 if (size != const0_rtx) | |
4755 clear_storage (target, size, BLOCK_OP_NORMAL); | |
4756 | |
4757 if (label) | |
4758 emit_label (label); | |
4759 } | |
4760 } | |
4761 /* Handle calls that return values in multiple non-contiguous locations. | |
4762 The Irix 6 ABI has examples of this. */ | |
4763 else if (GET_CODE (target) == PARALLEL) | |
4764 emit_group_load (target, temp, TREE_TYPE (exp), | |
4765 int_size_in_bytes (TREE_TYPE (exp))); | |
4766 else if (GET_MODE (temp) == BLKmode) | |
4767 emit_block_move (target, temp, expr_size (exp), | |
4768 (call_param_p | |
4769 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL)); | |
4770 else if (nontemporal | |
4771 && emit_storent_insn (target, temp)) | |
4772 /* If we managed to emit a nontemporal store, there is nothing else to | |
4773 do. */ | |
4774 ; | |
4775 else | |
4776 { | |
4777 temp = force_operand (temp, target); | |
4778 if (temp != target) | |
4779 emit_move_insn (target, temp); | |
4780 } | |
4781 } | |
4782 | |
4783 return NULL_RTX; | |
4784 } | |
4785 | |
4786 /* Helper for categorize_ctor_elements. Identical interface. */ | |
4787 | |
4788 static bool | |
4789 categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts, | |
4790 HOST_WIDE_INT *p_elt_count, | |
4791 bool *p_must_clear) | |
4792 { | |
4793 unsigned HOST_WIDE_INT idx; | |
4794 HOST_WIDE_INT nz_elts, elt_count; | |
4795 tree value, purpose; | |
4796 | |
4797 /* Whether CTOR is a valid constant initializer, in accordance with what | |
4798 initializer_constant_valid_p does. If inferred from the constructor | |
4799 elements, true until proven otherwise. */ | |
4800 bool const_from_elts_p = constructor_static_from_elts_p (ctor); | |
4801 bool const_p = const_from_elts_p ? true : TREE_STATIC (ctor); | |
4802 | |
4803 nz_elts = 0; | |
4804 elt_count = 0; | |
4805 | |
4806 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), idx, purpose, value) | |
4807 { | |
4808 HOST_WIDE_INT mult; | |
4809 | |
4810 mult = 1; | |
4811 if (TREE_CODE (purpose) == RANGE_EXPR) | |
4812 { | |
4813 tree lo_index = TREE_OPERAND (purpose, 0); | |
4814 tree hi_index = TREE_OPERAND (purpose, 1); | |
4815 | |
4816 if (host_integerp (lo_index, 1) && host_integerp (hi_index, 1)) | |
4817 mult = (tree_low_cst (hi_index, 1) | |
4818 - tree_low_cst (lo_index, 1) + 1); | |
4819 } | |
4820 | |
4821 switch (TREE_CODE (value)) | |
4822 { | |
4823 case CONSTRUCTOR: | |
4824 { | |
4825 HOST_WIDE_INT nz = 0, ic = 0; | |
4826 | |
4827 bool const_elt_p | |
4828 = categorize_ctor_elements_1 (value, &nz, &ic, p_must_clear); | |
4829 | |
4830 nz_elts += mult * nz; | |
4831 elt_count += mult * ic; | |
4832 | |
4833 if (const_from_elts_p && const_p) | |
4834 const_p = const_elt_p; | |
4835 } | |
4836 break; | |
4837 | |
4838 case INTEGER_CST: | |
4839 case REAL_CST: | |
4840 case FIXED_CST: | |
4841 if (!initializer_zerop (value)) | |
4842 nz_elts += mult; | |
4843 elt_count += mult; | |
4844 break; | |
4845 | |
4846 case STRING_CST: | |
4847 nz_elts += mult * TREE_STRING_LENGTH (value); | |
4848 elt_count += mult * TREE_STRING_LENGTH (value); | |
4849 break; | |
4850 | |
4851 case COMPLEX_CST: | |
4852 if (!initializer_zerop (TREE_REALPART (value))) | |
4853 nz_elts += mult; | |
4854 if (!initializer_zerop (TREE_IMAGPART (value))) | |
4855 nz_elts += mult; | |
4856 elt_count += mult; | |
4857 break; | |
4858 | |
4859 case VECTOR_CST: | |
4860 { | |
4861 tree v; | |
4862 for (v = TREE_VECTOR_CST_ELTS (value); v; v = TREE_CHAIN (v)) | |
4863 { | |
4864 if (!initializer_zerop (TREE_VALUE (v))) | |
4865 nz_elts += mult; | |
4866 elt_count += mult; | |
4867 } | |
4868 } | |
4869 break; | |
4870 | |
4871 default: | |
4872 nz_elts += mult; | |
4873 elt_count += mult; | |
4874 | |
4875 if (const_from_elts_p && const_p) | |
4876 const_p = initializer_constant_valid_p (value, TREE_TYPE (value)) | |
4877 != NULL_TREE; | |
4878 break; | |
4879 } | |
4880 } | |
4881 | |
4882 if (!*p_must_clear | |
4883 && (TREE_CODE (TREE_TYPE (ctor)) == UNION_TYPE | |
4884 || TREE_CODE (TREE_TYPE (ctor)) == QUAL_UNION_TYPE)) | |
4885 { | |
4886 tree init_sub_type; | |
4887 bool clear_this = true; | |
4888 | |
4889 if (!VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (ctor))) | |
4890 { | |
4891 /* We don't expect more than one element of the union to be | |
4892 initialized. Not sure what we should do otherwise... */ | |
4893 gcc_assert (VEC_length (constructor_elt, CONSTRUCTOR_ELTS (ctor)) | |
4894 == 1); | |
4895 | |
4896 init_sub_type = TREE_TYPE (VEC_index (constructor_elt, | |
4897 CONSTRUCTOR_ELTS (ctor), | |
4898 0)->value); | |
4899 | |
4900 /* ??? We could look at each element of the union, and find the | |
4901 largest element. Which would avoid comparing the size of the | |
4902 initialized element against any tail padding in the union. | |
4903 Doesn't seem worth the effort... */ | |
4904 if (simple_cst_equal (TYPE_SIZE (TREE_TYPE (ctor)), | |
4905 TYPE_SIZE (init_sub_type)) == 1) | |
4906 { | |
4907 /* And now we have to find out if the element itself is fully | |
4908 constructed. E.g. for union { struct { int a, b; } s; } u | |
4909 = { .s = { .a = 1 } }. */ | |
4910 if (elt_count == count_type_elements (init_sub_type, false)) | |
4911 clear_this = false; | |
4912 } | |
4913 } | |
4914 | |
4915 *p_must_clear = clear_this; | |
4916 } | |
4917 | |
4918 *p_nz_elts += nz_elts; | |
4919 *p_elt_count += elt_count; | |
4920 | |
4921 return const_p; | |
4922 } | |
4923 | |
4924 /* Examine CTOR to discover: | |
4925 * how many scalar fields are set to nonzero values, | |
4926 and place it in *P_NZ_ELTS; | |
4927 * how many scalar fields in total are in CTOR, | |
4928 and place it in *P_ELT_COUNT. | |
4929 * if a type is a union, and the initializer from the constructor | |
4930 is not the largest element in the union, then set *p_must_clear. | |
4931 | |
4932 Return whether or not CTOR is a valid static constant initializer, the same | |
4933 as "initializer_constant_valid_p (CTOR, TREE_TYPE (CTOR)) != 0". */ | |
4934 | |
4935 bool | |
4936 categorize_ctor_elements (const_tree ctor, HOST_WIDE_INT *p_nz_elts, | |
4937 HOST_WIDE_INT *p_elt_count, | |
4938 bool *p_must_clear) | |
4939 { | |
4940 *p_nz_elts = 0; | |
4941 *p_elt_count = 0; | |
4942 *p_must_clear = false; | |
4943 | |
4944 return | |
4945 categorize_ctor_elements_1 (ctor, p_nz_elts, p_elt_count, p_must_clear); | |
4946 } | |
4947 | |
4948 /* Count the number of scalars in TYPE. Return -1 on overflow or | |
4949 variable-sized. If ALLOW_FLEXARR is true, don't count flexible | |
4950 array member at the end of the structure. */ | |
4951 | |
4952 HOST_WIDE_INT | |
4953 count_type_elements (const_tree type, bool allow_flexarr) | |
4954 { | |
4955 const HOST_WIDE_INT max = ~((HOST_WIDE_INT)1 << (HOST_BITS_PER_WIDE_INT-1)); | |
4956 switch (TREE_CODE (type)) | |
4957 { | |
4958 case ARRAY_TYPE: | |
4959 { | |
4960 tree telts = array_type_nelts (type); | |
4961 if (telts && host_integerp (telts, 1)) | |
4962 { | |
4963 HOST_WIDE_INT n = tree_low_cst (telts, 1) + 1; | |
4964 HOST_WIDE_INT m = count_type_elements (TREE_TYPE (type), false); | |
4965 if (n == 0) | |
4966 return 0; | |
4967 else if (max / n > m) | |
4968 return n * m; | |
4969 } | |
4970 return -1; | |
4971 } | |
4972 | |
4973 case RECORD_TYPE: | |
4974 { | |
4975 HOST_WIDE_INT n = 0, t; | |
4976 tree f; | |
4977 | |
4978 for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f)) | |
4979 if (TREE_CODE (f) == FIELD_DECL) | |
4980 { | |
4981 t = count_type_elements (TREE_TYPE (f), false); | |
4982 if (t < 0) | |
4983 { | |
4984 /* Check for structures with flexible array member. */ | |
4985 tree tf = TREE_TYPE (f); | |
4986 if (allow_flexarr | |
4987 && TREE_CHAIN (f) == NULL | |
4988 && TREE_CODE (tf) == ARRAY_TYPE | |
4989 && TYPE_DOMAIN (tf) | |
4990 && TYPE_MIN_VALUE (TYPE_DOMAIN (tf)) | |
4991 && integer_zerop (TYPE_MIN_VALUE (TYPE_DOMAIN (tf))) | |
4992 && !TYPE_MAX_VALUE (TYPE_DOMAIN (tf)) | |
4993 && int_size_in_bytes (type) >= 0) | |
4994 break; | |
4995 | |
4996 return -1; | |
4997 } | |
4998 n += t; | |
4999 } | |
5000 | |
5001 return n; | |
5002 } | |
5003 | |
5004 case UNION_TYPE: | |
5005 case QUAL_UNION_TYPE: | |
5006 return -1; | |
5007 | |
5008 case COMPLEX_TYPE: | |
5009 return 2; | |
5010 | |
5011 case VECTOR_TYPE: | |
5012 return TYPE_VECTOR_SUBPARTS (type); | |
5013 | |
5014 case INTEGER_TYPE: | |
5015 case REAL_TYPE: | |
5016 case FIXED_POINT_TYPE: | |
5017 case ENUMERAL_TYPE: | |
5018 case BOOLEAN_TYPE: | |
5019 case POINTER_TYPE: | |
5020 case OFFSET_TYPE: | |
5021 case REFERENCE_TYPE: | |
5022 return 1; | |
5023 | |
5024 case ERROR_MARK: | |
5025 return 0; | |
5026 | |
5027 case VOID_TYPE: | |
5028 case METHOD_TYPE: | |
5029 case FUNCTION_TYPE: | |
5030 case LANG_TYPE: | |
5031 default: | |
5032 gcc_unreachable (); | |
5033 } | |
5034 } | |
5035 | |
5036 /* Return 1 if EXP contains mostly (3/4) zeros. */ | |
5037 | |
5038 static int | |
5039 mostly_zeros_p (const_tree exp) | |
5040 { | |
5041 if (TREE_CODE (exp) == CONSTRUCTOR) | |
5042 | |
5043 { | |
5044 HOST_WIDE_INT nz_elts, count, elts; | |
5045 bool must_clear; | |
5046 | |
5047 categorize_ctor_elements (exp, &nz_elts, &count, &must_clear); | |
5048 if (must_clear) | |
5049 return 1; | |
5050 | |
5051 elts = count_type_elements (TREE_TYPE (exp), false); | |
5052 | |
5053 return nz_elts < elts / 4; | |
5054 } | |
5055 | |
5056 return initializer_zerop (exp); | |
5057 } | |
5058 | |
5059 /* Return 1 if EXP contains all zeros. */ | |
5060 | |
5061 static int | |
5062 all_zeros_p (const_tree exp) | |
5063 { | |
5064 if (TREE_CODE (exp) == CONSTRUCTOR) | |
5065 | |
5066 { | |
5067 HOST_WIDE_INT nz_elts, count; | |
5068 bool must_clear; | |
5069 | |
5070 categorize_ctor_elements (exp, &nz_elts, &count, &must_clear); | |
5071 return nz_elts == 0; | |
5072 } | |
5073 | |
5074 return initializer_zerop (exp); | |
5075 } | |
5076 | |
5077 /* Helper function for store_constructor. | |
5078 TARGET, BITSIZE, BITPOS, MODE, EXP are as for store_field. | |
5079 TYPE is the type of the CONSTRUCTOR, not the element type. | |
5080 CLEARED is as for store_constructor. | |
5081 ALIAS_SET is the alias set to use for any stores. | |
5082 | |
5083 This provides a recursive shortcut back to store_constructor when it isn't | |
5084 necessary to go through store_field. This is so that we can pass through | |
5085 the cleared field to let store_constructor know that we may not have to | |
5086 clear a substructure if the outer structure has already been cleared. */ | |
5087 | |
5088 static void | |
5089 store_constructor_field (rtx target, unsigned HOST_WIDE_INT bitsize, | |
5090 HOST_WIDE_INT bitpos, enum machine_mode mode, | |
5091 tree exp, tree type, int cleared, | |
5092 alias_set_type alias_set) | |
5093 { | |
5094 if (TREE_CODE (exp) == CONSTRUCTOR | |
5095 /* We can only call store_constructor recursively if the size and | |
5096 bit position are on a byte boundary. */ | |
5097 && bitpos % BITS_PER_UNIT == 0 | |
5098 && (bitsize > 0 && bitsize % BITS_PER_UNIT == 0) | |
5099 /* If we have a nonzero bitpos for a register target, then we just | |
5100 let store_field do the bitfield handling. This is unlikely to | |
5101 generate unnecessary clear instructions anyways. */ | |
5102 && (bitpos == 0 || MEM_P (target))) | |
5103 { | |
5104 if (MEM_P (target)) | |
5105 target | |
5106 = adjust_address (target, | |
5107 GET_MODE (target) == BLKmode | |
5108 || 0 != (bitpos | |
5109 % GET_MODE_ALIGNMENT (GET_MODE (target))) | |
5110 ? BLKmode : VOIDmode, bitpos / BITS_PER_UNIT); | |
5111 | |
5112 | |
5113 /* Update the alias set, if required. */ | |
5114 if (MEM_P (target) && ! MEM_KEEP_ALIAS_SET_P (target) | |
5115 && MEM_ALIAS_SET (target) != 0) | |
5116 { | |
5117 target = copy_rtx (target); | |
5118 set_mem_alias_set (target, alias_set); | |
5119 } | |
5120 | |
5121 store_constructor (exp, target, cleared, bitsize / BITS_PER_UNIT); | |
5122 } | |
5123 else | |
5124 store_field (target, bitsize, bitpos, mode, exp, type, alias_set, false); | |
5125 } | |
5126 | |
5127 /* Store the value of constructor EXP into the rtx TARGET. | |
5128 TARGET is either a REG or a MEM; we know it cannot conflict, since | |
5129 safe_from_p has been called. | |
5130 CLEARED is true if TARGET is known to have been zero'd. | |
5131 SIZE is the number of bytes of TARGET we are allowed to modify: this | |
5132 may not be the same as the size of EXP if we are assigning to a field | |
5133 which has been packed to exclude padding bits. */ | |
5134 | |
5135 static void | |
5136 store_constructor (tree exp, rtx target, int cleared, HOST_WIDE_INT size) | |
5137 { | |
5138 tree type = TREE_TYPE (exp); | |
5139 #ifdef WORD_REGISTER_OPERATIONS | |
5140 HOST_WIDE_INT exp_size = int_size_in_bytes (type); | |
5141 #endif | |
5142 | |
5143 switch (TREE_CODE (type)) | |
5144 { | |
5145 case RECORD_TYPE: | |
5146 case UNION_TYPE: | |
5147 case QUAL_UNION_TYPE: | |
5148 { | |
5149 unsigned HOST_WIDE_INT idx; | |
5150 tree field, value; | |
5151 | |
5152 /* If size is zero or the target is already cleared, do nothing. */ | |
5153 if (size == 0 || cleared) | |
5154 cleared = 1; | |
5155 /* We either clear the aggregate or indicate the value is dead. */ | |
5156 else if ((TREE_CODE (type) == UNION_TYPE | |
5157 || TREE_CODE (type) == QUAL_UNION_TYPE) | |
5158 && ! CONSTRUCTOR_ELTS (exp)) | |
5159 /* If the constructor is empty, clear the union. */ | |
5160 { | |
5161 clear_storage (target, expr_size (exp), BLOCK_OP_NORMAL); | |
5162 cleared = 1; | |
5163 } | |
5164 | |
5165 /* If we are building a static constructor into a register, | |
5166 set the initial value as zero so we can fold the value into | |
5167 a constant. But if more than one register is involved, | |
5168 this probably loses. */ | |
5169 else if (REG_P (target) && TREE_STATIC (exp) | |
5170 && GET_MODE_SIZE (GET_MODE (target)) <= UNITS_PER_WORD) | |
5171 { | |
5172 emit_move_insn (target, CONST0_RTX (GET_MODE (target))); | |
5173 cleared = 1; | |
5174 } | |
5175 | |
5176 /* If the constructor has fewer fields than the structure or | |
5177 if we are initializing the structure to mostly zeros, clear | |
5178 the whole structure first. Don't do this if TARGET is a | |
5179 register whose mode size isn't equal to SIZE since | |
5180 clear_storage can't handle this case. */ | |
5181 else if (size > 0 | |
5182 && (((int)VEC_length (constructor_elt, CONSTRUCTOR_ELTS (exp)) | |
5183 != fields_length (type)) | |
5184 || mostly_zeros_p (exp)) | |
5185 && (!REG_P (target) | |
5186 || ((HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (target)) | |
5187 == size))) | |
5188 { | |
5189 clear_storage (target, GEN_INT (size), BLOCK_OP_NORMAL); | |
5190 cleared = 1; | |
5191 } | |
5192 | |
5193 if (REG_P (target) && !cleared) | |
5194 emit_clobber (target); | |
5195 | |
5196 /* Store each element of the constructor into the | |
5197 corresponding field of TARGET. */ | |
5198 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, field, value) | |
5199 { | |
5200 enum machine_mode mode; | |
5201 HOST_WIDE_INT bitsize; | |
5202 HOST_WIDE_INT bitpos = 0; | |
5203 tree offset; | |
5204 rtx to_rtx = target; | |
5205 | |
5206 /* Just ignore missing fields. We cleared the whole | |
5207 structure, above, if any fields are missing. */ | |
5208 if (field == 0) | |
5209 continue; | |
5210 | |
5211 if (cleared && initializer_zerop (value)) | |
5212 continue; | |
5213 | |
5214 if (host_integerp (DECL_SIZE (field), 1)) | |
5215 bitsize = tree_low_cst (DECL_SIZE (field), 1); | |
5216 else | |
5217 bitsize = -1; | |
5218 | |
5219 mode = DECL_MODE (field); | |
5220 if (DECL_BIT_FIELD (field)) | |
5221 mode = VOIDmode; | |
5222 | |
5223 offset = DECL_FIELD_OFFSET (field); | |
5224 if (host_integerp (offset, 0) | |
5225 && host_integerp (bit_position (field), 0)) | |
5226 { | |
5227 bitpos = int_bit_position (field); | |
5228 offset = 0; | |
5229 } | |
5230 else | |
5231 bitpos = tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 0); | |
5232 | |
5233 if (offset) | |
5234 { | |
5235 rtx offset_rtx; | |
5236 | |
5237 offset | |
5238 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (offset, | |
5239 make_tree (TREE_TYPE (exp), | |
5240 target)); | |
5241 | |
5242 offset_rtx = expand_normal (offset); | |
5243 gcc_assert (MEM_P (to_rtx)); | |
5244 | |
5245 #ifdef POINTERS_EXTEND_UNSIGNED | |
5246 if (GET_MODE (offset_rtx) != Pmode) | |
5247 offset_rtx = convert_to_mode (Pmode, offset_rtx, 0); | |
5248 #else | |
5249 if (GET_MODE (offset_rtx) != ptr_mode) | |
5250 offset_rtx = convert_to_mode (ptr_mode, offset_rtx, 0); | |
5251 #endif | |
5252 | |
5253 to_rtx = offset_address (to_rtx, offset_rtx, | |
5254 highest_pow2_factor (offset)); | |
5255 } | |
5256 | |
5257 #ifdef WORD_REGISTER_OPERATIONS | |
5258 /* If this initializes a field that is smaller than a | |
5259 word, at the start of a word, try to widen it to a full | |
5260 word. This special case allows us to output C++ member | |
5261 function initializations in a form that the optimizers | |
5262 can understand. */ | |
5263 if (REG_P (target) | |
5264 && bitsize < BITS_PER_WORD | |
5265 && bitpos % BITS_PER_WORD == 0 | |
5266 && GET_MODE_CLASS (mode) == MODE_INT | |
5267 && TREE_CODE (value) == INTEGER_CST | |
5268 && exp_size >= 0 | |
5269 && bitpos + BITS_PER_WORD <= exp_size * BITS_PER_UNIT) | |
5270 { | |
5271 tree type = TREE_TYPE (value); | |
5272 | |
5273 if (TYPE_PRECISION (type) < BITS_PER_WORD) | |
5274 { | |
5275 type = lang_hooks.types.type_for_size | |
5276 (BITS_PER_WORD, TYPE_UNSIGNED (type)); | |
5277 value = fold_convert (type, value); | |
5278 } | |
5279 | |
5280 if (BYTES_BIG_ENDIAN) | |
5281 value | |
5282 = fold_build2 (LSHIFT_EXPR, type, value, | |
5283 build_int_cst (type, | |
5284 BITS_PER_WORD - bitsize)); | |
5285 bitsize = BITS_PER_WORD; | |
5286 mode = word_mode; | |
5287 } | |
5288 #endif | |
5289 | |
5290 if (MEM_P (to_rtx) && !MEM_KEEP_ALIAS_SET_P (to_rtx) | |
5291 && DECL_NONADDRESSABLE_P (field)) | |
5292 { | |
5293 to_rtx = copy_rtx (to_rtx); | |
5294 MEM_KEEP_ALIAS_SET_P (to_rtx) = 1; | |
5295 } | |
5296 | |
5297 store_constructor_field (to_rtx, bitsize, bitpos, mode, | |
5298 value, type, cleared, | |
5299 get_alias_set (TREE_TYPE (field))); | |
5300 } | |
5301 break; | |
5302 } | |
5303 case ARRAY_TYPE: | |
5304 { | |
5305 tree value, index; | |
5306 unsigned HOST_WIDE_INT i; | |
5307 int need_to_clear; | |
5308 tree domain; | |
5309 tree elttype = TREE_TYPE (type); | |
5310 int const_bounds_p; | |
5311 HOST_WIDE_INT minelt = 0; | |
5312 HOST_WIDE_INT maxelt = 0; | |
5313 | |
5314 domain = TYPE_DOMAIN (type); | |
5315 const_bounds_p = (TYPE_MIN_VALUE (domain) | |
5316 && TYPE_MAX_VALUE (domain) | |
5317 && host_integerp (TYPE_MIN_VALUE (domain), 0) | |
5318 && host_integerp (TYPE_MAX_VALUE (domain), 0)); | |
5319 | |
5320 /* If we have constant bounds for the range of the type, get them. */ | |
5321 if (const_bounds_p) | |
5322 { | |
5323 minelt = tree_low_cst (TYPE_MIN_VALUE (domain), 0); | |
5324 maxelt = tree_low_cst (TYPE_MAX_VALUE (domain), 0); | |
5325 } | |
5326 | |
5327 /* If the constructor has fewer elements than the array, clear | |
5328 the whole array first. Similarly if this is static | |
5329 constructor of a non-BLKmode object. */ | |
5330 if (cleared) | |
5331 need_to_clear = 0; | |
5332 else if (REG_P (target) && TREE_STATIC (exp)) | |
5333 need_to_clear = 1; | |
5334 else | |
5335 { | |
5336 unsigned HOST_WIDE_INT idx; | |
5337 tree index, value; | |
5338 HOST_WIDE_INT count = 0, zero_count = 0; | |
5339 need_to_clear = ! const_bounds_p; | |
5340 | |
5341 /* This loop is a more accurate version of the loop in | |
5342 mostly_zeros_p (it handles RANGE_EXPR in an index). It | |
5343 is also needed to check for missing elements. */ | |
5344 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, index, value) | |
5345 { | |
5346 HOST_WIDE_INT this_node_count; | |
5347 | |
5348 if (need_to_clear) | |
5349 break; | |
5350 | |
5351 if (index != NULL_TREE && TREE_CODE (index) == RANGE_EXPR) | |
5352 { | |
5353 tree lo_index = TREE_OPERAND (index, 0); | |
5354 tree hi_index = TREE_OPERAND (index, 1); | |
5355 | |
5356 if (! host_integerp (lo_index, 1) | |
5357 || ! host_integerp (hi_index, 1)) | |
5358 { | |
5359 need_to_clear = 1; | |
5360 break; | |
5361 } | |
5362 | |
5363 this_node_count = (tree_low_cst (hi_index, 1) | |
5364 - tree_low_cst (lo_index, 1) + 1); | |
5365 } | |
5366 else | |
5367 this_node_count = 1; | |
5368 | |
5369 count += this_node_count; | |
5370 if (mostly_zeros_p (value)) | |
5371 zero_count += this_node_count; | |
5372 } | |
5373 | |
5374 /* Clear the entire array first if there are any missing | |
5375 elements, or if the incidence of zero elements is >= | |
5376 75%. */ | |
5377 if (! need_to_clear | |
5378 && (count < maxelt - minelt + 1 | |
5379 || 4 * zero_count >= 3 * count)) | |
5380 need_to_clear = 1; | |
5381 } | |
5382 | |
5383 if (need_to_clear && size > 0) | |
5384 { | |
5385 if (REG_P (target)) | |
5386 emit_move_insn (target, CONST0_RTX (GET_MODE (target))); | |
5387 else | |
5388 clear_storage (target, GEN_INT (size), BLOCK_OP_NORMAL); | |
5389 cleared = 1; | |
5390 } | |
5391 | |
5392 if (!cleared && REG_P (target)) | |
5393 /* Inform later passes that the old value is dead. */ | |
5394 emit_clobber (target); | |
5395 | |
5396 /* Store each element of the constructor into the | |
5397 corresponding element of TARGET, determined by counting the | |
5398 elements. */ | |
5399 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), i, index, value) | |
5400 { | |
5401 enum machine_mode mode; | |
5402 HOST_WIDE_INT bitsize; | |
5403 HOST_WIDE_INT bitpos; | |
5404 int unsignedp; | |
5405 rtx xtarget = target; | |
5406 | |
5407 if (cleared && initializer_zerop (value)) | |
5408 continue; | |
5409 | |
5410 unsignedp = TYPE_UNSIGNED (elttype); | |
5411 mode = TYPE_MODE (elttype); | |
5412 if (mode == BLKmode) | |
5413 bitsize = (host_integerp (TYPE_SIZE (elttype), 1) | |
5414 ? tree_low_cst (TYPE_SIZE (elttype), 1) | |
5415 : -1); | |
5416 else | |
5417 bitsize = GET_MODE_BITSIZE (mode); | |
5418 | |
5419 if (index != NULL_TREE && TREE_CODE (index) == RANGE_EXPR) | |
5420 { | |
5421 tree lo_index = TREE_OPERAND (index, 0); | |
5422 tree hi_index = TREE_OPERAND (index, 1); | |
5423 rtx index_r, pos_rtx; | |
5424 HOST_WIDE_INT lo, hi, count; | |
5425 tree position; | |
5426 | |
5427 /* If the range is constant and "small", unroll the loop. */ | |
5428 if (const_bounds_p | |
5429 && host_integerp (lo_index, 0) | |
5430 && host_integerp (hi_index, 0) | |
5431 && (lo = tree_low_cst (lo_index, 0), | |
5432 hi = tree_low_cst (hi_index, 0), | |
5433 count = hi - lo + 1, | |
5434 (!MEM_P (target) | |
5435 || count <= 2 | |
5436 || (host_integerp (TYPE_SIZE (elttype), 1) | |
5437 && (tree_low_cst (TYPE_SIZE (elttype), 1) * count | |
5438 <= 40 * 8))))) | |
5439 { | |
5440 lo -= minelt; hi -= minelt; | |
5441 for (; lo <= hi; lo++) | |
5442 { | |
5443 bitpos = lo * tree_low_cst (TYPE_SIZE (elttype), 0); | |
5444 | |
5445 if (MEM_P (target) | |
5446 && !MEM_KEEP_ALIAS_SET_P (target) | |
5447 && TREE_CODE (type) == ARRAY_TYPE | |
5448 && TYPE_NONALIASED_COMPONENT (type)) | |
5449 { | |
5450 target = copy_rtx (target); | |
5451 MEM_KEEP_ALIAS_SET_P (target) = 1; | |
5452 } | |
5453 | |
5454 store_constructor_field | |
5455 (target, bitsize, bitpos, mode, value, type, cleared, | |
5456 get_alias_set (elttype)); | |
5457 } | |
5458 } | |
5459 else | |
5460 { | |
5461 rtx loop_start = gen_label_rtx (); | |
5462 rtx loop_end = gen_label_rtx (); | |
5463 tree exit_cond; | |
5464 | |
5465 expand_normal (hi_index); | |
5466 unsignedp = TYPE_UNSIGNED (domain); | |
5467 | |
5468 index = build_decl (VAR_DECL, NULL_TREE, domain); | |
5469 | |
5470 index_r | |
5471 = gen_reg_rtx (promote_mode (domain, DECL_MODE (index), | |
5472 &unsignedp, 0)); | |
5473 SET_DECL_RTL (index, index_r); | |
5474 store_expr (lo_index, index_r, 0, false); | |
5475 | |
5476 /* Build the head of the loop. */ | |
5477 do_pending_stack_adjust (); | |
5478 emit_label (loop_start); | |
5479 | |
5480 /* Assign value to element index. */ | |
5481 position = | |
5482 fold_convert (ssizetype, | |
5483 fold_build2 (MINUS_EXPR, | |
5484 TREE_TYPE (index), | |
5485 index, | |
5486 TYPE_MIN_VALUE (domain))); | |
5487 | |
5488 position = | |
5489 size_binop (MULT_EXPR, position, | |
5490 fold_convert (ssizetype, | |
5491 TYPE_SIZE_UNIT (elttype))); | |
5492 | |
5493 pos_rtx = expand_normal (position); | |
5494 xtarget = offset_address (target, pos_rtx, | |
5495 highest_pow2_factor (position)); | |
5496 xtarget = adjust_address (xtarget, mode, 0); | |
5497 if (TREE_CODE (value) == CONSTRUCTOR) | |
5498 store_constructor (value, xtarget, cleared, | |
5499 bitsize / BITS_PER_UNIT); | |
5500 else | |
5501 store_expr (value, xtarget, 0, false); | |
5502 | |
5503 /* Generate a conditional jump to exit the loop. */ | |
5504 exit_cond = build2 (LT_EXPR, integer_type_node, | |
5505 index, hi_index); | |
5506 jumpif (exit_cond, loop_end); | |
5507 | |
5508 /* Update the loop counter, and jump to the head of | |
5509 the loop. */ | |
5510 expand_assignment (index, | |
5511 build2 (PLUS_EXPR, TREE_TYPE (index), | |
5512 index, integer_one_node), | |
5513 false); | |
5514 | |
5515 emit_jump (loop_start); | |
5516 | |
5517 /* Build the end of the loop. */ | |
5518 emit_label (loop_end); | |
5519 } | |
5520 } | |
5521 else if ((index != 0 && ! host_integerp (index, 0)) | |
5522 || ! host_integerp (TYPE_SIZE (elttype), 1)) | |
5523 { | |
5524 tree position; | |
5525 | |
5526 if (index == 0) | |
5527 index = ssize_int (1); | |
5528 | |
5529 if (minelt) | |
5530 index = fold_convert (ssizetype, | |
5531 fold_build2 (MINUS_EXPR, | |
5532 TREE_TYPE (index), | |
5533 index, | |
5534 TYPE_MIN_VALUE (domain))); | |
5535 | |
5536 position = | |
5537 size_binop (MULT_EXPR, index, | |
5538 fold_convert (ssizetype, | |
5539 TYPE_SIZE_UNIT (elttype))); | |
5540 xtarget = offset_address (target, | |
5541 expand_normal (position), | |
5542 highest_pow2_factor (position)); | |
5543 xtarget = adjust_address (xtarget, mode, 0); | |
5544 store_expr (value, xtarget, 0, false); | |
5545 } | |
5546 else | |
5547 { | |
5548 if (index != 0) | |
5549 bitpos = ((tree_low_cst (index, 0) - minelt) | |
5550 * tree_low_cst (TYPE_SIZE (elttype), 1)); | |
5551 else | |
5552 bitpos = (i * tree_low_cst (TYPE_SIZE (elttype), 1)); | |
5553 | |
5554 if (MEM_P (target) && !MEM_KEEP_ALIAS_SET_P (target) | |
5555 && TREE_CODE (type) == ARRAY_TYPE | |
5556 && TYPE_NONALIASED_COMPONENT (type)) | |
5557 { | |
5558 target = copy_rtx (target); | |
5559 MEM_KEEP_ALIAS_SET_P (target) = 1; | |
5560 } | |
5561 store_constructor_field (target, bitsize, bitpos, mode, value, | |
5562 type, cleared, get_alias_set (elttype)); | |
5563 } | |
5564 } | |
5565 break; | |
5566 } | |
5567 | |
5568 case VECTOR_TYPE: | |
5569 { | |
5570 unsigned HOST_WIDE_INT idx; | |
5571 constructor_elt *ce; | |
5572 int i; | |
5573 int need_to_clear; | |
5574 int icode = 0; | |
5575 tree elttype = TREE_TYPE (type); | |
5576 int elt_size = tree_low_cst (TYPE_SIZE (elttype), 1); | |
5577 enum machine_mode eltmode = TYPE_MODE (elttype); | |
5578 HOST_WIDE_INT bitsize; | |
5579 HOST_WIDE_INT bitpos; | |
5580 rtvec vector = NULL; | |
5581 unsigned n_elts; | |
5582 alias_set_type alias; | |
5583 | |
5584 gcc_assert (eltmode != BLKmode); | |
5585 | |
5586 n_elts = TYPE_VECTOR_SUBPARTS (type); | |
5587 if (REG_P (target) && VECTOR_MODE_P (GET_MODE (target))) | |
5588 { | |
5589 enum machine_mode mode = GET_MODE (target); | |
5590 | |
5591 icode = (int) optab_handler (vec_init_optab, mode)->insn_code; | |
5592 if (icode != CODE_FOR_nothing) | |
5593 { | |
5594 unsigned int i; | |
5595 | |
5596 vector = rtvec_alloc (n_elts); | |
5597 for (i = 0; i < n_elts; i++) | |
5598 RTVEC_ELT (vector, i) = CONST0_RTX (GET_MODE_INNER (mode)); | |
5599 } | |
5600 } | |
5601 | |
5602 /* If the constructor has fewer elements than the vector, | |
5603 clear the whole array first. Similarly if this is static | |
5604 constructor of a non-BLKmode object. */ | |
5605 if (cleared) | |
5606 need_to_clear = 0; | |
5607 else if (REG_P (target) && TREE_STATIC (exp)) | |
5608 need_to_clear = 1; | |
5609 else | |
5610 { | |
5611 unsigned HOST_WIDE_INT count = 0, zero_count = 0; | |
5612 tree value; | |
5613 | |
5614 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value) | |
5615 { | |
5616 int n_elts_here = tree_low_cst | |
5617 (int_const_binop (TRUNC_DIV_EXPR, | |
5618 TYPE_SIZE (TREE_TYPE (value)), | |
5619 TYPE_SIZE (elttype), 0), 1); | |
5620 | |
5621 count += n_elts_here; | |
5622 if (mostly_zeros_p (value)) | |
5623 zero_count += n_elts_here; | |
5624 } | |
5625 | |
5626 /* Clear the entire vector first if there are any missing elements, | |
5627 or if the incidence of zero elements is >= 75%. */ | |
5628 need_to_clear = (count < n_elts || 4 * zero_count >= 3 * count); | |
5629 } | |
5630 | |
5631 if (need_to_clear && size > 0 && !vector) | |
5632 { | |
5633 if (REG_P (target)) | |
5634 emit_move_insn (target, CONST0_RTX (GET_MODE (target))); | |
5635 else | |
5636 clear_storage (target, GEN_INT (size), BLOCK_OP_NORMAL); | |
5637 cleared = 1; | |
5638 } | |
5639 | |
5640 /* Inform later passes that the old value is dead. */ | |
5641 if (!cleared && !vector && REG_P (target)) | |
5642 emit_move_insn (target, CONST0_RTX (GET_MODE (target))); | |
5643 | |
5644 if (MEM_P (target)) | |
5645 alias = MEM_ALIAS_SET (target); | |
5646 else | |
5647 alias = get_alias_set (elttype); | |
5648 | |
5649 /* Store each element of the constructor into the corresponding | |
5650 element of TARGET, determined by counting the elements. */ | |
5651 for (idx = 0, i = 0; | |
5652 VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), idx, ce); | |
5653 idx++, i += bitsize / elt_size) | |
5654 { | |
5655 HOST_WIDE_INT eltpos; | |
5656 tree value = ce->value; | |
5657 | |
5658 bitsize = tree_low_cst (TYPE_SIZE (TREE_TYPE (value)), 1); | |
5659 if (cleared && initializer_zerop (value)) | |
5660 continue; | |
5661 | |
5662 if (ce->index) | |
5663 eltpos = tree_low_cst (ce->index, 1); | |
5664 else | |
5665 eltpos = i; | |
5666 | |
5667 if (vector) | |
5668 { | |
5669 /* Vector CONSTRUCTORs should only be built from smaller | |
5670 vectors in the case of BLKmode vectors. */ | |
5671 gcc_assert (TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE); | |
5672 RTVEC_ELT (vector, eltpos) | |
5673 = expand_normal (value); | |
5674 } | |
5675 else | |
5676 { | |
5677 enum machine_mode value_mode = | |
5678 TREE_CODE (TREE_TYPE (value)) == VECTOR_TYPE | |
5679 ? TYPE_MODE (TREE_TYPE (value)) | |
5680 : eltmode; | |
5681 bitpos = eltpos * elt_size; | |
5682 store_constructor_field (target, bitsize, bitpos, | |
5683 value_mode, value, type, | |
5684 cleared, alias); | |
5685 } | |
5686 } | |
5687 | |
5688 if (vector) | |
5689 emit_insn (GEN_FCN (icode) | |
5690 (target, | |
5691 gen_rtx_PARALLEL (GET_MODE (target), vector))); | |
5692 break; | |
5693 } | |
5694 | |
5695 default: | |
5696 gcc_unreachable (); | |
5697 } | |
5698 } | |
5699 | |
5700 /* Store the value of EXP (an expression tree) | |
5701 into a subfield of TARGET which has mode MODE and occupies | |
5702 BITSIZE bits, starting BITPOS bits from the start of TARGET. | |
5703 If MODE is VOIDmode, it means that we are storing into a bit-field. | |
5704 | |
5705 Always return const0_rtx unless we have something particular to | |
5706 return. | |
5707 | |
5708 TYPE is the type of the underlying object, | |
5709 | |
5710 ALIAS_SET is the alias set for the destination. This value will | |
5711 (in general) be different from that for TARGET, since TARGET is a | |
5712 reference to the containing structure. | |
5713 | |
5714 If NONTEMPORAL is true, try generating a nontemporal store. */ | |
5715 | |
5716 static rtx | |
5717 store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, | |
5718 enum machine_mode mode, tree exp, tree type, | |
5719 alias_set_type alias_set, bool nontemporal) | |
5720 { | |
5721 HOST_WIDE_INT width_mask = 0; | |
5722 | |
5723 if (TREE_CODE (exp) == ERROR_MARK) | |
5724 return const0_rtx; | |
5725 | |
5726 /* If we have nothing to store, do nothing unless the expression has | |
5727 side-effects. */ | |
5728 if (bitsize == 0) | |
5729 return expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL); | |
5730 else if (bitsize >= 0 && bitsize < HOST_BITS_PER_WIDE_INT) | |
5731 width_mask = ((HOST_WIDE_INT) 1 << bitsize) - 1; | |
5732 | |
5733 /* If we are storing into an unaligned field of an aligned union that is | |
5734 in a register, we may have the mode of TARGET being an integer mode but | |
5735 MODE == BLKmode. In that case, get an aligned object whose size and | |
5736 alignment are the same as TARGET and store TARGET into it (we can avoid | |
5737 the store if the field being stored is the entire width of TARGET). Then | |
5738 call ourselves recursively to store the field into a BLKmode version of | |
5739 that object. Finally, load from the object into TARGET. This is not | |
5740 very efficient in general, but should only be slightly more expensive | |
5741 than the otherwise-required unaligned accesses. Perhaps this can be | |
5742 cleaned up later. It's tempting to make OBJECT readonly, but it's set | |
5743 twice, once with emit_move_insn and once via store_field. */ | |
5744 | |
5745 if (mode == BLKmode | |
5746 && (REG_P (target) || GET_CODE (target) == SUBREG)) | |
5747 { | |
5748 rtx object = assign_temp (type, 0, 1, 1); | |
5749 rtx blk_object = adjust_address (object, BLKmode, 0); | |
5750 | |
5751 if (bitsize != (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (target))) | |
5752 emit_move_insn (object, target); | |
5753 | |
5754 store_field (blk_object, bitsize, bitpos, mode, exp, type, alias_set, | |
5755 nontemporal); | |
5756 | |
5757 emit_move_insn (target, object); | |
5758 | |
5759 /* We want to return the BLKmode version of the data. */ | |
5760 return blk_object; | |
5761 } | |
5762 | |
5763 if (GET_CODE (target) == CONCAT) | |
5764 { | |
5765 /* We're storing into a struct containing a single __complex. */ | |
5766 | |
5767 gcc_assert (!bitpos); | |
5768 return store_expr (exp, target, 0, nontemporal); | |
5769 } | |
5770 | |
5771 /* If the structure is in a register or if the component | |
5772 is a bit field, we cannot use addressing to access it. | |
5773 Use bit-field techniques or SUBREG to store in it. */ | |
5774 | |
5775 if (mode == VOIDmode | |
5776 || (mode != BLKmode && ! direct_store[(int) mode] | |
5777 && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT | |
5778 && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT) | |
5779 || REG_P (target) | |
5780 || GET_CODE (target) == SUBREG | |
5781 /* If the field isn't aligned enough to store as an ordinary memref, | |
5782 store it as a bit field. */ | |
5783 || (mode != BLKmode | |
5784 && ((((MEM_ALIGN (target) < GET_MODE_ALIGNMENT (mode)) | |
5785 || bitpos % GET_MODE_ALIGNMENT (mode)) | |
5786 && SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (target))) | |
5787 || (bitpos % BITS_PER_UNIT != 0))) | |
5788 /* If the RHS and field are a constant size and the size of the | |
5789 RHS isn't the same size as the bitfield, we must use bitfield | |
5790 operations. */ | |
5791 || (bitsize >= 0 | |
5792 && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST | |
5793 && compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)), bitsize) != 0)) | |
5794 { | |
5795 rtx temp; | |
5796 | |
5797 /* If EXP is a NOP_EXPR of precision less than its mode, then that | |
5798 implies a mask operation. If the precision is the same size as | |
5799 the field we're storing into, that mask is redundant. This is | |
5800 particularly common with bit field assignments generated by the | |
5801 C front end. */ | |
5802 if (TREE_CODE (exp) == NOP_EXPR) | |
5803 { | |
5804 tree type = TREE_TYPE (exp); | |
5805 if (INTEGRAL_TYPE_P (type) | |
5806 && TYPE_PRECISION (type) < GET_MODE_BITSIZE (TYPE_MODE (type)) | |
5807 && bitsize == TYPE_PRECISION (type)) | |
5808 { | |
5809 type = TREE_TYPE (TREE_OPERAND (exp, 0)); | |
5810 if (INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) >= bitsize) | |
5811 exp = TREE_OPERAND (exp, 0); | |
5812 } | |
5813 } | |
5814 | |
5815 temp = expand_normal (exp); | |
5816 | |
5817 /* If BITSIZE is narrower than the size of the type of EXP | |
5818 we will be narrowing TEMP. Normally, what's wanted are the | |
5819 low-order bits. However, if EXP's type is a record and this is | |
5820 big-endian machine, we want the upper BITSIZE bits. */ | |
5821 if (BYTES_BIG_ENDIAN && GET_MODE_CLASS (GET_MODE (temp)) == MODE_INT | |
5822 && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (temp)) | |
5823 && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE) | |
5824 temp = expand_shift (RSHIFT_EXPR, GET_MODE (temp), temp, | |
5825 size_int (GET_MODE_BITSIZE (GET_MODE (temp)) | |
5826 - bitsize), | |
5827 NULL_RTX, 1); | |
5828 | |
5829 /* Unless MODE is VOIDmode or BLKmode, convert TEMP to | |
5830 MODE. */ | |
5831 if (mode != VOIDmode && mode != BLKmode | |
5832 && mode != TYPE_MODE (TREE_TYPE (exp))) | |
5833 temp = convert_modes (mode, TYPE_MODE (TREE_TYPE (exp)), temp, 1); | |
5834 | |
5835 /* If the modes of TEMP and TARGET are both BLKmode, both | |
5836 must be in memory and BITPOS must be aligned on a byte | |
5837 boundary. If so, we simply do a block copy. Likewise | |
5838 for a BLKmode-like TARGET. */ | |
5839 if (GET_MODE (temp) == BLKmode | |
5840 && (GET_MODE (target) == BLKmode | |
5841 || (MEM_P (target) | |
5842 && GET_MODE_CLASS (GET_MODE (target)) == MODE_INT | |
5843 && (bitpos % BITS_PER_UNIT) == 0 | |
5844 && (bitsize % BITS_PER_UNIT) == 0))) | |
5845 { | |
5846 gcc_assert (MEM_P (target) && MEM_P (temp) | |
5847 && (bitpos % BITS_PER_UNIT) == 0); | |
5848 | |
5849 target = adjust_address (target, VOIDmode, bitpos / BITS_PER_UNIT); | |
5850 emit_block_move (target, temp, | |
5851 GEN_INT ((bitsize + BITS_PER_UNIT - 1) | |
5852 / BITS_PER_UNIT), | |
5853 BLOCK_OP_NORMAL); | |
5854 | |
5855 return const0_rtx; | |
5856 } | |
5857 | |
5858 /* Store the value in the bitfield. */ | |
5859 store_bit_field (target, bitsize, bitpos, mode, temp); | |
5860 | |
5861 return const0_rtx; | |
5862 } | |
5863 else | |
5864 { | |
5865 /* Now build a reference to just the desired component. */ | |
5866 rtx to_rtx = adjust_address (target, mode, bitpos / BITS_PER_UNIT); | |
5867 | |
5868 if (to_rtx == target) | |
5869 to_rtx = copy_rtx (to_rtx); | |
5870 | |
5871 MEM_SET_IN_STRUCT_P (to_rtx, 1); | |
5872 if (!MEM_KEEP_ALIAS_SET_P (to_rtx) && MEM_ALIAS_SET (to_rtx) != 0) | |
5873 set_mem_alias_set (to_rtx, alias_set); | |
5874 | |
5875 return store_expr (exp, to_rtx, 0, nontemporal); | |
5876 } | |
5877 } | |
5878 | |
5879 /* Given an expression EXP that may be a COMPONENT_REF, a BIT_FIELD_REF, | |
5880 an ARRAY_REF, or an ARRAY_RANGE_REF, look for nested operations of these | |
5881 codes and find the ultimate containing object, which we return. | |
5882 | |
5883 We set *PBITSIZE to the size in bits that we want, *PBITPOS to the | |
5884 bit position, and *PUNSIGNEDP to the signedness of the field. | |
5885 If the position of the field is variable, we store a tree | |
5886 giving the variable offset (in units) in *POFFSET. | |
5887 This offset is in addition to the bit position. | |
5888 If the position is not variable, we store 0 in *POFFSET. | |
5889 | |
5890 If any of the extraction expressions is volatile, | |
5891 we store 1 in *PVOLATILEP. Otherwise we don't change that. | |
5892 | |
5893 If the field is a non-BLKmode bit-field, *PMODE is set to VOIDmode. | |
5894 Otherwise, it is a mode that can be used to access the field. | |
5895 | |
5896 If the field describes a variable-sized object, *PMODE is set to | |
5897 BLKmode and *PBITSIZE is set to -1. An access cannot be made in | |
5898 this case, but the address of the object can be found. | |
5899 | |
5900 If KEEP_ALIGNING is true and the target is STRICT_ALIGNMENT, we don't | |
5901 look through nodes that serve as markers of a greater alignment than | |
5902 the one that can be deduced from the expression. These nodes make it | |
5903 possible for front-ends to prevent temporaries from being created by | |
5904 the middle-end on alignment considerations. For that purpose, the | |
5905 normal operating mode at high-level is to always pass FALSE so that | |
5906 the ultimate containing object is really returned; moreover, the | |
5907 associated predicate handled_component_p will always return TRUE | |
5908 on these nodes, thus indicating that they are essentially handled | |
5909 by get_inner_reference. TRUE should only be passed when the caller | |
5910 is scanning the expression in order to build another representation | |
5911 and specifically knows how to handle these nodes; as such, this is | |
5912 the normal operating mode in the RTL expanders. */ | |
5913 | |
5914 tree | |
5915 get_inner_reference (tree exp, HOST_WIDE_INT *pbitsize, | |
5916 HOST_WIDE_INT *pbitpos, tree *poffset, | |
5917 enum machine_mode *pmode, int *punsignedp, | |
5918 int *pvolatilep, bool keep_aligning) | |
5919 { | |
5920 tree size_tree = 0; | |
5921 enum machine_mode mode = VOIDmode; | |
5922 bool blkmode_bitfield = false; | |
5923 tree offset = size_zero_node; | |
5924 tree bit_offset = bitsize_zero_node; | |
5925 | |
5926 /* First get the mode, signedness, and size. We do this from just the | |
5927 outermost expression. */ | |
5928 if (TREE_CODE (exp) == COMPONENT_REF) | |
5929 { | |
5930 tree field = TREE_OPERAND (exp, 1); | |
5931 size_tree = DECL_SIZE (field); | |
5932 if (!DECL_BIT_FIELD (field)) | |
5933 mode = DECL_MODE (field); | |
5934 else if (DECL_MODE (field) == BLKmode) | |
5935 blkmode_bitfield = true; | |
5936 | |
5937 *punsignedp = DECL_UNSIGNED (field); | |
5938 } | |
5939 else if (TREE_CODE (exp) == BIT_FIELD_REF) | |
5940 { | |
5941 size_tree = TREE_OPERAND (exp, 1); | |
5942 *punsignedp = (! INTEGRAL_TYPE_P (TREE_TYPE (exp)) | |
5943 || TYPE_UNSIGNED (TREE_TYPE (exp))); | |
5944 | |
5945 /* For vector types, with the correct size of access, use the mode of | |
5946 inner type. */ | |
5947 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == VECTOR_TYPE | |
5948 && TREE_TYPE (exp) == TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0))) | |
5949 && tree_int_cst_equal (size_tree, TYPE_SIZE (TREE_TYPE (exp)))) | |
5950 mode = TYPE_MODE (TREE_TYPE (exp)); | |
5951 } | |
5952 else | |
5953 { | |
5954 mode = TYPE_MODE (TREE_TYPE (exp)); | |
5955 *punsignedp = TYPE_UNSIGNED (TREE_TYPE (exp)); | |
5956 | |
5957 if (mode == BLKmode) | |
5958 size_tree = TYPE_SIZE (TREE_TYPE (exp)); | |
5959 else | |
5960 *pbitsize = GET_MODE_BITSIZE (mode); | |
5961 } | |
5962 | |
5963 if (size_tree != 0) | |
5964 { | |
5965 if (! host_integerp (size_tree, 1)) | |
5966 mode = BLKmode, *pbitsize = -1; | |
5967 else | |
5968 *pbitsize = tree_low_cst (size_tree, 1); | |
5969 } | |
5970 | |
5971 /* Compute cumulative bit-offset for nested component-refs and array-refs, | |
5972 and find the ultimate containing object. */ | |
5973 while (1) | |
5974 { | |
5975 switch (TREE_CODE (exp)) | |
5976 { | |
5977 case BIT_FIELD_REF: | |
5978 bit_offset = size_binop (PLUS_EXPR, bit_offset, | |
5979 TREE_OPERAND (exp, 2)); | |
5980 break; | |
5981 | |
5982 case COMPONENT_REF: | |
5983 { | |
5984 tree field = TREE_OPERAND (exp, 1); | |
5985 tree this_offset = component_ref_field_offset (exp); | |
5986 | |
5987 /* If this field hasn't been filled in yet, don't go past it. | |
5988 This should only happen when folding expressions made during | |
5989 type construction. */ | |
5990 if (this_offset == 0) | |
5991 break; | |
5992 | |
5993 offset = size_binop (PLUS_EXPR, offset, this_offset); | |
5994 bit_offset = size_binop (PLUS_EXPR, bit_offset, | |
5995 DECL_FIELD_BIT_OFFSET (field)); | |
5996 | |
5997 /* ??? Right now we don't do anything with DECL_OFFSET_ALIGN. */ | |
5998 } | |
5999 break; | |
6000 | |
6001 case ARRAY_REF: | |
6002 case ARRAY_RANGE_REF: | |
6003 { | |
6004 tree index = TREE_OPERAND (exp, 1); | |
6005 tree low_bound = array_ref_low_bound (exp); | |
6006 tree unit_size = array_ref_element_size (exp); | |
6007 | |
6008 /* We assume all arrays have sizes that are a multiple of a byte. | |
6009 First subtract the lower bound, if any, in the type of the | |
6010 index, then convert to sizetype and multiply by the size of | |
6011 the array element. */ | |
6012 if (! integer_zerop (low_bound)) | |
6013 index = fold_build2 (MINUS_EXPR, TREE_TYPE (index), | |
6014 index, low_bound); | |
6015 | |
6016 offset = size_binop (PLUS_EXPR, offset, | |
6017 size_binop (MULT_EXPR, | |
6018 fold_convert (sizetype, index), | |
6019 unit_size)); | |
6020 } | |
6021 break; | |
6022 | |
6023 case REALPART_EXPR: | |
6024 break; | |
6025 | |
6026 case IMAGPART_EXPR: | |
6027 bit_offset = size_binop (PLUS_EXPR, bit_offset, | |
6028 bitsize_int (*pbitsize)); | |
6029 break; | |
6030 | |
6031 case VIEW_CONVERT_EXPR: | |
6032 if (keep_aligning && STRICT_ALIGNMENT | |
6033 && (TYPE_ALIGN (TREE_TYPE (exp)) | |
6034 > TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0)))) | |
6035 && (TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0))) | |
6036 < BIGGEST_ALIGNMENT) | |
6037 && (TYPE_ALIGN_OK (TREE_TYPE (exp)) | |
6038 || TYPE_ALIGN_OK (TREE_TYPE (TREE_OPERAND (exp, 0))))) | |
6039 goto done; | |
6040 break; | |
6041 | |
6042 default: | |
6043 goto done; | |
6044 } | |
6045 | |
6046 /* If any reference in the chain is volatile, the effect is volatile. */ | |
6047 if (TREE_THIS_VOLATILE (exp)) | |
6048 *pvolatilep = 1; | |
6049 | |
6050 exp = TREE_OPERAND (exp, 0); | |
6051 } | |
6052 done: | |
6053 | |
6054 /* If OFFSET is constant, see if we can return the whole thing as a | |
6055 constant bit position. Make sure to handle overflow during | |
6056 this conversion. */ | |
6057 if (host_integerp (offset, 0)) | |
6058 { | |
6059 double_int tem = double_int_mul (tree_to_double_int (offset), | |
6060 uhwi_to_double_int (BITS_PER_UNIT)); | |
6061 tem = double_int_add (tem, tree_to_double_int (bit_offset)); | |
6062 if (double_int_fits_in_shwi_p (tem)) | |
6063 { | |
6064 *pbitpos = double_int_to_shwi (tem); | |
6065 *poffset = offset = NULL_TREE; | |
6066 } | |
6067 } | |
6068 | |
6069 /* Otherwise, split it up. */ | |
6070 if (offset) | |
6071 { | |
6072 *pbitpos = tree_low_cst (bit_offset, 0); | |
6073 *poffset = offset; | |
6074 } | |
6075 | |
6076 /* We can use BLKmode for a byte-aligned BLKmode bitfield. */ | |
6077 if (mode == VOIDmode | |
6078 && blkmode_bitfield | |
6079 && (*pbitpos % BITS_PER_UNIT) == 0 | |
6080 && (*pbitsize % BITS_PER_UNIT) == 0) | |
6081 *pmode = BLKmode; | |
6082 else | |
6083 *pmode = mode; | |
6084 | |
6085 return exp; | |
6086 } | |
6087 | |
6088 /* Given an expression EXP that may be a COMPONENT_REF, an ARRAY_REF or an | |
6089 ARRAY_RANGE_REF, look for whether EXP or any nested component-refs within | |
6090 EXP is marked as PACKED. */ | |
6091 | |
6092 bool | |
6093 contains_packed_reference (const_tree exp) | |
6094 { | |
6095 bool packed_p = false; | |
6096 | |
6097 while (1) | |
6098 { | |
6099 switch (TREE_CODE (exp)) | |
6100 { | |
6101 case COMPONENT_REF: | |
6102 { | |
6103 tree field = TREE_OPERAND (exp, 1); | |
6104 packed_p = DECL_PACKED (field) | |
6105 || TYPE_PACKED (TREE_TYPE (field)) | |
6106 || TYPE_PACKED (TREE_TYPE (exp)); | |
6107 if (packed_p) | |
6108 goto done; | |
6109 } | |
6110 break; | |
6111 | |
6112 case BIT_FIELD_REF: | |
6113 case ARRAY_REF: | |
6114 case ARRAY_RANGE_REF: | |
6115 case REALPART_EXPR: | |
6116 case IMAGPART_EXPR: | |
6117 case VIEW_CONVERT_EXPR: | |
6118 break; | |
6119 | |
6120 default: | |
6121 goto done; | |
6122 } | |
6123 exp = TREE_OPERAND (exp, 0); | |
6124 } | |
6125 done: | |
6126 return packed_p; | |
6127 } | |
6128 | |
6129 /* Return a tree of sizetype representing the size, in bytes, of the element | |
6130 of EXP, an ARRAY_REF or an ARRAY_RANGE_REF. */ | |
6131 | |
6132 tree | |
6133 array_ref_element_size (tree exp) | |
6134 { | |
6135 tree aligned_size = TREE_OPERAND (exp, 3); | |
6136 tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0))); | |
6137 | |
6138 /* If a size was specified in the ARRAY_REF, it's the size measured | |
6139 in alignment units of the element type. So multiply by that value. */ | |
6140 if (aligned_size) | |
6141 { | |
6142 /* ??? tree_ssa_useless_type_conversion will eliminate casts to | |
6143 sizetype from another type of the same width and signedness. */ | |
6144 if (TREE_TYPE (aligned_size) != sizetype) | |
6145 aligned_size = fold_convert (sizetype, aligned_size); | |
6146 return size_binop (MULT_EXPR, aligned_size, | |
6147 size_int (TYPE_ALIGN_UNIT (elmt_type))); | |
6148 } | |
6149 | |
6150 /* Otherwise, take the size from that of the element type. Substitute | |
6151 any PLACEHOLDER_EXPR that we have. */ | |
6152 else | |
6153 return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_SIZE_UNIT (elmt_type), exp); | |
6154 } | |
6155 | |
6156 /* Return a tree representing the lower bound of the array mentioned in | |
6157 EXP, an ARRAY_REF or an ARRAY_RANGE_REF. */ | |
6158 | |
6159 tree | |
6160 array_ref_low_bound (tree exp) | |
6161 { | |
6162 tree domain_type = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (exp, 0))); | |
6163 | |
6164 /* If a lower bound is specified in EXP, use it. */ | |
6165 if (TREE_OPERAND (exp, 2)) | |
6166 return TREE_OPERAND (exp, 2); | |
6167 | |
6168 /* Otherwise, if there is a domain type and it has a lower bound, use it, | |
6169 substituting for a PLACEHOLDER_EXPR as needed. */ | |
6170 if (domain_type && TYPE_MIN_VALUE (domain_type)) | |
6171 return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_MIN_VALUE (domain_type), exp); | |
6172 | |
6173 /* Otherwise, return a zero of the appropriate type. */ | |
6174 return build_int_cst (TREE_TYPE (TREE_OPERAND (exp, 1)), 0); | |
6175 } | |
6176 | |
6177 /* Return a tree representing the upper bound of the array mentioned in | |
6178 EXP, an ARRAY_REF or an ARRAY_RANGE_REF. */ | |
6179 | |
6180 tree | |
6181 array_ref_up_bound (tree exp) | |
6182 { | |
6183 tree domain_type = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (exp, 0))); | |
6184 | |
6185 /* If there is a domain type and it has an upper bound, use it, substituting | |
6186 for a PLACEHOLDER_EXPR as needed. */ | |
6187 if (domain_type && TYPE_MAX_VALUE (domain_type)) | |
6188 return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_MAX_VALUE (domain_type), exp); | |
6189 | |
6190 /* Otherwise fail. */ | |
6191 return NULL_TREE; | |
6192 } | |
6193 | |
6194 /* Return a tree representing the offset, in bytes, of the field referenced | |
6195 by EXP. This does not include any offset in DECL_FIELD_BIT_OFFSET. */ | |
6196 | |
6197 tree | |
6198 component_ref_field_offset (tree exp) | |
6199 { | |
6200 tree aligned_offset = TREE_OPERAND (exp, 2); | |
6201 tree field = TREE_OPERAND (exp, 1); | |
6202 | |
6203 /* If an offset was specified in the COMPONENT_REF, it's the offset measured | |
6204 in units of DECL_OFFSET_ALIGN / BITS_PER_UNIT. So multiply by that | |
6205 value. */ | |
6206 if (aligned_offset) | |
6207 { | |
6208 /* ??? tree_ssa_useless_type_conversion will eliminate casts to | |
6209 sizetype from another type of the same width and signedness. */ | |
6210 if (TREE_TYPE (aligned_offset) != sizetype) | |
6211 aligned_offset = fold_convert (sizetype, aligned_offset); | |
6212 return size_binop (MULT_EXPR, aligned_offset, | |
6213 size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT)); | |
6214 } | |
6215 | |
6216 /* Otherwise, take the offset from that of the field. Substitute | |
6217 any PLACEHOLDER_EXPR that we have. */ | |
6218 else | |
6219 return SUBSTITUTE_PLACEHOLDER_IN_EXPR (DECL_FIELD_OFFSET (field), exp); | |
6220 } | |
6221 | |
6222 /* Return 1 if T is an expression that get_inner_reference handles. */ | |
6223 | |
6224 int | |
6225 handled_component_p (const_tree t) | |
6226 { | |
6227 switch (TREE_CODE (t)) | |
6228 { | |
6229 case BIT_FIELD_REF: | |
6230 case COMPONENT_REF: | |
6231 case ARRAY_REF: | |
6232 case ARRAY_RANGE_REF: | |
6233 case VIEW_CONVERT_EXPR: | |
6234 case REALPART_EXPR: | |
6235 case IMAGPART_EXPR: | |
6236 return 1; | |
6237 | |
6238 default: | |
6239 return 0; | |
6240 } | |
6241 } | |
6242 | |
6243 /* Given an rtx VALUE that may contain additions and multiplications, return | |
6244 an equivalent value that just refers to a register, memory, or constant. | |
6245 This is done by generating instructions to perform the arithmetic and | |
6246 returning a pseudo-register containing the value. | |
6247 | |
6248 The returned value may be a REG, SUBREG, MEM or constant. */ | |
6249 | |
6250 rtx | |
6251 force_operand (rtx value, rtx target) | |
6252 { | |
6253 rtx op1, op2; | |
6254 /* Use subtarget as the target for operand 0 of a binary operation. */ | |
6255 rtx subtarget = get_subtarget (target); | |
6256 enum rtx_code code = GET_CODE (value); | |
6257 | |
6258 /* Check for subreg applied to an expression produced by loop optimizer. */ | |
6259 if (code == SUBREG | |
6260 && !REG_P (SUBREG_REG (value)) | |
6261 && !MEM_P (SUBREG_REG (value))) | |
6262 { | |
6263 value | |
6264 = simplify_gen_subreg (GET_MODE (value), | |
6265 force_reg (GET_MODE (SUBREG_REG (value)), | |
6266 force_operand (SUBREG_REG (value), | |
6267 NULL_RTX)), | |
6268 GET_MODE (SUBREG_REG (value)), | |
6269 SUBREG_BYTE (value)); | |
6270 code = GET_CODE (value); | |
6271 } | |
6272 | |
6273 /* Check for a PIC address load. */ | |
6274 if ((code == PLUS || code == MINUS) | |
6275 && XEXP (value, 0) == pic_offset_table_rtx | |
6276 && (GET_CODE (XEXP (value, 1)) == SYMBOL_REF | |
6277 || GET_CODE (XEXP (value, 1)) == LABEL_REF | |
6278 || GET_CODE (XEXP (value, 1)) == CONST)) | |
6279 { | |
6280 if (!subtarget) | |
6281 subtarget = gen_reg_rtx (GET_MODE (value)); | |
6282 emit_move_insn (subtarget, value); | |
6283 return subtarget; | |
6284 } | |
6285 | |
6286 if (ARITHMETIC_P (value)) | |
6287 { | |
6288 op2 = XEXP (value, 1); | |
6289 if (!CONSTANT_P (op2) && !(REG_P (op2) && op2 != subtarget)) | |
6290 subtarget = 0; | |
6291 if (code == MINUS && GET_CODE (op2) == CONST_INT) | |
6292 { | |
6293 code = PLUS; | |
6294 op2 = negate_rtx (GET_MODE (value), op2); | |
6295 } | |
6296 | |
6297 /* Check for an addition with OP2 a constant integer and our first | |
6298 operand a PLUS of a virtual register and something else. In that | |
6299 case, we want to emit the sum of the virtual register and the | |
6300 constant first and then add the other value. This allows virtual | |
6301 register instantiation to simply modify the constant rather than | |
6302 creating another one around this addition. */ | |
6303 if (code == PLUS && GET_CODE (op2) == CONST_INT | |
6304 && GET_CODE (XEXP (value, 0)) == PLUS | |
6305 && REG_P (XEXP (XEXP (value, 0), 0)) | |
6306 && REGNO (XEXP (XEXP (value, 0), 0)) >= FIRST_VIRTUAL_REGISTER | |
6307 && REGNO (XEXP (XEXP (value, 0), 0)) <= LAST_VIRTUAL_REGISTER) | |
6308 { | |
6309 rtx temp = expand_simple_binop (GET_MODE (value), code, | |
6310 XEXP (XEXP (value, 0), 0), op2, | |
6311 subtarget, 0, OPTAB_LIB_WIDEN); | |
6312 return expand_simple_binop (GET_MODE (value), code, temp, | |
6313 force_operand (XEXP (XEXP (value, | |
6314 0), 1), 0), | |
6315 target, 0, OPTAB_LIB_WIDEN); | |
6316 } | |
6317 | |
6318 op1 = force_operand (XEXP (value, 0), subtarget); | |
6319 op2 = force_operand (op2, NULL_RTX); | |
6320 switch (code) | |
6321 { | |
6322 case MULT: | |
6323 return expand_mult (GET_MODE (value), op1, op2, target, 1); | |
6324 case DIV: | |
6325 if (!INTEGRAL_MODE_P (GET_MODE (value))) | |
6326 return expand_simple_binop (GET_MODE (value), code, op1, op2, | |
6327 target, 1, OPTAB_LIB_WIDEN); | |
6328 else | |
6329 return expand_divmod (0, | |
6330 FLOAT_MODE_P (GET_MODE (value)) | |
6331 ? RDIV_EXPR : TRUNC_DIV_EXPR, | |
6332 GET_MODE (value), op1, op2, target, 0); | |
6333 case MOD: | |
6334 return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2, | |
6335 target, 0); | |
6336 case UDIV: | |
6337 return expand_divmod (0, TRUNC_DIV_EXPR, GET_MODE (value), op1, op2, | |
6338 target, 1); | |
6339 case UMOD: | |
6340 return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2, | |
6341 target, 1); | |
6342 case ASHIFTRT: | |
6343 return expand_simple_binop (GET_MODE (value), code, op1, op2, | |
6344 target, 0, OPTAB_LIB_WIDEN); | |
6345 default: | |
6346 return expand_simple_binop (GET_MODE (value), code, op1, op2, | |
6347 target, 1, OPTAB_LIB_WIDEN); | |
6348 } | |
6349 } | |
6350 if (UNARY_P (value)) | |
6351 { | |
6352 if (!target) | |
6353 target = gen_reg_rtx (GET_MODE (value)); | |
6354 op1 = force_operand (XEXP (value, 0), NULL_RTX); | |
6355 switch (code) | |
6356 { | |
6357 case ZERO_EXTEND: | |
6358 case SIGN_EXTEND: | |
6359 case TRUNCATE: | |
6360 case FLOAT_EXTEND: | |
6361 case FLOAT_TRUNCATE: | |
6362 convert_move (target, op1, code == ZERO_EXTEND); | |
6363 return target; | |
6364 | |
6365 case FIX: | |
6366 case UNSIGNED_FIX: | |
6367 expand_fix (target, op1, code == UNSIGNED_FIX); | |
6368 return target; | |
6369 | |
6370 case FLOAT: | |
6371 case UNSIGNED_FLOAT: | |
6372 expand_float (target, op1, code == UNSIGNED_FLOAT); | |
6373 return target; | |
6374 | |
6375 default: | |
6376 return expand_simple_unop (GET_MODE (value), code, op1, target, 0); | |
6377 } | |
6378 } | |
6379 | |
6380 #ifdef INSN_SCHEDULING | |
6381 /* On machines that have insn scheduling, we want all memory reference to be | |
6382 explicit, so we need to deal with such paradoxical SUBREGs. */ | |
6383 if (GET_CODE (value) == SUBREG && MEM_P (SUBREG_REG (value)) | |
6384 && (GET_MODE_SIZE (GET_MODE (value)) | |
6385 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (value))))) | |
6386 value | |
6387 = simplify_gen_subreg (GET_MODE (value), | |
6388 force_reg (GET_MODE (SUBREG_REG (value)), | |
6389 force_operand (SUBREG_REG (value), | |
6390 NULL_RTX)), | |
6391 GET_MODE (SUBREG_REG (value)), | |
6392 SUBREG_BYTE (value)); | |
6393 #endif | |
6394 | |
6395 return value; | |
6396 } | |
6397 | |
6398 /* Subroutine of expand_expr: return nonzero iff there is no way that | |
6399 EXP can reference X, which is being modified. TOP_P is nonzero if this | |
6400 call is going to be used to determine whether we need a temporary | |
6401 for EXP, as opposed to a recursive call to this function. | |
6402 | |
6403 It is always safe for this routine to return zero since it merely | |
6404 searches for optimization opportunities. */ | |
6405 | |
6406 int | |
6407 safe_from_p (const_rtx x, tree exp, int top_p) | |
6408 { | |
6409 rtx exp_rtl = 0; | |
6410 int i, nops; | |
6411 | |
6412 if (x == 0 | |
6413 /* If EXP has varying size, we MUST use a target since we currently | |
6414 have no way of allocating temporaries of variable size | |
6415 (except for arrays that have TYPE_ARRAY_MAX_SIZE set). | |
6416 So we assume here that something at a higher level has prevented a | |
6417 clash. This is somewhat bogus, but the best we can do. Only | |
6418 do this when X is BLKmode and when we are at the top level. */ | |
6419 || (top_p && TREE_TYPE (exp) != 0 && COMPLETE_TYPE_P (TREE_TYPE (exp)) | |
6420 && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST | |
6421 && (TREE_CODE (TREE_TYPE (exp)) != ARRAY_TYPE | |
6422 || TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)) == NULL_TREE | |
6423 || TREE_CODE (TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp))) | |
6424 != INTEGER_CST) | |
6425 && GET_MODE (x) == BLKmode) | |
6426 /* If X is in the outgoing argument area, it is always safe. */ | |
6427 || (MEM_P (x) | |
6428 && (XEXP (x, 0) == virtual_outgoing_args_rtx | |
6429 || (GET_CODE (XEXP (x, 0)) == PLUS | |
6430 && XEXP (XEXP (x, 0), 0) == virtual_outgoing_args_rtx)))) | |
6431 return 1; | |
6432 | |
6433 /* If this is a subreg of a hard register, declare it unsafe, otherwise, | |
6434 find the underlying pseudo. */ | |
6435 if (GET_CODE (x) == SUBREG) | |
6436 { | |
6437 x = SUBREG_REG (x); | |
6438 if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER) | |
6439 return 0; | |
6440 } | |
6441 | |
6442 /* Now look at our tree code and possibly recurse. */ | |
6443 switch (TREE_CODE_CLASS (TREE_CODE (exp))) | |
6444 { | |
6445 case tcc_declaration: | |
6446 exp_rtl = DECL_RTL_IF_SET (exp); | |
6447 break; | |
6448 | |
6449 case tcc_constant: | |
6450 return 1; | |
6451 | |
6452 case tcc_exceptional: | |
6453 if (TREE_CODE (exp) == TREE_LIST) | |
6454 { | |
6455 while (1) | |
6456 { | |
6457 if (TREE_VALUE (exp) && !safe_from_p (x, TREE_VALUE (exp), 0)) | |
6458 return 0; | |
6459 exp = TREE_CHAIN (exp); | |
6460 if (!exp) | |
6461 return 1; | |
6462 if (TREE_CODE (exp) != TREE_LIST) | |
6463 return safe_from_p (x, exp, 0); | |
6464 } | |
6465 } | |
6466 else if (TREE_CODE (exp) == CONSTRUCTOR) | |
6467 { | |
6468 constructor_elt *ce; | |
6469 unsigned HOST_WIDE_INT idx; | |
6470 | |
6471 for (idx = 0; | |
6472 VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), idx, ce); | |
6473 idx++) | |
6474 if ((ce->index != NULL_TREE && !safe_from_p (x, ce->index, 0)) | |
6475 || !safe_from_p (x, ce->value, 0)) | |
6476 return 0; | |
6477 return 1; | |
6478 } | |
6479 else if (TREE_CODE (exp) == ERROR_MARK) | |
6480 return 1; /* An already-visited SAVE_EXPR? */ | |
6481 else | |
6482 return 0; | |
6483 | |
6484 case tcc_statement: | |
6485 /* The only case we look at here is the DECL_INITIAL inside a | |
6486 DECL_EXPR. */ | |
6487 return (TREE_CODE (exp) != DECL_EXPR | |
6488 || TREE_CODE (DECL_EXPR_DECL (exp)) != VAR_DECL | |
6489 || !DECL_INITIAL (DECL_EXPR_DECL (exp)) | |
6490 || safe_from_p (x, DECL_INITIAL (DECL_EXPR_DECL (exp)), 0)); | |
6491 | |
6492 case tcc_binary: | |
6493 case tcc_comparison: | |
6494 if (!safe_from_p (x, TREE_OPERAND (exp, 1), 0)) | |
6495 return 0; | |
6496 /* Fall through. */ | |
6497 | |
6498 case tcc_unary: | |
6499 return safe_from_p (x, TREE_OPERAND (exp, 0), 0); | |
6500 | |
6501 case tcc_expression: | |
6502 case tcc_reference: | |
6503 case tcc_vl_exp: | |
6504 /* Now do code-specific tests. EXP_RTL is set to any rtx we find in | |
6505 the expression. If it is set, we conflict iff we are that rtx or | |
6506 both are in memory. Otherwise, we check all operands of the | |
6507 expression recursively. */ | |
6508 | |
6509 switch (TREE_CODE (exp)) | |
6510 { | |
6511 case ADDR_EXPR: | |
6512 /* If the operand is static or we are static, we can't conflict. | |
6513 Likewise if we don't conflict with the operand at all. */ | |
6514 if (staticp (TREE_OPERAND (exp, 0)) | |
6515 || TREE_STATIC (exp) | |
6516 || safe_from_p (x, TREE_OPERAND (exp, 0), 0)) | |
6517 return 1; | |
6518 | |
6519 /* Otherwise, the only way this can conflict is if we are taking | |
6520 the address of a DECL a that address if part of X, which is | |
6521 very rare. */ | |
6522 exp = TREE_OPERAND (exp, 0); | |
6523 if (DECL_P (exp)) | |
6524 { | |
6525 if (!DECL_RTL_SET_P (exp) | |
6526 || !MEM_P (DECL_RTL (exp))) | |
6527 return 0; | |
6528 else | |
6529 exp_rtl = XEXP (DECL_RTL (exp), 0); | |
6530 } | |
6531 break; | |
6532 | |
6533 case MISALIGNED_INDIRECT_REF: | |
6534 case ALIGN_INDIRECT_REF: | |
6535 case INDIRECT_REF: | |
6536 if (MEM_P (x) | |
6537 && alias_sets_conflict_p (MEM_ALIAS_SET (x), | |
6538 get_alias_set (exp))) | |
6539 return 0; | |
6540 break; | |
6541 | |
6542 case CALL_EXPR: | |
6543 /* Assume that the call will clobber all hard registers and | |
6544 all of memory. */ | |
6545 if ((REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER) | |
6546 || MEM_P (x)) | |
6547 return 0; | |
6548 break; | |
6549 | |
6550 case WITH_CLEANUP_EXPR: | |
6551 case CLEANUP_POINT_EXPR: | |
6552 /* Lowered by gimplify.c. */ | |
6553 gcc_unreachable (); | |
6554 | |
6555 case SAVE_EXPR: | |
6556 return safe_from_p (x, TREE_OPERAND (exp, 0), 0); | |
6557 | |
6558 default: | |
6559 break; | |
6560 } | |
6561 | |
6562 /* If we have an rtx, we do not need to scan our operands. */ | |
6563 if (exp_rtl) | |
6564 break; | |
6565 | |
6566 nops = TREE_OPERAND_LENGTH (exp); | |
6567 for (i = 0; i < nops; i++) | |
6568 if (TREE_OPERAND (exp, i) != 0 | |
6569 && ! safe_from_p (x, TREE_OPERAND (exp, i), 0)) | |
6570 return 0; | |
6571 | |
6572 break; | |
6573 | |
6574 case tcc_type: | |
6575 /* Should never get a type here. */ | |
6576 gcc_unreachable (); | |
6577 } | |
6578 | |
6579 /* If we have an rtl, find any enclosed object. Then see if we conflict | |
6580 with it. */ | |
6581 if (exp_rtl) | |
6582 { | |
6583 if (GET_CODE (exp_rtl) == SUBREG) | |
6584 { | |
6585 exp_rtl = SUBREG_REG (exp_rtl); | |
6586 if (REG_P (exp_rtl) | |
6587 && REGNO (exp_rtl) < FIRST_PSEUDO_REGISTER) | |
6588 return 0; | |
6589 } | |
6590 | |
6591 /* If the rtl is X, then it is not safe. Otherwise, it is unless both | |
6592 are memory and they conflict. */ | |
6593 return ! (rtx_equal_p (x, exp_rtl) | |
6594 || (MEM_P (x) && MEM_P (exp_rtl) | |
6595 && true_dependence (exp_rtl, VOIDmode, x, | |
6596 rtx_addr_varies_p))); | |
6597 } | |
6598 | |
6599 /* If we reach here, it is safe. */ | |
6600 return 1; | |
6601 } | |
6602 | |
6603 | |
6604 /* Return the highest power of two that EXP is known to be a multiple of. | |
6605 This is used in updating alignment of MEMs in array references. */ | |
6606 | |
6607 unsigned HOST_WIDE_INT | |
6608 highest_pow2_factor (const_tree exp) | |
6609 { | |
6610 unsigned HOST_WIDE_INT c0, c1; | |
6611 | |
6612 switch (TREE_CODE (exp)) | |
6613 { | |
6614 case INTEGER_CST: | |
6615 /* We can find the lowest bit that's a one. If the low | |
6616 HOST_BITS_PER_WIDE_INT bits are zero, return BIGGEST_ALIGNMENT. | |
6617 We need to handle this case since we can find it in a COND_EXPR, | |
6618 a MIN_EXPR, or a MAX_EXPR. If the constant overflows, we have an | |
6619 erroneous program, so return BIGGEST_ALIGNMENT to avoid any | |
6620 later ICE. */ | |
6621 if (TREE_OVERFLOW (exp)) | |
6622 return BIGGEST_ALIGNMENT; | |
6623 else | |
6624 { | |
6625 /* Note: tree_low_cst is intentionally not used here, | |
6626 we don't care about the upper bits. */ | |
6627 c0 = TREE_INT_CST_LOW (exp); | |
6628 c0 &= -c0; | |
6629 return c0 ? c0 : BIGGEST_ALIGNMENT; | |
6630 } | |
6631 break; | |
6632 | |
6633 case PLUS_EXPR: case MINUS_EXPR: case MIN_EXPR: case MAX_EXPR: | |
6634 c0 = highest_pow2_factor (TREE_OPERAND (exp, 0)); | |
6635 c1 = highest_pow2_factor (TREE_OPERAND (exp, 1)); | |
6636 return MIN (c0, c1); | |
6637 | |
6638 case MULT_EXPR: | |
6639 c0 = highest_pow2_factor (TREE_OPERAND (exp, 0)); | |
6640 c1 = highest_pow2_factor (TREE_OPERAND (exp, 1)); | |
6641 return c0 * c1; | |
6642 | |
6643 case ROUND_DIV_EXPR: case TRUNC_DIV_EXPR: case FLOOR_DIV_EXPR: | |
6644 case CEIL_DIV_EXPR: | |
6645 if (integer_pow2p (TREE_OPERAND (exp, 1)) | |
6646 && host_integerp (TREE_OPERAND (exp, 1), 1)) | |
6647 { | |
6648 c0 = highest_pow2_factor (TREE_OPERAND (exp, 0)); | |
6649 c1 = tree_low_cst (TREE_OPERAND (exp, 1), 1); | |
6650 return MAX (1, c0 / c1); | |
6651 } | |
6652 break; | |
6653 | |
6654 case BIT_AND_EXPR: | |
6655 /* The highest power of two of a bit-and expression is the maximum of | |
6656 that of its operands. We typically get here for a complex LHS and | |
6657 a constant negative power of two on the RHS to force an explicit | |
6658 alignment, so don't bother looking at the LHS. */ | |
6659 return highest_pow2_factor (TREE_OPERAND (exp, 1)); | |
6660 | |
6661 CASE_CONVERT: | |
6662 case SAVE_EXPR: | |
6663 return highest_pow2_factor (TREE_OPERAND (exp, 0)); | |
6664 | |
6665 case COMPOUND_EXPR: | |
6666 return highest_pow2_factor (TREE_OPERAND (exp, 1)); | |
6667 | |
6668 case COND_EXPR: | |
6669 c0 = highest_pow2_factor (TREE_OPERAND (exp, 1)); | |
6670 c1 = highest_pow2_factor (TREE_OPERAND (exp, 2)); | |
6671 return MIN (c0, c1); | |
6672 | |
6673 default: | |
6674 break; | |
6675 } | |
6676 | |
6677 return 1; | |
6678 } | |
6679 | |
6680 /* Similar, except that the alignment requirements of TARGET are | |
6681 taken into account. Assume it is at least as aligned as its | |
6682 type, unless it is a COMPONENT_REF in which case the layout of | |
6683 the structure gives the alignment. */ | |
6684 | |
6685 static unsigned HOST_WIDE_INT | |
6686 highest_pow2_factor_for_target (const_tree target, const_tree exp) | |
6687 { | |
6688 unsigned HOST_WIDE_INT target_align, factor; | |
6689 | |
6690 factor = highest_pow2_factor (exp); | |
6691 if (TREE_CODE (target) == COMPONENT_REF) | |
6692 target_align = DECL_ALIGN_UNIT (TREE_OPERAND (target, 1)); | |
6693 else | |
6694 target_align = TYPE_ALIGN_UNIT (TREE_TYPE (target)); | |
6695 return MAX (factor, target_align); | |
6696 } | |
6697 | |
6698 /* Return &VAR expression for emulated thread local VAR. */ | |
6699 | |
6700 static tree | |
6701 emutls_var_address (tree var) | |
6702 { | |
6703 tree emuvar = emutls_decl (var); | |
6704 tree fn = built_in_decls [BUILT_IN_EMUTLS_GET_ADDRESS]; | |
6705 tree arg = build_fold_addr_expr_with_type (emuvar, ptr_type_node); | |
6706 tree arglist = build_tree_list (NULL_TREE, arg); | |
6707 tree call = build_function_call_expr (fn, arglist); | |
6708 return fold_convert (build_pointer_type (TREE_TYPE (var)), call); | |
6709 } | |
6710 | |
6711 | |
6712 /* Subroutine of expand_expr. Expand the two operands of a binary | |
6713 expression EXP0 and EXP1 placing the results in OP0 and OP1. | |
6714 The value may be stored in TARGET if TARGET is nonzero. The | |
6715 MODIFIER argument is as documented by expand_expr. */ | |
6716 | |
6717 static void | |
6718 expand_operands (tree exp0, tree exp1, rtx target, rtx *op0, rtx *op1, | |
6719 enum expand_modifier modifier) | |
6720 { | |
6721 if (! safe_from_p (target, exp1, 1)) | |
6722 target = 0; | |
6723 if (operand_equal_p (exp0, exp1, 0)) | |
6724 { | |
6725 *op0 = expand_expr (exp0, target, VOIDmode, modifier); | |
6726 *op1 = copy_rtx (*op0); | |
6727 } | |
6728 else | |
6729 { | |
6730 /* If we need to preserve evaluation order, copy exp0 into its own | |
6731 temporary variable so that it can't be clobbered by exp1. */ | |
6732 if (flag_evaluation_order && TREE_SIDE_EFFECTS (exp1)) | |
6733 exp0 = save_expr (exp0); | |
6734 *op0 = expand_expr (exp0, target, VOIDmode, modifier); | |
6735 *op1 = expand_expr (exp1, NULL_RTX, VOIDmode, modifier); | |
6736 } | |
6737 } | |
6738 | |
6739 | |
6740 /* Return a MEM that contains constant EXP. DEFER is as for | |
6741 output_constant_def and MODIFIER is as for expand_expr. */ | |
6742 | |
6743 static rtx | |
6744 expand_expr_constant (tree exp, int defer, enum expand_modifier modifier) | |
6745 { | |
6746 rtx mem; | |
6747 | |
6748 mem = output_constant_def (exp, defer); | |
6749 if (modifier != EXPAND_INITIALIZER) | |
6750 mem = use_anchored_address (mem); | |
6751 return mem; | |
6752 } | |
6753 | |
6754 /* A subroutine of expand_expr_addr_expr. Evaluate the address of EXP. | |
6755 The TARGET, TMODE and MODIFIER arguments are as for expand_expr. */ | |
6756 | |
6757 static rtx | |
6758 expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode, | |
6759 enum expand_modifier modifier) | |
6760 { | |
6761 rtx result, subtarget; | |
6762 tree inner, offset; | |
6763 HOST_WIDE_INT bitsize, bitpos; | |
6764 int volatilep, unsignedp; | |
6765 enum machine_mode mode1; | |
6766 | |
6767 /* If we are taking the address of a constant and are at the top level, | |
6768 we have to use output_constant_def since we can't call force_const_mem | |
6769 at top level. */ | |
6770 /* ??? This should be considered a front-end bug. We should not be | |
6771 generating ADDR_EXPR of something that isn't an LVALUE. The only | |
6772 exception here is STRING_CST. */ | |
6773 if (CONSTANT_CLASS_P (exp)) | |
6774 return XEXP (expand_expr_constant (exp, 0, modifier), 0); | |
6775 | |
6776 /* Everything must be something allowed by is_gimple_addressable. */ | |
6777 switch (TREE_CODE (exp)) | |
6778 { | |
6779 case INDIRECT_REF: | |
6780 /* This case will happen via recursion for &a->b. */ | |
6781 return expand_expr (TREE_OPERAND (exp, 0), target, tmode, modifier); | |
6782 | |
6783 case CONST_DECL: | |
6784 /* Recurse and make the output_constant_def clause above handle this. */ | |
6785 return expand_expr_addr_expr_1 (DECL_INITIAL (exp), target, | |
6786 tmode, modifier); | |
6787 | |
6788 case REALPART_EXPR: | |
6789 /* The real part of the complex number is always first, therefore | |
6790 the address is the same as the address of the parent object. */ | |
6791 offset = 0; | |
6792 bitpos = 0; | |
6793 inner = TREE_OPERAND (exp, 0); | |
6794 break; | |
6795 | |
6796 case IMAGPART_EXPR: | |
6797 /* The imaginary part of the complex number is always second. | |
6798 The expression is therefore always offset by the size of the | |
6799 scalar type. */ | |
6800 offset = 0; | |
6801 bitpos = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (exp))); | |
6802 inner = TREE_OPERAND (exp, 0); | |
6803 break; | |
6804 | |
6805 case VAR_DECL: | |
6806 /* TLS emulation hook - replace __thread VAR's &VAR with | |
6807 __emutls_get_address (&_emutls.VAR). */ | |
6808 if (! targetm.have_tls | |
6809 && TREE_CODE (exp) == VAR_DECL | |
6810 && DECL_THREAD_LOCAL_P (exp)) | |
6811 { | |
6812 exp = emutls_var_address (exp); | |
6813 return expand_expr (exp, target, tmode, modifier); | |
6814 } | |
6815 /* Fall through. */ | |
6816 | |
6817 default: | |
6818 /* If the object is a DECL, then expand it for its rtl. Don't bypass | |
6819 expand_expr, as that can have various side effects; LABEL_DECLs for | |
6820 example, may not have their DECL_RTL set yet. Expand the rtl of | |
6821 CONSTRUCTORs too, which should yield a memory reference for the | |
6822 constructor's contents. Assume language specific tree nodes can | |
6823 be expanded in some interesting way. */ | |
6824 if (DECL_P (exp) | |
6825 || TREE_CODE (exp) == CONSTRUCTOR | |
6826 || TREE_CODE (exp) >= LAST_AND_UNUSED_TREE_CODE) | |
6827 { | |
6828 result = expand_expr (exp, target, tmode, | |
6829 modifier == EXPAND_INITIALIZER | |
6830 ? EXPAND_INITIALIZER : EXPAND_CONST_ADDRESS); | |
6831 | |
6832 /* If the DECL isn't in memory, then the DECL wasn't properly | |
6833 marked TREE_ADDRESSABLE, which will be either a front-end | |
6834 or a tree optimizer bug. */ | |
6835 gcc_assert (MEM_P (result)); | |
6836 result = XEXP (result, 0); | |
6837 | |
6838 /* ??? Is this needed anymore? */ | |
6839 if (DECL_P (exp) && !TREE_USED (exp) == 0) | |
6840 { | |
6841 assemble_external (exp); | |
6842 TREE_USED (exp) = 1; | |
6843 } | |
6844 | |
6845 if (modifier != EXPAND_INITIALIZER | |
6846 && modifier != EXPAND_CONST_ADDRESS) | |
6847 result = force_operand (result, target); | |
6848 return result; | |
6849 } | |
6850 | |
6851 /* Pass FALSE as the last argument to get_inner_reference although | |
6852 we are expanding to RTL. The rationale is that we know how to | |
6853 handle "aligning nodes" here: we can just bypass them because | |
6854 they won't change the final object whose address will be returned | |
6855 (they actually exist only for that purpose). */ | |
6856 inner = get_inner_reference (exp, &bitsize, &bitpos, &offset, | |
6857 &mode1, &unsignedp, &volatilep, false); | |
6858 break; | |
6859 } | |
6860 | |
6861 /* We must have made progress. */ | |
6862 gcc_assert (inner != exp); | |
6863 | |
6864 subtarget = offset || bitpos ? NULL_RTX : target; | |
6865 /* For VIEW_CONVERT_EXPR, where the outer alignment is bigger than | |
6866 inner alignment, force the inner to be sufficiently aligned. */ | |
6867 if (CONSTANT_CLASS_P (inner) | |
6868 && TYPE_ALIGN (TREE_TYPE (inner)) < TYPE_ALIGN (TREE_TYPE (exp))) | |
6869 { | |
6870 inner = copy_node (inner); | |
6871 TREE_TYPE (inner) = copy_node (TREE_TYPE (inner)); | |
6872 TYPE_ALIGN (TREE_TYPE (inner)) = TYPE_ALIGN (TREE_TYPE (exp)); | |
6873 TYPE_USER_ALIGN (TREE_TYPE (inner)) = 1; | |
6874 } | |
6875 result = expand_expr_addr_expr_1 (inner, subtarget, tmode, modifier); | |
6876 | |
6877 if (offset) | |
6878 { | |
6879 rtx tmp; | |
6880 | |
6881 if (modifier != EXPAND_NORMAL) | |
6882 result = force_operand (result, NULL); | |
6883 tmp = expand_expr (offset, NULL_RTX, tmode, | |
6884 modifier == EXPAND_INITIALIZER | |
6885 ? EXPAND_INITIALIZER : EXPAND_NORMAL); | |
6886 | |
6887 result = convert_memory_address (tmode, result); | |
6888 tmp = convert_memory_address (tmode, tmp); | |
6889 | |
6890 if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER) | |
6891 result = gen_rtx_PLUS (tmode, result, tmp); | |
6892 else | |
6893 { | |
6894 subtarget = bitpos ? NULL_RTX : target; | |
6895 result = expand_simple_binop (tmode, PLUS, result, tmp, subtarget, | |
6896 1, OPTAB_LIB_WIDEN); | |
6897 } | |
6898 } | |
6899 | |
6900 if (bitpos) | |
6901 { | |
6902 /* Someone beforehand should have rejected taking the address | |
6903 of such an object. */ | |
6904 gcc_assert ((bitpos % BITS_PER_UNIT) == 0); | |
6905 | |
6906 result = plus_constant (result, bitpos / BITS_PER_UNIT); | |
6907 if (modifier < EXPAND_SUM) | |
6908 result = force_operand (result, target); | |
6909 } | |
6910 | |
6911 return result; | |
6912 } | |
6913 | |
6914 /* A subroutine of expand_expr. Evaluate EXP, which is an ADDR_EXPR. | |
6915 The TARGET, TMODE and MODIFIER arguments are as for expand_expr. */ | |
6916 | |
6917 static rtx | |
6918 expand_expr_addr_expr (tree exp, rtx target, enum machine_mode tmode, | |
6919 enum expand_modifier modifier) | |
6920 { | |
6921 enum machine_mode rmode; | |
6922 rtx result; | |
6923 | |
6924 /* Target mode of VOIDmode says "whatever's natural". */ | |
6925 if (tmode == VOIDmode) | |
6926 tmode = TYPE_MODE (TREE_TYPE (exp)); | |
6927 | |
6928 /* We can get called with some Weird Things if the user does silliness | |
6929 like "(short) &a". In that case, convert_memory_address won't do | |
6930 the right thing, so ignore the given target mode. */ | |
6931 if (tmode != Pmode && tmode != ptr_mode) | |
6932 tmode = Pmode; | |
6933 | |
6934 result = expand_expr_addr_expr_1 (TREE_OPERAND (exp, 0), target, | |
6935 tmode, modifier); | |
6936 | |
6937 /* Despite expand_expr claims concerning ignoring TMODE when not | |
6938 strictly convenient, stuff breaks if we don't honor it. Note | |
6939 that combined with the above, we only do this for pointer modes. */ | |
6940 rmode = GET_MODE (result); | |
6941 if (rmode == VOIDmode) | |
6942 rmode = tmode; | |
6943 if (rmode != tmode) | |
6944 result = convert_memory_address (tmode, result); | |
6945 | |
6946 return result; | |
6947 } | |
6948 | |
6949 /* Generate code for computing CONSTRUCTOR EXP. | |
6950 An rtx for the computed value is returned. If AVOID_TEMP_MEM | |
6951 is TRUE, instead of creating a temporary variable in memory | |
6952 NULL is returned and the caller needs to handle it differently. */ | |
6953 | |
6954 static rtx | |
6955 expand_constructor (tree exp, rtx target, enum expand_modifier modifier, | |
6956 bool avoid_temp_mem) | |
6957 { | |
6958 tree type = TREE_TYPE (exp); | |
6959 enum machine_mode mode = TYPE_MODE (type); | |
6960 | |
6961 /* Try to avoid creating a temporary at all. This is possible | |
6962 if all of the initializer is zero. | |
6963 FIXME: try to handle all [0..255] initializers we can handle | |
6964 with memset. */ | |
6965 if (TREE_STATIC (exp) | |
6966 && !TREE_ADDRESSABLE (exp) | |
6967 && target != 0 && mode == BLKmode | |
6968 && all_zeros_p (exp)) | |
6969 { | |
6970 clear_storage (target, expr_size (exp), BLOCK_OP_NORMAL); | |
6971 return target; | |
6972 } | |
6973 | |
6974 /* All elts simple constants => refer to a constant in memory. But | |
6975 if this is a non-BLKmode mode, let it store a field at a time | |
6976 since that should make a CONST_INT or CONST_DOUBLE when we | |
6977 fold. Likewise, if we have a target we can use, it is best to | |
6978 store directly into the target unless the type is large enough | |
6979 that memcpy will be used. If we are making an initializer and | |
6980 all operands are constant, put it in memory as well. | |
6981 | |
6982 FIXME: Avoid trying to fill vector constructors piece-meal. | |
6983 Output them with output_constant_def below unless we're sure | |
6984 they're zeros. This should go away when vector initializers | |
6985 are treated like VECTOR_CST instead of arrays. */ | |
6986 if ((TREE_STATIC (exp) | |
6987 && ((mode == BLKmode | |
6988 && ! (target != 0 && safe_from_p (target, exp, 1))) | |
6989 || TREE_ADDRESSABLE (exp) | |
6990 || (host_integerp (TYPE_SIZE_UNIT (type), 1) | |
6991 && (! MOVE_BY_PIECES_P | |
6992 (tree_low_cst (TYPE_SIZE_UNIT (type), 1), | |
6993 TYPE_ALIGN (type))) | |
6994 && ! mostly_zeros_p (exp)))) | |
6995 || ((modifier == EXPAND_INITIALIZER || modifier == EXPAND_CONST_ADDRESS) | |
6996 && TREE_CONSTANT (exp))) | |
6997 { | |
6998 rtx constructor; | |
6999 | |
7000 if (avoid_temp_mem) | |
7001 return NULL_RTX; | |
7002 | |
7003 constructor = expand_expr_constant (exp, 1, modifier); | |
7004 | |
7005 if (modifier != EXPAND_CONST_ADDRESS | |
7006 && modifier != EXPAND_INITIALIZER | |
7007 && modifier != EXPAND_SUM) | |
7008 constructor = validize_mem (constructor); | |
7009 | |
7010 return constructor; | |
7011 } | |
7012 | |
7013 /* Handle calls that pass values in multiple non-contiguous | |
7014 locations. The Irix 6 ABI has examples of this. */ | |
7015 if (target == 0 || ! safe_from_p (target, exp, 1) | |
7016 || GET_CODE (target) == PARALLEL || modifier == EXPAND_STACK_PARM) | |
7017 { | |
7018 if (avoid_temp_mem) | |
7019 return NULL_RTX; | |
7020 | |
7021 target | |
7022 = assign_temp (build_qualified_type (type, (TYPE_QUALS (type) | |
7023 | (TREE_READONLY (exp) | |
7024 * TYPE_QUAL_CONST))), | |
7025 0, TREE_ADDRESSABLE (exp), 1); | |
7026 } | |
7027 | |
7028 store_constructor (exp, target, 0, int_expr_size (exp)); | |
7029 return target; | |
7030 } | |
7031 | |
7032 | |
7033 /* expand_expr: generate code for computing expression EXP. | |
7034 An rtx for the computed value is returned. The value is never null. | |
7035 In the case of a void EXP, const0_rtx is returned. | |
7036 | |
7037 The value may be stored in TARGET if TARGET is nonzero. | |
7038 TARGET is just a suggestion; callers must assume that | |
7039 the rtx returned may not be the same as TARGET. | |
7040 | |
7041 If TARGET is CONST0_RTX, it means that the value will be ignored. | |
7042 | |
7043 If TMODE is not VOIDmode, it suggests generating the | |
7044 result in mode TMODE. But this is done only when convenient. | |
7045 Otherwise, TMODE is ignored and the value generated in its natural mode. | |
7046 TMODE is just a suggestion; callers must assume that | |
7047 the rtx returned may not have mode TMODE. | |
7048 | |
7049 Note that TARGET may have neither TMODE nor MODE. In that case, it | |
7050 probably will not be used. | |
7051 | |
7052 If MODIFIER is EXPAND_SUM then when EXP is an addition | |
7053 we can return an rtx of the form (MULT (REG ...) (CONST_INT ...)) | |
7054 or a nest of (PLUS ...) and (MINUS ...) where the terms are | |
7055 products as above, or REG or MEM, or constant. | |
7056 Ordinarily in such cases we would output mul or add instructions | |
7057 and then return a pseudo reg containing the sum. | |
7058 | |
7059 EXPAND_INITIALIZER is much like EXPAND_SUM except that | |
7060 it also marks a label as absolutely required (it can't be dead). | |
7061 It also makes a ZERO_EXTEND or SIGN_EXTEND instead of emitting extend insns. | |
7062 This is used for outputting expressions used in initializers. | |
7063 | |
7064 EXPAND_CONST_ADDRESS says that it is okay to return a MEM | |
7065 with a constant address even if that address is not normally legitimate. | |
7066 EXPAND_INITIALIZER and EXPAND_SUM also have this effect. | |
7067 | |
7068 EXPAND_STACK_PARM is used when expanding to a TARGET on the stack for | |
7069 a call parameter. Such targets require special care as we haven't yet | |
7070 marked TARGET so that it's safe from being trashed by libcalls. We | |
7071 don't want to use TARGET for anything but the final result; | |
7072 Intermediate values must go elsewhere. Additionally, calls to | |
7073 emit_block_move will be flagged with BLOCK_OP_CALL_PARM. | |
7074 | |
7075 If EXP is a VAR_DECL whose DECL_RTL was a MEM with an invalid | |
7076 address, and ALT_RTL is non-NULL, then *ALT_RTL is set to the | |
7077 DECL_RTL of the VAR_DECL. *ALT_RTL is also set if EXP is a | |
7078 COMPOUND_EXPR whose second argument is such a VAR_DECL, and so on | |
7079 recursively. */ | |
7080 | |
7081 static rtx expand_expr_real_1 (tree, rtx, enum machine_mode, | |
7082 enum expand_modifier, rtx *); | |
7083 | |
7084 rtx | |
7085 expand_expr_real (tree exp, rtx target, enum machine_mode tmode, | |
7086 enum expand_modifier modifier, rtx *alt_rtl) | |
7087 { | |
7088 int rn = -1; | |
7089 rtx ret, last = NULL; | |
7090 | |
7091 /* Handle ERROR_MARK before anybody tries to access its type. */ | |
7092 if (TREE_CODE (exp) == ERROR_MARK | |
7093 || (TREE_CODE (TREE_TYPE (exp)) == ERROR_MARK)) | |
7094 { | |
7095 ret = CONST0_RTX (tmode); | |
7096 return ret ? ret : const0_rtx; | |
7097 } | |
7098 | |
7099 if (flag_non_call_exceptions) | |
7100 { | |
7101 rn = lookup_expr_eh_region (exp); | |
7102 | |
7103 /* If rn < 0, then either (1) tree-ssa not used or (2) doesn't throw. */ | |
7104 if (rn >= 0) | |
7105 last = get_last_insn (); | |
7106 } | |
7107 | |
7108 /* If this is an expression of some kind and it has an associated line | |
7109 number, then emit the line number before expanding the expression. | |
7110 | |
7111 We need to save and restore the file and line information so that | |
7112 errors discovered during expansion are emitted with the right | |
7113 information. It would be better of the diagnostic routines | |
7114 used the file/line information embedded in the tree nodes rather | |
7115 than globals. */ | |
7116 if (cfun && EXPR_HAS_LOCATION (exp)) | |
7117 { | |
7118 location_t saved_location = input_location; | |
7119 input_location = EXPR_LOCATION (exp); | |
7120 set_curr_insn_source_location (input_location); | |
7121 | |
7122 /* Record where the insns produced belong. */ | |
7123 set_curr_insn_block (TREE_BLOCK (exp)); | |
7124 | |
7125 ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl); | |
7126 | |
7127 input_location = saved_location; | |
7128 } | |
7129 else | |
7130 { | |
7131 ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl); | |
7132 } | |
7133 | |
7134 /* If using non-call exceptions, mark all insns that may trap. | |
7135 expand_call() will mark CALL_INSNs before we get to this code, | |
7136 but it doesn't handle libcalls, and these may trap. */ | |
7137 if (rn >= 0) | |
7138 { | |
7139 rtx insn; | |
7140 for (insn = next_real_insn (last); insn; | |
7141 insn = next_real_insn (insn)) | |
7142 { | |
7143 if (! find_reg_note (insn, REG_EH_REGION, NULL_RTX) | |
7144 /* If we want exceptions for non-call insns, any | |
7145 may_trap_p instruction may throw. */ | |
7146 && GET_CODE (PATTERN (insn)) != CLOBBER | |
7147 && GET_CODE (PATTERN (insn)) != USE | |
7148 && (CALL_P (insn) || may_trap_p (PATTERN (insn)))) | |
7149 add_reg_note (insn, REG_EH_REGION, GEN_INT (rn)); | |
7150 } | |
7151 } | |
7152 | |
7153 return ret; | |
7154 } | |
7155 | |
7156 static rtx | |
7157 expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, | |
7158 enum expand_modifier modifier, rtx *alt_rtl) | |
7159 { | |
7160 rtx op0, op1, op2, temp, decl_rtl; | |
7161 tree type; | |
7162 int unsignedp; | |
7163 enum machine_mode mode; | |
7164 enum tree_code code = TREE_CODE (exp); | |
7165 optab this_optab; | |
7166 rtx subtarget, original_target; | |
7167 int ignore; | |
7168 tree context, subexp0, subexp1; | |
7169 bool reduce_bit_field; | |
7170 #define REDUCE_BIT_FIELD(expr) (reduce_bit_field \ | |
7171 ? reduce_to_bit_field_precision ((expr), \ | |
7172 target, \ | |
7173 type) \ | |
7174 : (expr)) | |
7175 | |
7176 type = TREE_TYPE (exp); | |
7177 mode = TYPE_MODE (type); | |
7178 unsignedp = TYPE_UNSIGNED (type); | |
7179 | |
7180 ignore = (target == const0_rtx | |
7181 || ((CONVERT_EXPR_CODE_P (code) | |
7182 || code == COND_EXPR || code == VIEW_CONVERT_EXPR) | |
7183 && TREE_CODE (type) == VOID_TYPE)); | |
7184 | |
7185 /* An operation in what may be a bit-field type needs the | |
7186 result to be reduced to the precision of the bit-field type, | |
7187 which is narrower than that of the type's mode. */ | |
7188 reduce_bit_field = (!ignore | |
7189 && TREE_CODE (type) == INTEGER_TYPE | |
7190 && GET_MODE_PRECISION (mode) > TYPE_PRECISION (type)); | |
7191 | |
7192 /* If we are going to ignore this result, we need only do something | |
7193 if there is a side-effect somewhere in the expression. If there | |
7194 is, short-circuit the most common cases here. Note that we must | |
7195 not call expand_expr with anything but const0_rtx in case this | |
7196 is an initial expansion of a size that contains a PLACEHOLDER_EXPR. */ | |
7197 | |
7198 if (ignore) | |
7199 { | |
7200 if (! TREE_SIDE_EFFECTS (exp)) | |
7201 return const0_rtx; | |
7202 | |
7203 /* Ensure we reference a volatile object even if value is ignored, but | |
7204 don't do this if all we are doing is taking its address. */ | |
7205 if (TREE_THIS_VOLATILE (exp) | |
7206 && TREE_CODE (exp) != FUNCTION_DECL | |
7207 && mode != VOIDmode && mode != BLKmode | |
7208 && modifier != EXPAND_CONST_ADDRESS) | |
7209 { | |
7210 temp = expand_expr (exp, NULL_RTX, VOIDmode, modifier); | |
7211 if (MEM_P (temp)) | |
7212 temp = copy_to_reg (temp); | |
7213 return const0_rtx; | |
7214 } | |
7215 | |
7216 if (TREE_CODE_CLASS (code) == tcc_unary | |
7217 || code == COMPONENT_REF || code == INDIRECT_REF) | |
7218 return expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, | |
7219 modifier); | |
7220 | |
7221 else if (TREE_CODE_CLASS (code) == tcc_binary | |
7222 || TREE_CODE_CLASS (code) == tcc_comparison | |
7223 || code == ARRAY_REF || code == ARRAY_RANGE_REF) | |
7224 { | |
7225 expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, modifier); | |
7226 expand_expr (TREE_OPERAND (exp, 1), const0_rtx, VOIDmode, modifier); | |
7227 return const0_rtx; | |
7228 } | |
7229 else if (code == BIT_FIELD_REF) | |
7230 { | |
7231 expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, modifier); | |
7232 expand_expr (TREE_OPERAND (exp, 1), const0_rtx, VOIDmode, modifier); | |
7233 expand_expr (TREE_OPERAND (exp, 2), const0_rtx, VOIDmode, modifier); | |
7234 return const0_rtx; | |
7235 } | |
7236 | |
7237 target = 0; | |
7238 } | |
7239 | |
7240 if (reduce_bit_field && modifier == EXPAND_STACK_PARM) | |
7241 target = 0; | |
7242 | |
7243 /* Use subtarget as the target for operand 0 of a binary operation. */ | |
7244 subtarget = get_subtarget (target); | |
7245 original_target = target; | |
7246 | |
7247 switch (code) | |
7248 { | |
7249 case LABEL_DECL: | |
7250 { | |
7251 tree function = decl_function_context (exp); | |
7252 | |
7253 temp = label_rtx (exp); | |
7254 temp = gen_rtx_LABEL_REF (Pmode, temp); | |
7255 | |
7256 if (function != current_function_decl | |
7257 && function != 0) | |
7258 LABEL_REF_NONLOCAL_P (temp) = 1; | |
7259 | |
7260 temp = gen_rtx_MEM (FUNCTION_MODE, temp); | |
7261 return temp; | |
7262 } | |
7263 | |
7264 case SSA_NAME: | |
7265 return expand_expr_real_1 (SSA_NAME_VAR (exp), target, tmode, modifier, | |
7266 NULL); | |
7267 | |
7268 case PARM_DECL: | |
7269 case VAR_DECL: | |
7270 /* If a static var's type was incomplete when the decl was written, | |
7271 but the type is complete now, lay out the decl now. */ | |
7272 if (DECL_SIZE (exp) == 0 | |
7273 && COMPLETE_OR_UNBOUND_ARRAY_TYPE_P (TREE_TYPE (exp)) | |
7274 && (TREE_STATIC (exp) || DECL_EXTERNAL (exp))) | |
7275 layout_decl (exp, 0); | |
7276 | |
7277 /* TLS emulation hook - replace __thread vars with | |
7278 *__emutls_get_address (&_emutls.var). */ | |
7279 if (! targetm.have_tls | |
7280 && TREE_CODE (exp) == VAR_DECL | |
7281 && DECL_THREAD_LOCAL_P (exp)) | |
7282 { | |
7283 exp = build_fold_indirect_ref (emutls_var_address (exp)); | |
7284 return expand_expr_real_1 (exp, target, tmode, modifier, NULL); | |
7285 } | |
7286 | |
7287 /* ... fall through ... */ | |
7288 | |
7289 case FUNCTION_DECL: | |
7290 case RESULT_DECL: | |
7291 decl_rtl = DECL_RTL (exp); | |
7292 gcc_assert (decl_rtl); | |
7293 decl_rtl = copy_rtx (decl_rtl); | |
7294 | |
7295 /* Ensure variable marked as used even if it doesn't go through | |
7296 a parser. If it hasn't be used yet, write out an external | |
7297 definition. */ | |
7298 if (! TREE_USED (exp)) | |
7299 { | |
7300 assemble_external (exp); | |
7301 TREE_USED (exp) = 1; | |
7302 } | |
7303 | |
7304 /* Show we haven't gotten RTL for this yet. */ | |
7305 temp = 0; | |
7306 | |
7307 /* Variables inherited from containing functions should have | |
7308 been lowered by this point. */ | |
7309 context = decl_function_context (exp); | |
7310 gcc_assert (!context | |
7311 || context == current_function_decl | |
7312 || TREE_STATIC (exp) | |
7313 /* ??? C++ creates functions that are not TREE_STATIC. */ | |
7314 || TREE_CODE (exp) == FUNCTION_DECL); | |
7315 | |
7316 /* This is the case of an array whose size is to be determined | |
7317 from its initializer, while the initializer is still being parsed. | |
7318 See expand_decl. */ | |
7319 | |
7320 if (MEM_P (decl_rtl) && REG_P (XEXP (decl_rtl, 0))) | |
7321 temp = validize_mem (decl_rtl); | |
7322 | |
7323 /* If DECL_RTL is memory, we are in the normal case and the | |
7324 address is not valid, get the address into a register. */ | |
7325 | |
7326 else if (MEM_P (decl_rtl) && modifier != EXPAND_INITIALIZER) | |
7327 { | |
7328 if (alt_rtl) | |
7329 *alt_rtl = decl_rtl; | |
7330 decl_rtl = use_anchored_address (decl_rtl); | |
7331 if (modifier != EXPAND_CONST_ADDRESS | |
7332 && modifier != EXPAND_SUM | |
7333 && !memory_address_p (DECL_MODE (exp), XEXP (decl_rtl, 0))) | |
7334 temp = replace_equiv_address (decl_rtl, | |
7335 copy_rtx (XEXP (decl_rtl, 0))); | |
7336 } | |
7337 | |
7338 /* If we got something, return it. But first, set the alignment | |
7339 if the address is a register. */ | |
7340 if (temp != 0) | |
7341 { | |
7342 if (MEM_P (temp) && REG_P (XEXP (temp, 0))) | |
7343 mark_reg_pointer (XEXP (temp, 0), DECL_ALIGN (exp)); | |
7344 | |
7345 return temp; | |
7346 } | |
7347 | |
7348 /* If the mode of DECL_RTL does not match that of the decl, it | |
7349 must be a promoted value. We return a SUBREG of the wanted mode, | |
7350 but mark it so that we know that it was already extended. */ | |
7351 | |
7352 if (REG_P (decl_rtl) | |
7353 && GET_MODE (decl_rtl) != DECL_MODE (exp)) | |
7354 { | |
7355 enum machine_mode pmode; | |
7356 | |
7357 /* Get the signedness used for this variable. Ensure we get the | |
7358 same mode we got when the variable was declared. */ | |
7359 pmode = promote_mode (type, DECL_MODE (exp), &unsignedp, | |
7360 (TREE_CODE (exp) == RESULT_DECL | |
7361 || TREE_CODE (exp) == PARM_DECL) ? 1 : 0); | |
7362 gcc_assert (GET_MODE (decl_rtl) == pmode); | |
7363 | |
7364 temp = gen_lowpart_SUBREG (mode, decl_rtl); | |
7365 SUBREG_PROMOTED_VAR_P (temp) = 1; | |
7366 SUBREG_PROMOTED_UNSIGNED_SET (temp, unsignedp); | |
7367 return temp; | |
7368 } | |
7369 | |
7370 return decl_rtl; | |
7371 | |
7372 case INTEGER_CST: | |
7373 temp = immed_double_const (TREE_INT_CST_LOW (exp), | |
7374 TREE_INT_CST_HIGH (exp), mode); | |
7375 | |
7376 return temp; | |
7377 | |
7378 case VECTOR_CST: | |
7379 { | |
7380 tree tmp = NULL_TREE; | |
7381 if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT | |
7382 || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT | |
7383 || GET_MODE_CLASS (mode) == MODE_VECTOR_FRACT | |
7384 || GET_MODE_CLASS (mode) == MODE_VECTOR_UFRACT | |
7385 || GET_MODE_CLASS (mode) == MODE_VECTOR_ACCUM | |
7386 || GET_MODE_CLASS (mode) == MODE_VECTOR_UACCUM) | |
7387 return const_vector_from_tree (exp); | |
7388 if (GET_MODE_CLASS (mode) == MODE_INT) | |
7389 { | |
7390 tree type_for_mode = lang_hooks.types.type_for_mode (mode, 1); | |
7391 if (type_for_mode) | |
7392 tmp = fold_unary (VIEW_CONVERT_EXPR, type_for_mode, exp); | |
7393 } | |
7394 if (!tmp) | |
7395 tmp = build_constructor_from_list (type, | |
7396 TREE_VECTOR_CST_ELTS (exp)); | |
7397 return expand_expr (tmp, ignore ? const0_rtx : target, | |
7398 tmode, modifier); | |
7399 } | |
7400 | |
7401 case CONST_DECL: | |
7402 return expand_expr (DECL_INITIAL (exp), target, VOIDmode, modifier); | |
7403 | |
7404 case REAL_CST: | |
7405 /* If optimized, generate immediate CONST_DOUBLE | |
7406 which will be turned into memory by reload if necessary. | |
7407 | |
7408 We used to force a register so that loop.c could see it. But | |
7409 this does not allow gen_* patterns to perform optimizations with | |
7410 the constants. It also produces two insns in cases like "x = 1.0;". | |
7411 On most machines, floating-point constants are not permitted in | |
7412 many insns, so we'd end up copying it to a register in any case. | |
7413 | |
7414 Now, we do the copying in expand_binop, if appropriate. */ | |
7415 return CONST_DOUBLE_FROM_REAL_VALUE (TREE_REAL_CST (exp), | |
7416 TYPE_MODE (TREE_TYPE (exp))); | |
7417 | |
7418 case FIXED_CST: | |
7419 return CONST_FIXED_FROM_FIXED_VALUE (TREE_FIXED_CST (exp), | |
7420 TYPE_MODE (TREE_TYPE (exp))); | |
7421 | |
7422 case COMPLEX_CST: | |
7423 /* Handle evaluating a complex constant in a CONCAT target. */ | |
7424 if (original_target && GET_CODE (original_target) == CONCAT) | |
7425 { | |
7426 enum machine_mode mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp))); | |
7427 rtx rtarg, itarg; | |
7428 | |
7429 rtarg = XEXP (original_target, 0); | |
7430 itarg = XEXP (original_target, 1); | |
7431 | |
7432 /* Move the real and imaginary parts separately. */ | |
7433 op0 = expand_expr (TREE_REALPART (exp), rtarg, mode, EXPAND_NORMAL); | |
7434 op1 = expand_expr (TREE_IMAGPART (exp), itarg, mode, EXPAND_NORMAL); | |
7435 | |
7436 if (op0 != rtarg) | |
7437 emit_move_insn (rtarg, op0); | |
7438 if (op1 != itarg) | |
7439 emit_move_insn (itarg, op1); | |
7440 | |
7441 return original_target; | |
7442 } | |
7443 | |
7444 /* ... fall through ... */ | |
7445 | |
7446 case STRING_CST: | |
7447 temp = expand_expr_constant (exp, 1, modifier); | |
7448 | |
7449 /* temp contains a constant address. | |
7450 On RISC machines where a constant address isn't valid, | |
7451 make some insns to get that address into a register. */ | |
7452 if (modifier != EXPAND_CONST_ADDRESS | |
7453 && modifier != EXPAND_INITIALIZER | |
7454 && modifier != EXPAND_SUM | |
7455 && ! memory_address_p (mode, XEXP (temp, 0))) | |
7456 return replace_equiv_address (temp, | |
7457 copy_rtx (XEXP (temp, 0))); | |
7458 return temp; | |
7459 | |
7460 case SAVE_EXPR: | |
7461 { | |
7462 tree val = TREE_OPERAND (exp, 0); | |
7463 rtx ret = expand_expr_real_1 (val, target, tmode, modifier, alt_rtl); | |
7464 | |
7465 if (!SAVE_EXPR_RESOLVED_P (exp)) | |
7466 { | |
7467 /* We can indeed still hit this case, typically via builtin | |
7468 expanders calling save_expr immediately before expanding | |
7469 something. Assume this means that we only have to deal | |
7470 with non-BLKmode values. */ | |
7471 gcc_assert (GET_MODE (ret) != BLKmode); | |
7472 | |
7473 val = build_decl (VAR_DECL, NULL, TREE_TYPE (exp)); | |
7474 DECL_ARTIFICIAL (val) = 1; | |
7475 DECL_IGNORED_P (val) = 1; | |
7476 TREE_OPERAND (exp, 0) = val; | |
7477 SAVE_EXPR_RESOLVED_P (exp) = 1; | |
7478 | |
7479 if (!CONSTANT_P (ret)) | |
7480 ret = copy_to_reg (ret); | |
7481 SET_DECL_RTL (val, ret); | |
7482 } | |
7483 | |
7484 return ret; | |
7485 } | |
7486 | |
7487 case GOTO_EXPR: | |
7488 if (TREE_CODE (TREE_OPERAND (exp, 0)) == LABEL_DECL) | |
7489 expand_goto (TREE_OPERAND (exp, 0)); | |
7490 else | |
7491 expand_computed_goto (TREE_OPERAND (exp, 0)); | |
7492 return const0_rtx; | |
7493 | |
7494 case CONSTRUCTOR: | |
7495 /* If we don't need the result, just ensure we evaluate any | |
7496 subexpressions. */ | |
7497 if (ignore) | |
7498 { | |
7499 unsigned HOST_WIDE_INT idx; | |
7500 tree value; | |
7501 | |
7502 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value) | |
7503 expand_expr (value, const0_rtx, VOIDmode, EXPAND_NORMAL); | |
7504 | |
7505 return const0_rtx; | |
7506 } | |
7507 | |
7508 return expand_constructor (exp, target, modifier, false); | |
7509 | |
7510 case MISALIGNED_INDIRECT_REF: | |
7511 case ALIGN_INDIRECT_REF: | |
7512 case INDIRECT_REF: | |
7513 { | |
7514 tree exp1 = TREE_OPERAND (exp, 0); | |
7515 | |
7516 if (modifier != EXPAND_WRITE) | |
7517 { | |
7518 tree t; | |
7519 | |
7520 t = fold_read_from_constant_string (exp); | |
7521 if (t) | |
7522 return expand_expr (t, target, tmode, modifier); | |
7523 } | |
7524 | |
7525 op0 = expand_expr (exp1, NULL_RTX, VOIDmode, EXPAND_SUM); | |
7526 op0 = memory_address (mode, op0); | |
7527 | |
7528 if (code == ALIGN_INDIRECT_REF) | |
7529 { | |
7530 int align = TYPE_ALIGN_UNIT (type); | |
7531 op0 = gen_rtx_AND (Pmode, op0, GEN_INT (-align)); | |
7532 op0 = memory_address (mode, op0); | |
7533 } | |
7534 | |
7535 temp = gen_rtx_MEM (mode, op0); | |
7536 | |
7537 set_mem_attributes (temp, exp, 0); | |
7538 | |
7539 /* Resolve the misalignment now, so that we don't have to remember | |
7540 to resolve it later. Of course, this only works for reads. */ | |
7541 /* ??? When we get around to supporting writes, we'll have to handle | |
7542 this in store_expr directly. The vectorizer isn't generating | |
7543 those yet, however. */ | |
7544 if (code == MISALIGNED_INDIRECT_REF) | |
7545 { | |
7546 int icode; | |
7547 rtx reg, insn; | |
7548 | |
7549 gcc_assert (modifier == EXPAND_NORMAL | |
7550 || modifier == EXPAND_STACK_PARM); | |
7551 | |
7552 /* The vectorizer should have already checked the mode. */ | |
7553 icode = optab_handler (movmisalign_optab, mode)->insn_code; | |
7554 gcc_assert (icode != CODE_FOR_nothing); | |
7555 | |
7556 /* We've already validated the memory, and we're creating a | |
7557 new pseudo destination. The predicates really can't fail. */ | |
7558 reg = gen_reg_rtx (mode); | |
7559 | |
7560 /* Nor can the insn generator. */ | |
7561 insn = GEN_FCN (icode) (reg, temp); | |
7562 emit_insn (insn); | |
7563 | |
7564 return reg; | |
7565 } | |
7566 | |
7567 return temp; | |
7568 } | |
7569 | |
7570 case TARGET_MEM_REF: | |
7571 { | |
7572 struct mem_address addr; | |
7573 | |
7574 get_address_description (exp, &addr); | |
7575 op0 = addr_for_mem_ref (&addr, true); | |
7576 op0 = memory_address (mode, op0); | |
7577 temp = gen_rtx_MEM (mode, op0); | |
7578 set_mem_attributes (temp, TMR_ORIGINAL (exp), 0); | |
7579 } | |
7580 return temp; | |
7581 | |
7582 case ARRAY_REF: | |
7583 | |
7584 { | |
7585 tree array = TREE_OPERAND (exp, 0); | |
7586 tree index = TREE_OPERAND (exp, 1); | |
7587 | |
7588 /* Fold an expression like: "foo"[2]. | |
7589 This is not done in fold so it won't happen inside &. | |
7590 Don't fold if this is for wide characters since it's too | |
7591 difficult to do correctly and this is a very rare case. */ | |
7592 | |
7593 if (modifier != EXPAND_CONST_ADDRESS | |
7594 && modifier != EXPAND_INITIALIZER | |
7595 && modifier != EXPAND_MEMORY) | |
7596 { | |
7597 tree t = fold_read_from_constant_string (exp); | |
7598 | |
7599 if (t) | |
7600 return expand_expr (t, target, tmode, modifier); | |
7601 } | |
7602 | |
7603 /* If this is a constant index into a constant array, | |
7604 just get the value from the array. Handle both the cases when | |
7605 we have an explicit constructor and when our operand is a variable | |
7606 that was declared const. */ | |
7607 | |
7608 if (modifier != EXPAND_CONST_ADDRESS | |
7609 && modifier != EXPAND_INITIALIZER | |
7610 && modifier != EXPAND_MEMORY | |
7611 && TREE_CODE (array) == CONSTRUCTOR | |
7612 && ! TREE_SIDE_EFFECTS (array) | |
7613 && TREE_CODE (index) == INTEGER_CST) | |
7614 { | |
7615 unsigned HOST_WIDE_INT ix; | |
7616 tree field, value; | |
7617 | |
7618 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (array), ix, | |
7619 field, value) | |
7620 if (tree_int_cst_equal (field, index)) | |
7621 { | |
7622 if (!TREE_SIDE_EFFECTS (value)) | |
7623 return expand_expr (fold (value), target, tmode, modifier); | |
7624 break; | |
7625 } | |
7626 } | |
7627 | |
7628 else if (optimize >= 1 | |
7629 && modifier != EXPAND_CONST_ADDRESS | |
7630 && modifier != EXPAND_INITIALIZER | |
7631 && modifier != EXPAND_MEMORY | |
7632 && TREE_READONLY (array) && ! TREE_SIDE_EFFECTS (array) | |
7633 && TREE_CODE (array) == VAR_DECL && DECL_INITIAL (array) | |
7634 && TREE_CODE (DECL_INITIAL (array)) != ERROR_MARK | |
7635 && targetm.binds_local_p (array)) | |
7636 { | |
7637 if (TREE_CODE (index) == INTEGER_CST) | |
7638 { | |
7639 tree init = DECL_INITIAL (array); | |
7640 | |
7641 if (TREE_CODE (init) == CONSTRUCTOR) | |
7642 { | |
7643 unsigned HOST_WIDE_INT ix; | |
7644 tree field, value; | |
7645 | |
7646 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), ix, | |
7647 field, value) | |
7648 if (tree_int_cst_equal (field, index)) | |
7649 { | |
7650 if (TREE_SIDE_EFFECTS (value)) | |
7651 break; | |
7652 | |
7653 if (TREE_CODE (value) == CONSTRUCTOR) | |
7654 { | |
7655 /* If VALUE is a CONSTRUCTOR, this | |
7656 optimization is only useful if | |
7657 this doesn't store the CONSTRUCTOR | |
7658 into memory. If it does, it is more | |
7659 efficient to just load the data from | |
7660 the array directly. */ | |
7661 rtx ret = expand_constructor (value, target, | |
7662 modifier, true); | |
7663 if (ret == NULL_RTX) | |
7664 break; | |
7665 } | |
7666 | |
7667 return expand_expr (fold (value), target, tmode, | |
7668 modifier); | |
7669 } | |
7670 } | |
7671 else if(TREE_CODE (init) == STRING_CST) | |
7672 { | |
7673 tree index1 = index; | |
7674 tree low_bound = array_ref_low_bound (exp); | |
7675 index1 = fold_convert (sizetype, TREE_OPERAND (exp, 1)); | |
7676 | |
7677 /* Optimize the special-case of a zero lower bound. | |
7678 | |
7679 We convert the low_bound to sizetype to avoid some problems | |
7680 with constant folding. (E.g. suppose the lower bound is 1, | |
7681 and its mode is QI. Without the conversion,l (ARRAY | |
7682 +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1)) | |
7683 +INDEX), which becomes (ARRAY+255+INDEX). Opps!) */ | |
7684 | |
7685 if (! integer_zerop (low_bound)) | |
7686 index1 = size_diffop (index1, fold_convert (sizetype, | |
7687 low_bound)); | |
7688 | |
7689 if (0 > compare_tree_int (index1, | |
7690 TREE_STRING_LENGTH (init))) | |
7691 { | |
7692 tree type = TREE_TYPE (TREE_TYPE (init)); | |
7693 enum machine_mode mode = TYPE_MODE (type); | |
7694 | |
7695 if (GET_MODE_CLASS (mode) == MODE_INT | |
7696 && GET_MODE_SIZE (mode) == 1) | |
7697 return gen_int_mode (TREE_STRING_POINTER (init) | |
7698 [TREE_INT_CST_LOW (index1)], | |
7699 mode); | |
7700 } | |
7701 } | |
7702 } | |
7703 } | |
7704 } | |
7705 goto normal_inner_ref; | |
7706 | |
7707 case COMPONENT_REF: | |
7708 /* If the operand is a CONSTRUCTOR, we can just extract the | |
7709 appropriate field if it is present. */ | |
7710 if (TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR) | |
7711 { | |
7712 unsigned HOST_WIDE_INT idx; | |
7713 tree field, value; | |
7714 | |
7715 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (TREE_OPERAND (exp, 0)), | |
7716 idx, field, value) | |
7717 if (field == TREE_OPERAND (exp, 1) | |
7718 /* We can normally use the value of the field in the | |
7719 CONSTRUCTOR. However, if this is a bitfield in | |
7720 an integral mode that we can fit in a HOST_WIDE_INT, | |
7721 we must mask only the number of bits in the bitfield, | |
7722 since this is done implicitly by the constructor. If | |
7723 the bitfield does not meet either of those conditions, | |
7724 we can't do this optimization. */ | |
7725 && (! DECL_BIT_FIELD (field) | |
7726 || ((GET_MODE_CLASS (DECL_MODE (field)) == MODE_INT) | |
7727 && (GET_MODE_BITSIZE (DECL_MODE (field)) | |
7728 <= HOST_BITS_PER_WIDE_INT)))) | |
7729 { | |
7730 if (DECL_BIT_FIELD (field) | |
7731 && modifier == EXPAND_STACK_PARM) | |
7732 target = 0; | |
7733 op0 = expand_expr (value, target, tmode, modifier); | |
7734 if (DECL_BIT_FIELD (field)) | |
7735 { | |
7736 HOST_WIDE_INT bitsize = TREE_INT_CST_LOW (DECL_SIZE (field)); | |
7737 enum machine_mode imode = TYPE_MODE (TREE_TYPE (field)); | |
7738 | |
7739 if (TYPE_UNSIGNED (TREE_TYPE (field))) | |
7740 { | |
7741 op1 = GEN_INT (((HOST_WIDE_INT) 1 << bitsize) - 1); | |
7742 op0 = expand_and (imode, op0, op1, target); | |
7743 } | |
7744 else | |
7745 { | |
7746 tree count | |
7747 = build_int_cst (NULL_TREE, | |
7748 GET_MODE_BITSIZE (imode) - bitsize); | |
7749 | |
7750 op0 = expand_shift (LSHIFT_EXPR, imode, op0, count, | |
7751 target, 0); | |
7752 op0 = expand_shift (RSHIFT_EXPR, imode, op0, count, | |
7753 target, 0); | |
7754 } | |
7755 } | |
7756 | |
7757 return op0; | |
7758 } | |
7759 } | |
7760 goto normal_inner_ref; | |
7761 | |
7762 case BIT_FIELD_REF: | |
7763 case ARRAY_RANGE_REF: | |
7764 normal_inner_ref: | |
7765 { | |
7766 enum machine_mode mode1, mode2; | |
7767 HOST_WIDE_INT bitsize, bitpos; | |
7768 tree offset; | |
7769 int volatilep = 0, must_force_mem; | |
7770 tree tem = get_inner_reference (exp, &bitsize, &bitpos, &offset, | |
7771 &mode1, &unsignedp, &volatilep, true); | |
7772 rtx orig_op0, memloc; | |
7773 | |
7774 /* If we got back the original object, something is wrong. Perhaps | |
7775 we are evaluating an expression too early. In any event, don't | |
7776 infinitely recurse. */ | |
7777 gcc_assert (tem != exp); | |
7778 | |
7779 /* If TEM's type is a union of variable size, pass TARGET to the inner | |
7780 computation, since it will need a temporary and TARGET is known | |
7781 to have to do. This occurs in unchecked conversion in Ada. */ | |
7782 orig_op0 = op0 | |
7783 = expand_expr (tem, | |
7784 (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE | |
7785 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem))) | |
7786 != INTEGER_CST) | |
7787 && modifier != EXPAND_STACK_PARM | |
7788 ? target : NULL_RTX), | |
7789 VOIDmode, | |
7790 (modifier == EXPAND_INITIALIZER | |
7791 || modifier == EXPAND_CONST_ADDRESS | |
7792 || modifier == EXPAND_STACK_PARM) | |
7793 ? modifier : EXPAND_NORMAL); | |
7794 | |
7795 mode2 | |
7796 = CONSTANT_P (op0) ? TYPE_MODE (TREE_TYPE (tem)) : GET_MODE (op0); | |
7797 | |
7798 /* If we have either an offset, a BLKmode result, or a reference | |
7799 outside the underlying object, we must force it to memory. | |
7800 Such a case can occur in Ada if we have unchecked conversion | |
7801 of an expression from a scalar type to an aggregate type or | |
7802 for an ARRAY_RANGE_REF whose type is BLKmode, or if we were | |
7803 passed a partially uninitialized object or a view-conversion | |
7804 to a larger size. */ | |
7805 must_force_mem = (offset | |
7806 || mode1 == BLKmode | |
7807 || bitpos + bitsize > GET_MODE_BITSIZE (mode2)); | |
7808 | |
7809 /* If this is a constant, put it in a register if it is a legitimate | |
7810 constant and we don't need a memory reference. */ | |
7811 if (CONSTANT_P (op0) | |
7812 && mode2 != BLKmode | |
7813 && LEGITIMATE_CONSTANT_P (op0) | |
7814 && !must_force_mem) | |
7815 op0 = force_reg (mode2, op0); | |
7816 | |
7817 /* Otherwise, if this is a constant, try to force it to the constant | |
7818 pool. Note that back-ends, e.g. MIPS, may refuse to do so if it | |
7819 is a legitimate constant. */ | |
7820 else if (CONSTANT_P (op0) && (memloc = force_const_mem (mode2, op0))) | |
7821 op0 = validize_mem (memloc); | |
7822 | |
7823 /* Otherwise, if this is a constant or the object is not in memory | |
7824 and need be, put it there. */ | |
7825 else if (CONSTANT_P (op0) || (!MEM_P (op0) && must_force_mem)) | |
7826 { | |
7827 tree nt = build_qualified_type (TREE_TYPE (tem), | |
7828 (TYPE_QUALS (TREE_TYPE (tem)) | |
7829 | TYPE_QUAL_CONST)); | |
7830 memloc = assign_temp (nt, 1, 1, 1); | |
7831 emit_move_insn (memloc, op0); | |
7832 op0 = memloc; | |
7833 } | |
7834 | |
7835 if (offset) | |
7836 { | |
7837 rtx offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode, | |
7838 EXPAND_SUM); | |
7839 | |
7840 gcc_assert (MEM_P (op0)); | |
7841 | |
7842 #ifdef POINTERS_EXTEND_UNSIGNED | |
7843 if (GET_MODE (offset_rtx) != Pmode) | |
7844 offset_rtx = convert_to_mode (Pmode, offset_rtx, 0); | |
7845 #else | |
7846 if (GET_MODE (offset_rtx) != ptr_mode) | |
7847 offset_rtx = convert_to_mode (ptr_mode, offset_rtx, 0); | |
7848 #endif | |
7849 | |
7850 if (GET_MODE (op0) == BLKmode | |
7851 /* A constant address in OP0 can have VOIDmode, we must | |
7852 not try to call force_reg in that case. */ | |
7853 && GET_MODE (XEXP (op0, 0)) != VOIDmode | |
7854 && bitsize != 0 | |
7855 && (bitpos % bitsize) == 0 | |
7856 && (bitsize % GET_MODE_ALIGNMENT (mode1)) == 0 | |
7857 && MEM_ALIGN (op0) == GET_MODE_ALIGNMENT (mode1)) | |
7858 { | |
7859 op0 = adjust_address (op0, mode1, bitpos / BITS_PER_UNIT); | |
7860 bitpos = 0; | |
7861 } | |
7862 | |
7863 op0 = offset_address (op0, offset_rtx, | |
7864 highest_pow2_factor (offset)); | |
7865 } | |
7866 | |
7867 /* If OFFSET is making OP0 more aligned than BIGGEST_ALIGNMENT, | |
7868 record its alignment as BIGGEST_ALIGNMENT. */ | |
7869 if (MEM_P (op0) && bitpos == 0 && offset != 0 | |
7870 && is_aligning_offset (offset, tem)) | |
7871 set_mem_align (op0, BIGGEST_ALIGNMENT); | |
7872 | |
7873 /* Don't forget about volatility even if this is a bitfield. */ | |
7874 if (MEM_P (op0) && volatilep && ! MEM_VOLATILE_P (op0)) | |
7875 { | |
7876 if (op0 == orig_op0) | |
7877 op0 = copy_rtx (op0); | |
7878 | |
7879 MEM_VOLATILE_P (op0) = 1; | |
7880 } | |
7881 | |
7882 /* The following code doesn't handle CONCAT. | |
7883 Assume only bitpos == 0 can be used for CONCAT, due to | |
7884 one element arrays having the same mode as its element. */ | |
7885 if (GET_CODE (op0) == CONCAT) | |
7886 { | |
7887 gcc_assert (bitpos == 0 | |
7888 && bitsize == GET_MODE_BITSIZE (GET_MODE (op0))); | |
7889 return op0; | |
7890 } | |
7891 | |
7892 /* In cases where an aligned union has an unaligned object | |
7893 as a field, we might be extracting a BLKmode value from | |
7894 an integer-mode (e.g., SImode) object. Handle this case | |
7895 by doing the extract into an object as wide as the field | |
7896 (which we know to be the width of a basic mode), then | |
7897 storing into memory, and changing the mode to BLKmode. */ | |
7898 if (mode1 == VOIDmode | |
7899 || REG_P (op0) || GET_CODE (op0) == SUBREG | |
7900 || (mode1 != BLKmode && ! direct_load[(int) mode1] | |
7901 && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT | |
7902 && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT | |
7903 && modifier != EXPAND_CONST_ADDRESS | |
7904 && modifier != EXPAND_INITIALIZER) | |
7905 /* If the field isn't aligned enough to fetch as a memref, | |
7906 fetch it as a bit field. */ | |
7907 || (mode1 != BLKmode | |
7908 && (((TYPE_ALIGN (TREE_TYPE (tem)) < GET_MODE_ALIGNMENT (mode) | |
7909 || (bitpos % GET_MODE_ALIGNMENT (mode) != 0) | |
7910 || (MEM_P (op0) | |
7911 && (MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode1) | |
7912 || (bitpos % GET_MODE_ALIGNMENT (mode1) != 0)))) | |
7913 && ((modifier == EXPAND_CONST_ADDRESS | |
7914 || modifier == EXPAND_INITIALIZER) | |
7915 ? STRICT_ALIGNMENT | |
7916 : SLOW_UNALIGNED_ACCESS (mode1, MEM_ALIGN (op0)))) | |
7917 || (bitpos % BITS_PER_UNIT != 0))) | |
7918 /* If the type and the field are a constant size and the | |
7919 size of the type isn't the same size as the bitfield, | |
7920 we must use bitfield operations. */ | |
7921 || (bitsize >= 0 | |
7922 && TYPE_SIZE (TREE_TYPE (exp)) | |
7923 && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST | |
7924 && 0 != compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)), | |
7925 bitsize))) | |
7926 { | |
7927 enum machine_mode ext_mode = mode; | |
7928 | |
7929 if (ext_mode == BLKmode | |
7930 && ! (target != 0 && MEM_P (op0) | |
7931 && MEM_P (target) | |
7932 && bitpos % BITS_PER_UNIT == 0)) | |
7933 ext_mode = mode_for_size (bitsize, MODE_INT, 1); | |
7934 | |
7935 if (ext_mode == BLKmode) | |
7936 { | |
7937 if (target == 0) | |
7938 target = assign_temp (type, 0, 1, 1); | |
7939 | |
7940 if (bitsize == 0) | |
7941 return target; | |
7942 | |
7943 /* In this case, BITPOS must start at a byte boundary and | |
7944 TARGET, if specified, must be a MEM. */ | |
7945 gcc_assert (MEM_P (op0) | |
7946 && (!target || MEM_P (target)) | |
7947 && !(bitpos % BITS_PER_UNIT)); | |
7948 | |
7949 emit_block_move (target, | |
7950 adjust_address (op0, VOIDmode, | |
7951 bitpos / BITS_PER_UNIT), | |
7952 GEN_INT ((bitsize + BITS_PER_UNIT - 1) | |
7953 / BITS_PER_UNIT), | |
7954 (modifier == EXPAND_STACK_PARM | |
7955 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL)); | |
7956 | |
7957 return target; | |
7958 } | |
7959 | |
7960 op0 = validize_mem (op0); | |
7961 | |
7962 if (MEM_P (op0) && REG_P (XEXP (op0, 0))) | |
7963 mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0)); | |
7964 | |
7965 op0 = extract_bit_field (op0, bitsize, bitpos, unsignedp, | |
7966 (modifier == EXPAND_STACK_PARM | |
7967 ? NULL_RTX : target), | |
7968 ext_mode, ext_mode); | |
7969 | |
7970 /* If the result is a record type and BITSIZE is narrower than | |
7971 the mode of OP0, an integral mode, and this is a big endian | |
7972 machine, we must put the field into the high-order bits. */ | |
7973 if (TREE_CODE (type) == RECORD_TYPE && BYTES_BIG_ENDIAN | |
7974 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT | |
7975 && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (op0))) | |
7976 op0 = expand_shift (LSHIFT_EXPR, GET_MODE (op0), op0, | |
7977 size_int (GET_MODE_BITSIZE (GET_MODE (op0)) | |
7978 - bitsize), | |
7979 op0, 1); | |
7980 | |
7981 /* If the result type is BLKmode, store the data into a temporary | |
7982 of the appropriate type, but with the mode corresponding to the | |
7983 mode for the data we have (op0's mode). It's tempting to make | |
7984 this a constant type, since we know it's only being stored once, | |
7985 but that can cause problems if we are taking the address of this | |
7986 COMPONENT_REF because the MEM of any reference via that address | |
7987 will have flags corresponding to the type, which will not | |
7988 necessarily be constant. */ | |
7989 if (mode == BLKmode) | |
7990 { | |
7991 HOST_WIDE_INT size = GET_MODE_BITSIZE (ext_mode); | |
7992 rtx new_rtx; | |
7993 | |
7994 /* If the reference doesn't use the alias set of its type, | |
7995 we cannot create the temporary using that type. */ | |
7996 if (component_uses_parent_alias_set (exp)) | |
7997 { | |
7998 new_rtx = assign_stack_local (ext_mode, size, 0); | |
7999 set_mem_alias_set (new_rtx, get_alias_set (exp)); | |
8000 } | |
8001 else | |
8002 new_rtx = assign_stack_temp_for_type (ext_mode, size, 0, type); | |
8003 | |
8004 emit_move_insn (new_rtx, op0); | |
8005 op0 = copy_rtx (new_rtx); | |
8006 PUT_MODE (op0, BLKmode); | |
8007 set_mem_attributes (op0, exp, 1); | |
8008 } | |
8009 | |
8010 return op0; | |
8011 } | |
8012 | |
8013 /* If the result is BLKmode, use that to access the object | |
8014 now as well. */ | |
8015 if (mode == BLKmode) | |
8016 mode1 = BLKmode; | |
8017 | |
8018 /* Get a reference to just this component. */ | |
8019 if (modifier == EXPAND_CONST_ADDRESS | |
8020 || modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER) | |
8021 op0 = adjust_address_nv (op0, mode1, bitpos / BITS_PER_UNIT); | |
8022 else | |
8023 op0 = adjust_address (op0, mode1, bitpos / BITS_PER_UNIT); | |
8024 | |
8025 if (op0 == orig_op0) | |
8026 op0 = copy_rtx (op0); | |
8027 | |
8028 set_mem_attributes (op0, exp, 0); | |
8029 if (REG_P (XEXP (op0, 0))) | |
8030 mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0)); | |
8031 | |
8032 MEM_VOLATILE_P (op0) |= volatilep; | |
8033 if (mode == mode1 || mode1 == BLKmode || mode1 == tmode | |
8034 || modifier == EXPAND_CONST_ADDRESS | |
8035 || modifier == EXPAND_INITIALIZER) | |
8036 return op0; | |
8037 else if (target == 0) | |
8038 target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode); | |
8039 | |
8040 convert_move (target, op0, unsignedp); | |
8041 return target; | |
8042 } | |
8043 | |
8044 case OBJ_TYPE_REF: | |
8045 return expand_expr (OBJ_TYPE_REF_EXPR (exp), target, tmode, modifier); | |
8046 | |
8047 case CALL_EXPR: | |
8048 /* All valid uses of __builtin_va_arg_pack () are removed during | |
8049 inlining. */ | |
8050 if (CALL_EXPR_VA_ARG_PACK (exp)) | |
8051 error ("%Kinvalid use of %<__builtin_va_arg_pack ()%>", exp); | |
8052 { | |
8053 tree fndecl = get_callee_fndecl (exp), attr; | |
8054 | |
8055 if (fndecl | |
8056 && (attr = lookup_attribute ("error", | |
8057 DECL_ATTRIBUTES (fndecl))) != NULL) | |
8058 error ("%Kcall to %qs declared with attribute error: %s", | |
8059 exp, lang_hooks.decl_printable_name (fndecl, 1), | |
8060 TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr)))); | |
8061 if (fndecl | |
8062 && (attr = lookup_attribute ("warning", | |
8063 DECL_ATTRIBUTES (fndecl))) != NULL) | |
8064 warning_at (tree_nonartificial_location (exp), | |
8065 0, "%Kcall to %qs declared with attribute warning: %s", | |
8066 exp, lang_hooks.decl_printable_name (fndecl, 1), | |
8067 TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr)))); | |
8068 | |
8069 /* Check for a built-in function. */ | |
8070 if (fndecl && DECL_BUILT_IN (fndecl)) | |
8071 { | |
8072 if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_FRONTEND) | |
8073 return lang_hooks.expand_expr (exp, original_target, | |
8074 tmode, modifier, alt_rtl); | |
8075 else | |
8076 return expand_builtin (exp, target, subtarget, tmode, ignore); | |
8077 } | |
8078 } | |
8079 return expand_call (exp, target, ignore); | |
8080 | |
8081 case PAREN_EXPR: | |
8082 CASE_CONVERT: | |
8083 if (TREE_OPERAND (exp, 0) == error_mark_node) | |
8084 return const0_rtx; | |
8085 | |
8086 if (TREE_CODE (type) == UNION_TYPE) | |
8087 { | |
8088 tree valtype = TREE_TYPE (TREE_OPERAND (exp, 0)); | |
8089 | |
8090 /* If both input and output are BLKmode, this conversion isn't doing | |
8091 anything except possibly changing memory attribute. */ | |
8092 if (mode == BLKmode && TYPE_MODE (valtype) == BLKmode) | |
8093 { | |
8094 rtx result = expand_expr (TREE_OPERAND (exp, 0), target, tmode, | |
8095 modifier); | |
8096 | |
8097 result = copy_rtx (result); | |
8098 set_mem_attributes (result, exp, 0); | |
8099 return result; | |
8100 } | |
8101 | |
8102 if (target == 0) | |
8103 { | |
8104 if (TYPE_MODE (type) != BLKmode) | |
8105 target = gen_reg_rtx (TYPE_MODE (type)); | |
8106 else | |
8107 target = assign_temp (type, 0, 1, 1); | |
8108 } | |
8109 | |
8110 if (MEM_P (target)) | |
8111 /* Store data into beginning of memory target. */ | |
8112 store_expr (TREE_OPERAND (exp, 0), | |
8113 adjust_address (target, TYPE_MODE (valtype), 0), | |
8114 modifier == EXPAND_STACK_PARM, | |
8115 false); | |
8116 | |
8117 else | |
8118 { | |
8119 gcc_assert (REG_P (target)); | |
8120 | |
8121 /* Store this field into a union of the proper type. */ | |
8122 store_field (target, | |
8123 MIN ((int_size_in_bytes (TREE_TYPE | |
8124 (TREE_OPERAND (exp, 0))) | |
8125 * BITS_PER_UNIT), | |
8126 (HOST_WIDE_INT) GET_MODE_BITSIZE (mode)), | |
8127 0, TYPE_MODE (valtype), TREE_OPERAND (exp, 0), | |
8128 type, 0, false); | |
8129 } | |
8130 | |
8131 /* Return the entire union. */ | |
8132 return target; | |
8133 } | |
8134 | |
8135 if (mode == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))) | |
8136 { | |
8137 op0 = expand_expr (TREE_OPERAND (exp, 0), target, VOIDmode, | |
8138 modifier); | |
8139 | |
8140 /* If the signedness of the conversion differs and OP0 is | |
8141 a promoted SUBREG, clear that indication since we now | |
8142 have to do the proper extension. */ | |
8143 if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))) != unsignedp | |
8144 && GET_CODE (op0) == SUBREG) | |
8145 SUBREG_PROMOTED_VAR_P (op0) = 0; | |
8146 | |
8147 return REDUCE_BIT_FIELD (op0); | |
8148 } | |
8149 | |
8150 op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode, | |
8151 modifier == EXPAND_SUM ? EXPAND_NORMAL : modifier); | |
8152 if (GET_MODE (op0) == mode) | |
8153 ; | |
8154 | |
8155 /* If OP0 is a constant, just convert it into the proper mode. */ | |
8156 else if (CONSTANT_P (op0)) | |
8157 { | |
8158 tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0)); | |
8159 enum machine_mode inner_mode = TYPE_MODE (inner_type); | |
8160 | |
8161 if (modifier == EXPAND_INITIALIZER) | |
8162 op0 = simplify_gen_subreg (mode, op0, inner_mode, | |
8163 subreg_lowpart_offset (mode, | |
8164 inner_mode)); | |
8165 else | |
8166 op0= convert_modes (mode, inner_mode, op0, | |
8167 TYPE_UNSIGNED (inner_type)); | |
8168 } | |
8169 | |
8170 else if (modifier == EXPAND_INITIALIZER) | |
8171 op0 = gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND, mode, op0); | |
8172 | |
8173 else if (target == 0) | |
8174 op0 = convert_to_mode (mode, op0, | |
8175 TYPE_UNSIGNED (TREE_TYPE | |
8176 (TREE_OPERAND (exp, 0)))); | |
8177 else | |
8178 { | |
8179 convert_move (target, op0, | |
8180 TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))); | |
8181 op0 = target; | |
8182 } | |
8183 | |
8184 return REDUCE_BIT_FIELD (op0); | |
8185 | |
8186 case VIEW_CONVERT_EXPR: | |
8187 op0 = NULL_RTX; | |
8188 | |
8189 /* If we are converting to BLKmode, try to avoid an intermediate | |
8190 temporary by fetching an inner memory reference. */ | |
8191 if (mode == BLKmode | |
8192 && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST | |
8193 && TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))) != BLKmode | |
8194 && handled_component_p (TREE_OPERAND (exp, 0))) | |
8195 { | |
8196 enum machine_mode mode1; | |
8197 HOST_WIDE_INT bitsize, bitpos; | |
8198 tree offset; | |
8199 int unsignedp; | |
8200 int volatilep = 0; | |
8201 tree tem | |
8202 = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, &bitpos, | |
8203 &offset, &mode1, &unsignedp, &volatilep, | |
8204 true); | |
8205 rtx orig_op0; | |
8206 | |
8207 /* ??? We should work harder and deal with non-zero offsets. */ | |
8208 if (!offset | |
8209 && (bitpos % BITS_PER_UNIT) == 0 | |
8210 && bitsize >= 0 | |
8211 && compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)), bitsize) == 0) | |
8212 { | |
8213 /* See the normal_inner_ref case for the rationale. */ | |
8214 orig_op0 | |
8215 = expand_expr (tem, | |
8216 (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE | |
8217 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem))) | |
8218 != INTEGER_CST) | |
8219 && modifier != EXPAND_STACK_PARM | |
8220 ? target : NULL_RTX), | |
8221 VOIDmode, | |
8222 (modifier == EXPAND_INITIALIZER | |
8223 || modifier == EXPAND_CONST_ADDRESS | |
8224 || modifier == EXPAND_STACK_PARM) | |
8225 ? modifier : EXPAND_NORMAL); | |
8226 | |
8227 if (MEM_P (orig_op0)) | |
8228 { | |
8229 op0 = orig_op0; | |
8230 | |
8231 /* Get a reference to just this component. */ | |
8232 if (modifier == EXPAND_CONST_ADDRESS | |
8233 || modifier == EXPAND_SUM | |
8234 || modifier == EXPAND_INITIALIZER) | |
8235 op0 = adjust_address_nv (op0, mode, bitpos / BITS_PER_UNIT); | |
8236 else | |
8237 op0 = adjust_address (op0, mode, bitpos / BITS_PER_UNIT); | |
8238 | |
8239 if (op0 == orig_op0) | |
8240 op0 = copy_rtx (op0); | |
8241 | |
8242 set_mem_attributes (op0, TREE_OPERAND (exp, 0), 0); | |
8243 if (REG_P (XEXP (op0, 0))) | |
8244 mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0)); | |
8245 | |
8246 MEM_VOLATILE_P (op0) |= volatilep; | |
8247 } | |
8248 } | |
8249 } | |
8250 | |
8251 if (!op0) | |
8252 op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode, modifier); | |
8253 | |
8254 /* If the input and output modes are both the same, we are done. */ | |
8255 if (mode == GET_MODE (op0)) | |
8256 ; | |
8257 /* If neither mode is BLKmode, and both modes are the same size | |
8258 then we can use gen_lowpart. */ | |
8259 else if (mode != BLKmode && GET_MODE (op0) != BLKmode | |
8260 && GET_MODE_SIZE (mode) == GET_MODE_SIZE (GET_MODE (op0))) | |
8261 { | |
8262 if (GET_CODE (op0) == SUBREG) | |
8263 op0 = force_reg (GET_MODE (op0), op0); | |
8264 op0 = gen_lowpart (mode, op0); | |
8265 } | |
8266 /* If both modes are integral, then we can convert from one to the | |
8267 other. */ | |
8268 else if (SCALAR_INT_MODE_P (GET_MODE (op0)) && SCALAR_INT_MODE_P (mode)) | |
8269 op0 = convert_modes (mode, GET_MODE (op0), op0, | |
8270 TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))); | |
8271 /* As a last resort, spill op0 to memory, and reload it in a | |
8272 different mode. */ | |
8273 else if (!MEM_P (op0)) | |
8274 { | |
8275 /* If the operand is not a MEM, force it into memory. Since we | |
8276 are going to be changing the mode of the MEM, don't call | |
8277 force_const_mem for constants because we don't allow pool | |
8278 constants to change mode. */ | |
8279 tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0)); | |
8280 | |
8281 gcc_assert (!TREE_ADDRESSABLE (exp)); | |
8282 | |
8283 if (target == 0 || GET_MODE (target) != TYPE_MODE (inner_type)) | |
8284 target | |
8285 = assign_stack_temp_for_type | |
8286 (TYPE_MODE (inner_type), | |
8287 GET_MODE_SIZE (TYPE_MODE (inner_type)), 0, inner_type); | |
8288 | |
8289 emit_move_insn (target, op0); | |
8290 op0 = target; | |
8291 } | |
8292 | |
8293 /* At this point, OP0 is in the correct mode. If the output type is | |
8294 such that the operand is known to be aligned, indicate that it is. | |
8295 Otherwise, we need only be concerned about alignment for non-BLKmode | |
8296 results. */ | |
8297 if (MEM_P (op0)) | |
8298 { | |
8299 op0 = copy_rtx (op0); | |
8300 | |
8301 if (TYPE_ALIGN_OK (type)) | |
8302 set_mem_align (op0, MAX (MEM_ALIGN (op0), TYPE_ALIGN (type))); | |
8303 else if (STRICT_ALIGNMENT | |
8304 && mode != BLKmode | |
8305 && MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode)) | |
8306 { | |
8307 tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0)); | |
8308 HOST_WIDE_INT temp_size | |
8309 = MAX (int_size_in_bytes (inner_type), | |
8310 (HOST_WIDE_INT) GET_MODE_SIZE (mode)); | |
8311 rtx new_rtx | |
8312 = assign_stack_temp_for_type (mode, temp_size, 0, type); | |
8313 rtx new_with_op0_mode | |
8314 = adjust_address (new_rtx, GET_MODE (op0), 0); | |
8315 | |
8316 gcc_assert (!TREE_ADDRESSABLE (exp)); | |
8317 | |
8318 if (GET_MODE (op0) == BLKmode) | |
8319 emit_block_move (new_with_op0_mode, op0, | |
8320 GEN_INT (GET_MODE_SIZE (mode)), | |
8321 (modifier == EXPAND_STACK_PARM | |
8322 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL)); | |
8323 else | |
8324 emit_move_insn (new_with_op0_mode, op0); | |
8325 | |
8326 op0 = new_rtx; | |
8327 } | |
8328 | |
8329 op0 = adjust_address (op0, mode, 0); | |
8330 } | |
8331 | |
8332 return op0; | |
8333 | |
8334 case POINTER_PLUS_EXPR: | |
8335 /* Even though the sizetype mode and the pointer's mode can be different | |
8336 expand is able to handle this correctly and get the correct result out | |
8337 of the PLUS_EXPR code. */ | |
8338 /* Make sure to sign-extend the sizetype offset in a POINTER_PLUS_EXPR | |
8339 if sizetype precision is smaller than pointer precision. */ | |
8340 if (TYPE_PRECISION (sizetype) < TYPE_PRECISION (type)) | |
8341 exp = build2 (PLUS_EXPR, type, | |
8342 TREE_OPERAND (exp, 0), | |
8343 fold_convert (type, | |
8344 fold_convert (ssizetype, | |
8345 TREE_OPERAND (exp, 1)))); | |
8346 case PLUS_EXPR: | |
8347 | |
8348 /* Check if this is a case for multiplication and addition. */ | |
8349 if ((TREE_CODE (type) == INTEGER_TYPE | |
8350 || TREE_CODE (type) == FIXED_POINT_TYPE) | |
8351 && TREE_CODE (TREE_OPERAND (exp, 0)) == MULT_EXPR) | |
8352 { | |
8353 tree subsubexp0, subsubexp1; | |
8354 enum tree_code code0, code1, this_code; | |
8355 | |
8356 subexp0 = TREE_OPERAND (exp, 0); | |
8357 subsubexp0 = TREE_OPERAND (subexp0, 0); | |
8358 subsubexp1 = TREE_OPERAND (subexp0, 1); | |
8359 code0 = TREE_CODE (subsubexp0); | |
8360 code1 = TREE_CODE (subsubexp1); | |
8361 this_code = TREE_CODE (type) == INTEGER_TYPE ? NOP_EXPR | |
8362 : FIXED_CONVERT_EXPR; | |
8363 if (code0 == this_code && code1 == this_code | |
8364 && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (subsubexp0, 0))) | |
8365 < TYPE_PRECISION (TREE_TYPE (subsubexp0))) | |
8366 && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (subsubexp0, 0))) | |
8367 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (subsubexp1, 0)))) | |
8368 && (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (subsubexp0, 0))) | |
8369 == TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (subsubexp1, 0))))) | |
8370 { | |
8371 tree op0type = TREE_TYPE (TREE_OPERAND (subsubexp0, 0)); | |
8372 enum machine_mode innermode = TYPE_MODE (op0type); | |
8373 bool zextend_p = TYPE_UNSIGNED (op0type); | |
8374 bool sat_p = TYPE_SATURATING (TREE_TYPE (subsubexp0)); | |
8375 if (sat_p == 0) | |
8376 this_optab = zextend_p ? umadd_widen_optab : smadd_widen_optab; | |
8377 else | |
8378 this_optab = zextend_p ? usmadd_widen_optab | |
8379 : ssmadd_widen_optab; | |
8380 if (mode == GET_MODE_2XWIDER_MODE (innermode) | |
8381 && (optab_handler (this_optab, mode)->insn_code | |
8382 != CODE_FOR_nothing)) | |
8383 { | |
8384 expand_operands (TREE_OPERAND (subsubexp0, 0), | |
8385 TREE_OPERAND (subsubexp1, 0), | |
8386 NULL_RTX, &op0, &op1, EXPAND_NORMAL); | |
8387 op2 = expand_expr (TREE_OPERAND (exp, 1), subtarget, | |
8388 VOIDmode, EXPAND_NORMAL); | |
8389 temp = expand_ternary_op (mode, this_optab, op0, op1, op2, | |
8390 target, unsignedp); | |
8391 gcc_assert (temp); | |
8392 return REDUCE_BIT_FIELD (temp); | |
8393 } | |
8394 } | |
8395 } | |
8396 | |
8397 /* If we are adding a constant, a VAR_DECL that is sp, fp, or ap, and | |
8398 something else, make sure we add the register to the constant and | |
8399 then to the other thing. This case can occur during strength | |
8400 reduction and doing it this way will produce better code if the | |
8401 frame pointer or argument pointer is eliminated. | |
8402 | |
8403 fold-const.c will ensure that the constant is always in the inner | |
8404 PLUS_EXPR, so the only case we need to do anything about is if | |
8405 sp, ap, or fp is our second argument, in which case we must swap | |
8406 the innermost first argument and our second argument. */ | |
8407 | |
8408 if (TREE_CODE (TREE_OPERAND (exp, 0)) == PLUS_EXPR | |
8409 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 1)) == INTEGER_CST | |
8410 && TREE_CODE (TREE_OPERAND (exp, 1)) == VAR_DECL | |
8411 && (DECL_RTL (TREE_OPERAND (exp, 1)) == frame_pointer_rtx | |
8412 || DECL_RTL (TREE_OPERAND (exp, 1)) == stack_pointer_rtx | |
8413 || DECL_RTL (TREE_OPERAND (exp, 1)) == arg_pointer_rtx)) | |
8414 { | |
8415 tree t = TREE_OPERAND (exp, 1); | |
8416 | |
8417 TREE_OPERAND (exp, 1) = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); | |
8418 TREE_OPERAND (TREE_OPERAND (exp, 0), 0) = t; | |
8419 } | |
8420 | |
8421 /* If the result is to be ptr_mode and we are adding an integer to | |
8422 something, we might be forming a constant. So try to use | |
8423 plus_constant. If it produces a sum and we can't accept it, | |
8424 use force_operand. This allows P = &ARR[const] to generate | |
8425 efficient code on machines where a SYMBOL_REF is not a valid | |
8426 address. | |
8427 | |
8428 If this is an EXPAND_SUM call, always return the sum. */ | |
8429 if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER | |
8430 || (mode == ptr_mode && (unsignedp || ! flag_trapv))) | |
8431 { | |
8432 if (modifier == EXPAND_STACK_PARM) | |
8433 target = 0; | |
8434 if (TREE_CODE (TREE_OPERAND (exp, 0)) == INTEGER_CST | |
8435 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT | |
8436 && TREE_CONSTANT (TREE_OPERAND (exp, 1))) | |
8437 { | |
8438 rtx constant_part; | |
8439 | |
8440 op1 = expand_expr (TREE_OPERAND (exp, 1), subtarget, VOIDmode, | |
8441 EXPAND_SUM); | |
8442 /* Use immed_double_const to ensure that the constant is | |
8443 truncated according to the mode of OP1, then sign extended | |
8444 to a HOST_WIDE_INT. Using the constant directly can result | |
8445 in non-canonical RTL in a 64x32 cross compile. */ | |
8446 constant_part | |
8447 = immed_double_const (TREE_INT_CST_LOW (TREE_OPERAND (exp, 0)), | |
8448 (HOST_WIDE_INT) 0, | |
8449 TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 1)))); | |
8450 op1 = plus_constant (op1, INTVAL (constant_part)); | |
8451 if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER) | |
8452 op1 = force_operand (op1, target); | |
8453 return REDUCE_BIT_FIELD (op1); | |
8454 } | |
8455 | |
8456 else if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST | |
8457 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT | |
8458 && TREE_CONSTANT (TREE_OPERAND (exp, 0))) | |
8459 { | |
8460 rtx constant_part; | |
8461 | |
8462 op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, | |
8463 (modifier == EXPAND_INITIALIZER | |
8464 ? EXPAND_INITIALIZER : EXPAND_SUM)); | |
8465 if (! CONSTANT_P (op0)) | |
8466 { | |
8467 op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, | |
8468 VOIDmode, modifier); | |
8469 /* Return a PLUS if modifier says it's OK. */ | |
8470 if (modifier == EXPAND_SUM | |
8471 || modifier == EXPAND_INITIALIZER) | |
8472 return simplify_gen_binary (PLUS, mode, op0, op1); | |
8473 goto binop2; | |
8474 } | |
8475 /* Use immed_double_const to ensure that the constant is | |
8476 truncated according to the mode of OP1, then sign extended | |
8477 to a HOST_WIDE_INT. Using the constant directly can result | |
8478 in non-canonical RTL in a 64x32 cross compile. */ | |
8479 constant_part | |
8480 = immed_double_const (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1)), | |
8481 (HOST_WIDE_INT) 0, | |
8482 TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))); | |
8483 op0 = plus_constant (op0, INTVAL (constant_part)); | |
8484 if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER) | |
8485 op0 = force_operand (op0, target); | |
8486 return REDUCE_BIT_FIELD (op0); | |
8487 } | |
8488 } | |
8489 | |
8490 /* No sense saving up arithmetic to be done | |
8491 if it's all in the wrong mode to form part of an address. | |
8492 And force_operand won't know whether to sign-extend or | |
8493 zero-extend. */ | |
8494 if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER) | |
8495 || mode != ptr_mode) | |
8496 { | |
8497 expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1), | |
8498 subtarget, &op0, &op1, 0); | |
8499 if (op0 == const0_rtx) | |
8500 return op1; | |
8501 if (op1 == const0_rtx) | |
8502 return op0; | |
8503 goto binop2; | |
8504 } | |
8505 | |
8506 expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1), | |
8507 subtarget, &op0, &op1, modifier); | |
8508 return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1)); | |
8509 | |
8510 case MINUS_EXPR: | |
8511 /* Check if this is a case for multiplication and subtraction. */ | |
8512 if ((TREE_CODE (type) == INTEGER_TYPE | |
8513 || TREE_CODE (type) == FIXED_POINT_TYPE) | |
8514 && TREE_CODE (TREE_OPERAND (exp, 1)) == MULT_EXPR) | |
8515 { | |
8516 tree subsubexp0, subsubexp1; | |
8517 enum tree_code code0, code1, this_code; | |
8518 | |
8519 subexp1 = TREE_OPERAND (exp, 1); | |
8520 subsubexp0 = TREE_OPERAND (subexp1, 0); | |
8521 subsubexp1 = TREE_OPERAND (subexp1, 1); | |
8522 code0 = TREE_CODE (subsubexp0); | |
8523 code1 = TREE_CODE (subsubexp1); | |
8524 this_code = TREE_CODE (type) == INTEGER_TYPE ? NOP_EXPR | |
8525 : FIXED_CONVERT_EXPR; | |
8526 if (code0 == this_code && code1 == this_code | |
8527 && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (subsubexp0, 0))) | |
8528 < TYPE_PRECISION (TREE_TYPE (subsubexp0))) | |
8529 && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (subsubexp0, 0))) | |
8530 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (subsubexp1, 0)))) | |
8531 && (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (subsubexp0, 0))) | |
8532 == TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (subsubexp1, 0))))) | |
8533 { | |
8534 tree op0type = TREE_TYPE (TREE_OPERAND (subsubexp0, 0)); | |
8535 enum machine_mode innermode = TYPE_MODE (op0type); | |
8536 bool zextend_p = TYPE_UNSIGNED (op0type); | |
8537 bool sat_p = TYPE_SATURATING (TREE_TYPE (subsubexp0)); | |
8538 if (sat_p == 0) | |
8539 this_optab = zextend_p ? umsub_widen_optab : smsub_widen_optab; | |
8540 else | |
8541 this_optab = zextend_p ? usmsub_widen_optab | |
8542 : ssmsub_widen_optab; | |
8543 if (mode == GET_MODE_2XWIDER_MODE (innermode) | |
8544 && (optab_handler (this_optab, mode)->insn_code | |
8545 != CODE_FOR_nothing)) | |
8546 { | |
8547 expand_operands (TREE_OPERAND (subsubexp0, 0), | |
8548 TREE_OPERAND (subsubexp1, 0), | |
8549 NULL_RTX, &op0, &op1, EXPAND_NORMAL); | |
8550 op2 = expand_expr (TREE_OPERAND (exp, 0), subtarget, | |
8551 VOIDmode, EXPAND_NORMAL); | |
8552 temp = expand_ternary_op (mode, this_optab, op0, op1, op2, | |
8553 target, unsignedp); | |
8554 gcc_assert (temp); | |
8555 return REDUCE_BIT_FIELD (temp); | |
8556 } | |
8557 } | |
8558 } | |
8559 | |
8560 /* For initializers, we are allowed to return a MINUS of two | |
8561 symbolic constants. Here we handle all cases when both operands | |
8562 are constant. */ | |
8563 /* Handle difference of two symbolic constants, | |
8564 for the sake of an initializer. */ | |
8565 if ((modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER) | |
8566 && really_constant_p (TREE_OPERAND (exp, 0)) | |
8567 && really_constant_p (TREE_OPERAND (exp, 1))) | |
8568 { | |
8569 expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1), | |
8570 NULL_RTX, &op0, &op1, modifier); | |
8571 | |
8572 /* If the last operand is a CONST_INT, use plus_constant of | |
8573 the negated constant. Else make the MINUS. */ | |
8574 if (GET_CODE (op1) == CONST_INT) | |
8575 return REDUCE_BIT_FIELD (plus_constant (op0, - INTVAL (op1))); | |
8576 else | |
8577 return REDUCE_BIT_FIELD (gen_rtx_MINUS (mode, op0, op1)); | |
8578 } | |
8579 | |
8580 /* No sense saving up arithmetic to be done | |
8581 if it's all in the wrong mode to form part of an address. | |
8582 And force_operand won't know whether to sign-extend or | |
8583 zero-extend. */ | |
8584 if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER) | |
8585 || mode != ptr_mode) | |
8586 goto binop; | |
8587 | |
8588 expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1), | |
8589 subtarget, &op0, &op1, modifier); | |
8590 | |
8591 /* Convert A - const to A + (-const). */ | |
8592 if (GET_CODE (op1) == CONST_INT) | |
8593 { | |
8594 op1 = negate_rtx (mode, op1); | |
8595 return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1)); | |
8596 } | |
8597 | |
8598 goto binop2; | |
8599 | |
8600 case MULT_EXPR: | |
8601 /* If this is a fixed-point operation, then we cannot use the code | |
8602 below because "expand_mult" doesn't support sat/no-sat fixed-point | |
8603 multiplications. */ | |
8604 if (ALL_FIXED_POINT_MODE_P (mode)) | |
8605 goto binop; | |
8606 | |
8607 /* If first operand is constant, swap them. | |
8608 Thus the following special case checks need only | |
8609 check the second operand. */ | |
8610 if (TREE_CODE (TREE_OPERAND (exp, 0)) == INTEGER_CST) | |
8611 { | |
8612 tree t1 = TREE_OPERAND (exp, 0); | |
8613 TREE_OPERAND (exp, 0) = TREE_OPERAND (exp, 1); | |
8614 TREE_OPERAND (exp, 1) = t1; | |
8615 } | |
8616 | |
8617 /* Attempt to return something suitable for generating an | |
8618 indexed address, for machines that support that. */ | |
8619 | |
8620 if (modifier == EXPAND_SUM && mode == ptr_mode | |
8621 && host_integerp (TREE_OPERAND (exp, 1), 0)) | |
8622 { | |
8623 tree exp1 = TREE_OPERAND (exp, 1); | |
8624 | |
8625 op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, | |
8626 EXPAND_SUM); | |
8627 | |
8628 if (!REG_P (op0)) | |
8629 op0 = force_operand (op0, NULL_RTX); | |
8630 if (!REG_P (op0)) | |
8631 op0 = copy_to_mode_reg (mode, op0); | |
8632 | |
8633 return REDUCE_BIT_FIELD (gen_rtx_MULT (mode, op0, | |
8634 gen_int_mode (tree_low_cst (exp1, 0), | |
8635 TYPE_MODE (TREE_TYPE (exp1))))); | |
8636 } | |
8637 | |
8638 if (modifier == EXPAND_STACK_PARM) | |
8639 target = 0; | |
8640 | |
8641 /* Check for multiplying things that have been extended | |
8642 from a narrower type. If this machine supports multiplying | |
8643 in that narrower type with a result in the desired type, | |
8644 do it that way, and avoid the explicit type-conversion. */ | |
8645 | |
8646 subexp0 = TREE_OPERAND (exp, 0); | |
8647 subexp1 = TREE_OPERAND (exp, 1); | |
8648 /* First, check if we have a multiplication of one signed and one | |
8649 unsigned operand. */ | |
8650 if (TREE_CODE (subexp0) == NOP_EXPR | |
8651 && TREE_CODE (subexp1) == NOP_EXPR | |
8652 && TREE_CODE (type) == INTEGER_TYPE | |
8653 && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (subexp0, 0))) | |
8654 < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0)))) | |
8655 && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (subexp0, 0))) | |
8656 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (subexp1, 0)))) | |
8657 && (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (subexp0, 0))) | |
8658 != TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (subexp1, 0))))) | |
8659 { | |
8660 enum machine_mode innermode | |
8661 = TYPE_MODE (TREE_TYPE (TREE_OPERAND (subexp0, 0))); | |
8662 this_optab = usmul_widen_optab; | |
8663 if (mode == GET_MODE_WIDER_MODE (innermode)) | |
8664 { | |
8665 if (optab_handler (this_optab, mode)->insn_code != CODE_FOR_nothing) | |
8666 { | |
8667 if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (subexp0, 0)))) | |
8668 expand_operands (TREE_OPERAND (subexp0, 0), | |
8669 TREE_OPERAND (subexp1, 0), | |
8670 NULL_RTX, &op0, &op1, 0); | |
8671 else | |
8672 expand_operands (TREE_OPERAND (subexp0, 0), | |
8673 TREE_OPERAND (subexp1, 0), | |
8674 NULL_RTX, &op1, &op0, 0); | |
8675 | |
8676 goto binop3; | |
8677 } | |
8678 } | |
8679 } | |
8680 /* Check for a multiplication with matching signedness. */ | |
8681 else if (TREE_CODE (TREE_OPERAND (exp, 0)) == NOP_EXPR | |
8682 && TREE_CODE (type) == INTEGER_TYPE | |
8683 && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))) | |
8684 < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0)))) | |
8685 && ((TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST | |
8686 && int_fits_type_p (TREE_OPERAND (exp, 1), | |
8687 TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))) | |
8688 /* Don't use a widening multiply if a shift will do. */ | |
8689 && ((GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 1)))) | |
8690 > HOST_BITS_PER_WIDE_INT) | |
8691 || exact_log2 (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1))) < 0)) | |
8692 || | |
8693 (TREE_CODE (TREE_OPERAND (exp, 1)) == NOP_EXPR | |
8694 && (TYPE_PRECISION (TREE_TYPE | |
8695 (TREE_OPERAND (TREE_OPERAND (exp, 1), 0))) | |
8696 == TYPE_PRECISION (TREE_TYPE | |
8697 (TREE_OPERAND | |
8698 (TREE_OPERAND (exp, 0), 0)))) | |
8699 /* If both operands are extended, they must either both | |
8700 be zero-extended or both be sign-extended. */ | |
8701 && (TYPE_UNSIGNED (TREE_TYPE | |
8702 (TREE_OPERAND (TREE_OPERAND (exp, 1), 0))) | |
8703 == TYPE_UNSIGNED (TREE_TYPE | |
8704 (TREE_OPERAND | |
8705 (TREE_OPERAND (exp, 0), 0))))))) | |
8706 { | |
8707 tree op0type = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)); | |
8708 enum machine_mode innermode = TYPE_MODE (op0type); | |
8709 bool zextend_p = TYPE_UNSIGNED (op0type); | |
8710 optab other_optab = zextend_p ? smul_widen_optab : umul_widen_optab; | |
8711 this_optab = zextend_p ? umul_widen_optab : smul_widen_optab; | |
8712 | |
8713 if (mode == GET_MODE_2XWIDER_MODE (innermode)) | |
8714 { | |
8715 if (optab_handler (this_optab, mode)->insn_code != CODE_FOR_nothing) | |
8716 { | |
8717 if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST) | |
8718 expand_operands (TREE_OPERAND (TREE_OPERAND (exp, 0), 0), | |
8719 TREE_OPERAND (exp, 1), | |
8720 NULL_RTX, &op0, &op1, EXPAND_NORMAL); | |
8721 else | |
8722 expand_operands (TREE_OPERAND (TREE_OPERAND (exp, 0), 0), | |
8723 TREE_OPERAND (TREE_OPERAND (exp, 1), 0), | |
8724 NULL_RTX, &op0, &op1, EXPAND_NORMAL); | |
8725 goto binop3; | |
8726 } | |
8727 else if (optab_handler (other_optab, mode)->insn_code != CODE_FOR_nothing | |
8728 && innermode == word_mode) | |
8729 { | |
8730 rtx htem, hipart; | |
8731 op0 = expand_normal (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)); | |
8732 if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST) | |
8733 op1 = convert_modes (innermode, mode, | |
8734 expand_normal (TREE_OPERAND (exp, 1)), | |
8735 unsignedp); | |
8736 else | |
8737 op1 = expand_normal (TREE_OPERAND (TREE_OPERAND (exp, 1), 0)); | |
8738 temp = expand_binop (mode, other_optab, op0, op1, target, | |
8739 unsignedp, OPTAB_LIB_WIDEN); | |
8740 hipart = gen_highpart (innermode, temp); | |
8741 htem = expand_mult_highpart_adjust (innermode, hipart, | |
8742 op0, op1, hipart, | |
8743 zextend_p); | |
8744 if (htem != hipart) | |
8745 emit_move_insn (hipart, htem); | |
8746 return REDUCE_BIT_FIELD (temp); | |
8747 } | |
8748 } | |
8749 } | |
8750 expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1), | |
8751 subtarget, &op0, &op1, 0); | |
8752 return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1, target, unsignedp)); | |
8753 | |
8754 case TRUNC_DIV_EXPR: | |
8755 case FLOOR_DIV_EXPR: | |
8756 case CEIL_DIV_EXPR: | |
8757 case ROUND_DIV_EXPR: | |
8758 case EXACT_DIV_EXPR: | |
8759 /* If this is a fixed-point operation, then we cannot use the code | |
8760 below because "expand_divmod" doesn't support sat/no-sat fixed-point | |
8761 divisions. */ | |
8762 if (ALL_FIXED_POINT_MODE_P (mode)) | |
8763 goto binop; | |
8764 | |
8765 if (modifier == EXPAND_STACK_PARM) | |
8766 target = 0; | |
8767 /* Possible optimization: compute the dividend with EXPAND_SUM | |
8768 then if the divisor is constant can optimize the case | |
8769 where some terms of the dividend have coeffs divisible by it. */ | |
8770 expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1), | |
8771 subtarget, &op0, &op1, 0); | |
8772 return expand_divmod (0, code, mode, op0, op1, target, unsignedp); | |
8773 | |
8774 case RDIV_EXPR: | |
8775 goto binop; | |
8776 | |
8777 case TRUNC_MOD_EXPR: | |
8778 case FLOOR_MOD_EXPR: | |
8779 case CEIL_MOD_EXPR: | |
8780 case ROUND_MOD_EXPR: | |
8781 if (modifier == EXPAND_STACK_PARM) | |
8782 target = 0; | |
8783 expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1), | |
8784 subtarget, &op0, &op1, 0); | |
8785 return expand_divmod (1, code, mode, op0, op1, target, unsignedp); | |
8786 | |
8787 case FIXED_CONVERT_EXPR: | |
8788 op0 = expand_normal (TREE_OPERAND (exp, 0)); | |
8789 if (target == 0 || modifier == EXPAND_STACK_PARM) | |
8790 target = gen_reg_rtx (mode); | |
8791 | |
8792 if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == INTEGER_TYPE | |
8793 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))) | |
8794 || (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type))) | |
8795 expand_fixed_convert (target, op0, 1, TYPE_SATURATING (type)); | |
8796 else | |
8797 expand_fixed_convert (target, op0, 0, TYPE_SATURATING (type)); | |
8798 return target; | |
8799 | |
8800 case FIX_TRUNC_EXPR: | |
8801 op0 = expand_normal (TREE_OPERAND (exp, 0)); | |
8802 if (target == 0 || modifier == EXPAND_STACK_PARM) | |
8803 target = gen_reg_rtx (mode); | |
8804 expand_fix (target, op0, unsignedp); | |
8805 return target; | |
8806 | |
8807 case FLOAT_EXPR: | |
8808 op0 = expand_normal (TREE_OPERAND (exp, 0)); | |
8809 if (target == 0 || modifier == EXPAND_STACK_PARM) | |
8810 target = gen_reg_rtx (mode); | |
8811 /* expand_float can't figure out what to do if FROM has VOIDmode. | |
8812 So give it the correct mode. With -O, cse will optimize this. */ | |
8813 if (GET_MODE (op0) == VOIDmode) | |
8814 op0 = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))), | |
8815 op0); | |
8816 expand_float (target, op0, | |
8817 TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))); | |
8818 return target; | |
8819 | |
8820 case NEGATE_EXPR: | |
8821 op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, | |
8822 VOIDmode, EXPAND_NORMAL); | |
8823 if (modifier == EXPAND_STACK_PARM) | |
8824 target = 0; | |
8825 temp = expand_unop (mode, | |
8826 optab_for_tree_code (NEGATE_EXPR, type, | |
8827 optab_default), | |
8828 op0, target, 0); | |
8829 gcc_assert (temp); | |
8830 return REDUCE_BIT_FIELD (temp); | |
8831 | |
8832 case ABS_EXPR: | |
8833 op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, | |
8834 VOIDmode, EXPAND_NORMAL); | |
8835 if (modifier == EXPAND_STACK_PARM) | |
8836 target = 0; | |
8837 | |
8838 /* ABS_EXPR is not valid for complex arguments. */ | |
8839 gcc_assert (GET_MODE_CLASS (mode) != MODE_COMPLEX_INT | |
8840 && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT); | |
8841 | |
8842 /* Unsigned abs is simply the operand. Testing here means we don't | |
8843 risk generating incorrect code below. */ | |
8844 if (TYPE_UNSIGNED (type)) | |
8845 return op0; | |
8846 | |
8847 return expand_abs (mode, op0, target, unsignedp, | |
8848 safe_from_p (target, TREE_OPERAND (exp, 0), 1)); | |
8849 | |
8850 case MAX_EXPR: | |
8851 case MIN_EXPR: | |
8852 target = original_target; | |
8853 if (target == 0 | |
8854 || modifier == EXPAND_STACK_PARM | |
8855 || (MEM_P (target) && MEM_VOLATILE_P (target)) | |
8856 || GET_MODE (target) != mode | |
8857 || (REG_P (target) | |
8858 && REGNO (target) < FIRST_PSEUDO_REGISTER)) | |
8859 target = gen_reg_rtx (mode); | |
8860 expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1), | |
8861 target, &op0, &op1, 0); | |
8862 | |
8863 /* First try to do it with a special MIN or MAX instruction. | |
8864 If that does not win, use a conditional jump to select the proper | |
8865 value. */ | |
8866 this_optab = optab_for_tree_code (code, type, optab_default); | |
8867 temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp, | |
8868 OPTAB_WIDEN); | |
8869 if (temp != 0) | |
8870 return temp; | |
8871 | |
8872 /* At this point, a MEM target is no longer useful; we will get better | |
8873 code without it. */ | |
8874 | |
8875 if (! REG_P (target)) | |
8876 target = gen_reg_rtx (mode); | |
8877 | |
8878 /* If op1 was placed in target, swap op0 and op1. */ | |
8879 if (target != op0 && target == op1) | |
8880 { | |
8881 temp = op0; | |
8882 op0 = op1; | |
8883 op1 = temp; | |
8884 } | |
8885 | |
8886 /* We generate better code and avoid problems with op1 mentioning | |
8887 target by forcing op1 into a pseudo if it isn't a constant. */ | |
8888 if (! CONSTANT_P (op1)) | |
8889 op1 = force_reg (mode, op1); | |
8890 | |
8891 { | |
8892 enum rtx_code comparison_code; | |
8893 rtx cmpop1 = op1; | |
8894 | |
8895 if (code == MAX_EXPR) | |
8896 comparison_code = unsignedp ? GEU : GE; | |
8897 else | |
8898 comparison_code = unsignedp ? LEU : LE; | |
8899 | |
8900 /* Canonicalize to comparisons against 0. */ | |
8901 if (op1 == const1_rtx) | |
8902 { | |
8903 /* Converting (a >= 1 ? a : 1) into (a > 0 ? a : 1) | |
8904 or (a != 0 ? a : 1) for unsigned. | |
8905 For MIN we are safe converting (a <= 1 ? a : 1) | |
8906 into (a <= 0 ? a : 1) */ | |
8907 cmpop1 = const0_rtx; | |
8908 if (code == MAX_EXPR) | |
8909 comparison_code = unsignedp ? NE : GT; | |
8910 } | |
8911 if (op1 == constm1_rtx && !unsignedp) | |
8912 { | |
8913 /* Converting (a >= -1 ? a : -1) into (a >= 0 ? a : -1) | |
8914 and (a <= -1 ? a : -1) into (a < 0 ? a : -1) */ | |
8915 cmpop1 = const0_rtx; | |
8916 if (code == MIN_EXPR) | |
8917 comparison_code = LT; | |
8918 } | |
8919 #ifdef HAVE_conditional_move | |
8920 /* Use a conditional move if possible. */ | |
8921 if (can_conditionally_move_p (mode)) | |
8922 { | |
8923 rtx insn; | |
8924 | |
8925 /* ??? Same problem as in expmed.c: emit_conditional_move | |
8926 forces a stack adjustment via compare_from_rtx, and we | |
8927 lose the stack adjustment if the sequence we are about | |
8928 to create is discarded. */ | |
8929 do_pending_stack_adjust (); | |
8930 | |
8931 start_sequence (); | |
8932 | |
8933 /* Try to emit the conditional move. */ | |
8934 insn = emit_conditional_move (target, comparison_code, | |
8935 op0, cmpop1, mode, | |
8936 op0, op1, mode, | |
8937 unsignedp); | |
8938 | |
8939 /* If we could do the conditional move, emit the sequence, | |
8940 and return. */ | |
8941 if (insn) | |
8942 { | |
8943 rtx seq = get_insns (); | |
8944 end_sequence (); | |
8945 emit_insn (seq); | |
8946 return target; | |
8947 } | |
8948 | |
8949 /* Otherwise discard the sequence and fall back to code with | |
8950 branches. */ | |
8951 end_sequence (); | |
8952 } | |
8953 #endif | |
8954 if (target != op0) | |
8955 emit_move_insn (target, op0); | |
8956 | |
8957 temp = gen_label_rtx (); | |
8958 do_compare_rtx_and_jump (target, cmpop1, comparison_code, | |
8959 unsignedp, mode, NULL_RTX, NULL_RTX, temp); | |
8960 } | |
8961 emit_move_insn (target, op1); | |
8962 emit_label (temp); | |
8963 return target; | |
8964 | |
8965 case BIT_NOT_EXPR: | |
8966 op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, | |
8967 VOIDmode, EXPAND_NORMAL); | |
8968 if (modifier == EXPAND_STACK_PARM) | |
8969 target = 0; | |
8970 temp = expand_unop (mode, one_cmpl_optab, op0, target, 1); | |
8971 gcc_assert (temp); | |
8972 return temp; | |
8973 | |
8974 /* ??? Can optimize bitwise operations with one arg constant. | |
8975 Can optimize (a bitwise1 n) bitwise2 (a bitwise3 b) | |
8976 and (a bitwise1 b) bitwise2 b (etc) | |
8977 but that is probably not worth while. */ | |
8978 | |
8979 /* BIT_AND_EXPR is for bitwise anding. TRUTH_AND_EXPR is for anding two | |
8980 boolean values when we want in all cases to compute both of them. In | |
8981 general it is fastest to do TRUTH_AND_EXPR by computing both operands | |
8982 as actual zero-or-1 values and then bitwise anding. In cases where | |
8983 there cannot be any side effects, better code would be made by | |
8984 treating TRUTH_AND_EXPR like TRUTH_ANDIF_EXPR; but the question is | |
8985 how to recognize those cases. */ | |
8986 | |
8987 case TRUTH_AND_EXPR: | |
8988 code = BIT_AND_EXPR; | |
8989 case BIT_AND_EXPR: | |
8990 goto binop; | |
8991 | |
8992 case TRUTH_OR_EXPR: | |
8993 code = BIT_IOR_EXPR; | |
8994 case BIT_IOR_EXPR: | |
8995 goto binop; | |
8996 | |
8997 case TRUTH_XOR_EXPR: | |
8998 code = BIT_XOR_EXPR; | |
8999 case BIT_XOR_EXPR: | |
9000 goto binop; | |
9001 | |
9002 case LROTATE_EXPR: | |
9003 case RROTATE_EXPR: | |
9004 gcc_assert (VECTOR_MODE_P (TYPE_MODE (type)) | |
9005 || (GET_MODE_PRECISION (TYPE_MODE (type)) | |
9006 == TYPE_PRECISION (type))); | |
9007 /* fall through */ | |
9008 | |
9009 case LSHIFT_EXPR: | |
9010 case RSHIFT_EXPR: | |
9011 /* If this is a fixed-point operation, then we cannot use the code | |
9012 below because "expand_shift" doesn't support sat/no-sat fixed-point | |
9013 shifts. */ | |
9014 if (ALL_FIXED_POINT_MODE_P (mode)) | |
9015 goto binop; | |
9016 | |
9017 if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1)) | |
9018 subtarget = 0; | |
9019 if (modifier == EXPAND_STACK_PARM) | |
9020 target = 0; | |
9021 op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, | |
9022 VOIDmode, EXPAND_NORMAL); | |
9023 temp = expand_shift (code, mode, op0, TREE_OPERAND (exp, 1), target, | |
9024 unsignedp); | |
9025 if (code == LSHIFT_EXPR) | |
9026 temp = REDUCE_BIT_FIELD (temp); | |
9027 return temp; | |
9028 | |
9029 /* Could determine the answer when only additive constants differ. Also, | |
9030 the addition of one can be handled by changing the condition. */ | |
9031 case LT_EXPR: | |
9032 case LE_EXPR: | |
9033 case GT_EXPR: | |
9034 case GE_EXPR: | |
9035 case EQ_EXPR: | |
9036 case NE_EXPR: | |
9037 case UNORDERED_EXPR: | |
9038 case ORDERED_EXPR: | |
9039 case UNLT_EXPR: | |
9040 case UNLE_EXPR: | |
9041 case UNGT_EXPR: | |
9042 case UNGE_EXPR: | |
9043 case UNEQ_EXPR: | |
9044 case LTGT_EXPR: | |
9045 temp = do_store_flag (exp, | |
9046 modifier != EXPAND_STACK_PARM ? target : NULL_RTX, | |
9047 tmode != VOIDmode ? tmode : mode, 0); | |
9048 if (temp != 0) | |
9049 return temp; | |
9050 | |
9051 /* For foo != 0, load foo, and if it is nonzero load 1 instead. */ | |
9052 if (code == NE_EXPR && integer_zerop (TREE_OPERAND (exp, 1)) | |
9053 && original_target | |
9054 && REG_P (original_target) | |
9055 && (GET_MODE (original_target) | |
9056 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))))) | |
9057 { | |
9058 temp = expand_expr (TREE_OPERAND (exp, 0), original_target, | |
9059 VOIDmode, EXPAND_NORMAL); | |
9060 | |
9061 /* If temp is constant, we can just compute the result. */ | |
9062 if (GET_CODE (temp) == CONST_INT) | |
9063 { | |
9064 if (INTVAL (temp) != 0) | |
9065 emit_move_insn (target, const1_rtx); | |
9066 else | |
9067 emit_move_insn (target, const0_rtx); | |
9068 | |
9069 return target; | |
9070 } | |
9071 | |
9072 if (temp != original_target) | |
9073 { | |
9074 enum machine_mode mode1 = GET_MODE (temp); | |
9075 if (mode1 == VOIDmode) | |
9076 mode1 = tmode != VOIDmode ? tmode : mode; | |
9077 | |
9078 temp = copy_to_mode_reg (mode1, temp); | |
9079 } | |
9080 | |
9081 op1 = gen_label_rtx (); | |
9082 emit_cmp_and_jump_insns (temp, const0_rtx, EQ, NULL_RTX, | |
9083 GET_MODE (temp), unsignedp, op1); | |
9084 emit_move_insn (temp, const1_rtx); | |
9085 emit_label (op1); | |
9086 return temp; | |
9087 } | |
9088 | |
9089 /* If no set-flag instruction, must generate a conditional store | |
9090 into a temporary variable. Drop through and handle this | |
9091 like && and ||. */ | |
9092 /* Although TRUTH_{AND,OR}IF_EXPR aren't present in GIMPLE, they | |
9093 are occassionally created by folding during expansion. */ | |
9094 case TRUTH_ANDIF_EXPR: | |
9095 case TRUTH_ORIF_EXPR: | |
9096 if (! ignore | |
9097 && (target == 0 | |
9098 || modifier == EXPAND_STACK_PARM | |
9099 || ! safe_from_p (target, exp, 1) | |
9100 /* Make sure we don't have a hard reg (such as function's return | |
9101 value) live across basic blocks, if not optimizing. */ | |
9102 || (!optimize && REG_P (target) | |
9103 && REGNO (target) < FIRST_PSEUDO_REGISTER))) | |
9104 target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode); | |
9105 | |
9106 if (target) | |
9107 emit_move_insn (target, const0_rtx); | |
9108 | |
9109 op1 = gen_label_rtx (); | |
9110 jumpifnot (exp, op1); | |
9111 | |
9112 if (target) | |
9113 emit_move_insn (target, const1_rtx); | |
9114 | |
9115 emit_label (op1); | |
9116 return ignore ? const0_rtx : target; | |
9117 | |
9118 case TRUTH_NOT_EXPR: | |
9119 if (modifier == EXPAND_STACK_PARM) | |
9120 target = 0; | |
9121 op0 = expand_expr (TREE_OPERAND (exp, 0), target, | |
9122 VOIDmode, EXPAND_NORMAL); | |
9123 /* The parser is careful to generate TRUTH_NOT_EXPR | |
9124 only with operands that are always zero or one. */ | |
9125 temp = expand_binop (mode, xor_optab, op0, const1_rtx, | |
9126 target, 1, OPTAB_LIB_WIDEN); | |
9127 gcc_assert (temp); | |
9128 return temp; | |
9129 | |
9130 case STATEMENT_LIST: | |
9131 { | |
9132 tree_stmt_iterator iter; | |
9133 | |
9134 gcc_assert (ignore); | |
9135 | |
9136 for (iter = tsi_start (exp); !tsi_end_p (iter); tsi_next (&iter)) | |
9137 expand_expr (tsi_stmt (iter), const0_rtx, VOIDmode, modifier); | |
9138 } | |
9139 return const0_rtx; | |
9140 | |
9141 case COND_EXPR: | |
9142 /* A COND_EXPR with its type being VOID_TYPE represents a | |
9143 conditional jump and is handled in | |
9144 expand_gimple_cond_expr. */ | |
9145 gcc_assert (!VOID_TYPE_P (TREE_TYPE (exp))); | |
9146 | |
9147 /* Note that COND_EXPRs whose type is a structure or union | |
9148 are required to be constructed to contain assignments of | |
9149 a temporary variable, so that we can evaluate them here | |
9150 for side effect only. If type is void, we must do likewise. */ | |
9151 | |
9152 gcc_assert (!TREE_ADDRESSABLE (type) | |
9153 && !ignore | |
9154 && TREE_TYPE (TREE_OPERAND (exp, 1)) != void_type_node | |
9155 && TREE_TYPE (TREE_OPERAND (exp, 2)) != void_type_node); | |
9156 | |
9157 /* If we are not to produce a result, we have no target. Otherwise, | |
9158 if a target was specified use it; it will not be used as an | |
9159 intermediate target unless it is safe. If no target, use a | |
9160 temporary. */ | |
9161 | |
9162 if (modifier != EXPAND_STACK_PARM | |
9163 && original_target | |
9164 && safe_from_p (original_target, TREE_OPERAND (exp, 0), 1) | |
9165 && GET_MODE (original_target) == mode | |
9166 #ifdef HAVE_conditional_move | |
9167 && (! can_conditionally_move_p (mode) | |
9168 || REG_P (original_target)) | |
9169 #endif | |
9170 && !MEM_P (original_target)) | |
9171 temp = original_target; | |
9172 else | |
9173 temp = assign_temp (type, 0, 0, 1); | |
9174 | |
9175 do_pending_stack_adjust (); | |
9176 NO_DEFER_POP; | |
9177 op0 = gen_label_rtx (); | |
9178 op1 = gen_label_rtx (); | |
9179 jumpifnot (TREE_OPERAND (exp, 0), op0); | |
9180 store_expr (TREE_OPERAND (exp, 1), temp, | |
9181 modifier == EXPAND_STACK_PARM, | |
9182 false); | |
9183 | |
9184 emit_jump_insn (gen_jump (op1)); | |
9185 emit_barrier (); | |
9186 emit_label (op0); | |
9187 store_expr (TREE_OPERAND (exp, 2), temp, | |
9188 modifier == EXPAND_STACK_PARM, | |
9189 false); | |
9190 | |
9191 emit_label (op1); | |
9192 OK_DEFER_POP; | |
9193 return temp; | |
9194 | |
9195 case VEC_COND_EXPR: | |
9196 target = expand_vec_cond_expr (exp, target); | |
9197 return target; | |
9198 | |
9199 case MODIFY_EXPR: | |
9200 { | |
9201 tree lhs = TREE_OPERAND (exp, 0); | |
9202 tree rhs = TREE_OPERAND (exp, 1); | |
9203 gcc_assert (ignore); | |
9204 | |
9205 /* Check for |= or &= of a bitfield of size one into another bitfield | |
9206 of size 1. In this case, (unless we need the result of the | |
9207 assignment) we can do this more efficiently with a | |
9208 test followed by an assignment, if necessary. | |
9209 | |
9210 ??? At this point, we can't get a BIT_FIELD_REF here. But if | |
9211 things change so we do, this code should be enhanced to | |
9212 support it. */ | |
9213 if (TREE_CODE (lhs) == COMPONENT_REF | |
9214 && (TREE_CODE (rhs) == BIT_IOR_EXPR | |
9215 || TREE_CODE (rhs) == BIT_AND_EXPR) | |
9216 && TREE_OPERAND (rhs, 0) == lhs | |
9217 && TREE_CODE (TREE_OPERAND (rhs, 1)) == COMPONENT_REF | |
9218 && integer_onep (DECL_SIZE (TREE_OPERAND (lhs, 1))) | |
9219 && integer_onep (DECL_SIZE (TREE_OPERAND (TREE_OPERAND (rhs, 1), 1)))) | |
9220 { | |
9221 rtx label = gen_label_rtx (); | |
9222 int value = TREE_CODE (rhs) == BIT_IOR_EXPR; | |
9223 do_jump (TREE_OPERAND (rhs, 1), | |
9224 value ? label : 0, | |
9225 value ? 0 : label); | |
9226 expand_assignment (lhs, build_int_cst (TREE_TYPE (rhs), value), | |
9227 MOVE_NONTEMPORAL (exp)); | |
9228 do_pending_stack_adjust (); | |
9229 emit_label (label); | |
9230 return const0_rtx; | |
9231 } | |
9232 | |
9233 expand_assignment (lhs, rhs, MOVE_NONTEMPORAL (exp)); | |
9234 return const0_rtx; | |
9235 } | |
9236 | |
9237 case RETURN_EXPR: | |
9238 if (!TREE_OPERAND (exp, 0)) | |
9239 expand_null_return (); | |
9240 else | |
9241 expand_return (TREE_OPERAND (exp, 0)); | |
9242 return const0_rtx; | |
9243 | |
9244 case ADDR_EXPR: | |
9245 return expand_expr_addr_expr (exp, target, tmode, modifier); | |
9246 | |
9247 case COMPLEX_EXPR: | |
9248 /* Get the rtx code of the operands. */ | |
9249 op0 = expand_normal (TREE_OPERAND (exp, 0)); | |
9250 op1 = expand_normal (TREE_OPERAND (exp, 1)); | |
9251 | |
9252 if (!target) | |
9253 target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp))); | |
9254 | |
9255 /* Move the real (op0) and imaginary (op1) parts to their location. */ | |
9256 write_complex_part (target, op0, false); | |
9257 write_complex_part (target, op1, true); | |
9258 | |
9259 return target; | |
9260 | |
9261 case REALPART_EXPR: | |
9262 op0 = expand_normal (TREE_OPERAND (exp, 0)); | |
9263 return read_complex_part (op0, false); | |
9264 | |
9265 case IMAGPART_EXPR: | |
9266 op0 = expand_normal (TREE_OPERAND (exp, 0)); | |
9267 return read_complex_part (op0, true); | |
9268 | |
9269 case RESX_EXPR: | |
9270 expand_resx_expr (exp); | |
9271 return const0_rtx; | |
9272 | |
9273 case TRY_CATCH_EXPR: | |
9274 case CATCH_EXPR: | |
9275 case EH_FILTER_EXPR: | |
9276 case TRY_FINALLY_EXPR: | |
9277 /* Lowered by tree-eh.c. */ | |
9278 gcc_unreachable (); | |
9279 | |
9280 case WITH_CLEANUP_EXPR: | |
9281 case CLEANUP_POINT_EXPR: | |
9282 case TARGET_EXPR: | |
9283 case CASE_LABEL_EXPR: | |
9284 case VA_ARG_EXPR: | |
9285 case BIND_EXPR: | |
9286 case INIT_EXPR: | |
9287 case CONJ_EXPR: | |
9288 case COMPOUND_EXPR: | |
9289 case PREINCREMENT_EXPR: | |
9290 case PREDECREMENT_EXPR: | |
9291 case POSTINCREMENT_EXPR: | |
9292 case POSTDECREMENT_EXPR: | |
9293 case LOOP_EXPR: | |
9294 case EXIT_EXPR: | |
9295 /* Lowered by gimplify.c. */ | |
9296 gcc_unreachable (); | |
9297 | |
9298 case CHANGE_DYNAMIC_TYPE_EXPR: | |
9299 /* This is ignored at the RTL level. The tree level set | |
9300 DECL_POINTER_ALIAS_SET of any variable to be 0, which is | |
9301 overkill for the RTL layer but is all that we can | |
9302 represent. */ | |
9303 return const0_rtx; | |
9304 | |
9305 case EXC_PTR_EXPR: | |
9306 return get_exception_pointer (); | |
9307 | |
9308 case FILTER_EXPR: | |
9309 return get_exception_filter (); | |
9310 | |
9311 case FDESC_EXPR: | |
9312 /* Function descriptors are not valid except for as | |
9313 initialization constants, and should not be expanded. */ | |
9314 gcc_unreachable (); | |
9315 | |
9316 case SWITCH_EXPR: | |
9317 expand_case (exp); | |
9318 return const0_rtx; | |
9319 | |
9320 case LABEL_EXPR: | |
9321 expand_label (TREE_OPERAND (exp, 0)); | |
9322 return const0_rtx; | |
9323 | |
9324 case ASM_EXPR: | |
9325 expand_asm_expr (exp); | |
9326 return const0_rtx; | |
9327 | |
9328 case WITH_SIZE_EXPR: | |
9329 /* WITH_SIZE_EXPR expands to its first argument. The caller should | |
9330 have pulled out the size to use in whatever context it needed. */ | |
9331 return expand_expr_real (TREE_OPERAND (exp, 0), original_target, tmode, | |
9332 modifier, alt_rtl); | |
9333 | |
9334 case REALIGN_LOAD_EXPR: | |
9335 { | |
9336 tree oprnd0 = TREE_OPERAND (exp, 0); | |
9337 tree oprnd1 = TREE_OPERAND (exp, 1); | |
9338 tree oprnd2 = TREE_OPERAND (exp, 2); | |
9339 rtx op2; | |
9340 | |
9341 this_optab = optab_for_tree_code (code, type, optab_default); | |
9342 expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL); | |
9343 op2 = expand_normal (oprnd2); | |
9344 temp = expand_ternary_op (mode, this_optab, op0, op1, op2, | |
9345 target, unsignedp); | |
9346 gcc_assert (temp); | |
9347 return temp; | |
9348 } | |
9349 | |
9350 case DOT_PROD_EXPR: | |
9351 { | |
9352 tree oprnd0 = TREE_OPERAND (exp, 0); | |
9353 tree oprnd1 = TREE_OPERAND (exp, 1); | |
9354 tree oprnd2 = TREE_OPERAND (exp, 2); | |
9355 rtx op2; | |
9356 | |
9357 expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL); | |
9358 op2 = expand_normal (oprnd2); | |
9359 target = expand_widen_pattern_expr (exp, op0, op1, op2, | |
9360 target, unsignedp); | |
9361 return target; | |
9362 } | |
9363 | |
9364 case WIDEN_SUM_EXPR: | |
9365 { | |
9366 tree oprnd0 = TREE_OPERAND (exp, 0); | |
9367 tree oprnd1 = TREE_OPERAND (exp, 1); | |
9368 | |
9369 expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, 0); | |
9370 target = expand_widen_pattern_expr (exp, op0, NULL_RTX, op1, | |
9371 target, unsignedp); | |
9372 return target; | |
9373 } | |
9374 | |
9375 case REDUC_MAX_EXPR: | |
9376 case REDUC_MIN_EXPR: | |
9377 case REDUC_PLUS_EXPR: | |
9378 { | |
9379 op0 = expand_normal (TREE_OPERAND (exp, 0)); | |
9380 this_optab = optab_for_tree_code (code, type, optab_default); | |
9381 temp = expand_unop (mode, this_optab, op0, target, unsignedp); | |
9382 gcc_assert (temp); | |
9383 return temp; | |
9384 } | |
9385 | |
9386 case VEC_EXTRACT_EVEN_EXPR: | |
9387 case VEC_EXTRACT_ODD_EXPR: | |
9388 { | |
9389 expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1), | |
9390 NULL_RTX, &op0, &op1, 0); | |
9391 this_optab = optab_for_tree_code (code, type, optab_default); | |
9392 temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp, | |
9393 OPTAB_WIDEN); | |
9394 gcc_assert (temp); | |
9395 return temp; | |
9396 } | |
9397 | |
9398 case VEC_INTERLEAVE_HIGH_EXPR: | |
9399 case VEC_INTERLEAVE_LOW_EXPR: | |
9400 { | |
9401 expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1), | |
9402 NULL_RTX, &op0, &op1, 0); | |
9403 this_optab = optab_for_tree_code (code, type, optab_default); | |
9404 temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp, | |
9405 OPTAB_WIDEN); | |
9406 gcc_assert (temp); | |
9407 return temp; | |
9408 } | |
9409 | |
9410 case VEC_LSHIFT_EXPR: | |
9411 case VEC_RSHIFT_EXPR: | |
9412 { | |
9413 target = expand_vec_shift_expr (exp, target); | |
9414 return target; | |
9415 } | |
9416 | |
9417 case VEC_UNPACK_HI_EXPR: | |
9418 case VEC_UNPACK_LO_EXPR: | |
9419 { | |
9420 op0 = expand_normal (TREE_OPERAND (exp, 0)); | |
9421 this_optab = optab_for_tree_code (code, type, optab_default); | |
9422 temp = expand_widen_pattern_expr (exp, op0, NULL_RTX, NULL_RTX, | |
9423 target, unsignedp); | |
9424 gcc_assert (temp); | |
9425 return temp; | |
9426 } | |
9427 | |
9428 case VEC_UNPACK_FLOAT_HI_EXPR: | |
9429 case VEC_UNPACK_FLOAT_LO_EXPR: | |
9430 { | |
9431 op0 = expand_normal (TREE_OPERAND (exp, 0)); | |
9432 /* The signedness is determined from input operand. */ | |
9433 this_optab = optab_for_tree_code (code, | |
9434 TREE_TYPE (TREE_OPERAND (exp, 0)), | |
9435 optab_default); | |
9436 temp = expand_widen_pattern_expr | |
9437 (exp, op0, NULL_RTX, NULL_RTX, | |
9438 target, TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))); | |
9439 | |
9440 gcc_assert (temp); | |
9441 return temp; | |
9442 } | |
9443 | |
9444 case VEC_WIDEN_MULT_HI_EXPR: | |
9445 case VEC_WIDEN_MULT_LO_EXPR: | |
9446 { | |
9447 tree oprnd0 = TREE_OPERAND (exp, 0); | |
9448 tree oprnd1 = TREE_OPERAND (exp, 1); | |
9449 | |
9450 expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, 0); | |
9451 target = expand_widen_pattern_expr (exp, op0, op1, NULL_RTX, | |
9452 target, unsignedp); | |
9453 gcc_assert (target); | |
9454 return target; | |
9455 } | |
9456 | |
9457 case VEC_PACK_TRUNC_EXPR: | |
9458 case VEC_PACK_SAT_EXPR: | |
9459 case VEC_PACK_FIX_TRUNC_EXPR: | |
9460 mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))); | |
9461 goto binop; | |
9462 | |
9463 default: | |
9464 return lang_hooks.expand_expr (exp, original_target, tmode, | |
9465 modifier, alt_rtl); | |
9466 } | |
9467 | |
9468 /* Here to do an ordinary binary operator. */ | |
9469 binop: | |
9470 expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1), | |
9471 subtarget, &op0, &op1, 0); | |
9472 binop2: | |
9473 this_optab = optab_for_tree_code (code, type, optab_default); | |
9474 binop3: | |
9475 if (modifier == EXPAND_STACK_PARM) | |
9476 target = 0; | |
9477 temp = expand_binop (mode, this_optab, op0, op1, target, | |
9478 unsignedp, OPTAB_LIB_WIDEN); | |
9479 gcc_assert (temp); | |
9480 return REDUCE_BIT_FIELD (temp); | |
9481 } | |
9482 #undef REDUCE_BIT_FIELD | |
9483 | |
9484 /* Subroutine of above: reduce EXP to the precision of TYPE (in the | |
9485 signedness of TYPE), possibly returning the result in TARGET. */ | |
9486 static rtx | |
9487 reduce_to_bit_field_precision (rtx exp, rtx target, tree type) | |
9488 { | |
9489 HOST_WIDE_INT prec = TYPE_PRECISION (type); | |
9490 if (target && GET_MODE (target) != GET_MODE (exp)) | |
9491 target = 0; | |
9492 /* For constant values, reduce using build_int_cst_type. */ | |
9493 if (GET_CODE (exp) == CONST_INT) | |
9494 { | |
9495 HOST_WIDE_INT value = INTVAL (exp); | |
9496 tree t = build_int_cst_type (type, value); | |
9497 return expand_expr (t, target, VOIDmode, EXPAND_NORMAL); | |
9498 } | |
9499 else if (TYPE_UNSIGNED (type)) | |
9500 { | |
9501 rtx mask; | |
9502 if (prec < HOST_BITS_PER_WIDE_INT) | |
9503 mask = immed_double_const (((unsigned HOST_WIDE_INT) 1 << prec) - 1, 0, | |
9504 GET_MODE (exp)); | |
9505 else | |
9506 mask = immed_double_const ((unsigned HOST_WIDE_INT) -1, | |
9507 ((unsigned HOST_WIDE_INT) 1 | |
9508 << (prec - HOST_BITS_PER_WIDE_INT)) - 1, | |
9509 GET_MODE (exp)); | |
9510 return expand_and (GET_MODE (exp), exp, mask, target); | |
9511 } | |
9512 else | |
9513 { | |
9514 tree count = build_int_cst (NULL_TREE, | |
9515 GET_MODE_BITSIZE (GET_MODE (exp)) - prec); | |
9516 exp = expand_shift (LSHIFT_EXPR, GET_MODE (exp), exp, count, target, 0); | |
9517 return expand_shift (RSHIFT_EXPR, GET_MODE (exp), exp, count, target, 0); | |
9518 } | |
9519 } | |
9520 | |
9521 /* Subroutine of above: returns 1 if OFFSET corresponds to an offset that | |
9522 when applied to the address of EXP produces an address known to be | |
9523 aligned more than BIGGEST_ALIGNMENT. */ | |
9524 | |
9525 static int | |
9526 is_aligning_offset (const_tree offset, const_tree exp) | |
9527 { | |
9528 /* Strip off any conversions. */ | |
9529 while (CONVERT_EXPR_P (offset)) | |
9530 offset = TREE_OPERAND (offset, 0); | |
9531 | |
9532 /* We must now have a BIT_AND_EXPR with a constant that is one less than | |
9533 power of 2 and which is larger than BIGGEST_ALIGNMENT. */ | |
9534 if (TREE_CODE (offset) != BIT_AND_EXPR | |
9535 || !host_integerp (TREE_OPERAND (offset, 1), 1) | |
9536 || compare_tree_int (TREE_OPERAND (offset, 1), | |
9537 BIGGEST_ALIGNMENT / BITS_PER_UNIT) <= 0 | |
9538 || !exact_log2 (tree_low_cst (TREE_OPERAND (offset, 1), 1) + 1) < 0) | |
9539 return 0; | |
9540 | |
9541 /* Look at the first operand of BIT_AND_EXPR and strip any conversion. | |
9542 It must be NEGATE_EXPR. Then strip any more conversions. */ | |
9543 offset = TREE_OPERAND (offset, 0); | |
9544 while (CONVERT_EXPR_P (offset)) | |
9545 offset = TREE_OPERAND (offset, 0); | |
9546 | |
9547 if (TREE_CODE (offset) != NEGATE_EXPR) | |
9548 return 0; | |
9549 | |
9550 offset = TREE_OPERAND (offset, 0); | |
9551 while (CONVERT_EXPR_P (offset)) | |
9552 offset = TREE_OPERAND (offset, 0); | |
9553 | |
9554 /* This must now be the address of EXP. */ | |
9555 return TREE_CODE (offset) == ADDR_EXPR && TREE_OPERAND (offset, 0) == exp; | |
9556 } | |
9557 | |
9558 /* Return the tree node if an ARG corresponds to a string constant or zero | |
9559 if it doesn't. If we return nonzero, set *PTR_OFFSET to the offset | |
9560 in bytes within the string that ARG is accessing. The type of the | |
9561 offset will be `sizetype'. */ | |
9562 | |
9563 tree | |
9564 string_constant (tree arg, tree *ptr_offset) | |
9565 { | |
9566 tree array, offset, lower_bound; | |
9567 STRIP_NOPS (arg); | |
9568 | |
9569 if (TREE_CODE (arg) == ADDR_EXPR) | |
9570 { | |
9571 if (TREE_CODE (TREE_OPERAND (arg, 0)) == STRING_CST) | |
9572 { | |
9573 *ptr_offset = size_zero_node; | |
9574 return TREE_OPERAND (arg, 0); | |
9575 } | |
9576 else if (TREE_CODE (TREE_OPERAND (arg, 0)) == VAR_DECL) | |
9577 { | |
9578 array = TREE_OPERAND (arg, 0); | |
9579 offset = size_zero_node; | |
9580 } | |
9581 else if (TREE_CODE (TREE_OPERAND (arg, 0)) == ARRAY_REF) | |
9582 { | |
9583 array = TREE_OPERAND (TREE_OPERAND (arg, 0), 0); | |
9584 offset = TREE_OPERAND (TREE_OPERAND (arg, 0), 1); | |
9585 if (TREE_CODE (array) != STRING_CST | |
9586 && TREE_CODE (array) != VAR_DECL) | |
9587 return 0; | |
9588 | |
9589 /* Check if the array has a nonzero lower bound. */ | |
9590 lower_bound = array_ref_low_bound (TREE_OPERAND (arg, 0)); | |
9591 if (!integer_zerop (lower_bound)) | |
9592 { | |
9593 /* If the offset and base aren't both constants, return 0. */ | |
9594 if (TREE_CODE (lower_bound) != INTEGER_CST) | |
9595 return 0; | |
9596 if (TREE_CODE (offset) != INTEGER_CST) | |
9597 return 0; | |
9598 /* Adjust offset by the lower bound. */ | |
9599 offset = size_diffop (fold_convert (sizetype, offset), | |
9600 fold_convert (sizetype, lower_bound)); | |
9601 } | |
9602 } | |
9603 else | |
9604 return 0; | |
9605 } | |
9606 else if (TREE_CODE (arg) == PLUS_EXPR || TREE_CODE (arg) == POINTER_PLUS_EXPR) | |
9607 { | |
9608 tree arg0 = TREE_OPERAND (arg, 0); | |
9609 tree arg1 = TREE_OPERAND (arg, 1); | |
9610 | |
9611 STRIP_NOPS (arg0); | |
9612 STRIP_NOPS (arg1); | |
9613 | |
9614 if (TREE_CODE (arg0) == ADDR_EXPR | |
9615 && (TREE_CODE (TREE_OPERAND (arg0, 0)) == STRING_CST | |
9616 || TREE_CODE (TREE_OPERAND (arg0, 0)) == VAR_DECL)) | |
9617 { | |
9618 array = TREE_OPERAND (arg0, 0); | |
9619 offset = arg1; | |
9620 } | |
9621 else if (TREE_CODE (arg1) == ADDR_EXPR | |
9622 && (TREE_CODE (TREE_OPERAND (arg1, 0)) == STRING_CST | |
9623 || TREE_CODE (TREE_OPERAND (arg1, 0)) == VAR_DECL)) | |
9624 { | |
9625 array = TREE_OPERAND (arg1, 0); | |
9626 offset = arg0; | |
9627 } | |
9628 else | |
9629 return 0; | |
9630 } | |
9631 else | |
9632 return 0; | |
9633 | |
9634 if (TREE_CODE (array) == STRING_CST) | |
9635 { | |
9636 *ptr_offset = fold_convert (sizetype, offset); | |
9637 return array; | |
9638 } | |
9639 else if (TREE_CODE (array) == VAR_DECL) | |
9640 { | |
9641 int length; | |
9642 | |
9643 /* Variables initialized to string literals can be handled too. */ | |
9644 if (DECL_INITIAL (array) == NULL_TREE | |
9645 || TREE_CODE (DECL_INITIAL (array)) != STRING_CST) | |
9646 return 0; | |
9647 | |
9648 /* If they are read-only, non-volatile and bind locally. */ | |
9649 if (! TREE_READONLY (array) | |
9650 || TREE_SIDE_EFFECTS (array) | |
9651 || ! targetm.binds_local_p (array)) | |
9652 return 0; | |
9653 | |
9654 /* Avoid const char foo[4] = "abcde"; */ | |
9655 if (DECL_SIZE_UNIT (array) == NULL_TREE | |
9656 || TREE_CODE (DECL_SIZE_UNIT (array)) != INTEGER_CST | |
9657 || (length = TREE_STRING_LENGTH (DECL_INITIAL (array))) <= 0 | |
9658 || compare_tree_int (DECL_SIZE_UNIT (array), length) < 0) | |
9659 return 0; | |
9660 | |
9661 /* If variable is bigger than the string literal, OFFSET must be constant | |
9662 and inside of the bounds of the string literal. */ | |
9663 offset = fold_convert (sizetype, offset); | |
9664 if (compare_tree_int (DECL_SIZE_UNIT (array), length) > 0 | |
9665 && (! host_integerp (offset, 1) | |
9666 || compare_tree_int (offset, length) >= 0)) | |
9667 return 0; | |
9668 | |
9669 *ptr_offset = offset; | |
9670 return DECL_INITIAL (array); | |
9671 } | |
9672 | |
9673 return 0; | |
9674 } | |
9675 | |
9676 /* Generate code to calculate EXP using a store-flag instruction | |
9677 and return an rtx for the result. EXP is either a comparison | |
9678 or a TRUTH_NOT_EXPR whose operand is a comparison. | |
9679 | |
9680 If TARGET is nonzero, store the result there if convenient. | |
9681 | |
9682 If ONLY_CHEAP is nonzero, only do this if it is likely to be very | |
9683 cheap. | |
9684 | |
9685 Return zero if there is no suitable set-flag instruction | |
9686 available on this machine. | |
9687 | |
9688 Once expand_expr has been called on the arguments of the comparison, | |
9689 we are committed to doing the store flag, since it is not safe to | |
9690 re-evaluate the expression. We emit the store-flag insn by calling | |
9691 emit_store_flag, but only expand the arguments if we have a reason | |
9692 to believe that emit_store_flag will be successful. If we think that | |
9693 it will, but it isn't, we have to simulate the store-flag with a | |
9694 set/jump/set sequence. */ | |
9695 | |
9696 static rtx | |
9697 do_store_flag (tree exp, rtx target, enum machine_mode mode, int only_cheap) | |
9698 { | |
9699 enum rtx_code code; | |
9700 tree arg0, arg1, type; | |
9701 tree tem; | |
9702 enum machine_mode operand_mode; | |
9703 int invert = 0; | |
9704 int unsignedp; | |
9705 rtx op0, op1; | |
9706 enum insn_code icode; | |
9707 rtx subtarget = target; | |
9708 rtx result, label; | |
9709 | |
9710 /* If this is a TRUTH_NOT_EXPR, set a flag indicating we must invert the | |
9711 result at the end. We can't simply invert the test since it would | |
9712 have already been inverted if it were valid. This case occurs for | |
9713 some floating-point comparisons. */ | |
9714 | |
9715 if (TREE_CODE (exp) == TRUTH_NOT_EXPR) | |
9716 invert = 1, exp = TREE_OPERAND (exp, 0); | |
9717 | |
9718 arg0 = TREE_OPERAND (exp, 0); | |
9719 arg1 = TREE_OPERAND (exp, 1); | |
9720 | |
9721 /* Don't crash if the comparison was erroneous. */ | |
9722 if (arg0 == error_mark_node || arg1 == error_mark_node) | |
9723 return const0_rtx; | |
9724 | |
9725 type = TREE_TYPE (arg0); | |
9726 operand_mode = TYPE_MODE (type); | |
9727 unsignedp = TYPE_UNSIGNED (type); | |
9728 | |
9729 /* We won't bother with BLKmode store-flag operations because it would mean | |
9730 passing a lot of information to emit_store_flag. */ | |
9731 if (operand_mode == BLKmode) | |
9732 return 0; | |
9733 | |
9734 /* We won't bother with store-flag operations involving function pointers | |
9735 when function pointers must be canonicalized before comparisons. */ | |
9736 #ifdef HAVE_canonicalize_funcptr_for_compare | |
9737 if (HAVE_canonicalize_funcptr_for_compare | |
9738 && ((TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == POINTER_TYPE | |
9739 && (TREE_CODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)))) | |
9740 == FUNCTION_TYPE)) | |
9741 || (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 1))) == POINTER_TYPE | |
9742 && (TREE_CODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 1)))) | |
9743 == FUNCTION_TYPE)))) | |
9744 return 0; | |
9745 #endif | |
9746 | |
9747 STRIP_NOPS (arg0); | |
9748 STRIP_NOPS (arg1); | |
9749 | |
9750 /* Get the rtx comparison code to use. We know that EXP is a comparison | |
9751 operation of some type. Some comparisons against 1 and -1 can be | |
9752 converted to comparisons with zero. Do so here so that the tests | |
9753 below will be aware that we have a comparison with zero. These | |
9754 tests will not catch constants in the first operand, but constants | |
9755 are rarely passed as the first operand. */ | |
9756 | |
9757 switch (TREE_CODE (exp)) | |
9758 { | |
9759 case EQ_EXPR: | |
9760 code = EQ; | |
9761 break; | |
9762 case NE_EXPR: | |
9763 code = NE; | |
9764 break; | |
9765 case LT_EXPR: | |
9766 if (integer_onep (arg1)) | |
9767 arg1 = integer_zero_node, code = unsignedp ? LEU : LE; | |
9768 else | |
9769 code = unsignedp ? LTU : LT; | |
9770 break; | |
9771 case LE_EXPR: | |
9772 if (! unsignedp && integer_all_onesp (arg1)) | |
9773 arg1 = integer_zero_node, code = LT; | |
9774 else | |
9775 code = unsignedp ? LEU : LE; | |
9776 break; | |
9777 case GT_EXPR: | |
9778 if (! unsignedp && integer_all_onesp (arg1)) | |
9779 arg1 = integer_zero_node, code = GE; | |
9780 else | |
9781 code = unsignedp ? GTU : GT; | |
9782 break; | |
9783 case GE_EXPR: | |
9784 if (integer_onep (arg1)) | |
9785 arg1 = integer_zero_node, code = unsignedp ? GTU : GT; | |
9786 else | |
9787 code = unsignedp ? GEU : GE; | |
9788 break; | |
9789 | |
9790 case UNORDERED_EXPR: | |
9791 code = UNORDERED; | |
9792 break; | |
9793 case ORDERED_EXPR: | |
9794 code = ORDERED; | |
9795 break; | |
9796 case UNLT_EXPR: | |
9797 code = UNLT; | |
9798 break; | |
9799 case UNLE_EXPR: | |
9800 code = UNLE; | |
9801 break; | |
9802 case UNGT_EXPR: | |
9803 code = UNGT; | |
9804 break; | |
9805 case UNGE_EXPR: | |
9806 code = UNGE; | |
9807 break; | |
9808 case UNEQ_EXPR: | |
9809 code = UNEQ; | |
9810 break; | |
9811 case LTGT_EXPR: | |
9812 code = LTGT; | |
9813 break; | |
9814 | |
9815 default: | |
9816 gcc_unreachable (); | |
9817 } | |
9818 | |
9819 /* Put a constant second. */ | |
9820 if (TREE_CODE (arg0) == REAL_CST || TREE_CODE (arg0) == INTEGER_CST | |
9821 || TREE_CODE (arg0) == FIXED_CST) | |
9822 { | |
9823 tem = arg0; arg0 = arg1; arg1 = tem; | |
9824 code = swap_condition (code); | |
9825 } | |
9826 | |
9827 /* If this is an equality or inequality test of a single bit, we can | |
9828 do this by shifting the bit being tested to the low-order bit and | |
9829 masking the result with the constant 1. If the condition was EQ, | |
9830 we xor it with 1. This does not require an scc insn and is faster | |
9831 than an scc insn even if we have it. | |
9832 | |
9833 The code to make this transformation was moved into fold_single_bit_test, | |
9834 so we just call into the folder and expand its result. */ | |
9835 | |
9836 if ((code == NE || code == EQ) | |
9837 && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1) | |
9838 && integer_pow2p (TREE_OPERAND (arg0, 1))) | |
9839 { | |
9840 tree type = lang_hooks.types.type_for_mode (mode, unsignedp); | |
9841 return expand_expr (fold_single_bit_test (code == NE ? NE_EXPR : EQ_EXPR, | |
9842 arg0, arg1, type), | |
9843 target, VOIDmode, EXPAND_NORMAL); | |
9844 } | |
9845 | |
9846 /* Now see if we are likely to be able to do this. Return if not. */ | |
9847 if (! can_compare_p (code, operand_mode, ccp_store_flag)) | |
9848 return 0; | |
9849 | |
9850 icode = setcc_gen_code[(int) code]; | |
9851 | |
9852 if (icode == CODE_FOR_nothing) | |
9853 { | |
9854 enum machine_mode wmode; | |
9855 | |
9856 for (wmode = operand_mode; | |
9857 icode == CODE_FOR_nothing && wmode != VOIDmode; | |
9858 wmode = GET_MODE_WIDER_MODE (wmode)) | |
9859 icode = optab_handler (cstore_optab, wmode)->insn_code; | |
9860 } | |
9861 | |
9862 if (icode == CODE_FOR_nothing | |
9863 || (only_cheap && insn_data[(int) icode].operand[0].mode != mode)) | |
9864 { | |
9865 /* We can only do this if it is one of the special cases that | |
9866 can be handled without an scc insn. */ | |
9867 if ((code == LT && integer_zerop (arg1)) | |
9868 || (! only_cheap && code == GE && integer_zerop (arg1))) | |
9869 ; | |
9870 else if (! only_cheap && (code == NE || code == EQ) | |
9871 && TREE_CODE (type) != REAL_TYPE | |
9872 && ((optab_handler (abs_optab, operand_mode)->insn_code | |
9873 != CODE_FOR_nothing) | |
9874 || (optab_handler (ffs_optab, operand_mode)->insn_code | |
9875 != CODE_FOR_nothing))) | |
9876 ; | |
9877 else | |
9878 return 0; | |
9879 } | |
9880 | |
9881 if (! get_subtarget (target) | |
9882 || GET_MODE (subtarget) != operand_mode) | |
9883 subtarget = 0; | |
9884 | |
9885 expand_operands (arg0, arg1, subtarget, &op0, &op1, 0); | |
9886 | |
9887 if (target == 0) | |
9888 target = gen_reg_rtx (mode); | |
9889 | |
9890 result = emit_store_flag (target, code, op0, op1, | |
9891 operand_mode, unsignedp, 1); | |
9892 | |
9893 if (result) | |
9894 { | |
9895 if (invert) | |
9896 result = expand_binop (mode, xor_optab, result, const1_rtx, | |
9897 result, 0, OPTAB_LIB_WIDEN); | |
9898 return result; | |
9899 } | |
9900 | |
9901 /* If this failed, we have to do this with set/compare/jump/set code. */ | |
9902 if (!REG_P (target) | |
9903 || reg_mentioned_p (target, op0) || reg_mentioned_p (target, op1)) | |
9904 target = gen_reg_rtx (GET_MODE (target)); | |
9905 | |
9906 emit_move_insn (target, invert ? const0_rtx : const1_rtx); | |
9907 label = gen_label_rtx (); | |
9908 do_compare_rtx_and_jump (op0, op1, code, unsignedp, operand_mode, NULL_RTX, | |
9909 NULL_RTX, label); | |
9910 | |
9911 emit_move_insn (target, invert ? const1_rtx : const0_rtx); | |
9912 emit_label (label); | |
9913 | |
9914 return target; | |
9915 } | |
9916 | |
9917 | |
9918 /* Stubs in case we haven't got a casesi insn. */ | |
9919 #ifndef HAVE_casesi | |
9920 # define HAVE_casesi 0 | |
9921 # define gen_casesi(a, b, c, d, e) (0) | |
9922 # define CODE_FOR_casesi CODE_FOR_nothing | |
9923 #endif | |
9924 | |
9925 /* If the machine does not have a case insn that compares the bounds, | |
9926 this means extra overhead for dispatch tables, which raises the | |
9927 threshold for using them. */ | |
9928 #ifndef CASE_VALUES_THRESHOLD | |
9929 #define CASE_VALUES_THRESHOLD (HAVE_casesi ? 4 : 5) | |
9930 #endif /* CASE_VALUES_THRESHOLD */ | |
9931 | |
9932 unsigned int | |
9933 case_values_threshold (void) | |
9934 { | |
9935 return CASE_VALUES_THRESHOLD; | |
9936 } | |
9937 | |
9938 /* Attempt to generate a casesi instruction. Returns 1 if successful, | |
9939 0 otherwise (i.e. if there is no casesi instruction). */ | |
9940 int | |
9941 try_casesi (tree index_type, tree index_expr, tree minval, tree range, | |
9942 rtx table_label ATTRIBUTE_UNUSED, rtx default_label, | |
9943 rtx fallback_label ATTRIBUTE_UNUSED) | |
9944 { | |
9945 enum machine_mode index_mode = SImode; | |
9946 int index_bits = GET_MODE_BITSIZE (index_mode); | |
9947 rtx op1, op2, index; | |
9948 enum machine_mode op_mode; | |
9949 | |
9950 if (! HAVE_casesi) | |
9951 return 0; | |
9952 | |
9953 /* Convert the index to SImode. */ | |
9954 if (GET_MODE_BITSIZE (TYPE_MODE (index_type)) > GET_MODE_BITSIZE (index_mode)) | |
9955 { | |
9956 enum machine_mode omode = TYPE_MODE (index_type); | |
9957 rtx rangertx = expand_normal (range); | |
9958 | |
9959 /* We must handle the endpoints in the original mode. */ | |
9960 index_expr = build2 (MINUS_EXPR, index_type, | |
9961 index_expr, minval); | |
9962 minval = integer_zero_node; | |
9963 index = expand_normal (index_expr); | |
9964 if (default_label) | |
9965 emit_cmp_and_jump_insns (rangertx, index, LTU, NULL_RTX, | |
9966 omode, 1, default_label); | |
9967 /* Now we can safely truncate. */ | |
9968 index = convert_to_mode (index_mode, index, 0); | |
9969 } | |
9970 else | |
9971 { | |
9972 if (TYPE_MODE (index_type) != index_mode) | |
9973 { | |
9974 index_type = lang_hooks.types.type_for_size (index_bits, 0); | |
9975 index_expr = fold_convert (index_type, index_expr); | |
9976 } | |
9977 | |
9978 index = expand_normal (index_expr); | |
9979 } | |
9980 | |
9981 do_pending_stack_adjust (); | |
9982 | |
9983 op_mode = insn_data[(int) CODE_FOR_casesi].operand[0].mode; | |
9984 if (! (*insn_data[(int) CODE_FOR_casesi].operand[0].predicate) | |
9985 (index, op_mode)) | |
9986 index = copy_to_mode_reg (op_mode, index); | |
9987 | |
9988 op1 = expand_normal (minval); | |
9989 | |
9990 op_mode = insn_data[(int) CODE_FOR_casesi].operand[1].mode; | |
9991 op1 = convert_modes (op_mode, TYPE_MODE (TREE_TYPE (minval)), | |
9992 op1, TYPE_UNSIGNED (TREE_TYPE (minval))); | |
9993 if (! (*insn_data[(int) CODE_FOR_casesi].operand[1].predicate) | |
9994 (op1, op_mode)) | |
9995 op1 = copy_to_mode_reg (op_mode, op1); | |
9996 | |
9997 op2 = expand_normal (range); | |
9998 | |
9999 op_mode = insn_data[(int) CODE_FOR_casesi].operand[2].mode; | |
10000 op2 = convert_modes (op_mode, TYPE_MODE (TREE_TYPE (range)), | |
10001 op2, TYPE_UNSIGNED (TREE_TYPE (range))); | |
10002 if (! (*insn_data[(int) CODE_FOR_casesi].operand[2].predicate) | |
10003 (op2, op_mode)) | |
10004 op2 = copy_to_mode_reg (op_mode, op2); | |
10005 | |
10006 emit_jump_insn (gen_casesi (index, op1, op2, | |
10007 table_label, !default_label | |
10008 ? fallback_label : default_label)); | |
10009 return 1; | |
10010 } | |
10011 | |
10012 /* Attempt to generate a tablejump instruction; same concept. */ | |
10013 #ifndef HAVE_tablejump | |
10014 #define HAVE_tablejump 0 | |
10015 #define gen_tablejump(x, y) (0) | |
10016 #endif | |
10017 | |
10018 /* Subroutine of the next function. | |
10019 | |
10020 INDEX is the value being switched on, with the lowest value | |
10021 in the table already subtracted. | |
10022 MODE is its expected mode (needed if INDEX is constant). | |
10023 RANGE is the length of the jump table. | |
10024 TABLE_LABEL is a CODE_LABEL rtx for the table itself. | |
10025 | |
10026 DEFAULT_LABEL is a CODE_LABEL rtx to jump to if the | |
10027 index value is out of range. */ | |
10028 | |
10029 static void | |
10030 do_tablejump (rtx index, enum machine_mode mode, rtx range, rtx table_label, | |
10031 rtx default_label) | |
10032 { | |
10033 rtx temp, vector; | |
10034 | |
10035 if (INTVAL (range) > cfun->cfg->max_jumptable_ents) | |
10036 cfun->cfg->max_jumptable_ents = INTVAL (range); | |
10037 | |
10038 /* Do an unsigned comparison (in the proper mode) between the index | |
10039 expression and the value which represents the length of the range. | |
10040 Since we just finished subtracting the lower bound of the range | |
10041 from the index expression, this comparison allows us to simultaneously | |
10042 check that the original index expression value is both greater than | |
10043 or equal to the minimum value of the range and less than or equal to | |
10044 the maximum value of the range. */ | |
10045 | |
10046 if (default_label) | |
10047 emit_cmp_and_jump_insns (index, range, GTU, NULL_RTX, mode, 1, | |
10048 default_label); | |
10049 | |
10050 /* If index is in range, it must fit in Pmode. | |
10051 Convert to Pmode so we can index with it. */ | |
10052 if (mode != Pmode) | |
10053 index = convert_to_mode (Pmode, index, 1); | |
10054 | |
10055 /* Don't let a MEM slip through, because then INDEX that comes | |
10056 out of PIC_CASE_VECTOR_ADDRESS won't be a valid address, | |
10057 and break_out_memory_refs will go to work on it and mess it up. */ | |
10058 #ifdef PIC_CASE_VECTOR_ADDRESS | |
10059 if (flag_pic && !REG_P (index)) | |
10060 index = copy_to_mode_reg (Pmode, index); | |
10061 #endif | |
10062 | |
10063 /* ??? The only correct use of CASE_VECTOR_MODE is the one inside the | |
10064 GET_MODE_SIZE, because this indicates how large insns are. The other | |
10065 uses should all be Pmode, because they are addresses. This code | |
10066 could fail if addresses and insns are not the same size. */ | |
10067 index = gen_rtx_PLUS (Pmode, | |
10068 gen_rtx_MULT (Pmode, index, | |
10069 GEN_INT (GET_MODE_SIZE (CASE_VECTOR_MODE))), | |
10070 gen_rtx_LABEL_REF (Pmode, table_label)); | |
10071 #ifdef PIC_CASE_VECTOR_ADDRESS | |
10072 if (flag_pic) | |
10073 index = PIC_CASE_VECTOR_ADDRESS (index); | |
10074 else | |
10075 #endif | |
10076 index = memory_address (CASE_VECTOR_MODE, index); | |
10077 temp = gen_reg_rtx (CASE_VECTOR_MODE); | |
10078 vector = gen_const_mem (CASE_VECTOR_MODE, index); | |
10079 convert_move (temp, vector, 0); | |
10080 | |
10081 emit_jump_insn (gen_tablejump (temp, table_label)); | |
10082 | |
10083 /* If we are generating PIC code or if the table is PC-relative, the | |
10084 table and JUMP_INSN must be adjacent, so don't output a BARRIER. */ | |
10085 if (! CASE_VECTOR_PC_RELATIVE && ! flag_pic) | |
10086 emit_barrier (); | |
10087 } | |
10088 | |
10089 int | |
10090 try_tablejump (tree index_type, tree index_expr, tree minval, tree range, | |
10091 rtx table_label, rtx default_label) | |
10092 { | |
10093 rtx index; | |
10094 | |
10095 if (! HAVE_tablejump) | |
10096 return 0; | |
10097 | |
10098 index_expr = fold_build2 (MINUS_EXPR, index_type, | |
10099 fold_convert (index_type, index_expr), | |
10100 fold_convert (index_type, minval)); | |
10101 index = expand_normal (index_expr); | |
10102 do_pending_stack_adjust (); | |
10103 | |
10104 do_tablejump (index, TYPE_MODE (index_type), | |
10105 convert_modes (TYPE_MODE (index_type), | |
10106 TYPE_MODE (TREE_TYPE (range)), | |
10107 expand_normal (range), | |
10108 TYPE_UNSIGNED (TREE_TYPE (range))), | |
10109 table_label, default_label); | |
10110 return 1; | |
10111 } | |
10112 | |
10113 /* Nonzero if the mode is a valid vector mode for this architecture. | |
10114 This returns nonzero even if there is no hardware support for the | |
10115 vector mode, but we can emulate with narrower modes. */ | |
10116 | |
10117 int | |
10118 vector_mode_valid_p (enum machine_mode mode) | |
10119 { | |
10120 enum mode_class mclass = GET_MODE_CLASS (mode); | |
10121 enum machine_mode innermode; | |
10122 | |
10123 /* Doh! What's going on? */ | |
10124 if (mclass != MODE_VECTOR_INT | |
10125 && mclass != MODE_VECTOR_FLOAT | |
10126 && mclass != MODE_VECTOR_FRACT | |
10127 && mclass != MODE_VECTOR_UFRACT | |
10128 && mclass != MODE_VECTOR_ACCUM | |
10129 && mclass != MODE_VECTOR_UACCUM) | |
10130 return 0; | |
10131 | |
10132 /* Hardware support. Woo hoo! */ | |
10133 if (targetm.vector_mode_supported_p (mode)) | |
10134 return 1; | |
10135 | |
10136 innermode = GET_MODE_INNER (mode); | |
10137 | |
10138 /* We should probably return 1 if requesting V4DI and we have no DI, | |
10139 but we have V2DI, but this is probably very unlikely. */ | |
10140 | |
10141 /* If we have support for the inner mode, we can safely emulate it. | |
10142 We may not have V2DI, but me can emulate with a pair of DIs. */ | |
10143 return targetm.scalar_mode_supported_p (innermode); | |
10144 } | |
10145 | |
10146 /* Return a CONST_VECTOR rtx for a VECTOR_CST tree. */ | |
10147 static rtx | |
10148 const_vector_from_tree (tree exp) | |
10149 { | |
10150 rtvec v; | |
10151 int units, i; | |
10152 tree link, elt; | |
10153 enum machine_mode inner, mode; | |
10154 | |
10155 mode = TYPE_MODE (TREE_TYPE (exp)); | |
10156 | |
10157 if (initializer_zerop (exp)) | |
10158 return CONST0_RTX (mode); | |
10159 | |
10160 units = GET_MODE_NUNITS (mode); | |
10161 inner = GET_MODE_INNER (mode); | |
10162 | |
10163 v = rtvec_alloc (units); | |
10164 | |
10165 link = TREE_VECTOR_CST_ELTS (exp); | |
10166 for (i = 0; link; link = TREE_CHAIN (link), ++i) | |
10167 { | |
10168 elt = TREE_VALUE (link); | |
10169 | |
10170 if (TREE_CODE (elt) == REAL_CST) | |
10171 RTVEC_ELT (v, i) = CONST_DOUBLE_FROM_REAL_VALUE (TREE_REAL_CST (elt), | |
10172 inner); | |
10173 else if (TREE_CODE (elt) == FIXED_CST) | |
10174 RTVEC_ELT (v, i) = CONST_FIXED_FROM_FIXED_VALUE (TREE_FIXED_CST (elt), | |
10175 inner); | |
10176 else | |
10177 RTVEC_ELT (v, i) = immed_double_const (TREE_INT_CST_LOW (elt), | |
10178 TREE_INT_CST_HIGH (elt), | |
10179 inner); | |
10180 } | |
10181 | |
10182 /* Initialize remaining elements to 0. */ | |
10183 for (; i < units; ++i) | |
10184 RTVEC_ELT (v, i) = CONST0_RTX (inner); | |
10185 | |
10186 return gen_rtx_CONST_VECTOR (mode, v); | |
10187 } | |
10188 #include "gt-expr.h" |