1 /* Subroutines used for code generation on IBM RS/6000.
2 Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
4 Free Software Foundation, Inc.
5 Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published
11 by the Free Software Foundation; either version 2, or (at your
12 option) any later version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the
21 Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
22 MA 02110-1301, USA. */
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "rtl.h"
29 #include "regs.h"
30 #include "hard-reg-set.h"
31 #include "real.h"
32 #include "insn-config.h"
33 #include "conditions.h"
34 #include "insn-attr.h"
35 #include "flags.h"
36 #include "recog.h"
37 #include "obstack.h"
38 #include "tree.h"
39 #include "expr.h"
40 #include "optabs.h"
41 #include "except.h"
42 #include "function.h"
43 #include "output.h"
44 #include "basic-block.h"
45 #include "integrate.h"
46 #include "toplev.h"
47 #include "ggc.h"
48 #include "hashtab.h"
49 #include "tm_p.h"
50 #include "target.h"
51 #include "target-def.h"
52 #include "langhooks.h"
53 #include "reload.h"
54 #include "cfglayout.h"
55 #include "sched-int.h"
56 #include "tree-gimple.h"
57 #include "intl.h"
58 #include "params.h"
59 #include "tm-constrs.h"
60 #if TARGET_XCOFF
61 #include "xcoffout.h" /* get declarations of xcoff_*_section_name */
62 #endif
63 #if TARGET_MACHO
64 #include "gstab.h" /* for N_SLINE */
65 #endif
66
67 #ifndef TARGET_NO_PROTOTYPE
68 #define TARGET_NO_PROTOTYPE 0
69 #endif
70
71 #define min(A,B) ((A) < (B) ? (A) : (B))
72 #define max(A,B) ((A) > (B) ? (A) : (B))
73
74 /* Structure used to define the rs6000 stack */
75 typedef struct rs6000_stack {
76 int first_gp_reg_save; /* first callee saved GP register used */
77 int first_fp_reg_save; /* first callee saved FP register used */
78 int first_altivec_reg_save; /* first callee saved AltiVec register used */
79 int lr_save_p; /* true if the link reg needs to be saved */
80 int cr_save_p; /* true if the CR reg needs to be saved */
81 unsigned int vrsave_mask; /* mask of vec registers to save */
82 int push_p; /* true if we need to allocate stack space */
83 int calls_p; /* true if the function makes any calls */
84 int world_save_p; /* true if we're saving *everything*:
85 r13-r31, cr, f14-f31, vrsave, v20-v31 */
86 enum rs6000_abi abi; /* which ABI to use */
87 int gp_save_offset; /* offset to save GP regs from initial SP */
88 int fp_save_offset; /* offset to save FP regs from initial SP */
89 int altivec_save_offset; /* offset to save AltiVec regs from initial SP */
90 int lr_save_offset; /* offset to save LR from initial SP */
91 int cr_save_offset; /* offset to save CR from initial SP */
92 int vrsave_save_offset; /* offset to save VRSAVE from initial SP */
93 int spe_gp_save_offset; /* offset to save spe 64-bit gprs */
94 int varargs_save_offset; /* offset to save the varargs registers */
95 int ehrd_offset; /* offset to EH return data */
96 int reg_size; /* register size (4 or 8) */
97 HOST_WIDE_INT vars_size; /* variable save area size */
98 int parm_size; /* outgoing parameter size */
99 int save_size; /* save area size */
100 int fixed_size; /* fixed size of stack frame */
101 int gp_size; /* size of saved GP registers */
102 int fp_size; /* size of saved FP registers */
103 int altivec_size; /* size of saved AltiVec registers */
104 int cr_size; /* size to hold CR if not in save_size */
105 int vrsave_size; /* size to hold VRSAVE if not in save_size */
106 int altivec_padding_size; /* size of altivec alignment padding if
107 not in save_size */
108 int spe_gp_size; /* size of 64-bit GPR save size for SPE */
109 int spe_padding_size;
110 HOST_WIDE_INT total_size; /* total bytes allocated for stack */
111 int spe_64bit_regs_used;
112 } rs6000_stack_t;
113
114 /* A C structure for machine-specific, per-function data.
115 This is added to the cfun structure. */
116 typedef struct machine_function GTY(())
117 {
118 /* Flags if __builtin_return_address (n) with n >= 1 was used. */
119 int ra_needs_full_frame;
120 /* Some local-dynamic symbol. */
121 const char *some_ld_name;
122 /* Whether the instruction chain has been scanned already. */
123 int insn_chain_scanned_p;
124 /* Flags if __builtin_return_address (0) was used. */
125 int ra_need_lr;
126 /* Offset from virtual_stack_vars_rtx to the start of the ABI_V4
127 varargs save area. */
128 HOST_WIDE_INT varargs_save_offset;
129 } machine_function;
130
131 /* Target cpu type */
132
133 enum processor_type rs6000_cpu;
134 struct rs6000_cpu_select rs6000_select[3] =
135 {
136 /* switch name, tune arch */
137 { (const char *)0, "--with-cpu=", 1, 1 },
138 { (const char *)0, "-mcpu=", 1, 1 },
139 { (const char *)0, "-mtune=", 1, 0 },
140 };
141
142 /* Always emit branch hint bits. */
143 static GTY(()) bool rs6000_always_hint;
144
145 /* Schedule instructions for group formation. */
146 static GTY(()) bool rs6000_sched_groups;
147
148 /* Support for -msched-costly-dep option. */
149 const char *rs6000_sched_costly_dep_str;
150 enum rs6000_dependence_cost rs6000_sched_costly_dep;
151
152 /* Support for -minsert-sched-nops option. */
153 const char *rs6000_sched_insert_nops_str;
154 enum rs6000_nop_insertion rs6000_sched_insert_nops;
155
156 /* Support targetm.vectorize.builtin_mask_for_load. */
157 static GTY(()) tree altivec_builtin_mask_for_load;
158
159 /* Size of long double. */
160 int rs6000_long_double_type_size;
161
162 /* IEEE quad extended precision long double. */
163 int rs6000_ieeequad;
164
165 /* Whether -mabi=altivec has appeared. */
166 int rs6000_altivec_abi;
167
168 /* Nonzero if we want SPE ABI extensions. */
169 int rs6000_spe_abi;
170
171 /* Nonzero if floating point operations are done in the GPRs. */
172 int rs6000_float_gprs = 0;
173
174 /* Nonzero if we want Darwin's struct-by-value-in-regs ABI. */
175 int rs6000_darwin64_abi;
176
177 /* Set to nonzero once AIX common-mode calls have been defined. */
178 static GTY(()) int common_mode_defined;
179
180 /* Save information from a "cmpxx" operation until the branch or scc is
181 emitted. */
182 rtx rs6000_compare_op0, rs6000_compare_op1;
183 int rs6000_compare_fp_p;
184
185 /* Label number of label created for -mrelocatable, to call to so we can
186 get the address of the GOT section */
187 int rs6000_pic_labelno;
188
189 #ifdef USING_ELFOS_H
190 /* Which abi to adhere to */
191 const char *rs6000_abi_name;
192
193 /* Semantics of the small data area */
194 enum rs6000_sdata_type rs6000_sdata = SDATA_DATA;
195
196 /* Which small data model to use */
197 const char *rs6000_sdata_name = (char *)0;
198
199 /* Counter for labels which are to be placed in .fixup. */
200 int fixuplabelno = 0;
201 #endif
202
203 /* Bit size of immediate TLS offsets and string from which it is decoded. */
204 int rs6000_tls_size = 32;
205 const char *rs6000_tls_size_string;
206
207 /* ABI enumeration available for subtarget to use. */
208 enum rs6000_abi rs6000_current_abi;
209
210 /* Whether to use variant of AIX ABI for PowerPC64 Linux. */
211 int dot_symbols;
212
213 /* Debug flags */
214 const char *rs6000_debug_name;
215 int rs6000_debug_stack; /* debug stack applications */
216 int rs6000_debug_arg; /* debug argument handling */
217
218 /* Value is TRUE if register/mode pair is acceptable. */
219 bool rs6000_hard_regno_mode_ok_p[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
220
221 /* Built in types. */
222
223 tree rs6000_builtin_types[RS6000_BTI_MAX];
224 tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
225
226 const char *rs6000_traceback_name;
227 static enum {
228 traceback_default = 0,
229 traceback_none,
230 traceback_part,
231 traceback_full
232 } rs6000_traceback;
233
234 /* Flag to say the TOC is initialized */
235 int toc_initialized;
236 char toc_label_name[10];
237
238 static GTY(()) section *read_only_data_section;
239 static GTY(()) section *private_data_section;
240 static GTY(()) section *read_only_private_data_section;
241 static GTY(()) section *sdata2_section;
242 static GTY(()) section *toc_section;
243
244 /* Control alignment for fields within structures. */
245 /* String from -malign-XXXXX. */
246 int rs6000_alignment_flags;
247
248 /* True for any options that were explicitly set. */
249 struct {
250 bool aix_struct_ret; /* True if -maix-struct-ret was used. */
251 bool alignment; /* True if -malign- was used. */
252 bool abi; /* True if -mabi=spe/nospe was used. */
253 bool spe; /* True if -mspe= was used. */
254 bool float_gprs; /* True if -mfloat-gprs= was used. */
255 bool isel; /* True if -misel was used. */
256 bool long_double; /* True if -mlong-double- was used. */
257 bool ieee; /* True if -mabi=ieee/ibmlongdouble used. */
258 } rs6000_explicit_options;
259
260 struct builtin_description
261 {
262 /* mask is not const because we're going to alter it below. This
263 nonsense will go away when we rewrite the -march infrastructure
264 to give us more target flag bits. */
265 unsigned int mask;
266 const enum insn_code icode;
267 const char *const name;
268 const enum rs6000_builtins code;
269 };
270
271 /* Target cpu costs. */
272
273 struct processor_costs {
274 const int mulsi; /* cost of SImode multiplication. */
275 const int mulsi_const; /* cost of SImode multiplication by constant. */
276 const int mulsi_const9; /* cost of SImode mult by short constant. */
277 const int muldi; /* cost of DImode multiplication. */
278 const int divsi; /* cost of SImode division. */
279 const int divdi; /* cost of DImode division. */
280 const int fp; /* cost of simple SFmode and DFmode insns. */
281 const int dmul; /* cost of DFmode multiplication (and fmadd). */
282 const int sdiv; /* cost of SFmode division (fdivs). */
283 const int ddiv; /* cost of DFmode division (fdiv). */
284 };
285
286 const struct processor_costs *rs6000_cost;
287
288 /* Processor costs (relative to an add) */
289
290 /* Instruction size costs on 32bit processors. */
291 static const
292 struct processor_costs size32_cost = {
293 COSTS_N_INSNS (1), /* mulsi */
294 COSTS_N_INSNS (1), /* mulsi_const */
295 COSTS_N_INSNS (1), /* mulsi_const9 */
296 COSTS_N_INSNS (1), /* muldi */
297 COSTS_N_INSNS (1), /* divsi */
298 COSTS_N_INSNS (1), /* divdi */
299 COSTS_N_INSNS (1), /* fp */
300 COSTS_N_INSNS (1), /* dmul */
301 COSTS_N_INSNS (1), /* sdiv */
302 COSTS_N_INSNS (1), /* ddiv */
303 };
304
305 /* Instruction size costs on 64bit processors. */
306 static const
307 struct processor_costs size64_cost = {
308 COSTS_N_INSNS (1), /* mulsi */
309 COSTS_N_INSNS (1), /* mulsi_const */
310 COSTS_N_INSNS (1), /* mulsi_const9 */
311 COSTS_N_INSNS (1), /* muldi */
312 COSTS_N_INSNS (1), /* divsi */
313 COSTS_N_INSNS (1), /* divdi */
314 COSTS_N_INSNS (1), /* fp */
315 COSTS_N_INSNS (1), /* dmul */
316 COSTS_N_INSNS (1), /* sdiv */
317 COSTS_N_INSNS (1), /* ddiv */
318 };
319
320 /* Instruction costs on RIOS1 processors. */
321 static const
322 struct processor_costs rios1_cost = {
323 COSTS_N_INSNS (5), /* mulsi */
324 COSTS_N_INSNS (4), /* mulsi_const */
325 COSTS_N_INSNS (3), /* mulsi_const9 */
326 COSTS_N_INSNS (5), /* muldi */
327 COSTS_N_INSNS (19), /* divsi */
328 COSTS_N_INSNS (19), /* divdi */
329 COSTS_N_INSNS (2), /* fp */
330 COSTS_N_INSNS (2), /* dmul */
331 COSTS_N_INSNS (19), /* sdiv */
332 COSTS_N_INSNS (19), /* ddiv */
333 };
334
335 /* Instruction costs on RIOS2 processors. */
336 static const
337 struct processor_costs rios2_cost = {
338 COSTS_N_INSNS (2), /* mulsi */
339 COSTS_N_INSNS (2), /* mulsi_const */
340 COSTS_N_INSNS (2), /* mulsi_const9 */
341 COSTS_N_INSNS (2), /* muldi */
342 COSTS_N_INSNS (13), /* divsi */
343 COSTS_N_INSNS (13), /* divdi */
344 COSTS_N_INSNS (2), /* fp */
345 COSTS_N_INSNS (2), /* dmul */
346 COSTS_N_INSNS (17), /* sdiv */
347 COSTS_N_INSNS (17), /* ddiv */
348 };
349
350 /* Instruction costs on RS64A processors. */
351 static const
352 struct processor_costs rs64a_cost = {
353 COSTS_N_INSNS (20), /* mulsi */
354 COSTS_N_INSNS (12), /* mulsi_const */
355 COSTS_N_INSNS (8), /* mulsi_const9 */
356 COSTS_N_INSNS (34), /* muldi */
357 COSTS_N_INSNS (65), /* divsi */
358 COSTS_N_INSNS (67), /* divdi */
359 COSTS_N_INSNS (4), /* fp */
360 COSTS_N_INSNS (4), /* dmul */
361 COSTS_N_INSNS (31), /* sdiv */
362 COSTS_N_INSNS (31), /* ddiv */
363 };
364
365 /* Instruction costs on MPCCORE processors. */
366 static const
367 struct processor_costs mpccore_cost = {
368 COSTS_N_INSNS (2), /* mulsi */
369 COSTS_N_INSNS (2), /* mulsi_const */
370 COSTS_N_INSNS (2), /* mulsi_const9 */
371 COSTS_N_INSNS (2), /* muldi */
372 COSTS_N_INSNS (6), /* divsi */
373 COSTS_N_INSNS (6), /* divdi */
374 COSTS_N_INSNS (4), /* fp */
375 COSTS_N_INSNS (5), /* dmul */
376 COSTS_N_INSNS (10), /* sdiv */
377 COSTS_N_INSNS (17), /* ddiv */
378 };
379
380 /* Instruction costs on PPC403 processors. */
381 static const
382 struct processor_costs ppc403_cost = {
383 COSTS_N_INSNS (4), /* mulsi */
384 COSTS_N_INSNS (4), /* mulsi_const */
385 COSTS_N_INSNS (4), /* mulsi_const9 */
386 COSTS_N_INSNS (4), /* muldi */
387 COSTS_N_INSNS (33), /* divsi */
388 COSTS_N_INSNS (33), /* divdi */
389 COSTS_N_INSNS (11), /* fp */
390 COSTS_N_INSNS (11), /* dmul */
391 COSTS_N_INSNS (11), /* sdiv */
392 COSTS_N_INSNS (11), /* ddiv */
393 };
394
395 /* Instruction costs on PPC405 processors. */
396 static const
397 struct processor_costs ppc405_cost = {
398 COSTS_N_INSNS (5), /* mulsi */
399 COSTS_N_INSNS (4), /* mulsi_const */
400 COSTS_N_INSNS (3), /* mulsi_const9 */
401 COSTS_N_INSNS (5), /* muldi */
402 COSTS_N_INSNS (35), /* divsi */
403 COSTS_N_INSNS (35), /* divdi */
404 COSTS_N_INSNS (11), /* fp */
405 COSTS_N_INSNS (11), /* dmul */
406 COSTS_N_INSNS (11), /* sdiv */
407 COSTS_N_INSNS (11), /* ddiv */
408 };
409
410 /* Instruction costs on PPC440 processors. */
411 static const
412 struct processor_costs ppc440_cost = {
413 COSTS_N_INSNS (3), /* mulsi */
414 COSTS_N_INSNS (2), /* mulsi_const */
415 COSTS_N_INSNS (2), /* mulsi_const9 */
416 COSTS_N_INSNS (3), /* muldi */
417 COSTS_N_INSNS (34), /* divsi */
418 COSTS_N_INSNS (34), /* divdi */
419 COSTS_N_INSNS (5), /* fp */
420 COSTS_N_INSNS (5), /* dmul */
421 COSTS_N_INSNS (19), /* sdiv */
422 COSTS_N_INSNS (33), /* ddiv */
423 };
424
425 /* Instruction costs on PPC601 processors. */
426 static const
427 struct processor_costs ppc601_cost = {
428 COSTS_N_INSNS (5), /* mulsi */
429 COSTS_N_INSNS (5), /* mulsi_const */
430 COSTS_N_INSNS (5), /* mulsi_const9 */
431 COSTS_N_INSNS (5), /* muldi */
432 COSTS_N_INSNS (36), /* divsi */
433 COSTS_N_INSNS (36), /* divdi */
434 COSTS_N_INSNS (4), /* fp */
435 COSTS_N_INSNS (5), /* dmul */
436 COSTS_N_INSNS (17), /* sdiv */
437 COSTS_N_INSNS (31), /* ddiv */
438 };
439
440 /* Instruction costs on PPC603 processors. */
441 static const
442 struct processor_costs ppc603_cost = {
443 COSTS_N_INSNS (5), /* mulsi */
444 COSTS_N_INSNS (3), /* mulsi_const */
445 COSTS_N_INSNS (2), /* mulsi_const9 */
446 COSTS_N_INSNS (5), /* muldi */
447 COSTS_N_INSNS (37), /* divsi */
448 COSTS_N_INSNS (37), /* divdi */
449 COSTS_N_INSNS (3), /* fp */
450 COSTS_N_INSNS (4), /* dmul */
451 COSTS_N_INSNS (18), /* sdiv */
452 COSTS_N_INSNS (33), /* ddiv */
453 };
454
455 /* Instruction costs on PPC604 processors. */
456 static const
457 struct processor_costs ppc604_cost = {
458 COSTS_N_INSNS (4), /* mulsi */
459 COSTS_N_INSNS (4), /* mulsi_const */
460 COSTS_N_INSNS (4), /* mulsi_const9 */
461 COSTS_N_INSNS (4), /* muldi */
462 COSTS_N_INSNS (20), /* divsi */
463 COSTS_N_INSNS (20), /* divdi */
464 COSTS_N_INSNS (3), /* fp */
465 COSTS_N_INSNS (3), /* dmul */
466 COSTS_N_INSNS (18), /* sdiv */
467 COSTS_N_INSNS (32), /* ddiv */
468 };
469
470 /* Instruction costs on PPC604e processors. */
471 static const
472 struct processor_costs ppc604e_cost = {
473 COSTS_N_INSNS (2), /* mulsi */
474 COSTS_N_INSNS (2), /* mulsi_const */
475 COSTS_N_INSNS (2), /* mulsi_const9 */
476 COSTS_N_INSNS (2), /* muldi */
477 COSTS_N_INSNS (20), /* divsi */
478 COSTS_N_INSNS (20), /* divdi */
479 COSTS_N_INSNS (3), /* fp */
480 COSTS_N_INSNS (3), /* dmul */
481 COSTS_N_INSNS (18), /* sdiv */
482 COSTS_N_INSNS (32), /* ddiv */
483 };
484
485 /* Instruction costs on PPC620 processors. */
486 static const
487 struct processor_costs ppc620_cost = {
488 COSTS_N_INSNS (5), /* mulsi */
489 COSTS_N_INSNS (4), /* mulsi_const */
490 COSTS_N_INSNS (3), /* mulsi_const9 */
491 COSTS_N_INSNS (7), /* muldi */
492 COSTS_N_INSNS (21), /* divsi */
493 COSTS_N_INSNS (37), /* divdi */
494 COSTS_N_INSNS (3), /* fp */
495 COSTS_N_INSNS (3), /* dmul */
496 COSTS_N_INSNS (18), /* sdiv */
497 COSTS_N_INSNS (32), /* ddiv */
498 };
499
500 /* Instruction costs on PPC630 processors. */
501 static const
502 struct processor_costs ppc630_cost = {
503 COSTS_N_INSNS (5), /* mulsi */
504 COSTS_N_INSNS (4), /* mulsi_const */
505 COSTS_N_INSNS (3), /* mulsi_const9 */
506 COSTS_N_INSNS (7), /* muldi */
507 COSTS_N_INSNS (21), /* divsi */
508 COSTS_N_INSNS (37), /* divdi */
509 COSTS_N_INSNS (3), /* fp */
510 COSTS_N_INSNS (3), /* dmul */
511 COSTS_N_INSNS (17), /* sdiv */
512 COSTS_N_INSNS (21), /* ddiv */
513 };
514
515 /* Instruction costs on PPC750 and PPC7400 processors. */
516 static const
517 struct processor_costs ppc750_cost = {
518 COSTS_N_INSNS (5), /* mulsi */
519 COSTS_N_INSNS (3), /* mulsi_const */
520 COSTS_N_INSNS (2), /* mulsi_const9 */
521 COSTS_N_INSNS (5), /* muldi */
522 COSTS_N_INSNS (17), /* divsi */
523 COSTS_N_INSNS (17), /* divdi */
524 COSTS_N_INSNS (3), /* fp */
525 COSTS_N_INSNS (3), /* dmul */
526 COSTS_N_INSNS (17), /* sdiv */
527 COSTS_N_INSNS (31), /* ddiv */
528 };
529
530 /* Instruction costs on PPC7450 processors. */
531 static const
532 struct processor_costs ppc7450_cost = {
533 COSTS_N_INSNS (4), /* mulsi */
534 COSTS_N_INSNS (3), /* mulsi_const */
535 COSTS_N_INSNS (3), /* mulsi_const9 */
536 COSTS_N_INSNS (4), /* muldi */
537 COSTS_N_INSNS (23), /* divsi */
538 COSTS_N_INSNS (23), /* divdi */
539 COSTS_N_INSNS (5), /* fp */
540 COSTS_N_INSNS (5), /* dmul */
541 COSTS_N_INSNS (21), /* sdiv */
542 COSTS_N_INSNS (35), /* ddiv */
543 };
544
545 /* Instruction costs on PPC8540 processors. */
546 static const
547 struct processor_costs ppc8540_cost = {
548 COSTS_N_INSNS (4), /* mulsi */
549 COSTS_N_INSNS (4), /* mulsi_const */
550 COSTS_N_INSNS (4), /* mulsi_const9 */
551 COSTS_N_INSNS (4), /* muldi */
552 COSTS_N_INSNS (19), /* divsi */
553 COSTS_N_INSNS (19), /* divdi */
554 COSTS_N_INSNS (4), /* fp */
555 COSTS_N_INSNS (4), /* dmul */
556 COSTS_N_INSNS (29), /* sdiv */
557 COSTS_N_INSNS (29), /* ddiv */
558 };
559
560 /* Instruction costs on POWER4 and POWER5 processors. */
561 static const
562 struct processor_costs power4_cost = {
563 COSTS_N_INSNS (3), /* mulsi */
564 COSTS_N_INSNS (2), /* mulsi_const */
565 COSTS_N_INSNS (2), /* mulsi_const9 */
566 COSTS_N_INSNS (4), /* muldi */
567 COSTS_N_INSNS (18), /* divsi */
568 COSTS_N_INSNS (34), /* divdi */
569 COSTS_N_INSNS (3), /* fp */
570 COSTS_N_INSNS (3), /* dmul */
571 COSTS_N_INSNS (17), /* sdiv */
572 COSTS_N_INSNS (17), /* ddiv */
573 };
574
575
576 static bool rs6000_function_ok_for_sibcall (tree, tree);
577 static const char *rs6000_invalid_within_doloop (rtx);
578 static rtx rs6000_generate_compare (enum rtx_code);
579 static void rs6000_maybe_dead (rtx);
580 static void rs6000_emit_stack_tie (void);
581 static void rs6000_frame_related (rtx, rtx, HOST_WIDE_INT, rtx, rtx);
582 static rtx spe_synthesize_frame_save (rtx);
583 static bool spe_func_has_64bit_regs_p (void);
584 static void emit_frame_save (rtx, rtx, enum machine_mode, unsigned int,
585 int, HOST_WIDE_INT);
586 static rtx gen_frame_mem_offset (enum machine_mode, rtx, int);
587 static void rs6000_emit_allocate_stack (HOST_WIDE_INT, int);
588 static unsigned rs6000_hash_constant (rtx);
589 static unsigned toc_hash_function (const void *);
590 static int toc_hash_eq (const void *, const void *);
591 static int constant_pool_expr_1 (rtx, int *, int *);
592 static bool constant_pool_expr_p (rtx);
593 static bool legitimate_small_data_p (enum machine_mode, rtx);
594 static bool legitimate_indexed_address_p (rtx, int);
595 static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
596 static struct machine_function * rs6000_init_machine_status (void);
597 static bool rs6000_assemble_integer (rtx, unsigned int, int);
598 static bool no_global_regs_above (int);
599 #ifdef HAVE_GAS_HIDDEN
600 static void rs6000_assemble_visibility (tree, int);
601 #endif
602 static int rs6000_ra_ever_killed (void);
603 static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
604 static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
605 static bool rs6000_ms_bitfield_layout_p (tree);
606 static tree rs6000_handle_struct_attribute (tree *, tree, tree, int, bool *);
607 static void rs6000_eliminate_indexed_memrefs (rtx operands[2]);
608 static const char *rs6000_mangle_fundamental_type (tree);
609 extern const struct attribute_spec rs6000_attribute_table[];
610 static void rs6000_set_default_type_attributes (tree);
611 static void rs6000_output_function_prologue (FILE *, HOST_WIDE_INT);
612 static void rs6000_output_function_epilogue (FILE *, HOST_WIDE_INT);
613 static void rs6000_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT,
614 tree);
615 static rtx rs6000_emit_set_long_const (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
616 static bool rs6000_return_in_memory (tree, tree);
617 static void rs6000_file_start (void);
618 #if TARGET_ELF
619 static int rs6000_elf_reloc_rw_mask (void);
620 static void rs6000_elf_asm_out_constructor (rtx, int);
621 static void rs6000_elf_asm_out_destructor (rtx, int);
622 static void rs6000_elf_end_indicate_exec_stack (void) ATTRIBUTE_UNUSED;
623 static void rs6000_elf_asm_init_sections (void);
624 static section *rs6000_elf_select_rtx_section (enum machine_mode, rtx,
625 unsigned HOST_WIDE_INT);
626 static void rs6000_elf_encode_section_info (tree, rtx, int)
627 ATTRIBUTE_UNUSED;
628 #endif
629 static bool rs6000_use_blocks_for_constant_p (enum machine_mode, rtx);
630 #if TARGET_XCOFF
631 static void rs6000_xcoff_asm_output_anchor (rtx);
632 static void rs6000_xcoff_asm_globalize_label (FILE *, const char *);
633 static void rs6000_xcoff_asm_init_sections (void);
634 static int rs6000_xcoff_reloc_rw_mask (void);
635 static void rs6000_xcoff_asm_named_section (const char *, unsigned int, tree);
636 static section *rs6000_xcoff_select_section (tree, int,
637 unsigned HOST_WIDE_INT);
638 static void rs6000_xcoff_unique_section (tree, int);
639 static section *rs6000_xcoff_select_rtx_section
640 (enum machine_mode, rtx, unsigned HOST_WIDE_INT);
641 static const char * rs6000_xcoff_strip_name_encoding (const char *);
642 static unsigned int rs6000_xcoff_section_type_flags (tree, const char *, int);
643 static void rs6000_xcoff_file_start (void);
644 static void rs6000_xcoff_file_end (void);
645 #endif
646 static int rs6000_variable_issue (FILE *, int, rtx, int);
647 static bool rs6000_rtx_costs (rtx, int, int, int *);
648 static int rs6000_adjust_cost (rtx, rtx, rtx, int);
649 static bool is_microcoded_insn (rtx);
650 static int is_dispatch_slot_restricted (rtx);
651 static bool is_cracked_insn (rtx);
652 static bool is_branch_slot_insn (rtx);
653 static int rs6000_adjust_priority (rtx, int);
654 static int rs6000_issue_rate (void);
655 static bool rs6000_is_costly_dependence (rtx, rtx, rtx, int, int);
656 static rtx get_next_active_insn (rtx, rtx);
657 static bool insn_terminates_group_p (rtx , enum group_termination);
658 static bool is_costly_group (rtx *, rtx);
659 static int force_new_group (int, FILE *, rtx *, rtx, bool *, int, int *);
660 static int redefine_groups (FILE *, int, rtx, rtx);
661 static int pad_groups (FILE *, int, rtx, rtx);
662 static void rs6000_sched_finish (FILE *, int);
663 static int rs6000_use_sched_lookahead (void);
664 static tree rs6000_builtin_mask_for_load (void);
665
666 static void def_builtin (int, const char *, tree, int);
667 static bool rs6000_vector_alignment_reachable (tree, bool);
668 static void rs6000_init_builtins (void);
669 static rtx rs6000_expand_unop_builtin (enum insn_code, tree, rtx);
670 static rtx rs6000_expand_binop_builtin (enum insn_code, tree, rtx);
671 static rtx rs6000_expand_ternop_builtin (enum insn_code, tree, rtx);
672 static rtx rs6000_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
673 static void altivec_init_builtins (void);
674 static void rs6000_common_init_builtins (void);
675 static void rs6000_init_libfuncs (void);
676
677 static void enable_mask_for_builtins (struct builtin_description *, int,
678 enum rs6000_builtins,
679 enum rs6000_builtins);
680 static tree build_opaque_vector_type (tree, int);
681 static void spe_init_builtins (void);
682 static rtx spe_expand_builtin (tree, rtx, bool *);
683 static rtx spe_expand_stv_builtin (enum insn_code, tree);
684 static rtx spe_expand_predicate_builtin (enum insn_code, tree, rtx);
685 static rtx spe_expand_evsel_builtin (enum insn_code, tree, rtx);
686 static int rs6000_emit_int_cmove (rtx, rtx, rtx, rtx);
687 static rs6000_stack_t *rs6000_stack_info (void);
688 static void debug_stack_info (rs6000_stack_t *);
689
690 static rtx altivec_expand_builtin (tree, rtx, bool *);
691 static rtx altivec_expand_ld_builtin (tree, rtx, bool *);
692 static rtx altivec_expand_st_builtin (tree, rtx, bool *);
693 static rtx altivec_expand_dst_builtin (tree, rtx, bool *);
694 static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx);
695 static rtx altivec_expand_predicate_builtin (enum insn_code,
696 const char *, tree, rtx);
697 static rtx altivec_expand_lv_builtin (enum insn_code, tree, rtx);
698 static rtx altivec_expand_stv_builtin (enum insn_code, tree);
699 static rtx altivec_expand_vec_init_builtin (tree, tree, rtx);
700 static rtx altivec_expand_vec_set_builtin (tree);
701 static rtx altivec_expand_vec_ext_builtin (tree, rtx);
702 static int get_element_number (tree, tree);
703 static bool rs6000_handle_option (size_t, const char *, int);
704 static void rs6000_parse_tls_size_option (void);
705 static void rs6000_parse_yes_no_option (const char *, const char *, int *);
706 static int first_altivec_reg_to_save (void);
707 static unsigned int compute_vrsave_mask (void);
708 static void compute_save_world_info (rs6000_stack_t *info_ptr);
709 static void is_altivec_return_reg (rtx, void *);
710 static rtx generate_set_vrsave (rtx, rs6000_stack_t *, int);
711 int easy_vector_constant (rtx, enum machine_mode);
712 static bool rs6000_is_opaque_type (tree);
713 static rtx rs6000_dwarf_register_span (rtx);
714 static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
715 static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
716 static rtx rs6000_tls_get_addr (void);
717 static rtx rs6000_got_sym (void);
718 static int rs6000_tls_symbol_ref_1 (rtx *, void *);
719 static const char *rs6000_get_some_local_dynamic_name (void);
720 static int rs6000_get_some_local_dynamic_name_1 (rtx *, void *);
721 static rtx rs6000_complex_function_value (enum machine_mode);
722 static rtx rs6000_spe_function_arg (CUMULATIVE_ARGS *,
723 enum machine_mode, tree);
724 static void rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *,
725 HOST_WIDE_INT);
726 static void rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *,
727 tree, HOST_WIDE_INT);
728 static void rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *,
729 HOST_WIDE_INT,
730 rtx[], int *);
731 static void rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *,
732 tree, HOST_WIDE_INT,
733 rtx[], int *);
734 static rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, tree, int, bool);
735 static rtx rs6000_mixed_function_arg (enum machine_mode, tree, int);
736 static void rs6000_move_block_from_reg (int regno, rtx x, int nregs);
737 static void setup_incoming_varargs (CUMULATIVE_ARGS *,
738 enum machine_mode, tree,
739 int *, int);
740 static bool rs6000_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
741 tree, bool);
742 static int rs6000_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
743 tree, bool);
744 static const char *invalid_arg_for_unprototyped_fn (tree, tree, tree);
745 #if TARGET_MACHO
746 static void macho_branch_islands (void);
747 static int no_previous_def (tree function_name);
748 static tree get_prev_label (tree function_name);
749 static void rs6000_darwin_file_start (void);
750 #endif
751
752 static tree rs6000_build_builtin_va_list (void);
753 static tree rs6000_gimplify_va_arg (tree, tree, tree *, tree *);
754 static bool rs6000_must_pass_in_stack (enum machine_mode, tree);
755 static bool rs6000_scalar_mode_supported_p (enum machine_mode);
756 static bool rs6000_vector_mode_supported_p (enum machine_mode);
757 static int get_vec_cmp_insn (enum rtx_code, enum machine_mode,
758 enum machine_mode);
759 static rtx rs6000_emit_vector_compare (enum rtx_code, rtx, rtx,
760 enum machine_mode);
761 static int get_vsel_insn (enum machine_mode);
762 static void rs6000_emit_vector_select (rtx, rtx, rtx, rtx);
763 static tree rs6000_stack_protect_fail (void);
764
765 const int INSN_NOT_AVAILABLE = -1;
766 static enum machine_mode rs6000_eh_return_filter_mode (void);
767
768 /* Hash table stuff for keeping track of TOC entries. */
769
770 struct toc_hash_struct GTY(())
771 {
772 /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
773 ASM_OUTPUT_SPECIAL_POOL_ENTRY_P. */
774 rtx key;
775 enum machine_mode key_mode;
776 int labelno;
777 };
778
779 static GTY ((param_is (struct toc_hash_struct))) htab_t toc_hash_table;
780
781 /* Default register names. */
782 char rs6000_reg_names[][8] =
783 {
784 "0", "1", "2", "3", "4", "5", "6", "7",
785 "8", "9", "10", "11", "12", "13", "14", "15",
786 "16", "17", "18", "19", "20", "21", "22", "23",
787 "24", "25", "26", "27", "28", "29", "30", "31",
788 "0", "1", "2", "3", "4", "5", "6", "7",
789 "8", "9", "10", "11", "12", "13", "14", "15",
790 "16", "17", "18", "19", "20", "21", "22", "23",
791 "24", "25", "26", "27", "28", "29", "30", "31",
792 "mq", "lr", "ctr","ap",
793 "0", "1", "2", "3", "4", "5", "6", "7",
794 "xer",
795 /* AltiVec registers. */
796 "0", "1", "2", "3", "4", "5", "6", "7",
797 "8", "9", "10", "11", "12", "13", "14", "15",
798 "16", "17", "18", "19", "20", "21", "22", "23",
799 "24", "25", "26", "27", "28", "29", "30", "31",
800 "vrsave", "vscr",
801 /* SPE registers. */
802 "spe_acc", "spefscr",
803 /* Soft frame pointer. */
804 "sfp"
805 };
806
807 #ifdef TARGET_REGNAMES
808 static const char alt_reg_names[][8] =
809 {
810 "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7",
811 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
812 "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
813 "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
814 "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
815 "%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
816 "%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
817 "%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
818 "mq", "lr", "ctr", "ap",
819 "%cr0", "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
820 "xer",
821 /* AltiVec registers. */
822 "%v0", "%v1", "%v2", "%v3", "%v4", "%v5", "%v6", "%v7",
823 "%v8", "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
824 "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
825 "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
826 "vrsave", "vscr",
827 /* SPE registers. */
828 "spe_acc", "spefscr",
829 /* Soft frame pointer. */
830 "sfp"
831 };
832 #endif
833
834 #ifndef MASK_STRICT_ALIGN
835 #define MASK_STRICT_ALIGN 0
836 #endif
837 #ifndef TARGET_PROFILE_KERNEL
838 #define TARGET_PROFILE_KERNEL 0
839 #endif
840
841 /* The VRSAVE bitmask puts bit %v0 as the most significant bit. */
842 #define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
843
844 /* Initialize the GCC target structure. */
845 #undef TARGET_ATTRIBUTE_TABLE
846 #define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
847 #undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
848 #define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
849
850 #undef TARGET_ASM_ALIGNED_DI_OP
851 #define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
852
853 /* Default unaligned ops are only provided for ELF. Find the ops needed
854 for non-ELF systems. */
855 #ifndef OBJECT_FORMAT_ELF
856 #if TARGET_XCOFF
857 /* For XCOFF. rs6000_assemble_integer will handle unaligned DIs on
858 64-bit targets. */
859 #undef TARGET_ASM_UNALIGNED_HI_OP
860 #define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
861 #undef TARGET_ASM_UNALIGNED_SI_OP
862 #define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
863 #undef TARGET_ASM_UNALIGNED_DI_OP
864 #define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
865 #else
866 /* For Darwin. */
867 #undef TARGET_ASM_UNALIGNED_HI_OP
868 #define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
869 #undef TARGET_ASM_UNALIGNED_SI_OP
870 #define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
871 #undef TARGET_ASM_UNALIGNED_DI_OP
872 #define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"
873 #undef TARGET_ASM_ALIGNED_DI_OP
874 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
875 #endif
876 #endif
877
878 /* This hook deals with fixups for relocatable code and DI-mode objects
879 in 64-bit code. */
880 #undef TARGET_ASM_INTEGER
881 #define TARGET_ASM_INTEGER rs6000_assemble_integer
882
883 #ifdef HAVE_GAS_HIDDEN
884 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
885 #define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
886 #endif
887
888 #undef TARGET_HAVE_TLS
889 #define TARGET_HAVE_TLS HAVE_AS_TLS
890
891 #undef TARGET_CANNOT_FORCE_CONST_MEM
892 #define TARGET_CANNOT_FORCE_CONST_MEM rs6000_tls_referenced_p
893
894 #undef TARGET_ASM_FUNCTION_PROLOGUE
895 #define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
896 #undef TARGET_ASM_FUNCTION_EPILOGUE
897 #define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
898
899 #undef TARGET_SCHED_VARIABLE_ISSUE
900 #define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
901
902 #undef TARGET_SCHED_ISSUE_RATE
903 #define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
904 #undef TARGET_SCHED_ADJUST_COST
905 #define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
906 #undef TARGET_SCHED_ADJUST_PRIORITY
907 #define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
908 #undef TARGET_SCHED_IS_COSTLY_DEPENDENCE
909 #define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence
910 #undef TARGET_SCHED_FINISH
911 #define TARGET_SCHED_FINISH rs6000_sched_finish
912
913 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
914 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
915
916 #undef TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD
917 #define TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD rs6000_builtin_mask_for_load
918
919 #undef TARGET_VECTOR_ALIGNMENT_REACHABLE
920 #define TARGET_VECTOR_ALIGNMENT_REACHABLE rs6000_vector_alignment_reachable
921
922 #undef TARGET_INIT_BUILTINS
923 #define TARGET_INIT_BUILTINS rs6000_init_builtins
924
925 #undef TARGET_EXPAND_BUILTIN
926 #define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
927
928 #undef TARGET_MANGLE_FUNDAMENTAL_TYPE
929 #define TARGET_MANGLE_FUNDAMENTAL_TYPE rs6000_mangle_fundamental_type
930
931 #undef TARGET_INIT_LIBFUNCS
932 #define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs
933
934 #if TARGET_MACHO
935 #undef TARGET_BINDS_LOCAL_P
936 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
937 #endif
938
939 #undef TARGET_MS_BITFIELD_LAYOUT_P
940 #define TARGET_MS_BITFIELD_LAYOUT_P rs6000_ms_bitfield_layout_p
941
942 #undef TARGET_ASM_OUTPUT_MI_THUNK
943 #define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
944
945 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
946 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_tree_hwi_hwi_tree_true
947
948 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
949 #define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
950
951 #undef TARGET_INVALID_WITHIN_DOLOOP
952 #define TARGET_INVALID_WITHIN_DOLOOP rs6000_invalid_within_doloop
953
954 #undef TARGET_RTX_COSTS
955 #define TARGET_RTX_COSTS rs6000_rtx_costs
956 #undef TARGET_ADDRESS_COST
957 #define TARGET_ADDRESS_COST hook_int_rtx_0
958
959 #undef TARGET_VECTOR_OPAQUE_P
960 #define TARGET_VECTOR_OPAQUE_P rs6000_is_opaque_type
961
962 #undef TARGET_DWARF_REGISTER_SPAN
963 #define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
964
965 /* On rs6000, function arguments are promoted, as are function return
966 values. */
967 #undef TARGET_PROMOTE_FUNCTION_ARGS
968 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
969 #undef TARGET_PROMOTE_FUNCTION_RETURN
970 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
971
972 #undef TARGET_RETURN_IN_MEMORY
973 #define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory
974
975 #undef TARGET_SETUP_INCOMING_VARARGS
976 #define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs
977
978 /* Always strict argument naming on rs6000. */
979 #undef TARGET_STRICT_ARGUMENT_NAMING
980 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
981 #undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
982 #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
983 #undef TARGET_SPLIT_COMPLEX_ARG
984 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_tree_true
985 #undef TARGET_MUST_PASS_IN_STACK
986 #define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack
987 #undef TARGET_PASS_BY_REFERENCE
988 #define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference
989 #undef TARGET_ARG_PARTIAL_BYTES
990 #define TARGET_ARG_PARTIAL_BYTES rs6000_arg_partial_bytes
991
992 #undef TARGET_BUILD_BUILTIN_VA_LIST
993 #define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list
994
995 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
996 #define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
997
998 #undef TARGET_EH_RETURN_FILTER_MODE
999 #define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
1000
1001 #undef TARGET_SCALAR_MODE_SUPPORTED_P
1002 #define TARGET_SCALAR_MODE_SUPPORTED_P rs6000_scalar_mode_supported_p
1003
1004 #undef TARGET_VECTOR_MODE_SUPPORTED_P
1005 #define TARGET_VECTOR_MODE_SUPPORTED_P rs6000_vector_mode_supported_p
1006
1007 #undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
1008 #define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN invalid_arg_for_unprototyped_fn
1009
1010 #undef TARGET_HANDLE_OPTION
1011 #define TARGET_HANDLE_OPTION rs6000_handle_option
1012
1013 #undef TARGET_DEFAULT_TARGET_FLAGS
1014 #define TARGET_DEFAULT_TARGET_FLAGS \
1015 (TARGET_DEFAULT)
1016
1017 #undef TARGET_STACK_PROTECT_FAIL
1018 #define TARGET_STACK_PROTECT_FAIL rs6000_stack_protect_fail
1019
1020 /* MPC604EUM 3.5.2 Weak Consistency between Multiple Processors
1021 The PowerPC architecture requires only weak consistency among
1022 processors--that is, memory accesses between processors need not be
1023 sequentially consistent and memory accesses among processors can occur
1024 in any order. The ability to order memory accesses weakly provides
1025 opportunities for more efficient use of the system bus. Unless a
1026 dependency exists, the 604e allows read operations to precede store
1027 operations. */
1028 #undef TARGET_RELAXED_ORDERING
1029 #define TARGET_RELAXED_ORDERING true
1030
1031 #ifdef HAVE_AS_TLS
1032 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
1033 #define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel
1034 #endif
1035
1036 /* Use a 32-bit anchor range. This leads to sequences like:
1037
1038 addis tmp,anchor,high
1039 add dest,tmp,low
1040
1041 where tmp itself acts as an anchor, and can be shared between
1042 accesses to the same 64k page. */
1043 #undef TARGET_MIN_ANCHOR_OFFSET
1044 #define TARGET_MIN_ANCHOR_OFFSET -0x7fffffff - 1
1045 #undef TARGET_MAX_ANCHOR_OFFSET
1046 #define TARGET_MAX_ANCHOR_OFFSET 0x7fffffff
1047 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
1048 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P rs6000_use_blocks_for_constant_p
1049
1050 struct gcc_target targetm = TARGET_INITIALIZER;
1051
1052
1053 /* Value is 1 if hard register REGNO can hold a value of machine-mode
1054 MODE. */
1055 static int
rs6000_hard_regno_mode_ok(int regno,enum machine_mode mode)1056 rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
1057 {
1058 /* The GPRs can hold any mode, but values bigger than one register
1059 cannot go past R31. */
1060 if (INT_REGNO_P (regno))
1061 return INT_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1);
1062
1063 /* The float registers can only hold floating modes and DImode.
1064 This also excludes decimal float modes. */
1065 if (FP_REGNO_P (regno))
1066 return
1067 (SCALAR_FLOAT_MODE_P (mode)
1068 && !DECIMAL_FLOAT_MODE_P (mode)
1069 && FP_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1))
1070 || (GET_MODE_CLASS (mode) == MODE_INT
1071 && GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD);
1072
1073 /* The CR register can only hold CC modes. */
1074 if (CR_REGNO_P (regno))
1075 return GET_MODE_CLASS (mode) == MODE_CC;
1076
1077 if (XER_REGNO_P (regno))
1078 return mode == PSImode;
1079
1080 /* AltiVec only in AldyVec registers. */
1081 if (ALTIVEC_REGNO_P (regno))
1082 return ALTIVEC_VECTOR_MODE (mode);
1083
1084 /* ...but GPRs can hold SIMD data on the SPE in one register. */
1085 if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1086 return 1;
1087
1088 /* We cannot put TImode anywhere except general register and it must be
1089 able to fit within the register set. */
1090
1091 return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;
1092 }
1093
1094 /* Initialize rs6000_hard_regno_mode_ok_p table. */
1095 static void
rs6000_init_hard_regno_mode_ok(void)1096 rs6000_init_hard_regno_mode_ok (void)
1097 {
1098 int r, m;
1099
1100 for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
1101 for (m = 0; m < NUM_MACHINE_MODES; ++m)
1102 if (rs6000_hard_regno_mode_ok (r, m))
1103 rs6000_hard_regno_mode_ok_p[m][r] = true;
1104 }
1105
1106 /* If not otherwise specified by a target, make 'long double' equivalent to
1107 'double'. */
1108
1109 #ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
1110 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
1111 #endif
1112
1113 /* Override command line options. Mostly we process the processor
1114 type and sometimes adjust other TARGET_ options. */
1115
1116 void
rs6000_override_options(const char * default_cpu)1117 rs6000_override_options (const char *default_cpu)
1118 {
1119 size_t i, j;
1120 struct rs6000_cpu_select *ptr;
1121 int set_masks;
1122
1123 /* Simplifications for entries below. */
1124
1125 enum {
1126 POWERPC_BASE_MASK = MASK_POWERPC | MASK_NEW_MNEMONICS,
1127 POWERPC_7400_MASK = POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_ALTIVEC
1128 };
1129
1130 /* This table occasionally claims that a processor does not support
1131 a particular feature even though it does, but the feature is slower
1132 than the alternative. Thus, it shouldn't be relied on as a
1133 complete description of the processor's support.
1134
1135 Please keep this list in order, and don't forget to update the
1136 documentation in invoke.texi when adding a new processor or
1137 flag. */
1138 static struct ptt
1139 {
1140 const char *const name; /* Canonical processor name. */
1141 const enum processor_type processor; /* Processor type enum value. */
1142 const int target_enable; /* Target flags to enable. */
1143 } const processor_target_table[]
1144 = {{"401", PROCESSOR_PPC403, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1145 {"403", PROCESSOR_PPC403,
1146 POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_STRICT_ALIGN},
1147 {"405", PROCESSOR_PPC405,
1148 POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
1149 {"405fp", PROCESSOR_PPC405,
1150 POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1151 {"440", PROCESSOR_PPC440,
1152 POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
1153 {"440fp", PROCESSOR_PPC440,
1154 POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1155 {"505", PROCESSOR_MPCCORE, POWERPC_BASE_MASK},
1156 {"601", PROCESSOR_PPC601,
1157 MASK_POWER | POWERPC_BASE_MASK | MASK_MULTIPLE | MASK_STRING},
1158 {"602", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1159 {"603", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1160 {"603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1161 {"604", PROCESSOR_PPC604, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1162 {"604e", PROCESSOR_PPC604e, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1163 {"620", PROCESSOR_PPC620,
1164 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1165 {"630", PROCESSOR_PPC630,
1166 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1167 {"740", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1168 {"7400", PROCESSOR_PPC7400, POWERPC_7400_MASK},
1169 {"7450", PROCESSOR_PPC7450, POWERPC_7400_MASK},
1170 {"750", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1171 {"801", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1172 {"821", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1173 {"823", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1174 {"8540", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN},
1175 /* 8548 has a dummy entry for now. */
1176 {"8548", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN},
1177 {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1178 {"970", PROCESSOR_POWER4,
1179 POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1180 {"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS},
1181 {"ec603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1182 {"G3", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1183 {"G4", PROCESSOR_PPC7450, POWERPC_7400_MASK},
1184 {"G5", PROCESSOR_POWER4,
1185 POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1186 {"power", PROCESSOR_POWER, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1187 {"power2", PROCESSOR_POWER,
1188 MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1189 {"power3", PROCESSOR_PPC630,
1190 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1191 {"power4", PROCESSOR_POWER4,
1192 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POWERPC64},
1193 {"power5", PROCESSOR_POWER5,
1194 POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GFXOPT
1195 | MASK_MFCRF | MASK_POPCNTB},
1196 {"power5+", PROCESSOR_POWER5,
1197 POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GFXOPT
1198 | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND},
1199 {"power6", PROCESSOR_POWER5,
1200 POWERPC_7400_MASK | MASK_POWERPC64 | MASK_MFCRF | MASK_POPCNTB
1201 | MASK_FPRND},
1202 {"powerpc", PROCESSOR_POWERPC, POWERPC_BASE_MASK},
1203 {"powerpc64", PROCESSOR_POWERPC64,
1204 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1205 {"rios", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1206 {"rios1", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1207 {"rios2", PROCESSOR_RIOS2,
1208 MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1209 {"rsc", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1210 {"rsc1", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1211 {"rs64", PROCESSOR_RS64A,
1212 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64}
1213 };
1214
1215 const size_t ptt_size = ARRAY_SIZE (processor_target_table);
1216
1217 /* Some OSs don't support saving the high part of 64-bit registers on
1218 context switch. Other OSs don't support saving Altivec registers.
1219 On those OSs, we don't touch the MASK_POWERPC64 or MASK_ALTIVEC
1220 settings; if the user wants either, the user must explicitly specify
1221 them and we won't interfere with the user's specification. */
1222
1223 enum {
1224 POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
1225 POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT | MASK_STRICT_ALIGN
1226 | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
1227 | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_MULHW
1228 | MASK_DLMZB)
1229 };
1230
1231 rs6000_init_hard_regno_mode_ok ();
1232
1233 set_masks = POWER_MASKS | POWERPC_MASKS | MASK_SOFT_FLOAT;
1234 #ifdef OS_MISSING_POWERPC64
1235 if (OS_MISSING_POWERPC64)
1236 set_masks &= ~MASK_POWERPC64;
1237 #endif
1238 #ifdef OS_MISSING_ALTIVEC
1239 if (OS_MISSING_ALTIVEC)
1240 set_masks &= ~MASK_ALTIVEC;
1241 #endif
1242
1243 /* Don't override by the processor default if given explicitly. */
1244 set_masks &= ~target_flags_explicit;
1245
1246 /* Identify the processor type. */
1247 rs6000_select[0].string = default_cpu;
1248 rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
1249
1250 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
1251 {
1252 ptr = &rs6000_select[i];
1253 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
1254 {
1255 for (j = 0; j < ptt_size; j++)
1256 if (! strcmp (ptr->string, processor_target_table[j].name))
1257 {
1258 if (ptr->set_tune_p)
1259 rs6000_cpu = processor_target_table[j].processor;
1260
1261 if (ptr->set_arch_p)
1262 {
1263 target_flags &= ~set_masks;
1264 target_flags |= (processor_target_table[j].target_enable
1265 & set_masks);
1266 }
1267 break;
1268 }
1269
1270 if (j == ptt_size)
1271 error ("bad value (%s) for %s switch", ptr->string, ptr->name);
1272 }
1273 }
1274
1275 if (TARGET_E500)
1276 rs6000_isel = 1;
1277
1278 /* If we are optimizing big endian systems for space, use the load/store
1279 multiple and string instructions. */
1280 if (BYTES_BIG_ENDIAN && optimize_size)
1281 target_flags |= ~target_flags_explicit & (MASK_MULTIPLE | MASK_STRING);
1282
1283 /* Don't allow -mmultiple or -mstring on little endian systems
1284 unless the cpu is a 750, because the hardware doesn't support the
1285 instructions used in little endian mode, and causes an alignment
1286 trap. The 750 does not cause an alignment trap (except when the
1287 target is unaligned). */
1288
1289 if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
1290 {
1291 if (TARGET_MULTIPLE)
1292 {
1293 target_flags &= ~MASK_MULTIPLE;
1294 if ((target_flags_explicit & MASK_MULTIPLE) != 0)
1295 warning (0, "-mmultiple is not supported on little endian systems");
1296 }
1297
1298 if (TARGET_STRING)
1299 {
1300 target_flags &= ~MASK_STRING;
1301 if ((target_flags_explicit & MASK_STRING) != 0)
1302 warning (0, "-mstring is not supported on little endian systems");
1303 }
1304 }
1305
1306 /* Set debug flags */
1307 if (rs6000_debug_name)
1308 {
1309 if (! strcmp (rs6000_debug_name, "all"))
1310 rs6000_debug_stack = rs6000_debug_arg = 1;
1311 else if (! strcmp (rs6000_debug_name, "stack"))
1312 rs6000_debug_stack = 1;
1313 else if (! strcmp (rs6000_debug_name, "arg"))
1314 rs6000_debug_arg = 1;
1315 else
1316 error ("unknown -mdebug-%s switch", rs6000_debug_name);
1317 }
1318
1319 if (rs6000_traceback_name)
1320 {
1321 if (! strncmp (rs6000_traceback_name, "full", 4))
1322 rs6000_traceback = traceback_full;
1323 else if (! strncmp (rs6000_traceback_name, "part", 4))
1324 rs6000_traceback = traceback_part;
1325 else if (! strncmp (rs6000_traceback_name, "no", 2))
1326 rs6000_traceback = traceback_none;
1327 else
1328 error ("unknown -mtraceback arg %qs; expecting %<full%>, %<partial%> or %<none%>",
1329 rs6000_traceback_name);
1330 }
1331
1332 if (!rs6000_explicit_options.long_double)
1333 rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
1334
1335 #ifndef POWERPC_LINUX
1336 if (!rs6000_explicit_options.ieee)
1337 rs6000_ieeequad = 1;
1338 #endif
1339
1340 /* Set Altivec ABI as default for powerpc64 linux. */
1341 if (TARGET_ELF && TARGET_64BIT)
1342 {
1343 rs6000_altivec_abi = 1;
1344 TARGET_ALTIVEC_VRSAVE = 1;
1345 }
1346
1347 /* Set the Darwin64 ABI as default for 64-bit Darwin. */
1348 if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
1349 {
1350 rs6000_darwin64_abi = 1;
1351 #if TARGET_MACHO
1352 darwin_one_byte_bool = 1;
1353 #endif
1354 /* Default to natural alignment, for better performance. */
1355 rs6000_alignment_flags = MASK_ALIGN_NATURAL;
1356 }
1357
1358 /* Place FP constants in the constant pool instead of TOC
1359 if section anchors enabled. */
1360 if (flag_section_anchors)
1361 TARGET_NO_FP_IN_TOC = 1;
1362
1363 /* Handle -mtls-size option. */
1364 rs6000_parse_tls_size_option ();
1365
1366 #ifdef SUBTARGET_OVERRIDE_OPTIONS
1367 SUBTARGET_OVERRIDE_OPTIONS;
1368 #endif
1369 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
1370 SUBSUBTARGET_OVERRIDE_OPTIONS;
1371 #endif
1372 #ifdef SUB3TARGET_OVERRIDE_OPTIONS
1373 SUB3TARGET_OVERRIDE_OPTIONS;
1374 #endif
1375
1376 if (TARGET_E500)
1377 {
1378 if (TARGET_ALTIVEC)
1379 error ("AltiVec and E500 instructions cannot coexist");
1380
1381 /* The e500 does not have string instructions, and we set
1382 MASK_STRING above when optimizing for size. */
1383 if ((target_flags & MASK_STRING) != 0)
1384 target_flags = target_flags & ~MASK_STRING;
1385 }
1386 else if (rs6000_select[1].string != NULL)
1387 {
1388 /* For the powerpc-eabispe configuration, we set all these by
1389 default, so let's unset them if we manually set another
1390 CPU that is not the E500. */
1391 if (!rs6000_explicit_options.abi)
1392 rs6000_spe_abi = 0;
1393 if (!rs6000_explicit_options.spe)
1394 rs6000_spe = 0;
1395 if (!rs6000_explicit_options.float_gprs)
1396 rs6000_float_gprs = 0;
1397 if (!rs6000_explicit_options.isel)
1398 rs6000_isel = 0;
1399 if (!rs6000_explicit_options.long_double)
1400 rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
1401 }
1402
1403 rs6000_always_hint = (rs6000_cpu != PROCESSOR_POWER4
1404 && rs6000_cpu != PROCESSOR_POWER5);
1405 rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4
1406 || rs6000_cpu == PROCESSOR_POWER5);
1407
1408 rs6000_sched_restricted_insns_priority
1409 = (rs6000_sched_groups ? 1 : 0);
1410
1411 /* Handle -msched-costly-dep option. */
1412 rs6000_sched_costly_dep
1413 = (rs6000_sched_groups ? store_to_load_dep_costly : no_dep_costly);
1414
1415 if (rs6000_sched_costly_dep_str)
1416 {
1417 if (! strcmp (rs6000_sched_costly_dep_str, "no"))
1418 rs6000_sched_costly_dep = no_dep_costly;
1419 else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
1420 rs6000_sched_costly_dep = all_deps_costly;
1421 else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
1422 rs6000_sched_costly_dep = true_store_to_load_dep_costly;
1423 else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
1424 rs6000_sched_costly_dep = store_to_load_dep_costly;
1425 else
1426 rs6000_sched_costly_dep = atoi (rs6000_sched_costly_dep_str);
1427 }
1428
1429 /* Handle -minsert-sched-nops option. */
1430 rs6000_sched_insert_nops
1431 = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
1432
1433 if (rs6000_sched_insert_nops_str)
1434 {
1435 if (! strcmp (rs6000_sched_insert_nops_str, "no"))
1436 rs6000_sched_insert_nops = sched_finish_none;
1437 else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
1438 rs6000_sched_insert_nops = sched_finish_pad_groups;
1439 else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
1440 rs6000_sched_insert_nops = sched_finish_regroup_exact;
1441 else
1442 rs6000_sched_insert_nops = atoi (rs6000_sched_insert_nops_str);
1443 }
1444
1445 #ifdef TARGET_REGNAMES
1446 /* If the user desires alternate register names, copy in the
1447 alternate names now. */
1448 if (TARGET_REGNAMES)
1449 memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
1450 #endif
1451
1452 /* Set aix_struct_return last, after the ABI is determined.
1453 If -maix-struct-return or -msvr4-struct-return was explicitly
1454 used, don't override with the ABI default. */
1455 if (!rs6000_explicit_options.aix_struct_ret)
1456 aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
1457
1458 if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
1459 REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
1460
1461 if (TARGET_TOC)
1462 ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
1463
1464 /* We can only guarantee the availability of DI pseudo-ops when
1465 assembling for 64-bit targets. */
1466 if (!TARGET_64BIT)
1467 {
1468 targetm.asm_out.aligned_op.di = NULL;
1469 targetm.asm_out.unaligned_op.di = NULL;
1470 }
1471
1472 /* Set branch target alignment, if not optimizing for size. */
1473 if (!optimize_size)
1474 {
1475 if (rs6000_sched_groups)
1476 {
1477 if (align_functions <= 0)
1478 align_functions = 16;
1479 if (align_jumps <= 0)
1480 align_jumps = 16;
1481 if (align_loops <= 0)
1482 align_loops = 16;
1483 }
1484 if (align_jumps_max_skip <= 0)
1485 align_jumps_max_skip = 15;
1486 if (align_loops_max_skip <= 0)
1487 align_loops_max_skip = 15;
1488 }
1489
1490 /* Arrange to save and restore machine status around nested functions. */
1491 init_machine_status = rs6000_init_machine_status;
1492
1493 /* We should always be splitting complex arguments, but we can't break
1494 Linux and Darwin ABIs at the moment. For now, only AIX is fixed. */
1495 if (DEFAULT_ABI != ABI_AIX)
1496 targetm.calls.split_complex_arg = NULL;
1497
1498 /* Initialize rs6000_cost with the appropriate target costs. */
1499 if (optimize_size)
1500 rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
1501 else
1502 switch (rs6000_cpu)
1503 {
1504 case PROCESSOR_RIOS1:
1505 rs6000_cost = &rios1_cost;
1506 break;
1507
1508 case PROCESSOR_RIOS2:
1509 rs6000_cost = &rios2_cost;
1510 break;
1511
1512 case PROCESSOR_RS64A:
1513 rs6000_cost = &rs64a_cost;
1514 break;
1515
1516 case PROCESSOR_MPCCORE:
1517 rs6000_cost = &mpccore_cost;
1518 break;
1519
1520 case PROCESSOR_PPC403:
1521 rs6000_cost = &ppc403_cost;
1522 break;
1523
1524 case PROCESSOR_PPC405:
1525 rs6000_cost = &ppc405_cost;
1526 break;
1527
1528 case PROCESSOR_PPC440:
1529 rs6000_cost = &ppc440_cost;
1530 break;
1531
1532 case PROCESSOR_PPC601:
1533 rs6000_cost = &ppc601_cost;
1534 break;
1535
1536 case PROCESSOR_PPC603:
1537 rs6000_cost = &ppc603_cost;
1538 break;
1539
1540 case PROCESSOR_PPC604:
1541 rs6000_cost = &ppc604_cost;
1542 break;
1543
1544 case PROCESSOR_PPC604e:
1545 rs6000_cost = &ppc604e_cost;
1546 break;
1547
1548 case PROCESSOR_PPC620:
1549 rs6000_cost = &ppc620_cost;
1550 break;
1551
1552 case PROCESSOR_PPC630:
1553 rs6000_cost = &ppc630_cost;
1554 break;
1555
1556 case PROCESSOR_PPC750:
1557 case PROCESSOR_PPC7400:
1558 rs6000_cost = &ppc750_cost;
1559 break;
1560
1561 case PROCESSOR_PPC7450:
1562 rs6000_cost = &ppc7450_cost;
1563 break;
1564
1565 case PROCESSOR_PPC8540:
1566 rs6000_cost = &ppc8540_cost;
1567 break;
1568
1569 case PROCESSOR_POWER4:
1570 case PROCESSOR_POWER5:
1571 rs6000_cost = &power4_cost;
1572 break;
1573
1574 default:
1575 gcc_unreachable ();
1576 }
1577 }
1578
1579 /* Implement targetm.vectorize.builtin_mask_for_load. */
1580 static tree
rs6000_builtin_mask_for_load(void)1581 rs6000_builtin_mask_for_load (void)
1582 {
1583 if (TARGET_ALTIVEC)
1584 return altivec_builtin_mask_for_load;
1585 else
1586 return 0;
1587 }
1588
1589
1590 /* Return true iff, data reference of TYPE can reach vector alignment (16)
1591 after applying N number of iterations. This routine does not determine
1592 how may iterations are required to reach desired alignment. */
1593
1594 static bool
rs6000_vector_alignment_reachable(tree type ATTRIBUTE_UNUSED,bool is_packed)1595 rs6000_vector_alignment_reachable (tree type ATTRIBUTE_UNUSED, bool is_packed)
1596 {
1597 if (is_packed)
1598 return false;
1599
1600 if (TARGET_32BIT)
1601 {
1602 if (rs6000_alignment_flags == MASK_ALIGN_NATURAL)
1603 return true;
1604
1605 if (rs6000_alignment_flags == MASK_ALIGN_POWER)
1606 return true;
1607
1608 return false;
1609 }
1610 else
1611 {
1612 if (TARGET_MACHO)
1613 return false;
1614
1615 /* Assuming that all other types are naturally aligned. CHECKME! */
1616 return true;
1617 }
1618 }
1619
1620 /* Handle generic options of the form -mfoo=yes/no.
1621 NAME is the option name.
1622 VALUE is the option value.
1623 FLAG is the pointer to the flag where to store a 1 or 0, depending on
1624 whether the option value is 'yes' or 'no' respectively. */
1625 static void
rs6000_parse_yes_no_option(const char * name,const char * value,int * flag)1626 rs6000_parse_yes_no_option (const char *name, const char *value, int *flag)
1627 {
1628 if (value == 0)
1629 return;
1630 else if (!strcmp (value, "yes"))
1631 *flag = 1;
1632 else if (!strcmp (value, "no"))
1633 *flag = 0;
1634 else
1635 error ("unknown -m%s= option specified: '%s'", name, value);
1636 }
1637
1638 /* Validate and record the size specified with the -mtls-size option. */
1639
1640 static void
rs6000_parse_tls_size_option(void)1641 rs6000_parse_tls_size_option (void)
1642 {
1643 if (rs6000_tls_size_string == 0)
1644 return;
1645 else if (strcmp (rs6000_tls_size_string, "16") == 0)
1646 rs6000_tls_size = 16;
1647 else if (strcmp (rs6000_tls_size_string, "32") == 0)
1648 rs6000_tls_size = 32;
1649 else if (strcmp (rs6000_tls_size_string, "64") == 0)
1650 rs6000_tls_size = 64;
1651 else
1652 error ("bad value %qs for -mtls-size switch", rs6000_tls_size_string);
1653 }
1654
1655 void
optimization_options(int level ATTRIBUTE_UNUSED,int size ATTRIBUTE_UNUSED)1656 optimization_options (int level ATTRIBUTE_UNUSED, int size ATTRIBUTE_UNUSED)
1657 {
1658 if (DEFAULT_ABI == ABI_DARWIN)
1659 /* The Darwin libraries never set errno, so we might as well
1660 avoid calling them when that's the only reason we would. */
1661 flag_errno_math = 0;
1662
1663 /* Double growth factor to counter reduced min jump length. */
1664 set_param_value ("max-grow-copy-bb-insns", 16);
1665
1666 /* Enable section anchors by default.
1667 Skip section anchors for Objective C and Objective C++
1668 until front-ends fixed. */
1669 if (!TARGET_MACHO && lang_hooks.name[4] != 'O')
1670 flag_section_anchors = 1;
1671 }
1672
1673 /* Implement TARGET_HANDLE_OPTION. */
1674
1675 static bool
rs6000_handle_option(size_t code,const char * arg,int value)1676 rs6000_handle_option (size_t code, const char *arg, int value)
1677 {
1678 switch (code)
1679 {
1680 case OPT_mno_power:
1681 target_flags &= ~(MASK_POWER | MASK_POWER2
1682 | MASK_MULTIPLE | MASK_STRING);
1683 target_flags_explicit |= (MASK_POWER | MASK_POWER2
1684 | MASK_MULTIPLE | MASK_STRING);
1685 break;
1686 case OPT_mno_powerpc:
1687 target_flags &= ~(MASK_POWERPC | MASK_PPC_GPOPT
1688 | MASK_PPC_GFXOPT | MASK_POWERPC64);
1689 target_flags_explicit |= (MASK_POWERPC | MASK_PPC_GPOPT
1690 | MASK_PPC_GFXOPT | MASK_POWERPC64);
1691 break;
1692 case OPT_mfull_toc:
1693 target_flags &= ~MASK_MINIMAL_TOC;
1694 TARGET_NO_FP_IN_TOC = 0;
1695 TARGET_NO_SUM_IN_TOC = 0;
1696 target_flags_explicit |= MASK_MINIMAL_TOC;
1697 #ifdef TARGET_USES_SYSV4_OPT
1698 /* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be
1699 just the same as -mminimal-toc. */
1700 target_flags |= MASK_MINIMAL_TOC;
1701 target_flags_explicit |= MASK_MINIMAL_TOC;
1702 #endif
1703 break;
1704
1705 #ifdef TARGET_USES_SYSV4_OPT
1706 case OPT_mtoc:
1707 /* Make -mtoc behave like -mminimal-toc. */
1708 target_flags |= MASK_MINIMAL_TOC;
1709 target_flags_explicit |= MASK_MINIMAL_TOC;
1710 break;
1711 #endif
1712
1713 #ifdef TARGET_USES_AIX64_OPT
1714 case OPT_maix64:
1715 #else
1716 case OPT_m64:
1717 #endif
1718 target_flags |= MASK_POWERPC64 | MASK_POWERPC;
1719 target_flags |= ~target_flags_explicit & MASK_PPC_GFXOPT;
1720 target_flags_explicit |= MASK_POWERPC64 | MASK_POWERPC;
1721 break;
1722
1723 #ifdef TARGET_USES_AIX64_OPT
1724 case OPT_maix32:
1725 #else
1726 case OPT_m32:
1727 #endif
1728 target_flags &= ~MASK_POWERPC64;
1729 target_flags_explicit |= MASK_POWERPC64;
1730 break;
1731
1732 case OPT_minsert_sched_nops_:
1733 rs6000_sched_insert_nops_str = arg;
1734 break;
1735
1736 case OPT_mminimal_toc:
1737 if (value == 1)
1738 {
1739 TARGET_NO_FP_IN_TOC = 0;
1740 TARGET_NO_SUM_IN_TOC = 0;
1741 }
1742 break;
1743
1744 case OPT_mpower:
1745 if (value == 1)
1746 {
1747 target_flags |= (MASK_MULTIPLE | MASK_STRING);
1748 target_flags_explicit |= (MASK_MULTIPLE | MASK_STRING);
1749 }
1750 break;
1751
1752 case OPT_mpower2:
1753 if (value == 1)
1754 {
1755 target_flags |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
1756 target_flags_explicit |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
1757 }
1758 break;
1759
1760 case OPT_mpowerpc_gpopt:
1761 case OPT_mpowerpc_gfxopt:
1762 if (value == 1)
1763 {
1764 target_flags |= MASK_POWERPC;
1765 target_flags_explicit |= MASK_POWERPC;
1766 }
1767 break;
1768
1769 case OPT_maix_struct_return:
1770 case OPT_msvr4_struct_return:
1771 rs6000_explicit_options.aix_struct_ret = true;
1772 break;
1773
1774 case OPT_mvrsave_:
1775 rs6000_parse_yes_no_option ("vrsave", arg, &(TARGET_ALTIVEC_VRSAVE));
1776 break;
1777
1778 case OPT_misel_:
1779 rs6000_explicit_options.isel = true;
1780 rs6000_parse_yes_no_option ("isel", arg, &(rs6000_isel));
1781 break;
1782
1783 case OPT_mspe_:
1784 rs6000_explicit_options.spe = true;
1785 rs6000_parse_yes_no_option ("spe", arg, &(rs6000_spe));
1786 /* No SPE means 64-bit long doubles, even if an E500. */
1787 if (!rs6000_spe)
1788 rs6000_long_double_type_size = 64;
1789 break;
1790
1791 case OPT_mdebug_:
1792 rs6000_debug_name = arg;
1793 break;
1794
1795 #ifdef TARGET_USES_SYSV4_OPT
1796 case OPT_mcall_:
1797 rs6000_abi_name = arg;
1798 break;
1799
1800 case OPT_msdata_:
1801 rs6000_sdata_name = arg;
1802 break;
1803
1804 case OPT_mtls_size_:
1805 rs6000_tls_size_string = arg;
1806 break;
1807
1808 case OPT_mrelocatable:
1809 if (value == 1)
1810 {
1811 target_flags |= MASK_MINIMAL_TOC;
1812 target_flags_explicit |= MASK_MINIMAL_TOC;
1813 TARGET_NO_FP_IN_TOC = 1;
1814 }
1815 break;
1816
1817 case OPT_mrelocatable_lib:
1818 if (value == 1)
1819 {
1820 target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
1821 target_flags_explicit |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
1822 TARGET_NO_FP_IN_TOC = 1;
1823 }
1824 else
1825 {
1826 target_flags &= ~MASK_RELOCATABLE;
1827 target_flags_explicit |= MASK_RELOCATABLE;
1828 }
1829 break;
1830 #endif
1831
1832 case OPT_mabi_:
1833 if (!strcmp (arg, "altivec"))
1834 {
1835 rs6000_explicit_options.abi = true;
1836 rs6000_altivec_abi = 1;
1837 rs6000_spe_abi = 0;
1838 }
1839 else if (! strcmp (arg, "no-altivec"))
1840 {
1841 /* ??? Don't set rs6000_explicit_options.abi here, to allow
1842 the default for rs6000_spe_abi to be chosen later. */
1843 rs6000_altivec_abi = 0;
1844 }
1845 else if (! strcmp (arg, "spe"))
1846 {
1847 rs6000_explicit_options.abi = true;
1848 rs6000_spe_abi = 1;
1849 rs6000_altivec_abi = 0;
1850 if (!TARGET_SPE_ABI)
1851 error ("not configured for ABI: '%s'", arg);
1852 }
1853 else if (! strcmp (arg, "no-spe"))
1854 {
1855 rs6000_explicit_options.abi = true;
1856 rs6000_spe_abi = 0;
1857 }
1858
1859 /* These are here for testing during development only, do not
1860 document in the manual please. */
1861 else if (! strcmp (arg, "d64"))
1862 {
1863 rs6000_darwin64_abi = 1;
1864 warning (0, "Using darwin64 ABI");
1865 }
1866 else if (! strcmp (arg, "d32"))
1867 {
1868 rs6000_darwin64_abi = 0;
1869 warning (0, "Using old darwin ABI");
1870 }
1871
1872 else if (! strcmp (arg, "ibmlongdouble"))
1873 {
1874 rs6000_explicit_options.ieee = true;
1875 rs6000_ieeequad = 0;
1876 warning (0, "Using IBM extended precision long double");
1877 }
1878 else if (! strcmp (arg, "ieeelongdouble"))
1879 {
1880 rs6000_explicit_options.ieee = true;
1881 rs6000_ieeequad = 1;
1882 warning (0, "Using IEEE extended precision long double");
1883 }
1884
1885 else
1886 {
1887 error ("unknown ABI specified: '%s'", arg);
1888 return false;
1889 }
1890 break;
1891
1892 case OPT_mcpu_:
1893 rs6000_select[1].string = arg;
1894 break;
1895
1896 case OPT_mtune_:
1897 rs6000_select[2].string = arg;
1898 break;
1899
1900 case OPT_mtraceback_:
1901 rs6000_traceback_name = arg;
1902 break;
1903
1904 case OPT_mfloat_gprs_:
1905 rs6000_explicit_options.float_gprs = true;
1906 if (! strcmp (arg, "yes") || ! strcmp (arg, "single"))
1907 rs6000_float_gprs = 1;
1908 else if (! strcmp (arg, "double"))
1909 rs6000_float_gprs = 2;
1910 else if (! strcmp (arg, "no"))
1911 rs6000_float_gprs = 0;
1912 else
1913 {
1914 error ("invalid option for -mfloat-gprs: '%s'", arg);
1915 return false;
1916 }
1917 break;
1918
1919 case OPT_mlong_double_:
1920 rs6000_explicit_options.long_double = true;
1921 rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
1922 if (value != 64 && value != 128)
1923 {
1924 error ("Unknown switch -mlong-double-%s", arg);
1925 rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
1926 return false;
1927 }
1928 else
1929 rs6000_long_double_type_size = value;
1930 break;
1931
1932 case OPT_msched_costly_dep_:
1933 rs6000_sched_costly_dep_str = arg;
1934 break;
1935
1936 case OPT_malign_:
1937 rs6000_explicit_options.alignment = true;
1938 if (! strcmp (arg, "power"))
1939 {
1940 /* On 64-bit Darwin, power alignment is ABI-incompatible with
1941 some C library functions, so warn about it. The flag may be
1942 useful for performance studies from time to time though, so
1943 don't disable it entirely. */
1944 if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
1945 warning (0, "-malign-power is not supported for 64-bit Darwin;"
1946 " it is incompatible with the installed C and C++ libraries");
1947 rs6000_alignment_flags = MASK_ALIGN_POWER;
1948 }
1949 else if (! strcmp (arg, "natural"))
1950 rs6000_alignment_flags = MASK_ALIGN_NATURAL;
1951 else
1952 {
1953 error ("unknown -malign-XXXXX option specified: '%s'", arg);
1954 return false;
1955 }
1956 break;
1957 }
1958 return true;
1959 }
1960
1961 /* Do anything needed at the start of the asm file. */
1962
1963 static void
rs6000_file_start(void)1964 rs6000_file_start (void)
1965 {
1966 size_t i;
1967 char buffer[80];
1968 const char *start = buffer;
1969 struct rs6000_cpu_select *ptr;
1970 const char *default_cpu = TARGET_CPU_DEFAULT;
1971 FILE *file = asm_out_file;
1972
1973 default_file_start ();
1974
1975 #ifdef TARGET_BI_ARCH
1976 if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
1977 default_cpu = 0;
1978 #endif
1979
1980 if (flag_verbose_asm)
1981 {
1982 sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
1983 rs6000_select[0].string = default_cpu;
1984
1985 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
1986 {
1987 ptr = &rs6000_select[i];
1988 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
1989 {
1990 fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
1991 start = "";
1992 }
1993 }
1994
1995 if (PPC405_ERRATUM77)
1996 {
1997 fprintf (file, "%s PPC405CR_ERRATUM77", start);
1998 start = "";
1999 }
2000
2001 #ifdef USING_ELFOS_H
2002 switch (rs6000_sdata)
2003 {
2004 case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
2005 case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
2006 case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
2007 case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
2008 }
2009
2010 if (rs6000_sdata && g_switch_value)
2011 {
2012 fprintf (file, "%s -G " HOST_WIDE_INT_PRINT_UNSIGNED, start,
2013 g_switch_value);
2014 start = "";
2015 }
2016 #endif
2017
2018 if (*start == '\0')
2019 putc ('\n', file);
2020 }
2021
2022 if (DEFAULT_ABI == ABI_AIX || (TARGET_ELF && flag_pic == 2))
2023 {
2024 switch_to_section (toc_section);
2025 switch_to_section (text_section);
2026 }
2027 }
2028
2029
2030 /* Return nonzero if this function is known to have a null epilogue. */
2031
2032 int
direct_return(void)2033 direct_return (void)
2034 {
2035 if (reload_completed)
2036 {
2037 rs6000_stack_t *info = rs6000_stack_info ();
2038
2039 if (info->first_gp_reg_save == 32
2040 && info->first_fp_reg_save == 64
2041 && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
2042 && ! info->lr_save_p
2043 && ! info->cr_save_p
2044 && info->vrsave_mask == 0
2045 && ! info->push_p)
2046 return 1;
2047 }
2048
2049 return 0;
2050 }
2051
2052 /* Return the number of instructions it takes to form a constant in an
2053 integer register. */
2054
2055 int
num_insns_constant_wide(HOST_WIDE_INT value)2056 num_insns_constant_wide (HOST_WIDE_INT value)
2057 {
2058 /* signed constant loadable with {cal|addi} */
2059 if ((unsigned HOST_WIDE_INT) (value + 0x8000) < 0x10000)
2060 return 1;
2061
2062 /* constant loadable with {cau|addis} */
2063 else if ((value & 0xffff) == 0
2064 && (value >> 31 == -1 || value >> 31 == 0))
2065 return 1;
2066
2067 #if HOST_BITS_PER_WIDE_INT == 64
2068 else if (TARGET_POWERPC64)
2069 {
2070 HOST_WIDE_INT low = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
2071 HOST_WIDE_INT high = value >> 31;
2072
2073 if (high == 0 || high == -1)
2074 return 2;
2075
2076 high >>= 1;
2077
2078 if (low == 0)
2079 return num_insns_constant_wide (high) + 1;
2080 else
2081 return (num_insns_constant_wide (high)
2082 + num_insns_constant_wide (low) + 1);
2083 }
2084 #endif
2085
2086 else
2087 return 2;
2088 }
2089
2090 int
num_insns_constant(rtx op,enum machine_mode mode)2091 num_insns_constant (rtx op, enum machine_mode mode)
2092 {
2093 HOST_WIDE_INT low, high;
2094
2095 switch (GET_CODE (op))
2096 {
2097 case CONST_INT:
2098 #if HOST_BITS_PER_WIDE_INT == 64
2099 if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
2100 && mask64_operand (op, mode))
2101 return 2;
2102 else
2103 #endif
2104 return num_insns_constant_wide (INTVAL (op));
2105
2106 case CONST_DOUBLE:
2107 if (mode == SFmode)
2108 {
2109 long l;
2110 REAL_VALUE_TYPE rv;
2111
2112 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
2113 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
2114 return num_insns_constant_wide ((HOST_WIDE_INT) l);
2115 }
2116
2117 if (mode == VOIDmode || mode == DImode)
2118 {
2119 high = CONST_DOUBLE_HIGH (op);
2120 low = CONST_DOUBLE_LOW (op);
2121 }
2122 else
2123 {
2124 long l[2];
2125 REAL_VALUE_TYPE rv;
2126
2127 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
2128 REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
2129 high = l[WORDS_BIG_ENDIAN == 0];
2130 low = l[WORDS_BIG_ENDIAN != 0];
2131 }
2132
2133 if (TARGET_32BIT)
2134 return (num_insns_constant_wide (low)
2135 + num_insns_constant_wide (high));
2136 else
2137 {
2138 if ((high == 0 && low >= 0)
2139 || (high == -1 && low < 0))
2140 return num_insns_constant_wide (low);
2141
2142 else if (mask64_operand (op, mode))
2143 return 2;
2144
2145 else if (low == 0)
2146 return num_insns_constant_wide (high) + 1;
2147
2148 else
2149 return (num_insns_constant_wide (high)
2150 + num_insns_constant_wide (low) + 1);
2151 }
2152
2153 default:
2154 gcc_unreachable ();
2155 }
2156 }
2157
2158 /* Interpret element ELT of the CONST_VECTOR OP as an integer value.
2159 If the mode of OP is MODE_VECTOR_INT, this simply returns the
2160 corresponding element of the vector, but for V4SFmode and V2SFmode,
2161 the corresponding "float" is interpreted as an SImode integer. */
2162
2163 static HOST_WIDE_INT
const_vector_elt_as_int(rtx op,unsigned int elt)2164 const_vector_elt_as_int (rtx op, unsigned int elt)
2165 {
2166 rtx tmp = CONST_VECTOR_ELT (op, elt);
2167 if (GET_MODE (op) == V4SFmode
2168 || GET_MODE (op) == V2SFmode)
2169 tmp = gen_lowpart (SImode, tmp);
2170 return INTVAL (tmp);
2171 }
2172
2173 /* Return true if OP can be synthesized with a particular vspltisb, vspltish
2174 or vspltisw instruction. OP is a CONST_VECTOR. Which instruction is used
2175 depends on STEP and COPIES, one of which will be 1. If COPIES > 1,
2176 all items are set to the same value and contain COPIES replicas of the
2177 vsplt's operand; if STEP > 1, one in STEP elements is set to the vsplt's
2178 operand and the others are set to the value of the operand's msb. */
2179
2180 static bool
vspltis_constant(rtx op,unsigned step,unsigned copies)2181 vspltis_constant (rtx op, unsigned step, unsigned copies)
2182 {
2183 enum machine_mode mode = GET_MODE (op);
2184 enum machine_mode inner = GET_MODE_INNER (mode);
2185
2186 unsigned i;
2187 unsigned nunits = GET_MODE_NUNITS (mode);
2188 unsigned bitsize = GET_MODE_BITSIZE (inner);
2189 unsigned mask = GET_MODE_MASK (inner);
2190
2191 HOST_WIDE_INT val = const_vector_elt_as_int (op, nunits - 1);
2192 HOST_WIDE_INT splat_val = val;
2193 HOST_WIDE_INT msb_val = val > 0 ? 0 : -1;
2194
2195 /* Construct the value to be splatted, if possible. If not, return 0. */
2196 for (i = 2; i <= copies; i *= 2)
2197 {
2198 HOST_WIDE_INT small_val;
2199 bitsize /= 2;
2200 small_val = splat_val >> bitsize;
2201 mask >>= bitsize;
2202 if (splat_val != ((small_val << bitsize) | (small_val & mask)))
2203 return false;
2204 splat_val = small_val;
2205 }
2206
2207 /* Check if SPLAT_VAL can really be the operand of a vspltis[bhw]. */
2208 if (EASY_VECTOR_15 (splat_val))
2209 ;
2210
2211 /* Also check if we can splat, and then add the result to itself. Do so if
2212 the value is positive, of if the splat instruction is using OP's mode;
2213 for splat_val < 0, the splat and the add should use the same mode. */
2214 else if (EASY_VECTOR_15_ADD_SELF (splat_val)
2215 && (splat_val >= 0 || (step == 1 && copies == 1)))
2216 ;
2217
2218 else
2219 return false;
2220
2221 /* Check if VAL is present in every STEP-th element, and the
2222 other elements are filled with its most significant bit. */
2223 for (i = 0; i < nunits - 1; ++i)
2224 {
2225 HOST_WIDE_INT desired_val;
2226 if (((i + 1) & (step - 1)) == 0)
2227 desired_val = val;
2228 else
2229 desired_val = msb_val;
2230
2231 if (desired_val != const_vector_elt_as_int (op, i))
2232 return false;
2233 }
2234
2235 return true;
2236 }
2237
2238
2239 /* Return true if OP is of the given MODE and can be synthesized
2240 with a vspltisb, vspltish or vspltisw. */
2241
2242 bool
easy_altivec_constant(rtx op,enum machine_mode mode)2243 easy_altivec_constant (rtx op, enum machine_mode mode)
2244 {
2245 unsigned step, copies;
2246
2247 if (mode == VOIDmode)
2248 mode = GET_MODE (op);
2249 else if (mode != GET_MODE (op))
2250 return false;
2251
2252 /* Start with a vspltisw. */
2253 step = GET_MODE_NUNITS (mode) / 4;
2254 copies = 1;
2255
2256 if (vspltis_constant (op, step, copies))
2257 return true;
2258
2259 /* Then try with a vspltish. */
2260 if (step == 1)
2261 copies <<= 1;
2262 else
2263 step >>= 1;
2264
2265 if (vspltis_constant (op, step, copies))
2266 return true;
2267
2268 /* And finally a vspltisb. */
2269 if (step == 1)
2270 copies <<= 1;
2271 else
2272 step >>= 1;
2273
2274 if (vspltis_constant (op, step, copies))
2275 return true;
2276
2277 return false;
2278 }
2279
2280 /* Generate a VEC_DUPLICATE representing a vspltis[bhw] instruction whose
2281 result is OP. Abort if it is not possible. */
2282
2283 rtx
gen_easy_altivec_constant(rtx op)2284 gen_easy_altivec_constant (rtx op)
2285 {
2286 enum machine_mode mode = GET_MODE (op);
2287 int nunits = GET_MODE_NUNITS (mode);
2288 rtx last = CONST_VECTOR_ELT (op, nunits - 1);
2289 unsigned step = nunits / 4;
2290 unsigned copies = 1;
2291
2292 /* Start with a vspltisw. */
2293 if (vspltis_constant (op, step, copies))
2294 return gen_rtx_VEC_DUPLICATE (V4SImode, gen_lowpart (SImode, last));
2295
2296 /* Then try with a vspltish. */
2297 if (step == 1)
2298 copies <<= 1;
2299 else
2300 step >>= 1;
2301
2302 if (vspltis_constant (op, step, copies))
2303 return gen_rtx_VEC_DUPLICATE (V8HImode, gen_lowpart (HImode, last));
2304
2305 /* And finally a vspltisb. */
2306 if (step == 1)
2307 copies <<= 1;
2308 else
2309 step >>= 1;
2310
2311 if (vspltis_constant (op, step, copies))
2312 return gen_rtx_VEC_DUPLICATE (V16QImode, gen_lowpart (QImode, last));
2313
2314 gcc_unreachable ();
2315 }
2316
2317 const char *
output_vec_const_move(rtx * operands)2318 output_vec_const_move (rtx *operands)
2319 {
2320 int cst, cst2;
2321 enum machine_mode mode;
2322 rtx dest, vec;
2323
2324 dest = operands[0];
2325 vec = operands[1];
2326 mode = GET_MODE (dest);
2327
2328 if (TARGET_ALTIVEC)
2329 {
2330 rtx splat_vec;
2331 if (zero_constant (vec, mode))
2332 return "vxor %0,%0,%0";
2333
2334 splat_vec = gen_easy_altivec_constant (vec);
2335 gcc_assert (GET_CODE (splat_vec) == VEC_DUPLICATE);
2336 operands[1] = XEXP (splat_vec, 0);
2337 if (!EASY_VECTOR_15 (INTVAL (operands[1])))
2338 return "#";
2339
2340 switch (GET_MODE (splat_vec))
2341 {
2342 case V4SImode:
2343 return "vspltisw %0,%1";
2344
2345 case V8HImode:
2346 return "vspltish %0,%1";
2347
2348 case V16QImode:
2349 return "vspltisb %0,%1";
2350
2351 default:
2352 gcc_unreachable ();
2353 }
2354 }
2355
2356 gcc_assert (TARGET_SPE);
2357
2358 /* Vector constant 0 is handled as a splitter of V2SI, and in the
2359 pattern of V1DI, V4HI, and V2SF.
2360
2361 FIXME: We should probably return # and add post reload
2362 splitters for these, but this way is so easy ;-). */
2363 cst = INTVAL (CONST_VECTOR_ELT (vec, 0));
2364 cst2 = INTVAL (CONST_VECTOR_ELT (vec, 1));
2365 operands[1] = CONST_VECTOR_ELT (vec, 0);
2366 operands[2] = CONST_VECTOR_ELT (vec, 1);
2367 if (cst == cst2)
2368 return "li %0,%1\n\tevmergelo %0,%0,%0";
2369 else
2370 return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
2371 }
2372
2373 /* Initialize vector TARGET to VALS. */
2374
2375 void
rs6000_expand_vector_init(rtx target,rtx vals)2376 rs6000_expand_vector_init (rtx target, rtx vals)
2377 {
2378 enum machine_mode mode = GET_MODE (target);
2379 enum machine_mode inner_mode = GET_MODE_INNER (mode);
2380 int n_elts = GET_MODE_NUNITS (mode);
2381 int n_var = 0, one_var = -1;
2382 bool all_same = true, all_const_zero = true;
2383 rtx x, mem;
2384 int i;
2385
2386 for (i = 0; i < n_elts; ++i)
2387 {
2388 x = XVECEXP (vals, 0, i);
2389 if (!CONSTANT_P (x))
2390 ++n_var, one_var = i;
2391 else if (x != CONST0_RTX (inner_mode))
2392 all_const_zero = false;
2393
2394 if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
2395 all_same = false;
2396 }
2397
2398 if (n_var == 0)
2399 {
2400 if (mode != V4SFmode && all_const_zero)
2401 {
2402 /* Zero register. */
2403 emit_insn (gen_rtx_SET (VOIDmode, target,
2404 gen_rtx_XOR (mode, target, target)));
2405 return;
2406 }
2407 else if (mode != V4SFmode && easy_vector_constant (vals, mode))
2408 {
2409 /* Splat immediate. */
2410 emit_insn (gen_rtx_SET (VOIDmode, target, vals));
2411 return;
2412 }
2413 else if (all_same)
2414 ; /* Splat vector element. */
2415 else
2416 {
2417 /* Load from constant pool. */
2418 emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
2419 return;
2420 }
2421 }
2422
2423 /* Store value to stack temp. Load vector element. Splat. */
2424 if (all_same)
2425 {
2426 mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
2427 emit_move_insn (adjust_address_nv (mem, inner_mode, 0),
2428 XVECEXP (vals, 0, 0));
2429 x = gen_rtx_UNSPEC (VOIDmode,
2430 gen_rtvec (1, const0_rtx), UNSPEC_LVE);
2431 emit_insn (gen_rtx_PARALLEL (VOIDmode,
2432 gen_rtvec (2,
2433 gen_rtx_SET (VOIDmode,
2434 target, mem),
2435 x)));
2436 x = gen_rtx_VEC_SELECT (inner_mode, target,
2437 gen_rtx_PARALLEL (VOIDmode,
2438 gen_rtvec (1, const0_rtx)));
2439 emit_insn (gen_rtx_SET (VOIDmode, target,
2440 gen_rtx_VEC_DUPLICATE (mode, x)));
2441 return;
2442 }
2443
2444 /* One field is non-constant. Load constant then overwrite
2445 varying field. */
2446 if (n_var == 1)
2447 {
2448 rtx copy = copy_rtx (vals);
2449
2450 /* Load constant part of vector, substitute neighboring value for
2451 varying element. */
2452 XVECEXP (copy, 0, one_var) = XVECEXP (vals, 0, (one_var + 1) % n_elts);
2453 rs6000_expand_vector_init (target, copy);
2454
2455 /* Insert variable. */
2456 rs6000_expand_vector_set (target, XVECEXP (vals, 0, one_var), one_var);
2457 return;
2458 }
2459
2460 /* Construct the vector in memory one field at a time
2461 and load the whole vector. */
2462 mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
2463 for (i = 0; i < n_elts; i++)
2464 emit_move_insn (adjust_address_nv (mem, inner_mode,
2465 i * GET_MODE_SIZE (inner_mode)),
2466 XVECEXP (vals, 0, i));
2467 emit_move_insn (target, mem);
2468 }
2469
2470 /* Set field ELT of TARGET to VAL. */
2471
2472 void
rs6000_expand_vector_set(rtx target,rtx val,int elt)2473 rs6000_expand_vector_set (rtx target, rtx val, int elt)
2474 {
2475 enum machine_mode mode = GET_MODE (target);
2476 enum machine_mode inner_mode = GET_MODE_INNER (mode);
2477 rtx reg = gen_reg_rtx (mode);
2478 rtx mask, mem, x;
2479 int width = GET_MODE_SIZE (inner_mode);
2480 int i;
2481
2482 /* Load single variable value. */
2483 mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
2484 emit_move_insn (adjust_address_nv (mem, inner_mode, 0), val);
2485 x = gen_rtx_UNSPEC (VOIDmode,
2486 gen_rtvec (1, const0_rtx), UNSPEC_LVE);
2487 emit_insn (gen_rtx_PARALLEL (VOIDmode,
2488 gen_rtvec (2,
2489 gen_rtx_SET (VOIDmode,
2490 reg, mem),
2491 x)));
2492
2493 /* Linear sequence. */
2494 mask = gen_rtx_PARALLEL (V16QImode, rtvec_alloc (16));
2495 for (i = 0; i < 16; ++i)
2496 XVECEXP (mask, 0, i) = GEN_INT (i);
2497
2498 /* Set permute mask to insert element into target. */
2499 for (i = 0; i < width; ++i)
2500 XVECEXP (mask, 0, elt*width + i)
2501 = GEN_INT (i + 0x10);
2502 x = gen_rtx_CONST_VECTOR (V16QImode, XVEC (mask, 0));
2503 x = gen_rtx_UNSPEC (mode,
2504 gen_rtvec (3, target, reg,
2505 force_reg (V16QImode, x)),
2506 UNSPEC_VPERM);
2507 emit_insn (gen_rtx_SET (VOIDmode, target, x));
2508 }
2509
2510 /* Extract field ELT from VEC into TARGET. */
2511
2512 void
rs6000_expand_vector_extract(rtx target,rtx vec,int elt)2513 rs6000_expand_vector_extract (rtx target, rtx vec, int elt)
2514 {
2515 enum machine_mode mode = GET_MODE (vec);
2516 enum machine_mode inner_mode = GET_MODE_INNER (mode);
2517 rtx mem, x;
2518
2519 /* Allocate mode-sized buffer. */
2520 mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
2521
2522 /* Add offset to field within buffer matching vector element. */
2523 mem = adjust_address_nv (mem, mode, elt * GET_MODE_SIZE (inner_mode));
2524
2525 /* Store single field into mode-sized buffer. */
2526 x = gen_rtx_UNSPEC (VOIDmode,
2527 gen_rtvec (1, const0_rtx), UNSPEC_STVE);
2528 emit_insn (gen_rtx_PARALLEL (VOIDmode,
2529 gen_rtvec (2,
2530 gen_rtx_SET (VOIDmode,
2531 mem, vec),
2532 x)));
2533 emit_move_insn (target, adjust_address_nv (mem, inner_mode, 0));
2534 }
2535
2536 /* Generates shifts and masks for a pair of rldicl or rldicr insns to
2537 implement ANDing by the mask IN. */
2538 void
build_mask64_2_operands(rtx in,rtx * out)2539 build_mask64_2_operands (rtx in, rtx *out)
2540 {
2541 #if HOST_BITS_PER_WIDE_INT >= 64
2542 unsigned HOST_WIDE_INT c, lsb, m1, m2;
2543 int shift;
2544
2545 gcc_assert (GET_CODE (in) == CONST_INT);
2546
2547 c = INTVAL (in);
2548 if (c & 1)
2549 {
2550 /* Assume c initially something like 0x00fff000000fffff. The idea
2551 is to rotate the word so that the middle ^^^^^^ group of zeros
2552 is at the MS end and can be cleared with an rldicl mask. We then
2553 rotate back and clear off the MS ^^ group of zeros with a
2554 second rldicl. */
2555 c = ~c; /* c == 0xff000ffffff00000 */
2556 lsb = c & -c; /* lsb == 0x0000000000100000 */
2557 m1 = -lsb; /* m1 == 0xfffffffffff00000 */
2558 c = ~c; /* c == 0x00fff000000fffff */
2559 c &= -lsb; /* c == 0x00fff00000000000 */
2560 lsb = c & -c; /* lsb == 0x0000100000000000 */
2561 c = ~c; /* c == 0xff000fffffffffff */
2562 c &= -lsb; /* c == 0xff00000000000000 */
2563 shift = 0;
2564 while ((lsb >>= 1) != 0)
2565 shift++; /* shift == 44 on exit from loop */
2566 m1 <<= 64 - shift; /* m1 == 0xffffff0000000000 */
2567 m1 = ~m1; /* m1 == 0x000000ffffffffff */
2568 m2 = ~c; /* m2 == 0x00ffffffffffffff */
2569 }
2570 else
2571 {
2572 /* Assume c initially something like 0xff000f0000000000. The idea
2573 is to rotate the word so that the ^^^ middle group of zeros
2574 is at the LS end and can be cleared with an rldicr mask. We then
2575 rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
2576 a second rldicr. */
2577 lsb = c & -c; /* lsb == 0x0000010000000000 */
2578 m2 = -lsb; /* m2 == 0xffffff0000000000 */
2579 c = ~c; /* c == 0x00fff0ffffffffff */
2580 c &= -lsb; /* c == 0x00fff00000000000 */
2581 lsb = c & -c; /* lsb == 0x0000100000000000 */
2582 c = ~c; /* c == 0xff000fffffffffff */
2583 c &= -lsb; /* c == 0xff00000000000000 */
2584 shift = 0;
2585 while ((lsb >>= 1) != 0)
2586 shift++; /* shift == 44 on exit from loop */
2587 m1 = ~c; /* m1 == 0x00ffffffffffffff */
2588 m1 >>= shift; /* m1 == 0x0000000000000fff */
2589 m1 = ~m1; /* m1 == 0xfffffffffffff000 */
2590 }
2591
2592 /* Note that when we only have two 0->1 and 1->0 transitions, one of the
2593 masks will be all 1's. We are guaranteed more than one transition. */
2594 out[0] = GEN_INT (64 - shift);
2595 out[1] = GEN_INT (m1);
2596 out[2] = GEN_INT (shift);
2597 out[3] = GEN_INT (m2);
2598 #else
2599 (void)in;
2600 (void)out;
2601 gcc_unreachable ();
2602 #endif
2603 }
2604
2605 /* Return TRUE if OP is an invalid SUBREG operation on the e500. */
2606
2607 bool
invalid_e500_subreg(rtx op,enum machine_mode mode)2608 invalid_e500_subreg (rtx op, enum machine_mode mode)
2609 {
2610 if (TARGET_E500_DOUBLE)
2611 {
2612 /* Reject (subreg:SI (reg:DF)). */
2613 if (GET_CODE (op) == SUBREG
2614 && mode == SImode
2615 && REG_P (SUBREG_REG (op))
2616 && GET_MODE (SUBREG_REG (op)) == DFmode)
2617 return true;
2618
2619 /* Reject (subreg:DF (reg:DI)). */
2620 if (GET_CODE (op) == SUBREG
2621 && mode == DFmode
2622 && REG_P (SUBREG_REG (op))
2623 && GET_MODE (SUBREG_REG (op)) == DImode)
2624 return true;
2625 }
2626
2627 if (TARGET_SPE
2628 && GET_CODE (op) == SUBREG
2629 && mode == SImode
2630 && REG_P (SUBREG_REG (op))
2631 && SPE_VECTOR_MODE (GET_MODE (SUBREG_REG (op))))
2632 return true;
2633
2634 return false;
2635 }
2636
2637 /* Darwin, AIX increases natural record alignment to doubleword if the first
2638 field is an FP double while the FP fields remain word aligned. */
2639
2640 unsigned int
rs6000_special_round_type_align(tree type,unsigned int computed,unsigned int specified)2641 rs6000_special_round_type_align (tree type, unsigned int computed,
2642 unsigned int specified)
2643 {
2644 unsigned int align = MAX (computed, specified);
2645 tree field = TYPE_FIELDS (type);
2646
2647 /* Skip all non field decls */
2648 while (field != NULL && TREE_CODE (field) != FIELD_DECL)
2649 field = TREE_CHAIN (field);
2650
2651 if (field != NULL && field != type)
2652 {
2653 type = TREE_TYPE (field);
2654 while (TREE_CODE (type) == ARRAY_TYPE)
2655 type = TREE_TYPE (type);
2656
2657 if (type != error_mark_node && TYPE_MODE (type) == DFmode)
2658 align = MAX (align, 64);
2659 }
2660
2661 return align;
2662 }
2663
2664 /* Return 1 for an operand in small memory on V.4/eabi. */
2665
2666 int
small_data_operand(rtx op ATTRIBUTE_UNUSED,enum machine_mode mode ATTRIBUTE_UNUSED)2667 small_data_operand (rtx op ATTRIBUTE_UNUSED,
2668 enum machine_mode mode ATTRIBUTE_UNUSED)
2669 {
2670 #if TARGET_ELF
2671 rtx sym_ref;
2672
2673 if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
2674 return 0;
2675
2676 if (DEFAULT_ABI != ABI_V4)
2677 return 0;
2678
2679 if (GET_CODE (op) == SYMBOL_REF)
2680 sym_ref = op;
2681
2682 else if (GET_CODE (op) != CONST
2683 || GET_CODE (XEXP (op, 0)) != PLUS
2684 || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
2685 || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
2686 return 0;
2687
2688 else
2689 {
2690 rtx sum = XEXP (op, 0);
2691 HOST_WIDE_INT summand;
2692
2693 /* We have to be careful here, because it is the referenced address
2694 that must be 32k from _SDA_BASE_, not just the symbol. */
2695 summand = INTVAL (XEXP (sum, 1));
2696 if (summand < 0 || (unsigned HOST_WIDE_INT) summand > g_switch_value)
2697 return 0;
2698
2699 sym_ref = XEXP (sum, 0);
2700 }
2701
2702 return SYMBOL_REF_SMALL_P (sym_ref);
2703 #else
2704 return 0;
2705 #endif
2706 }
2707
2708 /* Return true if either operand is a general purpose register. */
2709
2710 bool
gpr_or_gpr_p(rtx op0,rtx op1)2711 gpr_or_gpr_p (rtx op0, rtx op1)
2712 {
2713 return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
2714 || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
2715 }
2716
2717
2718 /* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address. */
2719
2720 static int
constant_pool_expr_1(rtx op,int * have_sym,int * have_toc)2721 constant_pool_expr_1 (rtx op, int *have_sym, int *have_toc)
2722 {
2723 switch (GET_CODE (op))
2724 {
2725 case SYMBOL_REF:
2726 if (RS6000_SYMBOL_REF_TLS_P (op))
2727 return 0;
2728 else if (CONSTANT_POOL_ADDRESS_P (op))
2729 {
2730 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (op), Pmode))
2731 {
2732 *have_sym = 1;
2733 return 1;
2734 }
2735 else
2736 return 0;
2737 }
2738 else if (! strcmp (XSTR (op, 0), toc_label_name))
2739 {
2740 *have_toc = 1;
2741 return 1;
2742 }
2743 else
2744 return 0;
2745 case PLUS:
2746 case MINUS:
2747 return (constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc)
2748 && constant_pool_expr_1 (XEXP (op, 1), have_sym, have_toc));
2749 case CONST:
2750 return constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc);
2751 case CONST_INT:
2752 return 1;
2753 default:
2754 return 0;
2755 }
2756 }
2757
2758 static bool
constant_pool_expr_p(rtx op)2759 constant_pool_expr_p (rtx op)
2760 {
2761 int have_sym = 0;
2762 int have_toc = 0;
2763 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_sym;
2764 }
2765
2766 bool
toc_relative_expr_p(rtx op)2767 toc_relative_expr_p (rtx op)
2768 {
2769 int have_sym = 0;
2770 int have_toc = 0;
2771 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_toc;
2772 }
2773
2774 bool
legitimate_constant_pool_address_p(rtx x)2775 legitimate_constant_pool_address_p (rtx x)
2776 {
2777 return (TARGET_TOC
2778 && GET_CODE (x) == PLUS
2779 && GET_CODE (XEXP (x, 0)) == REG
2780 && (TARGET_MINIMAL_TOC || REGNO (XEXP (x, 0)) == TOC_REGISTER)
2781 && constant_pool_expr_p (XEXP (x, 1)));
2782 }
2783
2784 static bool
legitimate_small_data_p(enum machine_mode mode,rtx x)2785 legitimate_small_data_p (enum machine_mode mode, rtx x)
2786 {
2787 return (DEFAULT_ABI == ABI_V4
2788 && !flag_pic && !TARGET_TOC
2789 && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
2790 && small_data_operand (x, mode));
2791 }
2792
2793 /* SPE offset addressing is limited to 5-bits worth of double words. */
2794 #define SPE_CONST_OFFSET_OK(x) (((x) & ~0xf8) == 0)
2795
2796 bool
rs6000_legitimate_offset_address_p(enum machine_mode mode,rtx x,int strict)2797 rs6000_legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
2798 {
2799 unsigned HOST_WIDE_INT offset, extra;
2800
2801 if (GET_CODE (x) != PLUS)
2802 return false;
2803 if (GET_CODE (XEXP (x, 0)) != REG)
2804 return false;
2805 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
2806 return false;
2807 if (legitimate_constant_pool_address_p (x))
2808 return true;
2809 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
2810 return false;
2811
2812 offset = INTVAL (XEXP (x, 1));
2813 extra = 0;
2814 switch (mode)
2815 {
2816 case V16QImode:
2817 case V8HImode:
2818 case V4SFmode:
2819 case V4SImode:
2820 /* AltiVec vector modes. Only reg+reg addressing is valid and
2821 constant offset zero should not occur due to canonicalization.
2822 Allow any offset when not strict before reload. */
2823 return !strict;
2824
2825 case V4HImode:
2826 case V2SImode:
2827 case V1DImode:
2828 case V2SFmode:
2829 /* SPE vector modes. */
2830 return SPE_CONST_OFFSET_OK (offset);
2831
2832 case DFmode:
2833 if (TARGET_E500_DOUBLE)
2834 return SPE_CONST_OFFSET_OK (offset);
2835
2836 case DImode:
2837 /* On e500v2, we may have:
2838
2839 (subreg:DF (mem:DI (plus (reg) (const_int))) 0).
2840
2841 Which gets addressed with evldd instructions. */
2842 if (TARGET_E500_DOUBLE)
2843 return SPE_CONST_OFFSET_OK (offset);
2844
2845 if (mode == DFmode || !TARGET_POWERPC64)
2846 extra = 4;
2847 else if (offset & 3)
2848 return false;
2849 break;
2850
2851 case TFmode:
2852 case TImode:
2853 if (mode == TFmode || !TARGET_POWERPC64)
2854 extra = 12;
2855 else if (offset & 3)
2856 return false;
2857 else
2858 extra = 8;
2859 break;
2860
2861 default:
2862 break;
2863 }
2864
2865 offset += 0x8000;
2866 return (offset < 0x10000) && (offset + extra < 0x10000);
2867 }
2868
2869 static bool
legitimate_indexed_address_p(rtx x,int strict)2870 legitimate_indexed_address_p (rtx x, int strict)
2871 {
2872 rtx op0, op1;
2873
2874 if (GET_CODE (x) != PLUS)
2875 return false;
2876
2877 op0 = XEXP (x, 0);
2878 op1 = XEXP (x, 1);
2879
2880 /* Recognize the rtl generated by reload which we know will later be
2881 replaced with proper base and index regs. */
2882 if (!strict
2883 && reload_in_progress
2884 && (REG_P (op0) || GET_CODE (op0) == PLUS)
2885 && REG_P (op1))
2886 return true;
2887
2888 return (REG_P (op0) && REG_P (op1)
2889 && ((INT_REG_OK_FOR_BASE_P (op0, strict)
2890 && INT_REG_OK_FOR_INDEX_P (op1, strict))
2891 || (INT_REG_OK_FOR_BASE_P (op1, strict)
2892 && INT_REG_OK_FOR_INDEX_P (op0, strict))));
2893 }
2894
2895 inline bool
legitimate_indirect_address_p(rtx x,int strict)2896 legitimate_indirect_address_p (rtx x, int strict)
2897 {
2898 return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict);
2899 }
2900
2901 bool
macho_lo_sum_memory_operand(rtx x,enum machine_mode mode)2902 macho_lo_sum_memory_operand (rtx x, enum machine_mode mode)
2903 {
2904 if (!TARGET_MACHO || !flag_pic
2905 || mode != SImode || GET_CODE (x) != MEM)
2906 return false;
2907 x = XEXP (x, 0);
2908
2909 if (GET_CODE (x) != LO_SUM)
2910 return false;
2911 if (GET_CODE (XEXP (x, 0)) != REG)
2912 return false;
2913 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
2914 return false;
2915 x = XEXP (x, 1);
2916
2917 return CONSTANT_P (x);
2918 }
2919
2920 static bool
legitimate_lo_sum_address_p(enum machine_mode mode,rtx x,int strict)2921 legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
2922 {
2923 if (GET_CODE (x) != LO_SUM)
2924 return false;
2925 if (GET_CODE (XEXP (x, 0)) != REG)
2926 return false;
2927 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
2928 return false;
2929 /* Restrict addressing for DI because of our SUBREG hackery. */
2930 if (TARGET_E500_DOUBLE && (mode == DFmode || mode == DImode))
2931 return false;
2932 x = XEXP (x, 1);
2933
2934 if (TARGET_ELF || TARGET_MACHO)
2935 {
2936 if (DEFAULT_ABI != ABI_AIX && DEFAULT_ABI != ABI_DARWIN && flag_pic)
2937 return false;
2938 if (TARGET_TOC)
2939 return false;
2940 if (GET_MODE_NUNITS (mode) != 1)
2941 return false;
2942 if (GET_MODE_BITSIZE (mode) > 64
2943 || (GET_MODE_BITSIZE (mode) > 32 && !TARGET_POWERPC64
2944 && !(TARGET_HARD_FLOAT && TARGET_FPRS && mode == DFmode)))
2945 return false;
2946
2947 return CONSTANT_P (x);
2948 }
2949
2950 return false;
2951 }
2952
2953
2954 /* Try machine-dependent ways of modifying an illegitimate address
2955 to be legitimate. If we find one, return the new, valid address.
2956 This is used from only one place: `memory_address' in explow.c.
2957
2958 OLDX is the address as it was before break_out_memory_refs was
2959 called. In some cases it is useful to look at this to decide what
2960 needs to be done.
2961
2962 MODE is passed so that this function can use GO_IF_LEGITIMATE_ADDRESS.
2963
2964 It is always safe for this function to do nothing. It exists to
2965 recognize opportunities to optimize the output.
2966
2967 On RS/6000, first check for the sum of a register with a constant
2968 integer that is out of range. If so, generate code to add the
2969 constant with the low-order 16 bits masked to the register and force
2970 this result into another register (this can be done with `cau').
2971 Then generate an address of REG+(CONST&0xffff), allowing for the
2972 possibility of bit 16 being a one.
2973
2974 Then check for the sum of a register and something not constant, try to
2975 load the other things into a register and return the sum. */
2976
2977 rtx
rs6000_legitimize_address(rtx x,rtx oldx ATTRIBUTE_UNUSED,enum machine_mode mode)2978 rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
2979 enum machine_mode mode)
2980 {
2981 if (GET_CODE (x) == SYMBOL_REF)
2982 {
2983 enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
2984 if (model != 0)
2985 return rs6000_legitimize_tls_address (x, model);
2986 }
2987
2988 if (GET_CODE (x) == PLUS
2989 && GET_CODE (XEXP (x, 0)) == REG
2990 && GET_CODE (XEXP (x, 1)) == CONST_INT
2991 && (unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000) >= 0x10000)
2992 {
2993 HOST_WIDE_INT high_int, low_int;
2994 rtx sum;
2995 low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
2996 high_int = INTVAL (XEXP (x, 1)) - low_int;
2997 sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
2998 GEN_INT (high_int)), 0);
2999 return gen_rtx_PLUS (Pmode, sum, GEN_INT (low_int));
3000 }
3001 else if (GET_CODE (x) == PLUS
3002 && GET_CODE (XEXP (x, 0)) == REG
3003 && GET_CODE (XEXP (x, 1)) != CONST_INT
3004 && GET_MODE_NUNITS (mode) == 1
3005 && ((TARGET_HARD_FLOAT && TARGET_FPRS)
3006 || TARGET_POWERPC64
3007 || (((mode != DImode && mode != DFmode) || TARGET_E500_DOUBLE)
3008 && mode != TFmode))
3009 && (TARGET_POWERPC64 || mode != DImode)
3010 && mode != TImode)
3011 {
3012 return gen_rtx_PLUS (Pmode, XEXP (x, 0),
3013 force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
3014 }
3015 else if (ALTIVEC_VECTOR_MODE (mode))
3016 {
3017 rtx reg;
3018
3019 /* Make sure both operands are registers. */
3020 if (GET_CODE (x) == PLUS)
3021 return gen_rtx_PLUS (Pmode, force_reg (Pmode, XEXP (x, 0)),
3022 force_reg (Pmode, XEXP (x, 1)));
3023
3024 reg = force_reg (Pmode, x);
3025 return reg;
3026 }
3027 else if (SPE_VECTOR_MODE (mode)
3028 || (TARGET_E500_DOUBLE && (mode == DFmode
3029 || mode == DImode)))
3030 {
3031 if (mode == DImode)
3032 return NULL_RTX;
3033 /* We accept [reg + reg] and [reg + OFFSET]. */
3034
3035 if (GET_CODE (x) == PLUS)
3036 {
3037 rtx op1 = XEXP (x, 0);
3038 rtx op2 = XEXP (x, 1);
3039
3040 op1 = force_reg (Pmode, op1);
3041
3042 if (GET_CODE (op2) != REG
3043 && (GET_CODE (op2) != CONST_INT
3044 || !SPE_CONST_OFFSET_OK (INTVAL (op2))))
3045 op2 = force_reg (Pmode, op2);
3046
3047 return gen_rtx_PLUS (Pmode, op1, op2);
3048 }
3049
3050 return force_reg (Pmode, x);
3051 }
3052 else if (TARGET_ELF
3053 && TARGET_32BIT
3054 && TARGET_NO_TOC
3055 && ! flag_pic
3056 && GET_CODE (x) != CONST_INT
3057 && GET_CODE (x) != CONST_DOUBLE
3058 && CONSTANT_P (x)
3059 && GET_MODE_NUNITS (mode) == 1
3060 && (GET_MODE_BITSIZE (mode) <= 32
3061 || ((TARGET_HARD_FLOAT && TARGET_FPRS) && mode == DFmode)))
3062 {
3063 rtx reg = gen_reg_rtx (Pmode);
3064 emit_insn (gen_elf_high (reg, x));
3065 return gen_rtx_LO_SUM (Pmode, reg, x);
3066 }
3067 else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
3068 && ! flag_pic
3069 #if TARGET_MACHO
3070 && ! MACHO_DYNAMIC_NO_PIC_P
3071 #endif
3072 && GET_CODE (x) != CONST_INT
3073 && GET_CODE (x) != CONST_DOUBLE
3074 && CONSTANT_P (x)
3075 && ((TARGET_HARD_FLOAT && TARGET_FPRS) || mode != DFmode)
3076 && mode != DImode
3077 && mode != TImode)
3078 {
3079 rtx reg = gen_reg_rtx (Pmode);
3080 emit_insn (gen_macho_high (reg, x));
3081 return gen_rtx_LO_SUM (Pmode, reg, x);
3082 }
3083 else if (TARGET_TOC
3084 && constant_pool_expr_p (x)
3085 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
3086 {
3087 return create_TOC_reference (x);
3088 }
3089 else
3090 return NULL_RTX;
3091 }
3092
3093 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
3094 We need to emit DTP-relative relocations. */
3095
3096 static void
rs6000_output_dwarf_dtprel(FILE * file,int size,rtx x)3097 rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
3098 {
3099 switch (size)
3100 {
3101 case 4:
3102 fputs ("\t.long\t", file);
3103 break;
3104 case 8:
3105 fputs (DOUBLE_INT_ASM_OP, file);
3106 break;
3107 default:
3108 gcc_unreachable ();
3109 }
3110 output_addr_const (file, x);
3111 fputs ("@dtprel+0x8000", file);
3112 }
3113
3114 /* Construct the SYMBOL_REF for the tls_get_addr function. */
3115
3116 static GTY(()) rtx rs6000_tls_symbol;
3117 static rtx
rs6000_tls_get_addr(void)3118 rs6000_tls_get_addr (void)
3119 {
3120 if (!rs6000_tls_symbol)
3121 rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
3122
3123 return rs6000_tls_symbol;
3124 }
3125
3126 /* Construct the SYMBOL_REF for TLS GOT references. */
3127
3128 static GTY(()) rtx rs6000_got_symbol;
3129 static rtx
rs6000_got_sym(void)3130 rs6000_got_sym (void)
3131 {
3132 if (!rs6000_got_symbol)
3133 {
3134 rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3135 SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
3136 SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
3137 }
3138
3139 return rs6000_got_symbol;
3140 }
3141
3142 /* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
3143 this (thread-local) address. */
3144
3145 static rtx
rs6000_legitimize_tls_address(rtx addr,enum tls_model model)3146 rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
3147 {
3148 rtx dest, insn;
3149
3150 dest = gen_reg_rtx (Pmode);
3151 if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
3152 {
3153 rtx tlsreg;
3154
3155 if (TARGET_64BIT)
3156 {
3157 tlsreg = gen_rtx_REG (Pmode, 13);
3158 insn = gen_tls_tprel_64 (dest, tlsreg, addr);
3159 }
3160 else
3161 {
3162 tlsreg = gen_rtx_REG (Pmode, 2);
3163 insn = gen_tls_tprel_32 (dest, tlsreg, addr);
3164 }
3165 emit_insn (insn);
3166 }
3167 else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
3168 {
3169 rtx tlsreg, tmp;
3170
3171 tmp = gen_reg_rtx (Pmode);
3172 if (TARGET_64BIT)
3173 {
3174 tlsreg = gen_rtx_REG (Pmode, 13);
3175 insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
3176 }
3177 else
3178 {
3179 tlsreg = gen_rtx_REG (Pmode, 2);
3180 insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
3181 }
3182 emit_insn (insn);
3183 if (TARGET_64BIT)
3184 insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
3185 else
3186 insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
3187 emit_insn (insn);
3188 }
3189 else
3190 {
3191 rtx r3, got, tga, tmp1, tmp2, eqv;
3192
3193 /* We currently use relocations like @got@tlsgd for tls, which
3194 means the linker will handle allocation of tls entries, placing
3195 them in the .got section. So use a pointer to the .got section,
3196 not one to secondary TOC sections used by 64-bit -mminimal-toc,
3197 or to secondary GOT sections used by 32-bit -fPIC. */
3198 if (TARGET_64BIT)
3199 got = gen_rtx_REG (Pmode, 2);
3200 else
3201 {
3202 if (flag_pic == 1)
3203 got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
3204 else
3205 {
3206 rtx gsym = rs6000_got_sym ();
3207 got = gen_reg_rtx (Pmode);
3208 if (flag_pic == 0)
3209 rs6000_emit_move (got, gsym, Pmode);
3210 else
3211 {
3212 rtx tempLR, tmp3, mem;
3213 rtx first, last;
3214
3215 tempLR = gen_reg_rtx (Pmode);
3216 tmp1 = gen_reg_rtx (Pmode);
3217 tmp2 = gen_reg_rtx (Pmode);
3218 tmp3 = gen_reg_rtx (Pmode);
3219 mem = gen_const_mem (Pmode, tmp1);
3220
3221 first = emit_insn (gen_load_toc_v4_PIC_1b (tempLR, gsym));
3222 emit_move_insn (tmp1, tempLR);
3223 emit_move_insn (tmp2, mem);
3224 emit_insn (gen_addsi3 (tmp3, tmp1, tmp2));
3225 last = emit_move_insn (got, tmp3);
3226 REG_NOTES (last) = gen_rtx_EXPR_LIST (REG_EQUAL, gsym,
3227 REG_NOTES (last));
3228 REG_NOTES (first) = gen_rtx_INSN_LIST (REG_LIBCALL, last,
3229 REG_NOTES (first));
3230 REG_NOTES (last) = gen_rtx_INSN_LIST (REG_RETVAL, first,
3231 REG_NOTES (last));
3232 }
3233 }
3234 }
3235
3236 if (model == TLS_MODEL_GLOBAL_DYNAMIC)
3237 {
3238 r3 = gen_rtx_REG (Pmode, 3);
3239 if (TARGET_64BIT)
3240 insn = gen_tls_gd_64 (r3, got, addr);
3241 else
3242 insn = gen_tls_gd_32 (r3, got, addr);
3243 start_sequence ();
3244 emit_insn (insn);
3245 tga = gen_rtx_MEM (Pmode, rs6000_tls_get_addr ());
3246 insn = gen_call_value (r3, tga, const0_rtx, const0_rtx);
3247 insn = emit_call_insn (insn);
3248 CONST_OR_PURE_CALL_P (insn) = 1;
3249 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
3250 insn = get_insns ();
3251 end_sequence ();
3252 emit_libcall_block (insn, dest, r3, addr);
3253 }
3254 else if (model == TLS_MODEL_LOCAL_DYNAMIC)
3255 {
3256 r3 = gen_rtx_REG (Pmode, 3);
3257 if (TARGET_64BIT)
3258 insn = gen_tls_ld_64 (r3, got);
3259 else
3260 insn = gen_tls_ld_32 (r3, got);
3261 start_sequence ();
3262 emit_insn (insn);
3263 tga = gen_rtx_MEM (Pmode, rs6000_tls_get_addr ());
3264 insn = gen_call_value (r3, tga, const0_rtx, const0_rtx);
3265 insn = emit_call_insn (insn);
3266 CONST_OR_PURE_CALL_P (insn) = 1;
3267 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
3268 insn = get_insns ();
3269 end_sequence ();
3270 tmp1 = gen_reg_rtx (Pmode);
3271 eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
3272 UNSPEC_TLSLD);
3273 emit_libcall_block (insn, tmp1, r3, eqv);
3274 if (rs6000_tls_size == 16)
3275 {
3276 if (TARGET_64BIT)
3277 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
3278 else
3279 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
3280 }
3281 else if (rs6000_tls_size == 32)
3282 {
3283 tmp2 = gen_reg_rtx (Pmode);
3284 if (TARGET_64BIT)
3285 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
3286 else
3287 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
3288 emit_insn (insn);
3289 if (TARGET_64BIT)
3290 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
3291 else
3292 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
3293 }
3294 else
3295 {
3296 tmp2 = gen_reg_rtx (Pmode);
3297 if (TARGET_64BIT)
3298 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
3299 else
3300 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
3301 emit_insn (insn);
3302 insn = gen_rtx_SET (Pmode, dest,
3303 gen_rtx_PLUS (Pmode, tmp2, tmp1));
3304 }
3305 emit_insn (insn);
3306 }
3307 else
3308 {
3309 /* IE, or 64 bit offset LE. */
3310 tmp2 = gen_reg_rtx (Pmode);
3311 if (TARGET_64BIT)
3312 insn = gen_tls_got_tprel_64 (tmp2, got, addr);
3313 else
3314 insn = gen_tls_got_tprel_32 (tmp2, got, addr);
3315 emit_insn (insn);
3316 if (TARGET_64BIT)
3317 insn = gen_tls_tls_64 (dest, tmp2, addr);
3318 else
3319 insn = gen_tls_tls_32 (dest, tmp2, addr);
3320 emit_insn (insn);
3321 }
3322 }
3323
3324 return dest;
3325 }
3326
3327 /* Return 1 if X contains a thread-local symbol. */
3328
3329 bool
rs6000_tls_referenced_p(rtx x)3330 rs6000_tls_referenced_p (rtx x)
3331 {
3332 if (! TARGET_HAVE_TLS)
3333 return false;
3334
3335 return for_each_rtx (&x, &rs6000_tls_symbol_ref_1, 0);
3336 }
3337
3338 /* Return 1 if *X is a thread-local symbol. This is the same as
3339 rs6000_tls_symbol_ref except for the type of the unused argument. */
3340
3341 static int
rs6000_tls_symbol_ref_1(rtx * x,void * data ATTRIBUTE_UNUSED)3342 rs6000_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
3343 {
3344 return RS6000_SYMBOL_REF_TLS_P (*x);
3345 }
3346
3347 /* The convention appears to be to define this wherever it is used.
3348 With legitimize_reload_address now defined here, REG_MODE_OK_FOR_BASE_P
3349 is now used here. */
3350 #ifndef REG_MODE_OK_FOR_BASE_P
3351 #define REG_MODE_OK_FOR_BASE_P(REGNO, MODE) REG_OK_FOR_BASE_P (REGNO)
3352 #endif
3353
3354 /* Our implementation of LEGITIMIZE_RELOAD_ADDRESS. Returns a value to
3355 replace the input X, or the original X if no replacement is called for.
3356 The output parameter *WIN is 1 if the calling macro should goto WIN,
3357 0 if it should not.
3358
3359 For RS/6000, we wish to handle large displacements off a base
3360 register by splitting the addend across an addiu/addis and the mem insn.
3361 This cuts number of extra insns needed from 3 to 1.
3362
3363 On Darwin, we use this to generate code for floating point constants.
3364 A movsf_low is generated so we wind up with 2 instructions rather than 3.
3365 The Darwin code is inside #if TARGET_MACHO because only then is
3366 machopic_function_base_name() defined. */
3367 rtx
rs6000_legitimize_reload_address(rtx x,enum machine_mode mode,int opnum,int type,int ind_levels ATTRIBUTE_UNUSED,int * win)3368 rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
3369 int opnum, int type,
3370 int ind_levels ATTRIBUTE_UNUSED, int *win)
3371 {
3372 /* We must recognize output that we have already generated ourselves. */
3373 if (GET_CODE (x) == PLUS
3374 && GET_CODE (XEXP (x, 0)) == PLUS
3375 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
3376 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3377 && GET_CODE (XEXP (x, 1)) == CONST_INT)
3378 {
3379 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3380 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3381 opnum, (enum reload_type)type);
3382 *win = 1;
3383 return x;
3384 }
3385
3386 #if TARGET_MACHO
3387 if (DEFAULT_ABI == ABI_DARWIN && flag_pic
3388 && GET_CODE (x) == LO_SUM
3389 && GET_CODE (XEXP (x, 0)) == PLUS
3390 && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
3391 && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
3392 && GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 0)) == CONST
3393 && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
3394 && GET_CODE (XEXP (XEXP (x, 1), 0)) == MINUS
3395 && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 0)) == SYMBOL_REF
3396 && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 1)) == SYMBOL_REF)
3397 {
3398 /* Result of previous invocation of this function on Darwin
3399 floating point constant. */
3400 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3401 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
3402 opnum, (enum reload_type)type);
3403 *win = 1;
3404 return x;
3405 }
3406 #endif
3407
3408 /* Force ld/std non-word aligned offset into base register by wrapping
3409 in offset 0. */
3410 if (GET_CODE (x) == PLUS
3411 && GET_CODE (XEXP (x, 0)) == REG
3412 && REGNO (XEXP (x, 0)) < 32
3413 && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
3414 && GET_CODE (XEXP (x, 1)) == CONST_INT
3415 && (INTVAL (XEXP (x, 1)) & 3) != 0
3416 && !ALTIVEC_VECTOR_MODE (mode)
3417 && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
3418 && TARGET_POWERPC64)
3419 {
3420 x = gen_rtx_PLUS (GET_MODE (x), x, GEN_INT (0));
3421 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3422 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3423 opnum, (enum reload_type) type);
3424 *win = 1;
3425 return x;
3426 }
3427
3428 if (GET_CODE (x) == PLUS
3429 && GET_CODE (XEXP (x, 0)) == REG
3430 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
3431 && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
3432 && GET_CODE (XEXP (x, 1)) == CONST_INT
3433 && !SPE_VECTOR_MODE (mode)
3434 && !(TARGET_E500_DOUBLE && (mode == DFmode
3435 || mode == DImode))
3436 && !ALTIVEC_VECTOR_MODE (mode))
3437 {
3438 HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
3439 HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
3440 HOST_WIDE_INT high
3441 = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
3442
3443 /* Check for 32-bit overflow. */
3444 if (high + low != val)
3445 {
3446 *win = 0;
3447 return x;
3448 }
3449
3450 /* Reload the high part into a base reg; leave the low part
3451 in the mem directly. */
3452
3453 x = gen_rtx_PLUS (GET_MODE (x),
3454 gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
3455 GEN_INT (high)),
3456 GEN_INT (low));
3457
3458 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3459 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3460 opnum, (enum reload_type)type);
3461 *win = 1;
3462 return x;
3463 }
3464
3465 if (GET_CODE (x) == SYMBOL_REF
3466 && !ALTIVEC_VECTOR_MODE (mode)
3467 && !SPE_VECTOR_MODE (mode)
3468 #if TARGET_MACHO
3469 && DEFAULT_ABI == ABI_DARWIN
3470 && (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
3471 #else
3472 && DEFAULT_ABI == ABI_V4
3473 && !flag_pic
3474 #endif
3475 /* Don't do this for TFmode, since the result isn't offsettable.
3476 The same goes for DImode without 64-bit gprs and DFmode
3477 without fprs. */
3478 && mode != TFmode
3479 && (mode != DImode || TARGET_POWERPC64)
3480 && (mode != DFmode || TARGET_POWERPC64
3481 || (TARGET_FPRS && TARGET_HARD_FLOAT)))
3482 {
3483 #if TARGET_MACHO
3484 if (flag_pic)
3485 {
3486 rtx offset = gen_rtx_CONST (Pmode,
3487 gen_rtx_MINUS (Pmode, x,
3488 machopic_function_base_sym ()));
3489 x = gen_rtx_LO_SUM (GET_MODE (x),
3490 gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
3491 gen_rtx_HIGH (Pmode, offset)), offset);
3492 }
3493 else
3494 #endif
3495 x = gen_rtx_LO_SUM (GET_MODE (x),
3496 gen_rtx_HIGH (Pmode, x), x);
3497
3498 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3499 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
3500 opnum, (enum reload_type)type);
3501 *win = 1;
3502 return x;
3503 }
3504
3505 /* Reload an offset address wrapped by an AND that represents the
3506 masking of the lower bits. Strip the outer AND and let reload
3507 convert the offset address into an indirect address. */
3508 if (TARGET_ALTIVEC
3509 && ALTIVEC_VECTOR_MODE (mode)
3510 && GET_CODE (x) == AND
3511 && GET_CODE (XEXP (x, 0)) == PLUS
3512 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
3513 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3514 && GET_CODE (XEXP (x, 1)) == CONST_INT
3515 && INTVAL (XEXP (x, 1)) == -16)
3516 {
3517 x = XEXP (x, 0);
3518 *win = 1;
3519 return x;
3520 }
3521
3522 if (TARGET_TOC
3523 && constant_pool_expr_p (x)
3524 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
3525 {
3526 x = create_TOC_reference (x);
3527 *win = 1;
3528 return x;
3529 }
3530 *win = 0;
3531 return x;
3532 }
3533
3534 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
3535 that is a valid memory address for an instruction.
3536 The MODE argument is the machine mode for the MEM expression
3537 that wants to use this address.
3538
3539 On the RS/6000, there are four valid address: a SYMBOL_REF that
3540 refers to a constant pool entry of an address (or the sum of it
3541 plus a constant), a short (16-bit signed) constant plus a register,
3542 the sum of two registers, or a register indirect, possibly with an
3543 auto-increment. For DFmode and DImode with a constant plus register,
3544 we must ensure that both words are addressable or PowerPC64 with offset
3545 word aligned.
3546
3547 For modes spanning multiple registers (DFmode in 32-bit GPRs,
3548 32-bit DImode, TImode, TFmode), indexed addressing cannot be used because
3549 adjacent memory cells are accessed by adding word-sized offsets
3550 during assembly output. */
3551 int
rs6000_legitimate_address(enum machine_mode mode,rtx x,int reg_ok_strict)3552 rs6000_legitimate_address (enum machine_mode mode, rtx x, int reg_ok_strict)
3553 {
3554 /* If this is an unaligned stvx/ldvx type address, discard the outer AND. */
3555 if (TARGET_ALTIVEC
3556 && ALTIVEC_VECTOR_MODE (mode)
3557 && GET_CODE (x) == AND
3558 && GET_CODE (XEXP (x, 1)) == CONST_INT
3559 && INTVAL (XEXP (x, 1)) == -16)
3560 x = XEXP (x, 0);
3561
3562 if (RS6000_SYMBOL_REF_TLS_P (x))
3563 return 0;
3564 if (legitimate_indirect_address_p (x, reg_ok_strict))
3565 return 1;
3566 if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
3567 && !ALTIVEC_VECTOR_MODE (mode)
3568 && !SPE_VECTOR_MODE (mode)
3569 && mode != TFmode
3570 /* Restrict addressing for DI because of our SUBREG hackery. */
3571 && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == DImode))
3572 && TARGET_UPDATE
3573 && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
3574 return 1;
3575 if (legitimate_small_data_p (mode, x))
3576 return 1;
3577 if (legitimate_constant_pool_address_p (x))
3578 return 1;
3579 /* If not REG_OK_STRICT (before reload) let pass any stack offset. */
3580 if (! reg_ok_strict
3581 && GET_CODE (x) == PLUS
3582 && GET_CODE (XEXP (x, 0)) == REG
3583 && (XEXP (x, 0) == virtual_stack_vars_rtx
3584 || XEXP (x, 0) == arg_pointer_rtx)
3585 && GET_CODE (XEXP (x, 1)) == CONST_INT)
3586 return 1;
3587 if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict))
3588 return 1;
3589 if (mode != TImode
3590 && mode != TFmode
3591 && ((TARGET_HARD_FLOAT && TARGET_FPRS)
3592 || TARGET_POWERPC64
3593 || ((mode != DFmode || TARGET_E500_DOUBLE) && mode != TFmode))
3594 && (TARGET_POWERPC64 || mode != DImode)
3595 && legitimate_indexed_address_p (x, reg_ok_strict))
3596 return 1;
3597 if (legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
3598 return 1;
3599 return 0;
3600 }
3601
3602 /* Go to LABEL if ADDR (a legitimate address expression)
3603 has an effect that depends on the machine mode it is used for.
3604
3605 On the RS/6000 this is true of all integral offsets (since AltiVec
3606 modes don't allow them) or is a pre-increment or decrement.
3607
3608 ??? Except that due to conceptual problems in offsettable_address_p
3609 we can't really report the problems of integral offsets. So leave
3610 this assuming that the adjustable offset must be valid for the
3611 sub-words of a TFmode operand, which is what we had before. */
3612
3613 bool
rs6000_mode_dependent_address(rtx addr)3614 rs6000_mode_dependent_address (rtx addr)
3615 {
3616 switch (GET_CODE (addr))
3617 {
3618 case PLUS:
3619 if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
3620 {
3621 unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
3622 return val + 12 + 0x8000 >= 0x10000;
3623 }
3624 break;
3625
3626 case LO_SUM:
3627 return true;
3628
3629 case PRE_INC:
3630 case PRE_DEC:
3631 return TARGET_UPDATE;
3632
3633 default:
3634 break;
3635 }
3636
3637 return false;
3638 }
3639
3640 /* More elaborate version of recog's offsettable_memref_p predicate
3641 that works around the ??? note of rs6000_mode_dependent_address.
3642 In particular it accepts
3643
3644 (mem:DI (plus:SI (reg/f:SI 31 31) (const_int 32760 [0x7ff8])))
3645
3646 in 32-bit mode, that the recog predicate rejects. */
3647
3648 bool
rs6000_offsettable_memref_p(rtx op)3649 rs6000_offsettable_memref_p (rtx op)
3650 {
3651 if (!MEM_P (op))
3652 return false;
3653
3654 /* First mimic offsettable_memref_p. */
3655 if (offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)))
3656 return true;
3657
3658 /* offsettable_address_p invokes rs6000_mode_dependent_address, but
3659 the latter predicate knows nothing about the mode of the memory
3660 reference and, therefore, assumes that it is the largest supported
3661 mode (TFmode). As a consequence, legitimate offsettable memory
3662 references are rejected. rs6000_legitimate_offset_address_p contains
3663 the correct logic for the PLUS case of rs6000_mode_dependent_address. */
3664 return rs6000_legitimate_offset_address_p (GET_MODE (op), XEXP (op, 0), 1);
3665 }
3666
3667 /* Return number of consecutive hard regs needed starting at reg REGNO
3668 to hold something of mode MODE.
3669 This is ordinarily the length in words of a value of mode MODE
3670 but can be less for certain modes in special long registers.
3671
3672 For the SPE, GPRs are 64 bits but only 32 bits are visible in
3673 scalar instructions. The upper 32 bits are only available to the
3674 SIMD instructions.
3675
3676 POWER and PowerPC GPRs hold 32 bits worth;
3677 PowerPC64 GPRs and FPRs point register holds 64 bits worth. */
3678
3679 int
rs6000_hard_regno_nregs(int regno,enum machine_mode mode)3680 rs6000_hard_regno_nregs (int regno, enum machine_mode mode)
3681 {
3682 if (FP_REGNO_P (regno))
3683 return (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
3684
3685 if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
3686 return (GET_MODE_SIZE (mode) + UNITS_PER_SPE_WORD - 1) / UNITS_PER_SPE_WORD;
3687
3688 if (ALTIVEC_REGNO_P (regno))
3689 return
3690 (GET_MODE_SIZE (mode) + UNITS_PER_ALTIVEC_WORD - 1) / UNITS_PER_ALTIVEC_WORD;
3691
3692 /* The value returned for SCmode in the E500 double case is 2 for
3693 ABI compatibility; storing an SCmode value in a single register
3694 would require function_arg and rs6000_spe_function_arg to handle
3695 SCmode so as to pass the value correctly in a pair of
3696 registers. */
3697 if (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode) && mode != SCmode)
3698 return (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
3699
3700 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3701 }
3702
3703 /* Change register usage conditional on target flags. */
3704 void
rs6000_conditional_register_usage(void)3705 rs6000_conditional_register_usage (void)
3706 {
3707 int i;
3708
3709 /* Set MQ register fixed (already call_used) if not POWER
3710 architecture (RIOS1, RIOS2, RSC, and PPC601) so that it will not
3711 be allocated. */
3712 if (! TARGET_POWER)
3713 fixed_regs[64] = 1;
3714
3715 /* 64-bit AIX and Linux reserve GPR13 for thread-private data. */
3716 if (TARGET_64BIT)
3717 fixed_regs[13] = call_used_regs[13]
3718 = call_really_used_regs[13] = 1;
3719
3720 /* Conditionally disable FPRs. */
3721 if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
3722 for (i = 32; i < 64; i++)
3723 fixed_regs[i] = call_used_regs[i]
3724 = call_really_used_regs[i] = 1;
3725
3726 /* The TOC register is not killed across calls in a way that is
3727 visible to the compiler. */
3728 if (DEFAULT_ABI == ABI_AIX)
3729 call_really_used_regs[2] = 0;
3730
3731 if (DEFAULT_ABI == ABI_V4
3732 && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
3733 && flag_pic == 2)
3734 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3735
3736 if (DEFAULT_ABI == ABI_V4
3737 && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
3738 && flag_pic == 1)
3739 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3740 = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3741 = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3742
3743 if (DEFAULT_ABI == ABI_DARWIN
3744 && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
3745 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3746 = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3747 = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3748
3749 if (TARGET_TOC && TARGET_MINIMAL_TOC)
3750 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3751 = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3752
3753 if (TARGET_ALTIVEC)
3754 global_regs[VSCR_REGNO] = 1;
3755
3756 if (TARGET_SPE)
3757 {
3758 global_regs[SPEFSCR_REGNO] = 1;
3759 fixed_regs[FIXED_SCRATCH]
3760 = call_used_regs[FIXED_SCRATCH]
3761 = call_really_used_regs[FIXED_SCRATCH] = 1;
3762 }
3763
3764 if (! TARGET_ALTIVEC)
3765 {
3766 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
3767 fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
3768 call_really_used_regs[VRSAVE_REGNO] = 1;
3769 }
3770
3771 if (TARGET_ALTIVEC_ABI)
3772 for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
3773 call_used_regs[i] = call_really_used_regs[i] = 1;
3774 }
3775
3776 /* Try to output insns to set TARGET equal to the constant C if it can
3777 be done in less than N insns. Do all computations in MODE.
3778 Returns the place where the output has been placed if it can be
3779 done and the insns have been emitted. If it would take more than N
3780 insns, zero is returned and no insns and emitted. */
3781
3782 rtx
rs6000_emit_set_const(rtx dest,enum machine_mode mode,rtx source,int n ATTRIBUTE_UNUSED)3783 rs6000_emit_set_const (rtx dest, enum machine_mode mode,
3784 rtx source, int n ATTRIBUTE_UNUSED)
3785 {
3786 rtx result, insn, set;
3787 HOST_WIDE_INT c0, c1;
3788
3789 switch (mode)
3790 {
3791 case QImode:
3792 case HImode:
3793 if (dest == NULL)
3794 dest = gen_reg_rtx (mode);
3795 emit_insn (gen_rtx_SET (VOIDmode, dest, source));
3796 return dest;
3797
3798 case SImode:
3799 result = no_new_pseudos ? dest : gen_reg_rtx (SImode);
3800
3801 emit_insn (gen_rtx_SET (VOIDmode, result,
3802 GEN_INT (INTVAL (source)
3803 & (~ (HOST_WIDE_INT) 0xffff))));
3804 emit_insn (gen_rtx_SET (VOIDmode, dest,
3805 gen_rtx_IOR (SImode, result,
3806 GEN_INT (INTVAL (source) & 0xffff))));
3807 result = dest;
3808 break;
3809
3810 case DImode:
3811 switch (GET_CODE (source))
3812 {
3813 case CONST_INT:
3814 c0 = INTVAL (source);
3815 c1 = -(c0 < 0);
3816 break;
3817
3818 case CONST_DOUBLE:
3819 #if HOST_BITS_PER_WIDE_INT >= 64
3820 c0 = CONST_DOUBLE_LOW (source);
3821 c1 = -(c0 < 0);
3822 #else
3823 c0 = CONST_DOUBLE_LOW (source);
3824 c1 = CONST_DOUBLE_HIGH (source);
3825 #endif
3826 break;
3827
3828 default:
3829 gcc_unreachable ();
3830 }
3831
3832 result = rs6000_emit_set_long_const (dest, c0, c1);
3833 break;
3834
3835 default:
3836 gcc_unreachable ();
3837 }
3838
3839 insn = get_last_insn ();
3840 set = single_set (insn);
3841 if (! CONSTANT_P (SET_SRC (set)))
3842 set_unique_reg_note (insn, REG_EQUAL, source);
3843
3844 return result;
3845 }
3846
3847 /* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
3848 fall back to a straight forward decomposition. We do this to avoid
3849 exponential run times encountered when looking for longer sequences
3850 with rs6000_emit_set_const. */
3851 static rtx
rs6000_emit_set_long_const(rtx dest,HOST_WIDE_INT c1,HOST_WIDE_INT c2)3852 rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
3853 {
3854 if (!TARGET_POWERPC64)
3855 {
3856 rtx operand1, operand2;
3857
3858 operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
3859 DImode);
3860 operand2 = operand_subword_force (dest, WORDS_BIG_ENDIAN != 0,
3861 DImode);
3862 emit_move_insn (operand1, GEN_INT (c1));
3863 emit_move_insn (operand2, GEN_INT (c2));
3864 }
3865 else
3866 {
3867 HOST_WIDE_INT ud1, ud2, ud3, ud4;
3868
3869 ud1 = c1 & 0xffff;
3870 ud2 = (c1 & 0xffff0000) >> 16;
3871 #if HOST_BITS_PER_WIDE_INT >= 64
3872 c2 = c1 >> 32;
3873 #endif
3874 ud3 = c2 & 0xffff;
3875 ud4 = (c2 & 0xffff0000) >> 16;
3876
3877 if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
3878 || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
3879 {
3880 if (ud1 & 0x8000)
3881 emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) - 0x8000)));
3882 else
3883 emit_move_insn (dest, GEN_INT (ud1));
3884 }
3885
3886 else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
3887 || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
3888 {
3889 if (ud2 & 0x8000)
3890 emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
3891 - 0x80000000));
3892 else
3893 emit_move_insn (dest, GEN_INT (ud2 << 16));
3894 if (ud1 != 0)
3895 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
3896 }
3897 else if ((ud4 == 0xffff && (ud3 & 0x8000))
3898 || (ud4 == 0 && ! (ud3 & 0x8000)))
3899 {
3900 if (ud3 & 0x8000)
3901 emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
3902 - 0x80000000));
3903 else
3904 emit_move_insn (dest, GEN_INT (ud3 << 16));
3905
3906 if (ud2 != 0)
3907 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud2)));
3908 emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (16)));
3909 if (ud1 != 0)
3910 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
3911 }
3912 else
3913 {
3914 if (ud4 & 0x8000)
3915 emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
3916 - 0x80000000));
3917 else
3918 emit_move_insn (dest, GEN_INT (ud4 << 16));
3919
3920 if (ud3 != 0)
3921 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud3)));
3922
3923 emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (32)));
3924 if (ud2 != 0)
3925 emit_move_insn (dest, gen_rtx_IOR (DImode, dest,
3926 GEN_INT (ud2 << 16)));
3927 if (ud1 != 0)
3928 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
3929 }
3930 }
3931 return dest;
3932 }
3933
3934 /* Helper for the following. Get rid of [r+r] memory refs
3935 in cases where it won't work (TImode, TFmode). */
3936
3937 static void
rs6000_eliminate_indexed_memrefs(rtx operands[2])3938 rs6000_eliminate_indexed_memrefs (rtx operands[2])
3939 {
3940 if (GET_CODE (operands[0]) == MEM
3941 && GET_CODE (XEXP (operands[0], 0)) != REG
3942 && ! legitimate_constant_pool_address_p (XEXP (operands[0], 0))
3943 && ! reload_in_progress)
3944 operands[0]
3945 = replace_equiv_address (operands[0],
3946 copy_addr_to_reg (XEXP (operands[0], 0)));
3947
3948 if (GET_CODE (operands[1]) == MEM
3949 && GET_CODE (XEXP (operands[1], 0)) != REG
3950 && ! legitimate_constant_pool_address_p (XEXP (operands[1], 0))
3951 && ! reload_in_progress)
3952 operands[1]
3953 = replace_equiv_address (operands[1],
3954 copy_addr_to_reg (XEXP (operands[1], 0)));
3955 }
3956
3957 /* Emit a move from SOURCE to DEST in mode MODE. */
3958 void
rs6000_emit_move(rtx dest,rtx source,enum machine_mode mode)3959 rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
3960 {
3961 rtx operands[2];
3962 operands[0] = dest;
3963 operands[1] = source;
3964
3965 /* Sanity checks. Check that we get CONST_DOUBLE only when we should. */
3966 if (GET_CODE (operands[1]) == CONST_DOUBLE
3967 && ! FLOAT_MODE_P (mode)
3968 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
3969 {
3970 /* FIXME. This should never happen. */
3971 /* Since it seems that it does, do the safe thing and convert
3972 to a CONST_INT. */
3973 operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
3974 }
3975 gcc_assert (GET_CODE (operands[1]) != CONST_DOUBLE
3976 || FLOAT_MODE_P (mode)
3977 || ((CONST_DOUBLE_HIGH (operands[1]) != 0
3978 || CONST_DOUBLE_LOW (operands[1]) < 0)
3979 && (CONST_DOUBLE_HIGH (operands[1]) != -1
3980 || CONST_DOUBLE_LOW (operands[1]) >= 0)));
3981
3982 /* Check if GCC is setting up a block move that will end up using FP
3983 registers as temporaries. We must make sure this is acceptable. */
3984 if (GET_CODE (operands[0]) == MEM
3985 && GET_CODE (operands[1]) == MEM
3986 && mode == DImode
3987 && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
3988 || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
3989 && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
3990 ? 32 : MEM_ALIGN (operands[0])))
3991 || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
3992 ? 32
3993 : MEM_ALIGN (operands[1]))))
3994 && ! MEM_VOLATILE_P (operands [0])
3995 && ! MEM_VOLATILE_P (operands [1]))
3996 {
3997 emit_move_insn (adjust_address (operands[0], SImode, 0),
3998 adjust_address (operands[1], SImode, 0));
3999 emit_move_insn (adjust_address (operands[0], SImode, 4),
4000 adjust_address (operands[1], SImode, 4));
4001 return;
4002 }
4003
4004 if (!no_new_pseudos && GET_CODE (operands[0]) == MEM
4005 && !gpc_reg_operand (operands[1], mode))
4006 operands[1] = force_reg (mode, operands[1]);
4007
4008 if (mode == SFmode && ! TARGET_POWERPC
4009 && TARGET_HARD_FLOAT && TARGET_FPRS
4010 && GET_CODE (operands[0]) == MEM)
4011 {
4012 int regnum;
4013
4014 if (reload_in_progress || reload_completed)
4015 regnum = true_regnum (operands[1]);
4016 else if (GET_CODE (operands[1]) == REG)
4017 regnum = REGNO (operands[1]);
4018 else
4019 regnum = -1;
4020
4021 /* If operands[1] is a register, on POWER it may have
4022 double-precision data in it, so truncate it to single
4023 precision. */
4024 if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
4025 {
4026 rtx newreg;
4027 newreg = (no_new_pseudos ? operands[1] : gen_reg_rtx (mode));
4028 emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
4029 operands[1] = newreg;
4030 }
4031 }
4032
4033 /* Recognize the case where operand[1] is a reference to thread-local
4034 data and load its address to a register. */
4035 if (rs6000_tls_referenced_p (operands[1]))
4036 {
4037 enum tls_model model;
4038 rtx tmp = operands[1];
4039 rtx addend = NULL;
4040
4041 if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
4042 {
4043 addend = XEXP (XEXP (tmp, 0), 1);
4044 tmp = XEXP (XEXP (tmp, 0), 0);
4045 }
4046
4047 gcc_assert (GET_CODE (tmp) == SYMBOL_REF);
4048 model = SYMBOL_REF_TLS_MODEL (tmp);
4049 gcc_assert (model != 0);
4050
4051 tmp = rs6000_legitimize_tls_address (tmp, model);
4052 if (addend)
4053 {
4054 tmp = gen_rtx_PLUS (mode, tmp, addend);
4055 tmp = force_operand (tmp, operands[0]);
4056 }
4057 operands[1] = tmp;
4058 }
4059
4060 /* Handle the case where reload calls us with an invalid address. */
4061 if (reload_in_progress && mode == Pmode
4062 && (! general_operand (operands[1], mode)
4063 || ! nonimmediate_operand (operands[0], mode)))
4064 goto emit_set;
4065
4066 /* 128-bit constant floating-point values on Darwin should really be
4067 loaded as two parts. */
4068 if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128
4069 && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE)
4070 {
4071 /* DImode is used, not DFmode, because simplify_gen_subreg doesn't
4072 know how to get a DFmode SUBREG of a TFmode. */
4073 rs6000_emit_move (simplify_gen_subreg (DImode, operands[0], mode, 0),
4074 simplify_gen_subreg (DImode, operands[1], mode, 0),
4075 DImode);
4076 rs6000_emit_move (simplify_gen_subreg (DImode, operands[0], mode,
4077 GET_MODE_SIZE (DImode)),
4078 simplify_gen_subreg (DImode, operands[1], mode,
4079 GET_MODE_SIZE (DImode)),
4080 DImode);
4081 return;
4082 }
4083
4084 /* FIXME: In the long term, this switch statement should go away
4085 and be replaced by a sequence of tests based on things like
4086 mode == Pmode. */
4087 switch (mode)
4088 {
4089 case HImode:
4090 case QImode:
4091 if (CONSTANT_P (operands[1])
4092 && GET_CODE (operands[1]) != CONST_INT)
4093 operands[1] = force_const_mem (mode, operands[1]);
4094 break;
4095
4096 case TFmode:
4097 rs6000_eliminate_indexed_memrefs (operands);
4098 /* fall through */
4099
4100 case DFmode:
4101 case SFmode:
4102 if (CONSTANT_P (operands[1])
4103 && ! easy_fp_constant (operands[1], mode))
4104 operands[1] = force_const_mem (mode, operands[1]);
4105 break;
4106
4107 case V16QImode:
4108 case V8HImode:
4109 case V4SFmode:
4110 case V4SImode:
4111 case V4HImode:
4112 case V2SFmode:
4113 case V2SImode:
4114 case V1DImode:
4115 if (CONSTANT_P (operands[1])
4116 && !easy_vector_constant (operands[1], mode))
4117 operands[1] = force_const_mem (mode, operands[1]);
4118 break;
4119
4120 case SImode:
4121 case DImode:
4122 /* Use default pattern for address of ELF small data */
4123 if (TARGET_ELF
4124 && mode == Pmode
4125 && DEFAULT_ABI == ABI_V4
4126 && (GET_CODE (operands[1]) == SYMBOL_REF
4127 || GET_CODE (operands[1]) == CONST)
4128 && small_data_operand (operands[1], mode))
4129 {
4130 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
4131 return;
4132 }
4133
4134 if (DEFAULT_ABI == ABI_V4
4135 && mode == Pmode && mode == SImode
4136 && flag_pic == 1 && got_operand (operands[1], mode))
4137 {
4138 emit_insn (gen_movsi_got (operands[0], operands[1]));
4139 return;
4140 }
4141
4142 if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
4143 && TARGET_NO_TOC
4144 && ! flag_pic
4145 && mode == Pmode
4146 && CONSTANT_P (operands[1])
4147 && GET_CODE (operands[1]) != HIGH
4148 && GET_CODE (operands[1]) != CONST_INT)
4149 {
4150 rtx target = (no_new_pseudos ? operands[0] : gen_reg_rtx (mode));
4151
4152 /* If this is a function address on -mcall-aixdesc,
4153 convert it to the address of the descriptor. */
4154 if (DEFAULT_ABI == ABI_AIX
4155 && GET_CODE (operands[1]) == SYMBOL_REF
4156 && XSTR (operands[1], 0)[0] == '.')
4157 {
4158 const char *name = XSTR (operands[1], 0);
4159 rtx new_ref;
4160 while (*name == '.')
4161 name++;
4162 new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
4163 CONSTANT_POOL_ADDRESS_P (new_ref)
4164 = CONSTANT_POOL_ADDRESS_P (operands[1]);
4165 SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
4166 SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
4167 SYMBOL_REF_DATA (new_ref) = SYMBOL_REF_DATA (operands[1]);
4168 operands[1] = new_ref;
4169 }
4170
4171 if (DEFAULT_ABI == ABI_DARWIN)
4172 {
4173 #if TARGET_MACHO
4174 if (MACHO_DYNAMIC_NO_PIC_P)
4175 {
4176 /* Take care of any required data indirection. */
4177 operands[1] = rs6000_machopic_legitimize_pic_address (
4178 operands[1], mode, operands[0]);
4179 if (operands[0] != operands[1])
4180 emit_insn (gen_rtx_SET (VOIDmode,
4181 operands[0], operands[1]));
4182 return;
4183 }
4184 #endif
4185 emit_insn (gen_macho_high (target, operands[1]));
4186 emit_insn (gen_macho_low (operands[0], target, operands[1]));
4187 return;
4188 }
4189
4190 emit_insn (gen_elf_high (target, operands[1]));
4191 emit_insn (gen_elf_low (operands[0], target, operands[1]));
4192 return;
4193 }
4194
4195 /* If this is a SYMBOL_REF that refers to a constant pool entry,
4196 and we have put it in the TOC, we just need to make a TOC-relative
4197 reference to it. */
4198 if (TARGET_TOC
4199 && GET_CODE (operands[1]) == SYMBOL_REF
4200 && constant_pool_expr_p (operands[1])
4201 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
4202 get_pool_mode (operands[1])))
4203 {
4204 operands[1] = create_TOC_reference (operands[1]);
4205 }
4206 else if (mode == Pmode
4207 && CONSTANT_P (operands[1])
4208 && ((GET_CODE (operands[1]) != CONST_INT
4209 && ! easy_fp_constant (operands[1], mode))
4210 || (GET_CODE (operands[1]) == CONST_INT
4211 && num_insns_constant (operands[1], mode) > 2)
4212 || (GET_CODE (operands[0]) == REG
4213 && FP_REGNO_P (REGNO (operands[0]))))
4214 && GET_CODE (operands[1]) != HIGH
4215 && ! legitimate_constant_pool_address_p (operands[1])
4216 && ! toc_relative_expr_p (operands[1]))
4217 {
4218 /* Emit a USE operation so that the constant isn't deleted if
4219 expensive optimizations are turned on because nobody
4220 references it. This should only be done for operands that
4221 contain SYMBOL_REFs with CONSTANT_POOL_ADDRESS_P set.
4222 This should not be done for operands that contain LABEL_REFs.
4223 For now, we just handle the obvious case. */
4224 if (GET_CODE (operands[1]) != LABEL_REF)
4225 emit_insn (gen_rtx_USE (VOIDmode, operands[1]));
4226
4227 #if TARGET_MACHO
4228 /* Darwin uses a special PIC legitimizer. */
4229 if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
4230 {
4231 operands[1] =
4232 rs6000_machopic_legitimize_pic_address (operands[1], mode,
4233 operands[0]);
4234 if (operands[0] != operands[1])
4235 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
4236 return;
4237 }
4238 #endif
4239
4240 /* If we are to limit the number of things we put in the TOC and
4241 this is a symbol plus a constant we can add in one insn,
4242 just put the symbol in the TOC and add the constant. Don't do
4243 this if reload is in progress. */
4244 if (GET_CODE (operands[1]) == CONST
4245 && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
4246 && GET_CODE (XEXP (operands[1], 0)) == PLUS
4247 && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
4248 && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
4249 || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
4250 && ! side_effects_p (operands[0]))
4251 {
4252 rtx sym =
4253 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
4254 rtx other = XEXP (XEXP (operands[1], 0), 1);
4255
4256 sym = force_reg (mode, sym);
4257 if (mode == SImode)
4258 emit_insn (gen_addsi3 (operands[0], sym, other));
4259 else
4260 emit_insn (gen_adddi3 (operands[0], sym, other));
4261 return;
4262 }
4263
4264 operands[1] = force_const_mem (mode, operands[1]);
4265
4266 if (TARGET_TOC
4267 && constant_pool_expr_p (XEXP (operands[1], 0))
4268 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
4269 get_pool_constant (XEXP (operands[1], 0)),
4270 get_pool_mode (XEXP (operands[1], 0))))
4271 {
4272 operands[1]
4273 = gen_const_mem (mode,
4274 create_TOC_reference (XEXP (operands[1], 0)));
4275 set_mem_alias_set (operands[1], get_TOC_alias_set ());
4276 }
4277 }
4278 break;
4279
4280 case TImode:
4281 rs6000_eliminate_indexed_memrefs (operands);
4282
4283 if (TARGET_POWER)
4284 {
4285 emit_insn (gen_rtx_PARALLEL (VOIDmode,
4286 gen_rtvec (2,
4287 gen_rtx_SET (VOIDmode,
4288 operands[0], operands[1]),
4289 gen_rtx_CLOBBER (VOIDmode,
4290 gen_rtx_SCRATCH (SImode)))));
4291 return;
4292 }
4293 break;
4294
4295 default:
4296 gcc_unreachable ();
4297 }
4298
4299 /* Above, we may have called force_const_mem which may have returned
4300 an invalid address. If we can, fix this up; otherwise, reload will
4301 have to deal with it. */
4302 if (GET_CODE (operands[1]) == MEM && ! reload_in_progress)
4303 operands[1] = validize_mem (operands[1]);
4304
4305 emit_set:
4306 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
4307 }
4308
4309 /* Nonzero if we can use a floating-point register to pass this arg. */
4310 #define USE_FP_FOR_ARG_P(CUM,MODE,TYPE) \
4311 (SCALAR_FLOAT_MODE_P (MODE) \
4312 && !DECIMAL_FLOAT_MODE_P (MODE) \
4313 && (CUM)->fregno <= FP_ARG_MAX_REG \
4314 && TARGET_HARD_FLOAT && TARGET_FPRS)
4315
4316 /* Nonzero if we can use an AltiVec register to pass this arg. */
4317 #define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,TYPE,NAMED) \
4318 (ALTIVEC_VECTOR_MODE (MODE) \
4319 && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG \
4320 && TARGET_ALTIVEC_ABI \
4321 && (NAMED))
4322
4323 /* Return a nonzero value to say to return the function value in
4324 memory, just as large structures are always returned. TYPE will be
4325 the data type of the value, and FNTYPE will be the type of the
4326 function doing the returning, or @code{NULL} for libcalls.
4327
4328 The AIX ABI for the RS/6000 specifies that all structures are
4329 returned in memory. The Darwin ABI does the same. The SVR4 ABI
4330 specifies that structures <= 8 bytes are returned in r3/r4, but a
4331 draft put them in memory, and GCC used to implement the draft
4332 instead of the final standard. Therefore, aix_struct_return
4333 controls this instead of DEFAULT_ABI; V.4 targets needing backward
4334 compatibility can change DRAFT_V4_STRUCT_RET to override the
4335 default, and -m switches get the final word. See
4336 rs6000_override_options for more details.
4337
4338 The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
4339 long double support is enabled. These values are returned in memory.
4340
4341 int_size_in_bytes returns -1 for variable size objects, which go in
4342 memory always. The cast to unsigned makes -1 > 8. */
4343
4344 static bool
rs6000_return_in_memory(tree type,tree fntype ATTRIBUTE_UNUSED)4345 rs6000_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
4346 {
4347 /* In the darwin64 abi, try to use registers for larger structs
4348 if possible. */
4349 if (rs6000_darwin64_abi
4350 && TREE_CODE (type) == RECORD_TYPE
4351 && int_size_in_bytes (type) > 0)
4352 {
4353 CUMULATIVE_ARGS valcum;
4354 rtx valret;
4355
4356 valcum.words = 0;
4357 valcum.fregno = FP_ARG_MIN_REG;
4358 valcum.vregno = ALTIVEC_ARG_MIN_REG;
4359 /* Do a trial code generation as if this were going to be passed
4360 as an argument; if any part goes in memory, we return NULL. */
4361 valret = rs6000_darwin64_record_arg (&valcum, type, 1, true);
4362 if (valret)
4363 return false;
4364 /* Otherwise fall through to more conventional ABI rules. */
4365 }
4366
4367 if (AGGREGATE_TYPE_P (type)
4368 && (aix_struct_return
4369 || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
4370 return true;
4371
4372 /* Allow -maltivec -mabi=no-altivec without warning. Altivec vector
4373 modes only exist for GCC vector types if -maltivec. */
4374 if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
4375 && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
4376 return false;
4377
4378 /* Return synthetic vectors in memory. */
4379 if (TREE_CODE (type) == VECTOR_TYPE
4380 && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
4381 {
4382 static bool warned_for_return_big_vectors = false;
4383 if (!warned_for_return_big_vectors)
4384 {
4385 warning (0, "GCC vector returned by reference: "
4386 "non-standard ABI extension with no compatibility guarantee");
4387 warned_for_return_big_vectors = true;
4388 }
4389 return true;
4390 }
4391
4392 if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && TYPE_MODE (type) == TFmode)
4393 return true;
4394
4395 return false;
4396 }
4397
4398 /* Initialize a variable CUM of type CUMULATIVE_ARGS
4399 for a call to a function whose data type is FNTYPE.
4400 For a library call, FNTYPE is 0.
4401
4402 For incoming args we set the number of arguments in the prototype large
4403 so we never return a PARALLEL. */
4404
4405 void
init_cumulative_args(CUMULATIVE_ARGS * cum,tree fntype,rtx libname ATTRIBUTE_UNUSED,int incoming,int libcall,int n_named_args)4406 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
4407 rtx libname ATTRIBUTE_UNUSED, int incoming,
4408 int libcall, int n_named_args)
4409 {
4410 static CUMULATIVE_ARGS zero_cumulative;
4411
4412 *cum = zero_cumulative;
4413 cum->words = 0;
4414 cum->fregno = FP_ARG_MIN_REG;
4415 cum->vregno = ALTIVEC_ARG_MIN_REG;
4416 cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
4417 cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
4418 ? CALL_LIBCALL : CALL_NORMAL);
4419 cum->sysv_gregno = GP_ARG_MIN_REG;
4420 cum->stdarg = fntype
4421 && (TYPE_ARG_TYPES (fntype) != 0
4422 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
4423 != void_type_node));
4424
4425 cum->nargs_prototype = 0;
4426 if (incoming || cum->prototype)
4427 cum->nargs_prototype = n_named_args;
4428
4429 /* Check for a longcall attribute. */
4430 if ((!fntype && rs6000_default_long_calls)
4431 || (fntype
4432 && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
4433 && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
4434 cum->call_cookie |= CALL_LONG;
4435
4436 if (TARGET_DEBUG_ARG)
4437 {
4438 fprintf (stderr, "\ninit_cumulative_args:");
4439 if (fntype)
4440 {
4441 tree ret_type = TREE_TYPE (fntype);
4442 fprintf (stderr, " ret code = %s,",
4443 tree_code_name[ (int)TREE_CODE (ret_type) ]);
4444 }
4445
4446 if (cum->call_cookie & CALL_LONG)
4447 fprintf (stderr, " longcall,");
4448
4449 fprintf (stderr, " proto = %d, nargs = %d\n",
4450 cum->prototype, cum->nargs_prototype);
4451 }
4452
4453 if (fntype
4454 && !TARGET_ALTIVEC
4455 && TARGET_ALTIVEC_ABI
4456 && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
4457 {
4458 error ("cannot return value in vector register because"
4459 " altivec instructions are disabled, use -maltivec"
4460 " to enable them");
4461 }
4462 }
4463
4464 /* Return true if TYPE must be passed on the stack and not in registers. */
4465
4466 static bool
rs6000_must_pass_in_stack(enum machine_mode mode,tree type)4467 rs6000_must_pass_in_stack (enum machine_mode mode, tree type)
4468 {
4469 if (DEFAULT_ABI == ABI_AIX || TARGET_64BIT)
4470 return must_pass_in_stack_var_size (mode, type);
4471 else
4472 return must_pass_in_stack_var_size_or_pad (mode, type);
4473 }
4474
4475 /* If defined, a C expression which determines whether, and in which
4476 direction, to pad out an argument with extra space. The value
4477 should be of type `enum direction': either `upward' to pad above
4478 the argument, `downward' to pad below, or `none' to inhibit
4479 padding.
4480
4481 For the AIX ABI structs are always stored left shifted in their
4482 argument slot. */
4483
4484 enum direction
function_arg_padding(enum machine_mode mode,tree type)4485 function_arg_padding (enum machine_mode mode, tree type)
4486 {
4487 #ifndef AGGREGATE_PADDING_FIXED
4488 #define AGGREGATE_PADDING_FIXED 0
4489 #endif
4490 #ifndef AGGREGATES_PAD_UPWARD_ALWAYS
4491 #define AGGREGATES_PAD_UPWARD_ALWAYS 0
4492 #endif
4493
4494 if (!AGGREGATE_PADDING_FIXED)
4495 {
4496 /* GCC used to pass structures of the same size as integer types as
4497 if they were in fact integers, ignoring FUNCTION_ARG_PADDING.
4498 i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
4499 passed padded downward, except that -mstrict-align further
4500 muddied the water in that multi-component structures of 2 and 4
4501 bytes in size were passed padded upward.
4502
4503 The following arranges for best compatibility with previous
4504 versions of gcc, but removes the -mstrict-align dependency. */
4505 if (BYTES_BIG_ENDIAN)
4506 {
4507 HOST_WIDE_INT size = 0;
4508
4509 if (mode == BLKmode)
4510 {
4511 if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
4512 size = int_size_in_bytes (type);
4513 }
4514 else
4515 size = GET_MODE_SIZE (mode);
4516
4517 if (size == 1 || size == 2 || size == 4)
4518 return downward;
4519 }
4520 return upward;
4521 }
4522
4523 if (AGGREGATES_PAD_UPWARD_ALWAYS)
4524 {
4525 if (type != 0 && AGGREGATE_TYPE_P (type))
4526 return upward;
4527 }
4528
4529 /* Fall back to the default. */
4530 return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
4531 }
4532
4533 /* If defined, a C expression that gives the alignment boundary, in bits,
4534 of an argument with the specified mode and type. If it is not defined,
4535 PARM_BOUNDARY is used for all arguments.
4536
4537 V.4 wants long longs and doubles to be double word aligned. Just
4538 testing the mode size is a boneheaded way to do this as it means
4539 that other types such as complex int are also double word aligned.
4540 However, we're stuck with this because changing the ABI might break
4541 existing library interfaces.
4542
4543 Doubleword align SPE vectors.
4544 Quadword align Altivec vectors.
4545 Quadword align large synthetic vector types. */
4546
4547 int
function_arg_boundary(enum machine_mode mode,tree type)4548 function_arg_boundary (enum machine_mode mode, tree type)
4549 {
4550 if (DEFAULT_ABI == ABI_V4
4551 && (GET_MODE_SIZE (mode) == 8
4552 || (TARGET_HARD_FLOAT
4553 && TARGET_FPRS
4554 && mode == TFmode)))
4555 return 64;
4556 else if (SPE_VECTOR_MODE (mode)
4557 || (type && TREE_CODE (type) == VECTOR_TYPE
4558 && int_size_in_bytes (type) >= 8
4559 && int_size_in_bytes (type) < 16))
4560 return 64;
4561 else if (ALTIVEC_VECTOR_MODE (mode)
4562 || (type && TREE_CODE (type) == VECTOR_TYPE
4563 && int_size_in_bytes (type) >= 16))
4564 return 128;
4565 else if (rs6000_darwin64_abi && mode == BLKmode
4566 && type && TYPE_ALIGN (type) > 64)
4567 return 128;
4568 else
4569 return PARM_BOUNDARY;
4570 }
4571
4572 /* For a function parm of MODE and TYPE, return the starting word in
4573 the parameter area. NWORDS of the parameter area are already used. */
4574
4575 static unsigned int
rs6000_parm_start(enum machine_mode mode,tree type,unsigned int nwords)4576 rs6000_parm_start (enum machine_mode mode, tree type, unsigned int nwords)
4577 {
4578 unsigned int align;
4579 unsigned int parm_offset;
4580
4581 align = function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
4582 parm_offset = DEFAULT_ABI == ABI_V4 ? 2 : 6;
4583 return nwords + (-(parm_offset + nwords) & align);
4584 }
4585
4586 /* Compute the size (in words) of a function argument. */
4587
4588 static unsigned long
rs6000_arg_size(enum machine_mode mode,tree type)4589 rs6000_arg_size (enum machine_mode mode, tree type)
4590 {
4591 unsigned long size;
4592
4593 if (mode != BLKmode)
4594 size = GET_MODE_SIZE (mode);
4595 else
4596 size = int_size_in_bytes (type);
4597
4598 if (TARGET_32BIT)
4599 return (size + 3) >> 2;
4600 else
4601 return (size + 7) >> 3;
4602 }
4603
4604 /* Use this to flush pending int fields. */
4605
4606 static void
rs6000_darwin64_record_arg_advance_flush(CUMULATIVE_ARGS * cum,HOST_WIDE_INT bitpos)4607 rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
4608 HOST_WIDE_INT bitpos)
4609 {
4610 unsigned int startbit, endbit;
4611 int intregs, intoffset;
4612 enum machine_mode mode;
4613
4614 if (cum->intoffset == -1)
4615 return;
4616
4617 intoffset = cum->intoffset;
4618 cum->intoffset = -1;
4619
4620 if (intoffset % BITS_PER_WORD != 0)
4621 {
4622 mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
4623 MODE_INT, 0);
4624 if (mode == BLKmode)
4625 {
4626 /* We couldn't find an appropriate mode, which happens,
4627 e.g., in packed structs when there are 3 bytes to load.
4628 Back intoffset back to the beginning of the word in this
4629 case. */
4630 intoffset = intoffset & -BITS_PER_WORD;
4631 }
4632 }
4633
4634 startbit = intoffset & -BITS_PER_WORD;
4635 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
4636 intregs = (endbit - startbit) / BITS_PER_WORD;
4637 cum->words += intregs;
4638 }
4639
4640 /* The darwin64 ABI calls for us to recurse down through structs,
4641 looking for elements passed in registers. Unfortunately, we have
4642 to track int register count here also because of misalignments
4643 in powerpc alignment mode. */
4644
4645 static void
rs6000_darwin64_record_arg_advance_recurse(CUMULATIVE_ARGS * cum,tree type,HOST_WIDE_INT startbitpos)4646 rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
4647 tree type,
4648 HOST_WIDE_INT startbitpos)
4649 {
4650 tree f;
4651
4652 for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
4653 if (TREE_CODE (f) == FIELD_DECL)
4654 {
4655 HOST_WIDE_INT bitpos = startbitpos;
4656 tree ftype = TREE_TYPE (f);
4657 enum machine_mode mode;
4658 if (ftype == error_mark_node)
4659 continue;
4660 mode = TYPE_MODE (ftype);
4661
4662 if (DECL_SIZE (f) != 0
4663 && host_integerp (bit_position (f), 1))
4664 bitpos += int_bit_position (f);
4665
4666 /* ??? FIXME: else assume zero offset. */
4667
4668 if (TREE_CODE (ftype) == RECORD_TYPE)
4669 rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
4670 else if (USE_FP_FOR_ARG_P (cum, mode, ftype))
4671 {
4672 rs6000_darwin64_record_arg_advance_flush (cum, bitpos);
4673 cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
4674 cum->words += (GET_MODE_SIZE (mode) + 7) >> 3;
4675 }
4676 else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, 1))
4677 {
4678 rs6000_darwin64_record_arg_advance_flush (cum, bitpos);
4679 cum->vregno++;
4680 cum->words += 2;
4681 }
4682 else if (cum->intoffset == -1)
4683 cum->intoffset = bitpos;
4684 }
4685 }
4686
4687 /* Update the data in CUM to advance over an argument
4688 of mode MODE and data type TYPE.
4689 (TYPE is null for libcalls where that information may not be available.)
4690
4691 Note that for args passed by reference, function_arg will be called
4692 with MODE and TYPE set to that of the pointer to the arg, not the arg
4693 itself. */
4694
4695 void
function_arg_advance(CUMULATIVE_ARGS * cum,enum machine_mode mode,tree type,int named,int depth)4696 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4697 tree type, int named, int depth)
4698 {
4699 int size;
4700
4701 /* Only tick off an argument if we're not recursing. */
4702 if (depth == 0)
4703 cum->nargs_prototype--;
4704
4705 if (TARGET_ALTIVEC_ABI
4706 && (ALTIVEC_VECTOR_MODE (mode)
4707 || (type && TREE_CODE (type) == VECTOR_TYPE
4708 && int_size_in_bytes (type) == 16)))
4709 {
4710 bool stack = false;
4711
4712 if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
4713 {
4714 cum->vregno++;
4715 if (!TARGET_ALTIVEC)
4716 error ("cannot pass argument in vector register because"
4717 " altivec instructions are disabled, use -maltivec"
4718 " to enable them");
4719
4720 /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
4721 even if it is going to be passed in a vector register.
4722 Darwin does the same for variable-argument functions. */
4723 if ((DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
4724 || (cum->stdarg && DEFAULT_ABI != ABI_V4))
4725 stack = true;
4726 }
4727 else
4728 stack = true;
4729
4730 if (stack)
4731 {
4732 int align;
4733
4734 /* Vector parameters must be 16-byte aligned. This places
4735 them at 2 mod 4 in terms of words in 32-bit mode, since
4736 the parameter save area starts at offset 24 from the
4737 stack. In 64-bit mode, they just have to start on an
4738 even word, since the parameter save area is 16-byte
4739 aligned. Space for GPRs is reserved even if the argument
4740 will be passed in memory. */
4741 if (TARGET_32BIT)
4742 align = (2 - cum->words) & 3;
4743 else
4744 align = cum->words & 1;
4745 cum->words += align + rs6000_arg_size (mode, type);
4746
4747 if (TARGET_DEBUG_ARG)
4748 {
4749 fprintf (stderr, "function_adv: words = %2d, align=%d, ",
4750 cum->words, align);
4751 fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
4752 cum->nargs_prototype, cum->prototype,
4753 GET_MODE_NAME (mode));
4754 }
4755 }
4756 }
4757 else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
4758 && !cum->stdarg
4759 && cum->sysv_gregno <= GP_ARG_MAX_REG)
4760 cum->sysv_gregno++;
4761
4762 else if (rs6000_darwin64_abi
4763 && mode == BLKmode
4764 && TREE_CODE (type) == RECORD_TYPE
4765 && (size = int_size_in_bytes (type)) > 0)
4766 {
4767 /* Variable sized types have size == -1 and are
4768 treated as if consisting entirely of ints.
4769 Pad to 16 byte boundary if needed. */
4770 if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
4771 && (cum->words % 2) != 0)
4772 cum->words++;
4773 /* For varargs, we can just go up by the size of the struct. */
4774 if (!named)
4775 cum->words += (size + 7) / 8;
4776 else
4777 {
4778 /* It is tempting to say int register count just goes up by
4779 sizeof(type)/8, but this is wrong in a case such as
4780 { int; double; int; } [powerpc alignment]. We have to
4781 grovel through the fields for these too. */
4782 cum->intoffset = 0;
4783 rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
4784 rs6000_darwin64_record_arg_advance_flush (cum,
4785 size * BITS_PER_UNIT);
4786 }
4787 }
4788 else if (DEFAULT_ABI == ABI_V4)
4789 {
4790 if (TARGET_HARD_FLOAT && TARGET_FPRS
4791 && (mode == SFmode || mode == DFmode
4792 || (mode == TFmode && !TARGET_IEEEQUAD)))
4793 {
4794 if (cum->fregno + (mode == TFmode ? 1 : 0) <= FP_ARG_V4_MAX_REG)
4795 cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
4796 else
4797 {
4798 cum->fregno = FP_ARG_V4_MAX_REG + 1;
4799 if (mode == DFmode || mode == TFmode)
4800 cum->words += cum->words & 1;
4801 cum->words += rs6000_arg_size (mode, type);
4802 }
4803 }
4804 else
4805 {
4806 int n_words = rs6000_arg_size (mode, type);
4807 int gregno = cum->sysv_gregno;
4808
4809 /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
4810 (r7,r8) or (r9,r10). As does any other 2 word item such
4811 as complex int due to a historical mistake. */
4812 if (n_words == 2)
4813 gregno += (1 - gregno) & 1;
4814
4815 /* Multi-reg args are not split between registers and stack. */
4816 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
4817 {
4818 /* Long long and SPE vectors are aligned on the stack.
4819 So are other 2 word items such as complex int due to
4820 a historical mistake. */
4821 if (n_words == 2)
4822 cum->words += cum->words & 1;
4823 cum->words += n_words;
4824 }
4825
4826 /* Note: continuing to accumulate gregno past when we've started
4827 spilling to the stack indicates the fact that we've started
4828 spilling to the stack to expand_builtin_saveregs. */
4829 cum->sysv_gregno = gregno + n_words;
4830 }
4831
4832 if (TARGET_DEBUG_ARG)
4833 {
4834 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
4835 cum->words, cum->fregno);
4836 fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
4837 cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
4838 fprintf (stderr, "mode = %4s, named = %d\n",
4839 GET_MODE_NAME (mode), named);
4840 }
4841 }
4842 else
4843 {
4844 int n_words = rs6000_arg_size (mode, type);
4845 int start_words = cum->words;
4846 int align_words = rs6000_parm_start (mode, type, start_words);
4847
4848 cum->words = align_words + n_words;
4849
4850 if (SCALAR_FLOAT_MODE_P (mode)
4851 && !DECIMAL_FLOAT_MODE_P (mode)
4852 && TARGET_HARD_FLOAT && TARGET_FPRS)
4853 cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
4854
4855 if (TARGET_DEBUG_ARG)
4856 {
4857 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
4858 cum->words, cum->fregno);
4859 fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
4860 cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
4861 fprintf (stderr, "named = %d, align = %d, depth = %d\n",
4862 named, align_words - start_words, depth);
4863 }
4864 }
4865 }
4866
4867 static rtx
spe_build_register_parallel(enum machine_mode mode,int gregno)4868 spe_build_register_parallel (enum machine_mode mode, int gregno)
4869 {
4870 rtx r1, r3;
4871
4872 switch (mode)
4873 {
4874 case DFmode:
4875 r1 = gen_rtx_REG (DImode, gregno);
4876 r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
4877 return gen_rtx_PARALLEL (mode, gen_rtvec (1, r1));
4878
4879 case DCmode:
4880 r1 = gen_rtx_REG (DImode, gregno);
4881 r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
4882 r3 = gen_rtx_REG (DImode, gregno + 2);
4883 r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
4884 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r3));
4885
4886 default:
4887 gcc_unreachable ();
4888 }
4889 }
4890
4891 /* Determine where to put a SIMD argument on the SPE. */
4892 static rtx
rs6000_spe_function_arg(CUMULATIVE_ARGS * cum,enum machine_mode mode,tree type)4893 rs6000_spe_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4894 tree type)
4895 {
4896 int gregno = cum->sysv_gregno;
4897
4898 /* On E500 v2, double arithmetic is done on the full 64-bit GPR, but
4899 are passed and returned in a pair of GPRs for ABI compatibility. */
4900 if (TARGET_E500_DOUBLE && (mode == DFmode || mode == DCmode))
4901 {
4902 int n_words = rs6000_arg_size (mode, type);
4903
4904 /* Doubles go in an odd/even register pair (r5/r6, etc). */
4905 if (mode == DFmode)
4906 gregno += (1 - gregno) & 1;
4907
4908 /* Multi-reg args are not split between registers and stack. */
4909 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
4910 return NULL_RTX;
4911
4912 return spe_build_register_parallel (mode, gregno);
4913 }
4914 if (cum->stdarg)
4915 {
4916 int n_words = rs6000_arg_size (mode, type);
4917
4918 /* SPE vectors are put in odd registers. */
4919 if (n_words == 2 && (gregno & 1) == 0)
4920 gregno += 1;
4921
4922 if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
4923 {
4924 rtx r1, r2;
4925 enum machine_mode m = SImode;
4926
4927 r1 = gen_rtx_REG (m, gregno);
4928 r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
4929 r2 = gen_rtx_REG (m, gregno + 1);
4930 r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
4931 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
4932 }
4933 else
4934 return NULL_RTX;
4935 }
4936 else
4937 {
4938 if (gregno <= GP_ARG_MAX_REG)
4939 return gen_rtx_REG (mode, gregno);
4940 else
4941 return NULL_RTX;
4942 }
4943 }
4944
4945 /* A subroutine of rs6000_darwin64_record_arg. Assign the bits of the
4946 structure between cum->intoffset and bitpos to integer registers. */
4947
4948 static void
rs6000_darwin64_record_arg_flush(CUMULATIVE_ARGS * cum,HOST_WIDE_INT bitpos,rtx rvec[],int * k)4949 rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum,
4950 HOST_WIDE_INT bitpos, rtx rvec[], int *k)
4951 {
4952 enum machine_mode mode;
4953 unsigned int regno;
4954 unsigned int startbit, endbit;
4955 int this_regno, intregs, intoffset;
4956 rtx reg;
4957
4958 if (cum->intoffset == -1)
4959 return;
4960
4961 intoffset = cum->intoffset;
4962 cum->intoffset = -1;
4963
4964 /* If this is the trailing part of a word, try to only load that
4965 much into the register. Otherwise load the whole register. Note
4966 that in the latter case we may pick up unwanted bits. It's not a
4967 problem at the moment but may wish to revisit. */
4968
4969 if (intoffset % BITS_PER_WORD != 0)
4970 {
4971 mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
4972 MODE_INT, 0);
4973 if (mode == BLKmode)
4974 {
4975 /* We couldn't find an appropriate mode, which happens,
4976 e.g., in packed structs when there are 3 bytes to load.
4977 Back intoffset back to the beginning of the word in this
4978 case. */
4979 intoffset = intoffset & -BITS_PER_WORD;
4980 mode = word_mode;
4981 }
4982 }
4983 else
4984 mode = word_mode;
4985
4986 startbit = intoffset & -BITS_PER_WORD;
4987 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
4988 intregs = (endbit - startbit) / BITS_PER_WORD;
4989 this_regno = cum->words + intoffset / BITS_PER_WORD;
4990
4991 if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
4992 cum->use_stack = 1;
4993
4994 intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
4995 if (intregs <= 0)
4996 return;
4997
4998 intoffset /= BITS_PER_UNIT;
4999 do
5000 {
5001 regno = GP_ARG_MIN_REG + this_regno;
5002 reg = gen_rtx_REG (mode, regno);
5003 rvec[(*k)++] =
5004 gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
5005
5006 this_regno += 1;
5007 intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
5008 mode = word_mode;
5009 intregs -= 1;
5010 }
5011 while (intregs > 0);
5012 }
5013
5014 /* Recursive workhorse for the following. */
5015
5016 static void
rs6000_darwin64_record_arg_recurse(CUMULATIVE_ARGS * cum,tree type,HOST_WIDE_INT startbitpos,rtx rvec[],int * k)5017 rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, tree type,
5018 HOST_WIDE_INT startbitpos, rtx rvec[],
5019 int *k)
5020 {
5021 tree f;
5022
5023 for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
5024 if (TREE_CODE (f) == FIELD_DECL)
5025 {
5026 HOST_WIDE_INT bitpos = startbitpos;
5027 tree ftype = TREE_TYPE (f);
5028 enum machine_mode mode;
5029 if (ftype == error_mark_node)
5030 continue;
5031 mode = TYPE_MODE (ftype);
5032
5033 if (DECL_SIZE (f) != 0
5034 && host_integerp (bit_position (f), 1))
5035 bitpos += int_bit_position (f);
5036
5037 /* ??? FIXME: else assume zero offset. */
5038
5039 if (TREE_CODE (ftype) == RECORD_TYPE)
5040 rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
5041 else if (cum->named && USE_FP_FOR_ARG_P (cum, mode, ftype))
5042 {
5043 #if 0
5044 switch (mode)
5045 {
5046 case SCmode: mode = SFmode; break;
5047 case DCmode: mode = DFmode; break;
5048 case TCmode: mode = TFmode; break;
5049 default: break;
5050 }
5051 #endif
5052 rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
5053 rvec[(*k)++]
5054 = gen_rtx_EXPR_LIST (VOIDmode,
5055 gen_rtx_REG (mode, cum->fregno++),
5056 GEN_INT (bitpos / BITS_PER_UNIT));
5057 if (mode == TFmode)
5058 cum->fregno++;
5059 }
5060 else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, ftype, 1))
5061 {
5062 rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
5063 rvec[(*k)++]
5064 = gen_rtx_EXPR_LIST (VOIDmode,
5065 gen_rtx_REG (mode, cum->vregno++),
5066 GEN_INT (bitpos / BITS_PER_UNIT));
5067 }
5068 else if (cum->intoffset == -1)
5069 cum->intoffset = bitpos;
5070 }
5071 }
5072
5073 /* For the darwin64 ABI, we want to construct a PARALLEL consisting of
5074 the register(s) to be used for each field and subfield of a struct
5075 being passed by value, along with the offset of where the
5076 register's value may be found in the block. FP fields go in FP
5077 register, vector fields go in vector registers, and everything
5078 else goes in int registers, packed as in memory.
5079
5080 This code is also used for function return values. RETVAL indicates
5081 whether this is the case.
5082
5083 Much of this is taken from the SPARC V9 port, which has a similar
5084 calling convention. */
5085
5086 static rtx
rs6000_darwin64_record_arg(CUMULATIVE_ARGS * orig_cum,tree type,int named,bool retval)5087 rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, tree type,
5088 int named, bool retval)
5089 {
5090 rtx rvec[FIRST_PSEUDO_REGISTER];
5091 int k = 1, kbase = 1;
5092 HOST_WIDE_INT typesize = int_size_in_bytes (type);
5093 /* This is a copy; modifications are not visible to our caller. */
5094 CUMULATIVE_ARGS copy_cum = *orig_cum;
5095 CUMULATIVE_ARGS *cum = ©_cum;
5096
5097 /* Pad to 16 byte boundary if needed. */
5098 if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
5099 && (cum->words % 2) != 0)
5100 cum->words++;
5101
5102 cum->intoffset = 0;
5103 cum->use_stack = 0;
5104 cum->named = named;
5105
5106 /* Put entries into rvec[] for individual FP and vector fields, and
5107 for the chunks of memory that go in int regs. Note we start at
5108 element 1; 0 is reserved for an indication of using memory, and
5109 may or may not be filled in below. */
5110 rs6000_darwin64_record_arg_recurse (cum, type, 0, rvec, &k);
5111 rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
5112
5113 /* If any part of the struct went on the stack put all of it there.
5114 This hack is because the generic code for
5115 FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
5116 parts of the struct are not at the beginning. */
5117 if (cum->use_stack)
5118 {
5119 if (retval)
5120 return NULL_RTX; /* doesn't go in registers at all */
5121 kbase = 0;
5122 rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
5123 }
5124 if (k > 1 || cum->use_stack)
5125 return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
5126 else
5127 return NULL_RTX;
5128 }
5129
5130 /* Determine where to place an argument in 64-bit mode with 32-bit ABI. */
5131
5132 static rtx
rs6000_mixed_function_arg(enum machine_mode mode,tree type,int align_words)5133 rs6000_mixed_function_arg (enum machine_mode mode, tree type, int align_words)
5134 {
5135 int n_units;
5136 int i, k;
5137 rtx rvec[GP_ARG_NUM_REG + 1];
5138
5139 if (align_words >= GP_ARG_NUM_REG)
5140 return NULL_RTX;
5141
5142 n_units = rs6000_arg_size (mode, type);
5143
5144 /* Optimize the simple case where the arg fits in one gpr, except in
5145 the case of BLKmode due to assign_parms assuming that registers are
5146 BITS_PER_WORD wide. */
5147 if (n_units == 0
5148 || (n_units == 1 && mode != BLKmode))
5149 return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
5150
5151 k = 0;
5152 if (align_words + n_units > GP_ARG_NUM_REG)
5153 /* Not all of the arg fits in gprs. Say that it goes in memory too,
5154 using a magic NULL_RTX component.
5155 This is not strictly correct. Only some of the arg belongs in
5156 memory, not all of it. However, the normal scheme using
5157 function_arg_partial_nregs can result in unusual subregs, eg.
5158 (subreg:SI (reg:DF) 4), which are not handled well. The code to
5159 store the whole arg to memory is often more efficient than code
5160 to store pieces, and we know that space is available in the right
5161 place for the whole arg. */
5162 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
5163
5164 i = 0;
5165 do
5166 {
5167 rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
5168 rtx off = GEN_INT (i++ * 4);
5169 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
5170 }
5171 while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
5172
5173 return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
5174 }
5175
5176 /* Determine where to put an argument to a function.
5177 Value is zero to push the argument on the stack,
5178 or a hard register in which to store the argument.
5179
5180 MODE is the argument's machine mode.
5181 TYPE is the data type of the argument (as a tree).
5182 This is null for libcalls where that information may
5183 not be available.
5184 CUM is a variable of type CUMULATIVE_ARGS which gives info about
5185 the preceding args and about the function being called. It is
5186 not modified in this routine.
5187 NAMED is nonzero if this argument is a named parameter
5188 (otherwise it is an extra parameter matching an ellipsis).
5189
5190 On RS/6000 the first eight words of non-FP are normally in registers
5191 and the rest are pushed. Under AIX, the first 13 FP args are in registers.
5192 Under V.4, the first 8 FP args are in registers.
5193
5194 If this is floating-point and no prototype is specified, we use
5195 both an FP and integer register (or possibly FP reg and stack). Library
5196 functions (when CALL_LIBCALL is set) always have the proper types for args,
5197 so we can pass the FP value just in one register. emit_library_function
5198 doesn't support PARALLEL anyway.
5199
5200 Note that for args passed by reference, function_arg will be called
5201 with MODE and TYPE set to that of the pointer to the arg, not the arg
5202 itself. */
5203
5204 rtx
function_arg(CUMULATIVE_ARGS * cum,enum machine_mode mode,tree type,int named)5205 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5206 tree type, int named)
5207 {
5208 enum rs6000_abi abi = DEFAULT_ABI;
5209
5210 /* Return a marker to indicate whether CR1 needs to set or clear the
5211 bit that V.4 uses to say fp args were passed in registers.
5212 Assume that we don't need the marker for software floating point,
5213 or compiler generated library calls. */
5214 if (mode == VOIDmode)
5215 {
5216 if (abi == ABI_V4
5217 && (cum->call_cookie & CALL_LIBCALL) == 0
5218 && (cum->stdarg
5219 || (cum->nargs_prototype < 0
5220 && (cum->prototype || TARGET_NO_PROTOTYPE))))
5221 {
5222 /* For the SPE, we need to crxor CR6 always. */
5223 if (TARGET_SPE_ABI)
5224 return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
5225 else if (TARGET_HARD_FLOAT && TARGET_FPRS)
5226 return GEN_INT (cum->call_cookie
5227 | ((cum->fregno == FP_ARG_MIN_REG)
5228 ? CALL_V4_SET_FP_ARGS
5229 : CALL_V4_CLEAR_FP_ARGS));
5230 }
5231
5232 return GEN_INT (cum->call_cookie);
5233 }
5234
5235 if (rs6000_darwin64_abi && mode == BLKmode
5236 && TREE_CODE (type) == RECORD_TYPE)
5237 {
5238 rtx rslt = rs6000_darwin64_record_arg (cum, type, named, false);
5239 if (rslt != NULL_RTX)
5240 return rslt;
5241 /* Else fall through to usual handling. */
5242 }
5243
5244 if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
5245 if (TARGET_64BIT && ! cum->prototype)
5246 {
5247 /* Vector parameters get passed in vector register
5248 and also in GPRs or memory, in absence of prototype. */
5249 int align_words;
5250 rtx slot;
5251 align_words = (cum->words + 1) & ~1;
5252
5253 if (align_words >= GP_ARG_NUM_REG)
5254 {
5255 slot = NULL_RTX;
5256 }
5257 else
5258 {
5259 slot = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
5260 }
5261 return gen_rtx_PARALLEL (mode,
5262 gen_rtvec (2,
5263 gen_rtx_EXPR_LIST (VOIDmode,
5264 slot, const0_rtx),
5265 gen_rtx_EXPR_LIST (VOIDmode,
5266 gen_rtx_REG (mode, cum->vregno),
5267 const0_rtx)));
5268 }
5269 else
5270 return gen_rtx_REG (mode, cum->vregno);
5271 else if (TARGET_ALTIVEC_ABI
5272 && (ALTIVEC_VECTOR_MODE (mode)
5273 || (type && TREE_CODE (type) == VECTOR_TYPE
5274 && int_size_in_bytes (type) == 16)))
5275 {
5276 if (named || abi == ABI_V4)
5277 return NULL_RTX;
5278 else
5279 {
5280 /* Vector parameters to varargs functions under AIX or Darwin
5281 get passed in memory and possibly also in GPRs. */
5282 int align, align_words, n_words;
5283 enum machine_mode part_mode;
5284
5285 /* Vector parameters must be 16-byte aligned. This places them at
5286 2 mod 4 in terms of words in 32-bit mode, since the parameter
5287 save area starts at offset 24 from the stack. In 64-bit mode,
5288 they just have to start on an even word, since the parameter
5289 save area is 16-byte aligned. */
5290 if (TARGET_32BIT)
5291 align = (2 - cum->words) & 3;
5292 else
5293 align = cum->words & 1;
5294 align_words = cum->words + align;
5295
5296 /* Out of registers? Memory, then. */
5297 if (align_words >= GP_ARG_NUM_REG)
5298 return NULL_RTX;
5299
5300 if (TARGET_32BIT && TARGET_POWERPC64)
5301 return rs6000_mixed_function_arg (mode, type, align_words);
5302
5303 /* The vector value goes in GPRs. Only the part of the
5304 value in GPRs is reported here. */
5305 part_mode = mode;
5306 n_words = rs6000_arg_size (mode, type);
5307 if (align_words + n_words > GP_ARG_NUM_REG)
5308 /* Fortunately, there are only two possibilities, the value
5309 is either wholly in GPRs or half in GPRs and half not. */
5310 part_mode = DImode;
5311
5312 return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
5313 }
5314 }
5315 else if (TARGET_SPE_ABI && TARGET_SPE
5316 && (SPE_VECTOR_MODE (mode)
5317 || (TARGET_E500_DOUBLE && (mode == DFmode
5318 || mode == DCmode))))
5319 return rs6000_spe_function_arg (cum, mode, type);
5320
5321 else if (abi == ABI_V4)
5322 {
5323 if (TARGET_HARD_FLOAT && TARGET_FPRS
5324 && (mode == SFmode || mode == DFmode
5325 || (mode == TFmode && !TARGET_IEEEQUAD)))
5326 {
5327 if (cum->fregno + (mode == TFmode ? 1 : 0) <= FP_ARG_V4_MAX_REG)
5328 return gen_rtx_REG (mode, cum->fregno);
5329 else
5330 return NULL_RTX;
5331 }
5332 else
5333 {
5334 int n_words = rs6000_arg_size (mode, type);
5335 int gregno = cum->sysv_gregno;
5336
5337 /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
5338 (r7,r8) or (r9,r10). As does any other 2 word item such
5339 as complex int due to a historical mistake. */
5340 if (n_words == 2)
5341 gregno += (1 - gregno) & 1;
5342
5343 /* Multi-reg args are not split between registers and stack. */
5344 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
5345 return NULL_RTX;
5346
5347 if (TARGET_32BIT && TARGET_POWERPC64)
5348 return rs6000_mixed_function_arg (mode, type,
5349 gregno - GP_ARG_MIN_REG);
5350 return gen_rtx_REG (mode, gregno);
5351 }
5352 }
5353 else
5354 {
5355 int align_words = rs6000_parm_start (mode, type, cum->words);
5356
5357 if (USE_FP_FOR_ARG_P (cum, mode, type))
5358 {
5359 rtx rvec[GP_ARG_NUM_REG + 1];
5360 rtx r;
5361 int k;
5362 bool needs_psave;
5363 enum machine_mode fmode = mode;
5364 unsigned long n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
5365
5366 if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
5367 {
5368 /* Currently, we only ever need one reg here because complex
5369 doubles are split. */
5370 gcc_assert (cum->fregno == FP_ARG_MAX_REG && fmode == TFmode);
5371
5372 /* Long double split over regs and memory. */
5373 fmode = DFmode;
5374 }
5375
5376 /* Do we also need to pass this arg in the parameter save
5377 area? */
5378 needs_psave = (type
5379 && (cum->nargs_prototype <= 0
5380 || (DEFAULT_ABI == ABI_AIX
5381 && TARGET_XL_COMPAT
5382 && align_words >= GP_ARG_NUM_REG)));
5383
5384 if (!needs_psave && mode == fmode)
5385 return gen_rtx_REG (fmode, cum->fregno);
5386
5387 k = 0;
5388 if (needs_psave)
5389 {
5390 /* Describe the part that goes in gprs or the stack.
5391 This piece must come first, before the fprs. */
5392 if (align_words < GP_ARG_NUM_REG)
5393 {
5394 unsigned long n_words = rs6000_arg_size (mode, type);
5395
5396 if (align_words + n_words > GP_ARG_NUM_REG
5397 || (TARGET_32BIT && TARGET_POWERPC64))
5398 {
5399 /* If this is partially on the stack, then we only
5400 include the portion actually in registers here. */
5401 enum machine_mode rmode = TARGET_32BIT ? SImode : DImode;
5402 rtx off;
5403 int i = 0;
5404 if (align_words + n_words > GP_ARG_NUM_REG)
5405 /* Not all of the arg fits in gprs. Say that it
5406 goes in memory too, using a magic NULL_RTX
5407 component. Also see comment in
5408 rs6000_mixed_function_arg for why the normal
5409 function_arg_partial_nregs scheme doesn't work
5410 in this case. */
5411 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX,
5412 const0_rtx);
5413 do
5414 {
5415 r = gen_rtx_REG (rmode,
5416 GP_ARG_MIN_REG + align_words);
5417 off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
5418 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
5419 }
5420 while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
5421 }
5422 else
5423 {
5424 /* The whole arg fits in gprs. */
5425 r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
5426 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
5427 }
5428 }
5429 else
5430 /* It's entirely in memory. */
5431 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
5432 }
5433
5434 /* Describe where this piece goes in the fprs. */
5435 r = gen_rtx_REG (fmode, cum->fregno);
5436 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
5437
5438 return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
5439 }
5440 else if (align_words < GP_ARG_NUM_REG)
5441 {
5442 if (TARGET_32BIT && TARGET_POWERPC64)
5443 return rs6000_mixed_function_arg (mode, type, align_words);
5444
5445 if (mode == BLKmode)
5446 mode = Pmode;
5447
5448 return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
5449 }
5450 else
5451 return NULL_RTX;
5452 }
5453 }
5454
5455 /* For an arg passed partly in registers and partly in memory, this is
5456 the number of bytes passed in registers. For args passed entirely in
5457 registers or entirely in memory, zero. When an arg is described by a
5458 PARALLEL, perhaps using more than one register type, this function
5459 returns the number of bytes used by the first element of the PARALLEL. */
5460
5461 static int
rs6000_arg_partial_bytes(CUMULATIVE_ARGS * cum,enum machine_mode mode,tree type,bool named)5462 rs6000_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5463 tree type, bool named)
5464 {
5465 int ret = 0;
5466 int align_words;
5467
5468 if (DEFAULT_ABI == ABI_V4)
5469 return 0;
5470
5471 if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named)
5472 && cum->nargs_prototype >= 0)
5473 return 0;
5474
5475 /* In this complicated case we just disable the partial_nregs code. */
5476 if (rs6000_darwin64_abi && mode == BLKmode
5477 && TREE_CODE (type) == RECORD_TYPE
5478 && int_size_in_bytes (type) > 0)
5479 return 0;
5480
5481 align_words = rs6000_parm_start (mode, type, cum->words);
5482
5483 if (USE_FP_FOR_ARG_P (cum, mode, type))
5484 {
5485 /* If we are passing this arg in the fixed parameter save area
5486 (gprs or memory) as well as fprs, then this function should
5487 return the number of partial bytes passed in the parameter
5488 save area rather than partial bytes passed in fprs. */
5489 if (type
5490 && (cum->nargs_prototype <= 0
5491 || (DEFAULT_ABI == ABI_AIX
5492 && TARGET_XL_COMPAT
5493 && align_words >= GP_ARG_NUM_REG)))
5494 return 0;
5495 else if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3)
5496 > FP_ARG_MAX_REG + 1)
5497 ret = (FP_ARG_MAX_REG + 1 - cum->fregno) * 8;
5498 else if (cum->nargs_prototype >= 0)
5499 return 0;
5500 }
5501
5502 if (align_words < GP_ARG_NUM_REG
5503 && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
5504 ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
5505
5506 if (ret != 0 && TARGET_DEBUG_ARG)
5507 fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
5508
5509 return ret;
5510 }
5511
5512 /* A C expression that indicates when an argument must be passed by
5513 reference. If nonzero for an argument, a copy of that argument is
5514 made in memory and a pointer to the argument is passed instead of
5515 the argument itself. The pointer is passed in whatever way is
5516 appropriate for passing a pointer to that type.
5517
5518 Under V.4, aggregates and long double are passed by reference.
5519
5520 As an extension to all 32-bit ABIs, AltiVec vectors are passed by
5521 reference unless the AltiVec vector extension ABI is in force.
5522
5523 As an extension to all ABIs, variable sized types are passed by
5524 reference. */
5525
5526 static bool
rs6000_pass_by_reference(CUMULATIVE_ARGS * cum ATTRIBUTE_UNUSED,enum machine_mode mode,tree type,bool named ATTRIBUTE_UNUSED)5527 rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5528 enum machine_mode mode, tree type,
5529 bool named ATTRIBUTE_UNUSED)
5530 {
5531 if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && mode == TFmode)
5532 {
5533 if (TARGET_DEBUG_ARG)
5534 fprintf (stderr, "function_arg_pass_by_reference: V4 long double\n");
5535 return 1;
5536 }
5537
5538 if (!type)
5539 return 0;
5540
5541 if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (type))
5542 {
5543 if (TARGET_DEBUG_ARG)
5544 fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
5545 return 1;
5546 }
5547
5548 if (int_size_in_bytes (type) < 0)
5549 {
5550 if (TARGET_DEBUG_ARG)
5551 fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
5552 return 1;
5553 }
5554
5555 /* Allow -maltivec -mabi=no-altivec without warning. Altivec vector
5556 modes only exist for GCC vector types if -maltivec. */
5557 if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
5558 {
5559 if (TARGET_DEBUG_ARG)
5560 fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
5561 return 1;
5562 }
5563
5564 /* Pass synthetic vectors in memory. */
5565 if (TREE_CODE (type) == VECTOR_TYPE
5566 && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
5567 {
5568 static bool warned_for_pass_big_vectors = false;
5569 if (TARGET_DEBUG_ARG)
5570 fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
5571 if (!warned_for_pass_big_vectors)
5572 {
5573 warning (0, "GCC vector passed by reference: "
5574 "non-standard ABI extension with no compatibility guarantee");
5575 warned_for_pass_big_vectors = true;
5576 }
5577 return 1;
5578 }
5579
5580 return 0;
5581 }
5582
5583 static void
rs6000_move_block_from_reg(int regno,rtx x,int nregs)5584 rs6000_move_block_from_reg (int regno, rtx x, int nregs)
5585 {
5586 int i;
5587 enum machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
5588
5589 if (nregs == 0)
5590 return;
5591
5592 for (i = 0; i < nregs; i++)
5593 {
5594 rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
5595 if (reload_completed)
5596 {
5597 if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
5598 tem = NULL_RTX;
5599 else
5600 tem = simplify_gen_subreg (reg_mode, x, BLKmode,
5601 i * GET_MODE_SIZE (reg_mode));
5602 }
5603 else
5604 tem = replace_equiv_address (tem, XEXP (tem, 0));
5605
5606 gcc_assert (tem);
5607
5608 emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
5609 }
5610 }
5611
5612 /* Perform any needed actions needed for a function that is receiving a
5613 variable number of arguments.
5614
5615 CUM is as above.
5616
5617 MODE and TYPE are the mode and type of the current parameter.
5618
5619 PRETEND_SIZE is a variable that should be set to the amount of stack
5620 that must be pushed by the prolog to pretend that our caller pushed
5621 it.
5622
5623 Normally, this macro will push all remaining incoming registers on the
5624 stack and set PRETEND_SIZE to the length of the registers pushed. */
5625
5626 static void
setup_incoming_varargs(CUMULATIVE_ARGS * cum,enum machine_mode mode,tree type,int * pretend_size ATTRIBUTE_UNUSED,int no_rtl)5627 setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5628 tree type, int *pretend_size ATTRIBUTE_UNUSED,
5629 int no_rtl)
5630 {
5631 CUMULATIVE_ARGS next_cum;
5632 int reg_size = TARGET_32BIT ? 4 : 8;
5633 rtx save_area = NULL_RTX, mem;
5634 int first_reg_offset, set;
5635
5636 /* Skip the last named argument. */
5637 next_cum = *cum;
5638 function_arg_advance (&next_cum, mode, type, 1, 0);
5639
5640 if (DEFAULT_ABI == ABI_V4)
5641 {
5642 first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
5643
5644 if (! no_rtl)
5645 {
5646 int gpr_reg_num = 0, gpr_size = 0, fpr_size = 0;
5647 HOST_WIDE_INT offset = 0;
5648
5649 /* Try to optimize the size of the varargs save area.
5650 The ABI requires that ap.reg_save_area is doubleword
5651 aligned, but we don't need to allocate space for all
5652 the bytes, only those to which we actually will save
5653 anything. */
5654 if (cfun->va_list_gpr_size && first_reg_offset < GP_ARG_NUM_REG)
5655 gpr_reg_num = GP_ARG_NUM_REG - first_reg_offset;
5656 if (TARGET_HARD_FLOAT && TARGET_FPRS
5657 && next_cum.fregno <= FP_ARG_V4_MAX_REG
5658 && cfun->va_list_fpr_size)
5659 {
5660 if (gpr_reg_num)
5661 fpr_size = (next_cum.fregno - FP_ARG_MIN_REG)
5662 * UNITS_PER_FP_WORD;
5663 if (cfun->va_list_fpr_size
5664 < FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
5665 fpr_size += cfun->va_list_fpr_size * UNITS_PER_FP_WORD;
5666 else
5667 fpr_size += (FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
5668 * UNITS_PER_FP_WORD;
5669 }
5670 if (gpr_reg_num)
5671 {
5672 offset = -((first_reg_offset * reg_size) & ~7);
5673 if (!fpr_size && gpr_reg_num > cfun->va_list_gpr_size)
5674 {
5675 gpr_reg_num = cfun->va_list_gpr_size;
5676 if (reg_size == 4 && (first_reg_offset & 1))
5677 gpr_reg_num++;
5678 }
5679 gpr_size = (gpr_reg_num * reg_size + 7) & ~7;
5680 }
5681 else if (fpr_size)
5682 offset = - (int) (next_cum.fregno - FP_ARG_MIN_REG)
5683 * UNITS_PER_FP_WORD
5684 - (int) (GP_ARG_NUM_REG * reg_size);
5685
5686 if (gpr_size + fpr_size)
5687 {
5688 rtx reg_save_area
5689 = assign_stack_local (BLKmode, gpr_size + fpr_size, 64);
5690 gcc_assert (GET_CODE (reg_save_area) == MEM);
5691 reg_save_area = XEXP (reg_save_area, 0);
5692 if (GET_CODE (reg_save_area) == PLUS)
5693 {
5694 gcc_assert (XEXP (reg_save_area, 0)
5695 == virtual_stack_vars_rtx);
5696 gcc_assert (GET_CODE (XEXP (reg_save_area, 1)) == CONST_INT);
5697 offset += INTVAL (XEXP (reg_save_area, 1));
5698 }
5699 else
5700 gcc_assert (reg_save_area == virtual_stack_vars_rtx);
5701 }
5702
5703 cfun->machine->varargs_save_offset = offset;
5704 save_area = plus_constant (virtual_stack_vars_rtx, offset);
5705 }
5706 }
5707 else
5708 {
5709 first_reg_offset = next_cum.words;
5710 save_area = virtual_incoming_args_rtx;
5711
5712 if (targetm.calls.must_pass_in_stack (mode, type))
5713 first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
5714 }
5715
5716 set = get_varargs_alias_set ();
5717 if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
5718 && cfun->va_list_gpr_size)
5719 {
5720 int nregs = GP_ARG_NUM_REG - first_reg_offset;
5721
5722 if (va_list_gpr_counter_field)
5723 {
5724 /* V4 va_list_gpr_size counts number of registers needed. */
5725 if (nregs > cfun->va_list_gpr_size)
5726 nregs = cfun->va_list_gpr_size;
5727 }
5728 else
5729 {
5730 /* char * va_list instead counts number of bytes needed. */
5731 if (nregs > cfun->va_list_gpr_size / reg_size)
5732 nregs = cfun->va_list_gpr_size / reg_size;
5733 }
5734
5735 mem = gen_rtx_MEM (BLKmode,
5736 plus_constant (save_area,
5737 first_reg_offset * reg_size));
5738 MEM_NOTRAP_P (mem) = 1;
5739 set_mem_alias_set (mem, set);
5740 set_mem_align (mem, BITS_PER_WORD);
5741
5742 rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
5743 nregs);
5744 }
5745
5746 /* Save FP registers if needed. */
5747 if (DEFAULT_ABI == ABI_V4
5748 && TARGET_HARD_FLOAT && TARGET_FPRS
5749 && ! no_rtl
5750 && next_cum.fregno <= FP_ARG_V4_MAX_REG
5751 && cfun->va_list_fpr_size)
5752 {
5753 int fregno = next_cum.fregno, nregs;
5754 rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
5755 rtx lab = gen_label_rtx ();
5756 int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG)
5757 * UNITS_PER_FP_WORD);
5758
5759 emit_jump_insn
5760 (gen_rtx_SET (VOIDmode,
5761 pc_rtx,
5762 gen_rtx_IF_THEN_ELSE (VOIDmode,
5763 gen_rtx_NE (VOIDmode, cr1,
5764 const0_rtx),
5765 gen_rtx_LABEL_REF (VOIDmode, lab),
5766 pc_rtx)));
5767
5768 for (nregs = 0;
5769 fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
5770 fregno++, off += UNITS_PER_FP_WORD, nregs++)
5771 {
5772 mem = gen_rtx_MEM (DFmode, plus_constant (save_area, off));
5773 MEM_NOTRAP_P (mem) = 1;
5774 set_mem_alias_set (mem, set);
5775 set_mem_align (mem, GET_MODE_ALIGNMENT (DFmode));
5776 emit_move_insn (mem, gen_rtx_REG (DFmode, fregno));
5777 }
5778
5779 emit_label (lab);
5780 }
5781 }
5782
5783 /* Create the va_list data type. */
5784
5785 static tree
rs6000_build_builtin_va_list(void)5786 rs6000_build_builtin_va_list (void)
5787 {
5788 tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
5789
5790 /* For AIX, prefer 'char *' because that's what the system
5791 header files like. */
5792 if (DEFAULT_ABI != ABI_V4)
5793 return build_pointer_type (char_type_node);
5794
5795 record = (*lang_hooks.types.make_type) (RECORD_TYPE);
5796 type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
5797
5798 f_gpr = build_decl (FIELD_DECL, get_identifier ("gpr"),
5799 unsigned_char_type_node);
5800 f_fpr = build_decl (FIELD_DECL, get_identifier ("fpr"),
5801 unsigned_char_type_node);
5802 /* Give the two bytes of padding a name, so that -Wpadded won't warn on
5803 every user file. */
5804 f_res = build_decl (FIELD_DECL, get_identifier ("reserved"),
5805 short_unsigned_type_node);
5806 f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
5807 ptr_type_node);
5808 f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
5809 ptr_type_node);
5810
5811 va_list_gpr_counter_field = f_gpr;
5812 va_list_fpr_counter_field = f_fpr;
5813
5814 DECL_FIELD_CONTEXT (f_gpr) = record;
5815 DECL_FIELD_CONTEXT (f_fpr) = record;
5816 DECL_FIELD_CONTEXT (f_res) = record;
5817 DECL_FIELD_CONTEXT (f_ovf) = record;
5818 DECL_FIELD_CONTEXT (f_sav) = record;
5819
5820 TREE_CHAIN (record) = type_decl;
5821 TYPE_NAME (record) = type_decl;
5822 TYPE_FIELDS (record) = f_gpr;
5823 TREE_CHAIN (f_gpr) = f_fpr;
5824 TREE_CHAIN (f_fpr) = f_res;
5825 TREE_CHAIN (f_res) = f_ovf;
5826 TREE_CHAIN (f_ovf) = f_sav;
5827
5828 layout_type (record);
5829
5830 /* The correct type is an array type of one element. */
5831 return build_array_type (record, build_index_type (size_zero_node));
5832 }
5833
5834 /* Implement va_start. */
5835
5836 void
rs6000_va_start(tree valist,rtx nextarg)5837 rs6000_va_start (tree valist, rtx nextarg)
5838 {
5839 HOST_WIDE_INT words, n_gpr, n_fpr;
5840 tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
5841 tree gpr, fpr, ovf, sav, t;
5842
5843 /* Only SVR4 needs something special. */
5844 if (DEFAULT_ABI != ABI_V4)
5845 {
5846 std_expand_builtin_va_start (valist, nextarg);
5847 return;
5848 }
5849
5850 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
5851 f_fpr = TREE_CHAIN (f_gpr);
5852 f_res = TREE_CHAIN (f_fpr);
5853 f_ovf = TREE_CHAIN (f_res);
5854 f_sav = TREE_CHAIN (f_ovf);
5855
5856 valist = build_va_arg_indirect_ref (valist);
5857 gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
5858 fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
5859 ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
5860 sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
5861
5862 /* Count number of gp and fp argument registers used. */
5863 words = current_function_args_info.words;
5864 n_gpr = MIN (current_function_args_info.sysv_gregno - GP_ARG_MIN_REG,
5865 GP_ARG_NUM_REG);
5866 n_fpr = MIN (current_function_args_info.fregno - FP_ARG_MIN_REG,
5867 FP_ARG_NUM_REG);
5868
5869 if (TARGET_DEBUG_ARG)
5870 fprintf (stderr, "va_start: words = "HOST_WIDE_INT_PRINT_DEC", n_gpr = "
5871 HOST_WIDE_INT_PRINT_DEC", n_fpr = "HOST_WIDE_INT_PRINT_DEC"\n",
5872 words, n_gpr, n_fpr);
5873
5874 if (cfun->va_list_gpr_size)
5875 {
5876 t = build2 (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
5877 build_int_cst (NULL_TREE, n_gpr));
5878 TREE_SIDE_EFFECTS (t) = 1;
5879 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5880 }
5881
5882 if (cfun->va_list_fpr_size)
5883 {
5884 t = build2 (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
5885 build_int_cst (NULL_TREE, n_fpr));
5886 TREE_SIDE_EFFECTS (t) = 1;
5887 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5888 }
5889
5890 /* Find the overflow area. */
5891 t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
5892 if (words != 0)
5893 t = build2 (PLUS_EXPR, TREE_TYPE (ovf), t,
5894 build_int_cst (NULL_TREE, words * UNITS_PER_WORD));
5895 t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
5896 TREE_SIDE_EFFECTS (t) = 1;
5897 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5898
5899 /* If there were no va_arg invocations, don't set up the register
5900 save area. */
5901 if (!cfun->va_list_gpr_size
5902 && !cfun->va_list_fpr_size
5903 && n_gpr < GP_ARG_NUM_REG
5904 && n_fpr < FP_ARG_V4_MAX_REG)
5905 return;
5906
5907 /* Find the register save area. */
5908 t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
5909 if (cfun->machine->varargs_save_offset)
5910 t = build2 (PLUS_EXPR, TREE_TYPE (sav), t,
5911 build_int_cst (NULL_TREE, cfun->machine->varargs_save_offset));
5912 t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
5913 TREE_SIDE_EFFECTS (t) = 1;
5914 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5915 }
5916
5917 /* Implement va_arg. */
5918
5919 tree
rs6000_gimplify_va_arg(tree valist,tree type,tree * pre_p,tree * post_p)5920 rs6000_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p)
5921 {
5922 tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
5923 tree gpr, fpr, ovf, sav, reg, t, u;
5924 int size, rsize, n_reg, sav_ofs, sav_scale;
5925 tree lab_false, lab_over, addr;
5926 int align;
5927 tree ptrtype = build_pointer_type (type);
5928
5929 if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
5930 {
5931 t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
5932 return build_va_arg_indirect_ref (t);
5933 }
5934
5935 if (DEFAULT_ABI != ABI_V4)
5936 {
5937 if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
5938 {
5939 tree elem_type = TREE_TYPE (type);
5940 enum machine_mode elem_mode = TYPE_MODE (elem_type);
5941 int elem_size = GET_MODE_SIZE (elem_mode);
5942
5943 if (elem_size < UNITS_PER_WORD)
5944 {
5945 tree real_part, imag_part;
5946 tree post = NULL_TREE;
5947
5948 real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
5949 &post);
5950 /* Copy the value into a temporary, lest the formal temporary
5951 be reused out from under us. */
5952 real_part = get_initialized_tmp_var (real_part, pre_p, &post);
5953 append_to_statement_list (post, pre_p);
5954
5955 imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
5956 post_p);
5957
5958 return build2 (COMPLEX_EXPR, type, real_part, imag_part);
5959 }
5960 }
5961
5962 return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
5963 }
5964
5965 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
5966 f_fpr = TREE_CHAIN (f_gpr);
5967 f_res = TREE_CHAIN (f_fpr);
5968 f_ovf = TREE_CHAIN (f_res);
5969 f_sav = TREE_CHAIN (f_ovf);
5970
5971 valist = build_va_arg_indirect_ref (valist);
5972 gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
5973 fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
5974 ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
5975 sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
5976
5977 size = int_size_in_bytes (type);
5978 rsize = (size + 3) / 4;
5979 align = 1;
5980
5981 if (TARGET_HARD_FLOAT && TARGET_FPRS
5982 && (TYPE_MODE (type) == SFmode
5983 || TYPE_MODE (type) == DFmode
5984 || TYPE_MODE (type) == TFmode))
5985 {
5986 /* FP args go in FP registers, if present. */
5987 reg = fpr;
5988 n_reg = (size + 7) / 8;
5989 sav_ofs = 8*4;
5990 sav_scale = 8;
5991 if (TYPE_MODE (type) != SFmode)
5992 align = 8;
5993 }
5994 else
5995 {
5996 /* Otherwise into GP registers. */
5997 reg = gpr;
5998 n_reg = rsize;
5999 sav_ofs = 0;
6000 sav_scale = 4;
6001 if (n_reg == 2)
6002 align = 8;
6003 }
6004
6005 /* Pull the value out of the saved registers.... */
6006
6007 lab_over = NULL;
6008 addr = create_tmp_var (ptr_type_node, "addr");
6009 DECL_POINTER_ALIAS_SET (addr) = get_varargs_alias_set ();
6010
6011 /* AltiVec vectors never go in registers when -mabi=altivec. */
6012 if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
6013 align = 16;
6014 else
6015 {
6016 lab_false = create_artificial_label ();
6017 lab_over = create_artificial_label ();
6018
6019 /* Long long and SPE vectors are aligned in the registers.
6020 As are any other 2 gpr item such as complex int due to a
6021 historical mistake. */
6022 u = reg;
6023 if (n_reg == 2 && reg == gpr)
6024 {
6025 u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), reg,
6026 size_int (n_reg - 1));
6027 u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg, u);
6028 }
6029
6030 t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
6031 t = build2 (GE_EXPR, boolean_type_node, u, t);
6032 u = build1 (GOTO_EXPR, void_type_node, lab_false);
6033 t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
6034 gimplify_and_add (t, pre_p);
6035
6036 t = sav;
6037 if (sav_ofs)
6038 t = build2 (PLUS_EXPR, ptr_type_node, sav, size_int (sav_ofs));
6039
6040 u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg, size_int (n_reg));
6041 u = build1 (CONVERT_EXPR, integer_type_node, u);
6042 u = build2 (MULT_EXPR, integer_type_node, u, size_int (sav_scale));
6043 t = build2 (PLUS_EXPR, ptr_type_node, t, u);
6044
6045 t = build2 (MODIFY_EXPR, void_type_node, addr, t);
6046 gimplify_and_add (t, pre_p);
6047
6048 t = build1 (GOTO_EXPR, void_type_node, lab_over);
6049 gimplify_and_add (t, pre_p);
6050
6051 t = build1 (LABEL_EXPR, void_type_node, lab_false);
6052 append_to_statement_list (t, pre_p);
6053
6054 if ((n_reg == 2 && reg != gpr) || n_reg > 2)
6055 {
6056 /* Ensure that we don't find any more args in regs.
6057 Alignment has taken care of the n_reg == 2 gpr case. */
6058 t = build2 (MODIFY_EXPR, TREE_TYPE (reg), reg, size_int (8));
6059 gimplify_and_add (t, pre_p);
6060 }
6061 }
6062
6063 /* ... otherwise out of the overflow area. */
6064
6065 /* Care for on-stack alignment if needed. */
6066 t = ovf;
6067 if (align != 1)
6068 {
6069 t = build2 (PLUS_EXPR, TREE_TYPE (t), t, size_int (align - 1));
6070 t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
6071 build_int_cst (NULL_TREE, -align));
6072 }
6073 gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
6074
6075 u = build2 (MODIFY_EXPR, void_type_node, addr, t);
6076 gimplify_and_add (u, pre_p);
6077
6078 t = build2 (PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
6079 t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
6080 gimplify_and_add (t, pre_p);
6081
6082 if (lab_over)
6083 {
6084 t = build1 (LABEL_EXPR, void_type_node, lab_over);
6085 append_to_statement_list (t, pre_p);
6086 }
6087
6088 if (STRICT_ALIGNMENT
6089 && (TYPE_ALIGN (type)
6090 > (unsigned) BITS_PER_UNIT * (align < 4 ? 4 : align)))
6091 {
6092 /* The value (of type complex double, for example) may not be
6093 aligned in memory in the saved registers, so copy via a
6094 temporary. (This is the same code as used for SPARC.) */
6095 tree tmp = create_tmp_var (type, "va_arg_tmp");
6096 tree dest_addr = build_fold_addr_expr (tmp);
6097
6098 tree copy = build_function_call_expr
6099 (implicit_built_in_decls[BUILT_IN_MEMCPY],
6100 tree_cons (NULL_TREE, dest_addr,
6101 tree_cons (NULL_TREE, addr,
6102 tree_cons (NULL_TREE, size_int (rsize * 4),
6103 NULL_TREE))));
6104
6105 gimplify_and_add (copy, pre_p);
6106 addr = dest_addr;
6107 }
6108
6109 addr = fold_convert (ptrtype, addr);
6110 return build_va_arg_indirect_ref (addr);
6111 }
6112
6113 /* Builtins. */
6114
6115 static void
def_builtin(int mask,const char * name,tree type,int code)6116 def_builtin (int mask, const char *name, tree type, int code)
6117 {
6118 if (mask & target_flags)
6119 {
6120 if (rs6000_builtin_decls[code])
6121 abort ();
6122
6123 rs6000_builtin_decls[code] =
6124 lang_hooks.builtin_function (name, type, code, BUILT_IN_MD,
6125 NULL, NULL_TREE);
6126 }
6127 }
6128
6129 /* Simple ternary operations: VECd = foo (VECa, VECb, VECc). */
6130
6131 static const struct builtin_description bdesc_3arg[] =
6132 {
6133 { MASK_ALTIVEC, CODE_FOR_altivec_vmaddfp, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
6134 { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
6135 { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
6136 { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
6137 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
6138 { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
6139 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
6140 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
6141 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
6142 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
6143 { MASK_ALTIVEC, CODE_FOR_altivec_vnmsubfp, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
6144 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
6145 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
6146 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
6147 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
6148 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
6149 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
6150 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
6151 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
6152 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
6153 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
6154 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
6155 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
6156
6157 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madd", ALTIVEC_BUILTIN_VEC_MADD },
6158 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madds", ALTIVEC_BUILTIN_VEC_MADDS },
6159 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mladd", ALTIVEC_BUILTIN_VEC_MLADD },
6160 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mradds", ALTIVEC_BUILTIN_VEC_MRADDS },
6161 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msum", ALTIVEC_BUILTIN_VEC_MSUM },
6162 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshm", ALTIVEC_BUILTIN_VEC_VMSUMSHM },
6163 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhm", ALTIVEC_BUILTIN_VEC_VMSUMUHM },
6164 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsummbm", ALTIVEC_BUILTIN_VEC_VMSUMMBM },
6165 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumubm", ALTIVEC_BUILTIN_VEC_VMSUMUBM },
6166 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msums", ALTIVEC_BUILTIN_VEC_MSUMS },
6167 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshs", ALTIVEC_BUILTIN_VEC_VMSUMSHS },
6168 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhs", ALTIVEC_BUILTIN_VEC_VMSUMUHS },
6169 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmsub", ALTIVEC_BUILTIN_VEC_NMSUB },
6170 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_perm", ALTIVEC_BUILTIN_VEC_PERM },
6171 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sel", ALTIVEC_BUILTIN_VEC_SEL },
6172 };
6173
6174 /* DST operations: void foo (void *, const int, const char). */
6175
6176 static const struct builtin_description bdesc_dst[] =
6177 {
6178 { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
6179 { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
6180 { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
6181 { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT },
6182
6183 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dst", ALTIVEC_BUILTIN_VEC_DST },
6184 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstt", ALTIVEC_BUILTIN_VEC_DSTT },
6185 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstst", ALTIVEC_BUILTIN_VEC_DSTST },
6186 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dststt", ALTIVEC_BUILTIN_VEC_DSTSTT }
6187 };
6188
6189 /* Simple binary operations: VECc = foo (VECa, VECb). */
6190
6191 static struct builtin_description bdesc_2arg[] =
6192 {
6193 { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
6194 { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
6195 { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
6196 { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
6197 { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
6198 { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
6199 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
6200 { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
6201 { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
6202 { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
6203 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
6204 { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
6205 { MASK_ALTIVEC, CODE_FOR_andcv4si3, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
6206 { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
6207 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
6208 { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
6209 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
6210 { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
6211 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
6212 { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
6213 { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
6214 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
6215 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequb, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
6216 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequh, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
6217 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequw, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
6218 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpeqfp, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
6219 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgefp, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
6220 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtub, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
6221 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsb, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
6222 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuh, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
6223 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsh, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
6224 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuw, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
6225 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsw, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
6226 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtfp, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
6227 { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
6228 { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
6229 { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
6230 { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
6231 { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
6232 { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
6233 { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
6234 { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
6235 { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
6236 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
6237 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
6238 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
6239 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
6240 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
6241 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
6242 { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
6243 { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
6244 { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
6245 { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
6246 { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
6247 { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
6248 { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
6249 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
6250 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
6251 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
6252 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
6253 { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
6254 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
6255 { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
6256 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
6257 { MASK_ALTIVEC, CODE_FOR_altivec_norv4si3, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
6258 { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
6259 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
6260 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
6261 { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
6262 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
6263 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
6264 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
6265 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
6266 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
6267 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
6268 { MASK_ALTIVEC, CODE_FOR_altivec_vrlb, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
6269 { MASK_ALTIVEC, CODE_FOR_altivec_vrlh, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
6270 { MASK_ALTIVEC, CODE_FOR_altivec_vrlw, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
6271 { MASK_ALTIVEC, CODE_FOR_altivec_vslb, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
6272 { MASK_ALTIVEC, CODE_FOR_altivec_vslh, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
6273 { MASK_ALTIVEC, CODE_FOR_altivec_vslw, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
6274 { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
6275 { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
6276 { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
6277 { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
6278 { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
6279 { MASK_ALTIVEC, CODE_FOR_lshrv16qi3, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
6280 { MASK_ALTIVEC, CODE_FOR_lshrv8hi3, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
6281 { MASK_ALTIVEC, CODE_FOR_lshrv4si3, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
6282 { MASK_ALTIVEC, CODE_FOR_ashrv16qi3, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
6283 { MASK_ALTIVEC, CODE_FOR_ashrv8hi3, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
6284 { MASK_ALTIVEC, CODE_FOR_ashrv4si3, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
6285 { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
6286 { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
6287 { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
6288 { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
6289 { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
6290 { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
6291 { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
6292 { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
6293 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
6294 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
6295 { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
6296 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
6297 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
6298 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
6299 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
6300 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
6301 { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
6302 { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
6303 { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
6304
6305 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_add", ALTIVEC_BUILTIN_VEC_ADD },
6306 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddfp", ALTIVEC_BUILTIN_VEC_VADDFP },
6307 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduwm", ALTIVEC_BUILTIN_VEC_VADDUWM },
6308 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhm", ALTIVEC_BUILTIN_VEC_VADDUHM },
6309 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubm", ALTIVEC_BUILTIN_VEC_VADDUBM },
6310 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_addc", ALTIVEC_BUILTIN_VEC_ADDC },
6311 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_adds", ALTIVEC_BUILTIN_VEC_ADDS },
6312 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsws", ALTIVEC_BUILTIN_VEC_VADDSWS },
6313 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduws", ALTIVEC_BUILTIN_VEC_VADDUWS },
6314 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddshs", ALTIVEC_BUILTIN_VEC_VADDSHS },
6315 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhs", ALTIVEC_BUILTIN_VEC_VADDUHS },
6316 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsbs", ALTIVEC_BUILTIN_VEC_VADDSBS },
6317 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubs", ALTIVEC_BUILTIN_VEC_VADDUBS },
6318 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_and", ALTIVEC_BUILTIN_VEC_AND },
6319 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_andc", ALTIVEC_BUILTIN_VEC_ANDC },
6320 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_avg", ALTIVEC_BUILTIN_VEC_AVG },
6321 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsw", ALTIVEC_BUILTIN_VEC_VAVGSW },
6322 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguw", ALTIVEC_BUILTIN_VEC_VAVGUW },
6323 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsh", ALTIVEC_BUILTIN_VEC_VAVGSH },
6324 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguh", ALTIVEC_BUILTIN_VEC_VAVGUH },
6325 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsb", ALTIVEC_BUILTIN_VEC_VAVGSB },
6326 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgub", ALTIVEC_BUILTIN_VEC_VAVGUB },
6327 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpb", ALTIVEC_BUILTIN_VEC_CMPB },
6328 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpeq", ALTIVEC_BUILTIN_VEC_CMPEQ },
6329 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpeqfp", ALTIVEC_BUILTIN_VEC_VCMPEQFP },
6330 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequw", ALTIVEC_BUILTIN_VEC_VCMPEQUW },
6331 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequh", ALTIVEC_BUILTIN_VEC_VCMPEQUH },
6332 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequb", ALTIVEC_BUILTIN_VEC_VCMPEQUB },
6333 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpge", ALTIVEC_BUILTIN_VEC_CMPGE },
6334 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpgt", ALTIVEC_BUILTIN_VEC_CMPGT },
6335 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtfp", ALTIVEC_BUILTIN_VEC_VCMPGTFP },
6336 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsw", ALTIVEC_BUILTIN_VEC_VCMPGTSW },
6337 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuw", ALTIVEC_BUILTIN_VEC_VCMPGTUW },
6338 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsh", ALTIVEC_BUILTIN_VEC_VCMPGTSH },
6339 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuh", ALTIVEC_BUILTIN_VEC_VCMPGTUH },
6340 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsb", ALTIVEC_BUILTIN_VEC_VCMPGTSB },
6341 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtub", ALTIVEC_BUILTIN_VEC_VCMPGTUB },
6342 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmple", ALTIVEC_BUILTIN_VEC_CMPLE },
6343 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmplt", ALTIVEC_BUILTIN_VEC_CMPLT },
6344 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_max", ALTIVEC_BUILTIN_VEC_MAX },
6345 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxfp", ALTIVEC_BUILTIN_VEC_VMAXFP },
6346 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsw", ALTIVEC_BUILTIN_VEC_VMAXSW },
6347 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuw", ALTIVEC_BUILTIN_VEC_VMAXUW },
6348 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsh", ALTIVEC_BUILTIN_VEC_VMAXSH },
6349 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuh", ALTIVEC_BUILTIN_VEC_VMAXUH },
6350 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsb", ALTIVEC_BUILTIN_VEC_VMAXSB },
6351 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxub", ALTIVEC_BUILTIN_VEC_VMAXUB },
6352 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergeh", ALTIVEC_BUILTIN_VEC_MERGEH },
6353 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghw", ALTIVEC_BUILTIN_VEC_VMRGHW },
6354 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghh", ALTIVEC_BUILTIN_VEC_VMRGHH },
6355 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghb", ALTIVEC_BUILTIN_VEC_VMRGHB },
6356 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergel", ALTIVEC_BUILTIN_VEC_MERGEL },
6357 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglw", ALTIVEC_BUILTIN_VEC_VMRGLW },
6358 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglh", ALTIVEC_BUILTIN_VEC_VMRGLH },
6359 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglb", ALTIVEC_BUILTIN_VEC_VMRGLB },
6360 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_min", ALTIVEC_BUILTIN_VEC_MIN },
6361 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminfp", ALTIVEC_BUILTIN_VEC_VMINFP },
6362 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsw", ALTIVEC_BUILTIN_VEC_VMINSW },
6363 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuw", ALTIVEC_BUILTIN_VEC_VMINUW },
6364 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsh", ALTIVEC_BUILTIN_VEC_VMINSH },
6365 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuh", ALTIVEC_BUILTIN_VEC_VMINUH },
6366 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsb", ALTIVEC_BUILTIN_VEC_VMINSB },
6367 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminub", ALTIVEC_BUILTIN_VEC_VMINUB },
6368 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mule", ALTIVEC_BUILTIN_VEC_MULE },
6369 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleub", ALTIVEC_BUILTIN_VEC_VMULEUB },
6370 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesb", ALTIVEC_BUILTIN_VEC_VMULESB },
6371 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleuh", ALTIVEC_BUILTIN_VEC_VMULEUH },
6372 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesh", ALTIVEC_BUILTIN_VEC_VMULESH },
6373 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mulo", ALTIVEC_BUILTIN_VEC_MULO },
6374 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosh", ALTIVEC_BUILTIN_VEC_VMULOSH },
6375 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulouh", ALTIVEC_BUILTIN_VEC_VMULOUH },
6376 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosb", ALTIVEC_BUILTIN_VEC_VMULOSB },
6377 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuloub", ALTIVEC_BUILTIN_VEC_VMULOUB },
6378 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nor", ALTIVEC_BUILTIN_VEC_NOR },
6379 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_or", ALTIVEC_BUILTIN_VEC_OR },
6380 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_pack", ALTIVEC_BUILTIN_VEC_PACK },
6381 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwum", ALTIVEC_BUILTIN_VEC_VPKUWUM },
6382 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhum", ALTIVEC_BUILTIN_VEC_VPKUHUM },
6383 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packpx", ALTIVEC_BUILTIN_VEC_PACKPX },
6384 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packs", ALTIVEC_BUILTIN_VEC_PACKS },
6385 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswss", ALTIVEC_BUILTIN_VEC_VPKSWSS },
6386 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwus", ALTIVEC_BUILTIN_VEC_VPKUWUS },
6387 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshss", ALTIVEC_BUILTIN_VEC_VPKSHSS },
6388 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhus", ALTIVEC_BUILTIN_VEC_VPKUHUS },
6389 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packsu", ALTIVEC_BUILTIN_VEC_PACKSU },
6390 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswus", ALTIVEC_BUILTIN_VEC_VPKSWUS },
6391 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshus", ALTIVEC_BUILTIN_VEC_VPKSHUS },
6392 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rl", ALTIVEC_BUILTIN_VEC_RL },
6393 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlw", ALTIVEC_BUILTIN_VEC_VRLW },
6394 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlh", ALTIVEC_BUILTIN_VEC_VRLH },
6395 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlb", ALTIVEC_BUILTIN_VEC_VRLB },
6396 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sl", ALTIVEC_BUILTIN_VEC_SL },
6397 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslw", ALTIVEC_BUILTIN_VEC_VSLW },
6398 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslh", ALTIVEC_BUILTIN_VEC_VSLH },
6399 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslb", ALTIVEC_BUILTIN_VEC_VSLB },
6400 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sll", ALTIVEC_BUILTIN_VEC_SLL },
6401 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_slo", ALTIVEC_BUILTIN_VEC_SLO },
6402 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sr", ALTIVEC_BUILTIN_VEC_SR },
6403 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrw", ALTIVEC_BUILTIN_VEC_VSRW },
6404 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrh", ALTIVEC_BUILTIN_VEC_VSRH },
6405 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrb", ALTIVEC_BUILTIN_VEC_VSRB },
6406 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sra", ALTIVEC_BUILTIN_VEC_SRA },
6407 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsraw", ALTIVEC_BUILTIN_VEC_VSRAW },
6408 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrah", ALTIVEC_BUILTIN_VEC_VSRAH },
6409 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrab", ALTIVEC_BUILTIN_VEC_VSRAB },
6410 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_srl", ALTIVEC_BUILTIN_VEC_SRL },
6411 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sro", ALTIVEC_BUILTIN_VEC_SRO },
6412 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sub", ALTIVEC_BUILTIN_VEC_SUB },
6413 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubfp", ALTIVEC_BUILTIN_VEC_VSUBFP },
6414 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuwm", ALTIVEC_BUILTIN_VEC_VSUBUWM },
6415 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhm", ALTIVEC_BUILTIN_VEC_VSUBUHM },
6416 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububm", ALTIVEC_BUILTIN_VEC_VSUBUBM },
6417 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subc", ALTIVEC_BUILTIN_VEC_SUBC },
6418 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subs", ALTIVEC_BUILTIN_VEC_SUBS },
6419 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsws", ALTIVEC_BUILTIN_VEC_VSUBSWS },
6420 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuws", ALTIVEC_BUILTIN_VEC_VSUBUWS },
6421 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubshs", ALTIVEC_BUILTIN_VEC_VSUBSHS },
6422 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhs", ALTIVEC_BUILTIN_VEC_VSUBUHS },
6423 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsbs", ALTIVEC_BUILTIN_VEC_VSUBSBS },
6424 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububs", ALTIVEC_BUILTIN_VEC_VSUBUBS },
6425 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum4s", ALTIVEC_BUILTIN_VEC_SUM4S },
6426 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4shs", ALTIVEC_BUILTIN_VEC_VSUM4SHS },
6427 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4sbs", ALTIVEC_BUILTIN_VEC_VSUM4SBS },
6428 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4ubs", ALTIVEC_BUILTIN_VEC_VSUM4UBS },
6429 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum2s", ALTIVEC_BUILTIN_VEC_SUM2S },
6430 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sums", ALTIVEC_BUILTIN_VEC_SUMS },
6431 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_xor", ALTIVEC_BUILTIN_VEC_XOR },
6432
6433 /* Place holder, leave as first spe builtin. */
6434 { 0, CODE_FOR_spe_evaddw, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
6435 { 0, CODE_FOR_spe_evand, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
6436 { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
6437 { 0, CODE_FOR_spe_evdivws, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
6438 { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
6439 { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
6440 { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
6441 { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
6442 { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
6443 { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
6444 { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
6445 { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
6446 { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
6447 { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
6448 { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
6449 { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
6450 { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
6451 { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
6452 { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
6453 { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
6454 { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
6455 { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
6456 { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
6457 { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
6458 { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
6459 { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
6460 { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
6461 { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
6462 { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
6463 { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
6464 { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
6465 { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
6466 { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
6467 { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
6468 { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
6469 { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
6470 { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
6471 { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
6472 { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
6473 { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
6474 { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
6475 { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
6476 { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
6477 { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
6478 { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
6479 { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
6480 { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
6481 { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
6482 { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
6483 { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
6484 { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
6485 { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
6486 { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
6487 { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
6488 { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
6489 { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
6490 { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
6491 { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
6492 { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
6493 { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
6494 { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
6495 { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
6496 { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
6497 { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
6498 { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
6499 { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
6500 { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
6501 { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
6502 { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
6503 { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
6504 { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
6505 { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
6506 { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
6507 { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
6508 { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
6509 { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
6510 { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
6511 { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
6512 { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
6513 { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
6514 { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
6515 { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
6516 { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
6517 { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
6518 { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
6519 { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
6520 { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
6521 { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
6522 { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
6523 { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
6524 { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
6525 { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
6526 { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
6527 { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
6528 { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
6529 { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
6530 { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
6531 { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
6532 { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
6533 { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
6534 { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
6535 { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
6536 { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
6537 { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
6538 { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
6539 { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
6540 { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
6541 { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
6542 { 0, CODE_FOR_spe_evsubfw, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
6543
6544 /* SPE binary operations expecting a 5-bit unsigned literal. */
6545 { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
6546
6547 { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
6548 { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
6549 { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
6550 { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
6551 { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
6552 { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
6553 { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
6554 { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
6555 { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
6556 { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
6557 { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
6558 { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
6559 { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
6560 { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
6561 { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
6562 { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
6563 { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
6564 { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
6565 { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
6566 { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
6567 { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
6568 { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
6569 { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
6570 { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
6571 { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
6572 { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
6573
6574 /* Place-holder. Leave as last binary SPE builtin. */
6575 { 0, CODE_FOR_xorv2si3, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR }
6576 };
6577
6578 /* AltiVec predicates. */
6579
6580 struct builtin_description_predicates
6581 {
6582 const unsigned int mask;
6583 const enum insn_code icode;
6584 const char *opcode;
6585 const char *const name;
6586 const enum rs6000_builtins code;
6587 };
6588
6589 static const struct builtin_description_predicates bdesc_altivec_preds[] =
6590 {
6591 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpbfp.", "__builtin_altivec_vcmpbfp_p", ALTIVEC_BUILTIN_VCMPBFP_P },
6592 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpeqfp.", "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
6593 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgefp.", "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
6594 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgtfp.", "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
6595 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpequw.", "__builtin_altivec_vcmpequw_p", ALTIVEC_BUILTIN_VCMPEQUW_P },
6596 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtsw.", "__builtin_altivec_vcmpgtsw_p", ALTIVEC_BUILTIN_VCMPGTSW_P },
6597 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtuw.", "__builtin_altivec_vcmpgtuw_p", ALTIVEC_BUILTIN_VCMPGTUW_P },
6598 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtuh.", "__builtin_altivec_vcmpgtuh_p", ALTIVEC_BUILTIN_VCMPGTUH_P },
6599 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtsh.", "__builtin_altivec_vcmpgtsh_p", ALTIVEC_BUILTIN_VCMPGTSH_P },
6600 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpequh.", "__builtin_altivec_vcmpequh_p", ALTIVEC_BUILTIN_VCMPEQUH_P },
6601 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpequb.", "__builtin_altivec_vcmpequb_p", ALTIVEC_BUILTIN_VCMPEQUB_P },
6602 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtsb.", "__builtin_altivec_vcmpgtsb_p", ALTIVEC_BUILTIN_VCMPGTSB_P },
6603 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtub.", "__builtin_altivec_vcmpgtub_p", ALTIVEC_BUILTIN_VCMPGTUB_P },
6604
6605 { MASK_ALTIVEC, 0, NULL, "__builtin_vec_vcmpeq_p", ALTIVEC_BUILTIN_VCMPEQ_P },
6606 { MASK_ALTIVEC, 0, NULL, "__builtin_vec_vcmpgt_p", ALTIVEC_BUILTIN_VCMPGT_P },
6607 { MASK_ALTIVEC, 0, NULL, "__builtin_vec_vcmpge_p", ALTIVEC_BUILTIN_VCMPGE_P }
6608 };
6609
6610 /* SPE predicates. */
6611 static struct builtin_description bdesc_spe_predicates[] =
6612 {
6613 /* Place-holder. Leave as first. */
6614 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
6615 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
6616 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
6617 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
6618 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
6619 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
6620 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
6621 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
6622 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
6623 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
6624 /* Place-holder. Leave as last. */
6625 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
6626 };
6627
6628 /* SPE evsel predicates. */
6629 static struct builtin_description bdesc_spe_evsel[] =
6630 {
6631 /* Place-holder. Leave as first. */
6632 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
6633 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
6634 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
6635 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
6636 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
6637 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
6638 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
6639 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
6640 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
6641 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
6642 /* Place-holder. Leave as last. */
6643 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
6644 };
6645
6646 /* ABS* operations. */
6647
6648 static const struct builtin_description bdesc_abs[] =
6649 {
6650 { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
6651 { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
6652 { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
6653 { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
6654 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
6655 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
6656 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI }
6657 };
6658
6659 /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
6660 foo (VECa). */
6661
6662 static struct builtin_description bdesc_1arg[] =
6663 {
6664 { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
6665 { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
6666 { MASK_ALTIVEC, CODE_FOR_altivec_vrefp, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
6667 { MASK_ALTIVEC, CODE_FOR_altivec_vrfim, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
6668 { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
6669 { MASK_ALTIVEC, CODE_FOR_altivec_vrfip, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
6670 { MASK_ALTIVEC, CODE_FOR_ftruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
6671 { MASK_ALTIVEC, CODE_FOR_altivec_vrsqrtefp, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
6672 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
6673 { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
6674 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
6675 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
6676 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
6677 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
6678 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
6679 { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
6680 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
6681
6682 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abs", ALTIVEC_BUILTIN_VEC_ABS },
6683 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abss", ALTIVEC_BUILTIN_VEC_ABSS },
6684 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_ceil", ALTIVEC_BUILTIN_VEC_CEIL },
6685 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_expte", ALTIVEC_BUILTIN_VEC_EXPTE },
6686 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_floor", ALTIVEC_BUILTIN_VEC_FLOOR },
6687 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_loge", ALTIVEC_BUILTIN_VEC_LOGE },
6688 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mtvscr", ALTIVEC_BUILTIN_VEC_MTVSCR },
6689 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_re", ALTIVEC_BUILTIN_VEC_RE },
6690 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_round", ALTIVEC_BUILTIN_VEC_ROUND },
6691 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrte", ALTIVEC_BUILTIN_VEC_RSQRTE },
6692 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_trunc", ALTIVEC_BUILTIN_VEC_TRUNC },
6693 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackh", ALTIVEC_BUILTIN_VEC_UNPACKH },
6694 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsh", ALTIVEC_BUILTIN_VEC_VUPKHSH },
6695 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhpx", ALTIVEC_BUILTIN_VEC_VUPKHPX },
6696 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsb", ALTIVEC_BUILTIN_VEC_VUPKHSB },
6697 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackl", ALTIVEC_BUILTIN_VEC_UNPACKL },
6698 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklpx", ALTIVEC_BUILTIN_VEC_VUPKLPX },
6699 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsh", ALTIVEC_BUILTIN_VEC_VUPKLSH },
6700 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsb", ALTIVEC_BUILTIN_VEC_VUPKLSB },
6701
6702 /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
6703 end with SPE_BUILTIN_EVSUBFUSIAAW. */
6704 { 0, CODE_FOR_spe_evabs, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
6705 { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
6706 { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
6707 { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
6708 { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
6709 { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
6710 { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
6711 { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
6712 { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
6713 { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
6714 { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
6715 { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
6716 { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
6717 { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
6718 { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
6719 { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
6720 { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
6721 { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
6722 { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
6723 { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
6724 { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
6725 { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
6726 { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
6727 { 0, CODE_FOR_negv2si2, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
6728 { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
6729 { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
6730 { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
6731 { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
6732
6733 /* Place-holder. Leave as last unary SPE builtin. */
6734 { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW }
6735 };
6736
6737 static rtx
rs6000_expand_unop_builtin(enum insn_code icode,tree arglist,rtx target)6738 rs6000_expand_unop_builtin (enum insn_code icode, tree arglist, rtx target)
6739 {
6740 rtx pat;
6741 tree arg0 = TREE_VALUE (arglist);
6742 rtx op0 = expand_normal (arg0);
6743 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6744 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6745
6746 if (icode == CODE_FOR_nothing)
6747 /* Builtin not supported on this processor. */
6748 return 0;
6749
6750 /* If we got invalid arguments bail out before generating bad rtl. */
6751 if (arg0 == error_mark_node)
6752 return const0_rtx;
6753
6754 if (icode == CODE_FOR_altivec_vspltisb
6755 || icode == CODE_FOR_altivec_vspltish
6756 || icode == CODE_FOR_altivec_vspltisw
6757 || icode == CODE_FOR_spe_evsplatfi
6758 || icode == CODE_FOR_spe_evsplati)
6759 {
6760 /* Only allow 5-bit *signed* literals. */
6761 if (GET_CODE (op0) != CONST_INT
6762 || INTVAL (op0) > 15
6763 || INTVAL (op0) < -16)
6764 {
6765 error ("argument 1 must be a 5-bit signed literal");
6766 return const0_rtx;
6767 }
6768 }
6769
6770 if (target == 0
6771 || GET_MODE (target) != tmode
6772 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6773 target = gen_reg_rtx (tmode);
6774
6775 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6776 op0 = copy_to_mode_reg (mode0, op0);
6777
6778 pat = GEN_FCN (icode) (target, op0);
6779 if (! pat)
6780 return 0;
6781 emit_insn (pat);
6782
6783 return target;
6784 }
6785
6786 static rtx
altivec_expand_abs_builtin(enum insn_code icode,tree arglist,rtx target)6787 altivec_expand_abs_builtin (enum insn_code icode, tree arglist, rtx target)
6788 {
6789 rtx pat, scratch1, scratch2;
6790 tree arg0 = TREE_VALUE (arglist);
6791 rtx op0 = expand_normal (arg0);
6792 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6793 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6794
6795 /* If we have invalid arguments, bail out before generating bad rtl. */
6796 if (arg0 == error_mark_node)
6797 return const0_rtx;
6798
6799 if (target == 0
6800 || GET_MODE (target) != tmode
6801 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6802 target = gen_reg_rtx (tmode);
6803
6804 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6805 op0 = copy_to_mode_reg (mode0, op0);
6806
6807 scratch1 = gen_reg_rtx (mode0);
6808 scratch2 = gen_reg_rtx (mode0);
6809
6810 pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
6811 if (! pat)
6812 return 0;
6813 emit_insn (pat);
6814
6815 return target;
6816 }
6817
6818 static rtx
rs6000_expand_binop_builtin(enum insn_code icode,tree arglist,rtx target)6819 rs6000_expand_binop_builtin (enum insn_code icode, tree arglist, rtx target)
6820 {
6821 rtx pat;
6822 tree arg0 = TREE_VALUE (arglist);
6823 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6824 rtx op0 = expand_normal (arg0);
6825 rtx op1 = expand_normal (arg1);
6826 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6827 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6828 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
6829
6830 if (icode == CODE_FOR_nothing)
6831 /* Builtin not supported on this processor. */
6832 return 0;
6833
6834 /* If we got invalid arguments bail out before generating bad rtl. */
6835 if (arg0 == error_mark_node || arg1 == error_mark_node)
6836 return const0_rtx;
6837
6838 if (icode == CODE_FOR_altivec_vcfux
6839 || icode == CODE_FOR_altivec_vcfsx
6840 || icode == CODE_FOR_altivec_vctsxs
6841 || icode == CODE_FOR_altivec_vctuxs
6842 || icode == CODE_FOR_altivec_vspltb
6843 || icode == CODE_FOR_altivec_vsplth
6844 || icode == CODE_FOR_altivec_vspltw
6845 || icode == CODE_FOR_spe_evaddiw
6846 || icode == CODE_FOR_spe_evldd
6847 || icode == CODE_FOR_spe_evldh
6848 || icode == CODE_FOR_spe_evldw
6849 || icode == CODE_FOR_spe_evlhhesplat
6850 || icode == CODE_FOR_spe_evlhhossplat
6851 || icode == CODE_FOR_spe_evlhhousplat
6852 || icode == CODE_FOR_spe_evlwhe
6853 || icode == CODE_FOR_spe_evlwhos
6854 || icode == CODE_FOR_spe_evlwhou
6855 || icode == CODE_FOR_spe_evlwhsplat
6856 || icode == CODE_FOR_spe_evlwwsplat
6857 || icode == CODE_FOR_spe_evrlwi
6858 || icode == CODE_FOR_spe_evslwi
6859 || icode == CODE_FOR_spe_evsrwis
6860 || icode == CODE_FOR_spe_evsubifw
6861 || icode == CODE_FOR_spe_evsrwiu)
6862 {
6863 /* Only allow 5-bit unsigned literals. */
6864 STRIP_NOPS (arg1);
6865 if (TREE_CODE (arg1) != INTEGER_CST
6866 || TREE_INT_CST_LOW (arg1) & ~0x1f)
6867 {
6868 error ("argument 2 must be a 5-bit unsigned literal");
6869 return const0_rtx;
6870 }
6871 }
6872
6873 if (target == 0
6874 || GET_MODE (target) != tmode
6875 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6876 target = gen_reg_rtx (tmode);
6877
6878 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6879 op0 = copy_to_mode_reg (mode0, op0);
6880 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
6881 op1 = copy_to_mode_reg (mode1, op1);
6882
6883 pat = GEN_FCN (icode) (target, op0, op1);
6884 if (! pat)
6885 return 0;
6886 emit_insn (pat);
6887
6888 return target;
6889 }
6890
6891 static rtx
altivec_expand_predicate_builtin(enum insn_code icode,const char * opcode,tree arglist,rtx target)6892 altivec_expand_predicate_builtin (enum insn_code icode, const char *opcode,
6893 tree arglist, rtx target)
6894 {
6895 rtx pat, scratch;
6896 tree cr6_form = TREE_VALUE (arglist);
6897 tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
6898 tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6899 rtx op0 = expand_normal (arg0);
6900 rtx op1 = expand_normal (arg1);
6901 enum machine_mode tmode = SImode;
6902 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6903 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
6904 int cr6_form_int;
6905
6906 if (TREE_CODE (cr6_form) != INTEGER_CST)
6907 {
6908 error ("argument 1 of __builtin_altivec_predicate must be a constant");
6909 return const0_rtx;
6910 }
6911 else
6912 cr6_form_int = TREE_INT_CST_LOW (cr6_form);
6913
6914 gcc_assert (mode0 == mode1);
6915
6916 /* If we have invalid arguments, bail out before generating bad rtl. */
6917 if (arg0 == error_mark_node || arg1 == error_mark_node)
6918 return const0_rtx;
6919
6920 if (target == 0
6921 || GET_MODE (target) != tmode
6922 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6923 target = gen_reg_rtx (tmode);
6924
6925 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6926 op0 = copy_to_mode_reg (mode0, op0);
6927 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
6928 op1 = copy_to_mode_reg (mode1, op1);
6929
6930 scratch = gen_reg_rtx (mode0);
6931
6932 pat = GEN_FCN (icode) (scratch, op0, op1,
6933 gen_rtx_SYMBOL_REF (Pmode, opcode));
6934 if (! pat)
6935 return 0;
6936 emit_insn (pat);
6937
6938 /* The vec_any* and vec_all* predicates use the same opcodes for two
6939 different operations, but the bits in CR6 will be different
6940 depending on what information we want. So we have to play tricks
6941 with CR6 to get the right bits out.
6942
6943 If you think this is disgusting, look at the specs for the
6944 AltiVec predicates. */
6945
6946 switch (cr6_form_int)
6947 {
6948 case 0:
6949 emit_insn (gen_cr6_test_for_zero (target));
6950 break;
6951 case 1:
6952 emit_insn (gen_cr6_test_for_zero_reverse (target));
6953 break;
6954 case 2:
6955 emit_insn (gen_cr6_test_for_lt (target));
6956 break;
6957 case 3:
6958 emit_insn (gen_cr6_test_for_lt_reverse (target));
6959 break;
6960 default:
6961 error ("argument 1 of __builtin_altivec_predicate is out of range");
6962 break;
6963 }
6964
6965 return target;
6966 }
6967
6968 static rtx
altivec_expand_lv_builtin(enum insn_code icode,tree arglist,rtx target)6969 altivec_expand_lv_builtin (enum insn_code icode, tree arglist, rtx target)
6970 {
6971 rtx pat, addr;
6972 tree arg0 = TREE_VALUE (arglist);
6973 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6974 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6975 enum machine_mode mode0 = Pmode;
6976 enum machine_mode mode1 = Pmode;
6977 rtx op0 = expand_normal (arg0);
6978 rtx op1 = expand_normal (arg1);
6979
6980 if (icode == CODE_FOR_nothing)
6981 /* Builtin not supported on this processor. */
6982 return 0;
6983
6984 /* If we got invalid arguments bail out before generating bad rtl. */
6985 if (arg0 == error_mark_node || arg1 == error_mark_node)
6986 return const0_rtx;
6987
6988 if (target == 0
6989 || GET_MODE (target) != tmode
6990 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6991 target = gen_reg_rtx (tmode);
6992
6993 op1 = copy_to_mode_reg (mode1, op1);
6994
6995 if (op0 == const0_rtx)
6996 {
6997 addr = gen_rtx_MEM (tmode, op1);
6998 }
6999 else
7000 {
7001 op0 = copy_to_mode_reg (mode0, op0);
7002 addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1));
7003 }
7004
7005 pat = GEN_FCN (icode) (target, addr);
7006
7007 if (! pat)
7008 return 0;
7009 emit_insn (pat);
7010
7011 return target;
7012 }
7013
7014 static rtx
spe_expand_stv_builtin(enum insn_code icode,tree arglist)7015 spe_expand_stv_builtin (enum insn_code icode, tree arglist)
7016 {
7017 tree arg0 = TREE_VALUE (arglist);
7018 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
7019 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7020 rtx op0 = expand_normal (arg0);
7021 rtx op1 = expand_normal (arg1);
7022 rtx op2 = expand_normal (arg2);
7023 rtx pat;
7024 enum machine_mode mode0 = insn_data[icode].operand[0].mode;
7025 enum machine_mode mode1 = insn_data[icode].operand[1].mode;
7026 enum machine_mode mode2 = insn_data[icode].operand[2].mode;
7027
7028 /* Invalid arguments. Bail before doing anything stoopid! */
7029 if (arg0 == error_mark_node
7030 || arg1 == error_mark_node
7031 || arg2 == error_mark_node)
7032 return const0_rtx;
7033
7034 if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
7035 op0 = copy_to_mode_reg (mode2, op0);
7036 if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
7037 op1 = copy_to_mode_reg (mode0, op1);
7038 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
7039 op2 = copy_to_mode_reg (mode1, op2);
7040
7041 pat = GEN_FCN (icode) (op1, op2, op0);
7042 if (pat)
7043 emit_insn (pat);
7044 return NULL_RTX;
7045 }
7046
7047 static rtx
altivec_expand_stv_builtin(enum insn_code icode,tree arglist)7048 altivec_expand_stv_builtin (enum insn_code icode, tree arglist)
7049 {
7050 tree arg0 = TREE_VALUE (arglist);
7051 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
7052 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7053 rtx op0 = expand_normal (arg0);
7054 rtx op1 = expand_normal (arg1);
7055 rtx op2 = expand_normal (arg2);
7056 rtx pat, addr;
7057 enum machine_mode tmode = insn_data[icode].operand[0].mode;
7058 enum machine_mode mode1 = Pmode;
7059 enum machine_mode mode2 = Pmode;
7060
7061 /* Invalid arguments. Bail before doing anything stoopid! */
7062 if (arg0 == error_mark_node
7063 || arg1 == error_mark_node
7064 || arg2 == error_mark_node)
7065 return const0_rtx;
7066
7067 if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
7068 op0 = copy_to_mode_reg (tmode, op0);
7069
7070 op2 = copy_to_mode_reg (mode2, op2);
7071
7072 if (op1 == const0_rtx)
7073 {
7074 addr = gen_rtx_MEM (tmode, op2);
7075 }
7076 else
7077 {
7078 op1 = copy_to_mode_reg (mode1, op1);
7079 addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
7080 }
7081
7082 pat = GEN_FCN (icode) (addr, op0);
7083 if (pat)
7084 emit_insn (pat);
7085 return NULL_RTX;
7086 }
7087
7088 static rtx
rs6000_expand_ternop_builtin(enum insn_code icode,tree arglist,rtx target)7089 rs6000_expand_ternop_builtin (enum insn_code icode, tree arglist, rtx target)
7090 {
7091 rtx pat;
7092 tree arg0 = TREE_VALUE (arglist);
7093 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
7094 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7095 rtx op0 = expand_normal (arg0);
7096 rtx op1 = expand_normal (arg1);
7097 rtx op2 = expand_normal (arg2);
7098 enum machine_mode tmode = insn_data[icode].operand[0].mode;
7099 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7100 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
7101 enum machine_mode mode2 = insn_data[icode].operand[3].mode;
7102
7103 if (icode == CODE_FOR_nothing)
7104 /* Builtin not supported on this processor. */
7105 return 0;
7106
7107 /* If we got invalid arguments bail out before generating bad rtl. */
7108 if (arg0 == error_mark_node
7109 || arg1 == error_mark_node
7110 || arg2 == error_mark_node)
7111 return const0_rtx;
7112
7113 if (icode == CODE_FOR_altivec_vsldoi_v4sf
7114 || icode == CODE_FOR_altivec_vsldoi_v4si
7115 || icode == CODE_FOR_altivec_vsldoi_v8hi
7116 || icode == CODE_FOR_altivec_vsldoi_v16qi)
7117 {
7118 /* Only allow 4-bit unsigned literals. */
7119 STRIP_NOPS (arg2);
7120 if (TREE_CODE (arg2) != INTEGER_CST
7121 || TREE_INT_CST_LOW (arg2) & ~0xf)
7122 {
7123 error ("argument 3 must be a 4-bit unsigned literal");
7124 return const0_rtx;
7125 }
7126 }
7127
7128 if (target == 0
7129 || GET_MODE (target) != tmode
7130 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7131 target = gen_reg_rtx (tmode);
7132
7133 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7134 op0 = copy_to_mode_reg (mode0, op0);
7135 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
7136 op1 = copy_to_mode_reg (mode1, op1);
7137 if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
7138 op2 = copy_to_mode_reg (mode2, op2);
7139
7140 pat = GEN_FCN (icode) (target, op0, op1, op2);
7141 if (! pat)
7142 return 0;
7143 emit_insn (pat);
7144
7145 return target;
7146 }
7147
7148 /* Expand the lvx builtins. */
7149 static rtx
altivec_expand_ld_builtin(tree exp,rtx target,bool * expandedp)7150 altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp)
7151 {
7152 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7153 tree arglist = TREE_OPERAND (exp, 1);
7154 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
7155 tree arg0;
7156 enum machine_mode tmode, mode0;
7157 rtx pat, op0;
7158 enum insn_code icode;
7159
7160 switch (fcode)
7161 {
7162 case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
7163 icode = CODE_FOR_altivec_lvx_v16qi;
7164 break;
7165 case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
7166 icode = CODE_FOR_altivec_lvx_v8hi;
7167 break;
7168 case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
7169 icode = CODE_FOR_altivec_lvx_v4si;
7170 break;
7171 case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
7172 icode = CODE_FOR_altivec_lvx_v4sf;
7173 break;
7174 default:
7175 *expandedp = false;
7176 return NULL_RTX;
7177 }
7178
7179 *expandedp = true;
7180
7181 arg0 = TREE_VALUE (arglist);
7182 op0 = expand_normal (arg0);
7183 tmode = insn_data[icode].operand[0].mode;
7184 mode0 = insn_data[icode].operand[1].mode;
7185
7186 if (target == 0
7187 || GET_MODE (target) != tmode
7188 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7189 target = gen_reg_rtx (tmode);
7190
7191 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7192 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
7193
7194 pat = GEN_FCN (icode) (target, op0);
7195 if (! pat)
7196 return 0;
7197 emit_insn (pat);
7198 return target;
7199 }
7200
7201 /* Expand the stvx builtins. */
7202 static rtx
altivec_expand_st_builtin(tree exp,rtx target ATTRIBUTE_UNUSED,bool * expandedp)7203 altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
7204 bool *expandedp)
7205 {
7206 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7207 tree arglist = TREE_OPERAND (exp, 1);
7208 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
7209 tree arg0, arg1;
7210 enum machine_mode mode0, mode1;
7211 rtx pat, op0, op1;
7212 enum insn_code icode;
7213
7214 switch (fcode)
7215 {
7216 case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
7217 icode = CODE_FOR_altivec_stvx_v16qi;
7218 break;
7219 case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
7220 icode = CODE_FOR_altivec_stvx_v8hi;
7221 break;
7222 case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
7223 icode = CODE_FOR_altivec_stvx_v4si;
7224 break;
7225 case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
7226 icode = CODE_FOR_altivec_stvx_v4sf;
7227 break;
7228 default:
7229 *expandedp = false;
7230 return NULL_RTX;
7231 }
7232
7233 arg0 = TREE_VALUE (arglist);
7234 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
7235 op0 = expand_normal (arg0);
7236 op1 = expand_normal (arg1);
7237 mode0 = insn_data[icode].operand[0].mode;
7238 mode1 = insn_data[icode].operand[1].mode;
7239
7240 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
7241 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
7242 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
7243 op1 = copy_to_mode_reg (mode1, op1);
7244
7245 pat = GEN_FCN (icode) (op0, op1);
7246 if (pat)
7247 emit_insn (pat);
7248
7249 *expandedp = true;
7250 return NULL_RTX;
7251 }
7252
7253 /* Expand the dst builtins. */
7254 static rtx
altivec_expand_dst_builtin(tree exp,rtx target ATTRIBUTE_UNUSED,bool * expandedp)7255 altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
7256 bool *expandedp)
7257 {
7258 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7259 tree arglist = TREE_OPERAND (exp, 1);
7260 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
7261 tree arg0, arg1, arg2;
7262 enum machine_mode mode0, mode1, mode2;
7263 rtx pat, op0, op1, op2;
7264 struct builtin_description *d;
7265 size_t i;
7266
7267 *expandedp = false;
7268
7269 /* Handle DST variants. */
7270 d = (struct builtin_description *) bdesc_dst;
7271 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
7272 if (d->code == fcode)
7273 {
7274 arg0 = TREE_VALUE (arglist);
7275 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
7276 arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7277 op0 = expand_normal (arg0);
7278 op1 = expand_normal (arg1);
7279 op2 = expand_normal (arg2);
7280 mode0 = insn_data[d->icode].operand[0].mode;
7281 mode1 = insn_data[d->icode].operand[1].mode;
7282 mode2 = insn_data[d->icode].operand[2].mode;
7283
7284 /* Invalid arguments, bail out before generating bad rtl. */
7285 if (arg0 == error_mark_node
7286 || arg1 == error_mark_node
7287 || arg2 == error_mark_node)
7288 return const0_rtx;
7289
7290 *expandedp = true;
7291 STRIP_NOPS (arg2);
7292 if (TREE_CODE (arg2) != INTEGER_CST
7293 || TREE_INT_CST_LOW (arg2) & ~0x3)
7294 {
7295 error ("argument to %qs must be a 2-bit unsigned literal", d->name);
7296 return const0_rtx;
7297 }
7298
7299 if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
7300 op0 = copy_to_mode_reg (Pmode, op0);
7301 if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
7302 op1 = copy_to_mode_reg (mode1, op1);
7303
7304 pat = GEN_FCN (d->icode) (op0, op1, op2);
7305 if (pat != 0)
7306 emit_insn (pat);
7307
7308 return NULL_RTX;
7309 }
7310
7311 return NULL_RTX;
7312 }
7313
7314 /* Expand vec_init builtin. */
7315 static rtx
altivec_expand_vec_init_builtin(tree type,tree arglist,rtx target)7316 altivec_expand_vec_init_builtin (tree type, tree arglist, rtx target)
7317 {
7318 enum machine_mode tmode = TYPE_MODE (type);
7319 enum machine_mode inner_mode = GET_MODE_INNER (tmode);
7320 int i, n_elt = GET_MODE_NUNITS (tmode);
7321 rtvec v = rtvec_alloc (n_elt);
7322
7323 gcc_assert (VECTOR_MODE_P (tmode));
7324
7325 for (i = 0; i < n_elt; ++i, arglist = TREE_CHAIN (arglist))
7326 {
7327 rtx x = expand_normal (TREE_VALUE (arglist));
7328 RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
7329 }
7330
7331 gcc_assert (arglist == NULL);
7332
7333 if (!target || !register_operand (target, tmode))
7334 target = gen_reg_rtx (tmode);
7335
7336 rs6000_expand_vector_init (target, gen_rtx_PARALLEL (tmode, v));
7337 return target;
7338 }
7339
7340 /* Return the integer constant in ARG. Constrain it to be in the range
7341 of the subparts of VEC_TYPE; issue an error if not. */
7342
7343 static int
get_element_number(tree vec_type,tree arg)7344 get_element_number (tree vec_type, tree arg)
7345 {
7346 unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
7347
7348 if (!host_integerp (arg, 1)
7349 || (elt = tree_low_cst (arg, 1), elt > max))
7350 {
7351 error ("selector must be an integer constant in the range 0..%wi", max);
7352 return 0;
7353 }
7354
7355 return elt;
7356 }
7357
7358 /* Expand vec_set builtin. */
7359 static rtx
altivec_expand_vec_set_builtin(tree arglist)7360 altivec_expand_vec_set_builtin (tree arglist)
7361 {
7362 enum machine_mode tmode, mode1;
7363 tree arg0, arg1, arg2;
7364 int elt;
7365 rtx op0, op1;
7366
7367 arg0 = TREE_VALUE (arglist);
7368 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
7369 arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7370
7371 tmode = TYPE_MODE (TREE_TYPE (arg0));
7372 mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
7373 gcc_assert (VECTOR_MODE_P (tmode));
7374
7375 op0 = expand_expr (arg0, NULL_RTX, tmode, 0);
7376 op1 = expand_expr (arg1, NULL_RTX, mode1, 0);
7377 elt = get_element_number (TREE_TYPE (arg0), arg2);
7378
7379 if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
7380 op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
7381
7382 op0 = force_reg (tmode, op0);
7383 op1 = force_reg (mode1, op1);
7384
7385 rs6000_expand_vector_set (op0, op1, elt);
7386
7387 return op0;
7388 }
7389
7390 /* Expand vec_ext builtin. */
7391 static rtx
altivec_expand_vec_ext_builtin(tree arglist,rtx target)7392 altivec_expand_vec_ext_builtin (tree arglist, rtx target)
7393 {
7394 enum machine_mode tmode, mode0;
7395 tree arg0, arg1;
7396 int elt;
7397 rtx op0;
7398
7399 arg0 = TREE_VALUE (arglist);
7400 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
7401
7402 op0 = expand_normal (arg0);
7403 elt = get_element_number (TREE_TYPE (arg0), arg1);
7404
7405 tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
7406 mode0 = TYPE_MODE (TREE_TYPE (arg0));
7407 gcc_assert (VECTOR_MODE_P (mode0));
7408
7409 op0 = force_reg (mode0, op0);
7410
7411 if (optimize || !target || !register_operand (target, tmode))
7412 target = gen_reg_rtx (tmode);
7413
7414 rs6000_expand_vector_extract (target, op0, elt);
7415
7416 return target;
7417 }
7418
7419 /* Expand the builtin in EXP and store the result in TARGET. Store
7420 true in *EXPANDEDP if we found a builtin to expand. */
7421 static rtx
altivec_expand_builtin(tree exp,rtx target,bool * expandedp)7422 altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
7423 {
7424 struct builtin_description *d;
7425 struct builtin_description_predicates *dp;
7426 size_t i;
7427 enum insn_code icode;
7428 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7429 tree arglist = TREE_OPERAND (exp, 1);
7430 tree arg0;
7431 rtx op0, pat;
7432 enum machine_mode tmode, mode0;
7433 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
7434
7435 if (fcode >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
7436 && fcode <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
7437 {
7438 *expandedp = true;
7439 error ("unresolved overload for Altivec builtin %qF", fndecl);
7440 return const0_rtx;
7441 }
7442
7443 target = altivec_expand_ld_builtin (exp, target, expandedp);
7444 if (*expandedp)
7445 return target;
7446
7447 target = altivec_expand_st_builtin (exp, target, expandedp);
7448 if (*expandedp)
7449 return target;
7450
7451 target = altivec_expand_dst_builtin (exp, target, expandedp);
7452 if (*expandedp)
7453 return target;
7454
7455 *expandedp = true;
7456
7457 switch (fcode)
7458 {
7459 case ALTIVEC_BUILTIN_STVX:
7460 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx, arglist);
7461 case ALTIVEC_BUILTIN_STVEBX:
7462 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, arglist);
7463 case ALTIVEC_BUILTIN_STVEHX:
7464 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, arglist);
7465 case ALTIVEC_BUILTIN_STVEWX:
7466 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, arglist);
7467 case ALTIVEC_BUILTIN_STVXL:
7468 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, arglist);
7469
7470 case ALTIVEC_BUILTIN_MFVSCR:
7471 icode = CODE_FOR_altivec_mfvscr;
7472 tmode = insn_data[icode].operand[0].mode;
7473
7474 if (target == 0
7475 || GET_MODE (target) != tmode
7476 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7477 target = gen_reg_rtx (tmode);
7478
7479 pat = GEN_FCN (icode) (target);
7480 if (! pat)
7481 return 0;
7482 emit_insn (pat);
7483 return target;
7484
7485 case ALTIVEC_BUILTIN_MTVSCR:
7486 icode = CODE_FOR_altivec_mtvscr;
7487 arg0 = TREE_VALUE (arglist);
7488 op0 = expand_normal (arg0);
7489 mode0 = insn_data[icode].operand[0].mode;
7490
7491 /* If we got invalid arguments bail out before generating bad rtl. */
7492 if (arg0 == error_mark_node)
7493 return const0_rtx;
7494
7495 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
7496 op0 = copy_to_mode_reg (mode0, op0);
7497
7498 pat = GEN_FCN (icode) (op0);
7499 if (pat)
7500 emit_insn (pat);
7501 return NULL_RTX;
7502
7503 case ALTIVEC_BUILTIN_DSSALL:
7504 emit_insn (gen_altivec_dssall ());
7505 return NULL_RTX;
7506
7507 case ALTIVEC_BUILTIN_DSS:
7508 icode = CODE_FOR_altivec_dss;
7509 arg0 = TREE_VALUE (arglist);
7510 STRIP_NOPS (arg0);
7511 op0 = expand_normal (arg0);
7512 mode0 = insn_data[icode].operand[0].mode;
7513
7514 /* If we got invalid arguments bail out before generating bad rtl. */
7515 if (arg0 == error_mark_node)
7516 return const0_rtx;
7517
7518 if (TREE_CODE (arg0) != INTEGER_CST
7519 || TREE_INT_CST_LOW (arg0) & ~0x3)
7520 {
7521 error ("argument to dss must be a 2-bit unsigned literal");
7522 return const0_rtx;
7523 }
7524
7525 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
7526 op0 = copy_to_mode_reg (mode0, op0);
7527
7528 emit_insn (gen_altivec_dss (op0));
7529 return NULL_RTX;
7530
7531 case ALTIVEC_BUILTIN_VEC_INIT_V4SI:
7532 case ALTIVEC_BUILTIN_VEC_INIT_V8HI:
7533 case ALTIVEC_BUILTIN_VEC_INIT_V16QI:
7534 case ALTIVEC_BUILTIN_VEC_INIT_V4SF:
7535 return altivec_expand_vec_init_builtin (TREE_TYPE (exp), arglist, target);
7536
7537 case ALTIVEC_BUILTIN_VEC_SET_V4SI:
7538 case ALTIVEC_BUILTIN_VEC_SET_V8HI:
7539 case ALTIVEC_BUILTIN_VEC_SET_V16QI:
7540 case ALTIVEC_BUILTIN_VEC_SET_V4SF:
7541 return altivec_expand_vec_set_builtin (arglist);
7542
7543 case ALTIVEC_BUILTIN_VEC_EXT_V4SI:
7544 case ALTIVEC_BUILTIN_VEC_EXT_V8HI:
7545 case ALTIVEC_BUILTIN_VEC_EXT_V16QI:
7546 case ALTIVEC_BUILTIN_VEC_EXT_V4SF:
7547 return altivec_expand_vec_ext_builtin (arglist, target);
7548
7549 default:
7550 break;
7551 /* Fall through. */
7552 }
7553
7554 /* Expand abs* operations. */
7555 d = (struct builtin_description *) bdesc_abs;
7556 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
7557 if (d->code == fcode)
7558 return altivec_expand_abs_builtin (d->icode, arglist, target);
7559
7560 /* Expand the AltiVec predicates. */
7561 dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
7562 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
7563 if (dp->code == fcode)
7564 return altivec_expand_predicate_builtin (dp->icode, dp->opcode,
7565 arglist, target);
7566
7567 /* LV* are funky. We initialized them differently. */
7568 switch (fcode)
7569 {
7570 case ALTIVEC_BUILTIN_LVSL:
7571 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
7572 arglist, target);
7573 case ALTIVEC_BUILTIN_LVSR:
7574 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
7575 arglist, target);
7576 case ALTIVEC_BUILTIN_LVEBX:
7577 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
7578 arglist, target);
7579 case ALTIVEC_BUILTIN_LVEHX:
7580 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
7581 arglist, target);
7582 case ALTIVEC_BUILTIN_LVEWX:
7583 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
7584 arglist, target);
7585 case ALTIVEC_BUILTIN_LVXL:
7586 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl,
7587 arglist, target);
7588 case ALTIVEC_BUILTIN_LVX:
7589 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx,
7590 arglist, target);
7591 default:
7592 break;
7593 /* Fall through. */
7594 }
7595
7596 *expandedp = false;
7597 return NULL_RTX;
7598 }
7599
7600 /* Binops that need to be initialized manually, but can be expanded
7601 automagically by rs6000_expand_binop_builtin. */
7602 static struct builtin_description bdesc_2arg_spe[] =
7603 {
7604 { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
7605 { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
7606 { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
7607 { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
7608 { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
7609 { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
7610 { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
7611 { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
7612 { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
7613 { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
7614 { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
7615 { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
7616 { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
7617 { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
7618 { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
7619 { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
7620 { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
7621 { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
7622 { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
7623 { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
7624 { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
7625 { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
7626 };
7627
7628 /* Expand the builtin in EXP and store the result in TARGET. Store
7629 true in *EXPANDEDP if we found a builtin to expand.
7630
7631 This expands the SPE builtins that are not simple unary and binary
7632 operations. */
7633 static rtx
spe_expand_builtin(tree exp,rtx target,bool * expandedp)7634 spe_expand_builtin (tree exp, rtx target, bool *expandedp)
7635 {
7636 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7637 tree arglist = TREE_OPERAND (exp, 1);
7638 tree arg1, arg0;
7639 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
7640 enum insn_code icode;
7641 enum machine_mode tmode, mode0;
7642 rtx pat, op0;
7643 struct builtin_description *d;
7644 size_t i;
7645
7646 *expandedp = true;
7647
7648 /* Syntax check for a 5-bit unsigned immediate. */
7649 switch (fcode)
7650 {
7651 case SPE_BUILTIN_EVSTDD:
7652 case SPE_BUILTIN_EVSTDH:
7653 case SPE_BUILTIN_EVSTDW:
7654 case SPE_BUILTIN_EVSTWHE:
7655 case SPE_BUILTIN_EVSTWHO:
7656 case SPE_BUILTIN_EVSTWWE:
7657 case SPE_BUILTIN_EVSTWWO:
7658 arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7659 if (TREE_CODE (arg1) != INTEGER_CST
7660 || TREE_INT_CST_LOW (arg1) & ~0x1f)
7661 {
7662 error ("argument 2 must be a 5-bit unsigned literal");
7663 return const0_rtx;
7664 }
7665 break;
7666 default:
7667 break;
7668 }
7669
7670 /* The evsplat*i instructions are not quite generic. */
7671 switch (fcode)
7672 {
7673 case SPE_BUILTIN_EVSPLATFI:
7674 return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi,
7675 arglist, target);
7676 case SPE_BUILTIN_EVSPLATI:
7677 return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati,
7678 arglist, target);
7679 default:
7680 break;
7681 }
7682
7683 d = (struct builtin_description *) bdesc_2arg_spe;
7684 for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
7685 if (d->code == fcode)
7686 return rs6000_expand_binop_builtin (d->icode, arglist, target);
7687
7688 d = (struct builtin_description *) bdesc_spe_predicates;
7689 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
7690 if (d->code == fcode)
7691 return spe_expand_predicate_builtin (d->icode, arglist, target);
7692
7693 d = (struct builtin_description *) bdesc_spe_evsel;
7694 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
7695 if (d->code == fcode)
7696 return spe_expand_evsel_builtin (d->icode, arglist, target);
7697
7698 switch (fcode)
7699 {
7700 case SPE_BUILTIN_EVSTDDX:
7701 return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, arglist);
7702 case SPE_BUILTIN_EVSTDHX:
7703 return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, arglist);
7704 case SPE_BUILTIN_EVSTDWX:
7705 return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, arglist);
7706 case SPE_BUILTIN_EVSTWHEX:
7707 return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, arglist);
7708 case SPE_BUILTIN_EVSTWHOX:
7709 return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, arglist);
7710 case SPE_BUILTIN_EVSTWWEX:
7711 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, arglist);
7712 case SPE_BUILTIN_EVSTWWOX:
7713 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, arglist);
7714 case SPE_BUILTIN_EVSTDD:
7715 return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, arglist);
7716 case SPE_BUILTIN_EVSTDH:
7717 return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, arglist);
7718 case SPE_BUILTIN_EVSTDW:
7719 return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, arglist);
7720 case SPE_BUILTIN_EVSTWHE:
7721 return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, arglist);
7722 case SPE_BUILTIN_EVSTWHO:
7723 return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, arglist);
7724 case SPE_BUILTIN_EVSTWWE:
7725 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, arglist);
7726 case SPE_BUILTIN_EVSTWWO:
7727 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, arglist);
7728 case SPE_BUILTIN_MFSPEFSCR:
7729 icode = CODE_FOR_spe_mfspefscr;
7730 tmode = insn_data[icode].operand[0].mode;
7731
7732 if (target == 0
7733 || GET_MODE (target) != tmode
7734 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7735 target = gen_reg_rtx (tmode);
7736
7737 pat = GEN_FCN (icode) (target);
7738 if (! pat)
7739 return 0;
7740 emit_insn (pat);
7741 return target;
7742 case SPE_BUILTIN_MTSPEFSCR:
7743 icode = CODE_FOR_spe_mtspefscr;
7744 arg0 = TREE_VALUE (arglist);
7745 op0 = expand_normal (arg0);
7746 mode0 = insn_data[icode].operand[0].mode;
7747
7748 if (arg0 == error_mark_node)
7749 return const0_rtx;
7750
7751 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
7752 op0 = copy_to_mode_reg (mode0, op0);
7753
7754 pat = GEN_FCN (icode) (op0);
7755 if (pat)
7756 emit_insn (pat);
7757 return NULL_RTX;
7758 default:
7759 break;
7760 }
7761
7762 *expandedp = false;
7763 return NULL_RTX;
7764 }
7765
7766 static rtx
spe_expand_predicate_builtin(enum insn_code icode,tree arglist,rtx target)7767 spe_expand_predicate_builtin (enum insn_code icode, tree arglist, rtx target)
7768 {
7769 rtx pat, scratch, tmp;
7770 tree form = TREE_VALUE (arglist);
7771 tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
7772 tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7773 rtx op0 = expand_normal (arg0);
7774 rtx op1 = expand_normal (arg1);
7775 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7776 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
7777 int form_int;
7778 enum rtx_code code;
7779
7780 if (TREE_CODE (form) != INTEGER_CST)
7781 {
7782 error ("argument 1 of __builtin_spe_predicate must be a constant");
7783 return const0_rtx;
7784 }
7785 else
7786 form_int = TREE_INT_CST_LOW (form);
7787
7788 gcc_assert (mode0 == mode1);
7789
7790 if (arg0 == error_mark_node || arg1 == error_mark_node)
7791 return const0_rtx;
7792
7793 if (target == 0
7794 || GET_MODE (target) != SImode
7795 || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
7796 target = gen_reg_rtx (SImode);
7797
7798 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7799 op0 = copy_to_mode_reg (mode0, op0);
7800 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
7801 op1 = copy_to_mode_reg (mode1, op1);
7802
7803 scratch = gen_reg_rtx (CCmode);
7804
7805 pat = GEN_FCN (icode) (scratch, op0, op1);
7806 if (! pat)
7807 return const0_rtx;
7808 emit_insn (pat);
7809
7810 /* There are 4 variants for each predicate: _any_, _all_, _upper_,
7811 _lower_. We use one compare, but look in different bits of the
7812 CR for each variant.
7813
7814 There are 2 elements in each SPE simd type (upper/lower). The CR
7815 bits are set as follows:
7816
7817 BIT0 | BIT 1 | BIT 2 | BIT 3
7818 U | L | (U | L) | (U & L)
7819
7820 So, for an "all" relationship, BIT 3 would be set.
7821 For an "any" relationship, BIT 2 would be set. Etc.
7822
7823 Following traditional nomenclature, these bits map to:
7824
7825 BIT0 | BIT 1 | BIT 2 | BIT 3
7826 LT | GT | EQ | OV
7827
7828 Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
7829 */
7830
7831 switch (form_int)
7832 {
7833 /* All variant. OV bit. */
7834 case 0:
7835 /* We need to get to the OV bit, which is the ORDERED bit. We
7836 could generate (ordered:SI (reg:CC xx) (const_int 0)), but
7837 that's ugly and will make validate_condition_mode die.
7838 So let's just use another pattern. */
7839 emit_insn (gen_move_from_CR_ov_bit (target, scratch));
7840 return target;
7841 /* Any variant. EQ bit. */
7842 case 1:
7843 code = EQ;
7844 break;
7845 /* Upper variant. LT bit. */
7846 case 2:
7847 code = LT;
7848 break;
7849 /* Lower variant. GT bit. */
7850 case 3:
7851 code = GT;
7852 break;
7853 default:
7854 error ("argument 1 of __builtin_spe_predicate is out of range");
7855 return const0_rtx;
7856 }
7857
7858 tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
7859 emit_move_insn (target, tmp);
7860
7861 return target;
7862 }
7863
7864 /* The evsel builtins look like this:
7865
7866 e = __builtin_spe_evsel_OP (a, b, c, d);
7867
7868 and work like this:
7869
7870 e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
7871 e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
7872 */
7873
7874 static rtx
spe_expand_evsel_builtin(enum insn_code icode,tree arglist,rtx target)7875 spe_expand_evsel_builtin (enum insn_code icode, tree arglist, rtx target)
7876 {
7877 rtx pat, scratch;
7878 tree arg0 = TREE_VALUE (arglist);
7879 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
7880 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7881 tree arg3 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (arglist))));
7882 rtx op0 = expand_normal (arg0);
7883 rtx op1 = expand_normal (arg1);
7884 rtx op2 = expand_normal (arg2);
7885 rtx op3 = expand_normal (arg3);
7886 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7887 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
7888
7889 gcc_assert (mode0 == mode1);
7890
7891 if (arg0 == error_mark_node || arg1 == error_mark_node
7892 || arg2 == error_mark_node || arg3 == error_mark_node)
7893 return const0_rtx;
7894
7895 if (target == 0
7896 || GET_MODE (target) != mode0
7897 || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
7898 target = gen_reg_rtx (mode0);
7899
7900 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7901 op0 = copy_to_mode_reg (mode0, op0);
7902 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
7903 op1 = copy_to_mode_reg (mode0, op1);
7904 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
7905 op2 = copy_to_mode_reg (mode0, op2);
7906 if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
7907 op3 = copy_to_mode_reg (mode0, op3);
7908
7909 /* Generate the compare. */
7910 scratch = gen_reg_rtx (CCmode);
7911 pat = GEN_FCN (icode) (scratch, op0, op1);
7912 if (! pat)
7913 return const0_rtx;
7914 emit_insn (pat);
7915
7916 if (mode0 == V2SImode)
7917 emit_insn (gen_spe_evsel (target, op2, op3, scratch));
7918 else
7919 emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
7920
7921 return target;
7922 }
7923
7924 /* Expand an expression EXP that calls a built-in function,
7925 with result going to TARGET if that's convenient
7926 (and in mode MODE if that's convenient).
7927 SUBTARGET may be used as the target for computing one of EXP's operands.
7928 IGNORE is nonzero if the value is to be ignored. */
7929
7930 static rtx
rs6000_expand_builtin(tree exp,rtx target,rtx subtarget ATTRIBUTE_UNUSED,enum machine_mode mode ATTRIBUTE_UNUSED,int ignore ATTRIBUTE_UNUSED)7931 rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
7932 enum machine_mode mode ATTRIBUTE_UNUSED,
7933 int ignore ATTRIBUTE_UNUSED)
7934 {
7935 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7936 tree arglist = TREE_OPERAND (exp, 1);
7937 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
7938 struct builtin_description *d;
7939 size_t i;
7940 rtx ret;
7941 bool success;
7942
7943 if (fcode == ALTIVEC_BUILTIN_MASK_FOR_LOAD
7944 || fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
7945 {
7946 int icode = (int) CODE_FOR_altivec_lvsr;
7947 enum machine_mode tmode = insn_data[icode].operand[0].mode;
7948 enum machine_mode mode = insn_data[icode].operand[1].mode;
7949 tree arg;
7950 rtx op, addr, pat;
7951
7952 gcc_assert (TARGET_ALTIVEC);
7953
7954 arg = TREE_VALUE (arglist);
7955 gcc_assert (TREE_CODE (TREE_TYPE (arg)) == POINTER_TYPE);
7956 op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL);
7957 addr = memory_address (mode, op);
7958 if (fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
7959 op = addr;
7960 else
7961 {
7962 /* For the load case need to negate the address. */
7963 op = gen_reg_rtx (GET_MODE (addr));
7964 emit_insn (gen_rtx_SET (VOIDmode, op,
7965 gen_rtx_NEG (GET_MODE (addr), addr)));
7966 }
7967 op = gen_rtx_MEM (mode, op);
7968
7969 if (target == 0
7970 || GET_MODE (target) != tmode
7971 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7972 target = gen_reg_rtx (tmode);
7973
7974 /*pat = gen_altivec_lvsr (target, op);*/
7975 pat = GEN_FCN (icode) (target, op);
7976 if (!pat)
7977 return 0;
7978 emit_insn (pat);
7979
7980 return target;
7981 }
7982
7983 if (TARGET_ALTIVEC)
7984 {
7985 ret = altivec_expand_builtin (exp, target, &success);
7986
7987 if (success)
7988 return ret;
7989 }
7990 if (TARGET_SPE)
7991 {
7992 ret = spe_expand_builtin (exp, target, &success);
7993
7994 if (success)
7995 return ret;
7996 }
7997
7998 gcc_assert (TARGET_ALTIVEC || TARGET_SPE);
7999
8000 /* Handle simple unary operations. */
8001 d = (struct builtin_description *) bdesc_1arg;
8002 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
8003 if (d->code == fcode)
8004 return rs6000_expand_unop_builtin (d->icode, arglist, target);
8005
8006 /* Handle simple binary operations. */
8007 d = (struct builtin_description *) bdesc_2arg;
8008 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
8009 if (d->code == fcode)
8010 return rs6000_expand_binop_builtin (d->icode, arglist, target);
8011
8012 /* Handle simple ternary operations. */
8013 d = (struct builtin_description *) bdesc_3arg;
8014 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
8015 if (d->code == fcode)
8016 return rs6000_expand_ternop_builtin (d->icode, arglist, target);
8017
8018 gcc_unreachable ();
8019 }
8020
8021 static tree
build_opaque_vector_type(tree node,int nunits)8022 build_opaque_vector_type (tree node, int nunits)
8023 {
8024 node = copy_node (node);
8025 TYPE_MAIN_VARIANT (node) = node;
8026 return build_vector_type (node, nunits);
8027 }
8028
8029 static void
rs6000_init_builtins(void)8030 rs6000_init_builtins (void)
8031 {
8032 V2SI_type_node = build_vector_type (intSI_type_node, 2);
8033 V2SF_type_node = build_vector_type (float_type_node, 2);
8034 V4HI_type_node = build_vector_type (intHI_type_node, 4);
8035 V4SI_type_node = build_vector_type (intSI_type_node, 4);
8036 V4SF_type_node = build_vector_type (float_type_node, 4);
8037 V8HI_type_node = build_vector_type (intHI_type_node, 8);
8038 V16QI_type_node = build_vector_type (intQI_type_node, 16);
8039
8040 unsigned_V16QI_type_node = build_vector_type (unsigned_intQI_type_node, 16);
8041 unsigned_V8HI_type_node = build_vector_type (unsigned_intHI_type_node, 8);
8042 unsigned_V4SI_type_node = build_vector_type (unsigned_intSI_type_node, 4);
8043
8044 opaque_V2SF_type_node = build_opaque_vector_type (float_type_node, 2);
8045 opaque_V2SI_type_node = build_opaque_vector_type (intSI_type_node, 2);
8046 opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
8047 opaque_V4SI_type_node = copy_node (V4SI_type_node);
8048
8049 /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
8050 types, especially in C++ land. Similarly, 'vector pixel' is distinct from
8051 'vector unsigned short'. */
8052
8053 bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
8054 bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
8055 bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
8056 pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
8057
8058 long_integer_type_internal_node = long_integer_type_node;
8059 long_unsigned_type_internal_node = long_unsigned_type_node;
8060 intQI_type_internal_node = intQI_type_node;
8061 uintQI_type_internal_node = unsigned_intQI_type_node;
8062 intHI_type_internal_node = intHI_type_node;
8063 uintHI_type_internal_node = unsigned_intHI_type_node;
8064 intSI_type_internal_node = intSI_type_node;
8065 uintSI_type_internal_node = unsigned_intSI_type_node;
8066 float_type_internal_node = float_type_node;
8067 void_type_internal_node = void_type_node;
8068
8069 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8070 get_identifier ("__bool char"),
8071 bool_char_type_node));
8072 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8073 get_identifier ("__bool short"),
8074 bool_short_type_node));
8075 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8076 get_identifier ("__bool int"),
8077 bool_int_type_node));
8078 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8079 get_identifier ("__pixel"),
8080 pixel_type_node));
8081
8082 bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16);
8083 bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8);
8084 bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4);
8085 pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8);
8086
8087 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8088 get_identifier ("__vector unsigned char"),
8089 unsigned_V16QI_type_node));
8090 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8091 get_identifier ("__vector signed char"),
8092 V16QI_type_node));
8093 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8094 get_identifier ("__vector __bool char"),
8095 bool_V16QI_type_node));
8096
8097 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8098 get_identifier ("__vector unsigned short"),
8099 unsigned_V8HI_type_node));
8100 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8101 get_identifier ("__vector signed short"),
8102 V8HI_type_node));
8103 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8104 get_identifier ("__vector __bool short"),
8105 bool_V8HI_type_node));
8106
8107 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8108 get_identifier ("__vector unsigned int"),
8109 unsigned_V4SI_type_node));
8110 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8111 get_identifier ("__vector signed int"),
8112 V4SI_type_node));
8113 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8114 get_identifier ("__vector __bool int"),
8115 bool_V4SI_type_node));
8116
8117 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8118 get_identifier ("__vector float"),
8119 V4SF_type_node));
8120 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
8121 get_identifier ("__vector __pixel"),
8122 pixel_V8HI_type_node));
8123
8124 if (TARGET_SPE)
8125 spe_init_builtins ();
8126 if (TARGET_ALTIVEC)
8127 altivec_init_builtins ();
8128 if (TARGET_ALTIVEC || TARGET_SPE)
8129 rs6000_common_init_builtins ();
8130
8131 #if TARGET_XCOFF
8132 /* AIX libm provides clog as __clog. */
8133 if (built_in_decls [BUILT_IN_CLOG])
8134 set_user_assembler_name (built_in_decls [BUILT_IN_CLOG], "__clog");
8135 #endif
8136 }
8137
8138 /* Search through a set of builtins and enable the mask bits.
8139 DESC is an array of builtins.
8140 SIZE is the total number of builtins.
8141 START is the builtin enum at which to start.
8142 END is the builtin enum at which to end. */
8143 static void
enable_mask_for_builtins(struct builtin_description * desc,int size,enum rs6000_builtins start,enum rs6000_builtins end)8144 enable_mask_for_builtins (struct builtin_description *desc, int size,
8145 enum rs6000_builtins start,
8146 enum rs6000_builtins end)
8147 {
8148 int i;
8149
8150 for (i = 0; i < size; ++i)
8151 if (desc[i].code == start)
8152 break;
8153
8154 if (i == size)
8155 return;
8156
8157 for (; i < size; ++i)
8158 {
8159 /* Flip all the bits on. */
8160 desc[i].mask = target_flags;
8161 if (desc[i].code == end)
8162 break;
8163 }
8164 }
8165
8166 static void
spe_init_builtins(void)8167 spe_init_builtins (void)
8168 {
8169 tree endlink = void_list_node;
8170 tree puint_type_node = build_pointer_type (unsigned_type_node);
8171 tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
8172 struct builtin_description *d;
8173 size_t i;
8174
8175 tree v2si_ftype_4_v2si
8176 = build_function_type
8177 (opaque_V2SI_type_node,
8178 tree_cons (NULL_TREE, opaque_V2SI_type_node,
8179 tree_cons (NULL_TREE, opaque_V2SI_type_node,
8180 tree_cons (NULL_TREE, opaque_V2SI_type_node,
8181 tree_cons (NULL_TREE, opaque_V2SI_type_node,
8182 endlink)))));
8183
8184 tree v2sf_ftype_4_v2sf
8185 = build_function_type
8186 (opaque_V2SF_type_node,
8187 tree_cons (NULL_TREE, opaque_V2SF_type_node,
8188 tree_cons (NULL_TREE, opaque_V2SF_type_node,
8189 tree_cons (NULL_TREE, opaque_V2SF_type_node,
8190 tree_cons (NULL_TREE, opaque_V2SF_type_node,
8191 endlink)))));
8192
8193 tree int_ftype_int_v2si_v2si
8194 = build_function_type
8195 (integer_type_node,
8196 tree_cons (NULL_TREE, integer_type_node,
8197 tree_cons (NULL_TREE, opaque_V2SI_type_node,
8198 tree_cons (NULL_TREE, opaque_V2SI_type_node,
8199 endlink))));
8200
8201 tree int_ftype_int_v2sf_v2sf
8202 = build_function_type
8203 (integer_type_node,
8204 tree_cons (NULL_TREE, integer_type_node,
8205 tree_cons (NULL_TREE, opaque_V2SF_type_node,
8206 tree_cons (NULL_TREE, opaque_V2SF_type_node,
8207 endlink))));
8208
8209 tree void_ftype_v2si_puint_int
8210 = build_function_type (void_type_node,
8211 tree_cons (NULL_TREE, opaque_V2SI_type_node,
8212 tree_cons (NULL_TREE, puint_type_node,
8213 tree_cons (NULL_TREE,
8214 integer_type_node,
8215 endlink))));
8216
8217 tree void_ftype_v2si_puint_char
8218 = build_function_type (void_type_node,
8219 tree_cons (NULL_TREE, opaque_V2SI_type_node,
8220 tree_cons (NULL_TREE, puint_type_node,
8221 tree_cons (NULL_TREE,
8222 char_type_node,
8223 endlink))));
8224
8225 tree void_ftype_v2si_pv2si_int
8226 = build_function_type (void_type_node,
8227 tree_cons (NULL_TREE, opaque_V2SI_type_node,
8228 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
8229 tree_cons (NULL_TREE,
8230 integer_type_node,
8231 endlink))));
8232
8233 tree void_ftype_v2si_pv2si_char
8234 = build_function_type (void_type_node,
8235 tree_cons (NULL_TREE, opaque_V2SI_type_node,
8236 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
8237 tree_cons (NULL_TREE,
8238 char_type_node,
8239 endlink))));
8240
8241 tree void_ftype_int
8242 = build_function_type (void_type_node,
8243 tree_cons (NULL_TREE, integer_type_node, endlink));
8244
8245 tree int_ftype_void
8246 = build_function_type (integer_type_node, endlink);
8247
8248 tree v2si_ftype_pv2si_int
8249 = build_function_type (opaque_V2SI_type_node,
8250 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
8251 tree_cons (NULL_TREE, integer_type_node,
8252 endlink)));
8253
8254 tree v2si_ftype_puint_int
8255 = build_function_type (opaque_V2SI_type_node,
8256 tree_cons (NULL_TREE, puint_type_node,
8257 tree_cons (NULL_TREE, integer_type_node,
8258 endlink)));
8259
8260 tree v2si_ftype_pushort_int
8261 = build_function_type (opaque_V2SI_type_node,
8262 tree_cons (NULL_TREE, pushort_type_node,
8263 tree_cons (NULL_TREE, integer_type_node,
8264 endlink)));
8265
8266 tree v2si_ftype_signed_char
8267 = build_function_type (opaque_V2SI_type_node,
8268 tree_cons (NULL_TREE, signed_char_type_node,
8269 endlink));
8270
8271 /* The initialization of the simple binary and unary builtins is
8272 done in rs6000_common_init_builtins, but we have to enable the
8273 mask bits here manually because we have run out of `target_flags'
8274 bits. We really need to redesign this mask business. */
8275
8276 enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
8277 ARRAY_SIZE (bdesc_2arg),
8278 SPE_BUILTIN_EVADDW,
8279 SPE_BUILTIN_EVXOR);
8280 enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
8281 ARRAY_SIZE (bdesc_1arg),
8282 SPE_BUILTIN_EVABS,
8283 SPE_BUILTIN_EVSUBFUSIAAW);
8284 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
8285 ARRAY_SIZE (bdesc_spe_predicates),
8286 SPE_BUILTIN_EVCMPEQ,
8287 SPE_BUILTIN_EVFSTSTLT);
8288 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
8289 ARRAY_SIZE (bdesc_spe_evsel),
8290 SPE_BUILTIN_EVSEL_CMPGTS,
8291 SPE_BUILTIN_EVSEL_FSTSTEQ);
8292
8293 (*lang_hooks.decls.pushdecl)
8294 (build_decl (TYPE_DECL, get_identifier ("__ev64_opaque__"),
8295 opaque_V2SI_type_node));
8296
8297 /* Initialize irregular SPE builtins. */
8298
8299 def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
8300 def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
8301 def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
8302 def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
8303 def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
8304 def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
8305 def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
8306 def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
8307 def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
8308 def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
8309 def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
8310 def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
8311 def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
8312 def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
8313 def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
8314 def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
8315 def_builtin (target_flags, "__builtin_spe_evsplatfi", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATFI);
8316 def_builtin (target_flags, "__builtin_spe_evsplati", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATI);
8317
8318 /* Loads. */
8319 def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
8320 def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
8321 def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
8322 def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
8323 def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
8324 def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
8325 def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
8326 def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
8327 def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
8328 def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
8329 def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
8330 def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
8331 def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
8332 def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
8333 def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
8334 def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
8335 def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
8336 def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
8337 def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
8338 def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
8339 def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
8340 def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
8341
8342 /* Predicates. */
8343 d = (struct builtin_description *) bdesc_spe_predicates;
8344 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
8345 {
8346 tree type;
8347
8348 switch (insn_data[d->icode].operand[1].mode)
8349 {
8350 case V2SImode:
8351 type = int_ftype_int_v2si_v2si;
8352 break;
8353 case V2SFmode:
8354 type = int_ftype_int_v2sf_v2sf;
8355 break;
8356 default:
8357 gcc_unreachable ();
8358 }
8359
8360 def_builtin (d->mask, d->name, type, d->code);
8361 }
8362
8363 /* Evsel predicates. */
8364 d = (struct builtin_description *) bdesc_spe_evsel;
8365 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
8366 {
8367 tree type;
8368
8369 switch (insn_data[d->icode].operand[1].mode)
8370 {
8371 case V2SImode:
8372 type = v2si_ftype_4_v2si;
8373 break;
8374 case V2SFmode:
8375 type = v2sf_ftype_4_v2sf;
8376 break;
8377 default:
8378 gcc_unreachable ();
8379 }
8380
8381 def_builtin (d->mask, d->name, type, d->code);
8382 }
8383 }
8384
8385 static void
altivec_init_builtins(void)8386 altivec_init_builtins (void)
8387 {
8388 struct builtin_description *d;
8389 struct builtin_description_predicates *dp;
8390 size_t i;
8391 tree ftype;
8392
8393 tree pfloat_type_node = build_pointer_type (float_type_node);
8394 tree pint_type_node = build_pointer_type (integer_type_node);
8395 tree pshort_type_node = build_pointer_type (short_integer_type_node);
8396 tree pchar_type_node = build_pointer_type (char_type_node);
8397
8398 tree pvoid_type_node = build_pointer_type (void_type_node);
8399
8400 tree pcfloat_type_node = build_pointer_type (build_qualified_type (float_type_node, TYPE_QUAL_CONST));
8401 tree pcint_type_node = build_pointer_type (build_qualified_type (integer_type_node, TYPE_QUAL_CONST));
8402 tree pcshort_type_node = build_pointer_type (build_qualified_type (short_integer_type_node, TYPE_QUAL_CONST));
8403 tree pcchar_type_node = build_pointer_type (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
8404
8405 tree pcvoid_type_node = build_pointer_type (build_qualified_type (void_type_node, TYPE_QUAL_CONST));
8406
8407 tree int_ftype_opaque
8408 = build_function_type_list (integer_type_node,
8409 opaque_V4SI_type_node, NULL_TREE);
8410
8411 tree opaque_ftype_opaque_int
8412 = build_function_type_list (opaque_V4SI_type_node,
8413 opaque_V4SI_type_node, integer_type_node, NULL_TREE);
8414 tree opaque_ftype_opaque_opaque_int
8415 = build_function_type_list (opaque_V4SI_type_node,
8416 opaque_V4SI_type_node, opaque_V4SI_type_node,
8417 integer_type_node, NULL_TREE);
8418 tree int_ftype_int_opaque_opaque
8419 = build_function_type_list (integer_type_node,
8420 integer_type_node, opaque_V4SI_type_node,
8421 opaque_V4SI_type_node, NULL_TREE);
8422 tree int_ftype_int_v4si_v4si
8423 = build_function_type_list (integer_type_node,
8424 integer_type_node, V4SI_type_node,
8425 V4SI_type_node, NULL_TREE);
8426 tree v4sf_ftype_pcfloat
8427 = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
8428 tree void_ftype_pfloat_v4sf
8429 = build_function_type_list (void_type_node,
8430 pfloat_type_node, V4SF_type_node, NULL_TREE);
8431 tree v4si_ftype_pcint
8432 = build_function_type_list (V4SI_type_node, pcint_type_node, NULL_TREE);
8433 tree void_ftype_pint_v4si
8434 = build_function_type_list (void_type_node,
8435 pint_type_node, V4SI_type_node, NULL_TREE);
8436 tree v8hi_ftype_pcshort
8437 = build_function_type_list (V8HI_type_node, pcshort_type_node, NULL_TREE);
8438 tree void_ftype_pshort_v8hi
8439 = build_function_type_list (void_type_node,
8440 pshort_type_node, V8HI_type_node, NULL_TREE);
8441 tree v16qi_ftype_pcchar
8442 = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
8443 tree void_ftype_pchar_v16qi
8444 = build_function_type_list (void_type_node,
8445 pchar_type_node, V16QI_type_node, NULL_TREE);
8446 tree void_ftype_v4si
8447 = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
8448 tree v8hi_ftype_void
8449 = build_function_type (V8HI_type_node, void_list_node);
8450 tree void_ftype_void
8451 = build_function_type (void_type_node, void_list_node);
8452 tree void_ftype_int
8453 = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
8454
8455 tree opaque_ftype_long_pcvoid
8456 = build_function_type_list (opaque_V4SI_type_node,
8457 long_integer_type_node, pcvoid_type_node, NULL_TREE);
8458 tree v16qi_ftype_long_pcvoid
8459 = build_function_type_list (V16QI_type_node,
8460 long_integer_type_node, pcvoid_type_node, NULL_TREE);
8461 tree v8hi_ftype_long_pcvoid
8462 = build_function_type_list (V8HI_type_node,
8463 long_integer_type_node, pcvoid_type_node, NULL_TREE);
8464 tree v4si_ftype_long_pcvoid
8465 = build_function_type_list (V4SI_type_node,
8466 long_integer_type_node, pcvoid_type_node, NULL_TREE);
8467
8468 tree void_ftype_opaque_long_pvoid
8469 = build_function_type_list (void_type_node,
8470 opaque_V4SI_type_node, long_integer_type_node,
8471 pvoid_type_node, NULL_TREE);
8472 tree void_ftype_v4si_long_pvoid
8473 = build_function_type_list (void_type_node,
8474 V4SI_type_node, long_integer_type_node,
8475 pvoid_type_node, NULL_TREE);
8476 tree void_ftype_v16qi_long_pvoid
8477 = build_function_type_list (void_type_node,
8478 V16QI_type_node, long_integer_type_node,
8479 pvoid_type_node, NULL_TREE);
8480 tree void_ftype_v8hi_long_pvoid
8481 = build_function_type_list (void_type_node,
8482 V8HI_type_node, long_integer_type_node,
8483 pvoid_type_node, NULL_TREE);
8484 tree int_ftype_int_v8hi_v8hi
8485 = build_function_type_list (integer_type_node,
8486 integer_type_node, V8HI_type_node,
8487 V8HI_type_node, NULL_TREE);
8488 tree int_ftype_int_v16qi_v16qi
8489 = build_function_type_list (integer_type_node,
8490 integer_type_node, V16QI_type_node,
8491 V16QI_type_node, NULL_TREE);
8492 tree int_ftype_int_v4sf_v4sf
8493 = build_function_type_list (integer_type_node,
8494 integer_type_node, V4SF_type_node,
8495 V4SF_type_node, NULL_TREE);
8496 tree v4si_ftype_v4si
8497 = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
8498 tree v8hi_ftype_v8hi
8499 = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
8500 tree v16qi_ftype_v16qi
8501 = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
8502 tree v4sf_ftype_v4sf
8503 = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
8504 tree void_ftype_pcvoid_int_int
8505 = build_function_type_list (void_type_node,
8506 pcvoid_type_node, integer_type_node,
8507 integer_type_node, NULL_TREE);
8508
8509 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4sf", v4sf_ftype_pcfloat,
8510 ALTIVEC_BUILTIN_LD_INTERNAL_4sf);
8511 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4sf", void_ftype_pfloat_v4sf,
8512 ALTIVEC_BUILTIN_ST_INTERNAL_4sf);
8513 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4si", v4si_ftype_pcint,
8514 ALTIVEC_BUILTIN_LD_INTERNAL_4si);
8515 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4si", void_ftype_pint_v4si,
8516 ALTIVEC_BUILTIN_ST_INTERNAL_4si);
8517 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_8hi", v8hi_ftype_pcshort,
8518 ALTIVEC_BUILTIN_LD_INTERNAL_8hi);
8519 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_8hi", void_ftype_pshort_v8hi,
8520 ALTIVEC_BUILTIN_ST_INTERNAL_8hi);
8521 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_16qi", v16qi_ftype_pcchar,
8522 ALTIVEC_BUILTIN_LD_INTERNAL_16qi);
8523 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_16qi", void_ftype_pchar_v16qi,
8524 ALTIVEC_BUILTIN_ST_INTERNAL_16qi);
8525 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
8526 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
8527 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
8528 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
8529 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
8530 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
8531 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
8532 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
8533 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
8534 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
8535 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
8536 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
8537 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
8538 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
8539 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
8540 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
8541 def_builtin (MASK_ALTIVEC, "__builtin_vec_ld", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LD);
8542 def_builtin (MASK_ALTIVEC, "__builtin_vec_lde", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDE);
8543 def_builtin (MASK_ALTIVEC, "__builtin_vec_ldl", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDL);
8544 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSL);
8545 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSR);
8546 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEBX);
8547 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEHX);
8548 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEWX);
8549 def_builtin (MASK_ALTIVEC, "__builtin_vec_st", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_ST);
8550 def_builtin (MASK_ALTIVEC, "__builtin_vec_ste", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STE);
8551 def_builtin (MASK_ALTIVEC, "__builtin_vec_stl", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STL);
8552 def_builtin (MASK_ALTIVEC, "__builtin_vec_stvewx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEWX);
8553 def_builtin (MASK_ALTIVEC, "__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
8554 def_builtin (MASK_ALTIVEC, "__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
8555
8556 def_builtin (MASK_ALTIVEC, "__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
8557
8558 def_builtin (MASK_ALTIVEC, "__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
8559 def_builtin (MASK_ALTIVEC, "__builtin_vec_splat", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_SPLAT);
8560 def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltw", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTW);
8561 def_builtin (MASK_ALTIVEC, "__builtin_vec_vsplth", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTH);
8562 def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltb", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTB);
8563 def_builtin (MASK_ALTIVEC, "__builtin_vec_ctf", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTF);
8564 def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfsx", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFSX);
8565 def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfux", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFUX);
8566 def_builtin (MASK_ALTIVEC, "__builtin_vec_cts", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTS);
8567 def_builtin (MASK_ALTIVEC, "__builtin_vec_ctu", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTU);
8568
8569 /* Add the DST variants. */
8570 d = (struct builtin_description *) bdesc_dst;
8571 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
8572 def_builtin (d->mask, d->name, void_ftype_pcvoid_int_int, d->code);
8573
8574 /* Initialize the predicates. */
8575 dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
8576 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
8577 {
8578 enum machine_mode mode1;
8579 tree type;
8580 bool is_overloaded = dp->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
8581 && dp->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
8582
8583 if (is_overloaded)
8584 mode1 = VOIDmode;
8585 else
8586 mode1 = insn_data[dp->icode].operand[1].mode;
8587
8588 switch (mode1)
8589 {
8590 case VOIDmode:
8591 type = int_ftype_int_opaque_opaque;
8592 break;
8593 case V4SImode:
8594 type = int_ftype_int_v4si_v4si;
8595 break;
8596 case V8HImode:
8597 type = int_ftype_int_v8hi_v8hi;
8598 break;
8599 case V16QImode:
8600 type = int_ftype_int_v16qi_v16qi;
8601 break;
8602 case V4SFmode:
8603 type = int_ftype_int_v4sf_v4sf;
8604 break;
8605 default:
8606 gcc_unreachable ();
8607 }
8608
8609 def_builtin (dp->mask, dp->name, type, dp->code);
8610 }
8611
8612 /* Initialize the abs* operators. */
8613 d = (struct builtin_description *) bdesc_abs;
8614 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
8615 {
8616 enum machine_mode mode0;
8617 tree type;
8618
8619 mode0 = insn_data[d->icode].operand[0].mode;
8620
8621 switch (mode0)
8622 {
8623 case V4SImode:
8624 type = v4si_ftype_v4si;
8625 break;
8626 case V8HImode:
8627 type = v8hi_ftype_v8hi;
8628 break;
8629 case V16QImode:
8630 type = v16qi_ftype_v16qi;
8631 break;
8632 case V4SFmode:
8633 type = v4sf_ftype_v4sf;
8634 break;
8635 default:
8636 gcc_unreachable ();
8637 }
8638
8639 def_builtin (d->mask, d->name, type, d->code);
8640 }
8641
8642 if (TARGET_ALTIVEC)
8643 {
8644 tree decl;
8645
8646 /* Initialize target builtin that implements
8647 targetm.vectorize.builtin_mask_for_load. */
8648
8649 decl = lang_hooks.builtin_function ("__builtin_altivec_mask_for_load",
8650 v16qi_ftype_long_pcvoid,
8651 ALTIVEC_BUILTIN_MASK_FOR_LOAD,
8652 BUILT_IN_MD, NULL,
8653 tree_cons (get_identifier ("const"),
8654 NULL_TREE, NULL_TREE));
8655 /* Record the decl. Will be used by rs6000_builtin_mask_for_load. */
8656 altivec_builtin_mask_for_load = decl;
8657 }
8658
8659 /* Access to the vec_init patterns. */
8660 ftype = build_function_type_list (V4SI_type_node, integer_type_node,
8661 integer_type_node, integer_type_node,
8662 integer_type_node, NULL_TREE);
8663 def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4si", ftype,
8664 ALTIVEC_BUILTIN_VEC_INIT_V4SI);
8665
8666 ftype = build_function_type_list (V8HI_type_node, short_integer_type_node,
8667 short_integer_type_node,
8668 short_integer_type_node,
8669 short_integer_type_node,
8670 short_integer_type_node,
8671 short_integer_type_node,
8672 short_integer_type_node,
8673 short_integer_type_node, NULL_TREE);
8674 def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v8hi", ftype,
8675 ALTIVEC_BUILTIN_VEC_INIT_V8HI);
8676
8677 ftype = build_function_type_list (V16QI_type_node, char_type_node,
8678 char_type_node, char_type_node,
8679 char_type_node, char_type_node,
8680 char_type_node, char_type_node,
8681 char_type_node, char_type_node,
8682 char_type_node, char_type_node,
8683 char_type_node, char_type_node,
8684 char_type_node, char_type_node,
8685 char_type_node, NULL_TREE);
8686 def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v16qi", ftype,
8687 ALTIVEC_BUILTIN_VEC_INIT_V16QI);
8688
8689 ftype = build_function_type_list (V4SF_type_node, float_type_node,
8690 float_type_node, float_type_node,
8691 float_type_node, NULL_TREE);
8692 def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4sf", ftype,
8693 ALTIVEC_BUILTIN_VEC_INIT_V4SF);
8694
8695 /* Access to the vec_set patterns. */
8696 ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
8697 intSI_type_node,
8698 integer_type_node, NULL_TREE);
8699 def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v4si", ftype,
8700 ALTIVEC_BUILTIN_VEC_SET_V4SI);
8701
8702 ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
8703 intHI_type_node,
8704 integer_type_node, NULL_TREE);
8705 def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v8hi", ftype,
8706 ALTIVEC_BUILTIN_VEC_SET_V8HI);
8707
8708 ftype = build_function_type_list (V8HI_type_node, V16QI_type_node,
8709 intQI_type_node,
8710 integer_type_node, NULL_TREE);
8711 def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v16qi", ftype,
8712 ALTIVEC_BUILTIN_VEC_SET_V16QI);
8713
8714 ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
8715 float_type_node,
8716 integer_type_node, NULL_TREE);
8717 def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v4sf", ftype,
8718 ALTIVEC_BUILTIN_VEC_SET_V4SF);
8719
8720 /* Access to the vec_extract patterns. */
8721 ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
8722 integer_type_node, NULL_TREE);
8723 def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v4si", ftype,
8724 ALTIVEC_BUILTIN_VEC_EXT_V4SI);
8725
8726 ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
8727 integer_type_node, NULL_TREE);
8728 def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v8hi", ftype,
8729 ALTIVEC_BUILTIN_VEC_EXT_V8HI);
8730
8731 ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
8732 integer_type_node, NULL_TREE);
8733 def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v16qi", ftype,
8734 ALTIVEC_BUILTIN_VEC_EXT_V16QI);
8735
8736 ftype = build_function_type_list (float_type_node, V4SF_type_node,
8737 integer_type_node, NULL_TREE);
8738 def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v4sf", ftype,
8739 ALTIVEC_BUILTIN_VEC_EXT_V4SF);
8740 }
8741
8742 static void
rs6000_common_init_builtins(void)8743 rs6000_common_init_builtins (void)
8744 {
8745 struct builtin_description *d;
8746 size_t i;
8747
8748 tree v4sf_ftype_v4sf_v4sf_v16qi
8749 = build_function_type_list (V4SF_type_node,
8750 V4SF_type_node, V4SF_type_node,
8751 V16QI_type_node, NULL_TREE);
8752 tree v4si_ftype_v4si_v4si_v16qi
8753 = build_function_type_list (V4SI_type_node,
8754 V4SI_type_node, V4SI_type_node,
8755 V16QI_type_node, NULL_TREE);
8756 tree v8hi_ftype_v8hi_v8hi_v16qi
8757 = build_function_type_list (V8HI_type_node,
8758 V8HI_type_node, V8HI_type_node,
8759 V16QI_type_node, NULL_TREE);
8760 tree v16qi_ftype_v16qi_v16qi_v16qi
8761 = build_function_type_list (V16QI_type_node,
8762 V16QI_type_node, V16QI_type_node,
8763 V16QI_type_node, NULL_TREE);
8764 tree v4si_ftype_int
8765 = build_function_type_list (V4SI_type_node, integer_type_node, NULL_TREE);
8766 tree v8hi_ftype_int
8767 = build_function_type_list (V8HI_type_node, integer_type_node, NULL_TREE);
8768 tree v16qi_ftype_int
8769 = build_function_type_list (V16QI_type_node, integer_type_node, NULL_TREE);
8770 tree v8hi_ftype_v16qi
8771 = build_function_type_list (V8HI_type_node, V16QI_type_node, NULL_TREE);
8772 tree v4sf_ftype_v4sf
8773 = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
8774
8775 tree v2si_ftype_v2si_v2si
8776 = build_function_type_list (opaque_V2SI_type_node,
8777 opaque_V2SI_type_node,
8778 opaque_V2SI_type_node, NULL_TREE);
8779
8780 tree v2sf_ftype_v2sf_v2sf
8781 = build_function_type_list (opaque_V2SF_type_node,
8782 opaque_V2SF_type_node,
8783 opaque_V2SF_type_node, NULL_TREE);
8784
8785 tree v2si_ftype_int_int
8786 = build_function_type_list (opaque_V2SI_type_node,
8787 integer_type_node, integer_type_node,
8788 NULL_TREE);
8789
8790 tree opaque_ftype_opaque
8791 = build_function_type_list (opaque_V4SI_type_node,
8792 opaque_V4SI_type_node, NULL_TREE);
8793
8794 tree v2si_ftype_v2si
8795 = build_function_type_list (opaque_V2SI_type_node,
8796 opaque_V2SI_type_node, NULL_TREE);
8797
8798 tree v2sf_ftype_v2sf
8799 = build_function_type_list (opaque_V2SF_type_node,
8800 opaque_V2SF_type_node, NULL_TREE);
8801
8802 tree v2sf_ftype_v2si
8803 = build_function_type_list (opaque_V2SF_type_node,
8804 opaque_V2SI_type_node, NULL_TREE);
8805
8806 tree v2si_ftype_v2sf
8807 = build_function_type_list (opaque_V2SI_type_node,
8808 opaque_V2SF_type_node, NULL_TREE);
8809
8810 tree v2si_ftype_v2si_char
8811 = build_function_type_list (opaque_V2SI_type_node,
8812 opaque_V2SI_type_node,
8813 char_type_node, NULL_TREE);
8814
8815 tree v2si_ftype_int_char
8816 = build_function_type_list (opaque_V2SI_type_node,
8817 integer_type_node, char_type_node, NULL_TREE);
8818
8819 tree v2si_ftype_char
8820 = build_function_type_list (opaque_V2SI_type_node,
8821 char_type_node, NULL_TREE);
8822
8823 tree int_ftype_int_int
8824 = build_function_type_list (integer_type_node,
8825 integer_type_node, integer_type_node,
8826 NULL_TREE);
8827
8828 tree opaque_ftype_opaque_opaque
8829 = build_function_type_list (opaque_V4SI_type_node,
8830 opaque_V4SI_type_node, opaque_V4SI_type_node, NULL_TREE);
8831 tree v4si_ftype_v4si_v4si
8832 = build_function_type_list (V4SI_type_node,
8833 V4SI_type_node, V4SI_type_node, NULL_TREE);
8834 tree v4sf_ftype_v4si_int
8835 = build_function_type_list (V4SF_type_node,
8836 V4SI_type_node, integer_type_node, NULL_TREE);
8837 tree v4si_ftype_v4sf_int
8838 = build_function_type_list (V4SI_type_node,
8839 V4SF_type_node, integer_type_node, NULL_TREE);
8840 tree v4si_ftype_v4si_int
8841 = build_function_type_list (V4SI_type_node,
8842 V4SI_type_node, integer_type_node, NULL_TREE);
8843 tree v8hi_ftype_v8hi_int
8844 = build_function_type_list (V8HI_type_node,
8845 V8HI_type_node, integer_type_node, NULL_TREE);
8846 tree v16qi_ftype_v16qi_int
8847 = build_function_type_list (V16QI_type_node,
8848 V16QI_type_node, integer_type_node, NULL_TREE);
8849 tree v16qi_ftype_v16qi_v16qi_int
8850 = build_function_type_list (V16QI_type_node,
8851 V16QI_type_node, V16QI_type_node,
8852 integer_type_node, NULL_TREE);
8853 tree v8hi_ftype_v8hi_v8hi_int
8854 = build_function_type_list (V8HI_type_node,
8855 V8HI_type_node, V8HI_type_node,
8856 integer_type_node, NULL_TREE);
8857 tree v4si_ftype_v4si_v4si_int
8858 = build_function_type_list (V4SI_type_node,
8859 V4SI_type_node, V4SI_type_node,
8860 integer_type_node, NULL_TREE);
8861 tree v4sf_ftype_v4sf_v4sf_int
8862 = build_function_type_list (V4SF_type_node,
8863 V4SF_type_node, V4SF_type_node,
8864 integer_type_node, NULL_TREE);
8865 tree v4sf_ftype_v4sf_v4sf
8866 = build_function_type_list (V4SF_type_node,
8867 V4SF_type_node, V4SF_type_node, NULL_TREE);
8868 tree opaque_ftype_opaque_opaque_opaque
8869 = build_function_type_list (opaque_V4SI_type_node,
8870 opaque_V4SI_type_node, opaque_V4SI_type_node,
8871 opaque_V4SI_type_node, NULL_TREE);
8872 tree v4sf_ftype_v4sf_v4sf_v4si
8873 = build_function_type_list (V4SF_type_node,
8874 V4SF_type_node, V4SF_type_node,
8875 V4SI_type_node, NULL_TREE);
8876 tree v4sf_ftype_v4sf_v4sf_v4sf
8877 = build_function_type_list (V4SF_type_node,
8878 V4SF_type_node, V4SF_type_node,
8879 V4SF_type_node, NULL_TREE);
8880 tree v4si_ftype_v4si_v4si_v4si
8881 = build_function_type_list (V4SI_type_node,
8882 V4SI_type_node, V4SI_type_node,
8883 V4SI_type_node, NULL_TREE);
8884 tree v8hi_ftype_v8hi_v8hi
8885 = build_function_type_list (V8HI_type_node,
8886 V8HI_type_node, V8HI_type_node, NULL_TREE);
8887 tree v8hi_ftype_v8hi_v8hi_v8hi
8888 = build_function_type_list (V8HI_type_node,
8889 V8HI_type_node, V8HI_type_node,
8890 V8HI_type_node, NULL_TREE);
8891 tree v4si_ftype_v8hi_v8hi_v4si
8892 = build_function_type_list (V4SI_type_node,
8893 V8HI_type_node, V8HI_type_node,
8894 V4SI_type_node, NULL_TREE);
8895 tree v4si_ftype_v16qi_v16qi_v4si
8896 = build_function_type_list (V4SI_type_node,
8897 V16QI_type_node, V16QI_type_node,
8898 V4SI_type_node, NULL_TREE);
8899 tree v16qi_ftype_v16qi_v16qi
8900 = build_function_type_list (V16QI_type_node,
8901 V16QI_type_node, V16QI_type_node, NULL_TREE);
8902 tree v4si_ftype_v4sf_v4sf
8903 = build_function_type_list (V4SI_type_node,
8904 V4SF_type_node, V4SF_type_node, NULL_TREE);
8905 tree v8hi_ftype_v16qi_v16qi
8906 = build_function_type_list (V8HI_type_node,
8907 V16QI_type_node, V16QI_type_node, NULL_TREE);
8908 tree v4si_ftype_v8hi_v8hi
8909 = build_function_type_list (V4SI_type_node,
8910 V8HI_type_node, V8HI_type_node, NULL_TREE);
8911 tree v8hi_ftype_v4si_v4si
8912 = build_function_type_list (V8HI_type_node,
8913 V4SI_type_node, V4SI_type_node, NULL_TREE);
8914 tree v16qi_ftype_v8hi_v8hi
8915 = build_function_type_list (V16QI_type_node,
8916 V8HI_type_node, V8HI_type_node, NULL_TREE);
8917 tree v4si_ftype_v16qi_v4si
8918 = build_function_type_list (V4SI_type_node,
8919 V16QI_type_node, V4SI_type_node, NULL_TREE);
8920 tree v4si_ftype_v16qi_v16qi
8921 = build_function_type_list (V4SI_type_node,
8922 V16QI_type_node, V16QI_type_node, NULL_TREE);
8923 tree v4si_ftype_v8hi_v4si
8924 = build_function_type_list (V4SI_type_node,
8925 V8HI_type_node, V4SI_type_node, NULL_TREE);
8926 tree v4si_ftype_v8hi
8927 = build_function_type_list (V4SI_type_node, V8HI_type_node, NULL_TREE);
8928 tree int_ftype_v4si_v4si
8929 = build_function_type_list (integer_type_node,
8930 V4SI_type_node, V4SI_type_node, NULL_TREE);
8931 tree int_ftype_v4sf_v4sf
8932 = build_function_type_list (integer_type_node,
8933 V4SF_type_node, V4SF_type_node, NULL_TREE);
8934 tree int_ftype_v16qi_v16qi
8935 = build_function_type_list (integer_type_node,
8936 V16QI_type_node, V16QI_type_node, NULL_TREE);
8937 tree int_ftype_v8hi_v8hi
8938 = build_function_type_list (integer_type_node,
8939 V8HI_type_node, V8HI_type_node, NULL_TREE);
8940
8941 /* Add the simple ternary operators. */
8942 d = (struct builtin_description *) bdesc_3arg;
8943 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
8944 {
8945 enum machine_mode mode0, mode1, mode2, mode3;
8946 tree type;
8947 bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
8948 && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
8949
8950 if (is_overloaded)
8951 {
8952 mode0 = VOIDmode;
8953 mode1 = VOIDmode;
8954 mode2 = VOIDmode;
8955 mode3 = VOIDmode;
8956 }
8957 else
8958 {
8959 if (d->name == 0 || d->icode == CODE_FOR_nothing)
8960 continue;
8961
8962 mode0 = insn_data[d->icode].operand[0].mode;
8963 mode1 = insn_data[d->icode].operand[1].mode;
8964 mode2 = insn_data[d->icode].operand[2].mode;
8965 mode3 = insn_data[d->icode].operand[3].mode;
8966 }
8967
8968 /* When all four are of the same mode. */
8969 if (mode0 == mode1 && mode1 == mode2 && mode2 == mode3)
8970 {
8971 switch (mode0)
8972 {
8973 case VOIDmode:
8974 type = opaque_ftype_opaque_opaque_opaque;
8975 break;
8976 case V4SImode:
8977 type = v4si_ftype_v4si_v4si_v4si;
8978 break;
8979 case V4SFmode:
8980 type = v4sf_ftype_v4sf_v4sf_v4sf;
8981 break;
8982 case V8HImode:
8983 type = v8hi_ftype_v8hi_v8hi_v8hi;
8984 break;
8985 case V16QImode:
8986 type = v16qi_ftype_v16qi_v16qi_v16qi;
8987 break;
8988 default:
8989 gcc_unreachable ();
8990 }
8991 }
8992 else if (mode0 == mode1 && mode1 == mode2 && mode3 == V16QImode)
8993 {
8994 switch (mode0)
8995 {
8996 case V4SImode:
8997 type = v4si_ftype_v4si_v4si_v16qi;
8998 break;
8999 case V4SFmode:
9000 type = v4sf_ftype_v4sf_v4sf_v16qi;
9001 break;
9002 case V8HImode:
9003 type = v8hi_ftype_v8hi_v8hi_v16qi;
9004 break;
9005 case V16QImode:
9006 type = v16qi_ftype_v16qi_v16qi_v16qi;
9007 break;
9008 default:
9009 gcc_unreachable ();
9010 }
9011 }
9012 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode
9013 && mode3 == V4SImode)
9014 type = v4si_ftype_v16qi_v16qi_v4si;
9015 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode
9016 && mode3 == V4SImode)
9017 type = v4si_ftype_v8hi_v8hi_v4si;
9018 else if (mode0 == V4SFmode && mode1 == V4SFmode && mode2 == V4SFmode
9019 && mode3 == V4SImode)
9020 type = v4sf_ftype_v4sf_v4sf_v4si;
9021
9022 /* vchar, vchar, vchar, 4 bit literal. */
9023 else if (mode0 == V16QImode && mode1 == mode0 && mode2 == mode0
9024 && mode3 == QImode)
9025 type = v16qi_ftype_v16qi_v16qi_int;
9026
9027 /* vshort, vshort, vshort, 4 bit literal. */
9028 else if (mode0 == V8HImode && mode1 == mode0 && mode2 == mode0
9029 && mode3 == QImode)
9030 type = v8hi_ftype_v8hi_v8hi_int;
9031
9032 /* vint, vint, vint, 4 bit literal. */
9033 else if (mode0 == V4SImode && mode1 == mode0 && mode2 == mode0
9034 && mode3 == QImode)
9035 type = v4si_ftype_v4si_v4si_int;
9036
9037 /* vfloat, vfloat, vfloat, 4 bit literal. */
9038 else if (mode0 == V4SFmode && mode1 == mode0 && mode2 == mode0
9039 && mode3 == QImode)
9040 type = v4sf_ftype_v4sf_v4sf_int;
9041
9042 else
9043 gcc_unreachable ();
9044
9045 def_builtin (d->mask, d->name, type, d->code);
9046 }
9047
9048 /* Add the simple binary operators. */
9049 d = (struct builtin_description *) bdesc_2arg;
9050 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
9051 {
9052 enum machine_mode mode0, mode1, mode2;
9053 tree type;
9054 bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
9055 && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
9056
9057 if (is_overloaded)
9058 {
9059 mode0 = VOIDmode;
9060 mode1 = VOIDmode;
9061 mode2 = VOIDmode;
9062 }
9063 else
9064 {
9065 if (d->name == 0 || d->icode == CODE_FOR_nothing)
9066 continue;
9067
9068 mode0 = insn_data[d->icode].operand[0].mode;
9069 mode1 = insn_data[d->icode].operand[1].mode;
9070 mode2 = insn_data[d->icode].operand[2].mode;
9071 }
9072
9073 /* When all three operands are of the same mode. */
9074 if (mode0 == mode1 && mode1 == mode2)
9075 {
9076 switch (mode0)
9077 {
9078 case VOIDmode:
9079 type = opaque_ftype_opaque_opaque;
9080 break;
9081 case V4SFmode:
9082 type = v4sf_ftype_v4sf_v4sf;
9083 break;
9084 case V4SImode:
9085 type = v4si_ftype_v4si_v4si;
9086 break;
9087 case V16QImode:
9088 type = v16qi_ftype_v16qi_v16qi;
9089 break;
9090 case V8HImode:
9091 type = v8hi_ftype_v8hi_v8hi;
9092 break;
9093 case V2SImode:
9094 type = v2si_ftype_v2si_v2si;
9095 break;
9096 case V2SFmode:
9097 type = v2sf_ftype_v2sf_v2sf;
9098 break;
9099 case SImode:
9100 type = int_ftype_int_int;
9101 break;
9102 default:
9103 gcc_unreachable ();
9104 }
9105 }
9106
9107 /* A few other combos we really don't want to do manually. */
9108
9109 /* vint, vfloat, vfloat. */
9110 else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == V4SFmode)
9111 type = v4si_ftype_v4sf_v4sf;
9112
9113 /* vshort, vchar, vchar. */
9114 else if (mode0 == V8HImode && mode1 == V16QImode && mode2 == V16QImode)
9115 type = v8hi_ftype_v16qi_v16qi;
9116
9117 /* vint, vshort, vshort. */
9118 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode)
9119 type = v4si_ftype_v8hi_v8hi;
9120
9121 /* vshort, vint, vint. */
9122 else if (mode0 == V8HImode && mode1 == V4SImode && mode2 == V4SImode)
9123 type = v8hi_ftype_v4si_v4si;
9124
9125 /* vchar, vshort, vshort. */
9126 else if (mode0 == V16QImode && mode1 == V8HImode && mode2 == V8HImode)
9127 type = v16qi_ftype_v8hi_v8hi;
9128
9129 /* vint, vchar, vint. */
9130 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V4SImode)
9131 type = v4si_ftype_v16qi_v4si;
9132
9133 /* vint, vchar, vchar. */
9134 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode)
9135 type = v4si_ftype_v16qi_v16qi;
9136
9137 /* vint, vshort, vint. */
9138 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V4SImode)
9139 type = v4si_ftype_v8hi_v4si;
9140
9141 /* vint, vint, 5 bit literal. */
9142 else if (mode0 == V4SImode && mode1 == V4SImode && mode2 == QImode)
9143 type = v4si_ftype_v4si_int;
9144
9145 /* vshort, vshort, 5 bit literal. */
9146 else if (mode0 == V8HImode && mode1 == V8HImode && mode2 == QImode)
9147 type = v8hi_ftype_v8hi_int;
9148
9149 /* vchar, vchar, 5 bit literal. */
9150 else if (mode0 == V16QImode && mode1 == V16QImode && mode2 == QImode)
9151 type = v16qi_ftype_v16qi_int;
9152
9153 /* vfloat, vint, 5 bit literal. */
9154 else if (mode0 == V4SFmode && mode1 == V4SImode && mode2 == QImode)
9155 type = v4sf_ftype_v4si_int;
9156
9157 /* vint, vfloat, 5 bit literal. */
9158 else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == QImode)
9159 type = v4si_ftype_v4sf_int;
9160
9161 else if (mode0 == V2SImode && mode1 == SImode && mode2 == SImode)
9162 type = v2si_ftype_int_int;
9163
9164 else if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
9165 type = v2si_ftype_v2si_char;
9166
9167 else if (mode0 == V2SImode && mode1 == SImode && mode2 == QImode)
9168 type = v2si_ftype_int_char;
9169
9170 else
9171 {
9172 /* int, x, x. */
9173 gcc_assert (mode0 == SImode);
9174 switch (mode1)
9175 {
9176 case V4SImode:
9177 type = int_ftype_v4si_v4si;
9178 break;
9179 case V4SFmode:
9180 type = int_ftype_v4sf_v4sf;
9181 break;
9182 case V16QImode:
9183 type = int_ftype_v16qi_v16qi;
9184 break;
9185 case V8HImode:
9186 type = int_ftype_v8hi_v8hi;
9187 break;
9188 default:
9189 gcc_unreachable ();
9190 }
9191 }
9192
9193 def_builtin (d->mask, d->name, type, d->code);
9194 }
9195
9196 /* Add the simple unary operators. */
9197 d = (struct builtin_description *) bdesc_1arg;
9198 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
9199 {
9200 enum machine_mode mode0, mode1;
9201 tree type;
9202 bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
9203 && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
9204
9205 if (is_overloaded)
9206 {
9207 mode0 = VOIDmode;
9208 mode1 = VOIDmode;
9209 }
9210 else
9211 {
9212 if (d->name == 0 || d->icode == CODE_FOR_nothing)
9213 continue;
9214
9215 mode0 = insn_data[d->icode].operand[0].mode;
9216 mode1 = insn_data[d->icode].operand[1].mode;
9217 }
9218
9219 if (mode0 == V4SImode && mode1 == QImode)
9220 type = v4si_ftype_int;
9221 else if (mode0 == V8HImode && mode1 == QImode)
9222 type = v8hi_ftype_int;
9223 else if (mode0 == V16QImode && mode1 == QImode)
9224 type = v16qi_ftype_int;
9225 else if (mode0 == VOIDmode && mode1 == VOIDmode)
9226 type = opaque_ftype_opaque;
9227 else if (mode0 == V4SFmode && mode1 == V4SFmode)
9228 type = v4sf_ftype_v4sf;
9229 else if (mode0 == V8HImode && mode1 == V16QImode)
9230 type = v8hi_ftype_v16qi;
9231 else if (mode0 == V4SImode && mode1 == V8HImode)
9232 type = v4si_ftype_v8hi;
9233 else if (mode0 == V2SImode && mode1 == V2SImode)
9234 type = v2si_ftype_v2si;
9235 else if (mode0 == V2SFmode && mode1 == V2SFmode)
9236 type = v2sf_ftype_v2sf;
9237 else if (mode0 == V2SFmode && mode1 == V2SImode)
9238 type = v2sf_ftype_v2si;
9239 else if (mode0 == V2SImode && mode1 == V2SFmode)
9240 type = v2si_ftype_v2sf;
9241 else if (mode0 == V2SImode && mode1 == QImode)
9242 type = v2si_ftype_char;
9243 else
9244 gcc_unreachable ();
9245
9246 def_builtin (d->mask, d->name, type, d->code);
9247 }
9248 }
9249
9250 static void
rs6000_init_libfuncs(void)9251 rs6000_init_libfuncs (void)
9252 {
9253 if (DEFAULT_ABI != ABI_V4 && TARGET_XCOFF
9254 && !TARGET_POWER2 && !TARGET_POWERPC)
9255 {
9256 /* AIX library routines for float->int conversion. */
9257 set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc");
9258 set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc");
9259 set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc");
9260 set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc");
9261 }
9262
9263 if (!TARGET_IEEEQUAD)
9264 /* AIX/Darwin/64-bit Linux quad floating point routines. */
9265 if (!TARGET_XL_COMPAT)
9266 {
9267 set_optab_libfunc (add_optab, TFmode, "__gcc_qadd");
9268 set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub");
9269 set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul");
9270 set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv");
9271
9272 if (TARGET_SOFT_FLOAT)
9273 {
9274 set_optab_libfunc (neg_optab, TFmode, "__gcc_qneg");
9275 set_optab_libfunc (eq_optab, TFmode, "__gcc_qeq");
9276 set_optab_libfunc (ne_optab, TFmode, "__gcc_qne");
9277 set_optab_libfunc (gt_optab, TFmode, "__gcc_qgt");
9278 set_optab_libfunc (ge_optab, TFmode, "__gcc_qge");
9279 set_optab_libfunc (lt_optab, TFmode, "__gcc_qlt");
9280 set_optab_libfunc (le_optab, TFmode, "__gcc_qle");
9281 set_optab_libfunc (unord_optab, TFmode, "__gcc_qunord");
9282
9283 set_conv_libfunc (sext_optab, TFmode, SFmode, "__gcc_stoq");
9284 set_conv_libfunc (sext_optab, TFmode, DFmode, "__gcc_dtoq");
9285 set_conv_libfunc (trunc_optab, SFmode, TFmode, "__gcc_qtos");
9286 set_conv_libfunc (trunc_optab, DFmode, TFmode, "__gcc_qtod");
9287 set_conv_libfunc (sfix_optab, SImode, TFmode, "__gcc_qtoi");
9288 set_conv_libfunc (ufix_optab, SImode, TFmode, "__gcc_qtou");
9289 set_conv_libfunc (sfloat_optab, TFmode, SImode, "__gcc_itoq");
9290 set_conv_libfunc (ufloat_optab, TFmode, SImode, "__gcc_utoq");
9291 }
9292 }
9293 else
9294 {
9295 set_optab_libfunc (add_optab, TFmode, "_xlqadd");
9296 set_optab_libfunc (sub_optab, TFmode, "_xlqsub");
9297 set_optab_libfunc (smul_optab, TFmode, "_xlqmul");
9298 set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv");
9299 }
9300 else
9301 {
9302 /* 32-bit SVR4 quad floating point routines. */
9303
9304 set_optab_libfunc (add_optab, TFmode, "_q_add");
9305 set_optab_libfunc (sub_optab, TFmode, "_q_sub");
9306 set_optab_libfunc (neg_optab, TFmode, "_q_neg");
9307 set_optab_libfunc (smul_optab, TFmode, "_q_mul");
9308 set_optab_libfunc (sdiv_optab, TFmode, "_q_div");
9309 if (TARGET_PPC_GPOPT || TARGET_POWER2)
9310 set_optab_libfunc (sqrt_optab, TFmode, "_q_sqrt");
9311
9312 set_optab_libfunc (eq_optab, TFmode, "_q_feq");
9313 set_optab_libfunc (ne_optab, TFmode, "_q_fne");
9314 set_optab_libfunc (gt_optab, TFmode, "_q_fgt");
9315 set_optab_libfunc (ge_optab, TFmode, "_q_fge");
9316 set_optab_libfunc (lt_optab, TFmode, "_q_flt");
9317 set_optab_libfunc (le_optab, TFmode, "_q_fle");
9318
9319 set_conv_libfunc (sext_optab, TFmode, SFmode, "_q_stoq");
9320 set_conv_libfunc (sext_optab, TFmode, DFmode, "_q_dtoq");
9321 set_conv_libfunc (trunc_optab, SFmode, TFmode, "_q_qtos");
9322 set_conv_libfunc (trunc_optab, DFmode, TFmode, "_q_qtod");
9323 set_conv_libfunc (sfix_optab, SImode, TFmode, "_q_qtoi");
9324 set_conv_libfunc (ufix_optab, SImode, TFmode, "_q_qtou");
9325 set_conv_libfunc (sfloat_optab, TFmode, SImode, "_q_itoq");
9326 set_conv_libfunc (ufloat_optab, TFmode, SImode, "_q_utoq");
9327 }
9328 }
9329
9330
9331 /* Expand a block clear operation, and return 1 if successful. Return 0
9332 if we should let the compiler generate normal code.
9333
9334 operands[0] is the destination
9335 operands[1] is the length
9336 operands[3] is the alignment */
9337
9338 int
expand_block_clear(rtx operands[])9339 expand_block_clear (rtx operands[])
9340 {
9341 rtx orig_dest = operands[0];
9342 rtx bytes_rtx = operands[1];
9343 rtx align_rtx = operands[3];
9344 bool constp = (GET_CODE (bytes_rtx) == CONST_INT);
9345 HOST_WIDE_INT align;
9346 HOST_WIDE_INT bytes;
9347 int offset;
9348 int clear_bytes;
9349 int clear_step;
9350
9351 /* If this is not a fixed size move, just call memcpy */
9352 if (! constp)
9353 return 0;
9354
9355 /* This must be a fixed size alignment */
9356 gcc_assert (GET_CODE (align_rtx) == CONST_INT);
9357 align = INTVAL (align_rtx) * BITS_PER_UNIT;
9358
9359 /* Anything to clear? */
9360 bytes = INTVAL (bytes_rtx);
9361 if (bytes <= 0)
9362 return 1;
9363
9364 /* Use the builtin memset after a point, to avoid huge code bloat.
9365 When optimize_size, avoid any significant code bloat; calling
9366 memset is about 4 instructions, so allow for one instruction to
9367 load zero and three to do clearing. */
9368 if (TARGET_ALTIVEC && align >= 128)
9369 clear_step = 16;
9370 else if (TARGET_POWERPC64 && align >= 32)
9371 clear_step = 8;
9372 else
9373 clear_step = 4;
9374
9375 if (optimize_size && bytes > 3 * clear_step)
9376 return 0;
9377 if (! optimize_size && bytes > 8 * clear_step)
9378 return 0;
9379
9380 for (offset = 0; bytes > 0; offset += clear_bytes, bytes -= clear_bytes)
9381 {
9382 enum machine_mode mode = BLKmode;
9383 rtx dest;
9384
9385 if (bytes >= 16 && TARGET_ALTIVEC && align >= 128)
9386 {
9387 clear_bytes = 16;
9388 mode = V4SImode;
9389 }
9390 else if (bytes >= 8 && TARGET_POWERPC64
9391 /* 64-bit loads and stores require word-aligned
9392 displacements. */
9393 && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
9394 {
9395 clear_bytes = 8;
9396 mode = DImode;
9397 }
9398 else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
9399 { /* move 4 bytes */
9400 clear_bytes = 4;
9401 mode = SImode;
9402 }
9403 else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
9404 { /* move 2 bytes */
9405 clear_bytes = 2;
9406 mode = HImode;
9407 }
9408 else /* move 1 byte at a time */
9409 {
9410 clear_bytes = 1;
9411 mode = QImode;
9412 }
9413
9414 dest = adjust_address (orig_dest, mode, offset);
9415
9416 emit_move_insn (dest, CONST0_RTX (mode));
9417 }
9418
9419 return 1;
9420 }
9421
9422
9423 /* Expand a block move operation, and return 1 if successful. Return 0
9424 if we should let the compiler generate normal code.
9425
9426 operands[0] is the destination
9427 operands[1] is the source
9428 operands[2] is the length
9429 operands[3] is the alignment */
9430
9431 #define MAX_MOVE_REG 4
9432
9433 int
expand_block_move(rtx operands[])9434 expand_block_move (rtx operands[])
9435 {
9436 rtx orig_dest = operands[0];
9437 rtx orig_src = operands[1];
9438 rtx bytes_rtx = operands[2];
9439 rtx align_rtx = operands[3];
9440 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
9441 int align;
9442 int bytes;
9443 int offset;
9444 int move_bytes;
9445 rtx stores[MAX_MOVE_REG];
9446 int num_reg = 0;
9447
9448 /* If this is not a fixed size move, just call memcpy */
9449 if (! constp)
9450 return 0;
9451
9452 /* This must be a fixed size alignment */
9453 gcc_assert (GET_CODE (align_rtx) == CONST_INT);
9454 align = INTVAL (align_rtx) * BITS_PER_UNIT;
9455
9456 /* Anything to move? */
9457 bytes = INTVAL (bytes_rtx);
9458 if (bytes <= 0)
9459 return 1;
9460
9461 /* store_one_arg depends on expand_block_move to handle at least the size of
9462 reg_parm_stack_space. */
9463 if (bytes > (TARGET_POWERPC64 ? 64 : 32))
9464 return 0;
9465
9466 for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
9467 {
9468 union {
9469 rtx (*movmemsi) (rtx, rtx, rtx, rtx);
9470 rtx (*mov) (rtx, rtx);
9471 } gen_func;
9472 enum machine_mode mode = BLKmode;
9473 rtx src, dest;
9474
9475 /* Altivec first, since it will be faster than a string move
9476 when it applies, and usually not significantly larger. */
9477 if (TARGET_ALTIVEC && bytes >= 16 && align >= 128)
9478 {
9479 move_bytes = 16;
9480 mode = V4SImode;
9481 gen_func.mov = gen_movv4si;
9482 }
9483 else if (TARGET_STRING
9484 && bytes > 24 /* move up to 32 bytes at a time */
9485 && ! fixed_regs[5]
9486 && ! fixed_regs[6]
9487 && ! fixed_regs[7]
9488 && ! fixed_regs[8]
9489 && ! fixed_regs[9]
9490 && ! fixed_regs[10]
9491 && ! fixed_regs[11]
9492 && ! fixed_regs[12])
9493 {
9494 move_bytes = (bytes > 32) ? 32 : bytes;
9495 gen_func.movmemsi = gen_movmemsi_8reg;
9496 }
9497 else if (TARGET_STRING
9498 && bytes > 16 /* move up to 24 bytes at a time */
9499 && ! fixed_regs[5]
9500 && ! fixed_regs[6]
9501 && ! fixed_regs[7]
9502 && ! fixed_regs[8]
9503 && ! fixed_regs[9]
9504 && ! fixed_regs[10])
9505 {
9506 move_bytes = (bytes > 24) ? 24 : bytes;
9507 gen_func.movmemsi = gen_movmemsi_6reg;
9508 }
9509 else if (TARGET_STRING
9510 && bytes > 8 /* move up to 16 bytes at a time */
9511 && ! fixed_regs[5]
9512 && ! fixed_regs[6]
9513 && ! fixed_regs[7]
9514 && ! fixed_regs[8])
9515 {
9516 move_bytes = (bytes > 16) ? 16 : bytes;
9517 gen_func.movmemsi = gen_movmemsi_4reg;
9518 }
9519 else if (bytes >= 8 && TARGET_POWERPC64
9520 /* 64-bit loads and stores require word-aligned
9521 displacements. */
9522 && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
9523 {
9524 move_bytes = 8;
9525 mode = DImode;
9526 gen_func.mov = gen_movdi;
9527 }
9528 else if (TARGET_STRING && bytes > 4 && !TARGET_POWERPC64)
9529 { /* move up to 8 bytes at a time */
9530 move_bytes = (bytes > 8) ? 8 : bytes;
9531 gen_func.movmemsi = gen_movmemsi_2reg;
9532 }
9533 else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
9534 { /* move 4 bytes */
9535 move_bytes = 4;
9536 mode = SImode;
9537 gen_func.mov = gen_movsi;
9538 }
9539 else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
9540 { /* move 2 bytes */
9541 move_bytes = 2;
9542 mode = HImode;
9543 gen_func.mov = gen_movhi;
9544 }
9545 else if (TARGET_STRING && bytes > 1)
9546 { /* move up to 4 bytes at a time */
9547 move_bytes = (bytes > 4) ? 4 : bytes;
9548 gen_func.movmemsi = gen_movmemsi_1reg;
9549 }
9550 else /* move 1 byte at a time */
9551 {
9552 move_bytes = 1;
9553 mode = QImode;
9554 gen_func.mov = gen_movqi;
9555 }
9556
9557 src = adjust_address (orig_src, mode, offset);
9558 dest = adjust_address (orig_dest, mode, offset);
9559
9560 if (mode != BLKmode)
9561 {
9562 rtx tmp_reg = gen_reg_rtx (mode);
9563
9564 emit_insn ((*gen_func.mov) (tmp_reg, src));
9565 stores[num_reg++] = (*gen_func.mov) (dest, tmp_reg);
9566 }
9567
9568 if (mode == BLKmode || num_reg >= MAX_MOVE_REG || bytes == move_bytes)
9569 {
9570 int i;
9571 for (i = 0; i < num_reg; i++)
9572 emit_insn (stores[i]);
9573 num_reg = 0;
9574 }
9575
9576 if (mode == BLKmode)
9577 {
9578 /* Move the address into scratch registers. The movmemsi
9579 patterns require zero offset. */
9580 if (!REG_P (XEXP (src, 0)))
9581 {
9582 rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
9583 src = replace_equiv_address (src, src_reg);
9584 }
9585 set_mem_size (src, GEN_INT (move_bytes));
9586
9587 if (!REG_P (XEXP (dest, 0)))
9588 {
9589 rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
9590 dest = replace_equiv_address (dest, dest_reg);
9591 }
9592 set_mem_size (dest, GEN_INT (move_bytes));
9593
9594 emit_insn ((*gen_func.movmemsi) (dest, src,
9595 GEN_INT (move_bytes & 31),
9596 align_rtx));
9597 }
9598 }
9599
9600 return 1;
9601 }
9602
9603
9604 /* Return a string to perform a load_multiple operation.
9605 operands[0] is the vector.
9606 operands[1] is the source address.
9607 operands[2] is the first destination register. */
9608
9609 const char *
rs6000_output_load_multiple(rtx operands[3])9610 rs6000_output_load_multiple (rtx operands[3])
9611 {
9612 /* We have to handle the case where the pseudo used to contain the address
9613 is assigned to one of the output registers. */
9614 int i, j;
9615 int words = XVECLEN (operands[0], 0);
9616 rtx xop[10];
9617
9618 if (XVECLEN (operands[0], 0) == 1)
9619 return "{l|lwz} %2,0(%1)";
9620
9621 for (i = 0; i < words; i++)
9622 if (refers_to_regno_p (REGNO (operands[2]) + i,
9623 REGNO (operands[2]) + i + 1, operands[1], 0))
9624 {
9625 if (i == words-1)
9626 {
9627 xop[0] = GEN_INT (4 * (words-1));
9628 xop[1] = operands[1];
9629 xop[2] = operands[2];
9630 output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
9631 return "";
9632 }
9633 else if (i == 0)
9634 {
9635 xop[0] = GEN_INT (4 * (words-1));
9636 xop[1] = operands[1];
9637 xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
9638 output_asm_insn ("{cal %1,4(%1)|addi %1,%1,4}\n\t{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,-4(%1)", xop);
9639 return "";
9640 }
9641 else
9642 {
9643 for (j = 0; j < words; j++)
9644 if (j != i)
9645 {
9646 xop[0] = GEN_INT (j * 4);
9647 xop[1] = operands[1];
9648 xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
9649 output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
9650 }
9651 xop[0] = GEN_INT (i * 4);
9652 xop[1] = operands[1];
9653 output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
9654 return "";
9655 }
9656 }
9657
9658 return "{lsi|lswi} %2,%1,%N0";
9659 }
9660
9661
9662 /* A validation routine: say whether CODE, a condition code, and MODE
9663 match. The other alternatives either don't make sense or should
9664 never be generated. */
9665
9666 void
validate_condition_mode(enum rtx_code code,enum machine_mode mode)9667 validate_condition_mode (enum rtx_code code, enum machine_mode mode)
9668 {
9669 gcc_assert ((GET_RTX_CLASS (code) == RTX_COMPARE
9670 || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
9671 && GET_MODE_CLASS (mode) == MODE_CC);
9672
9673 /* These don't make sense. */
9674 gcc_assert ((code != GT && code != LT && code != GE && code != LE)
9675 || mode != CCUNSmode);
9676
9677 gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU)
9678 || mode == CCUNSmode);
9679
9680 gcc_assert (mode == CCFPmode
9681 || (code != ORDERED && code != UNORDERED
9682 && code != UNEQ && code != LTGT
9683 && code != UNGT && code != UNLT
9684 && code != UNGE && code != UNLE));
9685
9686 /* These should never be generated except for
9687 flag_finite_math_only. */
9688 gcc_assert (mode != CCFPmode
9689 || flag_finite_math_only
9690 || (code != LE && code != GE
9691 && code != UNEQ && code != LTGT
9692 && code != UNGT && code != UNLT));
9693
9694 /* These are invalid; the information is not there. */
9695 gcc_assert (mode != CCEQmode || code == EQ || code == NE);
9696 }
9697
9698
9699 /* Return 1 if ANDOP is a mask that has no bits on that are not in the
9700 mask required to convert the result of a rotate insn into a shift
9701 left insn of SHIFTOP bits. Both are known to be SImode CONST_INT. */
9702
9703 int
includes_lshift_p(rtx shiftop,rtx andop)9704 includes_lshift_p (rtx shiftop, rtx andop)
9705 {
9706 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
9707
9708 shift_mask <<= INTVAL (shiftop);
9709
9710 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
9711 }
9712
9713 /* Similar, but for right shift. */
9714
9715 int
includes_rshift_p(rtx shiftop,rtx andop)9716 includes_rshift_p (rtx shiftop, rtx andop)
9717 {
9718 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
9719
9720 shift_mask >>= INTVAL (shiftop);
9721
9722 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
9723 }
9724
9725 /* Return 1 if ANDOP is a mask suitable for use with an rldic insn
9726 to perform a left shift. It must have exactly SHIFTOP least
9727 significant 0's, then one or more 1's, then zero or more 0's. */
9728
9729 int
includes_rldic_lshift_p(rtx shiftop,rtx andop)9730 includes_rldic_lshift_p (rtx shiftop, rtx andop)
9731 {
9732 if (GET_CODE (andop) == CONST_INT)
9733 {
9734 HOST_WIDE_INT c, lsb, shift_mask;
9735
9736 c = INTVAL (andop);
9737 if (c == 0 || c == ~0)
9738 return 0;
9739
9740 shift_mask = ~0;
9741 shift_mask <<= INTVAL (shiftop);
9742
9743 /* Find the least significant one bit. */
9744 lsb = c & -c;
9745
9746 /* It must coincide with the LSB of the shift mask. */
9747 if (-lsb != shift_mask)
9748 return 0;
9749
9750 /* Invert to look for the next transition (if any). */
9751 c = ~c;
9752
9753 /* Remove the low group of ones (originally low group of zeros). */
9754 c &= -lsb;
9755
9756 /* Again find the lsb, and check we have all 1's above. */
9757 lsb = c & -c;
9758 return c == -lsb;
9759 }
9760 else if (GET_CODE (andop) == CONST_DOUBLE
9761 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
9762 {
9763 HOST_WIDE_INT low, high, lsb;
9764 HOST_WIDE_INT shift_mask_low, shift_mask_high;
9765
9766 low = CONST_DOUBLE_LOW (andop);
9767 if (HOST_BITS_PER_WIDE_INT < 64)
9768 high = CONST_DOUBLE_HIGH (andop);
9769
9770 if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
9771 || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
9772 return 0;
9773
9774 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
9775 {
9776 shift_mask_high = ~0;
9777 if (INTVAL (shiftop) > 32)
9778 shift_mask_high <<= INTVAL (shiftop) - 32;
9779
9780 lsb = high & -high;
9781
9782 if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
9783 return 0;
9784
9785 high = ~high;
9786 high &= -lsb;
9787
9788 lsb = high & -high;
9789 return high == -lsb;
9790 }
9791
9792 shift_mask_low = ~0;
9793 shift_mask_low <<= INTVAL (shiftop);
9794
9795 lsb = low & -low;
9796
9797 if (-lsb != shift_mask_low)
9798 return 0;
9799
9800 if (HOST_BITS_PER_WIDE_INT < 64)
9801 high = ~high;
9802 low = ~low;
9803 low &= -lsb;
9804
9805 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
9806 {
9807 lsb = high & -high;
9808 return high == -lsb;
9809 }
9810
9811 lsb = low & -low;
9812 return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
9813 }
9814 else
9815 return 0;
9816 }
9817
9818 /* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
9819 to perform a left shift. It must have SHIFTOP or more least
9820 significant 0's, with the remainder of the word 1's. */
9821
9822 int
includes_rldicr_lshift_p(rtx shiftop,rtx andop)9823 includes_rldicr_lshift_p (rtx shiftop, rtx andop)
9824 {
9825 if (GET_CODE (andop) == CONST_INT)
9826 {
9827 HOST_WIDE_INT c, lsb, shift_mask;
9828
9829 shift_mask = ~0;
9830 shift_mask <<= INTVAL (shiftop);
9831 c = INTVAL (andop);
9832
9833 /* Find the least significant one bit. */
9834 lsb = c & -c;
9835
9836 /* It must be covered by the shift mask.
9837 This test also rejects c == 0. */
9838 if ((lsb & shift_mask) == 0)
9839 return 0;
9840
9841 /* Check we have all 1's above the transition, and reject all 1's. */
9842 return c == -lsb && lsb != 1;
9843 }
9844 else if (GET_CODE (andop) == CONST_DOUBLE
9845 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
9846 {
9847 HOST_WIDE_INT low, lsb, shift_mask_low;
9848
9849 low = CONST_DOUBLE_LOW (andop);
9850
9851 if (HOST_BITS_PER_WIDE_INT < 64)
9852 {
9853 HOST_WIDE_INT high, shift_mask_high;
9854
9855 high = CONST_DOUBLE_HIGH (andop);
9856
9857 if (low == 0)
9858 {
9859 shift_mask_high = ~0;
9860 if (INTVAL (shiftop) > 32)
9861 shift_mask_high <<= INTVAL (shiftop) - 32;
9862
9863 lsb = high & -high;
9864
9865 if ((lsb & shift_mask_high) == 0)
9866 return 0;
9867
9868 return high == -lsb;
9869 }
9870 if (high != ~0)
9871 return 0;
9872 }
9873
9874 shift_mask_low = ~0;
9875 shift_mask_low <<= INTVAL (shiftop);
9876
9877 lsb = low & -low;
9878
9879 if ((lsb & shift_mask_low) == 0)
9880 return 0;
9881
9882 return low == -lsb && lsb != 1;
9883 }
9884 else
9885 return 0;
9886 }
9887
9888 /* Return 1 if operands will generate a valid arguments to rlwimi
9889 instruction for insert with right shift in 64-bit mode. The mask may
9890 not start on the first bit or stop on the last bit because wrap-around
9891 effects of instruction do not correspond to semantics of RTL insn. */
9892
9893 int
insvdi_rshift_rlwimi_p(rtx sizeop,rtx startop,rtx shiftop)9894 insvdi_rshift_rlwimi_p (rtx sizeop, rtx startop, rtx shiftop)
9895 {
9896 if (INTVAL (startop) > 32
9897 && INTVAL (startop) < 64
9898 && INTVAL (sizeop) > 1
9899 && INTVAL (sizeop) + INTVAL (startop) < 64
9900 && INTVAL (shiftop) > 0
9901 && INTVAL (sizeop) + INTVAL (shiftop) < 32
9902 && (64 - (INTVAL (shiftop) & 63)) >= INTVAL (sizeop))
9903 return 1;
9904
9905 return 0;
9906 }
9907
9908 /* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
9909 for lfq and stfq insns iff the registers are hard registers. */
9910
9911 int
registers_ok_for_quad_peep(rtx reg1,rtx reg2)9912 registers_ok_for_quad_peep (rtx reg1, rtx reg2)
9913 {
9914 /* We might have been passed a SUBREG. */
9915 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
9916 return 0;
9917
9918 /* We might have been passed non floating point registers. */
9919 if (!FP_REGNO_P (REGNO (reg1))
9920 || !FP_REGNO_P (REGNO (reg2)))
9921 return 0;
9922
9923 return (REGNO (reg1) == REGNO (reg2) - 1);
9924 }
9925
9926 /* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
9927 addr1 and addr2 must be in consecutive memory locations
9928 (addr2 == addr1 + 8). */
9929
9930 int
mems_ok_for_quad_peep(rtx mem1,rtx mem2)9931 mems_ok_for_quad_peep (rtx mem1, rtx mem2)
9932 {
9933 rtx addr1, addr2;
9934 unsigned int reg1, reg2;
9935 int offset1, offset2;
9936
9937 /* The mems cannot be volatile. */
9938 if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
9939 return 0;
9940
9941 addr1 = XEXP (mem1, 0);
9942 addr2 = XEXP (mem2, 0);
9943
9944 /* Extract an offset (if used) from the first addr. */
9945 if (GET_CODE (addr1) == PLUS)
9946 {
9947 /* If not a REG, return zero. */
9948 if (GET_CODE (XEXP (addr1, 0)) != REG)
9949 return 0;
9950 else
9951 {
9952 reg1 = REGNO (XEXP (addr1, 0));
9953 /* The offset must be constant! */
9954 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
9955 return 0;
9956 offset1 = INTVAL (XEXP (addr1, 1));
9957 }
9958 }
9959 else if (GET_CODE (addr1) != REG)
9960 return 0;
9961 else
9962 {
9963 reg1 = REGNO (addr1);
9964 /* This was a simple (mem (reg)) expression. Offset is 0. */
9965 offset1 = 0;
9966 }
9967
9968 /* And now for the second addr. */
9969 if (GET_CODE (addr2) == PLUS)
9970 {
9971 /* If not a REG, return zero. */
9972 if (GET_CODE (XEXP (addr2, 0)) != REG)
9973 return 0;
9974 else
9975 {
9976 reg2 = REGNO (XEXP (addr2, 0));
9977 /* The offset must be constant. */
9978 if (GET_CODE (XEXP (addr2, 1)) != CONST_INT)
9979 return 0;
9980 offset2 = INTVAL (XEXP (addr2, 1));
9981 }
9982 }
9983 else if (GET_CODE (addr2) != REG)
9984 return 0;
9985 else
9986 {
9987 reg2 = REGNO (addr2);
9988 /* This was a simple (mem (reg)) expression. Offset is 0. */
9989 offset2 = 0;
9990 }
9991
9992 /* Both of these must have the same base register. */
9993 if (reg1 != reg2)
9994 return 0;
9995
9996 /* The offset for the second addr must be 8 more than the first addr. */
9997 if (offset2 != offset1 + 8)
9998 return 0;
9999
10000 /* All the tests passed. addr1 and addr2 are valid for lfq or stfq
10001 instructions. */
10002 return 1;
10003 }
10004
10005 /* Return the register class of a scratch register needed to copy IN into
10006 or out of a register in CLASS in MODE. If it can be done directly,
10007 NO_REGS is returned. */
10008
10009 enum reg_class
rs6000_secondary_reload_class(enum reg_class class,enum machine_mode mode ATTRIBUTE_UNUSED,rtx in)10010 rs6000_secondary_reload_class (enum reg_class class,
10011 enum machine_mode mode ATTRIBUTE_UNUSED,
10012 rtx in)
10013 {
10014 int regno;
10015
10016 if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
10017 #if TARGET_MACHO
10018 && MACHOPIC_INDIRECT
10019 #endif
10020 ))
10021 {
10022 /* We cannot copy a symbolic operand directly into anything
10023 other than BASE_REGS for TARGET_ELF. So indicate that a
10024 register from BASE_REGS is needed as an intermediate
10025 register.
10026
10027 On Darwin, pic addresses require a load from memory, which
10028 needs a base register. */
10029 if (class != BASE_REGS
10030 && (GET_CODE (in) == SYMBOL_REF
10031 || GET_CODE (in) == HIGH
10032 || GET_CODE (in) == LABEL_REF
10033 || GET_CODE (in) == CONST))
10034 return BASE_REGS;
10035 }
10036
10037 if (GET_CODE (in) == REG)
10038 {
10039 regno = REGNO (in);
10040 if (regno >= FIRST_PSEUDO_REGISTER)
10041 {
10042 regno = true_regnum (in);
10043 if (regno >= FIRST_PSEUDO_REGISTER)
10044 regno = -1;
10045 }
10046 }
10047 else if (GET_CODE (in) == SUBREG)
10048 {
10049 regno = true_regnum (in);
10050 if (regno >= FIRST_PSEUDO_REGISTER)
10051 regno = -1;
10052 }
10053 else
10054 regno = -1;
10055
10056 /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
10057 into anything. */
10058 if (class == GENERAL_REGS || class == BASE_REGS
10059 || (regno >= 0 && INT_REGNO_P (regno)))
10060 return NO_REGS;
10061
10062 /* Constants, memory, and FP registers can go into FP registers. */
10063 if ((regno == -1 || FP_REGNO_P (regno))
10064 && (class == FLOAT_REGS || class == NON_SPECIAL_REGS))
10065 return NO_REGS;
10066
10067 /* Memory, and AltiVec registers can go into AltiVec registers. */
10068 if ((regno == -1 || ALTIVEC_REGNO_P (regno))
10069 && class == ALTIVEC_REGS)
10070 return NO_REGS;
10071
10072 /* We can copy among the CR registers. */
10073 if ((class == CR_REGS || class == CR0_REGS)
10074 && regno >= 0 && CR_REGNO_P (regno))
10075 return NO_REGS;
10076
10077 /* Otherwise, we need GENERAL_REGS. */
10078 return GENERAL_REGS;
10079 }
10080
10081 /* Given a comparison operation, return the bit number in CCR to test. We
10082 know this is a valid comparison.
10083
10084 SCC_P is 1 if this is for an scc. That means that %D will have been
10085 used instead of %C, so the bits will be in different places.
10086
10087 Return -1 if OP isn't a valid comparison for some reason. */
10088
10089 int
ccr_bit(rtx op,int scc_p)10090 ccr_bit (rtx op, int scc_p)
10091 {
10092 enum rtx_code code = GET_CODE (op);
10093 enum machine_mode cc_mode;
10094 int cc_regnum;
10095 int base_bit;
10096 rtx reg;
10097
10098 if (!COMPARISON_P (op))
10099 return -1;
10100
10101 reg = XEXP (op, 0);
10102
10103 gcc_assert (GET_CODE (reg) == REG && CR_REGNO_P (REGNO (reg)));
10104
10105 cc_mode = GET_MODE (reg);
10106 cc_regnum = REGNO (reg);
10107 base_bit = 4 * (cc_regnum - CR0_REGNO);
10108
10109 validate_condition_mode (code, cc_mode);
10110
10111 /* When generating a sCOND operation, only positive conditions are
10112 allowed. */
10113 gcc_assert (!scc_p
10114 || code == EQ || code == GT || code == LT || code == UNORDERED
10115 || code == GTU || code == LTU);
10116
10117 switch (code)
10118 {
10119 case NE:
10120 return scc_p ? base_bit + 3 : base_bit + 2;
10121 case EQ:
10122 return base_bit + 2;
10123 case GT: case GTU: case UNLE:
10124 return base_bit + 1;
10125 case LT: case LTU: case UNGE:
10126 return base_bit;
10127 case ORDERED: case UNORDERED:
10128 return base_bit + 3;
10129
10130 case GE: case GEU:
10131 /* If scc, we will have done a cror to put the bit in the
10132 unordered position. So test that bit. For integer, this is ! LT
10133 unless this is an scc insn. */
10134 return scc_p ? base_bit + 3 : base_bit;
10135
10136 case LE: case LEU:
10137 return scc_p ? base_bit + 3 : base_bit + 1;
10138
10139 default:
10140 gcc_unreachable ();
10141 }
10142 }
10143
10144 /* Return the GOT register. */
10145
10146 rtx
rs6000_got_register(rtx value ATTRIBUTE_UNUSED)10147 rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
10148 {
10149 /* The second flow pass currently (June 1999) can't update
10150 regs_ever_live without disturbing other parts of the compiler, so
10151 update it here to make the prolog/epilogue code happy. */
10152 if (no_new_pseudos && ! regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM])
10153 regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
10154
10155 current_function_uses_pic_offset_table = 1;
10156
10157 return pic_offset_table_rtx;
10158 }
10159
10160 /* Function to init struct machine_function.
10161 This will be called, via a pointer variable,
10162 from push_function_context. */
10163
10164 static struct machine_function *
rs6000_init_machine_status(void)10165 rs6000_init_machine_status (void)
10166 {
10167 return ggc_alloc_cleared (sizeof (machine_function));
10168 }
10169
10170 /* These macros test for integers and extract the low-order bits. */
10171 #define INT_P(X) \
10172 ((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE) \
10173 && GET_MODE (X) == VOIDmode)
10174
10175 #define INT_LOWPART(X) \
10176 (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
10177
10178 int
extract_MB(rtx op)10179 extract_MB (rtx op)
10180 {
10181 int i;
10182 unsigned long val = INT_LOWPART (op);
10183
10184 /* If the high bit is zero, the value is the first 1 bit we find
10185 from the left. */
10186 if ((val & 0x80000000) == 0)
10187 {
10188 gcc_assert (val & 0xffffffff);
10189
10190 i = 1;
10191 while (((val <<= 1) & 0x80000000) == 0)
10192 ++i;
10193 return i;
10194 }
10195
10196 /* If the high bit is set and the low bit is not, or the mask is all
10197 1's, the value is zero. */
10198 if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
10199 return 0;
10200
10201 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
10202 from the right. */
10203 i = 31;
10204 while (((val >>= 1) & 1) != 0)
10205 --i;
10206
10207 return i;
10208 }
10209
10210 int
extract_ME(rtx op)10211 extract_ME (rtx op)
10212 {
10213 int i;
10214 unsigned long val = INT_LOWPART (op);
10215
10216 /* If the low bit is zero, the value is the first 1 bit we find from
10217 the right. */
10218 if ((val & 1) == 0)
10219 {
10220 gcc_assert (val & 0xffffffff);
10221
10222 i = 30;
10223 while (((val >>= 1) & 1) == 0)
10224 --i;
10225
10226 return i;
10227 }
10228
10229 /* If the low bit is set and the high bit is not, or the mask is all
10230 1's, the value is 31. */
10231 if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
10232 return 31;
10233
10234 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
10235 from the left. */
10236 i = 0;
10237 while (((val <<= 1) & 0x80000000) != 0)
10238 ++i;
10239
10240 return i;
10241 }
10242
10243 /* Locate some local-dynamic symbol still in use by this function
10244 so that we can print its name in some tls_ld pattern. */
10245
10246 static const char *
rs6000_get_some_local_dynamic_name(void)10247 rs6000_get_some_local_dynamic_name (void)
10248 {
10249 rtx insn;
10250
10251 if (cfun->machine->some_ld_name)
10252 return cfun->machine->some_ld_name;
10253
10254 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
10255 if (INSN_P (insn)
10256 && for_each_rtx (&PATTERN (insn),
10257 rs6000_get_some_local_dynamic_name_1, 0))
10258 return cfun->machine->some_ld_name;
10259
10260 gcc_unreachable ();
10261 }
10262
10263 /* Helper function for rs6000_get_some_local_dynamic_name. */
10264
10265 static int
rs6000_get_some_local_dynamic_name_1(rtx * px,void * data ATTRIBUTE_UNUSED)10266 rs6000_get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
10267 {
10268 rtx x = *px;
10269
10270 if (GET_CODE (x) == SYMBOL_REF)
10271 {
10272 const char *str = XSTR (x, 0);
10273 if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
10274 {
10275 cfun->machine->some_ld_name = str;
10276 return 1;
10277 }
10278 }
10279
10280 return 0;
10281 }
10282
10283 /* Write out a function code label. */
10284
10285 void
rs6000_output_function_entry(FILE * file,const char * fname)10286 rs6000_output_function_entry (FILE *file, const char *fname)
10287 {
10288 if (fname[0] != '.')
10289 {
10290 switch (DEFAULT_ABI)
10291 {
10292 default:
10293 gcc_unreachable ();
10294
10295 case ABI_AIX:
10296 if (DOT_SYMBOLS)
10297 putc ('.', file);
10298 else
10299 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
10300 break;
10301
10302 case ABI_V4:
10303 case ABI_DARWIN:
10304 break;
10305 }
10306 }
10307 if (TARGET_AIX)
10308 RS6000_OUTPUT_BASENAME (file, fname);
10309 else
10310 assemble_name (file, fname);
10311 }
10312
10313 /* Print an operand. Recognize special options, documented below. */
10314
10315 #if TARGET_ELF
10316 #define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
10317 #define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
10318 #else
10319 #define SMALL_DATA_RELOC "sda21"
10320 #define SMALL_DATA_REG 0
10321 #endif
10322
10323 void
print_operand(FILE * file,rtx x,int code)10324 print_operand (FILE *file, rtx x, int code)
10325 {
10326 int i;
10327 HOST_WIDE_INT val;
10328 unsigned HOST_WIDE_INT uval;
10329
10330 switch (code)
10331 {
10332 case '.':
10333 /* Write out an instruction after the call which may be replaced
10334 with glue code by the loader. This depends on the AIX version. */
10335 asm_fprintf (file, RS6000_CALL_GLUE);
10336 return;
10337
10338 /* %a is output_address. */
10339
10340 case 'A':
10341 /* If X is a constant integer whose low-order 5 bits are zero,
10342 write 'l'. Otherwise, write 'r'. This is a kludge to fix a bug
10343 in the AIX assembler where "sri" with a zero shift count
10344 writes a trash instruction. */
10345 if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
10346 putc ('l', file);
10347 else
10348 putc ('r', file);
10349 return;
10350
10351 case 'b':
10352 /* If constant, low-order 16 bits of constant, unsigned.
10353 Otherwise, write normally. */
10354 if (INT_P (x))
10355 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
10356 else
10357 print_operand (file, x, 0);
10358 return;
10359
10360 case 'B':
10361 /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
10362 for 64-bit mask direction. */
10363 putc (((INT_LOWPART (x) & 1) == 0 ? 'r' : 'l'), file);
10364 return;
10365
10366 /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
10367 output_operand. */
10368
10369 case 'c':
10370 /* X is a CR register. Print the number of the GT bit of the CR. */
10371 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
10372 output_operand_lossage ("invalid %%E value");
10373 else
10374 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 1);
10375 return;
10376
10377 case 'D':
10378 /* Like 'J' but get to the GT bit only. */
10379 gcc_assert (GET_CODE (x) == REG);
10380
10381 /* Bit 1 is GT bit. */
10382 i = 4 * (REGNO (x) - CR0_REGNO) + 1;
10383
10384 /* Add one for shift count in rlinm for scc. */
10385 fprintf (file, "%d", i + 1);
10386 return;
10387
10388 case 'E':
10389 /* X is a CR register. Print the number of the EQ bit of the CR */
10390 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
10391 output_operand_lossage ("invalid %%E value");
10392 else
10393 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
10394 return;
10395
10396 case 'f':
10397 /* X is a CR register. Print the shift count needed to move it
10398 to the high-order four bits. */
10399 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
10400 output_operand_lossage ("invalid %%f value");
10401 else
10402 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
10403 return;
10404
10405 case 'F':
10406 /* Similar, but print the count for the rotate in the opposite
10407 direction. */
10408 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
10409 output_operand_lossage ("invalid %%F value");
10410 else
10411 fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
10412 return;
10413
10414 case 'G':
10415 /* X is a constant integer. If it is negative, print "m",
10416 otherwise print "z". This is to make an aze or ame insn. */
10417 if (GET_CODE (x) != CONST_INT)
10418 output_operand_lossage ("invalid %%G value");
10419 else if (INTVAL (x) >= 0)
10420 putc ('z', file);
10421 else
10422 putc ('m', file);
10423 return;
10424
10425 case 'h':
10426 /* If constant, output low-order five bits. Otherwise, write
10427 normally. */
10428 if (INT_P (x))
10429 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
10430 else
10431 print_operand (file, x, 0);
10432 return;
10433
10434 case 'H':
10435 /* If constant, output low-order six bits. Otherwise, write
10436 normally. */
10437 if (INT_P (x))
10438 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
10439 else
10440 print_operand (file, x, 0);
10441 return;
10442
10443 case 'I':
10444 /* Print `i' if this is a constant, else nothing. */
10445 if (INT_P (x))
10446 putc ('i', file);
10447 return;
10448
10449 case 'j':
10450 /* Write the bit number in CCR for jump. */
10451 i = ccr_bit (x, 0);
10452 if (i == -1)
10453 output_operand_lossage ("invalid %%j code");
10454 else
10455 fprintf (file, "%d", i);
10456 return;
10457
10458 case 'J':
10459 /* Similar, but add one for shift count in rlinm for scc and pass
10460 scc flag to `ccr_bit'. */
10461 i = ccr_bit (x, 1);
10462 if (i == -1)
10463 output_operand_lossage ("invalid %%J code");
10464 else
10465 /* If we want bit 31, write a shift count of zero, not 32. */
10466 fprintf (file, "%d", i == 31 ? 0 : i + 1);
10467 return;
10468
10469 case 'k':
10470 /* X must be a constant. Write the 1's complement of the
10471 constant. */
10472 if (! INT_P (x))
10473 output_operand_lossage ("invalid %%k value");
10474 else
10475 fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
10476 return;
10477
10478 case 'K':
10479 /* X must be a symbolic constant on ELF. Write an
10480 expression suitable for an 'addi' that adds in the low 16
10481 bits of the MEM. */
10482 if (GET_CODE (x) != CONST)
10483 {
10484 print_operand_address (file, x);
10485 fputs ("@l", file);
10486 }
10487 else
10488 {
10489 if (GET_CODE (XEXP (x, 0)) != PLUS
10490 || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
10491 && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
10492 || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
10493 output_operand_lossage ("invalid %%K value");
10494 print_operand_address (file, XEXP (XEXP (x, 0), 0));
10495 fputs ("@l", file);
10496 /* For GNU as, there must be a non-alphanumeric character
10497 between 'l' and the number. The '-' is added by
10498 print_operand() already. */
10499 if (INTVAL (XEXP (XEXP (x, 0), 1)) >= 0)
10500 fputs ("+", file);
10501 print_operand (file, XEXP (XEXP (x, 0), 1), 0);
10502 }
10503 return;
10504
10505 /* %l is output_asm_label. */
10506
10507 case 'L':
10508 /* Write second word of DImode or DFmode reference. Works on register
10509 or non-indexed memory only. */
10510 if (GET_CODE (x) == REG)
10511 fputs (reg_names[REGNO (x) + 1], file);
10512 else if (GET_CODE (x) == MEM)
10513 {
10514 /* Handle possible auto-increment. Since it is pre-increment and
10515 we have already done it, we can just use an offset of word. */
10516 if (GET_CODE (XEXP (x, 0)) == PRE_INC
10517 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
10518 output_address (plus_constant (XEXP (XEXP (x, 0), 0),
10519 UNITS_PER_WORD));
10520 else
10521 output_address (XEXP (adjust_address_nv (x, SImode,
10522 UNITS_PER_WORD),
10523 0));
10524
10525 if (small_data_operand (x, GET_MODE (x)))
10526 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10527 reg_names[SMALL_DATA_REG]);
10528 }
10529 return;
10530
10531 case 'm':
10532 /* MB value for a mask operand. */
10533 if (! mask_operand (x, SImode))
10534 output_operand_lossage ("invalid %%m value");
10535
10536 fprintf (file, "%d", extract_MB (x));
10537 return;
10538
10539 case 'M':
10540 /* ME value for a mask operand. */
10541 if (! mask_operand (x, SImode))
10542 output_operand_lossage ("invalid %%M value");
10543
10544 fprintf (file, "%d", extract_ME (x));
10545 return;
10546
10547 /* %n outputs the negative of its operand. */
10548
10549 case 'N':
10550 /* Write the number of elements in the vector times 4. */
10551 if (GET_CODE (x) != PARALLEL)
10552 output_operand_lossage ("invalid %%N value");
10553 else
10554 fprintf (file, "%d", XVECLEN (x, 0) * 4);
10555 return;
10556
10557 case 'O':
10558 /* Similar, but subtract 1 first. */
10559 if (GET_CODE (x) != PARALLEL)
10560 output_operand_lossage ("invalid %%O value");
10561 else
10562 fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
10563 return;
10564
10565 case 'p':
10566 /* X is a CONST_INT that is a power of two. Output the logarithm. */
10567 if (! INT_P (x)
10568 || INT_LOWPART (x) < 0
10569 || (i = exact_log2 (INT_LOWPART (x))) < 0)
10570 output_operand_lossage ("invalid %%p value");
10571 else
10572 fprintf (file, "%d", i);
10573 return;
10574
10575 case 'P':
10576 /* The operand must be an indirect memory reference. The result
10577 is the register name. */
10578 if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
10579 || REGNO (XEXP (x, 0)) >= 32)
10580 output_operand_lossage ("invalid %%P value");
10581 else
10582 fputs (reg_names[REGNO (XEXP (x, 0))], file);
10583 return;
10584
10585 case 'q':
10586 /* This outputs the logical code corresponding to a boolean
10587 expression. The expression may have one or both operands
10588 negated (if one, only the first one). For condition register
10589 logical operations, it will also treat the negated
10590 CR codes as NOTs, but not handle NOTs of them. */
10591 {
10592 const char *const *t = 0;
10593 const char *s;
10594 enum rtx_code code = GET_CODE (x);
10595 static const char * const tbl[3][3] = {
10596 { "and", "andc", "nor" },
10597 { "or", "orc", "nand" },
10598 { "xor", "eqv", "xor" } };
10599
10600 if (code == AND)
10601 t = tbl[0];
10602 else if (code == IOR)
10603 t = tbl[1];
10604 else if (code == XOR)
10605 t = tbl[2];
10606 else
10607 output_operand_lossage ("invalid %%q value");
10608
10609 if (GET_CODE (XEXP (x, 0)) != NOT)
10610 s = t[0];
10611 else
10612 {
10613 if (GET_CODE (XEXP (x, 1)) == NOT)
10614 s = t[2];
10615 else
10616 s = t[1];
10617 }
10618
10619 fputs (s, file);
10620 }
10621 return;
10622
10623 case 'Q':
10624 if (TARGET_MFCRF)
10625 fputc (',', file);
10626 /* FALLTHRU */
10627 else
10628 return;
10629
10630 case 'R':
10631 /* X is a CR register. Print the mask for `mtcrf'. */
10632 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
10633 output_operand_lossage ("invalid %%R value");
10634 else
10635 fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
10636 return;
10637
10638 case 's':
10639 /* Low 5 bits of 32 - value */
10640 if (! INT_P (x))
10641 output_operand_lossage ("invalid %%s value");
10642 else
10643 fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
10644 return;
10645
10646 case 'S':
10647 /* PowerPC64 mask position. All 0's is excluded.
10648 CONST_INT 32-bit mask is considered sign-extended so any
10649 transition must occur within the CONST_INT, not on the boundary. */
10650 if (! mask64_operand (x, DImode))
10651 output_operand_lossage ("invalid %%S value");
10652
10653 uval = INT_LOWPART (x);
10654
10655 if (uval & 1) /* Clear Left */
10656 {
10657 #if HOST_BITS_PER_WIDE_INT > 64
10658 uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
10659 #endif
10660 i = 64;
10661 }
10662 else /* Clear Right */
10663 {
10664 uval = ~uval;
10665 #if HOST_BITS_PER_WIDE_INT > 64
10666 uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
10667 #endif
10668 i = 63;
10669 }
10670 while (uval != 0)
10671 --i, uval >>= 1;
10672 gcc_assert (i >= 0);
10673 fprintf (file, "%d", i);
10674 return;
10675
10676 case 't':
10677 /* Like 'J' but get to the OVERFLOW/UNORDERED bit. */
10678 gcc_assert (GET_CODE (x) == REG && GET_MODE (x) == CCmode);
10679
10680 /* Bit 3 is OV bit. */
10681 i = 4 * (REGNO (x) - CR0_REGNO) + 3;
10682
10683 /* If we want bit 31, write a shift count of zero, not 32. */
10684 fprintf (file, "%d", i == 31 ? 0 : i + 1);
10685 return;
10686
10687 case 'T':
10688 /* Print the symbolic name of a branch target register. */
10689 if (GET_CODE (x) != REG || (REGNO (x) != LINK_REGISTER_REGNUM
10690 && REGNO (x) != COUNT_REGISTER_REGNUM))
10691 output_operand_lossage ("invalid %%T value");
10692 else if (REGNO (x) == LINK_REGISTER_REGNUM)
10693 fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
10694 else
10695 fputs ("ctr", file);
10696 return;
10697
10698 case 'u':
10699 /* High-order 16 bits of constant for use in unsigned operand. */
10700 if (! INT_P (x))
10701 output_operand_lossage ("invalid %%u value");
10702 else
10703 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
10704 (INT_LOWPART (x) >> 16) & 0xffff);
10705 return;
10706
10707 case 'v':
10708 /* High-order 16 bits of constant for use in signed operand. */
10709 if (! INT_P (x))
10710 output_operand_lossage ("invalid %%v value");
10711 else
10712 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
10713 (INT_LOWPART (x) >> 16) & 0xffff);
10714 return;
10715
10716 case 'U':
10717 /* Print `u' if this has an auto-increment or auto-decrement. */
10718 if (GET_CODE (x) == MEM
10719 && (GET_CODE (XEXP (x, 0)) == PRE_INC
10720 || GET_CODE (XEXP (x, 0)) == PRE_DEC))
10721 putc ('u', file);
10722 return;
10723
10724 case 'V':
10725 /* Print the trap code for this operand. */
10726 switch (GET_CODE (x))
10727 {
10728 case EQ:
10729 fputs ("eq", file); /* 4 */
10730 break;
10731 case NE:
10732 fputs ("ne", file); /* 24 */
10733 break;
10734 case LT:
10735 fputs ("lt", file); /* 16 */
10736 break;
10737 case LE:
10738 fputs ("le", file); /* 20 */
10739 break;
10740 case GT:
10741 fputs ("gt", file); /* 8 */
10742 break;
10743 case GE:
10744 fputs ("ge", file); /* 12 */
10745 break;
10746 case LTU:
10747 fputs ("llt", file); /* 2 */
10748 break;
10749 case LEU:
10750 fputs ("lle", file); /* 6 */
10751 break;
10752 case GTU:
10753 fputs ("lgt", file); /* 1 */
10754 break;
10755 case GEU:
10756 fputs ("lge", file); /* 5 */
10757 break;
10758 default:
10759 gcc_unreachable ();
10760 }
10761 break;
10762
10763 case 'w':
10764 /* If constant, low-order 16 bits of constant, signed. Otherwise, write
10765 normally. */
10766 if (INT_P (x))
10767 fprintf (file, HOST_WIDE_INT_PRINT_DEC,
10768 ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
10769 else
10770 print_operand (file, x, 0);
10771 return;
10772
10773 case 'W':
10774 /* MB value for a PowerPC64 rldic operand. */
10775 val = (GET_CODE (x) == CONST_INT
10776 ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
10777
10778 if (val < 0)
10779 i = -1;
10780 else
10781 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
10782 if ((val <<= 1) < 0)
10783 break;
10784
10785 #if HOST_BITS_PER_WIDE_INT == 32
10786 if (GET_CODE (x) == CONST_INT && i >= 0)
10787 i += 32; /* zero-extend high-part was all 0's */
10788 else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
10789 {
10790 val = CONST_DOUBLE_LOW (x);
10791
10792 gcc_assert (val);
10793 if (val < 0)
10794 --i;
10795 else
10796 for ( ; i < 64; i++)
10797 if ((val <<= 1) < 0)
10798 break;
10799 }
10800 #endif
10801
10802 fprintf (file, "%d", i + 1);
10803 return;
10804
10805 case 'X':
10806 if (GET_CODE (x) == MEM
10807 && legitimate_indexed_address_p (XEXP (x, 0), 0))
10808 putc ('x', file);
10809 return;
10810
10811 case 'Y':
10812 /* Like 'L', for third word of TImode */
10813 if (GET_CODE (x) == REG)
10814 fputs (reg_names[REGNO (x) + 2], file);
10815 else if (GET_CODE (x) == MEM)
10816 {
10817 if (GET_CODE (XEXP (x, 0)) == PRE_INC
10818 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
10819 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
10820 else
10821 output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
10822 if (small_data_operand (x, GET_MODE (x)))
10823 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10824 reg_names[SMALL_DATA_REG]);
10825 }
10826 return;
10827
10828 case 'z':
10829 /* X is a SYMBOL_REF. Write out the name preceded by a
10830 period and without any trailing data in brackets. Used for function
10831 names. If we are configured for System V (or the embedded ABI) on
10832 the PowerPC, do not emit the period, since those systems do not use
10833 TOCs and the like. */
10834 gcc_assert (GET_CODE (x) == SYMBOL_REF);
10835
10836 /* Mark the decl as referenced so that cgraph will output the
10837 function. */
10838 if (SYMBOL_REF_DECL (x))
10839 mark_decl_referenced (SYMBOL_REF_DECL (x));
10840
10841 /* For macho, check to see if we need a stub. */
10842 if (TARGET_MACHO)
10843 {
10844 const char *name = XSTR (x, 0);
10845 #if TARGET_MACHO
10846 if (MACHOPIC_INDIRECT
10847 && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
10848 name = machopic_indirection_name (x, /*stub_p=*/true);
10849 #endif
10850 assemble_name (file, name);
10851 }
10852 else if (!DOT_SYMBOLS)
10853 assemble_name (file, XSTR (x, 0));
10854 else
10855 rs6000_output_function_entry (file, XSTR (x, 0));
10856 return;
10857
10858 case 'Z':
10859 /* Like 'L', for last word of TImode. */
10860 if (GET_CODE (x) == REG)
10861 fputs (reg_names[REGNO (x) + 3], file);
10862 else if (GET_CODE (x) == MEM)
10863 {
10864 if (GET_CODE (XEXP (x, 0)) == PRE_INC
10865 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
10866 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
10867 else
10868 output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
10869 if (small_data_operand (x, GET_MODE (x)))
10870 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10871 reg_names[SMALL_DATA_REG]);
10872 }
10873 return;
10874
10875 /* Print AltiVec or SPE memory operand. */
10876 case 'y':
10877 {
10878 rtx tmp;
10879
10880 gcc_assert (GET_CODE (x) == MEM);
10881
10882 tmp = XEXP (x, 0);
10883
10884 /* Ugly hack because %y is overloaded. */
10885 if (TARGET_E500 && GET_MODE_SIZE (GET_MODE (x)) == 8)
10886 {
10887 /* Handle [reg]. */
10888 if (GET_CODE (tmp) == REG)
10889 {
10890 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
10891 break;
10892 }
10893 /* Handle [reg+UIMM]. */
10894 else if (GET_CODE (tmp) == PLUS &&
10895 GET_CODE (XEXP (tmp, 1)) == CONST_INT)
10896 {
10897 int x;
10898
10899 gcc_assert (GET_CODE (XEXP (tmp, 0)) == REG);
10900
10901 x = INTVAL (XEXP (tmp, 1));
10902 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
10903 break;
10904 }
10905
10906 /* Fall through. Must be [reg+reg]. */
10907 }
10908 if (TARGET_ALTIVEC
10909 && GET_CODE (tmp) == AND
10910 && GET_CODE (XEXP (tmp, 1)) == CONST_INT
10911 && INTVAL (XEXP (tmp, 1)) == -16)
10912 tmp = XEXP (tmp, 0);
10913 if (GET_CODE (tmp) == REG)
10914 fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
10915 else
10916 {
10917 gcc_assert (GET_CODE (tmp) == PLUS
10918 && REG_P (XEXP (tmp, 0))
10919 && REG_P (XEXP (tmp, 1)));
10920
10921 if (REGNO (XEXP (tmp, 0)) == 0)
10922 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
10923 reg_names[ REGNO (XEXP (tmp, 0)) ]);
10924 else
10925 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
10926 reg_names[ REGNO (XEXP (tmp, 1)) ]);
10927 }
10928 break;
10929 }
10930
10931 case 0:
10932 if (GET_CODE (x) == REG)
10933 fprintf (file, "%s", reg_names[REGNO (x)]);
10934 else if (GET_CODE (x) == MEM)
10935 {
10936 /* We need to handle PRE_INC and PRE_DEC here, since we need to
10937 know the width from the mode. */
10938 if (GET_CODE (XEXP (x, 0)) == PRE_INC)
10939 fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
10940 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
10941 else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
10942 fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
10943 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
10944 else
10945 output_address (XEXP (x, 0));
10946 }
10947 else
10948 output_addr_const (file, x);
10949 return;
10950
10951 case '&':
10952 assemble_name (file, rs6000_get_some_local_dynamic_name ());
10953 return;
10954
10955 default:
10956 output_operand_lossage ("invalid %%xn code");
10957 }
10958 }
10959
10960 /* Print the address of an operand. */
10961
10962 void
print_operand_address(FILE * file,rtx x)10963 print_operand_address (FILE *file, rtx x)
10964 {
10965 if (GET_CODE (x) == REG)
10966 fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
10967 else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
10968 || GET_CODE (x) == LABEL_REF)
10969 {
10970 output_addr_const (file, x);
10971 if (small_data_operand (x, GET_MODE (x)))
10972 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10973 reg_names[SMALL_DATA_REG]);
10974 else
10975 gcc_assert (!TARGET_TOC);
10976 }
10977 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
10978 {
10979 gcc_assert (REG_P (XEXP (x, 0)));
10980 if (REGNO (XEXP (x, 0)) == 0)
10981 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
10982 reg_names[ REGNO (XEXP (x, 0)) ]);
10983 else
10984 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
10985 reg_names[ REGNO (XEXP (x, 1)) ]);
10986 }
10987 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
10988 fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
10989 INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
10990 #if TARGET_ELF
10991 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
10992 && CONSTANT_P (XEXP (x, 1)))
10993 {
10994 output_addr_const (file, XEXP (x, 1));
10995 fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
10996 }
10997 #endif
10998 #if TARGET_MACHO
10999 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
11000 && CONSTANT_P (XEXP (x, 1)))
11001 {
11002 fprintf (file, "lo16(");
11003 output_addr_const (file, XEXP (x, 1));
11004 fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
11005 }
11006 #endif
11007 else if (legitimate_constant_pool_address_p (x))
11008 {
11009 if (TARGET_AIX && (!TARGET_ELF || !TARGET_MINIMAL_TOC))
11010 {
11011 rtx contains_minus = XEXP (x, 1);
11012 rtx minus, symref;
11013 const char *name;
11014
11015 /* Find the (minus (sym) (toc)) buried in X, and temporarily
11016 turn it into (sym) for output_addr_const. */
11017 while (GET_CODE (XEXP (contains_minus, 0)) != MINUS)
11018 contains_minus = XEXP (contains_minus, 0);
11019
11020 minus = XEXP (contains_minus, 0);
11021 symref = XEXP (minus, 0);
11022 XEXP (contains_minus, 0) = symref;
11023 if (TARGET_ELF)
11024 {
11025 char *newname;
11026
11027 name = XSTR (symref, 0);
11028 newname = alloca (strlen (name) + sizeof ("@toc"));
11029 strcpy (newname, name);
11030 strcat (newname, "@toc");
11031 XSTR (symref, 0) = newname;
11032 }
11033 output_addr_const (file, XEXP (x, 1));
11034 if (TARGET_ELF)
11035 XSTR (symref, 0) = name;
11036 XEXP (contains_minus, 0) = minus;
11037 }
11038 else
11039 output_addr_const (file, XEXP (x, 1));
11040
11041 fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
11042 }
11043 else
11044 gcc_unreachable ();
11045 }
11046
11047 /* Target hook for assembling integer objects. The PowerPC version has
11048 to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
11049 is defined. It also needs to handle DI-mode objects on 64-bit
11050 targets. */
11051
11052 static bool
rs6000_assemble_integer(rtx x,unsigned int size,int aligned_p)11053 rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
11054 {
11055 #ifdef RELOCATABLE_NEEDS_FIXUP
11056 /* Special handling for SI values. */
11057 if (RELOCATABLE_NEEDS_FIXUP && size == 4 && aligned_p)
11058 {
11059 static int recurse = 0;
11060
11061 /* For -mrelocatable, we mark all addresses that need to be fixed up
11062 in the .fixup section. */
11063 if (TARGET_RELOCATABLE
11064 && in_section != toc_section
11065 && in_section != text_section
11066 && !unlikely_text_section_p (in_section)
11067 && !recurse
11068 && GET_CODE (x) != CONST_INT
11069 && GET_CODE (x) != CONST_DOUBLE
11070 && CONSTANT_P (x))
11071 {
11072 char buf[256];
11073
11074 recurse = 1;
11075 ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
11076 fixuplabelno++;
11077 ASM_OUTPUT_LABEL (asm_out_file, buf);
11078 fprintf (asm_out_file, "\t.long\t(");
11079 output_addr_const (asm_out_file, x);
11080 fprintf (asm_out_file, ")@fixup\n");
11081 fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
11082 ASM_OUTPUT_ALIGN (asm_out_file, 2);
11083 fprintf (asm_out_file, "\t.long\t");
11084 assemble_name (asm_out_file, buf);
11085 fprintf (asm_out_file, "\n\t.previous\n");
11086 recurse = 0;
11087 return true;
11088 }
11089 /* Remove initial .'s to turn a -mcall-aixdesc function
11090 address into the address of the descriptor, not the function
11091 itself. */
11092 else if (GET_CODE (x) == SYMBOL_REF
11093 && XSTR (x, 0)[0] == '.'
11094 && DEFAULT_ABI == ABI_AIX)
11095 {
11096 const char *name = XSTR (x, 0);
11097 while (*name == '.')
11098 name++;
11099
11100 fprintf (asm_out_file, "\t.long\t%s\n", name);
11101 return true;
11102 }
11103 }
11104 #endif /* RELOCATABLE_NEEDS_FIXUP */
11105 return default_assemble_integer (x, size, aligned_p);
11106 }
11107
11108 #ifdef HAVE_GAS_HIDDEN
11109 /* Emit an assembler directive to set symbol visibility for DECL to
11110 VISIBILITY_TYPE. */
11111
11112 static void
rs6000_assemble_visibility(tree decl,int vis)11113 rs6000_assemble_visibility (tree decl, int vis)
11114 {
11115 /* Functions need to have their entry point symbol visibility set as
11116 well as their descriptor symbol visibility. */
11117 if (DEFAULT_ABI == ABI_AIX
11118 && DOT_SYMBOLS
11119 && TREE_CODE (decl) == FUNCTION_DECL)
11120 {
11121 static const char * const visibility_types[] = {
11122 NULL, "internal", "hidden", "protected"
11123 };
11124
11125 const char *name, *type;
11126
11127 name = ((* targetm.strip_name_encoding)
11128 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
11129 type = visibility_types[vis];
11130
11131 fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
11132 fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
11133 }
11134 else
11135 default_assemble_visibility (decl, vis);
11136 }
11137 #endif
11138
11139 enum rtx_code
rs6000_reverse_condition(enum machine_mode mode,enum rtx_code code)11140 rs6000_reverse_condition (enum machine_mode mode, enum rtx_code code)
11141 {
11142 /* Reversal of FP compares takes care -- an ordered compare
11143 becomes an unordered compare and vice versa. */
11144 if (mode == CCFPmode
11145 && (!flag_finite_math_only
11146 || code == UNLT || code == UNLE || code == UNGT || code == UNGE
11147 || code == UNEQ || code == LTGT))
11148 return reverse_condition_maybe_unordered (code);
11149 else
11150 return reverse_condition (code);
11151 }
11152
11153 /* Generate a compare for CODE. Return a brand-new rtx that
11154 represents the result of the compare. */
11155
11156 static rtx
rs6000_generate_compare(enum rtx_code code)11157 rs6000_generate_compare (enum rtx_code code)
11158 {
11159 enum machine_mode comp_mode;
11160 rtx compare_result;
11161
11162 if (rs6000_compare_fp_p)
11163 comp_mode = CCFPmode;
11164 else if (code == GTU || code == LTU
11165 || code == GEU || code == LEU)
11166 comp_mode = CCUNSmode;
11167 else if ((code == EQ || code == NE)
11168 && GET_CODE (rs6000_compare_op0) == SUBREG
11169 && GET_CODE (rs6000_compare_op1) == SUBREG
11170 && SUBREG_PROMOTED_UNSIGNED_P (rs6000_compare_op0)
11171 && SUBREG_PROMOTED_UNSIGNED_P (rs6000_compare_op1))
11172 /* These are unsigned values, perhaps there will be a later
11173 ordering compare that can be shared with this one.
11174 Unfortunately we cannot detect the signedness of the operands
11175 for non-subregs. */
11176 comp_mode = CCUNSmode;
11177 else
11178 comp_mode = CCmode;
11179
11180 /* First, the compare. */
11181 compare_result = gen_reg_rtx (comp_mode);
11182
11183 /* E500 FP compare instructions on the GPRs. Yuck! */
11184 if ((TARGET_E500 && !TARGET_FPRS && TARGET_HARD_FLOAT)
11185 && rs6000_compare_fp_p)
11186 {
11187 rtx cmp, or_result, compare_result2;
11188 enum machine_mode op_mode = GET_MODE (rs6000_compare_op0);
11189
11190 if (op_mode == VOIDmode)
11191 op_mode = GET_MODE (rs6000_compare_op1);
11192
11193 /* The E500 FP compare instructions toggle the GT bit (CR bit 1) only.
11194 This explains the following mess. */
11195
11196 switch (code)
11197 {
11198 case EQ: case UNEQ: case NE: case LTGT:
11199 switch (op_mode)
11200 {
11201 case SFmode:
11202 cmp = flag_unsafe_math_optimizations
11203 ? gen_tstsfeq_gpr (compare_result, rs6000_compare_op0,
11204 rs6000_compare_op1)
11205 : gen_cmpsfeq_gpr (compare_result, rs6000_compare_op0,
11206 rs6000_compare_op1);
11207 break;
11208
11209 case DFmode:
11210 cmp = flag_unsafe_math_optimizations
11211 ? gen_tstdfeq_gpr (compare_result, rs6000_compare_op0,
11212 rs6000_compare_op1)
11213 : gen_cmpdfeq_gpr (compare_result, rs6000_compare_op0,
11214 rs6000_compare_op1);
11215 break;
11216
11217 default:
11218 gcc_unreachable ();
11219 }
11220 break;
11221
11222 case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
11223 switch (op_mode)
11224 {
11225 case SFmode:
11226 cmp = flag_unsafe_math_optimizations
11227 ? gen_tstsfgt_gpr (compare_result, rs6000_compare_op0,
11228 rs6000_compare_op1)
11229 : gen_cmpsfgt_gpr (compare_result, rs6000_compare_op0,
11230 rs6000_compare_op1);
11231 break;
11232
11233 case DFmode:
11234 cmp = flag_unsafe_math_optimizations
11235 ? gen_tstdfgt_gpr (compare_result, rs6000_compare_op0,
11236 rs6000_compare_op1)
11237 : gen_cmpdfgt_gpr (compare_result, rs6000_compare_op0,
11238 rs6000_compare_op1);
11239 break;
11240
11241 default:
11242 gcc_unreachable ();
11243 }
11244 break;
11245
11246 case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
11247 switch (op_mode)
11248 {
11249 case SFmode:
11250 cmp = flag_unsafe_math_optimizations
11251 ? gen_tstsflt_gpr (compare_result, rs6000_compare_op0,
11252 rs6000_compare_op1)
11253 : gen_cmpsflt_gpr (compare_result, rs6000_compare_op0,
11254 rs6000_compare_op1);
11255 break;
11256
11257 case DFmode:
11258 cmp = flag_unsafe_math_optimizations
11259 ? gen_tstdflt_gpr (compare_result, rs6000_compare_op0,
11260 rs6000_compare_op1)
11261 : gen_cmpdflt_gpr (compare_result, rs6000_compare_op0,
11262 rs6000_compare_op1);
11263 break;
11264
11265 default:
11266 gcc_unreachable ();
11267 }
11268 break;
11269 default:
11270 gcc_unreachable ();
11271 }
11272
11273 /* Synthesize LE and GE from LT/GT || EQ. */
11274 if (code == LE || code == GE || code == LEU || code == GEU)
11275 {
11276 emit_insn (cmp);
11277
11278 switch (code)
11279 {
11280 case LE: code = LT; break;
11281 case GE: code = GT; break;
11282 case LEU: code = LT; break;
11283 case GEU: code = GT; break;
11284 default: gcc_unreachable ();
11285 }
11286
11287 compare_result2 = gen_reg_rtx (CCFPmode);
11288
11289 /* Do the EQ. */
11290 switch (op_mode)
11291 {
11292 case SFmode:
11293 cmp = flag_unsafe_math_optimizations
11294 ? gen_tstsfeq_gpr (compare_result2, rs6000_compare_op0,
11295 rs6000_compare_op1)
11296 : gen_cmpsfeq_gpr (compare_result2, rs6000_compare_op0,
11297 rs6000_compare_op1);
11298 break;
11299
11300 case DFmode:
11301 cmp = flag_unsafe_math_optimizations
11302 ? gen_tstdfeq_gpr (compare_result2, rs6000_compare_op0,
11303 rs6000_compare_op1)
11304 : gen_cmpdfeq_gpr (compare_result2, rs6000_compare_op0,
11305 rs6000_compare_op1);
11306 break;
11307
11308 default:
11309 gcc_unreachable ();
11310 }
11311 emit_insn (cmp);
11312
11313 /* OR them together. */
11314 or_result = gen_reg_rtx (CCFPmode);
11315 cmp = gen_e500_cr_ior_compare (or_result, compare_result,
11316 compare_result2);
11317 compare_result = or_result;
11318 code = EQ;
11319 }
11320 else
11321 {
11322 if (code == NE || code == LTGT)
11323 code = NE;
11324 else
11325 code = EQ;
11326 }
11327
11328 emit_insn (cmp);
11329 }
11330 else
11331 {
11332 /* Generate XLC-compatible TFmode compare as PARALLEL with extra
11333 CLOBBERs to match cmptf_internal2 pattern. */
11334 if (comp_mode == CCFPmode && TARGET_XL_COMPAT
11335 && GET_MODE (rs6000_compare_op0) == TFmode
11336 && !TARGET_IEEEQUAD
11337 && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128)
11338 emit_insn (gen_rtx_PARALLEL (VOIDmode,
11339 gen_rtvec (9,
11340 gen_rtx_SET (VOIDmode,
11341 compare_result,
11342 gen_rtx_COMPARE (comp_mode,
11343 rs6000_compare_op0,
11344 rs6000_compare_op1)),
11345 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
11346 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
11347 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
11348 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
11349 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
11350 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
11351 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
11352 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)))));
11353 else if (GET_CODE (rs6000_compare_op1) == UNSPEC
11354 && XINT (rs6000_compare_op1, 1) == UNSPEC_SP_TEST)
11355 {
11356 rtx op1 = XVECEXP (rs6000_compare_op1, 0, 0);
11357 comp_mode = CCEQmode;
11358 compare_result = gen_reg_rtx (CCEQmode);
11359 if (TARGET_64BIT)
11360 emit_insn (gen_stack_protect_testdi (compare_result,
11361 rs6000_compare_op0, op1));
11362 else
11363 emit_insn (gen_stack_protect_testsi (compare_result,
11364 rs6000_compare_op0, op1));
11365 }
11366 else
11367 emit_insn (gen_rtx_SET (VOIDmode, compare_result,
11368 gen_rtx_COMPARE (comp_mode,
11369 rs6000_compare_op0,
11370 rs6000_compare_op1)));
11371 }
11372
11373 /* Some kinds of FP comparisons need an OR operation;
11374 under flag_finite_math_only we don't bother. */
11375 if (rs6000_compare_fp_p
11376 && !flag_finite_math_only
11377 && !(TARGET_HARD_FLOAT && TARGET_E500 && !TARGET_FPRS)
11378 && (code == LE || code == GE
11379 || code == UNEQ || code == LTGT
11380 || code == UNGT || code == UNLT))
11381 {
11382 enum rtx_code or1, or2;
11383 rtx or1_rtx, or2_rtx, compare2_rtx;
11384 rtx or_result = gen_reg_rtx (CCEQmode);
11385
11386 switch (code)
11387 {
11388 case LE: or1 = LT; or2 = EQ; break;
11389 case GE: or1 = GT; or2 = EQ; break;
11390 case UNEQ: or1 = UNORDERED; or2 = EQ; break;
11391 case LTGT: or1 = LT; or2 = GT; break;
11392 case UNGT: or1 = UNORDERED; or2 = GT; break;
11393 case UNLT: or1 = UNORDERED; or2 = LT; break;
11394 default: gcc_unreachable ();
11395 }
11396 validate_condition_mode (or1, comp_mode);
11397 validate_condition_mode (or2, comp_mode);
11398 or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
11399 or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
11400 compare2_rtx = gen_rtx_COMPARE (CCEQmode,
11401 gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
11402 const_true_rtx);
11403 emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
11404
11405 compare_result = or_result;
11406 code = EQ;
11407 }
11408
11409 validate_condition_mode (code, GET_MODE (compare_result));
11410
11411 return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
11412 }
11413
11414
11415 /* Emit the RTL for an sCOND pattern. */
11416
11417 void
rs6000_emit_sCOND(enum rtx_code code,rtx result)11418 rs6000_emit_sCOND (enum rtx_code code, rtx result)
11419 {
11420 rtx condition_rtx;
11421 enum machine_mode op_mode;
11422 enum rtx_code cond_code;
11423
11424 condition_rtx = rs6000_generate_compare (code);
11425 cond_code = GET_CODE (condition_rtx);
11426
11427 if (TARGET_E500 && rs6000_compare_fp_p
11428 && !TARGET_FPRS && TARGET_HARD_FLOAT)
11429 {
11430 rtx t;
11431
11432 PUT_MODE (condition_rtx, SImode);
11433 t = XEXP (condition_rtx, 0);
11434
11435 gcc_assert (cond_code == NE || cond_code == EQ);
11436
11437 if (cond_code == NE)
11438 emit_insn (gen_e500_flip_gt_bit (t, t));
11439
11440 emit_insn (gen_move_from_CR_gt_bit (result, t));
11441 return;
11442 }
11443
11444 if (cond_code == NE
11445 || cond_code == GE || cond_code == LE
11446 || cond_code == GEU || cond_code == LEU
11447 || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
11448 {
11449 rtx not_result = gen_reg_rtx (CCEQmode);
11450 rtx not_op, rev_cond_rtx;
11451 enum machine_mode cc_mode;
11452
11453 cc_mode = GET_MODE (XEXP (condition_rtx, 0));
11454
11455 rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
11456 SImode, XEXP (condition_rtx, 0), const0_rtx);
11457 not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
11458 emit_insn (gen_rtx_SET (VOIDmode, not_result, not_op));
11459 condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
11460 }
11461
11462 op_mode = GET_MODE (rs6000_compare_op0);
11463 if (op_mode == VOIDmode)
11464 op_mode = GET_MODE (rs6000_compare_op1);
11465
11466 if (TARGET_POWERPC64 && (op_mode == DImode || rs6000_compare_fp_p))
11467 {
11468 PUT_MODE (condition_rtx, DImode);
11469 convert_move (result, condition_rtx, 0);
11470 }
11471 else
11472 {
11473 PUT_MODE (condition_rtx, SImode);
11474 emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
11475 }
11476 }
11477
11478 /* Emit a branch of kind CODE to location LOC. */
11479
11480 void
rs6000_emit_cbranch(enum rtx_code code,rtx loc)11481 rs6000_emit_cbranch (enum rtx_code code, rtx loc)
11482 {
11483 rtx condition_rtx, loc_ref;
11484
11485 condition_rtx = rs6000_generate_compare (code);
11486 loc_ref = gen_rtx_LABEL_REF (VOIDmode, loc);
11487 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
11488 gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
11489 loc_ref, pc_rtx)));
11490 }
11491
11492 /* Return the string to output a conditional branch to LABEL, which is
11493 the operand number of the label, or -1 if the branch is really a
11494 conditional return.
11495
11496 OP is the conditional expression. XEXP (OP, 0) is assumed to be a
11497 condition code register and its mode specifies what kind of
11498 comparison we made.
11499
11500 REVERSED is nonzero if we should reverse the sense of the comparison.
11501
11502 INSN is the insn. */
11503
11504 char *
output_cbranch(rtx op,const char * label,int reversed,rtx insn)11505 output_cbranch (rtx op, const char *label, int reversed, rtx insn)
11506 {
11507 static char string[64];
11508 enum rtx_code code = GET_CODE (op);
11509 rtx cc_reg = XEXP (op, 0);
11510 enum machine_mode mode = GET_MODE (cc_reg);
11511 int cc_regno = REGNO (cc_reg) - CR0_REGNO;
11512 int need_longbranch = label != NULL && get_attr_length (insn) == 8;
11513 int really_reversed = reversed ^ need_longbranch;
11514 char *s = string;
11515 const char *ccode;
11516 const char *pred;
11517 rtx note;
11518
11519 validate_condition_mode (code, mode);
11520
11521 /* Work out which way this really branches. We could use
11522 reverse_condition_maybe_unordered here always but this
11523 makes the resulting assembler clearer. */
11524 if (really_reversed)
11525 {
11526 /* Reversal of FP compares takes care -- an ordered compare
11527 becomes an unordered compare and vice versa. */
11528 if (mode == CCFPmode)
11529 code = reverse_condition_maybe_unordered (code);
11530 else
11531 code = reverse_condition (code);
11532 }
11533
11534 if ((TARGET_E500 && !TARGET_FPRS && TARGET_HARD_FLOAT) && mode == CCFPmode)
11535 {
11536 /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
11537 to the GT bit. */
11538 switch (code)
11539 {
11540 case EQ:
11541 /* Opposite of GT. */
11542 code = GT;
11543 break;
11544
11545 case NE:
11546 code = UNLE;
11547 break;
11548
11549 default:
11550 gcc_unreachable ();
11551 }
11552 }
11553
11554 switch (code)
11555 {
11556 /* Not all of these are actually distinct opcodes, but
11557 we distinguish them for clarity of the resulting assembler. */
11558 case NE: case LTGT:
11559 ccode = "ne"; break;
11560 case EQ: case UNEQ:
11561 ccode = "eq"; break;
11562 case GE: case GEU:
11563 ccode = "ge"; break;
11564 case GT: case GTU: case UNGT:
11565 ccode = "gt"; break;
11566 case LE: case LEU:
11567 ccode = "le"; break;
11568 case LT: case LTU: case UNLT:
11569 ccode = "lt"; break;
11570 case UNORDERED: ccode = "un"; break;
11571 case ORDERED: ccode = "nu"; break;
11572 case UNGE: ccode = "nl"; break;
11573 case UNLE: ccode = "ng"; break;
11574 default:
11575 gcc_unreachable ();
11576 }
11577
11578 /* Maybe we have a guess as to how likely the branch is.
11579 The old mnemonics don't have a way to specify this information. */
11580 pred = "";
11581 note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
11582 if (note != NULL_RTX)
11583 {
11584 /* PROB is the difference from 50%. */
11585 int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
11586
11587 /* Only hint for highly probable/improbable branches on newer
11588 cpus as static prediction overrides processor dynamic
11589 prediction. For older cpus we may as well always hint, but
11590 assume not taken for branches that are very close to 50% as a
11591 mispredicted taken branch is more expensive than a
11592 mispredicted not-taken branch. */
11593 if (rs6000_always_hint
11594 || (abs (prob) > REG_BR_PROB_BASE / 100 * 48
11595 && br_prob_note_reliable_p (note)))
11596 {
11597 if (abs (prob) > REG_BR_PROB_BASE / 20
11598 && ((prob > 0) ^ need_longbranch))
11599 pred = "+";
11600 else
11601 pred = "-";
11602 }
11603 }
11604
11605 if (label == NULL)
11606 s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
11607 else
11608 s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
11609
11610 /* We need to escape any '%' characters in the reg_names string.
11611 Assume they'd only be the first character.... */
11612 if (reg_names[cc_regno + CR0_REGNO][0] == '%')
11613 *s++ = '%';
11614 s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
11615
11616 if (label != NULL)
11617 {
11618 /* If the branch distance was too far, we may have to use an
11619 unconditional branch to go the distance. */
11620 if (need_longbranch)
11621 s += sprintf (s, ",$+8\n\tb %s", label);
11622 else
11623 s += sprintf (s, ",%s", label);
11624 }
11625
11626 return string;
11627 }
11628
11629 /* Return the string to flip the GT bit on a CR. */
11630 char *
output_e500_flip_gt_bit(rtx dst,rtx src)11631 output_e500_flip_gt_bit (rtx dst, rtx src)
11632 {
11633 static char string[64];
11634 int a, b;
11635
11636 gcc_assert (GET_CODE (dst) == REG && CR_REGNO_P (REGNO (dst))
11637 && GET_CODE (src) == REG && CR_REGNO_P (REGNO (src)));
11638
11639 /* GT bit. */
11640 a = 4 * (REGNO (dst) - CR0_REGNO) + 1;
11641 b = 4 * (REGNO (src) - CR0_REGNO) + 1;
11642
11643 sprintf (string, "crnot %d,%d", a, b);
11644 return string;
11645 }
11646
11647 /* Return insn index for the vector compare instruction for given CODE,
11648 and DEST_MODE, OP_MODE. Return INSN_NOT_AVAILABLE if valid insn is
11649 not available. */
11650
11651 static int
get_vec_cmp_insn(enum rtx_code code,enum machine_mode dest_mode,enum machine_mode op_mode)11652 get_vec_cmp_insn (enum rtx_code code,
11653 enum machine_mode dest_mode,
11654 enum machine_mode op_mode)
11655 {
11656 if (!TARGET_ALTIVEC)
11657 return INSN_NOT_AVAILABLE;
11658
11659 switch (code)
11660 {
11661 case EQ:
11662 if (dest_mode == V16QImode && op_mode == V16QImode)
11663 return UNSPEC_VCMPEQUB;
11664 if (dest_mode == V8HImode && op_mode == V8HImode)
11665 return UNSPEC_VCMPEQUH;
11666 if (dest_mode == V4SImode && op_mode == V4SImode)
11667 return UNSPEC_VCMPEQUW;
11668 if (dest_mode == V4SImode && op_mode == V4SFmode)
11669 return UNSPEC_VCMPEQFP;
11670 break;
11671 case GE:
11672 if (dest_mode == V4SImode && op_mode == V4SFmode)
11673 return UNSPEC_VCMPGEFP;
11674 case GT:
11675 if (dest_mode == V16QImode && op_mode == V16QImode)
11676 return UNSPEC_VCMPGTSB;
11677 if (dest_mode == V8HImode && op_mode == V8HImode)
11678 return UNSPEC_VCMPGTSH;
11679 if (dest_mode == V4SImode && op_mode == V4SImode)
11680 return UNSPEC_VCMPGTSW;
11681 if (dest_mode == V4SImode && op_mode == V4SFmode)
11682 return UNSPEC_VCMPGTFP;
11683 break;
11684 case GTU:
11685 if (dest_mode == V16QImode && op_mode == V16QImode)
11686 return UNSPEC_VCMPGTUB;
11687 if (dest_mode == V8HImode && op_mode == V8HImode)
11688 return UNSPEC_VCMPGTUH;
11689 if (dest_mode == V4SImode && op_mode == V4SImode)
11690 return UNSPEC_VCMPGTUW;
11691 break;
11692 default:
11693 break;
11694 }
11695 return INSN_NOT_AVAILABLE;
11696 }
11697
11698 /* Emit vector compare for operands OP0 and OP1 using code RCODE.
11699 DMODE is expected destination mode. This is a recursive function. */
11700
11701 static rtx
rs6000_emit_vector_compare(enum rtx_code rcode,rtx op0,rtx op1,enum machine_mode dmode)11702 rs6000_emit_vector_compare (enum rtx_code rcode,
11703 rtx op0, rtx op1,
11704 enum machine_mode dmode)
11705 {
11706 int vec_cmp_insn;
11707 rtx mask;
11708 enum machine_mode dest_mode;
11709 enum machine_mode op_mode = GET_MODE (op1);
11710
11711 gcc_assert (TARGET_ALTIVEC);
11712 gcc_assert (GET_MODE (op0) == GET_MODE (op1));
11713
11714 /* Floating point vector compare instructions uses destination V4SImode.
11715 Move destination to appropriate mode later. */
11716 if (dmode == V4SFmode)
11717 dest_mode = V4SImode;
11718 else
11719 dest_mode = dmode;
11720
11721 mask = gen_reg_rtx (dest_mode);
11722 vec_cmp_insn = get_vec_cmp_insn (rcode, dest_mode, op_mode);
11723
11724 if (vec_cmp_insn == INSN_NOT_AVAILABLE)
11725 {
11726 bool swap_operands = false;
11727 bool try_again = false;
11728 switch (rcode)
11729 {
11730 case LT:
11731 rcode = GT;
11732 swap_operands = true;
11733 try_again = true;
11734 break;
11735 case LTU:
11736 rcode = GTU;
11737 swap_operands = true;
11738 try_again = true;
11739 break;
11740 case NE:
11741 case UNLE:
11742 case UNLT:
11743 case UNGE:
11744 case UNGT:
11745 /* Invert condition and try again.
11746 e.g., A != B becomes ~(A==B). */
11747 {
11748 enum rtx_code rev_code;
11749 enum insn_code nor_code;
11750
11751 rev_code = reverse_condition_maybe_unordered (rcode);
11752 rtx eq_rtx = rs6000_emit_vector_compare (rev_code, op0, op1,
11753 dest_mode);
11754
11755 nor_code = one_cmpl_optab->handlers[(int)dest_mode].insn_code;
11756 gcc_assert (nor_code != CODE_FOR_nothing);
11757 emit_insn (GEN_FCN (nor_code) (mask, eq_rtx));
11758
11759 if (dmode != dest_mode)
11760 {
11761 rtx temp = gen_reg_rtx (dest_mode);
11762 convert_move (temp, mask, 0);
11763 return temp;
11764 }
11765 return mask;
11766 }
11767 break;
11768 case GE:
11769 case GEU:
11770 case LE:
11771 case LEU:
11772 /* Try GT/GTU/LT/LTU OR EQ */
11773 {
11774 rtx c_rtx, eq_rtx;
11775 enum insn_code ior_code;
11776 enum rtx_code new_code;
11777
11778 switch (rcode)
11779 {
11780 case GE:
11781 new_code = GT;
11782 break;
11783
11784 case GEU:
11785 new_code = GTU;
11786 break;
11787
11788 case LE:
11789 new_code = LT;
11790 break;
11791
11792 case LEU:
11793 new_code = LTU;
11794 break;
11795
11796 default:
11797 gcc_unreachable ();
11798 }
11799
11800 c_rtx = rs6000_emit_vector_compare (new_code,
11801 op0, op1, dest_mode);
11802 eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1,
11803 dest_mode);
11804
11805 ior_code = ior_optab->handlers[(int)dest_mode].insn_code;
11806 gcc_assert (ior_code != CODE_FOR_nothing);
11807 emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx));
11808 if (dmode != dest_mode)
11809 {
11810 rtx temp = gen_reg_rtx (dest_mode);
11811 convert_move (temp, mask, 0);
11812 return temp;
11813 }
11814 return mask;
11815 }
11816 break;
11817 default:
11818 gcc_unreachable ();
11819 }
11820
11821 if (try_again)
11822 {
11823 vec_cmp_insn = get_vec_cmp_insn (rcode, dest_mode, op_mode);
11824 /* You only get two chances. */
11825 gcc_assert (vec_cmp_insn != INSN_NOT_AVAILABLE);
11826 }
11827
11828 if (swap_operands)
11829 {
11830 rtx tmp;
11831 tmp = op0;
11832 op0 = op1;
11833 op1 = tmp;
11834 }
11835 }
11836
11837 emit_insn (gen_rtx_SET (VOIDmode, mask,
11838 gen_rtx_UNSPEC (dest_mode,
11839 gen_rtvec (2, op0, op1),
11840 vec_cmp_insn)));
11841 if (dmode != dest_mode)
11842 {
11843 rtx temp = gen_reg_rtx (dest_mode);
11844 convert_move (temp, mask, 0);
11845 return temp;
11846 }
11847 return mask;
11848 }
11849
11850 /* Return vector select instruction for MODE. Return INSN_NOT_AVAILABLE, if
11851 valid insn doesn exist for given mode. */
11852
11853 static int
get_vsel_insn(enum machine_mode mode)11854 get_vsel_insn (enum machine_mode mode)
11855 {
11856 switch (mode)
11857 {
11858 case V4SImode:
11859 return UNSPEC_VSEL4SI;
11860 break;
11861 case V4SFmode:
11862 return UNSPEC_VSEL4SF;
11863 break;
11864 case V8HImode:
11865 return UNSPEC_VSEL8HI;
11866 break;
11867 case V16QImode:
11868 return UNSPEC_VSEL16QI;
11869 break;
11870 default:
11871 return INSN_NOT_AVAILABLE;
11872 break;
11873 }
11874 return INSN_NOT_AVAILABLE;
11875 }
11876
11877 /* Emit vector select insn where DEST is destination using
11878 operands OP1, OP2 and MASK. */
11879
11880 static void
rs6000_emit_vector_select(rtx dest,rtx op1,rtx op2,rtx mask)11881 rs6000_emit_vector_select (rtx dest, rtx op1, rtx op2, rtx mask)
11882 {
11883 rtx t, temp;
11884 enum machine_mode dest_mode = GET_MODE (dest);
11885 int vsel_insn_index = get_vsel_insn (GET_MODE (dest));
11886
11887 temp = gen_reg_rtx (dest_mode);
11888
11889 /* For each vector element, select op1 when mask is 1 otherwise
11890 select op2. */
11891 t = gen_rtx_SET (VOIDmode, temp,
11892 gen_rtx_UNSPEC (dest_mode,
11893 gen_rtvec (3, op2, op1, mask),
11894 vsel_insn_index));
11895 emit_insn (t);
11896 emit_move_insn (dest, temp);
11897 return;
11898 }
11899
11900 /* Emit vector conditional expression.
11901 DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands.
11902 CC_OP0 and CC_OP1 are the two operands for the relation operation COND. */
11903
11904 int
rs6000_emit_vector_cond_expr(rtx dest,rtx op1,rtx op2,rtx cond,rtx cc_op0,rtx cc_op1)11905 rs6000_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2,
11906 rtx cond, rtx cc_op0, rtx cc_op1)
11907 {
11908 enum machine_mode dest_mode = GET_MODE (dest);
11909 enum rtx_code rcode = GET_CODE (cond);
11910 rtx mask;
11911
11912 if (!TARGET_ALTIVEC)
11913 return 0;
11914
11915 /* Get the vector mask for the given relational operations. */
11916 mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, dest_mode);
11917
11918 rs6000_emit_vector_select (dest, op1, op2, mask);
11919
11920 return 1;
11921 }
11922
11923 /* Emit a conditional move: move TRUE_COND to DEST if OP of the
11924 operands of the last comparison is nonzero/true, FALSE_COND if it
11925 is zero/false. Return 0 if the hardware has no such operation. */
11926
11927 int
rs6000_emit_cmove(rtx dest,rtx op,rtx true_cond,rtx false_cond)11928 rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
11929 {
11930 enum rtx_code code = GET_CODE (op);
11931 rtx op0 = rs6000_compare_op0;
11932 rtx op1 = rs6000_compare_op1;
11933 REAL_VALUE_TYPE c1;
11934 enum machine_mode compare_mode = GET_MODE (op0);
11935 enum machine_mode result_mode = GET_MODE (dest);
11936 rtx temp;
11937 bool is_against_zero;
11938
11939 /* These modes should always match. */
11940 if (GET_MODE (op1) != compare_mode
11941 /* In the isel case however, we can use a compare immediate, so
11942 op1 may be a small constant. */
11943 && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
11944 return 0;
11945 if (GET_MODE (true_cond) != result_mode)
11946 return 0;
11947 if (GET_MODE (false_cond) != result_mode)
11948 return 0;
11949
11950 /* First, work out if the hardware can do this at all, or
11951 if it's too slow.... */
11952 if (! rs6000_compare_fp_p)
11953 {
11954 if (TARGET_ISEL)
11955 return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
11956 return 0;
11957 }
11958 else if (TARGET_E500 && TARGET_HARD_FLOAT && !TARGET_FPRS
11959 && SCALAR_FLOAT_MODE_P (compare_mode))
11960 return 0;
11961
11962 is_against_zero = op1 == CONST0_RTX (compare_mode);
11963
11964 /* A floating-point subtract might overflow, underflow, or produce
11965 an inexact result, thus changing the floating-point flags, so it
11966 can't be generated if we care about that. It's safe if one side
11967 of the construct is zero, since then no subtract will be
11968 generated. */
11969 if (SCALAR_FLOAT_MODE_P (compare_mode)
11970 && flag_trapping_math && ! is_against_zero)
11971 return 0;
11972
11973 /* Eliminate half of the comparisons by switching operands, this
11974 makes the remaining code simpler. */
11975 if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
11976 || code == LTGT || code == LT || code == UNLE)
11977 {
11978 code = reverse_condition_maybe_unordered (code);
11979 temp = true_cond;
11980 true_cond = false_cond;
11981 false_cond = temp;
11982 }
11983
11984 /* UNEQ and LTGT take four instructions for a comparison with zero,
11985 it'll probably be faster to use a branch here too. */
11986 if (code == UNEQ && HONOR_NANS (compare_mode))
11987 return 0;
11988
11989 if (GET_CODE (op1) == CONST_DOUBLE)
11990 REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
11991
11992 /* We're going to try to implement comparisons by performing
11993 a subtract, then comparing against zero. Unfortunately,
11994 Inf - Inf is NaN which is not zero, and so if we don't
11995 know that the operand is finite and the comparison
11996 would treat EQ different to UNORDERED, we can't do it. */
11997 if (HONOR_INFINITIES (compare_mode)
11998 && code != GT && code != UNGE
11999 && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
12000 /* Constructs of the form (a OP b ? a : b) are safe. */
12001 && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
12002 || (! rtx_equal_p (op0, true_cond)
12003 && ! rtx_equal_p (op1, true_cond))))
12004 return 0;
12005
12006 /* At this point we know we can use fsel. */
12007
12008 /* Reduce the comparison to a comparison against zero. */
12009 if (! is_against_zero)
12010 {
12011 temp = gen_reg_rtx (compare_mode);
12012 emit_insn (gen_rtx_SET (VOIDmode, temp,
12013 gen_rtx_MINUS (compare_mode, op0, op1)));
12014 op0 = temp;
12015 op1 = CONST0_RTX (compare_mode);
12016 }
12017
12018 /* If we don't care about NaNs we can reduce some of the comparisons
12019 down to faster ones. */
12020 if (! HONOR_NANS (compare_mode))
12021 switch (code)
12022 {
12023 case GT:
12024 code = LE;
12025 temp = true_cond;
12026 true_cond = false_cond;
12027 false_cond = temp;
12028 break;
12029 case UNGE:
12030 code = GE;
12031 break;
12032 case UNEQ:
12033 code = EQ;
12034 break;
12035 default:
12036 break;
12037 }
12038
12039 /* Now, reduce everything down to a GE. */
12040 switch (code)
12041 {
12042 case GE:
12043 break;
12044
12045 case LE:
12046 temp = gen_reg_rtx (compare_mode);
12047 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
12048 op0 = temp;
12049 break;
12050
12051 case ORDERED:
12052 temp = gen_reg_rtx (compare_mode);
12053 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
12054 op0 = temp;
12055 break;
12056
12057 case EQ:
12058 temp = gen_reg_rtx (compare_mode);
12059 emit_insn (gen_rtx_SET (VOIDmode, temp,
12060 gen_rtx_NEG (compare_mode,
12061 gen_rtx_ABS (compare_mode, op0))));
12062 op0 = temp;
12063 break;
12064
12065 case UNGE:
12066 /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
12067 temp = gen_reg_rtx (result_mode);
12068 emit_insn (gen_rtx_SET (VOIDmode, temp,
12069 gen_rtx_IF_THEN_ELSE (result_mode,
12070 gen_rtx_GE (VOIDmode,
12071 op0, op1),
12072 true_cond, false_cond)));
12073 false_cond = true_cond;
12074 true_cond = temp;
12075
12076 temp = gen_reg_rtx (compare_mode);
12077 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
12078 op0 = temp;
12079 break;
12080
12081 case GT:
12082 /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
12083 temp = gen_reg_rtx (result_mode);
12084 emit_insn (gen_rtx_SET (VOIDmode, temp,
12085 gen_rtx_IF_THEN_ELSE (result_mode,
12086 gen_rtx_GE (VOIDmode,
12087 op0, op1),
12088 true_cond, false_cond)));
12089 true_cond = false_cond;
12090 false_cond = temp;
12091
12092 temp = gen_reg_rtx (compare_mode);
12093 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
12094 op0 = temp;
12095 break;
12096
12097 default:
12098 gcc_unreachable ();
12099 }
12100
12101 emit_insn (gen_rtx_SET (VOIDmode, dest,
12102 gen_rtx_IF_THEN_ELSE (result_mode,
12103 gen_rtx_GE (VOIDmode,
12104 op0, op1),
12105 true_cond, false_cond)));
12106 return 1;
12107 }
12108
12109 /* Same as above, but for ints (isel). */
12110
12111 static int
rs6000_emit_int_cmove(rtx dest,rtx op,rtx true_cond,rtx false_cond)12112 rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
12113 {
12114 rtx condition_rtx, cr;
12115
12116 /* All isel implementations thus far are 32-bits. */
12117 if (GET_MODE (rs6000_compare_op0) != SImode)
12118 return 0;
12119
12120 /* We still have to do the compare, because isel doesn't do a
12121 compare, it just looks at the CRx bits set by a previous compare
12122 instruction. */
12123 condition_rtx = rs6000_generate_compare (GET_CODE (op));
12124 cr = XEXP (condition_rtx, 0);
12125
12126 if (GET_MODE (cr) == CCmode)
12127 emit_insn (gen_isel_signed (dest, condition_rtx,
12128 true_cond, false_cond, cr));
12129 else
12130 emit_insn (gen_isel_unsigned (dest, condition_rtx,
12131 true_cond, false_cond, cr));
12132
12133 return 1;
12134 }
12135
12136 const char *
output_isel(rtx * operands)12137 output_isel (rtx *operands)
12138 {
12139 enum rtx_code code;
12140
12141 code = GET_CODE (operands[1]);
12142 if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
12143 {
12144 PUT_CODE (operands[1], reverse_condition (code));
12145 return "isel %0,%3,%2,%j1";
12146 }
12147 else
12148 return "isel %0,%2,%3,%j1";
12149 }
12150
12151 void
rs6000_emit_minmax(rtx dest,enum rtx_code code,rtx op0,rtx op1)12152 rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
12153 {
12154 enum machine_mode mode = GET_MODE (op0);
12155 enum rtx_code c;
12156 rtx target;
12157
12158 if (code == SMAX || code == SMIN)
12159 c = GE;
12160 else
12161 c = GEU;
12162
12163 if (code == SMAX || code == UMAX)
12164 target = emit_conditional_move (dest, c, op0, op1, mode,
12165 op0, op1, mode, 0);
12166 else
12167 target = emit_conditional_move (dest, c, op0, op1, mode,
12168 op1, op0, mode, 0);
12169 gcc_assert (target);
12170 if (target != dest)
12171 emit_move_insn (dest, target);
12172 }
12173
12174 /* Emit instructions to perform a load-reserved/store-conditional operation.
12175 The operation performed is an atomic
12176 (set M (CODE:MODE M OP))
12177 If not NULL, BEFORE is atomically set to M before the operation, and
12178 AFTER is set to M after the operation (that is, (CODE:MODE M OP)).
12179 If SYNC_P then a memory barrier is emitted before the operation.
12180 Either OP or M may be wrapped in a NOT operation. */
12181
12182 void
rs6000_emit_sync(enum rtx_code code,enum machine_mode mode,rtx m,rtx op,rtx before_param,rtx after_param,bool sync_p)12183 rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
12184 rtx m, rtx op, rtx before_param, rtx after_param,
12185 bool sync_p)
12186 {
12187 enum machine_mode used_mode;
12188 rtx the_op, set_before, set_after, set_atomic, cc_scratch, before, after;
12189 rtx used_m;
12190 rtvec vec;
12191 HOST_WIDE_INT imask = GET_MODE_MASK (mode);
12192 rtx shift = NULL_RTX;
12193
12194 if (sync_p)
12195 emit_insn (gen_memory_barrier ());
12196
12197 if (GET_CODE (m) == NOT)
12198 used_m = XEXP (m, 0);
12199 else
12200 used_m = m;
12201
12202 /* If this is smaller than SImode, we'll have to use SImode with
12203 adjustments. */
12204 if (mode == QImode || mode == HImode)
12205 {
12206 rtx newop, oldop;
12207
12208 if (MEM_ALIGN (used_m) >= 32)
12209 {
12210 int ishift = 0;
12211 if (BYTES_BIG_ENDIAN)
12212 ishift = GET_MODE_BITSIZE (SImode) - GET_MODE_BITSIZE (mode);
12213
12214 shift = GEN_INT (ishift);
12215 }
12216 else
12217 {
12218 rtx addrSI, aligned_addr;
12219 int shift_mask = mode == QImode ? 0x18 : 0x10;
12220
12221 addrSI = force_reg (SImode, gen_lowpart_common (SImode,
12222 XEXP (used_m, 0)));
12223 shift = gen_reg_rtx (SImode);
12224
12225 emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
12226 GEN_INT (shift_mask)));
12227 emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
12228
12229 aligned_addr = expand_binop (Pmode, and_optab,
12230 XEXP (used_m, 0),
12231 GEN_INT (-4), NULL_RTX,
12232 1, OPTAB_LIB_WIDEN);
12233 used_m = change_address (used_m, SImode, aligned_addr);
12234 set_mem_align (used_m, 32);
12235 /* It's safe to keep the old alias set of USED_M, because
12236 the operation is atomic and only affects the original
12237 USED_M. */
12238 if (GET_CODE (m) == NOT)
12239 m = gen_rtx_NOT (SImode, used_m);
12240 else
12241 m = used_m;
12242 }
12243
12244 if (GET_CODE (op) == NOT)
12245 {
12246 oldop = lowpart_subreg (SImode, XEXP (op, 0), mode);
12247 oldop = gen_rtx_NOT (SImode, oldop);
12248 }
12249 else
12250 oldop = lowpart_subreg (SImode, op, mode);
12251
12252 switch (code)
12253 {
12254 case IOR:
12255 case XOR:
12256 newop = expand_binop (SImode, and_optab,
12257 oldop, GEN_INT (imask), NULL_RTX,
12258 1, OPTAB_LIB_WIDEN);
12259 emit_insn (gen_ashlsi3 (newop, newop, shift));
12260 break;
12261
12262 case AND:
12263 newop = expand_binop (SImode, ior_optab,
12264 oldop, GEN_INT (~imask), NULL_RTX,
12265 1, OPTAB_LIB_WIDEN);
12266 emit_insn (gen_rotlsi3 (newop, newop, shift));
12267 break;
12268
12269 case PLUS:
12270 case MINUS:
12271 {
12272 rtx mask;
12273
12274 newop = expand_binop (SImode, and_optab,
12275 oldop, GEN_INT (imask), NULL_RTX,
12276 1, OPTAB_LIB_WIDEN);
12277 emit_insn (gen_ashlsi3 (newop, newop, shift));
12278
12279 mask = gen_reg_rtx (SImode);
12280 emit_move_insn (mask, GEN_INT (imask));
12281 emit_insn (gen_ashlsi3 (mask, mask, shift));
12282
12283 if (code == PLUS)
12284 newop = gen_rtx_PLUS (SImode, m, newop);
12285 else
12286 newop = gen_rtx_MINUS (SImode, m, newop);
12287 newop = gen_rtx_AND (SImode, newop, mask);
12288 newop = gen_rtx_IOR (SImode, newop,
12289 gen_rtx_AND (SImode,
12290 gen_rtx_NOT (SImode, mask),
12291 m));
12292 break;
12293 }
12294
12295 default:
12296 gcc_unreachable ();
12297 }
12298
12299 if (GET_CODE (m) == NOT)
12300 {
12301 rtx mask, xorm;
12302
12303 mask = gen_reg_rtx (SImode);
12304 emit_move_insn (mask, GEN_INT (imask));
12305 emit_insn (gen_ashlsi3 (mask, mask, shift));
12306
12307 xorm = gen_rtx_XOR (SImode, used_m, mask);
12308 /* Depending on the value of 'op', the XOR or the operation might
12309 be able to be simplified away. */
12310 newop = simplify_gen_binary (code, SImode, xorm, newop);
12311 }
12312 op = newop;
12313 used_mode = SImode;
12314 before = gen_reg_rtx (used_mode);
12315 after = gen_reg_rtx (used_mode);
12316 }
12317 else
12318 {
12319 used_mode = mode;
12320 before = before_param;
12321 after = after_param;
12322
12323 if (before == NULL_RTX)
12324 before = gen_reg_rtx (used_mode);
12325 if (after == NULL_RTX)
12326 after = gen_reg_rtx (used_mode);
12327 }
12328
12329 if ((code == PLUS || code == MINUS || GET_CODE (m) == NOT)
12330 && used_mode != mode)
12331 the_op = op; /* Computed above. */
12332 else if (GET_CODE (op) == NOT && GET_CODE (m) != NOT)
12333 the_op = gen_rtx_fmt_ee (code, used_mode, op, m);
12334 else
12335 the_op = gen_rtx_fmt_ee (code, used_mode, m, op);
12336
12337 set_after = gen_rtx_SET (VOIDmode, after, the_op);
12338 set_before = gen_rtx_SET (VOIDmode, before, used_m);
12339 set_atomic = gen_rtx_SET (VOIDmode, used_m,
12340 gen_rtx_UNSPEC (used_mode,
12341 gen_rtvec (1, the_op),
12342 UNSPEC_SYNC_OP));
12343 cc_scratch = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode));
12344
12345 if ((code == PLUS || code == MINUS) && used_mode != mode)
12346 vec = gen_rtvec (5, set_after, set_before, set_atomic, cc_scratch,
12347 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
12348 else
12349 vec = gen_rtvec (4, set_after, set_before, set_atomic, cc_scratch);
12350 emit_insn (gen_rtx_PARALLEL (VOIDmode, vec));
12351
12352 /* Shift and mask the return values properly. */
12353 if (used_mode != mode && before_param)
12354 {
12355 emit_insn (gen_lshrsi3 (before, before, shift));
12356 convert_move (before_param, before, 1);
12357 }
12358
12359 if (used_mode != mode && after_param)
12360 {
12361 emit_insn (gen_lshrsi3 (after, after, shift));
12362 convert_move (after_param, after, 1);
12363 }
12364
12365 /* The previous sequence will end with a branch that's dependent on
12366 the conditional store, so placing an isync will ensure that no
12367 other instructions (especially, no load or store instructions)
12368 can start before the atomic operation completes. */
12369 if (sync_p)
12370 emit_insn (gen_isync ());
12371 }
12372
12373 /* A subroutine of the atomic operation splitters. Jump to LABEL if
12374 COND is true. Mark the jump as unlikely to be taken. */
12375
12376 static void
emit_unlikely_jump(rtx cond,rtx label)12377 emit_unlikely_jump (rtx cond, rtx label)
12378 {
12379 rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
12380 rtx x;
12381
12382 x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
12383 x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
12384 REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_BR_PROB, very_unlikely, NULL_RTX);
12385 }
12386
12387 /* A subroutine of the atomic operation splitters. Emit a load-locked
12388 instruction in MODE. */
12389
12390 static void
emit_load_locked(enum machine_mode mode,rtx reg,rtx mem)12391 emit_load_locked (enum machine_mode mode, rtx reg, rtx mem)
12392 {
12393 rtx (*fn) (rtx, rtx) = NULL;
12394 if (mode == SImode)
12395 fn = gen_load_locked_si;
12396 else if (mode == DImode)
12397 fn = gen_load_locked_di;
12398 emit_insn (fn (reg, mem));
12399 }
12400
12401 /* A subroutine of the atomic operation splitters. Emit a store-conditional
12402 instruction in MODE. */
12403
12404 static void
emit_store_conditional(enum machine_mode mode,rtx res,rtx mem,rtx val)12405 emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val)
12406 {
12407 rtx (*fn) (rtx, rtx, rtx) = NULL;
12408 if (mode == SImode)
12409 fn = gen_store_conditional_si;
12410 else if (mode == DImode)
12411 fn = gen_store_conditional_di;
12412
12413 /* Emit sync before stwcx. to address PPC405 Erratum. */
12414 if (PPC405_ERRATUM77)
12415 emit_insn (gen_memory_barrier ());
12416
12417 emit_insn (fn (res, mem, val));
12418 }
12419
12420 /* Expand an an atomic fetch-and-operate pattern. CODE is the binary operation
12421 to perform. MEM is the memory on which to operate. VAL is the second
12422 operand of the binary operator. BEFORE and AFTER are optional locations to
12423 return the value of MEM either before of after the operation. SCRATCH is
12424 a scratch register. */
12425
12426 void
rs6000_split_atomic_op(enum rtx_code code,rtx mem,rtx val,rtx before,rtx after,rtx scratch)12427 rs6000_split_atomic_op (enum rtx_code code, rtx mem, rtx val,
12428 rtx before, rtx after, rtx scratch)
12429 {
12430 enum machine_mode mode = GET_MODE (mem);
12431 rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
12432
12433 emit_insn (gen_memory_barrier ());
12434
12435 label = gen_label_rtx ();
12436 emit_label (label);
12437 label = gen_rtx_LABEL_REF (VOIDmode, label);
12438
12439 if (before == NULL_RTX)
12440 before = scratch;
12441 emit_load_locked (mode, before, mem);
12442
12443 if (code == NOT)
12444 x = gen_rtx_AND (mode, gen_rtx_NOT (mode, before), val);
12445 else if (code == AND)
12446 x = gen_rtx_UNSPEC (mode, gen_rtvec (2, before, val), UNSPEC_AND);
12447 else
12448 x = gen_rtx_fmt_ee (code, mode, before, val);
12449
12450 if (after != NULL_RTX)
12451 emit_insn (gen_rtx_SET (VOIDmode, after, copy_rtx (x)));
12452 emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
12453
12454 emit_store_conditional (mode, cond, mem, scratch);
12455
12456 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
12457 emit_unlikely_jump (x, label);
12458
12459 emit_insn (gen_isync ());
12460 }
12461
12462 /* Expand an atomic compare and swap operation. MEM is the memory on which
12463 to operate. OLDVAL is the old value to be compared. NEWVAL is the new
12464 value to be stored. SCRATCH is a scratch GPR. */
12465
12466 void
rs6000_split_compare_and_swap(rtx retval,rtx mem,rtx oldval,rtx newval,rtx scratch)12467 rs6000_split_compare_and_swap (rtx retval, rtx mem, rtx oldval, rtx newval,
12468 rtx scratch)
12469 {
12470 enum machine_mode mode = GET_MODE (mem);
12471 rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
12472
12473 emit_insn (gen_memory_barrier ());
12474
12475 label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
12476 label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
12477 emit_label (XEXP (label1, 0));
12478
12479 emit_load_locked (mode, retval, mem);
12480
12481 x = gen_rtx_COMPARE (CCmode, retval, oldval);
12482 emit_insn (gen_rtx_SET (VOIDmode, cond, x));
12483
12484 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
12485 emit_unlikely_jump (x, label2);
12486
12487 emit_move_insn (scratch, newval);
12488 emit_store_conditional (mode, cond, mem, scratch);
12489
12490 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
12491 emit_unlikely_jump (x, label1);
12492
12493 emit_insn (gen_isync ());
12494 emit_label (XEXP (label2, 0));
12495 }
12496
12497 /* Expand an atomic test and set operation. MEM is the memory on which
12498 to operate. VAL is the value set. SCRATCH is a scratch GPR. */
12499
12500 void
rs6000_split_lock_test_and_set(rtx retval,rtx mem,rtx val,rtx scratch)12501 rs6000_split_lock_test_and_set (rtx retval, rtx mem, rtx val, rtx scratch)
12502 {
12503 enum machine_mode mode = GET_MODE (mem);
12504 rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
12505
12506 emit_insn (gen_memory_barrier ());
12507
12508 label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
12509 emit_label (XEXP (label, 0));
12510
12511 emit_load_locked (mode, retval, mem);
12512 emit_move_insn (scratch, val);
12513 emit_store_conditional (mode, cond, mem, scratch);
12514
12515 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
12516 emit_unlikely_jump (x, label);
12517
12518 emit_insn (gen_isync ());
12519 }
12520
12521 void
rs6000_expand_compare_and_swapqhi(rtx dst,rtx mem,rtx oldval,rtx newval)12522 rs6000_expand_compare_and_swapqhi (rtx dst, rtx mem, rtx oldval, rtx newval)
12523 {
12524 enum machine_mode mode = GET_MODE (mem);
12525 rtx addrSI, align, wdst, shift, mask;
12526 HOST_WIDE_INT shift_mask = mode == QImode ? 0x18 : 0x10;
12527 HOST_WIDE_INT imask = GET_MODE_MASK (mode);
12528
12529 /* Shift amount for subword relative to aligned word. */
12530 addrSI = force_reg (SImode, gen_lowpart_common (SImode, XEXP (mem, 0)));
12531 shift = gen_reg_rtx (SImode);
12532 emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
12533 GEN_INT (shift_mask)));
12534 emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
12535
12536 /* Shift and mask old value into position within word. */
12537 oldval = convert_modes (SImode, mode, oldval, 1);
12538 oldval = expand_binop (SImode, and_optab,
12539 oldval, GEN_INT (imask), NULL_RTX,
12540 1, OPTAB_LIB_WIDEN);
12541 emit_insn (gen_ashlsi3 (oldval, oldval, shift));
12542
12543 /* Shift and mask new value into position within word. */
12544 newval = convert_modes (SImode, mode, newval, 1);
12545 newval = expand_binop (SImode, and_optab,
12546 newval, GEN_INT (imask), NULL_RTX,
12547 1, OPTAB_LIB_WIDEN);
12548 emit_insn (gen_ashlsi3 (newval, newval, shift));
12549
12550 /* Mask for insertion. */
12551 mask = gen_reg_rtx (SImode);
12552 emit_move_insn (mask, GEN_INT (imask));
12553 emit_insn (gen_ashlsi3 (mask, mask, shift));
12554
12555 /* Address of aligned word containing subword. */
12556 align = expand_binop (Pmode, and_optab, XEXP (mem, 0), GEN_INT (-4),
12557 NULL_RTX, 1, OPTAB_LIB_WIDEN);
12558 mem = change_address (mem, SImode, align);
12559 set_mem_align (mem, 32);
12560 MEM_VOLATILE_P (mem) = 1;
12561
12562 wdst = gen_reg_rtx (SImode);
12563 emit_insn (gen_sync_compare_and_swapqhi_internal (wdst, mask,
12564 oldval, newval, mem));
12565
12566 emit_move_insn (dst, gen_lowpart (mode, wdst));
12567 }
12568
12569 void
rs6000_split_compare_and_swapqhi(rtx dest,rtx mask,rtx oldval,rtx newval,rtx mem,rtx scratch)12570 rs6000_split_compare_and_swapqhi (rtx dest, rtx mask,
12571 rtx oldval, rtx newval, rtx mem,
12572 rtx scratch)
12573 {
12574 rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
12575
12576 emit_insn (gen_memory_barrier ());
12577 label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
12578 label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
12579 emit_label (XEXP (label1, 0));
12580
12581 emit_load_locked (SImode, scratch, mem);
12582
12583 /* Mask subword within loaded value for comparison with oldval.
12584 Use UNSPEC_AND to avoid clobber.*/
12585 emit_insn (gen_rtx_SET (SImode, dest,
12586 gen_rtx_UNSPEC (SImode,
12587 gen_rtvec (2, scratch, mask),
12588 UNSPEC_AND)));
12589
12590 x = gen_rtx_COMPARE (CCmode, dest, oldval);
12591 emit_insn (gen_rtx_SET (VOIDmode, cond, x));
12592
12593 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
12594 emit_unlikely_jump (x, label2);
12595
12596 /* Clear subword within loaded value for insertion of new value. */
12597 emit_insn (gen_rtx_SET (SImode, scratch,
12598 gen_rtx_AND (SImode,
12599 gen_rtx_NOT (SImode, mask), scratch)));
12600 emit_insn (gen_iorsi3 (scratch, scratch, newval));
12601 emit_store_conditional (SImode, cond, mem, scratch);
12602
12603 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
12604 emit_unlikely_jump (x, label1);
12605
12606 emit_insn (gen_isync ());
12607 emit_label (XEXP (label2, 0));
12608 }
12609
12610
12611 /* Emit instructions to move SRC to DST. Called by splitters for
12612 multi-register moves. It will emit at most one instruction for
12613 each register that is accessed; that is, it won't emit li/lis pairs
12614 (or equivalent for 64-bit code). One of SRC or DST must be a hard
12615 register. */
12616
12617 void
rs6000_split_multireg_move(rtx dst,rtx src)12618 rs6000_split_multireg_move (rtx dst, rtx src)
12619 {
12620 /* The register number of the first register being moved. */
12621 int reg;
12622 /* The mode that is to be moved. */
12623 enum machine_mode mode;
12624 /* The mode that the move is being done in, and its size. */
12625 enum machine_mode reg_mode;
12626 int reg_mode_size;
12627 /* The number of registers that will be moved. */
12628 int nregs;
12629
12630 reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
12631 mode = GET_MODE (dst);
12632 nregs = hard_regno_nregs[reg][mode];
12633 if (FP_REGNO_P (reg))
12634 reg_mode = DFmode;
12635 else if (ALTIVEC_REGNO_P (reg))
12636 reg_mode = V16QImode;
12637 else if (TARGET_E500_DOUBLE && mode == TFmode)
12638 reg_mode = DFmode;
12639 else
12640 reg_mode = word_mode;
12641 reg_mode_size = GET_MODE_SIZE (reg_mode);
12642
12643 gcc_assert (reg_mode_size * nregs == GET_MODE_SIZE (mode));
12644
12645 if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
12646 {
12647 /* Move register range backwards, if we might have destructive
12648 overlap. */
12649 int i;
12650 for (i = nregs - 1; i >= 0; i--)
12651 emit_insn (gen_rtx_SET (VOIDmode,
12652 simplify_gen_subreg (reg_mode, dst, mode,
12653 i * reg_mode_size),
12654 simplify_gen_subreg (reg_mode, src, mode,
12655 i * reg_mode_size)));
12656 }
12657 else
12658 {
12659 int i;
12660 int j = -1;
12661 bool used_update = false;
12662
12663 if (MEM_P (src) && INT_REGNO_P (reg))
12664 {
12665 rtx breg;
12666
12667 if (GET_CODE (XEXP (src, 0)) == PRE_INC
12668 || GET_CODE (XEXP (src, 0)) == PRE_DEC)
12669 {
12670 rtx delta_rtx;
12671 breg = XEXP (XEXP (src, 0), 0);
12672 delta_rtx = (GET_CODE (XEXP (src, 0)) == PRE_INC
12673 ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
12674 : GEN_INT (-GET_MODE_SIZE (GET_MODE (src))));
12675 emit_insn (TARGET_32BIT
12676 ? gen_addsi3 (breg, breg, delta_rtx)
12677 : gen_adddi3 (breg, breg, delta_rtx));
12678 src = replace_equiv_address (src, breg);
12679 }
12680 else if (! rs6000_offsettable_memref_p (src))
12681 {
12682 rtx basereg;
12683 basereg = gen_rtx_REG (Pmode, reg);
12684 emit_insn (gen_rtx_SET (VOIDmode, basereg, XEXP (src, 0)));
12685 src = replace_equiv_address (src, basereg);
12686 }
12687
12688 breg = XEXP (src, 0);
12689 if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
12690 breg = XEXP (breg, 0);
12691
12692 /* If the base register we are using to address memory is
12693 also a destination reg, then change that register last. */
12694 if (REG_P (breg)
12695 && REGNO (breg) >= REGNO (dst)
12696 && REGNO (breg) < REGNO (dst) + nregs)
12697 j = REGNO (breg) - REGNO (dst);
12698 }
12699
12700 if (GET_CODE (dst) == MEM && INT_REGNO_P (reg))
12701 {
12702 rtx breg;
12703
12704 if (GET_CODE (XEXP (dst, 0)) == PRE_INC
12705 || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
12706 {
12707 rtx delta_rtx;
12708 breg = XEXP (XEXP (dst, 0), 0);
12709 delta_rtx = (GET_CODE (XEXP (dst, 0)) == PRE_INC
12710 ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
12711 : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst))));
12712
12713 /* We have to update the breg before doing the store.
12714 Use store with update, if available. */
12715
12716 if (TARGET_UPDATE)
12717 {
12718 rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
12719 emit_insn (TARGET_32BIT
12720 ? (TARGET_POWERPC64
12721 ? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
12722 : gen_movsi_update (breg, breg, delta_rtx, nsrc))
12723 : gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
12724 used_update = true;
12725 }
12726 else
12727 emit_insn (TARGET_32BIT
12728 ? gen_addsi3 (breg, breg, delta_rtx)
12729 : gen_adddi3 (breg, breg, delta_rtx));
12730 dst = replace_equiv_address (dst, breg);
12731 }
12732 else
12733 gcc_assert (rs6000_offsettable_memref_p (dst));
12734 }
12735
12736 for (i = 0; i < nregs; i++)
12737 {
12738 /* Calculate index to next subword. */
12739 ++j;
12740 if (j == nregs)
12741 j = 0;
12742
12743 /* If compiler already emitted move of first word by
12744 store with update, no need to do anything. */
12745 if (j == 0 && used_update)
12746 continue;
12747
12748 emit_insn (gen_rtx_SET (VOIDmode,
12749 simplify_gen_subreg (reg_mode, dst, mode,
12750 j * reg_mode_size),
12751 simplify_gen_subreg (reg_mode, src, mode,
12752 j * reg_mode_size)));
12753 }
12754 }
12755 }
12756
12757
12758 /* This page contains routines that are used to determine what the
12759 function prologue and epilogue code will do and write them out. */
12760
12761 /* Return the first fixed-point register that is required to be
12762 saved. 32 if none. */
12763
12764 int
first_reg_to_save(void)12765 first_reg_to_save (void)
12766 {
12767 int first_reg;
12768
12769 /* Find lowest numbered live register. */
12770 for (first_reg = 13; first_reg <= 31; first_reg++)
12771 if (regs_ever_live[first_reg]
12772 && (! call_used_regs[first_reg]
12773 || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
12774 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
12775 || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
12776 || (TARGET_TOC && TARGET_MINIMAL_TOC)))))
12777 break;
12778
12779 #if TARGET_MACHO
12780 if (flag_pic
12781 && current_function_uses_pic_offset_table
12782 && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
12783 return RS6000_PIC_OFFSET_TABLE_REGNUM;
12784 #endif
12785
12786 return first_reg;
12787 }
12788
12789 /* Similar, for FP regs. */
12790
12791 int
first_fp_reg_to_save(void)12792 first_fp_reg_to_save (void)
12793 {
12794 int first_reg;
12795
12796 /* Find lowest numbered live register. */
12797 for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
12798 if (regs_ever_live[first_reg])
12799 break;
12800
12801 return first_reg;
12802 }
12803
12804 /* Similar, for AltiVec regs. */
12805
12806 static int
first_altivec_reg_to_save(void)12807 first_altivec_reg_to_save (void)
12808 {
12809 int i;
12810
12811 /* Stack frame remains as is unless we are in AltiVec ABI. */
12812 if (! TARGET_ALTIVEC_ABI)
12813 return LAST_ALTIVEC_REGNO + 1;
12814
12815 /* On Darwin, the unwind routines are compiled without
12816 TARGET_ALTIVEC, and use save_world to save/restore the
12817 altivec registers when necessary. */
12818 if (DEFAULT_ABI == ABI_DARWIN && current_function_calls_eh_return
12819 && ! TARGET_ALTIVEC)
12820 return FIRST_ALTIVEC_REGNO + 20;
12821
12822 /* Find lowest numbered live register. */
12823 for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
12824 if (regs_ever_live[i])
12825 break;
12826
12827 return i;
12828 }
12829
12830 /* Return a 32-bit mask of the AltiVec registers we need to set in
12831 VRSAVE. Bit n of the return value is 1 if Vn is live. The MSB in
12832 the 32-bit word is 0. */
12833
12834 static unsigned int
compute_vrsave_mask(void)12835 compute_vrsave_mask (void)
12836 {
12837 unsigned int i, mask = 0;
12838
12839 /* On Darwin, the unwind routines are compiled without
12840 TARGET_ALTIVEC, and use save_world to save/restore the
12841 call-saved altivec registers when necessary. */
12842 if (DEFAULT_ABI == ABI_DARWIN && current_function_calls_eh_return
12843 && ! TARGET_ALTIVEC)
12844 mask |= 0xFFF;
12845
12846 /* First, find out if we use _any_ altivec registers. */
12847 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
12848 if (regs_ever_live[i])
12849 mask |= ALTIVEC_REG_BIT (i);
12850
12851 if (mask == 0)
12852 return mask;
12853
12854 /* Next, remove the argument registers from the set. These must
12855 be in the VRSAVE mask set by the caller, so we don't need to add
12856 them in again. More importantly, the mask we compute here is
12857 used to generate CLOBBERs in the set_vrsave insn, and we do not
12858 wish the argument registers to die. */
12859 for (i = cfun->args_info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
12860 mask &= ~ALTIVEC_REG_BIT (i);
12861
12862 /* Similarly, remove the return value from the set. */
12863 {
12864 bool yes = false;
12865 diddle_return_value (is_altivec_return_reg, &yes);
12866 if (yes)
12867 mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
12868 }
12869
12870 return mask;
12871 }
12872
12873 /* For a very restricted set of circumstances, we can cut down the
12874 size of prologues/epilogues by calling our own save/restore-the-world
12875 routines. */
12876
12877 static void
compute_save_world_info(rs6000_stack_t * info_ptr)12878 compute_save_world_info (rs6000_stack_t *info_ptr)
12879 {
12880 info_ptr->world_save_p = 1;
12881 info_ptr->world_save_p
12882 = (WORLD_SAVE_P (info_ptr)
12883 && DEFAULT_ABI == ABI_DARWIN
12884 && ! (current_function_calls_setjmp && flag_exceptions)
12885 && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
12886 && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
12887 && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
12888 && info_ptr->cr_save_p);
12889
12890 /* This will not work in conjunction with sibcalls. Make sure there
12891 are none. (This check is expensive, but seldom executed.) */
12892 if (WORLD_SAVE_P (info_ptr))
12893 {
12894 rtx insn;
12895 for ( insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
12896 if ( GET_CODE (insn) == CALL_INSN
12897 && SIBLING_CALL_P (insn))
12898 {
12899 info_ptr->world_save_p = 0;
12900 break;
12901 }
12902 }
12903
12904 if (WORLD_SAVE_P (info_ptr))
12905 {
12906 /* Even if we're not touching VRsave, make sure there's room on the
12907 stack for it, if it looks like we're calling SAVE_WORLD, which
12908 will attempt to save it. */
12909 info_ptr->vrsave_size = 4;
12910
12911 /* "Save" the VRsave register too if we're saving the world. */
12912 if (info_ptr->vrsave_mask == 0)
12913 info_ptr->vrsave_mask = compute_vrsave_mask ();
12914
12915 /* Because the Darwin register save/restore routines only handle
12916 F14 .. F31 and V20 .. V31 as per the ABI, perform a consistency
12917 check. */
12918 gcc_assert (info_ptr->first_fp_reg_save >= FIRST_SAVED_FP_REGNO
12919 && (info_ptr->first_altivec_reg_save
12920 >= FIRST_SAVED_ALTIVEC_REGNO));
12921 }
12922 return;
12923 }
12924
12925
12926 static void
is_altivec_return_reg(rtx reg,void * xyes)12927 is_altivec_return_reg (rtx reg, void *xyes)
12928 {
12929 bool *yes = (bool *) xyes;
12930 if (REGNO (reg) == ALTIVEC_ARG_RETURN)
12931 *yes = true;
12932 }
12933
12934
12935 /* Calculate the stack information for the current function. This is
12936 complicated by having two separate calling sequences, the AIX calling
12937 sequence and the V.4 calling sequence.
12938
12939 AIX (and Darwin/Mac OS X) stack frames look like:
12940 32-bit 64-bit
12941 SP----> +---------------------------------------+
12942 | back chain to caller | 0 0
12943 +---------------------------------------+
12944 | saved CR | 4 8 (8-11)
12945 +---------------------------------------+
12946 | saved LR | 8 16
12947 +---------------------------------------+
12948 | reserved for compilers | 12 24
12949 +---------------------------------------+
12950 | reserved for binders | 16 32
12951 +---------------------------------------+
12952 | saved TOC pointer | 20 40
12953 +---------------------------------------+
12954 | Parameter save area (P) | 24 48
12955 +---------------------------------------+
12956 | Alloca space (A) | 24+P etc.
12957 +---------------------------------------+
12958 | Local variable space (L) | 24+P+A
12959 +---------------------------------------+
12960 | Float/int conversion temporary (X) | 24+P+A+L
12961 +---------------------------------------+
12962 | Save area for AltiVec registers (W) | 24+P+A+L+X
12963 +---------------------------------------+
12964 | AltiVec alignment padding (Y) | 24+P+A+L+X+W
12965 +---------------------------------------+
12966 | Save area for VRSAVE register (Z) | 24+P+A+L+X+W+Y
12967 +---------------------------------------+
12968 | Save area for GP registers (G) | 24+P+A+X+L+X+W+Y+Z
12969 +---------------------------------------+
12970 | Save area for FP registers (F) | 24+P+A+X+L+X+W+Y+Z+G
12971 +---------------------------------------+
12972 old SP->| back chain to caller's caller |
12973 +---------------------------------------+
12974
12975 The required alignment for AIX configurations is two words (i.e., 8
12976 or 16 bytes).
12977
12978
12979 V.4 stack frames look like:
12980
12981 SP----> +---------------------------------------+
12982 | back chain to caller | 0
12983 +---------------------------------------+
12984 | caller's saved LR | 4
12985 +---------------------------------------+
12986 | Parameter save area (P) | 8
12987 +---------------------------------------+
12988 | Alloca space (A) | 8+P
12989 +---------------------------------------+
12990 | Varargs save area (V) | 8+P+A
12991 +---------------------------------------+
12992 | Local variable space (L) | 8+P+A+V
12993 +---------------------------------------+
12994 | Float/int conversion temporary (X) | 8+P+A+V+L
12995 +---------------------------------------+
12996 | Save area for AltiVec registers (W) | 8+P+A+V+L+X
12997 +---------------------------------------+
12998 | AltiVec alignment padding (Y) | 8+P+A+V+L+X+W
12999 +---------------------------------------+
13000 | Save area for VRSAVE register (Z) | 8+P+A+V+L+X+W+Y
13001 +---------------------------------------+
13002 | SPE: area for 64-bit GP registers |
13003 +---------------------------------------+
13004 | SPE alignment padding |
13005 +---------------------------------------+
13006 | saved CR (C) | 8+P+A+V+L+X+W+Y+Z
13007 +---------------------------------------+
13008 | Save area for GP registers (G) | 8+P+A+V+L+X+W+Y+Z+C
13009 +---------------------------------------+
13010 | Save area for FP registers (F) | 8+P+A+V+L+X+W+Y+Z+C+G
13011 +---------------------------------------+
13012 old SP->| back chain to caller's caller |
13013 +---------------------------------------+
13014
13015 The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
13016 given. (But note below and in sysv4.h that we require only 8 and
13017 may round up the size of our stack frame anyways. The historical
13018 reason is early versions of powerpc-linux which didn't properly
13019 align the stack at program startup. A happy side-effect is that
13020 -mno-eabi libraries can be used with -meabi programs.)
13021
13022 The EABI configuration defaults to the V.4 layout. However,
13023 the stack alignment requirements may differ. If -mno-eabi is not
13024 given, the required stack alignment is 8 bytes; if -mno-eabi is
13025 given, the required alignment is 16 bytes. (But see V.4 comment
13026 above.) */
13027
13028 #ifndef ABI_STACK_BOUNDARY
13029 #define ABI_STACK_BOUNDARY STACK_BOUNDARY
13030 #endif
13031
13032 static rs6000_stack_t *
rs6000_stack_info(void)13033 rs6000_stack_info (void)
13034 {
13035 static rs6000_stack_t info;
13036 rs6000_stack_t *info_ptr = &info;
13037 int reg_size = TARGET_32BIT ? 4 : 8;
13038 int ehrd_size;
13039 int save_align;
13040 HOST_WIDE_INT non_fixed_size;
13041
13042 memset (&info, 0, sizeof (info));
13043
13044 if (TARGET_SPE)
13045 {
13046 /* Cache value so we don't rescan instruction chain over and over. */
13047 if (cfun->machine->insn_chain_scanned_p == 0)
13048 cfun->machine->insn_chain_scanned_p
13049 = spe_func_has_64bit_regs_p () + 1;
13050 info_ptr->spe_64bit_regs_used = cfun->machine->insn_chain_scanned_p - 1;
13051 }
13052
13053 /* Select which calling sequence. */
13054 info_ptr->abi = DEFAULT_ABI;
13055
13056 /* Calculate which registers need to be saved & save area size. */
13057 info_ptr->first_gp_reg_save = first_reg_to_save ();
13058 /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
13059 even if it currently looks like we won't. */
13060 if (((TARGET_TOC && TARGET_MINIMAL_TOC)
13061 || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
13062 || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
13063 && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
13064 info_ptr->gp_size = reg_size * (32 - RS6000_PIC_OFFSET_TABLE_REGNUM);
13065 else
13066 info_ptr->gp_size = reg_size * (32 - info_ptr->first_gp_reg_save);
13067
13068 /* For the SPE, we have an additional upper 32-bits on each GPR.
13069 Ideally we should save the entire 64-bits only when the upper
13070 half is used in SIMD instructions. Since we only record
13071 registers live (not the size they are used in), this proves
13072 difficult because we'd have to traverse the instruction chain at
13073 the right time, taking reload into account. This is a real pain,
13074 so we opt to save the GPRs in 64-bits always if but one register
13075 gets used in 64-bits. Otherwise, all the registers in the frame
13076 get saved in 32-bits.
13077
13078 So... since when we save all GPRs (except the SP) in 64-bits, the
13079 traditional GP save area will be empty. */
13080 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
13081 info_ptr->gp_size = 0;
13082
13083 info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
13084 info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
13085
13086 info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
13087 info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
13088 - info_ptr->first_altivec_reg_save);
13089
13090 /* Does this function call anything? */
13091 info_ptr->calls_p = (! current_function_is_leaf
13092 || cfun->machine->ra_needs_full_frame);
13093
13094 /* Determine if we need to save the link register. */
13095 if ((DEFAULT_ABI == ABI_AIX
13096 && current_function_profile
13097 && !TARGET_PROFILE_KERNEL)
13098 #ifdef TARGET_RELOCATABLE
13099 || (TARGET_RELOCATABLE && (get_pool_size () != 0))
13100 #endif
13101 || (info_ptr->first_fp_reg_save != 64
13102 && !FP_SAVE_INLINE (info_ptr->first_fp_reg_save))
13103 || info_ptr->first_altivec_reg_save <= LAST_ALTIVEC_REGNO
13104 || (DEFAULT_ABI == ABI_V4 && current_function_calls_alloca)
13105 || info_ptr->calls_p
13106 || rs6000_ra_ever_killed ())
13107 {
13108 info_ptr->lr_save_p = 1;
13109 regs_ever_live[LINK_REGISTER_REGNUM] = 1;
13110 }
13111
13112 /* Determine if we need to save the condition code registers. */
13113 if (regs_ever_live[CR2_REGNO]
13114 || regs_ever_live[CR3_REGNO]
13115 || regs_ever_live[CR4_REGNO])
13116 {
13117 info_ptr->cr_save_p = 1;
13118 if (DEFAULT_ABI == ABI_V4)
13119 info_ptr->cr_size = reg_size;
13120 }
13121
13122 /* If the current function calls __builtin_eh_return, then we need
13123 to allocate stack space for registers that will hold data for
13124 the exception handler. */
13125 if (current_function_calls_eh_return)
13126 {
13127 unsigned int i;
13128 for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
13129 continue;
13130
13131 /* SPE saves EH registers in 64-bits. */
13132 ehrd_size = i * (TARGET_SPE_ABI
13133 && info_ptr->spe_64bit_regs_used != 0
13134 ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
13135 }
13136 else
13137 ehrd_size = 0;
13138
13139 /* Determine various sizes. */
13140 info_ptr->reg_size = reg_size;
13141 info_ptr->fixed_size = RS6000_SAVE_AREA;
13142 info_ptr->vars_size = RS6000_ALIGN (get_frame_size (), 8);
13143 info_ptr->parm_size = RS6000_ALIGN (current_function_outgoing_args_size,
13144 TARGET_ALTIVEC ? 16 : 8);
13145 if (FRAME_GROWS_DOWNWARD)
13146 info_ptr->vars_size
13147 += RS6000_ALIGN (info_ptr->fixed_size + info_ptr->vars_size
13148 + info_ptr->parm_size,
13149 ABI_STACK_BOUNDARY / BITS_PER_UNIT)
13150 - (info_ptr->fixed_size + info_ptr->vars_size
13151 + info_ptr->parm_size);
13152
13153 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
13154 info_ptr->spe_gp_size = 8 * (32 - info_ptr->first_gp_reg_save);
13155 else
13156 info_ptr->spe_gp_size = 0;
13157
13158 if (TARGET_ALTIVEC_ABI)
13159 info_ptr->vrsave_mask = compute_vrsave_mask ();
13160 else
13161 info_ptr->vrsave_mask = 0;
13162
13163 if (TARGET_ALTIVEC_VRSAVE && info_ptr->vrsave_mask)
13164 info_ptr->vrsave_size = 4;
13165 else
13166 info_ptr->vrsave_size = 0;
13167
13168 compute_save_world_info (info_ptr);
13169
13170 /* Calculate the offsets. */
13171 switch (DEFAULT_ABI)
13172 {
13173 case ABI_NONE:
13174 default:
13175 gcc_unreachable ();
13176
13177 case ABI_AIX:
13178 case ABI_DARWIN:
13179 info_ptr->fp_save_offset = - info_ptr->fp_size;
13180 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
13181
13182 if (TARGET_ALTIVEC_ABI)
13183 {
13184 info_ptr->vrsave_save_offset
13185 = info_ptr->gp_save_offset - info_ptr->vrsave_size;
13186
13187 /* Align stack so vector save area is on a quadword boundary.
13188 The padding goes above the vectors. */
13189 if (info_ptr->altivec_size != 0)
13190 info_ptr->altivec_padding_size
13191 = info_ptr->vrsave_save_offset & 0xF;
13192 else
13193 info_ptr->altivec_padding_size = 0;
13194
13195 info_ptr->altivec_save_offset
13196 = info_ptr->vrsave_save_offset
13197 - info_ptr->altivec_padding_size
13198 - info_ptr->altivec_size;
13199 gcc_assert (info_ptr->altivec_size == 0
13200 || info_ptr->altivec_save_offset % 16 == 0);
13201
13202 /* Adjust for AltiVec case. */
13203 info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
13204 }
13205 else
13206 info_ptr->ehrd_offset = info_ptr->gp_save_offset - ehrd_size;
13207 info_ptr->cr_save_offset = reg_size; /* first word when 64-bit. */
13208 info_ptr->lr_save_offset = 2*reg_size;
13209 break;
13210
13211 case ABI_V4:
13212 info_ptr->fp_save_offset = - info_ptr->fp_size;
13213 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
13214 info_ptr->cr_save_offset = info_ptr->gp_save_offset - info_ptr->cr_size;
13215
13216 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
13217 {
13218 /* Align stack so SPE GPR save area is aligned on a
13219 double-word boundary. */
13220 if (info_ptr->spe_gp_size != 0)
13221 info_ptr->spe_padding_size
13222 = 8 - (-info_ptr->cr_save_offset % 8);
13223 else
13224 info_ptr->spe_padding_size = 0;
13225
13226 info_ptr->spe_gp_save_offset
13227 = info_ptr->cr_save_offset
13228 - info_ptr->spe_padding_size
13229 - info_ptr->spe_gp_size;
13230
13231 /* Adjust for SPE case. */
13232 info_ptr->ehrd_offset = info_ptr->spe_gp_save_offset;
13233 }
13234 else if (TARGET_ALTIVEC_ABI)
13235 {
13236 info_ptr->vrsave_save_offset
13237 = info_ptr->cr_save_offset - info_ptr->vrsave_size;
13238
13239 /* Align stack so vector save area is on a quadword boundary. */
13240 if (info_ptr->altivec_size != 0)
13241 info_ptr->altivec_padding_size
13242 = 16 - (-info_ptr->vrsave_save_offset % 16);
13243 else
13244 info_ptr->altivec_padding_size = 0;
13245
13246 info_ptr->altivec_save_offset
13247 = info_ptr->vrsave_save_offset
13248 - info_ptr->altivec_padding_size
13249 - info_ptr->altivec_size;
13250
13251 /* Adjust for AltiVec case. */
13252 info_ptr->ehrd_offset = info_ptr->altivec_save_offset;
13253 }
13254 else
13255 info_ptr->ehrd_offset = info_ptr->cr_save_offset;
13256 info_ptr->ehrd_offset -= ehrd_size;
13257 info_ptr->lr_save_offset = reg_size;
13258 break;
13259 }
13260
13261 save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
13262 info_ptr->save_size = RS6000_ALIGN (info_ptr->fp_size
13263 + info_ptr->gp_size
13264 + info_ptr->altivec_size
13265 + info_ptr->altivec_padding_size
13266 + info_ptr->spe_gp_size
13267 + info_ptr->spe_padding_size
13268 + ehrd_size
13269 + info_ptr->cr_size
13270 + info_ptr->vrsave_size,
13271 save_align);
13272
13273 non_fixed_size = (info_ptr->vars_size
13274 + info_ptr->parm_size
13275 + info_ptr->save_size);
13276
13277 info_ptr->total_size = RS6000_ALIGN (non_fixed_size + info_ptr->fixed_size,
13278 ABI_STACK_BOUNDARY / BITS_PER_UNIT);
13279
13280 /* Determine if we need to allocate any stack frame:
13281
13282 For AIX we need to push the stack if a frame pointer is needed
13283 (because the stack might be dynamically adjusted), if we are
13284 debugging, if we make calls, or if the sum of fp_save, gp_save,
13285 and local variables are more than the space needed to save all
13286 non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
13287 + 18*8 = 288 (GPR13 reserved).
13288
13289 For V.4 we don't have the stack cushion that AIX uses, but assume
13290 that the debugger can handle stackless frames. */
13291
13292 if (info_ptr->calls_p)
13293 info_ptr->push_p = 1;
13294
13295 else if (DEFAULT_ABI == ABI_V4)
13296 info_ptr->push_p = non_fixed_size != 0;
13297
13298 else if (frame_pointer_needed)
13299 info_ptr->push_p = 1;
13300
13301 else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
13302 info_ptr->push_p = 1;
13303
13304 else
13305 info_ptr->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
13306
13307 /* Zero offsets if we're not saving those registers. */
13308 if (info_ptr->fp_size == 0)
13309 info_ptr->fp_save_offset = 0;
13310
13311 if (info_ptr->gp_size == 0)
13312 info_ptr->gp_save_offset = 0;
13313
13314 if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
13315 info_ptr->altivec_save_offset = 0;
13316
13317 if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
13318 info_ptr->vrsave_save_offset = 0;
13319
13320 if (! TARGET_SPE_ABI
13321 || info_ptr->spe_64bit_regs_used == 0
13322 || info_ptr->spe_gp_size == 0)
13323 info_ptr->spe_gp_save_offset = 0;
13324
13325 if (! info_ptr->lr_save_p)
13326 info_ptr->lr_save_offset = 0;
13327
13328 if (! info_ptr->cr_save_p)
13329 info_ptr->cr_save_offset = 0;
13330
13331 return info_ptr;
13332 }
13333
13334 /* Return true if the current function uses any GPRs in 64-bit SIMD
13335 mode. */
13336
13337 static bool
spe_func_has_64bit_regs_p(void)13338 spe_func_has_64bit_regs_p (void)
13339 {
13340 rtx insns, insn;
13341
13342 /* Functions that save and restore all the call-saved registers will
13343 need to save/restore the registers in 64-bits. */
13344 if (current_function_calls_eh_return
13345 || current_function_calls_setjmp
13346 || current_function_has_nonlocal_goto)
13347 return true;
13348
13349 insns = get_insns ();
13350
13351 for (insn = NEXT_INSN (insns); insn != NULL_RTX; insn = NEXT_INSN (insn))
13352 {
13353 if (INSN_P (insn))
13354 {
13355 rtx i;
13356
13357 /* FIXME: This should be implemented with attributes...
13358
13359 (set_attr "spe64" "true")....then,
13360 if (get_spe64(insn)) return true;
13361
13362 It's the only reliable way to do the stuff below. */
13363
13364 i = PATTERN (insn);
13365 if (GET_CODE (i) == SET)
13366 {
13367 enum machine_mode mode = GET_MODE (SET_SRC (i));
13368
13369 if (SPE_VECTOR_MODE (mode))
13370 return true;
13371 if (TARGET_E500_DOUBLE && mode == DFmode)
13372 return true;
13373 }
13374 }
13375 }
13376
13377 return false;
13378 }
13379
13380 static void
debug_stack_info(rs6000_stack_t * info)13381 debug_stack_info (rs6000_stack_t *info)
13382 {
13383 const char *abi_string;
13384
13385 if (! info)
13386 info = rs6000_stack_info ();
13387
13388 fprintf (stderr, "\nStack information for function %s:\n",
13389 ((current_function_decl && DECL_NAME (current_function_decl))
13390 ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
13391 : "<unknown>"));
13392
13393 switch (info->abi)
13394 {
13395 default: abi_string = "Unknown"; break;
13396 case ABI_NONE: abi_string = "NONE"; break;
13397 case ABI_AIX: abi_string = "AIX"; break;
13398 case ABI_DARWIN: abi_string = "Darwin"; break;
13399 case ABI_V4: abi_string = "V.4"; break;
13400 }
13401
13402 fprintf (stderr, "\tABI = %5s\n", abi_string);
13403
13404 if (TARGET_ALTIVEC_ABI)
13405 fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
13406
13407 if (TARGET_SPE_ABI)
13408 fprintf (stderr, "\tSPE ABI extensions enabled.\n");
13409
13410 if (info->first_gp_reg_save != 32)
13411 fprintf (stderr, "\tfirst_gp_reg_save = %5d\n", info->first_gp_reg_save);
13412
13413 if (info->first_fp_reg_save != 64)
13414 fprintf (stderr, "\tfirst_fp_reg_save = %5d\n", info->first_fp_reg_save);
13415
13416 if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
13417 fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
13418 info->first_altivec_reg_save);
13419
13420 if (info->lr_save_p)
13421 fprintf (stderr, "\tlr_save_p = %5d\n", info->lr_save_p);
13422
13423 if (info->cr_save_p)
13424 fprintf (stderr, "\tcr_save_p = %5d\n", info->cr_save_p);
13425
13426 if (info->vrsave_mask)
13427 fprintf (stderr, "\tvrsave_mask = 0x%x\n", info->vrsave_mask);
13428
13429 if (info->push_p)
13430 fprintf (stderr, "\tpush_p = %5d\n", info->push_p);
13431
13432 if (info->calls_p)
13433 fprintf (stderr, "\tcalls_p = %5d\n", info->calls_p);
13434
13435 if (info->gp_save_offset)
13436 fprintf (stderr, "\tgp_save_offset = %5d\n", info->gp_save_offset);
13437
13438 if (info->fp_save_offset)
13439 fprintf (stderr, "\tfp_save_offset = %5d\n", info->fp_save_offset);
13440
13441 if (info->altivec_save_offset)
13442 fprintf (stderr, "\taltivec_save_offset = %5d\n",
13443 info->altivec_save_offset);
13444
13445 if (info->spe_gp_save_offset)
13446 fprintf (stderr, "\tspe_gp_save_offset = %5d\n",
13447 info->spe_gp_save_offset);
13448
13449 if (info->vrsave_save_offset)
13450 fprintf (stderr, "\tvrsave_save_offset = %5d\n",
13451 info->vrsave_save_offset);
13452
13453 if (info->lr_save_offset)
13454 fprintf (stderr, "\tlr_save_offset = %5d\n", info->lr_save_offset);
13455
13456 if (info->cr_save_offset)
13457 fprintf (stderr, "\tcr_save_offset = %5d\n", info->cr_save_offset);
13458
13459 if (info->varargs_save_offset)
13460 fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
13461
13462 if (info->total_size)
13463 fprintf (stderr, "\ttotal_size = "HOST_WIDE_INT_PRINT_DEC"\n",
13464 info->total_size);
13465
13466 if (info->vars_size)
13467 fprintf (stderr, "\tvars_size = "HOST_WIDE_INT_PRINT_DEC"\n",
13468 info->vars_size);
13469
13470 if (info->parm_size)
13471 fprintf (stderr, "\tparm_size = %5d\n", info->parm_size);
13472
13473 if (info->fixed_size)
13474 fprintf (stderr, "\tfixed_size = %5d\n", info->fixed_size);
13475
13476 if (info->gp_size)
13477 fprintf (stderr, "\tgp_size = %5d\n", info->gp_size);
13478
13479 if (info->spe_gp_size)
13480 fprintf (stderr, "\tspe_gp_size = %5d\n", info->spe_gp_size);
13481
13482 if (info->fp_size)
13483 fprintf (stderr, "\tfp_size = %5d\n", info->fp_size);
13484
13485 if (info->altivec_size)
13486 fprintf (stderr, "\taltivec_size = %5d\n", info->altivec_size);
13487
13488 if (info->vrsave_size)
13489 fprintf (stderr, "\tvrsave_size = %5d\n", info->vrsave_size);
13490
13491 if (info->altivec_padding_size)
13492 fprintf (stderr, "\taltivec_padding_size= %5d\n",
13493 info->altivec_padding_size);
13494
13495 if (info->spe_padding_size)
13496 fprintf (stderr, "\tspe_padding_size = %5d\n",
13497 info->spe_padding_size);
13498
13499 if (info->cr_size)
13500 fprintf (stderr, "\tcr_size = %5d\n", info->cr_size);
13501
13502 if (info->save_size)
13503 fprintf (stderr, "\tsave_size = %5d\n", info->save_size);
13504
13505 if (info->reg_size != 4)
13506 fprintf (stderr, "\treg_size = %5d\n", info->reg_size);
13507
13508 fprintf (stderr, "\n");
13509 }
13510
13511 rtx
rs6000_return_addr(int count,rtx frame)13512 rs6000_return_addr (int count, rtx frame)
13513 {
13514 /* Currently we don't optimize very well between prolog and body
13515 code and for PIC code the code can be actually quite bad, so
13516 don't try to be too clever here. */
13517 if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
13518 {
13519 cfun->machine->ra_needs_full_frame = 1;
13520
13521 return
13522 gen_rtx_MEM
13523 (Pmode,
13524 memory_address
13525 (Pmode,
13526 plus_constant (copy_to_reg
13527 (gen_rtx_MEM (Pmode,
13528 memory_address (Pmode, frame))),
13529 RETURN_ADDRESS_OFFSET)));
13530 }
13531
13532 cfun->machine->ra_need_lr = 1;
13533 return get_hard_reg_initial_val (Pmode, LINK_REGISTER_REGNUM);
13534 }
13535
13536 /* Say whether a function is a candidate for sibcall handling or not.
13537 We do not allow indirect calls to be optimized into sibling calls.
13538 Also, we can't do it if there are any vector parameters; there's
13539 nowhere to put the VRsave code so it works; note that functions with
13540 vector parameters are required to have a prototype, so the argument
13541 type info must be available here. (The tail recursion case can work
13542 with vector parameters, but there's no way to distinguish here.) */
13543 static bool
rs6000_function_ok_for_sibcall(tree decl,tree exp ATTRIBUTE_UNUSED)13544 rs6000_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
13545 {
13546 tree type;
13547 if (decl)
13548 {
13549 if (TARGET_ALTIVEC_VRSAVE)
13550 {
13551 for (type = TYPE_ARG_TYPES (TREE_TYPE (decl));
13552 type; type = TREE_CHAIN (type))
13553 {
13554 if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
13555 return false;
13556 }
13557 }
13558 if (DEFAULT_ABI == ABI_DARWIN
13559 || ((*targetm.binds_local_p) (decl)
13560 && (DEFAULT_ABI != ABI_AIX || !DECL_EXTERNAL (decl))))
13561 {
13562 tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
13563
13564 if (!lookup_attribute ("longcall", attr_list)
13565 || lookup_attribute ("shortcall", attr_list))
13566 return true;
13567 }
13568 }
13569 return false;
13570 }
13571
13572 /* NULL if INSN insn is valid within a low-overhead loop.
13573 Otherwise return why doloop cannot be applied.
13574 PowerPC uses the COUNT register for branch on table instructions. */
13575
13576 static const char *
rs6000_invalid_within_doloop(rtx insn)13577 rs6000_invalid_within_doloop (rtx insn)
13578 {
13579 if (CALL_P (insn))
13580 return "Function call in the loop.";
13581
13582 if (JUMP_P (insn)
13583 && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
13584 || GET_CODE (PATTERN (insn)) == ADDR_VEC))
13585 return "Computed branch in the loop.";
13586
13587 return NULL;
13588 }
13589
13590 static int
rs6000_ra_ever_killed(void)13591 rs6000_ra_ever_killed (void)
13592 {
13593 rtx top;
13594 rtx reg;
13595 rtx insn;
13596
13597 if (current_function_is_thunk)
13598 return 0;
13599
13600 /* regs_ever_live has LR marked as used if any sibcalls are present,
13601 but this should not force saving and restoring in the
13602 pro/epilogue. Likewise, reg_set_between_p thinks a sibcall
13603 clobbers LR, so that is inappropriate. */
13604
13605 /* Also, the prologue can generate a store into LR that
13606 doesn't really count, like this:
13607
13608 move LR->R0
13609 bcl to set PIC register
13610 move LR->R31
13611 move R0->LR
13612
13613 When we're called from the epilogue, we need to avoid counting
13614 this as a store. */
13615
13616 push_topmost_sequence ();
13617 top = get_insns ();
13618 pop_topmost_sequence ();
13619 reg = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
13620
13621 for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
13622 {
13623 if (INSN_P (insn))
13624 {
13625 if (CALL_P (insn))
13626 {
13627 if (!SIBLING_CALL_P (insn))
13628 return 1;
13629 }
13630 else if (find_regno_note (insn, REG_INC, LINK_REGISTER_REGNUM))
13631 return 1;
13632 else if (set_of (reg, insn) != NULL_RTX
13633 && !prologue_epilogue_contains (insn))
13634 return 1;
13635 }
13636 }
13637 return 0;
13638 }
13639
13640 /* Add a REG_MAYBE_DEAD note to the insn. */
13641 static void
rs6000_maybe_dead(rtx insn)13642 rs6000_maybe_dead (rtx insn)
13643 {
13644 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD,
13645 const0_rtx,
13646 REG_NOTES (insn));
13647 }
13648
13649 /* Emit instructions needed to load the TOC register.
13650 This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
13651 a constant pool; or for SVR4 -fpic. */
13652
13653 void
rs6000_emit_load_toc_table(int fromprolog)13654 rs6000_emit_load_toc_table (int fromprolog)
13655 {
13656 rtx dest, insn;
13657 dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
13658
13659 if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic)
13660 {
13661 char buf[30];
13662 rtx lab, tmp1, tmp2, got, tempLR;
13663
13664 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
13665 lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
13666 if (flag_pic == 2)
13667 got = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
13668 else
13669 got = rs6000_got_sym ();
13670 tmp1 = tmp2 = dest;
13671 if (!fromprolog)
13672 {
13673 tmp1 = gen_reg_rtx (Pmode);
13674 tmp2 = gen_reg_rtx (Pmode);
13675 }
13676 tempLR = (fromprolog
13677 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
13678 : gen_reg_rtx (Pmode));
13679 insn = emit_insn (gen_load_toc_v4_PIC_1 (tempLR, lab));
13680 if (fromprolog)
13681 rs6000_maybe_dead (insn);
13682 insn = emit_move_insn (tmp1, tempLR);
13683 if (fromprolog)
13684 rs6000_maybe_dead (insn);
13685 insn = emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
13686 if (fromprolog)
13687 rs6000_maybe_dead (insn);
13688 insn = emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
13689 if (fromprolog)
13690 rs6000_maybe_dead (insn);
13691 }
13692 else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
13693 {
13694 rtx tempLR = (fromprolog
13695 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
13696 : gen_reg_rtx (Pmode));
13697
13698 insn = emit_insn (gen_load_toc_v4_pic_si (tempLR));
13699 if (fromprolog)
13700 rs6000_maybe_dead (insn);
13701 insn = emit_move_insn (dest, tempLR);
13702 if (fromprolog)
13703 rs6000_maybe_dead (insn);
13704 }
13705 else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
13706 {
13707 char buf[30];
13708 rtx tempLR = (fromprolog
13709 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
13710 : gen_reg_rtx (Pmode));
13711 rtx temp0 = (fromprolog
13712 ? gen_rtx_REG (Pmode, 0)
13713 : gen_reg_rtx (Pmode));
13714
13715 if (fromprolog)
13716 {
13717 rtx symF, symL;
13718
13719 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
13720 symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
13721
13722 ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
13723 symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
13724
13725 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1 (tempLR,
13726 symF)));
13727 rs6000_maybe_dead (emit_move_insn (dest, tempLR));
13728 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest,
13729 symL,
13730 symF)));
13731 }
13732 else
13733 {
13734 rtx tocsym;
13735
13736 tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
13737 emit_insn (gen_load_toc_v4_PIC_1b (tempLR, tocsym));
13738 emit_move_insn (dest, tempLR);
13739 emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
13740 }
13741 insn = emit_insn (gen_addsi3 (dest, temp0, dest));
13742 if (fromprolog)
13743 rs6000_maybe_dead (insn);
13744 }
13745 else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
13746 {
13747 /* This is for AIX code running in non-PIC ELF32. */
13748 char buf[30];
13749 rtx realsym;
13750 ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
13751 realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
13752
13753 insn = emit_insn (gen_elf_high (dest, realsym));
13754 if (fromprolog)
13755 rs6000_maybe_dead (insn);
13756 insn = emit_insn (gen_elf_low (dest, dest, realsym));
13757 if (fromprolog)
13758 rs6000_maybe_dead (insn);
13759 }
13760 else
13761 {
13762 gcc_assert (DEFAULT_ABI == ABI_AIX);
13763
13764 if (TARGET_32BIT)
13765 insn = emit_insn (gen_load_toc_aix_si (dest));
13766 else
13767 insn = emit_insn (gen_load_toc_aix_di (dest));
13768 if (fromprolog)
13769 rs6000_maybe_dead (insn);
13770 }
13771 }
13772
13773 /* Emit instructions to restore the link register after determining where
13774 its value has been stored. */
13775
13776 void
rs6000_emit_eh_reg_restore(rtx source,rtx scratch)13777 rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
13778 {
13779 rs6000_stack_t *info = rs6000_stack_info ();
13780 rtx operands[2];
13781
13782 operands[0] = source;
13783 operands[1] = scratch;
13784
13785 if (info->lr_save_p)
13786 {
13787 rtx frame_rtx = stack_pointer_rtx;
13788 HOST_WIDE_INT sp_offset = 0;
13789 rtx tmp;
13790
13791 if (frame_pointer_needed
13792 || current_function_calls_alloca
13793 || info->total_size > 32767)
13794 {
13795 tmp = gen_frame_mem (Pmode, frame_rtx);
13796 emit_move_insn (operands[1], tmp);
13797 frame_rtx = operands[1];
13798 }
13799 else if (info->push_p)
13800 sp_offset = info->total_size;
13801
13802 tmp = plus_constant (frame_rtx, info->lr_save_offset + sp_offset);
13803 tmp = gen_frame_mem (Pmode, tmp);
13804 emit_move_insn (tmp, operands[0]);
13805 }
13806 else
13807 emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM), operands[0]);
13808 }
13809
13810 static GTY(()) int set = -1;
13811
13812 int
get_TOC_alias_set(void)13813 get_TOC_alias_set (void)
13814 {
13815 if (set == -1)
13816 set = new_alias_set ();
13817 return set;
13818 }
13819
13820 /* This returns nonzero if the current function uses the TOC. This is
13821 determined by the presence of (use (unspec ... UNSPEC_TOC)), which
13822 is generated by the ABI_V4 load_toc_* patterns. */
13823 #if TARGET_ELF
13824 static int
uses_TOC(void)13825 uses_TOC (void)
13826 {
13827 rtx insn;
13828
13829 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
13830 if (INSN_P (insn))
13831 {
13832 rtx pat = PATTERN (insn);
13833 int i;
13834
13835 if (GET_CODE (pat) == PARALLEL)
13836 for (i = 0; i < XVECLEN (pat, 0); i++)
13837 {
13838 rtx sub = XVECEXP (pat, 0, i);
13839 if (GET_CODE (sub) == USE)
13840 {
13841 sub = XEXP (sub, 0);
13842 if (GET_CODE (sub) == UNSPEC
13843 && XINT (sub, 1) == UNSPEC_TOC)
13844 return 1;
13845 }
13846 }
13847 }
13848 return 0;
13849 }
13850 #endif
13851
13852 rtx
create_TOC_reference(rtx symbol)13853 create_TOC_reference (rtx symbol)
13854 {
13855 if (no_new_pseudos)
13856 regs_ever_live[TOC_REGISTER] = 1;
13857 return gen_rtx_PLUS (Pmode,
13858 gen_rtx_REG (Pmode, TOC_REGISTER),
13859 gen_rtx_CONST (Pmode,
13860 gen_rtx_MINUS (Pmode, symbol,
13861 gen_rtx_SYMBOL_REF (Pmode, toc_label_name))));
13862 }
13863
13864 /* If _Unwind_* has been called from within the same module,
13865 toc register is not guaranteed to be saved to 40(1) on function
13866 entry. Save it there in that case. */
13867
13868 void
rs6000_aix_emit_builtin_unwind_init(void)13869 rs6000_aix_emit_builtin_unwind_init (void)
13870 {
13871 rtx mem;
13872 rtx stack_top = gen_reg_rtx (Pmode);
13873 rtx opcode_addr = gen_reg_rtx (Pmode);
13874 rtx opcode = gen_reg_rtx (SImode);
13875 rtx tocompare = gen_reg_rtx (SImode);
13876 rtx no_toc_save_needed = gen_label_rtx ();
13877
13878 mem = gen_frame_mem (Pmode, hard_frame_pointer_rtx);
13879 emit_move_insn (stack_top, mem);
13880
13881 mem = gen_frame_mem (Pmode,
13882 gen_rtx_PLUS (Pmode, stack_top,
13883 GEN_INT (2 * GET_MODE_SIZE (Pmode))));
13884 emit_move_insn (opcode_addr, mem);
13885 emit_move_insn (opcode, gen_rtx_MEM (SImode, opcode_addr));
13886 emit_move_insn (tocompare, gen_int_mode (TARGET_32BIT ? 0x80410014
13887 : 0xE8410028, SImode));
13888
13889 do_compare_rtx_and_jump (opcode, tocompare, EQ, 1,
13890 SImode, NULL_RTX, NULL_RTX,
13891 no_toc_save_needed);
13892
13893 mem = gen_frame_mem (Pmode,
13894 gen_rtx_PLUS (Pmode, stack_top,
13895 GEN_INT (5 * GET_MODE_SIZE (Pmode))));
13896 emit_move_insn (mem, gen_rtx_REG (Pmode, 2));
13897 emit_label (no_toc_save_needed);
13898 }
13899
13900 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
13901 and the change to the stack pointer. */
13902
13903 static void
rs6000_emit_stack_tie(void)13904 rs6000_emit_stack_tie (void)
13905 {
13906 rtx mem = gen_frame_mem (BLKmode,
13907 gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
13908
13909 emit_insn (gen_stack_tie (mem));
13910 }
13911
13912 /* Emit the correct code for allocating stack space, as insns.
13913 If COPY_R12, make sure a copy of the old frame is left in r12.
13914 The generated code may use hard register 0 as a temporary. */
13915
13916 static void
rs6000_emit_allocate_stack(HOST_WIDE_INT size,int copy_r12)13917 rs6000_emit_allocate_stack (HOST_WIDE_INT size, int copy_r12)
13918 {
13919 rtx insn;
13920 rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
13921 rtx tmp_reg = gen_rtx_REG (Pmode, 0);
13922 rtx todec = gen_int_mode (-size, Pmode);
13923
13924 if (INTVAL (todec) != -size)
13925 {
13926 warning (0, "stack frame too large");
13927 emit_insn (gen_trap ());
13928 return;
13929 }
13930
13931 if (current_function_limit_stack)
13932 {
13933 if (REG_P (stack_limit_rtx)
13934 && REGNO (stack_limit_rtx) > 1
13935 && REGNO (stack_limit_rtx) <= 31)
13936 {
13937 emit_insn (TARGET_32BIT
13938 ? gen_addsi3 (tmp_reg,
13939 stack_limit_rtx,
13940 GEN_INT (size))
13941 : gen_adddi3 (tmp_reg,
13942 stack_limit_rtx,
13943 GEN_INT (size)));
13944
13945 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
13946 const0_rtx));
13947 }
13948 else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
13949 && TARGET_32BIT
13950 && DEFAULT_ABI == ABI_V4)
13951 {
13952 rtx toload = gen_rtx_CONST (VOIDmode,
13953 gen_rtx_PLUS (Pmode,
13954 stack_limit_rtx,
13955 GEN_INT (size)));
13956
13957 emit_insn (gen_elf_high (tmp_reg, toload));
13958 emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
13959 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
13960 const0_rtx));
13961 }
13962 else
13963 warning (0, "stack limit expression is not supported");
13964 }
13965
13966 if (copy_r12 || ! TARGET_UPDATE)
13967 emit_move_insn (gen_rtx_REG (Pmode, 12), stack_reg);
13968
13969 if (TARGET_UPDATE)
13970 {
13971 if (size > 32767)
13972 {
13973 /* Need a note here so that try_split doesn't get confused. */
13974 if (get_last_insn () == NULL_RTX)
13975 emit_note (NOTE_INSN_DELETED);
13976 insn = emit_move_insn (tmp_reg, todec);
13977 try_split (PATTERN (insn), insn, 0);
13978 todec = tmp_reg;
13979 }
13980
13981 insn = emit_insn (TARGET_32BIT
13982 ? gen_movsi_update (stack_reg, stack_reg,
13983 todec, stack_reg)
13984 : gen_movdi_di_update (stack_reg, stack_reg,
13985 todec, stack_reg));
13986 }
13987 else
13988 {
13989 insn = emit_insn (TARGET_32BIT
13990 ? gen_addsi3 (stack_reg, stack_reg, todec)
13991 : gen_adddi3 (stack_reg, stack_reg, todec));
13992 emit_move_insn (gen_rtx_MEM (Pmode, stack_reg),
13993 gen_rtx_REG (Pmode, 12));
13994 }
13995
13996 RTX_FRAME_RELATED_P (insn) = 1;
13997 REG_NOTES (insn) =
13998 gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
13999 gen_rtx_SET (VOIDmode, stack_reg,
14000 gen_rtx_PLUS (Pmode, stack_reg,
14001 GEN_INT (-size))),
14002 REG_NOTES (insn));
14003 }
14004
14005 /* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
14006 with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
14007 is not NULL. It would be nice if dwarf2out_frame_debug_expr could
14008 deduce these equivalences by itself so it wasn't necessary to hold
14009 its hand so much. */
14010
14011 static void
rs6000_frame_related(rtx insn,rtx reg,HOST_WIDE_INT val,rtx reg2,rtx rreg)14012 rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
14013 rtx reg2, rtx rreg)
14014 {
14015 rtx real, temp;
14016
14017 /* copy_rtx will not make unique copies of registers, so we need to
14018 ensure we don't have unwanted sharing here. */
14019 if (reg == reg2)
14020 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
14021
14022 if (reg == rreg)
14023 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
14024
14025 real = copy_rtx (PATTERN (insn));
14026
14027 if (reg2 != NULL_RTX)
14028 real = replace_rtx (real, reg2, rreg);
14029
14030 real = replace_rtx (real, reg,
14031 gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
14032 STACK_POINTER_REGNUM),
14033 GEN_INT (val)));
14034
14035 /* We expect that 'real' is either a SET or a PARALLEL containing
14036 SETs (and possibly other stuff). In a PARALLEL, all the SETs
14037 are important so they all have to be marked RTX_FRAME_RELATED_P. */
14038
14039 if (GET_CODE (real) == SET)
14040 {
14041 rtx set = real;
14042
14043 temp = simplify_rtx (SET_SRC (set));
14044 if (temp)
14045 SET_SRC (set) = temp;
14046 temp = simplify_rtx (SET_DEST (set));
14047 if (temp)
14048 SET_DEST (set) = temp;
14049 if (GET_CODE (SET_DEST (set)) == MEM)
14050 {
14051 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
14052 if (temp)
14053 XEXP (SET_DEST (set), 0) = temp;
14054 }
14055 }
14056 else
14057 {
14058 int i;
14059
14060 gcc_assert (GET_CODE (real) == PARALLEL);
14061 for (i = 0; i < XVECLEN (real, 0); i++)
14062 if (GET_CODE (XVECEXP (real, 0, i)) == SET)
14063 {
14064 rtx set = XVECEXP (real, 0, i);
14065
14066 temp = simplify_rtx (SET_SRC (set));
14067 if (temp)
14068 SET_SRC (set) = temp;
14069 temp = simplify_rtx (SET_DEST (set));
14070 if (temp)
14071 SET_DEST (set) = temp;
14072 if (GET_CODE (SET_DEST (set)) == MEM)
14073 {
14074 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
14075 if (temp)
14076 XEXP (SET_DEST (set), 0) = temp;
14077 }
14078 RTX_FRAME_RELATED_P (set) = 1;
14079 }
14080 }
14081
14082 if (TARGET_SPE)
14083 real = spe_synthesize_frame_save (real);
14084
14085 RTX_FRAME_RELATED_P (insn) = 1;
14086 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
14087 real,
14088 REG_NOTES (insn));
14089 }
14090
14091 /* Given an SPE frame note, return a PARALLEL of SETs with the
14092 original note, plus a synthetic register save. */
14093
14094 static rtx
spe_synthesize_frame_save(rtx real)14095 spe_synthesize_frame_save (rtx real)
14096 {
14097 rtx synth, offset, reg, real2;
14098
14099 if (GET_CODE (real) != SET
14100 || GET_MODE (SET_SRC (real)) != V2SImode)
14101 return real;
14102
14103 /* For the SPE, registers saved in 64-bits, get a PARALLEL for their
14104 frame related note. The parallel contains a set of the register
14105 being saved, and another set to a synthetic register (n+1200).
14106 This is so we can differentiate between 64-bit and 32-bit saves.
14107 Words cannot describe this nastiness. */
14108
14109 gcc_assert (GET_CODE (SET_DEST (real)) == MEM
14110 && GET_CODE (XEXP (SET_DEST (real), 0)) == PLUS
14111 && GET_CODE (SET_SRC (real)) == REG);
14112
14113 /* Transform:
14114 (set (mem (plus (reg x) (const y)))
14115 (reg z))
14116 into:
14117 (set (mem (plus (reg x) (const y+4)))
14118 (reg z+1200))
14119 */
14120
14121 real2 = copy_rtx (real);
14122 PUT_MODE (SET_DEST (real2), SImode);
14123 reg = SET_SRC (real2);
14124 real2 = replace_rtx (real2, reg, gen_rtx_REG (SImode, REGNO (reg)));
14125 synth = copy_rtx (real2);
14126
14127 if (BYTES_BIG_ENDIAN)
14128 {
14129 offset = XEXP (XEXP (SET_DEST (real2), 0), 1);
14130 real2 = replace_rtx (real2, offset, GEN_INT (INTVAL (offset) + 4));
14131 }
14132
14133 reg = SET_SRC (synth);
14134
14135 synth = replace_rtx (synth, reg,
14136 gen_rtx_REG (SImode, REGNO (reg) + 1200));
14137
14138 offset = XEXP (XEXP (SET_DEST (synth), 0), 1);
14139 synth = replace_rtx (synth, offset,
14140 GEN_INT (INTVAL (offset)
14141 + (BYTES_BIG_ENDIAN ? 0 : 4)));
14142
14143 RTX_FRAME_RELATED_P (synth) = 1;
14144 RTX_FRAME_RELATED_P (real2) = 1;
14145 if (BYTES_BIG_ENDIAN)
14146 real = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, synth, real2));
14147 else
14148 real = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, real2, synth));
14149
14150 return real;
14151 }
14152
14153 /* Returns an insn that has a vrsave set operation with the
14154 appropriate CLOBBERs. */
14155
14156 static rtx
generate_set_vrsave(rtx reg,rs6000_stack_t * info,int epiloguep)14157 generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
14158 {
14159 int nclobs, i;
14160 rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
14161 rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
14162
14163 clobs[0]
14164 = gen_rtx_SET (VOIDmode,
14165 vrsave,
14166 gen_rtx_UNSPEC_VOLATILE (SImode,
14167 gen_rtvec (2, reg, vrsave),
14168 UNSPECV_SET_VRSAVE));
14169
14170 nclobs = 1;
14171
14172 /* We need to clobber the registers in the mask so the scheduler
14173 does not move sets to VRSAVE before sets of AltiVec registers.
14174
14175 However, if the function receives nonlocal gotos, reload will set
14176 all call saved registers live. We will end up with:
14177
14178 (set (reg 999) (mem))
14179 (parallel [ (set (reg vrsave) (unspec blah))
14180 (clobber (reg 999))])
14181
14182 The clobber will cause the store into reg 999 to be dead, and
14183 flow will attempt to delete an epilogue insn. In this case, we
14184 need an unspec use/set of the register. */
14185
14186 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
14187 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
14188 {
14189 if (!epiloguep || call_used_regs [i])
14190 clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
14191 gen_rtx_REG (V4SImode, i));
14192 else
14193 {
14194 rtx reg = gen_rtx_REG (V4SImode, i);
14195
14196 clobs[nclobs++]
14197 = gen_rtx_SET (VOIDmode,
14198 reg,
14199 gen_rtx_UNSPEC (V4SImode,
14200 gen_rtvec (1, reg), 27));
14201 }
14202 }
14203
14204 insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
14205
14206 for (i = 0; i < nclobs; ++i)
14207 XVECEXP (insn, 0, i) = clobs[i];
14208
14209 return insn;
14210 }
14211
14212 /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
14213 Save REGNO into [FRAME_REG + OFFSET] in mode MODE. */
14214
14215 static void
emit_frame_save(rtx frame_reg,rtx frame_ptr,enum machine_mode mode,unsigned int regno,int offset,HOST_WIDE_INT total_size)14216 emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
14217 unsigned int regno, int offset, HOST_WIDE_INT total_size)
14218 {
14219 rtx reg, offset_rtx, insn, mem, addr, int_rtx;
14220 rtx replacea, replaceb;
14221
14222 int_rtx = GEN_INT (offset);
14223
14224 /* Some cases that need register indexed addressing. */
14225 if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
14226 || (TARGET_E500_DOUBLE && mode == DFmode)
14227 || (TARGET_SPE_ABI
14228 && SPE_VECTOR_MODE (mode)
14229 && !SPE_CONST_OFFSET_OK (offset)))
14230 {
14231 /* Whomever calls us must make sure r11 is available in the
14232 flow path of instructions in the prologue. */
14233 offset_rtx = gen_rtx_REG (Pmode, 11);
14234 emit_move_insn (offset_rtx, int_rtx);
14235
14236 replacea = offset_rtx;
14237 replaceb = int_rtx;
14238 }
14239 else
14240 {
14241 offset_rtx = int_rtx;
14242 replacea = NULL_RTX;
14243 replaceb = NULL_RTX;
14244 }
14245
14246 reg = gen_rtx_REG (mode, regno);
14247 addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
14248 mem = gen_frame_mem (mode, addr);
14249
14250 insn = emit_move_insn (mem, reg);
14251
14252 rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
14253 }
14254
14255 /* Emit an offset memory reference suitable for a frame store, while
14256 converting to a valid addressing mode. */
14257
14258 static rtx
gen_frame_mem_offset(enum machine_mode mode,rtx reg,int offset)14259 gen_frame_mem_offset (enum machine_mode mode, rtx reg, int offset)
14260 {
14261 rtx int_rtx, offset_rtx;
14262
14263 int_rtx = GEN_INT (offset);
14264
14265 if ((TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
14266 || (TARGET_E500_DOUBLE && mode == DFmode))
14267 {
14268 offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
14269 emit_move_insn (offset_rtx, int_rtx);
14270 }
14271 else
14272 offset_rtx = int_rtx;
14273
14274 return gen_frame_mem (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
14275 }
14276
14277 /* Look for user-defined global regs. We should not save and restore these,
14278 and cannot use stmw/lmw if there are any in its range. */
14279
14280 static bool
no_global_regs_above(int first_greg)14281 no_global_regs_above (int first_greg)
14282 {
14283 int i;
14284 for (i = 0; i < 32 - first_greg; i++)
14285 if (global_regs[first_greg + i])
14286 return false;
14287 return true;
14288 }
14289
14290 #ifndef TARGET_FIX_AND_CONTINUE
14291 #define TARGET_FIX_AND_CONTINUE 0
14292 #endif
14293
14294 /* Emit function prologue as insns. */
14295
14296 void
rs6000_emit_prologue(void)14297 rs6000_emit_prologue (void)
14298 {
14299 rs6000_stack_t *info = rs6000_stack_info ();
14300 enum machine_mode reg_mode = Pmode;
14301 int reg_size = TARGET_32BIT ? 4 : 8;
14302 rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
14303 rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
14304 rtx frame_reg_rtx = sp_reg_rtx;
14305 rtx cr_save_rtx = NULL_RTX;
14306 rtx insn;
14307 int saving_FPRs_inline;
14308 int using_store_multiple;
14309 HOST_WIDE_INT sp_offset = 0;
14310
14311 if (TARGET_FIX_AND_CONTINUE)
14312 {
14313 /* gdb on darwin arranges to forward a function from the old
14314 address by modifying the first 5 instructions of the function
14315 to branch to the overriding function. This is necessary to
14316 permit function pointers that point to the old function to
14317 actually forward to the new function. */
14318 emit_insn (gen_nop ());
14319 emit_insn (gen_nop ());
14320 emit_insn (gen_nop ());
14321 emit_insn (gen_nop ());
14322 emit_insn (gen_nop ());
14323 }
14324
14325 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
14326 {
14327 reg_mode = V2SImode;
14328 reg_size = 8;
14329 }
14330
14331 using_store_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
14332 && (!TARGET_SPE_ABI
14333 || info->spe_64bit_regs_used == 0)
14334 && info->first_gp_reg_save < 31
14335 && no_global_regs_above (info->first_gp_reg_save));
14336 saving_FPRs_inline = (info->first_fp_reg_save == 64
14337 || FP_SAVE_INLINE (info->first_fp_reg_save)
14338 || current_function_calls_eh_return
14339 || cfun->machine->ra_need_lr);
14340
14341 /* For V.4, update stack before we do any saving and set back pointer. */
14342 if (! WORLD_SAVE_P (info)
14343 && info->push_p
14344 && (DEFAULT_ABI == ABI_V4
14345 || current_function_calls_eh_return))
14346 {
14347 if (info->total_size < 32767)
14348 sp_offset = info->total_size;
14349 else
14350 frame_reg_rtx = frame_ptr_rtx;
14351 rs6000_emit_allocate_stack (info->total_size,
14352 (frame_reg_rtx != sp_reg_rtx
14353 && (info->cr_save_p
14354 || info->lr_save_p
14355 || info->first_fp_reg_save < 64
14356 || info->first_gp_reg_save < 32
14357 )));
14358 if (frame_reg_rtx != sp_reg_rtx)
14359 rs6000_emit_stack_tie ();
14360 }
14361
14362 /* Handle world saves specially here. */
14363 if (WORLD_SAVE_P (info))
14364 {
14365 int i, j, sz;
14366 rtx treg;
14367 rtvec p;
14368 rtx reg0;
14369
14370 /* save_world expects lr in r0. */
14371 reg0 = gen_rtx_REG (Pmode, 0);
14372 if (info->lr_save_p)
14373 {
14374 insn = emit_move_insn (reg0,
14375 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
14376 RTX_FRAME_RELATED_P (insn) = 1;
14377 }
14378
14379 /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
14380 assumptions about the offsets of various bits of the stack
14381 frame. */
14382 gcc_assert (info->gp_save_offset == -220
14383 && info->fp_save_offset == -144
14384 && info->lr_save_offset == 8
14385 && info->cr_save_offset == 4
14386 && info->push_p
14387 && info->lr_save_p
14388 && (!current_function_calls_eh_return
14389 || info->ehrd_offset == -432)
14390 && info->vrsave_save_offset == -224
14391 && info->altivec_save_offset == -416);
14392
14393 treg = gen_rtx_REG (SImode, 11);
14394 emit_move_insn (treg, GEN_INT (-info->total_size));
14395
14396 /* SAVE_WORLD takes the caller's LR in R0 and the frame size
14397 in R11. It also clobbers R12, so beware! */
14398
14399 /* Preserve CR2 for save_world prologues */
14400 sz = 5;
14401 sz += 32 - info->first_gp_reg_save;
14402 sz += 64 - info->first_fp_reg_save;
14403 sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
14404 p = rtvec_alloc (sz);
14405 j = 0;
14406 RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode,
14407 gen_rtx_REG (Pmode,
14408 LINK_REGISTER_REGNUM));
14409 RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
14410 gen_rtx_SYMBOL_REF (Pmode,
14411 "*save_world"));
14412 /* We do floats first so that the instruction pattern matches
14413 properly. */
14414 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
14415 {
14416 rtx reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
14417 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14418 GEN_INT (info->fp_save_offset
14419 + sp_offset + 8 * i));
14420 rtx mem = gen_frame_mem (DFmode, addr);
14421
14422 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
14423 }
14424 for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
14425 {
14426 rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
14427 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14428 GEN_INT (info->altivec_save_offset
14429 + sp_offset + 16 * i));
14430 rtx mem = gen_frame_mem (V4SImode, addr);
14431
14432 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
14433 }
14434 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
14435 {
14436 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
14437 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14438 GEN_INT (info->gp_save_offset
14439 + sp_offset + reg_size * i));
14440 rtx mem = gen_frame_mem (reg_mode, addr);
14441
14442 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
14443 }
14444
14445 {
14446 /* CR register traditionally saved as CR2. */
14447 rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
14448 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14449 GEN_INT (info->cr_save_offset
14450 + sp_offset));
14451 rtx mem = gen_frame_mem (reg_mode, addr);
14452
14453 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
14454 }
14455 /* Explain about use of R0. */
14456 if (info->lr_save_p)
14457 {
14458 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14459 GEN_INT (info->lr_save_offset
14460 + sp_offset));
14461 rtx mem = gen_frame_mem (reg_mode, addr);
14462
14463 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg0);
14464 }
14465 /* Explain what happens to the stack pointer. */
14466 {
14467 rtx newval = gen_rtx_PLUS (Pmode, sp_reg_rtx, treg);
14468 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, sp_reg_rtx, newval);
14469 }
14470
14471 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
14472 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
14473 treg, GEN_INT (-info->total_size));
14474 sp_offset = info->total_size;
14475 }
14476
14477 /* If we use the link register, get it into r0. */
14478 if (!WORLD_SAVE_P (info) && info->lr_save_p)
14479 {
14480 insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
14481 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
14482 RTX_FRAME_RELATED_P (insn) = 1;
14483 }
14484
14485 /* If we need to save CR, put it into r12. */
14486 if (!WORLD_SAVE_P (info) && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
14487 {
14488 rtx set;
14489
14490 cr_save_rtx = gen_rtx_REG (SImode, 12);
14491 insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
14492 RTX_FRAME_RELATED_P (insn) = 1;
14493 /* Now, there's no way that dwarf2out_frame_debug_expr is going
14494 to understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)'.
14495 But that's OK. All we have to do is specify that _one_ condition
14496 code register is saved in this stack slot. The thrower's epilogue
14497 will then restore all the call-saved registers.
14498 We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux. */
14499 set = gen_rtx_SET (VOIDmode, cr_save_rtx,
14500 gen_rtx_REG (SImode, CR2_REGNO));
14501 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
14502 set,
14503 REG_NOTES (insn));
14504 }
14505
14506 /* Do any required saving of fpr's. If only one or two to save, do
14507 it ourselves. Otherwise, call function. */
14508 if (!WORLD_SAVE_P (info) && saving_FPRs_inline)
14509 {
14510 int i;
14511 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
14512 if ((regs_ever_live[info->first_fp_reg_save+i]
14513 && ! call_used_regs[info->first_fp_reg_save+i]))
14514 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, DFmode,
14515 info->first_fp_reg_save + i,
14516 info->fp_save_offset + sp_offset + 8 * i,
14517 info->total_size);
14518 }
14519 else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
14520 {
14521 int i;
14522 char rname[30];
14523 const char *alloc_rname;
14524 rtvec p;
14525 p = rtvec_alloc (2 + 64 - info->first_fp_reg_save);
14526
14527 RTVEC_ELT (p, 0) = gen_rtx_CLOBBER (VOIDmode,
14528 gen_rtx_REG (Pmode,
14529 LINK_REGISTER_REGNUM));
14530 sprintf (rname, "%s%d%s", SAVE_FP_PREFIX,
14531 info->first_fp_reg_save - 32, SAVE_FP_SUFFIX);
14532 alloc_rname = ggc_strdup (rname);
14533 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
14534 gen_rtx_SYMBOL_REF (Pmode,
14535 alloc_rname));
14536 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
14537 {
14538 rtx addr, reg, mem;
14539 reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
14540 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14541 GEN_INT (info->fp_save_offset
14542 + sp_offset + 8*i));
14543 mem = gen_frame_mem (DFmode, addr);
14544
14545 RTVEC_ELT (p, i + 2) = gen_rtx_SET (VOIDmode, mem, reg);
14546 }
14547 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
14548 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
14549 NULL_RTX, NULL_RTX);
14550 }
14551
14552 /* Save GPRs. This is done as a PARALLEL if we are using
14553 the store-multiple instructions. */
14554 if (!WORLD_SAVE_P (info) && using_store_multiple)
14555 {
14556 rtvec p;
14557 int i;
14558 p = rtvec_alloc (32 - info->first_gp_reg_save);
14559 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
14560 {
14561 rtx addr, reg, mem;
14562 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
14563 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14564 GEN_INT (info->gp_save_offset
14565 + sp_offset
14566 + reg_size * i));
14567 mem = gen_frame_mem (reg_mode, addr);
14568
14569 RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
14570 }
14571 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
14572 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
14573 NULL_RTX, NULL_RTX);
14574 }
14575 else if (!WORLD_SAVE_P (info))
14576 {
14577 int i;
14578 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
14579 if ((regs_ever_live[info->first_gp_reg_save + i]
14580 && (!call_used_regs[info->first_gp_reg_save + i]
14581 || (i + info->first_gp_reg_save
14582 == RS6000_PIC_OFFSET_TABLE_REGNUM
14583 && TARGET_TOC && TARGET_MINIMAL_TOC)))
14584 || (i + info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
14585 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
14586 || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
14587 {
14588 rtx addr, reg, mem;
14589 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
14590
14591 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
14592 {
14593 int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
14594 rtx b;
14595
14596 if (!SPE_CONST_OFFSET_OK (offset))
14597 {
14598 b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
14599 emit_move_insn (b, GEN_INT (offset));
14600 }
14601 else
14602 b = GEN_INT (offset);
14603
14604 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
14605 mem = gen_frame_mem (V2SImode, addr);
14606 insn = emit_move_insn (mem, reg);
14607
14608 if (GET_CODE (b) == CONST_INT)
14609 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
14610 NULL_RTX, NULL_RTX);
14611 else
14612 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
14613 b, GEN_INT (offset));
14614 }
14615 else
14616 {
14617 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14618 GEN_INT (info->gp_save_offset
14619 + sp_offset
14620 + reg_size * i));
14621 mem = gen_frame_mem (reg_mode, addr);
14622
14623 insn = emit_move_insn (mem, reg);
14624 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
14625 NULL_RTX, NULL_RTX);
14626 }
14627 }
14628 }
14629
14630 /* ??? There's no need to emit actual instructions here, but it's the
14631 easiest way to get the frame unwind information emitted. */
14632 if (current_function_calls_eh_return)
14633 {
14634 unsigned int i, regno;
14635
14636 /* In AIX ABI we need to pretend we save r2 here. */
14637 if (TARGET_AIX)
14638 {
14639 rtx addr, reg, mem;
14640
14641 reg = gen_rtx_REG (reg_mode, 2);
14642 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14643 GEN_INT (sp_offset + 5 * reg_size));
14644 mem = gen_frame_mem (reg_mode, addr);
14645
14646 insn = emit_move_insn (mem, reg);
14647 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
14648 NULL_RTX, NULL_RTX);
14649 PATTERN (insn) = gen_blockage ();
14650 }
14651
14652 for (i = 0; ; ++i)
14653 {
14654 regno = EH_RETURN_DATA_REGNO (i);
14655 if (regno == INVALID_REGNUM)
14656 break;
14657
14658 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
14659 info->ehrd_offset + sp_offset
14660 + reg_size * (int) i,
14661 info->total_size);
14662 }
14663 }
14664
14665 /* Save lr if we used it. */
14666 if (!WORLD_SAVE_P (info) && info->lr_save_p)
14667 {
14668 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14669 GEN_INT (info->lr_save_offset + sp_offset));
14670 rtx reg = gen_rtx_REG (Pmode, 0);
14671 rtx mem = gen_rtx_MEM (Pmode, addr);
14672 /* This should not be of frame_alias_set, because of
14673 __builtin_return_address. */
14674
14675 insn = emit_move_insn (mem, reg);
14676 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
14677 NULL_RTX, NULL_RTX);
14678 }
14679
14680 /* Save CR if we use any that must be preserved. */
14681 if (!WORLD_SAVE_P (info) && info->cr_save_p)
14682 {
14683 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14684 GEN_INT (info->cr_save_offset + sp_offset));
14685 rtx mem = gen_frame_mem (SImode, addr);
14686 /* See the large comment above about why CR2_REGNO is used. */
14687 rtx magic_eh_cr_reg = gen_rtx_REG (SImode, CR2_REGNO);
14688
14689 /* If r12 was used to hold the original sp, copy cr into r0 now
14690 that it's free. */
14691 if (REGNO (frame_reg_rtx) == 12)
14692 {
14693 rtx set;
14694
14695 cr_save_rtx = gen_rtx_REG (SImode, 0);
14696 insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
14697 RTX_FRAME_RELATED_P (insn) = 1;
14698 set = gen_rtx_SET (VOIDmode, cr_save_rtx, magic_eh_cr_reg);
14699 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
14700 set,
14701 REG_NOTES (insn));
14702
14703 }
14704 insn = emit_move_insn (mem, cr_save_rtx);
14705
14706 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
14707 NULL_RTX, NULL_RTX);
14708 }
14709
14710 /* Update stack and set back pointer unless this is V.4,
14711 for which it was done previously. */
14712 if (!WORLD_SAVE_P (info) && info->push_p
14713 && !(DEFAULT_ABI == ABI_V4 || current_function_calls_eh_return))
14714 {
14715 if (info->total_size < 32767)
14716 sp_offset = info->total_size;
14717 else
14718 frame_reg_rtx = frame_ptr_rtx;
14719 rs6000_emit_allocate_stack (info->total_size,
14720 (frame_reg_rtx != sp_reg_rtx
14721 && ((info->altivec_size != 0)
14722 || (info->vrsave_mask != 0)
14723 )));
14724 if (frame_reg_rtx != sp_reg_rtx)
14725 rs6000_emit_stack_tie ();
14726 }
14727
14728 /* Set frame pointer, if needed. */
14729 if (frame_pointer_needed)
14730 {
14731 insn = emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
14732 sp_reg_rtx);
14733 RTX_FRAME_RELATED_P (insn) = 1;
14734 }
14735
14736 /* Save AltiVec registers if needed. Save here because the red zone does
14737 not include AltiVec registers. */
14738 if (!WORLD_SAVE_P (info) && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
14739 {
14740 int i;
14741
14742 /* There should be a non inline version of this, for when we
14743 are saving lots of vector registers. */
14744 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
14745 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
14746 {
14747 rtx areg, savereg, mem;
14748 int offset;
14749
14750 offset = info->altivec_save_offset + sp_offset
14751 + 16 * (i - info->first_altivec_reg_save);
14752
14753 savereg = gen_rtx_REG (V4SImode, i);
14754
14755 areg = gen_rtx_REG (Pmode, 0);
14756 emit_move_insn (areg, GEN_INT (offset));
14757
14758 /* AltiVec addressing mode is [reg+reg]. */
14759 mem = gen_frame_mem (V4SImode,
14760 gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
14761
14762 insn = emit_move_insn (mem, savereg);
14763
14764 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
14765 areg, GEN_INT (offset));
14766 }
14767 }
14768
14769 /* VRSAVE is a bit vector representing which AltiVec registers
14770 are used. The OS uses this to determine which vector
14771 registers to save on a context switch. We need to save
14772 VRSAVE on the stack frame, add whatever AltiVec registers we
14773 used in this function, and do the corresponding magic in the
14774 epilogue. */
14775
14776 if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
14777 && info->vrsave_mask != 0)
14778 {
14779 rtx reg, mem, vrsave;
14780 int offset;
14781
14782 /* Get VRSAVE onto a GPR. Note that ABI_V4 might be using r12
14783 as frame_reg_rtx and r11 as the static chain pointer for
14784 nested functions. */
14785 reg = gen_rtx_REG (SImode, 0);
14786 vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
14787 if (TARGET_MACHO)
14788 emit_insn (gen_get_vrsave_internal (reg));
14789 else
14790 emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
14791
14792 if (!WORLD_SAVE_P (info))
14793 {
14794 /* Save VRSAVE. */
14795 offset = info->vrsave_save_offset + sp_offset;
14796 mem = gen_frame_mem (SImode,
14797 gen_rtx_PLUS (Pmode, frame_reg_rtx,
14798 GEN_INT (offset)));
14799 insn = emit_move_insn (mem, reg);
14800 }
14801
14802 /* Include the registers in the mask. */
14803 emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
14804
14805 insn = emit_insn (generate_set_vrsave (reg, info, 0));
14806 }
14807
14808 /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up. */
14809 if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
14810 || (DEFAULT_ABI == ABI_V4
14811 && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
14812 && regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM]))
14813 {
14814 /* If emit_load_toc_table will use the link register, we need to save
14815 it. We use R12 for this purpose because emit_load_toc_table
14816 can use register 0. This allows us to use a plain 'blr' to return
14817 from the procedure more often. */
14818 int save_LR_around_toc_setup = (TARGET_ELF
14819 && DEFAULT_ABI != ABI_AIX
14820 && flag_pic
14821 && ! info->lr_save_p
14822 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0);
14823 if (save_LR_around_toc_setup)
14824 {
14825 rtx lr = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
14826
14827 insn = emit_move_insn (frame_ptr_rtx, lr);
14828 rs6000_maybe_dead (insn);
14829 RTX_FRAME_RELATED_P (insn) = 1;
14830
14831 rs6000_emit_load_toc_table (TRUE);
14832
14833 insn = emit_move_insn (lr, frame_ptr_rtx);
14834 rs6000_maybe_dead (insn);
14835 RTX_FRAME_RELATED_P (insn) = 1;
14836 }
14837 else
14838 rs6000_emit_load_toc_table (TRUE);
14839 }
14840
14841 #if TARGET_MACHO
14842 if (DEFAULT_ABI == ABI_DARWIN
14843 && flag_pic && current_function_uses_pic_offset_table)
14844 {
14845 rtx lr = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
14846 rtx src = machopic_function_base_sym ();
14847
14848 /* Save and restore LR locally around this call (in R0). */
14849 if (!info->lr_save_p)
14850 rs6000_maybe_dead (emit_move_insn (gen_rtx_REG (Pmode, 0), lr));
14851
14852 rs6000_maybe_dead (emit_insn (gen_load_macho_picbase (lr, src)));
14853
14854 insn = emit_move_insn (gen_rtx_REG (Pmode,
14855 RS6000_PIC_OFFSET_TABLE_REGNUM),
14856 lr);
14857 rs6000_maybe_dead (insn);
14858
14859 if (!info->lr_save_p)
14860 rs6000_maybe_dead (emit_move_insn (lr, gen_rtx_REG (Pmode, 0)));
14861 }
14862 #endif
14863 }
14864
14865 /* Write function prologue. */
14866
14867 static void
rs6000_output_function_prologue(FILE * file,HOST_WIDE_INT size ATTRIBUTE_UNUSED)14868 rs6000_output_function_prologue (FILE *file,
14869 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
14870 {
14871 rs6000_stack_t *info = rs6000_stack_info ();
14872
14873 if (TARGET_DEBUG_STACK)
14874 debug_stack_info (info);
14875
14876 /* Write .extern for any function we will call to save and restore
14877 fp values. */
14878 if (info->first_fp_reg_save < 64
14879 && !FP_SAVE_INLINE (info->first_fp_reg_save))
14880 fprintf (file, "\t.extern %s%d%s\n\t.extern %s%d%s\n",
14881 SAVE_FP_PREFIX, info->first_fp_reg_save - 32, SAVE_FP_SUFFIX,
14882 RESTORE_FP_PREFIX, info->first_fp_reg_save - 32,
14883 RESTORE_FP_SUFFIX);
14884
14885 /* Write .extern for AIX common mode routines, if needed. */
14886 if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
14887 {
14888 fputs ("\t.extern __mulh\n", file);
14889 fputs ("\t.extern __mull\n", file);
14890 fputs ("\t.extern __divss\n", file);
14891 fputs ("\t.extern __divus\n", file);
14892 fputs ("\t.extern __quoss\n", file);
14893 fputs ("\t.extern __quous\n", file);
14894 common_mode_defined = 1;
14895 }
14896
14897 if (! HAVE_prologue)
14898 {
14899 start_sequence ();
14900
14901 /* A NOTE_INSN_DELETED is supposed to be at the start and end of
14902 the "toplevel" insn chain. */
14903 emit_note (NOTE_INSN_DELETED);
14904 rs6000_emit_prologue ();
14905 emit_note (NOTE_INSN_DELETED);
14906
14907 /* Expand INSN_ADDRESSES so final() doesn't crash. */
14908 {
14909 rtx insn;
14910 unsigned addr = 0;
14911 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
14912 {
14913 INSN_ADDRESSES_NEW (insn, addr);
14914 addr += 4;
14915 }
14916 }
14917
14918 if (TARGET_DEBUG_STACK)
14919 debug_rtx_list (get_insns (), 100);
14920 final (get_insns (), file, FALSE);
14921 end_sequence ();
14922 }
14923
14924 rs6000_pic_labelno++;
14925 }
14926
14927 /* Emit function epilogue as insns.
14928
14929 At present, dwarf2out_frame_debug_expr doesn't understand
14930 register restores, so we don't bother setting RTX_FRAME_RELATED_P
14931 anywhere in the epilogue. Most of the insns below would in any case
14932 need special notes to explain where r11 is in relation to the stack. */
14933
14934 void
rs6000_emit_epilogue(int sibcall)14935 rs6000_emit_epilogue (int sibcall)
14936 {
14937 rs6000_stack_t *info;
14938 int restoring_FPRs_inline;
14939 int using_load_multiple;
14940 int using_mfcr_multiple;
14941 int use_backchain_to_restore_sp;
14942 int sp_offset = 0;
14943 rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
14944 rtx frame_reg_rtx = sp_reg_rtx;
14945 enum machine_mode reg_mode = Pmode;
14946 int reg_size = TARGET_32BIT ? 4 : 8;
14947 int i;
14948
14949 info = rs6000_stack_info ();
14950
14951 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
14952 {
14953 reg_mode = V2SImode;
14954 reg_size = 8;
14955 }
14956
14957 using_load_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
14958 && (!TARGET_SPE_ABI
14959 || info->spe_64bit_regs_used == 0)
14960 && info->first_gp_reg_save < 31
14961 && no_global_regs_above (info->first_gp_reg_save));
14962 restoring_FPRs_inline = (sibcall
14963 || current_function_calls_eh_return
14964 || info->first_fp_reg_save == 64
14965 || FP_SAVE_INLINE (info->first_fp_reg_save));
14966 use_backchain_to_restore_sp = (frame_pointer_needed
14967 || current_function_calls_alloca
14968 || info->total_size > 32767);
14969 using_mfcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
14970 || rs6000_cpu == PROCESSOR_PPC603
14971 || rs6000_cpu == PROCESSOR_PPC750
14972 || optimize_size);
14973
14974 if (WORLD_SAVE_P (info))
14975 {
14976 int i, j;
14977 char rname[30];
14978 const char *alloc_rname;
14979 rtvec p;
14980
14981 /* eh_rest_world_r10 will return to the location saved in the LR
14982 stack slot (which is not likely to be our caller.)
14983 Input: R10 -- stack adjustment. Clobbers R0, R11, R12, R7, R8.
14984 rest_world is similar, except any R10 parameter is ignored.
14985 The exception-handling stuff that was here in 2.95 is no
14986 longer necessary. */
14987
14988 p = rtvec_alloc (9
14989 + 1
14990 + 32 - info->first_gp_reg_save
14991 + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
14992 + 63 + 1 - info->first_fp_reg_save);
14993
14994 strcpy (rname, ((current_function_calls_eh_return) ?
14995 "*eh_rest_world_r10" : "*rest_world"));
14996 alloc_rname = ggc_strdup (rname);
14997
14998 j = 0;
14999 RTVEC_ELT (p, j++) = gen_rtx_RETURN (VOIDmode);
15000 RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
15001 gen_rtx_REG (Pmode,
15002 LINK_REGISTER_REGNUM));
15003 RTVEC_ELT (p, j++)
15004 = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, alloc_rname));
15005 /* The instruction pattern requires a clobber here;
15006 it is shared with the restVEC helper. */
15007 RTVEC_ELT (p, j++)
15008 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 11));
15009
15010 {
15011 /* CR register traditionally saved as CR2. */
15012 rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
15013 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15014 GEN_INT (info->cr_save_offset));
15015 rtx mem = gen_frame_mem (reg_mode, addr);
15016
15017 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
15018 }
15019
15020 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
15021 {
15022 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
15023 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15024 GEN_INT (info->gp_save_offset
15025 + reg_size * i));
15026 rtx mem = gen_frame_mem (reg_mode, addr);
15027
15028 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
15029 }
15030 for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
15031 {
15032 rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
15033 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15034 GEN_INT (info->altivec_save_offset
15035 + 16 * i));
15036 rtx mem = gen_frame_mem (V4SImode, addr);
15037
15038 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
15039 }
15040 for (i = 0; info->first_fp_reg_save + i <= 63; i++)
15041 {
15042 rtx reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
15043 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15044 GEN_INT (info->fp_save_offset
15045 + 8 * i));
15046 rtx mem = gen_frame_mem (DFmode, addr);
15047
15048 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
15049 }
15050 RTVEC_ELT (p, j++)
15051 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 0));
15052 RTVEC_ELT (p, j++)
15053 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 12));
15054 RTVEC_ELT (p, j++)
15055 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 7));
15056 RTVEC_ELT (p, j++)
15057 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 8));
15058 RTVEC_ELT (p, j++)
15059 = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
15060 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
15061
15062 return;
15063 }
15064
15065 /* Set sp_offset based on the stack push from the prologue. */
15066 if (info->total_size < 32767)
15067 sp_offset = info->total_size;
15068
15069 /* Restore AltiVec registers if needed. */
15070 if (TARGET_ALTIVEC_ABI && info->altivec_size != 0)
15071 {
15072 int i;
15073
15074 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
15075 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
15076 {
15077 rtx addr, areg, mem;
15078
15079 areg = gen_rtx_REG (Pmode, 0);
15080 emit_move_insn
15081 (areg, GEN_INT (info->altivec_save_offset
15082 + sp_offset
15083 + 16 * (i - info->first_altivec_reg_save)));
15084
15085 /* AltiVec addressing mode is [reg+reg]. */
15086 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
15087 mem = gen_frame_mem (V4SImode, addr);
15088
15089 emit_move_insn (gen_rtx_REG (V4SImode, i), mem);
15090 }
15091 }
15092
15093 /* Restore VRSAVE if needed. */
15094 if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
15095 && info->vrsave_mask != 0)
15096 {
15097 rtx addr, mem, reg;
15098
15099 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15100 GEN_INT (info->vrsave_save_offset + sp_offset));
15101 mem = gen_frame_mem (SImode, addr);
15102 reg = gen_rtx_REG (SImode, 12);
15103 emit_move_insn (reg, mem);
15104
15105 emit_insn (generate_set_vrsave (reg, info, 1));
15106 }
15107
15108 sp_offset = 0;
15109
15110 /* If we have a frame pointer, a call to alloca, or a large stack
15111 frame, restore the old stack pointer using the backchain. Otherwise,
15112 we know what size to update it with. */
15113 if (use_backchain_to_restore_sp)
15114 {
15115 /* Under V.4, don't reset the stack pointer until after we're done
15116 loading the saved registers. */
15117 if (DEFAULT_ABI == ABI_V4)
15118 frame_reg_rtx = gen_rtx_REG (Pmode, 11);
15119
15120 emit_move_insn (frame_reg_rtx,
15121 gen_rtx_MEM (Pmode, sp_reg_rtx));
15122 }
15123 else if (info->push_p)
15124 {
15125 if (DEFAULT_ABI == ABI_V4
15126 || current_function_calls_eh_return)
15127 sp_offset = info->total_size;
15128 else
15129 {
15130 emit_insn (TARGET_32BIT
15131 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
15132 GEN_INT (info->total_size))
15133 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
15134 GEN_INT (info->total_size)));
15135 }
15136 }
15137
15138 /* Get the old lr if we saved it. */
15139 if (info->lr_save_p)
15140 {
15141 rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
15142 info->lr_save_offset + sp_offset);
15143
15144 emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
15145 }
15146
15147 /* Get the old cr if we saved it. */
15148 if (info->cr_save_p)
15149 {
15150 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15151 GEN_INT (info->cr_save_offset + sp_offset));
15152 rtx mem = gen_frame_mem (SImode, addr);
15153
15154 emit_move_insn (gen_rtx_REG (SImode, 12), mem);
15155 }
15156
15157 /* Set LR here to try to overlap restores below. */
15158 if (info->lr_save_p)
15159 emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM),
15160 gen_rtx_REG (Pmode, 0));
15161
15162 /* Load exception handler data registers, if needed. */
15163 if (current_function_calls_eh_return)
15164 {
15165 unsigned int i, regno;
15166
15167 if (TARGET_AIX)
15168 {
15169 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15170 GEN_INT (sp_offset + 5 * reg_size));
15171 rtx mem = gen_frame_mem (reg_mode, addr);
15172
15173 emit_move_insn (gen_rtx_REG (reg_mode, 2), mem);
15174 }
15175
15176 for (i = 0; ; ++i)
15177 {
15178 rtx mem;
15179
15180 regno = EH_RETURN_DATA_REGNO (i);
15181 if (regno == INVALID_REGNUM)
15182 break;
15183
15184 mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
15185 info->ehrd_offset + sp_offset
15186 + reg_size * (int) i);
15187
15188 emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
15189 }
15190 }
15191
15192 /* Restore GPRs. This is done as a PARALLEL if we are using
15193 the load-multiple instructions. */
15194 if (using_load_multiple)
15195 {
15196 rtvec p;
15197 p = rtvec_alloc (32 - info->first_gp_reg_save);
15198 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
15199 {
15200 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15201 GEN_INT (info->gp_save_offset
15202 + sp_offset
15203 + reg_size * i));
15204 rtx mem = gen_frame_mem (reg_mode, addr);
15205
15206 RTVEC_ELT (p, i) =
15207 gen_rtx_SET (VOIDmode,
15208 gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
15209 mem);
15210 }
15211 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
15212 }
15213 else
15214 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
15215 if ((regs_ever_live[info->first_gp_reg_save + i]
15216 && (!call_used_regs[info->first_gp_reg_save + i]
15217 || (i + info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
15218 && TARGET_TOC && TARGET_MINIMAL_TOC)))
15219 || (i + info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
15220 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
15221 || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
15222 {
15223 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15224 GEN_INT (info->gp_save_offset
15225 + sp_offset
15226 + reg_size * i));
15227 rtx mem = gen_frame_mem (reg_mode, addr);
15228
15229 /* Restore 64-bit quantities for SPE. */
15230 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
15231 {
15232 int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
15233 rtx b;
15234
15235 if (!SPE_CONST_OFFSET_OK (offset))
15236 {
15237 b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
15238 emit_move_insn (b, GEN_INT (offset));
15239 }
15240 else
15241 b = GEN_INT (offset);
15242
15243 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
15244 mem = gen_frame_mem (V2SImode, addr);
15245 }
15246
15247 emit_move_insn (gen_rtx_REG (reg_mode,
15248 info->first_gp_reg_save + i), mem);
15249 }
15250
15251 /* Restore fpr's if we need to do it without calling a function. */
15252 if (restoring_FPRs_inline)
15253 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
15254 if ((regs_ever_live[info->first_fp_reg_save+i]
15255 && ! call_used_regs[info->first_fp_reg_save+i]))
15256 {
15257 rtx addr, mem;
15258 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15259 GEN_INT (info->fp_save_offset
15260 + sp_offset
15261 + 8 * i));
15262 mem = gen_frame_mem (DFmode, addr);
15263
15264 emit_move_insn (gen_rtx_REG (DFmode,
15265 info->first_fp_reg_save + i),
15266 mem);
15267 }
15268
15269 /* If we saved cr, restore it here. Just those that were used. */
15270 if (info->cr_save_p)
15271 {
15272 rtx r12_rtx = gen_rtx_REG (SImode, 12);
15273 int count = 0;
15274
15275 if (using_mfcr_multiple)
15276 {
15277 for (i = 0; i < 8; i++)
15278 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
15279 count++;
15280 gcc_assert (count);
15281 }
15282
15283 if (using_mfcr_multiple && count > 1)
15284 {
15285 rtvec p;
15286 int ndx;
15287
15288 p = rtvec_alloc (count);
15289
15290 ndx = 0;
15291 for (i = 0; i < 8; i++)
15292 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
15293 {
15294 rtvec r = rtvec_alloc (2);
15295 RTVEC_ELT (r, 0) = r12_rtx;
15296 RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
15297 RTVEC_ELT (p, ndx) =
15298 gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
15299 gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
15300 ndx++;
15301 }
15302 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
15303 gcc_assert (ndx == count);
15304 }
15305 else
15306 for (i = 0; i < 8; i++)
15307 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
15308 {
15309 emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
15310 CR0_REGNO+i),
15311 r12_rtx));
15312 }
15313 }
15314
15315 /* If this is V.4, unwind the stack pointer after all of the loads
15316 have been done. */
15317 if (frame_reg_rtx != sp_reg_rtx)
15318 {
15319 /* This blockage is needed so that sched doesn't decide to move
15320 the sp change before the register restores. */
15321 rs6000_emit_stack_tie ();
15322 emit_move_insn (sp_reg_rtx, frame_reg_rtx);
15323 }
15324 else if (sp_offset != 0)
15325 emit_insn (TARGET_32BIT
15326 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
15327 GEN_INT (sp_offset))
15328 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
15329 GEN_INT (sp_offset)));
15330
15331 if (current_function_calls_eh_return)
15332 {
15333 rtx sa = EH_RETURN_STACKADJ_RTX;
15334 emit_insn (TARGET_32BIT
15335 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx, sa)
15336 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx, sa));
15337 }
15338
15339 if (!sibcall)
15340 {
15341 rtvec p;
15342 if (! restoring_FPRs_inline)
15343 p = rtvec_alloc (3 + 64 - info->first_fp_reg_save);
15344 else
15345 p = rtvec_alloc (2);
15346
15347 RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
15348 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
15349 gen_rtx_REG (Pmode,
15350 LINK_REGISTER_REGNUM));
15351
15352 /* If we have to restore more than two FP registers, branch to the
15353 restore function. It will return to our caller. */
15354 if (! restoring_FPRs_inline)
15355 {
15356 int i;
15357 char rname[30];
15358 const char *alloc_rname;
15359
15360 sprintf (rname, "%s%d%s", RESTORE_FP_PREFIX,
15361 info->first_fp_reg_save - 32, RESTORE_FP_SUFFIX);
15362 alloc_rname = ggc_strdup (rname);
15363 RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode,
15364 gen_rtx_SYMBOL_REF (Pmode,
15365 alloc_rname));
15366
15367 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
15368 {
15369 rtx addr, mem;
15370 addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
15371 GEN_INT (info->fp_save_offset + 8*i));
15372 mem = gen_frame_mem (DFmode, addr);
15373
15374 RTVEC_ELT (p, i+3) =
15375 gen_rtx_SET (VOIDmode,
15376 gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
15377 mem);
15378 }
15379 }
15380
15381 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
15382 }
15383 }
15384
15385 /* Write function epilogue. */
15386
15387 static void
rs6000_output_function_epilogue(FILE * file,HOST_WIDE_INT size ATTRIBUTE_UNUSED)15388 rs6000_output_function_epilogue (FILE *file,
15389 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
15390 {
15391 if (! HAVE_epilogue)
15392 {
15393 rtx insn = get_last_insn ();
15394 /* If the last insn was a BARRIER, we don't have to write anything except
15395 the trace table. */
15396 if (GET_CODE (insn) == NOTE)
15397 insn = prev_nonnote_insn (insn);
15398 if (insn == 0 || GET_CODE (insn) != BARRIER)
15399 {
15400 /* This is slightly ugly, but at least we don't have two
15401 copies of the epilogue-emitting code. */
15402 start_sequence ();
15403
15404 /* A NOTE_INSN_DELETED is supposed to be at the start
15405 and end of the "toplevel" insn chain. */
15406 emit_note (NOTE_INSN_DELETED);
15407 rs6000_emit_epilogue (FALSE);
15408 emit_note (NOTE_INSN_DELETED);
15409
15410 /* Expand INSN_ADDRESSES so final() doesn't crash. */
15411 {
15412 rtx insn;
15413 unsigned addr = 0;
15414 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
15415 {
15416 INSN_ADDRESSES_NEW (insn, addr);
15417 addr += 4;
15418 }
15419 }
15420
15421 if (TARGET_DEBUG_STACK)
15422 debug_rtx_list (get_insns (), 100);
15423 final (get_insns (), file, FALSE);
15424 end_sequence ();
15425 }
15426 }
15427
15428 #if TARGET_MACHO
15429 macho_branch_islands ();
15430 /* Mach-O doesn't support labels at the end of objects, so if
15431 it looks like we might want one, insert a NOP. */
15432 {
15433 rtx insn = get_last_insn ();
15434 while (insn
15435 && NOTE_P (insn)
15436 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED_LABEL)
15437 insn = PREV_INSN (insn);
15438 if (insn
15439 && (LABEL_P (insn)
15440 || (NOTE_P (insn)
15441 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED_LABEL)))
15442 fputs ("\tnop\n", file);
15443 }
15444 #endif
15445
15446 /* Output a traceback table here. See /usr/include/sys/debug.h for info
15447 on its format.
15448
15449 We don't output a traceback table if -finhibit-size-directive was
15450 used. The documentation for -finhibit-size-directive reads
15451 ``don't output a @code{.size} assembler directive, or anything
15452 else that would cause trouble if the function is split in the
15453 middle, and the two halves are placed at locations far apart in
15454 memory.'' The traceback table has this property, since it
15455 includes the offset from the start of the function to the
15456 traceback table itself.
15457
15458 System V.4 Powerpc's (and the embedded ABI derived from it) use a
15459 different traceback table. */
15460 if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
15461 && rs6000_traceback != traceback_none && !current_function_is_thunk)
15462 {
15463 const char *fname = NULL;
15464 const char *language_string = lang_hooks.name;
15465 int fixed_parms = 0, float_parms = 0, parm_info = 0;
15466 int i;
15467 int optional_tbtab;
15468 rs6000_stack_t *info = rs6000_stack_info ();
15469
15470 if (rs6000_traceback == traceback_full)
15471 optional_tbtab = 1;
15472 else if (rs6000_traceback == traceback_part)
15473 optional_tbtab = 0;
15474 else
15475 optional_tbtab = !optimize_size && !TARGET_ELF;
15476
15477 if (optional_tbtab)
15478 {
15479 fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
15480 while (*fname == '.') /* V.4 encodes . in the name */
15481 fname++;
15482
15483 /* Need label immediately before tbtab, so we can compute
15484 its offset from the function start. */
15485 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
15486 ASM_OUTPUT_LABEL (file, fname);
15487 }
15488
15489 /* The .tbtab pseudo-op can only be used for the first eight
15490 expressions, since it can't handle the possibly variable
15491 length fields that follow. However, if you omit the optional
15492 fields, the assembler outputs zeros for all optional fields
15493 anyways, giving each variable length field is minimum length
15494 (as defined in sys/debug.h). Thus we can not use the .tbtab
15495 pseudo-op at all. */
15496
15497 /* An all-zero word flags the start of the tbtab, for debuggers
15498 that have to find it by searching forward from the entry
15499 point or from the current pc. */
15500 fputs ("\t.long 0\n", file);
15501
15502 /* Tbtab format type. Use format type 0. */
15503 fputs ("\t.byte 0,", file);
15504
15505 /* Language type. Unfortunately, there does not seem to be any
15506 official way to discover the language being compiled, so we
15507 use language_string.
15508 C is 0. Fortran is 1. Pascal is 2. Ada is 3. C++ is 9.
15509 Java is 13. Objective-C is 14. Objective-C++ isn't assigned
15510 a number, so for now use 9. */
15511 if (! strcmp (language_string, "GNU C"))
15512 i = 0;
15513 else if (! strcmp (language_string, "GNU F77")
15514 || ! strcmp (language_string, "GNU F95"))
15515 i = 1;
15516 else if (! strcmp (language_string, "GNU Pascal"))
15517 i = 2;
15518 else if (! strcmp (language_string, "GNU Ada"))
15519 i = 3;
15520 else if (! strcmp (language_string, "GNU C++")
15521 || ! strcmp (language_string, "GNU Objective-C++"))
15522 i = 9;
15523 else if (! strcmp (language_string, "GNU Java"))
15524 i = 13;
15525 else if (! strcmp (language_string, "GNU Objective-C"))
15526 i = 14;
15527 else
15528 gcc_unreachable ();
15529 fprintf (file, "%d,", i);
15530
15531 /* 8 single bit fields: global linkage (not set for C extern linkage,
15532 apparently a PL/I convention?), out-of-line epilogue/prologue, offset
15533 from start of procedure stored in tbtab, internal function, function
15534 has controlled storage, function has no toc, function uses fp,
15535 function logs/aborts fp operations. */
15536 /* Assume that fp operations are used if any fp reg must be saved. */
15537 fprintf (file, "%d,",
15538 (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
15539
15540 /* 6 bitfields: function is interrupt handler, name present in
15541 proc table, function calls alloca, on condition directives
15542 (controls stack walks, 3 bits), saves condition reg, saves
15543 link reg. */
15544 /* The `function calls alloca' bit seems to be set whenever reg 31 is
15545 set up as a frame pointer, even when there is no alloca call. */
15546 fprintf (file, "%d,",
15547 ((optional_tbtab << 6)
15548 | ((optional_tbtab & frame_pointer_needed) << 5)
15549 | (info->cr_save_p << 1)
15550 | (info->lr_save_p)));
15551
15552 /* 3 bitfields: saves backchain, fixup code, number of fpr saved
15553 (6 bits). */
15554 fprintf (file, "%d,",
15555 (info->push_p << 7) | (64 - info->first_fp_reg_save));
15556
15557 /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits). */
15558 fprintf (file, "%d,", (32 - first_reg_to_save ()));
15559
15560 if (optional_tbtab)
15561 {
15562 /* Compute the parameter info from the function decl argument
15563 list. */
15564 tree decl;
15565 int next_parm_info_bit = 31;
15566
15567 for (decl = DECL_ARGUMENTS (current_function_decl);
15568 decl; decl = TREE_CHAIN (decl))
15569 {
15570 rtx parameter = DECL_INCOMING_RTL (decl);
15571 enum machine_mode mode = GET_MODE (parameter);
15572
15573 if (GET_CODE (parameter) == REG)
15574 {
15575 if (SCALAR_FLOAT_MODE_P (mode))
15576 {
15577 int bits;
15578
15579 float_parms++;
15580
15581 switch (mode)
15582 {
15583 case SFmode:
15584 bits = 0x2;
15585 break;
15586
15587 case DFmode:
15588 case TFmode:
15589 bits = 0x3;
15590 break;
15591
15592 default:
15593 gcc_unreachable ();
15594 }
15595
15596 /* If only one bit will fit, don't or in this entry. */
15597 if (next_parm_info_bit > 0)
15598 parm_info |= (bits << (next_parm_info_bit - 1));
15599 next_parm_info_bit -= 2;
15600 }
15601 else
15602 {
15603 fixed_parms += ((GET_MODE_SIZE (mode)
15604 + (UNITS_PER_WORD - 1))
15605 / UNITS_PER_WORD);
15606 next_parm_info_bit -= 1;
15607 }
15608 }
15609 }
15610 }
15611
15612 /* Number of fixed point parameters. */
15613 /* This is actually the number of words of fixed point parameters; thus
15614 an 8 byte struct counts as 2; and thus the maximum value is 8. */
15615 fprintf (file, "%d,", fixed_parms);
15616
15617 /* 2 bitfields: number of floating point parameters (7 bits), parameters
15618 all on stack. */
15619 /* This is actually the number of fp registers that hold parameters;
15620 and thus the maximum value is 13. */
15621 /* Set parameters on stack bit if parameters are not in their original
15622 registers, regardless of whether they are on the stack? Xlc
15623 seems to set the bit when not optimizing. */
15624 fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
15625
15626 if (! optional_tbtab)
15627 return;
15628
15629 /* Optional fields follow. Some are variable length. */
15630
15631 /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
15632 11 double float. */
15633 /* There is an entry for each parameter in a register, in the order that
15634 they occur in the parameter list. Any intervening arguments on the
15635 stack are ignored. If the list overflows a long (max possible length
15636 34 bits) then completely leave off all elements that don't fit. */
15637 /* Only emit this long if there was at least one parameter. */
15638 if (fixed_parms || float_parms)
15639 fprintf (file, "\t.long %d\n", parm_info);
15640
15641 /* Offset from start of code to tb table. */
15642 fputs ("\t.long ", file);
15643 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
15644 if (TARGET_AIX)
15645 RS6000_OUTPUT_BASENAME (file, fname);
15646 else
15647 assemble_name (file, fname);
15648 putc ('-', file);
15649 rs6000_output_function_entry (file, fname);
15650 putc ('\n', file);
15651
15652 /* Interrupt handler mask. */
15653 /* Omit this long, since we never set the interrupt handler bit
15654 above. */
15655
15656 /* Number of CTL (controlled storage) anchors. */
15657 /* Omit this long, since the has_ctl bit is never set above. */
15658
15659 /* Displacement into stack of each CTL anchor. */
15660 /* Omit this list of longs, because there are no CTL anchors. */
15661
15662 /* Length of function name. */
15663 if (*fname == '*')
15664 ++fname;
15665 fprintf (file, "\t.short %d\n", (int) strlen (fname));
15666
15667 /* Function name. */
15668 assemble_string (fname, strlen (fname));
15669
15670 /* Register for alloca automatic storage; this is always reg 31.
15671 Only emit this if the alloca bit was set above. */
15672 if (frame_pointer_needed)
15673 fputs ("\t.byte 31\n", file);
15674
15675 fputs ("\t.align 2\n", file);
15676 }
15677 }
15678
15679 /* A C compound statement that outputs the assembler code for a thunk
15680 function, used to implement C++ virtual function calls with
15681 multiple inheritance. The thunk acts as a wrapper around a virtual
15682 function, adjusting the implicit object parameter before handing
15683 control off to the real function.
15684
15685 First, emit code to add the integer DELTA to the location that
15686 contains the incoming first argument. Assume that this argument
15687 contains a pointer, and is the one used to pass the `this' pointer
15688 in C++. This is the incoming argument *before* the function
15689 prologue, e.g. `%o0' on a sparc. The addition must preserve the
15690 values of all other incoming arguments.
15691
15692 After the addition, emit code to jump to FUNCTION, which is a
15693 `FUNCTION_DECL'. This is a direct pure jump, not a call, and does
15694 not touch the return address. Hence returning from FUNCTION will
15695 return to whoever called the current `thunk'.
15696
15697 The effect must be as if FUNCTION had been called directly with the
15698 adjusted first argument. This macro is responsible for emitting
15699 all of the code for a thunk function; output_function_prologue()
15700 and output_function_epilogue() are not invoked.
15701
15702 The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already
15703 been extracted from it.) It might possibly be useful on some
15704 targets, but probably not.
15705
15706 If you do not define this macro, the target-independent code in the
15707 C++ frontend will generate a less efficient heavyweight thunk that
15708 calls FUNCTION instead of jumping to it. The generic approach does
15709 not support varargs. */
15710
15711 static void
rs6000_output_mi_thunk(FILE * file,tree thunk_fndecl ATTRIBUTE_UNUSED,HOST_WIDE_INT delta,HOST_WIDE_INT vcall_offset,tree function)15712 rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
15713 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
15714 tree function)
15715 {
15716 rtx this, insn, funexp;
15717
15718 reload_completed = 1;
15719 epilogue_completed = 1;
15720 no_new_pseudos = 1;
15721 reset_block_changes ();
15722
15723 /* Mark the end of the (empty) prologue. */
15724 emit_note (NOTE_INSN_PROLOGUE_END);
15725
15726 /* Find the "this" pointer. If the function returns a structure,
15727 the structure return pointer is in r3. */
15728 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
15729 this = gen_rtx_REG (Pmode, 4);
15730 else
15731 this = gen_rtx_REG (Pmode, 3);
15732
15733 /* Apply the constant offset, if required. */
15734 if (delta)
15735 {
15736 rtx delta_rtx = GEN_INT (delta);
15737 emit_insn (TARGET_32BIT
15738 ? gen_addsi3 (this, this, delta_rtx)
15739 : gen_adddi3 (this, this, delta_rtx));
15740 }
15741
15742 /* Apply the offset from the vtable, if required. */
15743 if (vcall_offset)
15744 {
15745 rtx vcall_offset_rtx = GEN_INT (vcall_offset);
15746 rtx tmp = gen_rtx_REG (Pmode, 12);
15747
15748 emit_move_insn (tmp, gen_rtx_MEM (Pmode, this));
15749 if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
15750 {
15751 emit_insn (TARGET_32BIT
15752 ? gen_addsi3 (tmp, tmp, vcall_offset_rtx)
15753 : gen_adddi3 (tmp, tmp, vcall_offset_rtx));
15754 emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
15755 }
15756 else
15757 {
15758 rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
15759
15760 emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
15761 }
15762 emit_insn (TARGET_32BIT
15763 ? gen_addsi3 (this, this, tmp)
15764 : gen_adddi3 (this, this, tmp));
15765 }
15766
15767 /* Generate a tail call to the target function. */
15768 if (!TREE_USED (function))
15769 {
15770 assemble_external (function);
15771 TREE_USED (function) = 1;
15772 }
15773 funexp = XEXP (DECL_RTL (function), 0);
15774 funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
15775
15776 #if TARGET_MACHO
15777 if (MACHOPIC_INDIRECT)
15778 funexp = machopic_indirect_call_target (funexp);
15779 #endif
15780
15781 /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
15782 generate sibcall RTL explicitly. */
15783 insn = emit_call_insn (
15784 gen_rtx_PARALLEL (VOIDmode,
15785 gen_rtvec (4,
15786 gen_rtx_CALL (VOIDmode,
15787 funexp, const0_rtx),
15788 gen_rtx_USE (VOIDmode, const0_rtx),
15789 gen_rtx_USE (VOIDmode,
15790 gen_rtx_REG (SImode,
15791 LINK_REGISTER_REGNUM)),
15792 gen_rtx_RETURN (VOIDmode))));
15793 SIBLING_CALL_P (insn) = 1;
15794 emit_barrier ();
15795
15796 /* Run just enough of rest_of_compilation to get the insns emitted.
15797 There's not really enough bulk here to make other passes such as
15798 instruction scheduling worth while. Note that use_thunk calls
15799 assemble_start_function and assemble_end_function. */
15800 insn = get_insns ();
15801 insn_locators_initialize ();
15802 shorten_branches (insn);
15803 final_start_function (insn, file, 1);
15804 final (insn, file, 1);
15805 final_end_function ();
15806
15807 reload_completed = 0;
15808 epilogue_completed = 0;
15809 no_new_pseudos = 0;
15810 }
15811
15812 /* A quick summary of the various types of 'constant-pool tables'
15813 under PowerPC:
15814
15815 Target Flags Name One table per
15816 AIX (none) AIX TOC object file
15817 AIX -mfull-toc AIX TOC object file
15818 AIX -mminimal-toc AIX minimal TOC translation unit
15819 SVR4/EABI (none) SVR4 SDATA object file
15820 SVR4/EABI -fpic SVR4 pic object file
15821 SVR4/EABI -fPIC SVR4 PIC translation unit
15822 SVR4/EABI -mrelocatable EABI TOC function
15823 SVR4/EABI -maix AIX TOC object file
15824 SVR4/EABI -maix -mminimal-toc
15825 AIX minimal TOC translation unit
15826
15827 Name Reg. Set by entries contains:
15828 made by addrs? fp? sum?
15829
15830 AIX TOC 2 crt0 as Y option option
15831 AIX minimal TOC 30 prolog gcc Y Y option
15832 SVR4 SDATA 13 crt0 gcc N Y N
15833 SVR4 pic 30 prolog ld Y not yet N
15834 SVR4 PIC 30 prolog gcc Y option option
15835 EABI TOC 30 prolog gcc Y option option
15836
15837 */
15838
15839 /* Hash functions for the hash table. */
15840
15841 static unsigned
rs6000_hash_constant(rtx k)15842 rs6000_hash_constant (rtx k)
15843 {
15844 enum rtx_code code = GET_CODE (k);
15845 enum machine_mode mode = GET_MODE (k);
15846 unsigned result = (code << 3) ^ mode;
15847 const char *format;
15848 int flen, fidx;
15849
15850 format = GET_RTX_FORMAT (code);
15851 flen = strlen (format);
15852 fidx = 0;
15853
15854 switch (code)
15855 {
15856 case LABEL_REF:
15857 return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
15858
15859 case CONST_DOUBLE:
15860 if (mode != VOIDmode)
15861 return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
15862 flen = 2;
15863 break;
15864
15865 case CODE_LABEL:
15866 fidx = 3;
15867 break;
15868
15869 default:
15870 break;
15871 }
15872
15873 for (; fidx < flen; fidx++)
15874 switch (format[fidx])
15875 {
15876 case 's':
15877 {
15878 unsigned i, len;
15879 const char *str = XSTR (k, fidx);
15880 len = strlen (str);
15881 result = result * 613 + len;
15882 for (i = 0; i < len; i++)
15883 result = result * 613 + (unsigned) str[i];
15884 break;
15885 }
15886 case 'u':
15887 case 'e':
15888 result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
15889 break;
15890 case 'i':
15891 case 'n':
15892 result = result * 613 + (unsigned) XINT (k, fidx);
15893 break;
15894 case 'w':
15895 if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
15896 result = result * 613 + (unsigned) XWINT (k, fidx);
15897 else
15898 {
15899 size_t i;
15900 for (i = 0; i < sizeof (HOST_WIDE_INT) / sizeof (unsigned); i++)
15901 result = result * 613 + (unsigned) (XWINT (k, fidx)
15902 >> CHAR_BIT * i);
15903 }
15904 break;
15905 case '0':
15906 break;
15907 default:
15908 gcc_unreachable ();
15909 }
15910
15911 return result;
15912 }
15913
15914 static unsigned
toc_hash_function(const void * hash_entry)15915 toc_hash_function (const void *hash_entry)
15916 {
15917 const struct toc_hash_struct *thc =
15918 (const struct toc_hash_struct *) hash_entry;
15919 return rs6000_hash_constant (thc->key) ^ thc->key_mode;
15920 }
15921
15922 /* Compare H1 and H2 for equivalence. */
15923
15924 static int
toc_hash_eq(const void * h1,const void * h2)15925 toc_hash_eq (const void *h1, const void *h2)
15926 {
15927 rtx r1 = ((const struct toc_hash_struct *) h1)->key;
15928 rtx r2 = ((const struct toc_hash_struct *) h2)->key;
15929
15930 if (((const struct toc_hash_struct *) h1)->key_mode
15931 != ((const struct toc_hash_struct *) h2)->key_mode)
15932 return 0;
15933
15934 return rtx_equal_p (r1, r2);
15935 }
15936
15937 /* These are the names given by the C++ front-end to vtables, and
15938 vtable-like objects. Ideally, this logic should not be here;
15939 instead, there should be some programmatic way of inquiring as
15940 to whether or not an object is a vtable. */
15941
15942 #define VTABLE_NAME_P(NAME) \
15943 (strncmp ("_vt.", name, strlen ("_vt.")) == 0 \
15944 || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0 \
15945 || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0 \
15946 || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0 \
15947 || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
15948
15949 void
rs6000_output_symbol_ref(FILE * file,rtx x)15950 rs6000_output_symbol_ref (FILE *file, rtx x)
15951 {
15952 /* Currently C++ toc references to vtables can be emitted before it
15953 is decided whether the vtable is public or private. If this is
15954 the case, then the linker will eventually complain that there is
15955 a reference to an unknown section. Thus, for vtables only,
15956 we emit the TOC reference to reference the symbol and not the
15957 section. */
15958 const char *name = XSTR (x, 0);
15959
15960 if (VTABLE_NAME_P (name))
15961 {
15962 RS6000_OUTPUT_BASENAME (file, name);
15963 }
15964 else
15965 assemble_name (file, name);
15966 }
15967
15968 /* Output a TOC entry. We derive the entry name from what is being
15969 written. */
15970
15971 void
output_toc(FILE * file,rtx x,int labelno,enum machine_mode mode)15972 output_toc (FILE *file, rtx x, int labelno, enum machine_mode mode)
15973 {
15974 char buf[256];
15975 const char *name = buf;
15976 const char *real_name;
15977 rtx base = x;
15978 HOST_WIDE_INT offset = 0;
15979
15980 gcc_assert (!TARGET_NO_TOC);
15981
15982 /* When the linker won't eliminate them, don't output duplicate
15983 TOC entries (this happens on AIX if there is any kind of TOC,
15984 and on SVR4 under -fPIC or -mrelocatable). Don't do this for
15985 CODE_LABELs. */
15986 if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
15987 {
15988 struct toc_hash_struct *h;
15989 void * * found;
15990
15991 /* Create toc_hash_table. This can't be done at OVERRIDE_OPTIONS
15992 time because GGC is not initialized at that point. */
15993 if (toc_hash_table == NULL)
15994 toc_hash_table = htab_create_ggc (1021, toc_hash_function,
15995 toc_hash_eq, NULL);
15996
15997 h = ggc_alloc (sizeof (*h));
15998 h->key = x;
15999 h->key_mode = mode;
16000 h->labelno = labelno;
16001
16002 found = htab_find_slot (toc_hash_table, h, 1);
16003 if (*found == NULL)
16004 *found = h;
16005 else /* This is indeed a duplicate.
16006 Set this label equal to that label. */
16007 {
16008 fputs ("\t.set ", file);
16009 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
16010 fprintf (file, "%d,", labelno);
16011 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
16012 fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
16013 found)->labelno));
16014 return;
16015 }
16016 }
16017
16018 /* If we're going to put a double constant in the TOC, make sure it's
16019 aligned properly when strict alignment is on. */
16020 if (GET_CODE (x) == CONST_DOUBLE
16021 && STRICT_ALIGNMENT
16022 && GET_MODE_BITSIZE (mode) >= 64
16023 && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
16024 ASM_OUTPUT_ALIGN (file, 3);
16025 }
16026
16027 (*targetm.asm_out.internal_label) (file, "LC", labelno);
16028
16029 /* Handle FP constants specially. Note that if we have a minimal
16030 TOC, things we put here aren't actually in the TOC, so we can allow
16031 FP constants. */
16032 if (GET_CODE (x) == CONST_DOUBLE &&
16033 (GET_MODE (x) == TFmode || GET_MODE (x) == TDmode))
16034 {
16035 REAL_VALUE_TYPE rv;
16036 long k[4];
16037
16038 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
16039 if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
16040 REAL_VALUE_TO_TARGET_DECIMAL128 (rv, k);
16041 else
16042 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
16043
16044 if (TARGET_64BIT)
16045 {
16046 if (TARGET_MINIMAL_TOC)
16047 fputs (DOUBLE_INT_ASM_OP, file);
16048 else
16049 fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
16050 k[0] & 0xffffffff, k[1] & 0xffffffff,
16051 k[2] & 0xffffffff, k[3] & 0xffffffff);
16052 fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
16053 k[0] & 0xffffffff, k[1] & 0xffffffff,
16054 k[2] & 0xffffffff, k[3] & 0xffffffff);
16055 return;
16056 }
16057 else
16058 {
16059 if (TARGET_MINIMAL_TOC)
16060 fputs ("\t.long ", file);
16061 else
16062 fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
16063 k[0] & 0xffffffff, k[1] & 0xffffffff,
16064 k[2] & 0xffffffff, k[3] & 0xffffffff);
16065 fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
16066 k[0] & 0xffffffff, k[1] & 0xffffffff,
16067 k[2] & 0xffffffff, k[3] & 0xffffffff);
16068 return;
16069 }
16070 }
16071 else if (GET_CODE (x) == CONST_DOUBLE &&
16072 (GET_MODE (x) == DFmode || GET_MODE (x) == DDmode))
16073 {
16074 REAL_VALUE_TYPE rv;
16075 long k[2];
16076
16077 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
16078
16079 if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
16080 REAL_VALUE_TO_TARGET_DECIMAL64 (rv, k);
16081 else
16082 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
16083
16084 if (TARGET_64BIT)
16085 {
16086 if (TARGET_MINIMAL_TOC)
16087 fputs (DOUBLE_INT_ASM_OP, file);
16088 else
16089 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
16090 k[0] & 0xffffffff, k[1] & 0xffffffff);
16091 fprintf (file, "0x%lx%08lx\n",
16092 k[0] & 0xffffffff, k[1] & 0xffffffff);
16093 return;
16094 }
16095 else
16096 {
16097 if (TARGET_MINIMAL_TOC)
16098 fputs ("\t.long ", file);
16099 else
16100 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
16101 k[0] & 0xffffffff, k[1] & 0xffffffff);
16102 fprintf (file, "0x%lx,0x%lx\n",
16103 k[0] & 0xffffffff, k[1] & 0xffffffff);
16104 return;
16105 }
16106 }
16107 else if (GET_CODE (x) == CONST_DOUBLE &&
16108 (GET_MODE (x) == SFmode || GET_MODE (x) == SDmode))
16109 {
16110 REAL_VALUE_TYPE rv;
16111 long l;
16112
16113 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
16114 if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
16115 REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
16116 else
16117 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
16118
16119 if (TARGET_64BIT)
16120 {
16121 if (TARGET_MINIMAL_TOC)
16122 fputs (DOUBLE_INT_ASM_OP, file);
16123 else
16124 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
16125 fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
16126 return;
16127 }
16128 else
16129 {
16130 if (TARGET_MINIMAL_TOC)
16131 fputs ("\t.long ", file);
16132 else
16133 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
16134 fprintf (file, "0x%lx\n", l & 0xffffffff);
16135 return;
16136 }
16137 }
16138 else if (GET_MODE (x) == VOIDmode
16139 && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
16140 {
16141 unsigned HOST_WIDE_INT low;
16142 HOST_WIDE_INT high;
16143
16144 if (GET_CODE (x) == CONST_DOUBLE)
16145 {
16146 low = CONST_DOUBLE_LOW (x);
16147 high = CONST_DOUBLE_HIGH (x);
16148 }
16149 else
16150 #if HOST_BITS_PER_WIDE_INT == 32
16151 {
16152 low = INTVAL (x);
16153 high = (low & 0x80000000) ? ~0 : 0;
16154 }
16155 #else
16156 {
16157 low = INTVAL (x) & 0xffffffff;
16158 high = (HOST_WIDE_INT) INTVAL (x) >> 32;
16159 }
16160 #endif
16161
16162 /* TOC entries are always Pmode-sized, but since this
16163 is a bigendian machine then if we're putting smaller
16164 integer constants in the TOC we have to pad them.
16165 (This is still a win over putting the constants in
16166 a separate constant pool, because then we'd have
16167 to have both a TOC entry _and_ the actual constant.)
16168
16169 For a 32-bit target, CONST_INT values are loaded and shifted
16170 entirely within `low' and can be stored in one TOC entry. */
16171
16172 /* It would be easy to make this work, but it doesn't now. */
16173 gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
16174
16175 if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
16176 {
16177 #if HOST_BITS_PER_WIDE_INT == 32
16178 lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
16179 POINTER_SIZE, &low, &high, 0);
16180 #else
16181 low |= high << 32;
16182 low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
16183 high = (HOST_WIDE_INT) low >> 32;
16184 low &= 0xffffffff;
16185 #endif
16186 }
16187
16188 if (TARGET_64BIT)
16189 {
16190 if (TARGET_MINIMAL_TOC)
16191 fputs (DOUBLE_INT_ASM_OP, file);
16192 else
16193 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
16194 (long) high & 0xffffffff, (long) low & 0xffffffff);
16195 fprintf (file, "0x%lx%08lx\n",
16196 (long) high & 0xffffffff, (long) low & 0xffffffff);
16197 return;
16198 }
16199 else
16200 {
16201 if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
16202 {
16203 if (TARGET_MINIMAL_TOC)
16204 fputs ("\t.long ", file);
16205 else
16206 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
16207 (long) high & 0xffffffff, (long) low & 0xffffffff);
16208 fprintf (file, "0x%lx,0x%lx\n",
16209 (long) high & 0xffffffff, (long) low & 0xffffffff);
16210 }
16211 else
16212 {
16213 if (TARGET_MINIMAL_TOC)
16214 fputs ("\t.long ", file);
16215 else
16216 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
16217 fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
16218 }
16219 return;
16220 }
16221 }
16222
16223 if (GET_CODE (x) == CONST)
16224 {
16225 gcc_assert (GET_CODE (XEXP (x, 0)) == PLUS);
16226
16227 base = XEXP (XEXP (x, 0), 0);
16228 offset = INTVAL (XEXP (XEXP (x, 0), 1));
16229 }
16230
16231 switch (GET_CODE (base))
16232 {
16233 case SYMBOL_REF:
16234 name = XSTR (base, 0);
16235 break;
16236
16237 case LABEL_REF:
16238 ASM_GENERATE_INTERNAL_LABEL (buf, "L",
16239 CODE_LABEL_NUMBER (XEXP (base, 0)));
16240 break;
16241
16242 case CODE_LABEL:
16243 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
16244 break;
16245
16246 default:
16247 gcc_unreachable ();
16248 }
16249
16250 real_name = (*targetm.strip_name_encoding) (name);
16251 if (TARGET_MINIMAL_TOC)
16252 fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
16253 else
16254 {
16255 fprintf (file, "\t.tc %s", real_name);
16256
16257 if (offset < 0)
16258 fprintf (file, ".N" HOST_WIDE_INT_PRINT_UNSIGNED, - offset);
16259 else if (offset)
16260 fprintf (file, ".P" HOST_WIDE_INT_PRINT_UNSIGNED, offset);
16261
16262 fputs ("[TC],", file);
16263 }
16264
16265 /* Currently C++ toc references to vtables can be emitted before it
16266 is decided whether the vtable is public or private. If this is
16267 the case, then the linker will eventually complain that there is
16268 a TOC reference to an unknown section. Thus, for vtables only,
16269 we emit the TOC reference to reference the symbol and not the
16270 section. */
16271 if (VTABLE_NAME_P (name))
16272 {
16273 RS6000_OUTPUT_BASENAME (file, name);
16274 if (offset < 0)
16275 fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset);
16276 else if (offset > 0)
16277 fprintf (file, "+" HOST_WIDE_INT_PRINT_DEC, offset);
16278 }
16279 else
16280 output_addr_const (file, x);
16281 putc ('\n', file);
16282 }
16283
16284 /* Output an assembler pseudo-op to write an ASCII string of N characters
16285 starting at P to FILE.
16286
16287 On the RS/6000, we have to do this using the .byte operation and
16288 write out special characters outside the quoted string.
16289 Also, the assembler is broken; very long strings are truncated,
16290 so we must artificially break them up early. */
16291
16292 void
output_ascii(FILE * file,const char * p,int n)16293 output_ascii (FILE *file, const char *p, int n)
16294 {
16295 char c;
16296 int i, count_string;
16297 const char *for_string = "\t.byte \"";
16298 const char *for_decimal = "\t.byte ";
16299 const char *to_close = NULL;
16300
16301 count_string = 0;
16302 for (i = 0; i < n; i++)
16303 {
16304 c = *p++;
16305 if (c >= ' ' && c < 0177)
16306 {
16307 if (for_string)
16308 fputs (for_string, file);
16309 putc (c, file);
16310
16311 /* Write two quotes to get one. */
16312 if (c == '"')
16313 {
16314 putc (c, file);
16315 ++count_string;
16316 }
16317
16318 for_string = NULL;
16319 for_decimal = "\"\n\t.byte ";
16320 to_close = "\"\n";
16321 ++count_string;
16322
16323 if (count_string >= 512)
16324 {
16325 fputs (to_close, file);
16326
16327 for_string = "\t.byte \"";
16328 for_decimal = "\t.byte ";
16329 to_close = NULL;
16330 count_string = 0;
16331 }
16332 }
16333 else
16334 {
16335 if (for_decimal)
16336 fputs (for_decimal, file);
16337 fprintf (file, "%d", c);
16338
16339 for_string = "\n\t.byte \"";
16340 for_decimal = ", ";
16341 to_close = "\n";
16342 count_string = 0;
16343 }
16344 }
16345
16346 /* Now close the string if we have written one. Then end the line. */
16347 if (to_close)
16348 fputs (to_close, file);
16349 }
16350
16351 /* Generate a unique section name for FILENAME for a section type
16352 represented by SECTION_DESC. Output goes into BUF.
16353
16354 SECTION_DESC can be any string, as long as it is different for each
16355 possible section type.
16356
16357 We name the section in the same manner as xlc. The name begins with an
16358 underscore followed by the filename (after stripping any leading directory
16359 names) with the last period replaced by the string SECTION_DESC. If
16360 FILENAME does not contain a period, SECTION_DESC is appended to the end of
16361 the name. */
16362
16363 void
rs6000_gen_section_name(char ** buf,const char * filename,const char * section_desc)16364 rs6000_gen_section_name (char **buf, const char *filename,
16365 const char *section_desc)
16366 {
16367 const char *q, *after_last_slash, *last_period = 0;
16368 char *p;
16369 int len;
16370
16371 after_last_slash = filename;
16372 for (q = filename; *q; q++)
16373 {
16374 if (*q == '/')
16375 after_last_slash = q + 1;
16376 else if (*q == '.')
16377 last_period = q;
16378 }
16379
16380 len = strlen (after_last_slash) + strlen (section_desc) + 2;
16381 *buf = (char *) xmalloc (len);
16382
16383 p = *buf;
16384 *p++ = '_';
16385
16386 for (q = after_last_slash; *q; q++)
16387 {
16388 if (q == last_period)
16389 {
16390 strcpy (p, section_desc);
16391 p += strlen (section_desc);
16392 break;
16393 }
16394
16395 else if (ISALNUM (*q))
16396 *p++ = *q;
16397 }
16398
16399 if (last_period == 0)
16400 strcpy (p, section_desc);
16401 else
16402 *p = '\0';
16403 }
16404
16405 /* Emit profile function. */
16406
16407 void
output_profile_hook(int labelno ATTRIBUTE_UNUSED)16408 output_profile_hook (int labelno ATTRIBUTE_UNUSED)
16409 {
16410 /* Non-standard profiling for kernels, which just saves LR then calls
16411 _mcount without worrying about arg saves. The idea is to change
16412 the function prologue as little as possible as it isn't easy to
16413 account for arg save/restore code added just for _mcount. */
16414 if (TARGET_PROFILE_KERNEL)
16415 return;
16416
16417 if (DEFAULT_ABI == ABI_AIX)
16418 {
16419 #ifndef NO_PROFILE_COUNTERS
16420 # define NO_PROFILE_COUNTERS 0
16421 #endif
16422 if (NO_PROFILE_COUNTERS)
16423 emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 0);
16424 else
16425 {
16426 char buf[30];
16427 const char *label_name;
16428 rtx fun;
16429
16430 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
16431 label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
16432 fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
16433
16434 emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 1,
16435 fun, Pmode);
16436 }
16437 }
16438 else if (DEFAULT_ABI == ABI_DARWIN)
16439 {
16440 const char *mcount_name = RS6000_MCOUNT;
16441 int caller_addr_regno = LINK_REGISTER_REGNUM;
16442
16443 /* Be conservative and always set this, at least for now. */
16444 current_function_uses_pic_offset_table = 1;
16445
16446 #if TARGET_MACHO
16447 /* For PIC code, set up a stub and collect the caller's address
16448 from r0, which is where the prologue puts it. */
16449 if (MACHOPIC_INDIRECT
16450 && current_function_uses_pic_offset_table)
16451 caller_addr_regno = 0;
16452 #endif
16453 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
16454 0, VOIDmode, 1,
16455 gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
16456 }
16457 }
16458
16459 /* Write function profiler code. */
16460
16461 void
output_function_profiler(FILE * file,int labelno)16462 output_function_profiler (FILE *file, int labelno)
16463 {
16464 char buf[100];
16465
16466 switch (DEFAULT_ABI)
16467 {
16468 default:
16469 gcc_unreachable ();
16470
16471 case ABI_V4:
16472 if (!TARGET_32BIT)
16473 {
16474 warning (0, "no profiling of 64-bit code for this ABI");
16475 return;
16476 }
16477 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
16478 fprintf (file, "\tmflr %s\n", reg_names[0]);
16479 if (NO_PROFILE_COUNTERS)
16480 {
16481 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
16482 reg_names[0], reg_names[1]);
16483 }
16484 else if (TARGET_SECURE_PLT && flag_pic)
16485 {
16486 asm_fprintf (file, "\tbcl 20,31,1f\n1:\n\t{st|stw} %s,4(%s)\n",
16487 reg_names[0], reg_names[1]);
16488 asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
16489 asm_fprintf (file, "\t{cau|addis} %s,%s,",
16490 reg_names[12], reg_names[12]);
16491 assemble_name (file, buf);
16492 asm_fprintf (file, "-1b@ha\n\t{cal|la} %s,", reg_names[0]);
16493 assemble_name (file, buf);
16494 asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
16495 }
16496 else if (flag_pic == 1)
16497 {
16498 fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
16499 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
16500 reg_names[0], reg_names[1]);
16501 asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
16502 asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
16503 assemble_name (file, buf);
16504 asm_fprintf (file, "@got(%s)\n", reg_names[12]);
16505 }
16506 else if (flag_pic > 1)
16507 {
16508 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
16509 reg_names[0], reg_names[1]);
16510 /* Now, we need to get the address of the label. */
16511 fputs ("\tbcl 20,31,1f\n\t.long ", file);
16512 assemble_name (file, buf);
16513 fputs ("-.\n1:", file);
16514 asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
16515 asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
16516 reg_names[0], reg_names[11]);
16517 asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
16518 reg_names[0], reg_names[0], reg_names[11]);
16519 }
16520 else
16521 {
16522 asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
16523 assemble_name (file, buf);
16524 fputs ("@ha\n", file);
16525 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
16526 reg_names[0], reg_names[1]);
16527 asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
16528 assemble_name (file, buf);
16529 asm_fprintf (file, "@l(%s)\n", reg_names[12]);
16530 }
16531
16532 /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH. */
16533 fprintf (file, "\tbl %s%s\n",
16534 RS6000_MCOUNT, flag_pic ? "@plt" : "");
16535 break;
16536
16537 case ABI_AIX:
16538 case ABI_DARWIN:
16539 if (!TARGET_PROFILE_KERNEL)
16540 {
16541 /* Don't do anything, done in output_profile_hook (). */
16542 }
16543 else
16544 {
16545 gcc_assert (!TARGET_32BIT);
16546
16547 asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
16548 asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
16549
16550 if (cfun->static_chain_decl != NULL)
16551 {
16552 asm_fprintf (file, "\tstd %s,24(%s)\n",
16553 reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
16554 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
16555 asm_fprintf (file, "\tld %s,24(%s)\n",
16556 reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
16557 }
16558 else
16559 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
16560 }
16561 break;
16562 }
16563 }
16564
16565
16566 /* Power4 load update and store update instructions are cracked into a
16567 load or store and an integer insn which are executed in the same cycle.
16568 Branches have their own dispatch slot which does not count against the
16569 GCC issue rate, but it changes the program flow so there are no other
16570 instructions to issue in this cycle. */
16571
16572 static int
rs6000_variable_issue(FILE * stream ATTRIBUTE_UNUSED,int verbose ATTRIBUTE_UNUSED,rtx insn,int more)16573 rs6000_variable_issue (FILE *stream ATTRIBUTE_UNUSED,
16574 int verbose ATTRIBUTE_UNUSED,
16575 rtx insn, int more)
16576 {
16577 if (GET_CODE (PATTERN (insn)) == USE
16578 || GET_CODE (PATTERN (insn)) == CLOBBER)
16579 return more;
16580
16581 if (rs6000_sched_groups)
16582 {
16583 if (is_microcoded_insn (insn))
16584 return 0;
16585 else if (is_cracked_insn (insn))
16586 return more > 2 ? more - 2 : 0;
16587 }
16588
16589 return more - 1;
16590 }
16591
16592 /* Adjust the cost of a scheduling dependency. Return the new cost of
16593 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
16594
16595 static int
rs6000_adjust_cost(rtx insn,rtx link,rtx dep_insn,int cost)16596 rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
16597 {
16598 if (! recog_memoized (insn))
16599 return 0;
16600
16601 if (REG_NOTE_KIND (link) != 0)
16602 return 0;
16603
16604 if (REG_NOTE_KIND (link) == 0)
16605 {
16606 /* Data dependency; DEP_INSN writes a register that INSN reads
16607 some cycles later. */
16608
16609 /* Separate a load from a narrower, dependent store. */
16610 if (rs6000_sched_groups
16611 && GET_CODE (PATTERN (insn)) == SET
16612 && GET_CODE (PATTERN (dep_insn)) == SET
16613 && GET_CODE (XEXP (PATTERN (insn), 1)) == MEM
16614 && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == MEM
16615 && (GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (insn), 1)))
16616 > GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (dep_insn), 0)))))
16617 return cost + 14;
16618
16619 switch (get_attr_type (insn))
16620 {
16621 case TYPE_JMPREG:
16622 /* Tell the first scheduling pass about the latency between
16623 a mtctr and bctr (and mtlr and br/blr). The first
16624 scheduling pass will not know about this latency since
16625 the mtctr instruction, which has the latency associated
16626 to it, will be generated by reload. */
16627 return TARGET_POWER ? 5 : 4;
16628 case TYPE_BRANCH:
16629 /* Leave some extra cycles between a compare and its
16630 dependent branch, to inhibit expensive mispredicts. */
16631 if ((rs6000_cpu_attr == CPU_PPC603
16632 || rs6000_cpu_attr == CPU_PPC604
16633 || rs6000_cpu_attr == CPU_PPC604E
16634 || rs6000_cpu_attr == CPU_PPC620
16635 || rs6000_cpu_attr == CPU_PPC630
16636 || rs6000_cpu_attr == CPU_PPC750
16637 || rs6000_cpu_attr == CPU_PPC7400
16638 || rs6000_cpu_attr == CPU_PPC7450
16639 || rs6000_cpu_attr == CPU_POWER4
16640 || rs6000_cpu_attr == CPU_POWER5)
16641 && recog_memoized (dep_insn)
16642 && (INSN_CODE (dep_insn) >= 0)
16643 && (get_attr_type (dep_insn) == TYPE_CMP
16644 || get_attr_type (dep_insn) == TYPE_COMPARE
16645 || get_attr_type (dep_insn) == TYPE_DELAYED_COMPARE
16646 || get_attr_type (dep_insn) == TYPE_IMUL_COMPARE
16647 || get_attr_type (dep_insn) == TYPE_LMUL_COMPARE
16648 || get_attr_type (dep_insn) == TYPE_FPCOMPARE
16649 || get_attr_type (dep_insn) == TYPE_CR_LOGICAL
16650 || get_attr_type (dep_insn) == TYPE_DELAYED_CR))
16651 return cost + 2;
16652 default:
16653 break;
16654 }
16655 /* Fall out to return default cost. */
16656 }
16657
16658 return cost;
16659 }
16660
16661 /* The function returns a true if INSN is microcoded.
16662 Return false otherwise. */
16663
16664 static bool
is_microcoded_insn(rtx insn)16665 is_microcoded_insn (rtx insn)
16666 {
16667 if (!insn || !INSN_P (insn)
16668 || GET_CODE (PATTERN (insn)) == USE
16669 || GET_CODE (PATTERN (insn)) == CLOBBER)
16670 return false;
16671
16672 if (rs6000_sched_groups)
16673 {
16674 enum attr_type type = get_attr_type (insn);
16675 if (type == TYPE_LOAD_EXT_U
16676 || type == TYPE_LOAD_EXT_UX
16677 || type == TYPE_LOAD_UX
16678 || type == TYPE_STORE_UX
16679 || type == TYPE_MFCR)
16680 return true;
16681 }
16682
16683 return false;
16684 }
16685
16686 /* The function returns a nonzero value if INSN can be scheduled only
16687 as the first insn in a dispatch group ("dispatch-slot restricted").
16688 In this case, the returned value indicates how many dispatch slots
16689 the insn occupies (at the beginning of the group).
16690 Return 0 otherwise. */
16691
16692 static int
is_dispatch_slot_restricted(rtx insn)16693 is_dispatch_slot_restricted (rtx insn)
16694 {
16695 enum attr_type type;
16696
16697 if (!rs6000_sched_groups)
16698 return 0;
16699
16700 if (!insn
16701 || insn == NULL_RTX
16702 || GET_CODE (insn) == NOTE
16703 || GET_CODE (PATTERN (insn)) == USE
16704 || GET_CODE (PATTERN (insn)) == CLOBBER)
16705 return 0;
16706
16707 type = get_attr_type (insn);
16708
16709 switch (type)
16710 {
16711 case TYPE_MFCR:
16712 case TYPE_MFCRF:
16713 case TYPE_MTCR:
16714 case TYPE_DELAYED_CR:
16715 case TYPE_CR_LOGICAL:
16716 case TYPE_MTJMPR:
16717 case TYPE_MFJMPR:
16718 return 1;
16719 case TYPE_IDIV:
16720 case TYPE_LDIV:
16721 return 2;
16722 case TYPE_LOAD_L:
16723 case TYPE_STORE_C:
16724 case TYPE_ISYNC:
16725 case TYPE_SYNC:
16726 return 4;
16727 default:
16728 if (rs6000_cpu == PROCESSOR_POWER5
16729 && is_cracked_insn (insn))
16730 return 2;
16731 return 0;
16732 }
16733 }
16734
16735 /* The function returns true if INSN is cracked into 2 instructions
16736 by the processor (and therefore occupies 2 issue slots). */
16737
16738 static bool
is_cracked_insn(rtx insn)16739 is_cracked_insn (rtx insn)
16740 {
16741 if (!insn || !INSN_P (insn)
16742 || GET_CODE (PATTERN (insn)) == USE
16743 || GET_CODE (PATTERN (insn)) == CLOBBER)
16744 return false;
16745
16746 if (rs6000_sched_groups)
16747 {
16748 enum attr_type type = get_attr_type (insn);
16749 if (type == TYPE_LOAD_U || type == TYPE_STORE_U
16750 || type == TYPE_FPLOAD_U || type == TYPE_FPSTORE_U
16751 || type == TYPE_FPLOAD_UX || type == TYPE_FPSTORE_UX
16752 || type == TYPE_LOAD_EXT || type == TYPE_DELAYED_CR
16753 || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
16754 || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
16755 || type == TYPE_IDIV || type == TYPE_LDIV
16756 || type == TYPE_INSERT_WORD)
16757 return true;
16758 }
16759
16760 return false;
16761 }
16762
16763 /* The function returns true if INSN can be issued only from
16764 the branch slot. */
16765
16766 static bool
is_branch_slot_insn(rtx insn)16767 is_branch_slot_insn (rtx insn)
16768 {
16769 if (!insn || !INSN_P (insn)
16770 || GET_CODE (PATTERN (insn)) == USE
16771 || GET_CODE (PATTERN (insn)) == CLOBBER)
16772 return false;
16773
16774 if (rs6000_sched_groups)
16775 {
16776 enum attr_type type = get_attr_type (insn);
16777 if (type == TYPE_BRANCH || type == TYPE_JMPREG)
16778 return true;
16779 return false;
16780 }
16781
16782 return false;
16783 }
16784
16785 /* A C statement (sans semicolon) to update the integer scheduling
16786 priority INSN_PRIORITY (INSN). Increase the priority to execute the
16787 INSN earlier, reduce the priority to execute INSN later. Do not
16788 define this macro if you do not need to adjust the scheduling
16789 priorities of insns. */
16790
16791 static int
rs6000_adjust_priority(rtx insn ATTRIBUTE_UNUSED,int priority)16792 rs6000_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
16793 {
16794 /* On machines (like the 750) which have asymmetric integer units,
16795 where one integer unit can do multiply and divides and the other
16796 can't, reduce the priority of multiply/divide so it is scheduled
16797 before other integer operations. */
16798
16799 #if 0
16800 if (! INSN_P (insn))
16801 return priority;
16802
16803 if (GET_CODE (PATTERN (insn)) == USE)
16804 return priority;
16805
16806 switch (rs6000_cpu_attr) {
16807 case CPU_PPC750:
16808 switch (get_attr_type (insn))
16809 {
16810 default:
16811 break;
16812
16813 case TYPE_IMUL:
16814 case TYPE_IDIV:
16815 fprintf (stderr, "priority was %#x (%d) before adjustment\n",
16816 priority, priority);
16817 if (priority >= 0 && priority < 0x01000000)
16818 priority >>= 3;
16819 break;
16820 }
16821 }
16822 #endif
16823
16824 if (is_dispatch_slot_restricted (insn)
16825 && reload_completed
16826 && current_sched_info->sched_max_insns_priority
16827 && rs6000_sched_restricted_insns_priority)
16828 {
16829
16830 /* Prioritize insns that can be dispatched only in the first
16831 dispatch slot. */
16832 if (rs6000_sched_restricted_insns_priority == 1)
16833 /* Attach highest priority to insn. This means that in
16834 haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
16835 precede 'priority' (critical path) considerations. */
16836 return current_sched_info->sched_max_insns_priority;
16837 else if (rs6000_sched_restricted_insns_priority == 2)
16838 /* Increase priority of insn by a minimal amount. This means that in
16839 haifa-sched.c:ready_sort(), only 'priority' (critical path)
16840 considerations precede dispatch-slot restriction considerations. */
16841 return (priority + 1);
16842 }
16843
16844 return priority;
16845 }
16846
16847 /* Return how many instructions the machine can issue per cycle. */
16848
16849 static int
rs6000_issue_rate(void)16850 rs6000_issue_rate (void)
16851 {
16852 /* Use issue rate of 1 for first scheduling pass to decrease degradation. */
16853 if (!reload_completed)
16854 return 1;
16855
16856 switch (rs6000_cpu_attr) {
16857 case CPU_RIOS1: /* ? */
16858 case CPU_RS64A:
16859 case CPU_PPC601: /* ? */
16860 case CPU_PPC7450:
16861 return 3;
16862 case CPU_PPC440:
16863 case CPU_PPC603:
16864 case CPU_PPC750:
16865 case CPU_PPC7400:
16866 case CPU_PPC8540:
16867 return 2;
16868 case CPU_RIOS2:
16869 case CPU_PPC604:
16870 case CPU_PPC604E:
16871 case CPU_PPC620:
16872 case CPU_PPC630:
16873 return 4;
16874 case CPU_POWER4:
16875 case CPU_POWER5:
16876 return 5;
16877 default:
16878 return 1;
16879 }
16880 }
16881
16882 /* Return how many instructions to look ahead for better insn
16883 scheduling. */
16884
16885 static int
rs6000_use_sched_lookahead(void)16886 rs6000_use_sched_lookahead (void)
16887 {
16888 if (rs6000_cpu_attr == CPU_PPC8540)
16889 return 4;
16890 return 0;
16891 }
16892
16893 /* Determine is PAT refers to memory. */
16894
16895 static bool
is_mem_ref(rtx pat)16896 is_mem_ref (rtx pat)
16897 {
16898 const char * fmt;
16899 int i, j;
16900 bool ret = false;
16901
16902 if (GET_CODE (pat) == MEM)
16903 return true;
16904
16905 /* Recursively process the pattern. */
16906 fmt = GET_RTX_FORMAT (GET_CODE (pat));
16907
16908 for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0 && !ret; i--)
16909 {
16910 if (fmt[i] == 'e')
16911 ret |= is_mem_ref (XEXP (pat, i));
16912 else if (fmt[i] == 'E')
16913 for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
16914 ret |= is_mem_ref (XVECEXP (pat, i, j));
16915 }
16916
16917 return ret;
16918 }
16919
16920 /* Determine if PAT is a PATTERN of a load insn. */
16921
16922 static bool
is_load_insn1(rtx pat)16923 is_load_insn1 (rtx pat)
16924 {
16925 if (!pat || pat == NULL_RTX)
16926 return false;
16927
16928 if (GET_CODE (pat) == SET)
16929 return is_mem_ref (SET_SRC (pat));
16930
16931 if (GET_CODE (pat) == PARALLEL)
16932 {
16933 int i;
16934
16935 for (i = 0; i < XVECLEN (pat, 0); i++)
16936 if (is_load_insn1 (XVECEXP (pat, 0, i)))
16937 return true;
16938 }
16939
16940 return false;
16941 }
16942
16943 /* Determine if INSN loads from memory. */
16944
16945 static bool
is_load_insn(rtx insn)16946 is_load_insn (rtx insn)
16947 {
16948 if (!insn || !INSN_P (insn))
16949 return false;
16950
16951 if (GET_CODE (insn) == CALL_INSN)
16952 return false;
16953
16954 return is_load_insn1 (PATTERN (insn));
16955 }
16956
16957 /* Determine if PAT is a PATTERN of a store insn. */
16958
16959 static bool
is_store_insn1(rtx pat)16960 is_store_insn1 (rtx pat)
16961 {
16962 if (!pat || pat == NULL_RTX)
16963 return false;
16964
16965 if (GET_CODE (pat) == SET)
16966 return is_mem_ref (SET_DEST (pat));
16967
16968 if (GET_CODE (pat) == PARALLEL)
16969 {
16970 int i;
16971
16972 for (i = 0; i < XVECLEN (pat, 0); i++)
16973 if (is_store_insn1 (XVECEXP (pat, 0, i)))
16974 return true;
16975 }
16976
16977 return false;
16978 }
16979
16980 /* Determine if INSN stores to memory. */
16981
16982 static bool
is_store_insn(rtx insn)16983 is_store_insn (rtx insn)
16984 {
16985 if (!insn || !INSN_P (insn))
16986 return false;
16987
16988 return is_store_insn1 (PATTERN (insn));
16989 }
16990
16991 /* Returns whether the dependence between INSN and NEXT is considered
16992 costly by the given target. */
16993
16994 static bool
rs6000_is_costly_dependence(rtx insn,rtx next,rtx link,int cost,int distance)16995 rs6000_is_costly_dependence (rtx insn, rtx next, rtx link, int cost,
16996 int distance)
16997 {
16998 /* If the flag is not enabled - no dependence is considered costly;
16999 allow all dependent insns in the same group.
17000 This is the most aggressive option. */
17001 if (rs6000_sched_costly_dep == no_dep_costly)
17002 return false;
17003
17004 /* If the flag is set to 1 - a dependence is always considered costly;
17005 do not allow dependent instructions in the same group.
17006 This is the most conservative option. */
17007 if (rs6000_sched_costly_dep == all_deps_costly)
17008 return true;
17009
17010 if (rs6000_sched_costly_dep == store_to_load_dep_costly
17011 && is_load_insn (next)
17012 && is_store_insn (insn))
17013 /* Prevent load after store in the same group. */
17014 return true;
17015
17016 if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
17017 && is_load_insn (next)
17018 && is_store_insn (insn)
17019 && (!link || (int) REG_NOTE_KIND (link) == 0))
17020 /* Prevent load after store in the same group if it is a true
17021 dependence. */
17022 return true;
17023
17024 /* The flag is set to X; dependences with latency >= X are considered costly,
17025 and will not be scheduled in the same group. */
17026 if (rs6000_sched_costly_dep <= max_dep_latency
17027 && ((cost - distance) >= (int)rs6000_sched_costly_dep))
17028 return true;
17029
17030 return false;
17031 }
17032
17033 /* Return the next insn after INSN that is found before TAIL is reached,
17034 skipping any "non-active" insns - insns that will not actually occupy
17035 an issue slot. Return NULL_RTX if such an insn is not found. */
17036
17037 static rtx
get_next_active_insn(rtx insn,rtx tail)17038 get_next_active_insn (rtx insn, rtx tail)
17039 {
17040 if (insn == NULL_RTX || insn == tail)
17041 return NULL_RTX;
17042
17043 while (1)
17044 {
17045 insn = NEXT_INSN (insn);
17046 if (insn == NULL_RTX || insn == tail)
17047 return NULL_RTX;
17048
17049 if (CALL_P (insn)
17050 || JUMP_P (insn)
17051 || (NONJUMP_INSN_P (insn)
17052 && GET_CODE (PATTERN (insn)) != USE
17053 && GET_CODE (PATTERN (insn)) != CLOBBER
17054 && INSN_CODE (insn) != CODE_FOR_stack_tie))
17055 break;
17056 }
17057 return insn;
17058 }
17059
17060 /* Return whether the presence of INSN causes a dispatch group termination
17061 of group WHICH_GROUP.
17062
17063 If WHICH_GROUP == current_group, this function will return true if INSN
17064 causes the termination of the current group (i.e, the dispatch group to
17065 which INSN belongs). This means that INSN will be the last insn in the
17066 group it belongs to.
17067
17068 If WHICH_GROUP == previous_group, this function will return true if INSN
17069 causes the termination of the previous group (i.e, the dispatch group that
17070 precedes the group to which INSN belongs). This means that INSN will be
17071 the first insn in the group it belongs to). */
17072
17073 static bool
insn_terminates_group_p(rtx insn,enum group_termination which_group)17074 insn_terminates_group_p (rtx insn, enum group_termination which_group)
17075 {
17076 enum attr_type type;
17077
17078 if (! insn)
17079 return false;
17080
17081 type = get_attr_type (insn);
17082
17083 if (is_microcoded_insn (insn))
17084 return true;
17085
17086 if (which_group == current_group)
17087 {
17088 if (is_branch_slot_insn (insn))
17089 return true;
17090 return false;
17091 }
17092 else if (which_group == previous_group)
17093 {
17094 if (is_dispatch_slot_restricted (insn))
17095 return true;
17096 return false;
17097 }
17098
17099 return false;
17100 }
17101
17102 /* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
17103 dispatch group) from the insns in GROUP_INSNS. Return false otherwise. */
17104
17105 static bool
is_costly_group(rtx * group_insns,rtx next_insn)17106 is_costly_group (rtx *group_insns, rtx next_insn)
17107 {
17108 int i;
17109 rtx link;
17110 int cost;
17111 int issue_rate = rs6000_issue_rate ();
17112
17113 for (i = 0; i < issue_rate; i++)
17114 {
17115 rtx insn = group_insns[i];
17116 if (!insn)
17117 continue;
17118 for (link = INSN_DEPEND (insn); link != 0; link = XEXP (link, 1))
17119 {
17120 rtx next = XEXP (link, 0);
17121 if (next == next_insn)
17122 {
17123 cost = insn_cost (insn, link, next_insn);
17124 if (rs6000_is_costly_dependence (insn, next_insn, link, cost, 0))
17125 return true;
17126 }
17127 }
17128 }
17129
17130 return false;
17131 }
17132
17133 /* Utility of the function redefine_groups.
17134 Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
17135 in the same dispatch group. If so, insert nops before NEXT_INSN, in order
17136 to keep it "far" (in a separate group) from GROUP_INSNS, following
17137 one of the following schemes, depending on the value of the flag
17138 -minsert_sched_nops = X:
17139 (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
17140 in order to force NEXT_INSN into a separate group.
17141 (2) X < sched_finish_regroup_exact: insert exactly X nops.
17142 GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
17143 insertion (has a group just ended, how many vacant issue slots remain in the
17144 last group, and how many dispatch groups were encountered so far). */
17145
17146 static int
force_new_group(int sched_verbose,FILE * dump,rtx * group_insns,rtx next_insn,bool * group_end,int can_issue_more,int * group_count)17147 force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
17148 rtx next_insn, bool *group_end, int can_issue_more,
17149 int *group_count)
17150 {
17151 rtx nop;
17152 bool force;
17153 int issue_rate = rs6000_issue_rate ();
17154 bool end = *group_end;
17155 int i;
17156
17157 if (next_insn == NULL_RTX)
17158 return can_issue_more;
17159
17160 if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
17161 return can_issue_more;
17162
17163 force = is_costly_group (group_insns, next_insn);
17164 if (!force)
17165 return can_issue_more;
17166
17167 if (sched_verbose > 6)
17168 fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
17169 *group_count ,can_issue_more);
17170
17171 if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
17172 {
17173 if (*group_end)
17174 can_issue_more = 0;
17175
17176 /* Since only a branch can be issued in the last issue_slot, it is
17177 sufficient to insert 'can_issue_more - 1' nops if next_insn is not
17178 a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
17179 in this case the last nop will start a new group and the branch
17180 will be forced to the new group. */
17181 if (can_issue_more && !is_branch_slot_insn (next_insn))
17182 can_issue_more--;
17183
17184 while (can_issue_more > 0)
17185 {
17186 nop = gen_nop ();
17187 emit_insn_before (nop, next_insn);
17188 can_issue_more--;
17189 }
17190
17191 *group_end = true;
17192 return 0;
17193 }
17194
17195 if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
17196 {
17197 int n_nops = rs6000_sched_insert_nops;
17198
17199 /* Nops can't be issued from the branch slot, so the effective
17200 issue_rate for nops is 'issue_rate - 1'. */
17201 if (can_issue_more == 0)
17202 can_issue_more = issue_rate;
17203 can_issue_more--;
17204 if (can_issue_more == 0)
17205 {
17206 can_issue_more = issue_rate - 1;
17207 (*group_count)++;
17208 end = true;
17209 for (i = 0; i < issue_rate; i++)
17210 {
17211 group_insns[i] = 0;
17212 }
17213 }
17214
17215 while (n_nops > 0)
17216 {
17217 nop = gen_nop ();
17218 emit_insn_before (nop, next_insn);
17219 if (can_issue_more == issue_rate - 1) /* new group begins */
17220 end = false;
17221 can_issue_more--;
17222 if (can_issue_more == 0)
17223 {
17224 can_issue_more = issue_rate - 1;
17225 (*group_count)++;
17226 end = true;
17227 for (i = 0; i < issue_rate; i++)
17228 {
17229 group_insns[i] = 0;
17230 }
17231 }
17232 n_nops--;
17233 }
17234
17235 /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1'). */
17236 can_issue_more++;
17237
17238 /* Is next_insn going to start a new group? */
17239 *group_end
17240 = (end
17241 || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
17242 || (can_issue_more <= 2 && is_cracked_insn (next_insn))
17243 || (can_issue_more < issue_rate &&
17244 insn_terminates_group_p (next_insn, previous_group)));
17245 if (*group_end && end)
17246 (*group_count)--;
17247
17248 if (sched_verbose > 6)
17249 fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
17250 *group_count, can_issue_more);
17251 return can_issue_more;
17252 }
17253
17254 return can_issue_more;
17255 }
17256
17257 /* This function tries to synch the dispatch groups that the compiler "sees"
17258 with the dispatch groups that the processor dispatcher is expected to
17259 form in practice. It tries to achieve this synchronization by forcing the
17260 estimated processor grouping on the compiler (as opposed to the function
17261 'pad_goups' which tries to force the scheduler's grouping on the processor).
17262
17263 The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
17264 examines the (estimated) dispatch groups that will be formed by the processor
17265 dispatcher. It marks these group boundaries to reflect the estimated
17266 processor grouping, overriding the grouping that the scheduler had marked.
17267 Depending on the value of the flag '-minsert-sched-nops' this function can
17268 force certain insns into separate groups or force a certain distance between
17269 them by inserting nops, for example, if there exists a "costly dependence"
17270 between the insns.
17271
17272 The function estimates the group boundaries that the processor will form as
17273 follows: It keeps track of how many vacant issue slots are available after
17274 each insn. A subsequent insn will start a new group if one of the following
17275 4 cases applies:
17276 - no more vacant issue slots remain in the current dispatch group.
17277 - only the last issue slot, which is the branch slot, is vacant, but the next
17278 insn is not a branch.
17279 - only the last 2 or less issue slots, including the branch slot, are vacant,
17280 which means that a cracked insn (which occupies two issue slots) can't be
17281 issued in this group.
17282 - less than 'issue_rate' slots are vacant, and the next insn always needs to
17283 start a new group. */
17284
17285 static int
redefine_groups(FILE * dump,int sched_verbose,rtx prev_head_insn,rtx tail)17286 redefine_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
17287 {
17288 rtx insn, next_insn;
17289 int issue_rate;
17290 int can_issue_more;
17291 int slot, i;
17292 bool group_end;
17293 int group_count = 0;
17294 rtx *group_insns;
17295
17296 /* Initialize. */
17297 issue_rate = rs6000_issue_rate ();
17298 group_insns = alloca (issue_rate * sizeof (rtx));
17299 for (i = 0; i < issue_rate; i++)
17300 {
17301 group_insns[i] = 0;
17302 }
17303 can_issue_more = issue_rate;
17304 slot = 0;
17305 insn = get_next_active_insn (prev_head_insn, tail);
17306 group_end = false;
17307
17308 while (insn != NULL_RTX)
17309 {
17310 slot = (issue_rate - can_issue_more);
17311 group_insns[slot] = insn;
17312 can_issue_more =
17313 rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
17314 if (insn_terminates_group_p (insn, current_group))
17315 can_issue_more = 0;
17316
17317 next_insn = get_next_active_insn (insn, tail);
17318 if (next_insn == NULL_RTX)
17319 return group_count + 1;
17320
17321 /* Is next_insn going to start a new group? */
17322 group_end
17323 = (can_issue_more == 0
17324 || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
17325 || (can_issue_more <= 2 && is_cracked_insn (next_insn))
17326 || (can_issue_more < issue_rate &&
17327 insn_terminates_group_p (next_insn, previous_group)));
17328
17329 can_issue_more = force_new_group (sched_verbose, dump, group_insns,
17330 next_insn, &group_end, can_issue_more,
17331 &group_count);
17332
17333 if (group_end)
17334 {
17335 group_count++;
17336 can_issue_more = 0;
17337 for (i = 0; i < issue_rate; i++)
17338 {
17339 group_insns[i] = 0;
17340 }
17341 }
17342
17343 if (GET_MODE (next_insn) == TImode && can_issue_more)
17344 PUT_MODE (next_insn, VOIDmode);
17345 else if (!can_issue_more && GET_MODE (next_insn) != TImode)
17346 PUT_MODE (next_insn, TImode);
17347
17348 insn = next_insn;
17349 if (can_issue_more == 0)
17350 can_issue_more = issue_rate;
17351 } /* while */
17352
17353 return group_count;
17354 }
17355
17356 /* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
17357 dispatch group boundaries that the scheduler had marked. Pad with nops
17358 any dispatch groups which have vacant issue slots, in order to force the
17359 scheduler's grouping on the processor dispatcher. The function
17360 returns the number of dispatch groups found. */
17361
17362 static int
pad_groups(FILE * dump,int sched_verbose,rtx prev_head_insn,rtx tail)17363 pad_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
17364 {
17365 rtx insn, next_insn;
17366 rtx nop;
17367 int issue_rate;
17368 int can_issue_more;
17369 int group_end;
17370 int group_count = 0;
17371
17372 /* Initialize issue_rate. */
17373 issue_rate = rs6000_issue_rate ();
17374 can_issue_more = issue_rate;
17375
17376 insn = get_next_active_insn (prev_head_insn, tail);
17377 next_insn = get_next_active_insn (insn, tail);
17378
17379 while (insn != NULL_RTX)
17380 {
17381 can_issue_more =
17382 rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
17383
17384 group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
17385
17386 if (next_insn == NULL_RTX)
17387 break;
17388
17389 if (group_end)
17390 {
17391 /* If the scheduler had marked group termination at this location
17392 (between insn and next_indn), and neither insn nor next_insn will
17393 force group termination, pad the group with nops to force group
17394 termination. */
17395 if (can_issue_more
17396 && (rs6000_sched_insert_nops == sched_finish_pad_groups)
17397 && !insn_terminates_group_p (insn, current_group)
17398 && !insn_terminates_group_p (next_insn, previous_group))
17399 {
17400 if (!is_branch_slot_insn (next_insn))
17401 can_issue_more--;
17402
17403 while (can_issue_more)
17404 {
17405 nop = gen_nop ();
17406 emit_insn_before (nop, next_insn);
17407 can_issue_more--;
17408 }
17409 }
17410
17411 can_issue_more = issue_rate;
17412 group_count++;
17413 }
17414
17415 insn = next_insn;
17416 next_insn = get_next_active_insn (insn, tail);
17417 }
17418
17419 return group_count;
17420 }
17421
17422 /* The following function is called at the end of scheduling BB.
17423 After reload, it inserts nops at insn group bundling. */
17424
17425 static void
rs6000_sched_finish(FILE * dump,int sched_verbose)17426 rs6000_sched_finish (FILE *dump, int sched_verbose)
17427 {
17428 int n_groups;
17429
17430 if (sched_verbose)
17431 fprintf (dump, "=== Finishing schedule.\n");
17432
17433 if (reload_completed && rs6000_sched_groups)
17434 {
17435 if (rs6000_sched_insert_nops == sched_finish_none)
17436 return;
17437
17438 if (rs6000_sched_insert_nops == sched_finish_pad_groups)
17439 n_groups = pad_groups (dump, sched_verbose,
17440 current_sched_info->prev_head,
17441 current_sched_info->next_tail);
17442 else
17443 n_groups = redefine_groups (dump, sched_verbose,
17444 current_sched_info->prev_head,
17445 current_sched_info->next_tail);
17446
17447 if (sched_verbose >= 6)
17448 {
17449 fprintf (dump, "ngroups = %d\n", n_groups);
17450 print_rtl (dump, current_sched_info->prev_head);
17451 fprintf (dump, "Done finish_sched\n");
17452 }
17453 }
17454 }
17455
17456 /* Length in units of the trampoline for entering a nested function. */
17457
17458 int
rs6000_trampoline_size(void)17459 rs6000_trampoline_size (void)
17460 {
17461 int ret = 0;
17462
17463 switch (DEFAULT_ABI)
17464 {
17465 default:
17466 gcc_unreachable ();
17467
17468 case ABI_AIX:
17469 ret = (TARGET_32BIT) ? 12 : 24;
17470 break;
17471
17472 case ABI_DARWIN:
17473 case ABI_V4:
17474 ret = (TARGET_32BIT) ? 40 : 48;
17475 break;
17476 }
17477
17478 return ret;
17479 }
17480
17481 /* Emit RTL insns to initialize the variable parts of a trampoline.
17482 FNADDR is an RTX for the address of the function's pure code.
17483 CXT is an RTX for the static chain value for the function. */
17484
17485 void
rs6000_initialize_trampoline(rtx addr,rtx fnaddr,rtx cxt)17486 rs6000_initialize_trampoline (rtx addr, rtx fnaddr, rtx cxt)
17487 {
17488 int regsize = (TARGET_32BIT) ? 4 : 8;
17489 rtx ctx_reg = force_reg (Pmode, cxt);
17490
17491 switch (DEFAULT_ABI)
17492 {
17493 default:
17494 gcc_unreachable ();
17495
17496 /* Macros to shorten the code expansions below. */
17497 #define MEM_DEREF(addr) gen_rtx_MEM (Pmode, memory_address (Pmode, addr))
17498 #define MEM_PLUS(addr,offset) \
17499 gen_rtx_MEM (Pmode, memory_address (Pmode, plus_constant (addr, offset)))
17500
17501 /* Under AIX, just build the 3 word function descriptor */
17502 case ABI_AIX:
17503 {
17504 rtx fn_reg = gen_reg_rtx (Pmode);
17505 rtx toc_reg = gen_reg_rtx (Pmode);
17506 emit_move_insn (fn_reg, MEM_DEREF (fnaddr));
17507 emit_move_insn (toc_reg, MEM_PLUS (fnaddr, regsize));
17508 emit_move_insn (MEM_DEREF (addr), fn_reg);
17509 emit_move_insn (MEM_PLUS (addr, regsize), toc_reg);
17510 emit_move_insn (MEM_PLUS (addr, 2*regsize), ctx_reg);
17511 }
17512 break;
17513
17514 /* Under V.4/eabi/darwin, __trampoline_setup does the real work. */
17515 case ABI_DARWIN:
17516 case ABI_V4:
17517 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
17518 FALSE, VOIDmode, 4,
17519 addr, Pmode,
17520 GEN_INT (rs6000_trampoline_size ()), SImode,
17521 fnaddr, Pmode,
17522 ctx_reg, Pmode);
17523 break;
17524 }
17525
17526 return;
17527 }
17528
17529
17530 /* Table of valid machine attributes. */
17531
17532 const struct attribute_spec rs6000_attribute_table[] =
17533 {
17534 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
17535 { "altivec", 1, 1, false, true, false, rs6000_handle_altivec_attribute },
17536 { "longcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
17537 { "shortcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
17538 { "ms_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute },
17539 { "gcc_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute },
17540 #ifdef SUBTARGET_ATTRIBUTE_TABLE
17541 SUBTARGET_ATTRIBUTE_TABLE,
17542 #endif
17543 { NULL, 0, 0, false, false, false, NULL }
17544 };
17545
17546 /* Handle the "altivec" attribute. The attribute may have
17547 arguments as follows:
17548
17549 __attribute__((altivec(vector__)))
17550 __attribute__((altivec(pixel__))) (always followed by 'unsigned short')
17551 __attribute__((altivec(bool__))) (always followed by 'unsigned')
17552
17553 and may appear more than once (e.g., 'vector bool char') in a
17554 given declaration. */
17555
17556 static tree
rs6000_handle_altivec_attribute(tree * node,tree name ATTRIBUTE_UNUSED,tree args,int flags ATTRIBUTE_UNUSED,bool * no_add_attrs)17557 rs6000_handle_altivec_attribute (tree *node,
17558 tree name ATTRIBUTE_UNUSED,
17559 tree args,
17560 int flags ATTRIBUTE_UNUSED,
17561 bool *no_add_attrs)
17562 {
17563 tree type = *node, result = NULL_TREE;
17564 enum machine_mode mode;
17565 int unsigned_p;
17566 char altivec_type
17567 = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
17568 && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
17569 ? *IDENTIFIER_POINTER (TREE_VALUE (args))
17570 : '?');
17571
17572 while (POINTER_TYPE_P (type)
17573 || TREE_CODE (type) == FUNCTION_TYPE
17574 || TREE_CODE (type) == METHOD_TYPE
17575 || TREE_CODE (type) == ARRAY_TYPE)
17576 type = TREE_TYPE (type);
17577
17578 mode = TYPE_MODE (type);
17579
17580 /* Check for invalid AltiVec type qualifiers. */
17581 if (type == long_unsigned_type_node || type == long_integer_type_node)
17582 {
17583 if (TARGET_64BIT)
17584 error ("use of %<long%> in AltiVec types is invalid for 64-bit code");
17585 else if (rs6000_warn_altivec_long)
17586 warning (0, "use of %<long%> in AltiVec types is deprecated; use %<int%>");
17587 }
17588 else if (type == long_long_unsigned_type_node
17589 || type == long_long_integer_type_node)
17590 error ("use of %<long long%> in AltiVec types is invalid");
17591 else if (type == double_type_node)
17592 error ("use of %<double%> in AltiVec types is invalid");
17593 else if (type == long_double_type_node)
17594 error ("use of %<long double%> in AltiVec types is invalid");
17595 else if (type == boolean_type_node)
17596 error ("use of boolean types in AltiVec types is invalid");
17597 else if (TREE_CODE (type) == COMPLEX_TYPE)
17598 error ("use of %<complex%> in AltiVec types is invalid");
17599 else if (DECIMAL_FLOAT_MODE_P (mode))
17600 error ("use of decimal floating point types in AltiVec types is invalid");
17601
17602 switch (altivec_type)
17603 {
17604 case 'v':
17605 unsigned_p = TYPE_UNSIGNED (type);
17606 switch (mode)
17607 {
17608 case SImode:
17609 result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
17610 break;
17611 case HImode:
17612 result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
17613 break;
17614 case QImode:
17615 result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
17616 break;
17617 case SFmode: result = V4SF_type_node; break;
17618 /* If the user says 'vector int bool', we may be handed the 'bool'
17619 attribute _before_ the 'vector' attribute, and so select the
17620 proper type in the 'b' case below. */
17621 case V4SImode: case V8HImode: case V16QImode: case V4SFmode:
17622 result = type;
17623 default: break;
17624 }
17625 break;
17626 case 'b':
17627 switch (mode)
17628 {
17629 case SImode: case V4SImode: result = bool_V4SI_type_node; break;
17630 case HImode: case V8HImode: result = bool_V8HI_type_node; break;
17631 case QImode: case V16QImode: result = bool_V16QI_type_node;
17632 default: break;
17633 }
17634 break;
17635 case 'p':
17636 switch (mode)
17637 {
17638 case V8HImode: result = pixel_V8HI_type_node;
17639 default: break;
17640 }
17641 default: break;
17642 }
17643
17644 if (result && result != type && TYPE_READONLY (type))
17645 result = build_qualified_type (result, TYPE_QUAL_CONST);
17646
17647 *no_add_attrs = true; /* No need to hang on to the attribute. */
17648
17649 if (result)
17650 *node = reconstruct_complex_type (*node, result);
17651
17652 return NULL_TREE;
17653 }
17654
17655 /* AltiVec defines four built-in scalar types that serve as vector
17656 elements; we must teach the compiler how to mangle them. */
17657
17658 static const char *
rs6000_mangle_fundamental_type(tree type)17659 rs6000_mangle_fundamental_type (tree type)
17660 {
17661 if (type == bool_char_type_node) return "U6__boolc";
17662 if (type == bool_short_type_node) return "U6__bools";
17663 if (type == pixel_type_node) return "u7__pixel";
17664 if (type == bool_int_type_node) return "U6__booli";
17665
17666 /* Mangle IBM extended float long double as `g' (__float128) on
17667 powerpc*-linux where long-double-64 previously was the default. */
17668 if (TYPE_MAIN_VARIANT (type) == long_double_type_node
17669 && TARGET_ELF
17670 && TARGET_LONG_DOUBLE_128
17671 && !TARGET_IEEEQUAD)
17672 return "g";
17673
17674 /* For all other types, use normal C++ mangling. */
17675 return NULL;
17676 }
17677
17678 /* Handle a "longcall" or "shortcall" attribute; arguments as in
17679 struct attribute_spec.handler. */
17680
17681 static tree
rs6000_handle_longcall_attribute(tree * node,tree name,tree args ATTRIBUTE_UNUSED,int flags ATTRIBUTE_UNUSED,bool * no_add_attrs)17682 rs6000_handle_longcall_attribute (tree *node, tree name,
17683 tree args ATTRIBUTE_UNUSED,
17684 int flags ATTRIBUTE_UNUSED,
17685 bool *no_add_attrs)
17686 {
17687 if (TREE_CODE (*node) != FUNCTION_TYPE
17688 && TREE_CODE (*node) != FIELD_DECL
17689 && TREE_CODE (*node) != TYPE_DECL)
17690 {
17691 warning (OPT_Wattributes, "%qs attribute only applies to functions",
17692 IDENTIFIER_POINTER (name));
17693 *no_add_attrs = true;
17694 }
17695
17696 return NULL_TREE;
17697 }
17698
17699 /* Set longcall attributes on all functions declared when
17700 rs6000_default_long_calls is true. */
17701 static void
rs6000_set_default_type_attributes(tree type)17702 rs6000_set_default_type_attributes (tree type)
17703 {
17704 if (rs6000_default_long_calls
17705 && (TREE_CODE (type) == FUNCTION_TYPE
17706 || TREE_CODE (type) == METHOD_TYPE))
17707 TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
17708 NULL_TREE,
17709 TYPE_ATTRIBUTES (type));
17710
17711 #if TARGET_MACHO
17712 darwin_set_default_type_attributes (type);
17713 #endif
17714 }
17715
17716 /* Return a reference suitable for calling a function with the
17717 longcall attribute. */
17718
17719 rtx
rs6000_longcall_ref(rtx call_ref)17720 rs6000_longcall_ref (rtx call_ref)
17721 {
17722 const char *call_name;
17723 tree node;
17724
17725 if (GET_CODE (call_ref) != SYMBOL_REF)
17726 return call_ref;
17727
17728 /* System V adds '.' to the internal name, so skip them. */
17729 call_name = XSTR (call_ref, 0);
17730 if (*call_name == '.')
17731 {
17732 while (*call_name == '.')
17733 call_name++;
17734
17735 node = get_identifier (call_name);
17736 call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
17737 }
17738
17739 return force_reg (Pmode, call_ref);
17740 }
17741
17742 #ifndef TARGET_USE_MS_BITFIELD_LAYOUT
17743 #define TARGET_USE_MS_BITFIELD_LAYOUT 0
17744 #endif
17745
17746 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
17747 struct attribute_spec.handler. */
17748 static tree
rs6000_handle_struct_attribute(tree * node,tree name,tree args ATTRIBUTE_UNUSED,int flags ATTRIBUTE_UNUSED,bool * no_add_attrs)17749 rs6000_handle_struct_attribute (tree *node, tree name,
17750 tree args ATTRIBUTE_UNUSED,
17751 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
17752 {
17753 tree *type = NULL;
17754 if (DECL_P (*node))
17755 {
17756 if (TREE_CODE (*node) == TYPE_DECL)
17757 type = &TREE_TYPE (*node);
17758 }
17759 else
17760 type = node;
17761
17762 if (!(type && (TREE_CODE (*type) == RECORD_TYPE
17763 || TREE_CODE (*type) == UNION_TYPE)))
17764 {
17765 warning (OPT_Wattributes, "%qs attribute ignored", IDENTIFIER_POINTER (name));
17766 *no_add_attrs = true;
17767 }
17768
17769 else if ((is_attribute_p ("ms_struct", name)
17770 && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
17771 || ((is_attribute_p ("gcc_struct", name)
17772 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
17773 {
17774 warning (OPT_Wattributes, "%qs incompatible attribute ignored",
17775 IDENTIFIER_POINTER (name));
17776 *no_add_attrs = true;
17777 }
17778
17779 return NULL_TREE;
17780 }
17781
17782 static bool
rs6000_ms_bitfield_layout_p(tree record_type)17783 rs6000_ms_bitfield_layout_p (tree record_type)
17784 {
17785 return (TARGET_USE_MS_BITFIELD_LAYOUT &&
17786 !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
17787 || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
17788 }
17789
17790 #ifdef USING_ELFOS_H
17791
17792 /* A get_unnamed_section callback, used for switching to toc_section. */
17793
17794 static void
rs6000_elf_output_toc_section_asm_op(const void * data ATTRIBUTE_UNUSED)17795 rs6000_elf_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
17796 {
17797 if (DEFAULT_ABI == ABI_AIX
17798 && TARGET_MINIMAL_TOC
17799 && !TARGET_RELOCATABLE)
17800 {
17801 if (!toc_initialized)
17802 {
17803 toc_initialized = 1;
17804 fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
17805 (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0);
17806 fprintf (asm_out_file, "\t.tc ");
17807 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],");
17808 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
17809 fprintf (asm_out_file, "\n");
17810
17811 fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
17812 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
17813 fprintf (asm_out_file, " = .+32768\n");
17814 }
17815 else
17816 fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
17817 }
17818 else if (DEFAULT_ABI == ABI_AIX && !TARGET_RELOCATABLE)
17819 fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
17820 else
17821 {
17822 fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
17823 if (!toc_initialized)
17824 {
17825 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
17826 fprintf (asm_out_file, " = .+32768\n");
17827 toc_initialized = 1;
17828 }
17829 }
17830 }
17831
17832 /* Implement TARGET_ASM_INIT_SECTIONS. */
17833
17834 static void
rs6000_elf_asm_init_sections(void)17835 rs6000_elf_asm_init_sections (void)
17836 {
17837 toc_section
17838 = get_unnamed_section (0, rs6000_elf_output_toc_section_asm_op, NULL);
17839
17840 sdata2_section
17841 = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
17842 SDATA2_SECTION_ASM_OP);
17843 }
17844
17845 /* Implement TARGET_SELECT_RTX_SECTION. */
17846
17847 static section *
rs6000_elf_select_rtx_section(enum machine_mode mode,rtx x,unsigned HOST_WIDE_INT align)17848 rs6000_elf_select_rtx_section (enum machine_mode mode, rtx x,
17849 unsigned HOST_WIDE_INT align)
17850 {
17851 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
17852 return toc_section;
17853 else
17854 return default_elf_select_rtx_section (mode, x, align);
17855 }
17856
17857 /* For a SYMBOL_REF, set generic flags and then perform some
17858 target-specific processing.
17859
17860 When the AIX ABI is requested on a non-AIX system, replace the
17861 function name with the real name (with a leading .) rather than the
17862 function descriptor name. This saves a lot of overriding code to
17863 read the prefixes. */
17864
17865 static void
rs6000_elf_encode_section_info(tree decl,rtx rtl,int first)17866 rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
17867 {
17868 default_encode_section_info (decl, rtl, first);
17869
17870 if (first
17871 && TREE_CODE (decl) == FUNCTION_DECL
17872 && !TARGET_AIX
17873 && DEFAULT_ABI == ABI_AIX)
17874 {
17875 rtx sym_ref = XEXP (rtl, 0);
17876 size_t len = strlen (XSTR (sym_ref, 0));
17877 char *str = alloca (len + 2);
17878 str[0] = '.';
17879 memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
17880 XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
17881 }
17882 }
17883
17884 bool
rs6000_elf_in_small_data_p(tree decl)17885 rs6000_elf_in_small_data_p (tree decl)
17886 {
17887 if (rs6000_sdata == SDATA_NONE)
17888 return false;
17889
17890 /* We want to merge strings, so we never consider them small data. */
17891 if (TREE_CODE (decl) == STRING_CST)
17892 return false;
17893
17894 /* Functions are never in the small data area. */
17895 if (TREE_CODE (decl) == FUNCTION_DECL)
17896 return false;
17897
17898 if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
17899 {
17900 const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
17901 if (strcmp (section, ".sdata") == 0
17902 || strcmp (section, ".sdata2") == 0
17903 || strcmp (section, ".sbss") == 0
17904 || strcmp (section, ".sbss2") == 0
17905 || strcmp (section, ".PPC.EMB.sdata0") == 0
17906 || strcmp (section, ".PPC.EMB.sbss0") == 0)
17907 return true;
17908 }
17909 else
17910 {
17911 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
17912
17913 if (size > 0
17914 && (unsigned HOST_WIDE_INT) size <= g_switch_value
17915 /* If it's not public, and we're not going to reference it there,
17916 there's no need to put it in the small data section. */
17917 && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
17918 return true;
17919 }
17920
17921 return false;
17922 }
17923
17924 #endif /* USING_ELFOS_H */
17925
17926 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P. */
17927
17928 static bool
rs6000_use_blocks_for_constant_p(enum machine_mode mode,rtx x)17929 rs6000_use_blocks_for_constant_p (enum machine_mode mode, rtx x)
17930 {
17931 return !ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode);
17932 }
17933
17934 /* Return a REG that occurs in ADDR with coefficient 1.
17935 ADDR can be effectively incremented by incrementing REG.
17936
17937 r0 is special and we must not select it as an address
17938 register by this routine since our caller will try to
17939 increment the returned register via an "la" instruction. */
17940
17941 rtx
find_addr_reg(rtx addr)17942 find_addr_reg (rtx addr)
17943 {
17944 while (GET_CODE (addr) == PLUS)
17945 {
17946 if (GET_CODE (XEXP (addr, 0)) == REG
17947 && REGNO (XEXP (addr, 0)) != 0)
17948 addr = XEXP (addr, 0);
17949 else if (GET_CODE (XEXP (addr, 1)) == REG
17950 && REGNO (XEXP (addr, 1)) != 0)
17951 addr = XEXP (addr, 1);
17952 else if (CONSTANT_P (XEXP (addr, 0)))
17953 addr = XEXP (addr, 1);
17954 else if (CONSTANT_P (XEXP (addr, 1)))
17955 addr = XEXP (addr, 0);
17956 else
17957 gcc_unreachable ();
17958 }
17959 gcc_assert (GET_CODE (addr) == REG && REGNO (addr) != 0);
17960 return addr;
17961 }
17962
17963 void
rs6000_fatal_bad_address(rtx op)17964 rs6000_fatal_bad_address (rtx op)
17965 {
17966 fatal_insn ("bad address", op);
17967 }
17968
17969 #if TARGET_MACHO
17970
17971 static tree branch_island_list = 0;
17972
17973 /* Remember to generate a branch island for far calls to the given
17974 function. */
17975
17976 static void
add_compiler_branch_island(tree label_name,tree function_name,int line_number)17977 add_compiler_branch_island (tree label_name, tree function_name,
17978 int line_number)
17979 {
17980 tree branch_island = build_tree_list (function_name, label_name);
17981 TREE_TYPE (branch_island) = build_int_cst (NULL_TREE, line_number);
17982 TREE_CHAIN (branch_island) = branch_island_list;
17983 branch_island_list = branch_island;
17984 }
17985
17986 #define BRANCH_ISLAND_LABEL_NAME(BRANCH_ISLAND) TREE_VALUE (BRANCH_ISLAND)
17987 #define BRANCH_ISLAND_FUNCTION_NAME(BRANCH_ISLAND) TREE_PURPOSE (BRANCH_ISLAND)
17988 #define BRANCH_ISLAND_LINE_NUMBER(BRANCH_ISLAND) \
17989 TREE_INT_CST_LOW (TREE_TYPE (BRANCH_ISLAND))
17990
17991 /* Generate far-jump branch islands for everything on the
17992 branch_island_list. Invoked immediately after the last instruction
17993 of the epilogue has been emitted; the branch-islands must be
17994 appended to, and contiguous with, the function body. Mach-O stubs
17995 are generated in machopic_output_stub(). */
17996
17997 static void
macho_branch_islands(void)17998 macho_branch_islands (void)
17999 {
18000 char tmp_buf[512];
18001 tree branch_island;
18002
18003 for (branch_island = branch_island_list;
18004 branch_island;
18005 branch_island = TREE_CHAIN (branch_island))
18006 {
18007 const char *label =
18008 IDENTIFIER_POINTER (BRANCH_ISLAND_LABEL_NAME (branch_island));
18009 const char *name =
18010 IDENTIFIER_POINTER (BRANCH_ISLAND_FUNCTION_NAME (branch_island));
18011 char name_buf[512];
18012 /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF(). */
18013 if (name[0] == '*' || name[0] == '&')
18014 strcpy (name_buf, name+1);
18015 else
18016 {
18017 name_buf[0] = '_';
18018 strcpy (name_buf+1, name);
18019 }
18020 strcpy (tmp_buf, "\n");
18021 strcat (tmp_buf, label);
18022 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
18023 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
18024 dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
18025 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
18026 if (flag_pic)
18027 {
18028 strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
18029 strcat (tmp_buf, label);
18030 strcat (tmp_buf, "_pic\n");
18031 strcat (tmp_buf, label);
18032 strcat (tmp_buf, "_pic:\n\tmflr r11\n");
18033
18034 strcat (tmp_buf, "\taddis r11,r11,ha16(");
18035 strcat (tmp_buf, name_buf);
18036 strcat (tmp_buf, " - ");
18037 strcat (tmp_buf, label);
18038 strcat (tmp_buf, "_pic)\n");
18039
18040 strcat (tmp_buf, "\tmtlr r0\n");
18041
18042 strcat (tmp_buf, "\taddi r12,r11,lo16(");
18043 strcat (tmp_buf, name_buf);
18044 strcat (tmp_buf, " - ");
18045 strcat (tmp_buf, label);
18046 strcat (tmp_buf, "_pic)\n");
18047
18048 strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
18049 }
18050 else
18051 {
18052 strcat (tmp_buf, ":\nlis r12,hi16(");
18053 strcat (tmp_buf, name_buf);
18054 strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
18055 strcat (tmp_buf, name_buf);
18056 strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
18057 }
18058 output_asm_insn (tmp_buf, 0);
18059 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
18060 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
18061 dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
18062 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
18063 }
18064
18065 branch_island_list = 0;
18066 }
18067
18068 /* NO_PREVIOUS_DEF checks in the link list whether the function name is
18069 already there or not. */
18070
18071 static int
no_previous_def(tree function_name)18072 no_previous_def (tree function_name)
18073 {
18074 tree branch_island;
18075 for (branch_island = branch_island_list;
18076 branch_island;
18077 branch_island = TREE_CHAIN (branch_island))
18078 if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
18079 return 0;
18080 return 1;
18081 }
18082
18083 /* GET_PREV_LABEL gets the label name from the previous definition of
18084 the function. */
18085
18086 static tree
get_prev_label(tree function_name)18087 get_prev_label (tree function_name)
18088 {
18089 tree branch_island;
18090 for (branch_island = branch_island_list;
18091 branch_island;
18092 branch_island = TREE_CHAIN (branch_island))
18093 if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
18094 return BRANCH_ISLAND_LABEL_NAME (branch_island);
18095 return 0;
18096 }
18097
18098 #ifndef DARWIN_LINKER_GENERATES_ISLANDS
18099 #define DARWIN_LINKER_GENERATES_ISLANDS 0
18100 #endif
18101
18102 /* KEXTs still need branch islands. */
18103 #define DARWIN_GENERATE_ISLANDS (!DARWIN_LINKER_GENERATES_ISLANDS \
18104 || flag_mkernel || flag_apple_kext)
18105
18106 /* INSN is either a function call or a millicode call. It may have an
18107 unconditional jump in its delay slot.
18108
18109 CALL_DEST is the routine we are calling. */
18110
18111 char *
output_call(rtx insn,rtx * operands,int dest_operand_number,int cookie_operand_number)18112 output_call (rtx insn, rtx *operands, int dest_operand_number,
18113 int cookie_operand_number)
18114 {
18115 static char buf[256];
18116 if (DARWIN_GENERATE_ISLANDS
18117 && GET_CODE (operands[dest_operand_number]) == SYMBOL_REF
18118 && (INTVAL (operands[cookie_operand_number]) & CALL_LONG))
18119 {
18120 tree labelname;
18121 tree funname = get_identifier (XSTR (operands[dest_operand_number], 0));
18122
18123 if (no_previous_def (funname))
18124 {
18125 int line_number = 0;
18126 rtx label_rtx = gen_label_rtx ();
18127 char *label_buf, temp_buf[256];
18128 ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
18129 CODE_LABEL_NUMBER (label_rtx));
18130 label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
18131 labelname = get_identifier (label_buf);
18132 for (; insn && GET_CODE (insn) != NOTE; insn = PREV_INSN (insn));
18133 if (insn)
18134 line_number = NOTE_LINE_NUMBER (insn);
18135 add_compiler_branch_island (labelname, funname, line_number);
18136 }
18137 else
18138 labelname = get_prev_label (funname);
18139
18140 /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
18141 instruction will reach 'foo', otherwise link as 'bl L42'".
18142 "L42" should be a 'branch island', that will do a far jump to
18143 'foo'. Branch islands are generated in
18144 macho_branch_islands(). */
18145 sprintf (buf, "jbsr %%z%d,%.246s",
18146 dest_operand_number, IDENTIFIER_POINTER (labelname));
18147 }
18148 else
18149 sprintf (buf, "bl %%z%d", dest_operand_number);
18150 return buf;
18151 }
18152
18153 /* Generate PIC and indirect symbol stubs. */
18154
18155 void
machopic_output_stub(FILE * file,const char * symb,const char * stub)18156 machopic_output_stub (FILE *file, const char *symb, const char *stub)
18157 {
18158 unsigned int length;
18159 char *symbol_name, *lazy_ptr_name;
18160 char *local_label_0;
18161 static int label = 0;
18162
18163 /* Lose our funky encoding stuff so it doesn't contaminate the stub. */
18164 symb = (*targetm.strip_name_encoding) (symb);
18165
18166
18167 length = strlen (symb);
18168 symbol_name = alloca (length + 32);
18169 GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
18170
18171 lazy_ptr_name = alloca (length + 32);
18172 GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
18173
18174 if (flag_pic == 2)
18175 switch_to_section (darwin_sections[machopic_picsymbol_stub1_section]);
18176 else
18177 switch_to_section (darwin_sections[machopic_symbol_stub1_section]);
18178
18179 if (flag_pic == 2)
18180 {
18181 fprintf (file, "\t.align 5\n");
18182
18183 fprintf (file, "%s:\n", stub);
18184 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
18185
18186 label++;
18187 local_label_0 = alloca (sizeof ("\"L00000000000$spb\""));
18188 sprintf (local_label_0, "\"L%011d$spb\"", label);
18189
18190 fprintf (file, "\tmflr r0\n");
18191 fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
18192 fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
18193 fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
18194 lazy_ptr_name, local_label_0);
18195 fprintf (file, "\tmtlr r0\n");
18196 fprintf (file, "\t%s r12,lo16(%s-%s)(r11)\n",
18197 (TARGET_64BIT ? "ldu" : "lwzu"),
18198 lazy_ptr_name, local_label_0);
18199 fprintf (file, "\tmtctr r12\n");
18200 fprintf (file, "\tbctr\n");
18201 }
18202 else
18203 {
18204 fprintf (file, "\t.align 4\n");
18205
18206 fprintf (file, "%s:\n", stub);
18207 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
18208
18209 fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
18210 fprintf (file, "\t%s r12,lo16(%s)(r11)\n",
18211 (TARGET_64BIT ? "ldu" : "lwzu"),
18212 lazy_ptr_name);
18213 fprintf (file, "\tmtctr r12\n");
18214 fprintf (file, "\tbctr\n");
18215 }
18216
18217 switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
18218 fprintf (file, "%s:\n", lazy_ptr_name);
18219 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
18220 fprintf (file, "%sdyld_stub_binding_helper\n",
18221 (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
18222 }
18223
18224 /* Legitimize PIC addresses. If the address is already
18225 position-independent, we return ORIG. Newly generated
18226 position-independent addresses go into a reg. This is REG if non
18227 zero, otherwise we allocate register(s) as necessary. */
18228
18229 #define SMALL_INT(X) ((UINTVAL (X) + 0x8000) < 0x10000)
18230
18231 rtx
rs6000_machopic_legitimize_pic_address(rtx orig,enum machine_mode mode,rtx reg)18232 rs6000_machopic_legitimize_pic_address (rtx orig, enum machine_mode mode,
18233 rtx reg)
18234 {
18235 rtx base, offset;
18236
18237 if (reg == NULL && ! reload_in_progress && ! reload_completed)
18238 reg = gen_reg_rtx (Pmode);
18239
18240 if (GET_CODE (orig) == CONST)
18241 {
18242 rtx reg_temp;
18243
18244 if (GET_CODE (XEXP (orig, 0)) == PLUS
18245 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
18246 return orig;
18247
18248 gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
18249
18250 /* Use a different reg for the intermediate value, as
18251 it will be marked UNCHANGING. */
18252 reg_temp = no_new_pseudos ? reg : gen_reg_rtx (Pmode);
18253 base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
18254 Pmode, reg_temp);
18255 offset =
18256 rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
18257 Pmode, reg);
18258
18259 if (GET_CODE (offset) == CONST_INT)
18260 {
18261 if (SMALL_INT (offset))
18262 return plus_constant (base, INTVAL (offset));
18263 else if (! reload_in_progress && ! reload_completed)
18264 offset = force_reg (Pmode, offset);
18265 else
18266 {
18267 rtx mem = force_const_mem (Pmode, orig);
18268 return machopic_legitimize_pic_address (mem, Pmode, reg);
18269 }
18270 }
18271 return gen_rtx_PLUS (Pmode, base, offset);
18272 }
18273
18274 /* Fall back on generic machopic code. */
18275 return machopic_legitimize_pic_address (orig, mode, reg);
18276 }
18277
18278 /* Output a .machine directive for the Darwin assembler, and call
18279 the generic start_file routine. */
18280
18281 static void
rs6000_darwin_file_start(void)18282 rs6000_darwin_file_start (void)
18283 {
18284 static const struct
18285 {
18286 const char *arg;
18287 const char *name;
18288 int if_set;
18289 } mapping[] = {
18290 { "ppc64", "ppc64", MASK_64BIT },
18291 { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
18292 { "power4", "ppc970", 0 },
18293 { "G5", "ppc970", 0 },
18294 { "7450", "ppc7450", 0 },
18295 { "7400", "ppc7400", MASK_ALTIVEC },
18296 { "G4", "ppc7400", 0 },
18297 { "750", "ppc750", 0 },
18298 { "740", "ppc750", 0 },
18299 { "G3", "ppc750", 0 },
18300 { "604e", "ppc604e", 0 },
18301 { "604", "ppc604", 0 },
18302 { "603e", "ppc603", 0 },
18303 { "603", "ppc603", 0 },
18304 { "601", "ppc601", 0 },
18305 { NULL, "ppc", 0 } };
18306 const char *cpu_id = "";
18307 size_t i;
18308
18309 rs6000_file_start ();
18310 darwin_file_start ();
18311
18312 /* Determine the argument to -mcpu=. Default to G3 if not specified. */
18313 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
18314 if (rs6000_select[i].set_arch_p && rs6000_select[i].string
18315 && rs6000_select[i].string[0] != '\0')
18316 cpu_id = rs6000_select[i].string;
18317
18318 /* Look through the mapping array. Pick the first name that either
18319 matches the argument, has a bit set in IF_SET that is also set
18320 in the target flags, or has a NULL name. */
18321
18322 i = 0;
18323 while (mapping[i].arg != NULL
18324 && strcmp (mapping[i].arg, cpu_id) != 0
18325 && (mapping[i].if_set & target_flags) == 0)
18326 i++;
18327
18328 fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
18329 }
18330
18331 #endif /* TARGET_MACHO */
18332
18333 #if TARGET_ELF
18334 static int
rs6000_elf_reloc_rw_mask(void)18335 rs6000_elf_reloc_rw_mask (void)
18336 {
18337 if (flag_pic)
18338 return 3;
18339 else if (DEFAULT_ABI == ABI_AIX)
18340 return 2;
18341 else
18342 return 0;
18343 }
18344
18345 /* Record an element in the table of global constructors. SYMBOL is
18346 a SYMBOL_REF of the function to be called; PRIORITY is a number
18347 between 0 and MAX_INIT_PRIORITY.
18348
18349 This differs from default_named_section_asm_out_constructor in
18350 that we have special handling for -mrelocatable. */
18351
18352 static void
rs6000_elf_asm_out_constructor(rtx symbol,int priority)18353 rs6000_elf_asm_out_constructor (rtx symbol, int priority)
18354 {
18355 const char *section = ".ctors";
18356 char buf[16];
18357
18358 if (priority != DEFAULT_INIT_PRIORITY)
18359 {
18360 sprintf (buf, ".ctors.%.5u",
18361 /* Invert the numbering so the linker puts us in the proper
18362 order; constructors are run from right to left, and the
18363 linker sorts in increasing order. */
18364 MAX_INIT_PRIORITY - priority);
18365 section = buf;
18366 }
18367
18368 switch_to_section (get_section (section, SECTION_WRITE, NULL));
18369 assemble_align (POINTER_SIZE);
18370
18371 if (TARGET_RELOCATABLE)
18372 {
18373 fputs ("\t.long (", asm_out_file);
18374 output_addr_const (asm_out_file, symbol);
18375 fputs (")@fixup\n", asm_out_file);
18376 }
18377 else
18378 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
18379 }
18380
18381 static void
rs6000_elf_asm_out_destructor(rtx symbol,int priority)18382 rs6000_elf_asm_out_destructor (rtx symbol, int priority)
18383 {
18384 const char *section = ".dtors";
18385 char buf[16];
18386
18387 if (priority != DEFAULT_INIT_PRIORITY)
18388 {
18389 sprintf (buf, ".dtors.%.5u",
18390 /* Invert the numbering so the linker puts us in the proper
18391 order; constructors are run from right to left, and the
18392 linker sorts in increasing order. */
18393 MAX_INIT_PRIORITY - priority);
18394 section = buf;
18395 }
18396
18397 switch_to_section (get_section (section, SECTION_WRITE, NULL));
18398 assemble_align (POINTER_SIZE);
18399
18400 if (TARGET_RELOCATABLE)
18401 {
18402 fputs ("\t.long (", asm_out_file);
18403 output_addr_const (asm_out_file, symbol);
18404 fputs (")@fixup\n", asm_out_file);
18405 }
18406 else
18407 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
18408 }
18409
18410 void
rs6000_elf_declare_function_name(FILE * file,const char * name,tree decl)18411 rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
18412 {
18413 if (TARGET_64BIT)
18414 {
18415 fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
18416 ASM_OUTPUT_LABEL (file, name);
18417 fputs (DOUBLE_INT_ASM_OP, file);
18418 rs6000_output_function_entry (file, name);
18419 fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
18420 if (DOT_SYMBOLS)
18421 {
18422 fputs ("\t.size\t", file);
18423 assemble_name (file, name);
18424 fputs (",24\n\t.type\t.", file);
18425 assemble_name (file, name);
18426 fputs (",@function\n", file);
18427 if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
18428 {
18429 fputs ("\t.globl\t.", file);
18430 assemble_name (file, name);
18431 putc ('\n', file);
18432 }
18433 }
18434 else
18435 ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
18436 ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
18437 rs6000_output_function_entry (file, name);
18438 fputs (":\n", file);
18439 return;
18440 }
18441
18442 if (TARGET_RELOCATABLE
18443 && !TARGET_SECURE_PLT
18444 && (get_pool_size () != 0 || current_function_profile)
18445 && uses_TOC ())
18446 {
18447 char buf[256];
18448
18449 (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
18450
18451 ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
18452 fprintf (file, "\t.long ");
18453 assemble_name (file, buf);
18454 putc ('-', file);
18455 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
18456 assemble_name (file, buf);
18457 putc ('\n', file);
18458 }
18459
18460 ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
18461 ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
18462
18463 if (DEFAULT_ABI == ABI_AIX)
18464 {
18465 const char *desc_name, *orig_name;
18466
18467 orig_name = (*targetm.strip_name_encoding) (name);
18468 desc_name = orig_name;
18469 while (*desc_name == '.')
18470 desc_name++;
18471
18472 if (TREE_PUBLIC (decl))
18473 fprintf (file, "\t.globl %s\n", desc_name);
18474
18475 fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
18476 fprintf (file, "%s:\n", desc_name);
18477 fprintf (file, "\t.long %s\n", orig_name);
18478 fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
18479 if (DEFAULT_ABI == ABI_AIX)
18480 fputs ("\t.long 0\n", file);
18481 fprintf (file, "\t.previous\n");
18482 }
18483 ASM_OUTPUT_LABEL (file, name);
18484 }
18485
18486 static void
rs6000_elf_end_indicate_exec_stack(void)18487 rs6000_elf_end_indicate_exec_stack (void)
18488 {
18489 if (NEED_INDICATE_EXEC_STACK)
18490 file_end_indicate_exec_stack ();
18491 }
18492 #endif
18493
18494 #if TARGET_XCOFF
18495 static void
rs6000_xcoff_asm_output_anchor(rtx symbol)18496 rs6000_xcoff_asm_output_anchor (rtx symbol)
18497 {
18498 char buffer[100];
18499
18500 sprintf (buffer, "$ + " HOST_WIDE_INT_PRINT_DEC,
18501 SYMBOL_REF_BLOCK_OFFSET (symbol));
18502 ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer);
18503 }
18504
18505 static void
rs6000_xcoff_asm_globalize_label(FILE * stream,const char * name)18506 rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
18507 {
18508 fputs (GLOBAL_ASM_OP, stream);
18509 RS6000_OUTPUT_BASENAME (stream, name);
18510 putc ('\n', stream);
18511 }
18512
18513 /* A get_unnamed_decl callback, used for read-only sections. PTR
18514 points to the section string variable. */
18515
18516 static void
rs6000_xcoff_output_readonly_section_asm_op(const void * directive)18517 rs6000_xcoff_output_readonly_section_asm_op (const void *directive)
18518 {
18519 fprintf (asm_out_file, "\t.csect %s[RO],3\n",
18520 *(const char *const *) directive);
18521 }
18522
18523 /* Likewise for read-write sections. */
18524
18525 static void
rs6000_xcoff_output_readwrite_section_asm_op(const void * directive)18526 rs6000_xcoff_output_readwrite_section_asm_op (const void *directive)
18527 {
18528 fprintf (asm_out_file, "\t.csect %s[RW],3\n",
18529 *(const char *const *) directive);
18530 }
18531
18532 /* A get_unnamed_section callback, used for switching to toc_section. */
18533
18534 static void
rs6000_xcoff_output_toc_section_asm_op(const void * data ATTRIBUTE_UNUSED)18535 rs6000_xcoff_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
18536 {
18537 if (TARGET_MINIMAL_TOC)
18538 {
18539 /* toc_section is always selected at least once from
18540 rs6000_xcoff_file_start, so this is guaranteed to
18541 always be defined once and only once in each file. */
18542 if (!toc_initialized)
18543 {
18544 fputs ("\t.toc\nLCTOC..1:\n", asm_out_file);
18545 fputs ("\t.tc toc_table[TC],toc_table[RW]\n", asm_out_file);
18546 toc_initialized = 1;
18547 }
18548 fprintf (asm_out_file, "\t.csect toc_table[RW]%s\n",
18549 (TARGET_32BIT ? "" : ",3"));
18550 }
18551 else
18552 fputs ("\t.toc\n", asm_out_file);
18553 }
18554
18555 /* Implement TARGET_ASM_INIT_SECTIONS. */
18556
18557 static void
rs6000_xcoff_asm_init_sections(void)18558 rs6000_xcoff_asm_init_sections (void)
18559 {
18560 read_only_data_section
18561 = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
18562 &xcoff_read_only_section_name);
18563
18564 private_data_section
18565 = get_unnamed_section (SECTION_WRITE,
18566 rs6000_xcoff_output_readwrite_section_asm_op,
18567 &xcoff_private_data_section_name);
18568
18569 read_only_private_data_section
18570 = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
18571 &xcoff_private_data_section_name);
18572
18573 toc_section
18574 = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL);
18575
18576 readonly_data_section = read_only_data_section;
18577 exception_section = data_section;
18578 }
18579
18580 static int
rs6000_xcoff_reloc_rw_mask(void)18581 rs6000_xcoff_reloc_rw_mask (void)
18582 {
18583 return 3;
18584 }
18585
18586 static void
rs6000_xcoff_asm_named_section(const char * name,unsigned int flags,tree decl ATTRIBUTE_UNUSED)18587 rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
18588 tree decl ATTRIBUTE_UNUSED)
18589 {
18590 int smclass;
18591 static const char * const suffix[3] = { "PR", "RO", "RW" };
18592
18593 if (flags & SECTION_CODE)
18594 smclass = 0;
18595 else if (flags & SECTION_WRITE)
18596 smclass = 2;
18597 else
18598 smclass = 1;
18599
18600 fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
18601 (flags & SECTION_CODE) ? "." : "",
18602 name, suffix[smclass], flags & SECTION_ENTSIZE);
18603 }
18604
18605 static section *
rs6000_xcoff_select_section(tree decl,int reloc,unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)18606 rs6000_xcoff_select_section (tree decl, int reloc,
18607 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
18608 {
18609 if (decl_readonly_section (decl, reloc))
18610 {
18611 if (TREE_PUBLIC (decl))
18612 return read_only_data_section;
18613 else
18614 return read_only_private_data_section;
18615 }
18616 else
18617 {
18618 if (TREE_PUBLIC (decl))
18619 return data_section;
18620 else
18621 return private_data_section;
18622 }
18623 }
18624
18625 static void
rs6000_xcoff_unique_section(tree decl,int reloc ATTRIBUTE_UNUSED)18626 rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
18627 {
18628 const char *name;
18629
18630 /* Use select_section for private and uninitialized data. */
18631 if (!TREE_PUBLIC (decl)
18632 || DECL_COMMON (decl)
18633 || DECL_INITIAL (decl) == NULL_TREE
18634 || DECL_INITIAL (decl) == error_mark_node
18635 || (flag_zero_initialized_in_bss
18636 && initializer_zerop (DECL_INITIAL (decl))))
18637 return;
18638
18639 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
18640 name = (*targetm.strip_name_encoding) (name);
18641 DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
18642 }
18643
18644 /* Select section for constant in constant pool.
18645
18646 On RS/6000, all constants are in the private read-only data area.
18647 However, if this is being placed in the TOC it must be output as a
18648 toc entry. */
18649
18650 static section *
rs6000_xcoff_select_rtx_section(enum machine_mode mode,rtx x,unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)18651 rs6000_xcoff_select_rtx_section (enum machine_mode mode, rtx x,
18652 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
18653 {
18654 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
18655 return toc_section;
18656 else
18657 return read_only_private_data_section;
18658 }
18659
18660 /* Remove any trailing [DS] or the like from the symbol name. */
18661
18662 static const char *
rs6000_xcoff_strip_name_encoding(const char * name)18663 rs6000_xcoff_strip_name_encoding (const char *name)
18664 {
18665 size_t len;
18666 if (*name == '*')
18667 name++;
18668 len = strlen (name);
18669 if (name[len - 1] == ']')
18670 return ggc_alloc_string (name, len - 4);
18671 else
18672 return name;
18673 }
18674
18675 /* Section attributes. AIX is always PIC. */
18676
18677 static unsigned int
rs6000_xcoff_section_type_flags(tree decl,const char * name,int reloc)18678 rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
18679 {
18680 unsigned int align;
18681 unsigned int flags = default_section_type_flags (decl, name, reloc);
18682
18683 /* Align to at least UNIT size. */
18684 if (flags & SECTION_CODE)
18685 align = MIN_UNITS_PER_WORD;
18686 else
18687 /* Increase alignment of large objects if not already stricter. */
18688 align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
18689 int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
18690 ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
18691
18692 return flags | (exact_log2 (align) & SECTION_ENTSIZE);
18693 }
18694
18695 /* Output at beginning of assembler file.
18696
18697 Initialize the section names for the RS/6000 at this point.
18698
18699 Specify filename, including full path, to assembler.
18700
18701 We want to go into the TOC section so at least one .toc will be emitted.
18702 Also, in order to output proper .bs/.es pairs, we need at least one static
18703 [RW] section emitted.
18704
18705 Finally, declare mcount when profiling to make the assembler happy. */
18706
18707 static void
rs6000_xcoff_file_start(void)18708 rs6000_xcoff_file_start (void)
18709 {
18710 rs6000_gen_section_name (&xcoff_bss_section_name,
18711 main_input_filename, ".bss_");
18712 rs6000_gen_section_name (&xcoff_private_data_section_name,
18713 main_input_filename, ".rw_");
18714 rs6000_gen_section_name (&xcoff_read_only_section_name,
18715 main_input_filename, ".ro_");
18716
18717 fputs ("\t.file\t", asm_out_file);
18718 output_quoted_string (asm_out_file, main_input_filename);
18719 fputc ('\n', asm_out_file);
18720 if (write_symbols != NO_DEBUG)
18721 switch_to_section (private_data_section);
18722 switch_to_section (text_section);
18723 if (profile_flag)
18724 fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
18725 rs6000_file_start ();
18726 }
18727
18728 /* Output at end of assembler file.
18729 On the RS/6000, referencing data should automatically pull in text. */
18730
18731 static void
rs6000_xcoff_file_end(void)18732 rs6000_xcoff_file_end (void)
18733 {
18734 switch_to_section (text_section);
18735 fputs ("_section_.text:\n", asm_out_file);
18736 switch_to_section (data_section);
18737 fputs (TARGET_32BIT
18738 ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
18739 asm_out_file);
18740 }
18741 #endif /* TARGET_XCOFF */
18742
18743 /* Compute a (partial) cost for rtx X. Return true if the complete
18744 cost has been computed, and false if subexpressions should be
18745 scanned. In either case, *TOTAL contains the cost result. */
18746
18747 static bool
rs6000_rtx_costs(rtx x,int code,int outer_code,int * total)18748 rs6000_rtx_costs (rtx x, int code, int outer_code, int *total)
18749 {
18750 enum machine_mode mode = GET_MODE (x);
18751
18752 switch (code)
18753 {
18754 /* On the RS/6000, if it is valid in the insn, it is free. */
18755 case CONST_INT:
18756 if (((outer_code == SET
18757 || outer_code == PLUS
18758 || outer_code == MINUS)
18759 && (satisfies_constraint_I (x)
18760 || satisfies_constraint_L (x)))
18761 || (outer_code == AND
18762 && (satisfies_constraint_K (x)
18763 || (mode == SImode
18764 ? satisfies_constraint_L (x)
18765 : satisfies_constraint_J (x))
18766 || mask_operand (x, mode)
18767 || (mode == DImode
18768 && mask64_operand (x, DImode))))
18769 || ((outer_code == IOR || outer_code == XOR)
18770 && (satisfies_constraint_K (x)
18771 || (mode == SImode
18772 ? satisfies_constraint_L (x)
18773 : satisfies_constraint_J (x))))
18774 || outer_code == ASHIFT
18775 || outer_code == ASHIFTRT
18776 || outer_code == LSHIFTRT
18777 || outer_code == ROTATE
18778 || outer_code == ROTATERT
18779 || outer_code == ZERO_EXTRACT
18780 || (outer_code == MULT
18781 && satisfies_constraint_I (x))
18782 || ((outer_code == DIV || outer_code == UDIV
18783 || outer_code == MOD || outer_code == UMOD)
18784 && exact_log2 (INTVAL (x)) >= 0)
18785 || (outer_code == COMPARE
18786 && (satisfies_constraint_I (x)
18787 || satisfies_constraint_K (x)))
18788 || (outer_code == EQ
18789 && (satisfies_constraint_I (x)
18790 || satisfies_constraint_K (x)
18791 || (mode == SImode
18792 ? satisfies_constraint_L (x)
18793 : satisfies_constraint_J (x))))
18794 || (outer_code == GTU
18795 && satisfies_constraint_I (x))
18796 || (outer_code == LTU
18797 && satisfies_constraint_P (x)))
18798 {
18799 *total = 0;
18800 return true;
18801 }
18802 else if ((outer_code == PLUS
18803 && reg_or_add_cint_operand (x, VOIDmode))
18804 || (outer_code == MINUS
18805 && reg_or_sub_cint_operand (x, VOIDmode))
18806 || ((outer_code == SET
18807 || outer_code == IOR
18808 || outer_code == XOR)
18809 && (INTVAL (x)
18810 & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
18811 {
18812 *total = COSTS_N_INSNS (1);
18813 return true;
18814 }
18815 /* FALLTHRU */
18816
18817 case CONST_DOUBLE:
18818 if (mode == DImode && code == CONST_DOUBLE)
18819 {
18820 if ((outer_code == IOR || outer_code == XOR)
18821 && CONST_DOUBLE_HIGH (x) == 0
18822 && (CONST_DOUBLE_LOW (x)
18823 & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0)
18824 {
18825 *total = 0;
18826 return true;
18827 }
18828 else if ((outer_code == AND && and64_2_operand (x, DImode))
18829 || ((outer_code == SET
18830 || outer_code == IOR
18831 || outer_code == XOR)
18832 && CONST_DOUBLE_HIGH (x) == 0))
18833 {
18834 *total = COSTS_N_INSNS (1);
18835 return true;
18836 }
18837 }
18838 /* FALLTHRU */
18839
18840 case CONST:
18841 case HIGH:
18842 case SYMBOL_REF:
18843 case MEM:
18844 /* When optimizing for size, MEM should be slightly more expensive
18845 than generating address, e.g., (plus (reg) (const)).
18846 L1 cache latency is about two instructions. */
18847 *total = optimize_size ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
18848 return true;
18849
18850 case LABEL_REF:
18851 *total = 0;
18852 return true;
18853
18854 case PLUS:
18855 if (mode == DFmode)
18856 {
18857 if (GET_CODE (XEXP (x, 0)) == MULT)
18858 {
18859 /* FNMA accounted in outer NEG. */
18860 if (outer_code == NEG)
18861 *total = rs6000_cost->dmul - rs6000_cost->fp;
18862 else
18863 *total = rs6000_cost->dmul;
18864 }
18865 else
18866 *total = rs6000_cost->fp;
18867 }
18868 else if (mode == SFmode)
18869 {
18870 /* FNMA accounted in outer NEG. */
18871 if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
18872 *total = 0;
18873 else
18874 *total = rs6000_cost->fp;
18875 }
18876 else
18877 *total = COSTS_N_INSNS (1);
18878 return false;
18879
18880 case MINUS:
18881 if (mode == DFmode)
18882 {
18883 if (GET_CODE (XEXP (x, 0)) == MULT)
18884 {
18885 /* FNMA accounted in outer NEG. */
18886 if (outer_code == NEG)
18887 *total = 0;
18888 else
18889 *total = rs6000_cost->dmul;
18890 }
18891 else
18892 *total = rs6000_cost->fp;
18893 }
18894 else if (mode == SFmode)
18895 {
18896 /* FNMA accounted in outer NEG. */
18897 if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
18898 *total = 0;
18899 else
18900 *total = rs6000_cost->fp;
18901 }
18902 else
18903 *total = COSTS_N_INSNS (1);
18904 return false;
18905
18906 case MULT:
18907 if (GET_CODE (XEXP (x, 1)) == CONST_INT
18908 && satisfies_constraint_I (XEXP (x, 1)))
18909 {
18910 if (INTVAL (XEXP (x, 1)) >= -256
18911 && INTVAL (XEXP (x, 1)) <= 255)
18912 *total = rs6000_cost->mulsi_const9;
18913 else
18914 *total = rs6000_cost->mulsi_const;
18915 }
18916 /* FMA accounted in outer PLUS/MINUS. */
18917 else if ((mode == DFmode || mode == SFmode)
18918 && (outer_code == PLUS || outer_code == MINUS))
18919 *total = 0;
18920 else if (mode == DFmode)
18921 *total = rs6000_cost->dmul;
18922 else if (mode == SFmode)
18923 *total = rs6000_cost->fp;
18924 else if (mode == DImode)
18925 *total = rs6000_cost->muldi;
18926 else
18927 *total = rs6000_cost->mulsi;
18928 return false;
18929
18930 case DIV:
18931 case MOD:
18932 if (FLOAT_MODE_P (mode))
18933 {
18934 *total = mode == DFmode ? rs6000_cost->ddiv
18935 : rs6000_cost->sdiv;
18936 return false;
18937 }
18938 /* FALLTHRU */
18939
18940 case UDIV:
18941 case UMOD:
18942 if (GET_CODE (XEXP (x, 1)) == CONST_INT
18943 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
18944 {
18945 if (code == DIV || code == MOD)
18946 /* Shift, addze */
18947 *total = COSTS_N_INSNS (2);
18948 else
18949 /* Shift */
18950 *total = COSTS_N_INSNS (1);
18951 }
18952 else
18953 {
18954 if (GET_MODE (XEXP (x, 1)) == DImode)
18955 *total = rs6000_cost->divdi;
18956 else
18957 *total = rs6000_cost->divsi;
18958 }
18959 /* Add in shift and subtract for MOD. */
18960 if (code == MOD || code == UMOD)
18961 *total += COSTS_N_INSNS (2);
18962 return false;
18963
18964 case FFS:
18965 *total = COSTS_N_INSNS (4);
18966 return false;
18967
18968 case NOT:
18969 if (outer_code == AND || outer_code == IOR || outer_code == XOR)
18970 {
18971 *total = 0;
18972 return false;
18973 }
18974 /* FALLTHRU */
18975
18976 case AND:
18977 case IOR:
18978 case XOR:
18979 case ZERO_EXTRACT:
18980 *total = COSTS_N_INSNS (1);
18981 return false;
18982
18983 case ASHIFT:
18984 case ASHIFTRT:
18985 case LSHIFTRT:
18986 case ROTATE:
18987 case ROTATERT:
18988 /* Handle mul_highpart. */
18989 if (outer_code == TRUNCATE
18990 && GET_CODE (XEXP (x, 0)) == MULT)
18991 {
18992 if (mode == DImode)
18993 *total = rs6000_cost->muldi;
18994 else
18995 *total = rs6000_cost->mulsi;
18996 return true;
18997 }
18998 else if (outer_code == AND)
18999 *total = 0;
19000 else
19001 *total = COSTS_N_INSNS (1);
19002 return false;
19003
19004 case SIGN_EXTEND:
19005 case ZERO_EXTEND:
19006 if (GET_CODE (XEXP (x, 0)) == MEM)
19007 *total = 0;
19008 else
19009 *total = COSTS_N_INSNS (1);
19010 return false;
19011
19012 case COMPARE:
19013 case NEG:
19014 case ABS:
19015 if (!FLOAT_MODE_P (mode))
19016 {
19017 *total = COSTS_N_INSNS (1);
19018 return false;
19019 }
19020 /* FALLTHRU */
19021
19022 case FLOAT:
19023 case UNSIGNED_FLOAT:
19024 case FIX:
19025 case UNSIGNED_FIX:
19026 case FLOAT_TRUNCATE:
19027 *total = rs6000_cost->fp;
19028 return false;
19029
19030 case FLOAT_EXTEND:
19031 if (mode == DFmode)
19032 *total = 0;
19033 else
19034 *total = rs6000_cost->fp;
19035 return false;
19036
19037 case UNSPEC:
19038 switch (XINT (x, 1))
19039 {
19040 case UNSPEC_FRSP:
19041 *total = rs6000_cost->fp;
19042 return true;
19043
19044 default:
19045 break;
19046 }
19047 break;
19048
19049 case CALL:
19050 case IF_THEN_ELSE:
19051 if (optimize_size)
19052 {
19053 *total = COSTS_N_INSNS (1);
19054 return true;
19055 }
19056 else if (FLOAT_MODE_P (mode)
19057 && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS)
19058 {
19059 *total = rs6000_cost->fp;
19060 return false;
19061 }
19062 break;
19063
19064 case EQ:
19065 case GTU:
19066 case LTU:
19067 /* Carry bit requires mode == Pmode.
19068 NEG or PLUS already counted so only add one. */
19069 if (mode == Pmode
19070 && (outer_code == NEG || outer_code == PLUS))
19071 {
19072 *total = COSTS_N_INSNS (1);
19073 return true;
19074 }
19075 if (outer_code == SET)
19076 {
19077 if (XEXP (x, 1) == const0_rtx)
19078 {
19079 *total = COSTS_N_INSNS (2);
19080 return true;
19081 }
19082 else if (mode == Pmode)
19083 {
19084 *total = COSTS_N_INSNS (3);
19085 return false;
19086 }
19087 }
19088 /* FALLTHRU */
19089
19090 case GT:
19091 case LT:
19092 case UNORDERED:
19093 if (outer_code == SET && (XEXP (x, 1) == const0_rtx))
19094 {
19095 *total = COSTS_N_INSNS (2);
19096 return true;
19097 }
19098 /* CC COMPARE. */
19099 if (outer_code == COMPARE)
19100 {
19101 *total = 0;
19102 return true;
19103 }
19104 break;
19105
19106 default:
19107 break;
19108 }
19109
19110 return false;
19111 }
19112
19113 /* A C expression returning the cost of moving data from a register of class
19114 CLASS1 to one of CLASS2. */
19115
19116 int
rs6000_register_move_cost(enum machine_mode mode,enum reg_class from,enum reg_class to)19117 rs6000_register_move_cost (enum machine_mode mode,
19118 enum reg_class from, enum reg_class to)
19119 {
19120 /* Moves from/to GENERAL_REGS. */
19121 if (reg_classes_intersect_p (to, GENERAL_REGS)
19122 || reg_classes_intersect_p (from, GENERAL_REGS))
19123 {
19124 if (! reg_classes_intersect_p (to, GENERAL_REGS))
19125 from = to;
19126
19127 if (from == FLOAT_REGS || from == ALTIVEC_REGS)
19128 return (rs6000_memory_move_cost (mode, from, 0)
19129 + rs6000_memory_move_cost (mode, GENERAL_REGS, 0));
19130
19131 /* It's more expensive to move CR_REGS than CR0_REGS because of the
19132 shift. */
19133 else if (from == CR_REGS)
19134 return 4;
19135
19136 else
19137 /* A move will cost one instruction per GPR moved. */
19138 return 2 * hard_regno_nregs[0][mode];
19139 }
19140
19141 /* Moving between two similar registers is just one instruction. */
19142 else if (reg_classes_intersect_p (to, from))
19143 return mode == TFmode ? 4 : 2;
19144
19145 /* Everything else has to go through GENERAL_REGS. */
19146 else
19147 return (rs6000_register_move_cost (mode, GENERAL_REGS, to)
19148 + rs6000_register_move_cost (mode, from, GENERAL_REGS));
19149 }
19150
19151 /* A C expressions returning the cost of moving data of MODE from a register to
19152 or from memory. */
19153
19154 int
rs6000_memory_move_cost(enum machine_mode mode,enum reg_class class,int in ATTRIBUTE_UNUSED)19155 rs6000_memory_move_cost (enum machine_mode mode, enum reg_class class,
19156 int in ATTRIBUTE_UNUSED)
19157 {
19158 if (reg_classes_intersect_p (class, GENERAL_REGS))
19159 return 4 * hard_regno_nregs[0][mode];
19160 else if (reg_classes_intersect_p (class, FLOAT_REGS))
19161 return 4 * hard_regno_nregs[32][mode];
19162 else if (reg_classes_intersect_p (class, ALTIVEC_REGS))
19163 return 4 * hard_regno_nregs[FIRST_ALTIVEC_REGNO][mode];
19164 else
19165 return 4 + rs6000_register_move_cost (mode, class, GENERAL_REGS);
19166 }
19167
19168 /* Newton-Raphson approximation of single-precision floating point divide n/d.
19169 Assumes no trapping math and finite arguments. */
19170
19171 void
rs6000_emit_swdivsf(rtx res,rtx n,rtx d)19172 rs6000_emit_swdivsf (rtx res, rtx n, rtx d)
19173 {
19174 rtx x0, e0, e1, y1, u0, v0, one;
19175
19176 x0 = gen_reg_rtx (SFmode);
19177 e0 = gen_reg_rtx (SFmode);
19178 e1 = gen_reg_rtx (SFmode);
19179 y1 = gen_reg_rtx (SFmode);
19180 u0 = gen_reg_rtx (SFmode);
19181 v0 = gen_reg_rtx (SFmode);
19182 one = force_reg (SFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, SFmode));
19183
19184 /* x0 = 1./d estimate */
19185 emit_insn (gen_rtx_SET (VOIDmode, x0,
19186 gen_rtx_UNSPEC (SFmode, gen_rtvec (1, d),
19187 UNSPEC_FRES)));
19188 /* e0 = 1. - d * x0 */
19189 emit_insn (gen_rtx_SET (VOIDmode, e0,
19190 gen_rtx_MINUS (SFmode, one,
19191 gen_rtx_MULT (SFmode, d, x0))));
19192 /* e1 = e0 + e0 * e0 */
19193 emit_insn (gen_rtx_SET (VOIDmode, e1,
19194 gen_rtx_PLUS (SFmode,
19195 gen_rtx_MULT (SFmode, e0, e0), e0)));
19196 /* y1 = x0 + e1 * x0 */
19197 emit_insn (gen_rtx_SET (VOIDmode, y1,
19198 gen_rtx_PLUS (SFmode,
19199 gen_rtx_MULT (SFmode, e1, x0), x0)));
19200 /* u0 = n * y1 */
19201 emit_insn (gen_rtx_SET (VOIDmode, u0,
19202 gen_rtx_MULT (SFmode, n, y1)));
19203 /* v0 = n - d * u0 */
19204 emit_insn (gen_rtx_SET (VOIDmode, v0,
19205 gen_rtx_MINUS (SFmode, n,
19206 gen_rtx_MULT (SFmode, d, u0))));
19207 /* res = u0 + v0 * y1 */
19208 emit_insn (gen_rtx_SET (VOIDmode, res,
19209 gen_rtx_PLUS (SFmode,
19210 gen_rtx_MULT (SFmode, v0, y1), u0)));
19211 }
19212
19213 /* Newton-Raphson approximation of double-precision floating point divide n/d.
19214 Assumes no trapping math and finite arguments. */
19215
19216 void
rs6000_emit_swdivdf(rtx res,rtx n,rtx d)19217 rs6000_emit_swdivdf (rtx res, rtx n, rtx d)
19218 {
19219 rtx x0, e0, e1, e2, y1, y2, y3, u0, v0, one;
19220
19221 x0 = gen_reg_rtx (DFmode);
19222 e0 = gen_reg_rtx (DFmode);
19223 e1 = gen_reg_rtx (DFmode);
19224 e2 = gen_reg_rtx (DFmode);
19225 y1 = gen_reg_rtx (DFmode);
19226 y2 = gen_reg_rtx (DFmode);
19227 y3 = gen_reg_rtx (DFmode);
19228 u0 = gen_reg_rtx (DFmode);
19229 v0 = gen_reg_rtx (DFmode);
19230 one = force_reg (DFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, DFmode));
19231
19232 /* x0 = 1./d estimate */
19233 emit_insn (gen_rtx_SET (VOIDmode, x0,
19234 gen_rtx_UNSPEC (DFmode, gen_rtvec (1, d),
19235 UNSPEC_FRES)));
19236 /* e0 = 1. - d * x0 */
19237 emit_insn (gen_rtx_SET (VOIDmode, e0,
19238 gen_rtx_MINUS (DFmode, one,
19239 gen_rtx_MULT (SFmode, d, x0))));
19240 /* y1 = x0 + e0 * x0 */
19241 emit_insn (gen_rtx_SET (VOIDmode, y1,
19242 gen_rtx_PLUS (DFmode,
19243 gen_rtx_MULT (DFmode, e0, x0), x0)));
19244 /* e1 = e0 * e0 */
19245 emit_insn (gen_rtx_SET (VOIDmode, e1,
19246 gen_rtx_MULT (DFmode, e0, e0)));
19247 /* y2 = y1 + e1 * y1 */
19248 emit_insn (gen_rtx_SET (VOIDmode, y2,
19249 gen_rtx_PLUS (DFmode,
19250 gen_rtx_MULT (DFmode, e1, y1), y1)));
19251 /* e2 = e1 * e1 */
19252 emit_insn (gen_rtx_SET (VOIDmode, e2,
19253 gen_rtx_MULT (DFmode, e1, e1)));
19254 /* y3 = y2 + e2 * y2 */
19255 emit_insn (gen_rtx_SET (VOIDmode, y3,
19256 gen_rtx_PLUS (DFmode,
19257 gen_rtx_MULT (DFmode, e2, y2), y2)));
19258 /* u0 = n * y3 */
19259 emit_insn (gen_rtx_SET (VOIDmode, u0,
19260 gen_rtx_MULT (DFmode, n, y3)));
19261 /* v0 = n - d * u0 */
19262 emit_insn (gen_rtx_SET (VOIDmode, v0,
19263 gen_rtx_MINUS (DFmode, n,
19264 gen_rtx_MULT (DFmode, d, u0))));
19265 /* res = u0 + v0 * y3 */
19266 emit_insn (gen_rtx_SET (VOIDmode, res,
19267 gen_rtx_PLUS (DFmode,
19268 gen_rtx_MULT (DFmode, v0, y3), u0)));
19269 }
19270
19271 /* Return an RTX representing where to find the function value of a
19272 function returning MODE. */
19273 static rtx
rs6000_complex_function_value(enum machine_mode mode)19274 rs6000_complex_function_value (enum machine_mode mode)
19275 {
19276 unsigned int regno;
19277 rtx r1, r2;
19278 enum machine_mode inner = GET_MODE_INNER (mode);
19279 unsigned int inner_bytes = GET_MODE_SIZE (inner);
19280
19281 if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
19282 regno = FP_ARG_RETURN;
19283 else
19284 {
19285 regno = GP_ARG_RETURN;
19286
19287 /* 32-bit is OK since it'll go in r3/r4. */
19288 if (TARGET_32BIT && inner_bytes >= 4)
19289 return gen_rtx_REG (mode, regno);
19290 }
19291
19292 if (inner_bytes >= 8)
19293 return gen_rtx_REG (mode, regno);
19294
19295 r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
19296 const0_rtx);
19297 r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
19298 GEN_INT (inner_bytes));
19299 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
19300 }
19301
19302 /* Define how to find the value returned by a function.
19303 VALTYPE is the data type of the value (as a tree).
19304 If the precise function being called is known, FUNC is its FUNCTION_DECL;
19305 otherwise, FUNC is 0.
19306
19307 On the SPE, both FPs and vectors are returned in r3.
19308
19309 On RS/6000 an integer value is in r3 and a floating-point value is in
19310 fp1, unless -msoft-float. */
19311
19312 rtx
rs6000_function_value(tree valtype,tree func ATTRIBUTE_UNUSED)19313 rs6000_function_value (tree valtype, tree func ATTRIBUTE_UNUSED)
19314 {
19315 enum machine_mode mode;
19316 unsigned int regno;
19317
19318 /* Special handling for structs in darwin64. */
19319 if (rs6000_darwin64_abi
19320 && TYPE_MODE (valtype) == BLKmode
19321 && TREE_CODE (valtype) == RECORD_TYPE
19322 && int_size_in_bytes (valtype) > 0)
19323 {
19324 CUMULATIVE_ARGS valcum;
19325 rtx valret;
19326
19327 valcum.words = 0;
19328 valcum.fregno = FP_ARG_MIN_REG;
19329 valcum.vregno = ALTIVEC_ARG_MIN_REG;
19330 /* Do a trial code generation as if this were going to be passed as
19331 an argument; if any part goes in memory, we return NULL. */
19332 valret = rs6000_darwin64_record_arg (&valcum, valtype, 1, true);
19333 if (valret)
19334 return valret;
19335 /* Otherwise fall through to standard ABI rules. */
19336 }
19337
19338 if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DImode)
19339 {
19340 /* Long long return value need be split in -mpowerpc64, 32bit ABI. */
19341 return gen_rtx_PARALLEL (DImode,
19342 gen_rtvec (2,
19343 gen_rtx_EXPR_LIST (VOIDmode,
19344 gen_rtx_REG (SImode, GP_ARG_RETURN),
19345 const0_rtx),
19346 gen_rtx_EXPR_LIST (VOIDmode,
19347 gen_rtx_REG (SImode,
19348 GP_ARG_RETURN + 1),
19349 GEN_INT (4))));
19350 }
19351 if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DCmode)
19352 {
19353 return gen_rtx_PARALLEL (DCmode,
19354 gen_rtvec (4,
19355 gen_rtx_EXPR_LIST (VOIDmode,
19356 gen_rtx_REG (SImode, GP_ARG_RETURN),
19357 const0_rtx),
19358 gen_rtx_EXPR_LIST (VOIDmode,
19359 gen_rtx_REG (SImode,
19360 GP_ARG_RETURN + 1),
19361 GEN_INT (4)),
19362 gen_rtx_EXPR_LIST (VOIDmode,
19363 gen_rtx_REG (SImode,
19364 GP_ARG_RETURN + 2),
19365 GEN_INT (8)),
19366 gen_rtx_EXPR_LIST (VOIDmode,
19367 gen_rtx_REG (SImode,
19368 GP_ARG_RETURN + 3),
19369 GEN_INT (12))));
19370 }
19371
19372 mode = TYPE_MODE (valtype);
19373 if ((INTEGRAL_TYPE_P (valtype) && GET_MODE_BITSIZE (mode) < BITS_PER_WORD)
19374 || POINTER_TYPE_P (valtype))
19375 mode = TARGET_32BIT ? SImode : DImode;
19376
19377 if (DECIMAL_FLOAT_MODE_P (mode))
19378 regno = GP_ARG_RETURN;
19379 else if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT && TARGET_FPRS)
19380 regno = FP_ARG_RETURN;
19381 else if (TREE_CODE (valtype) == COMPLEX_TYPE
19382 && targetm.calls.split_complex_arg)
19383 return rs6000_complex_function_value (mode);
19384 else if (TREE_CODE (valtype) == VECTOR_TYPE
19385 && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
19386 && ALTIVEC_VECTOR_MODE (mode))
19387 regno = ALTIVEC_ARG_RETURN;
19388 else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
19389 && (mode == DFmode || mode == DCmode))
19390 return spe_build_register_parallel (mode, GP_ARG_RETURN);
19391 else
19392 regno = GP_ARG_RETURN;
19393
19394 return gen_rtx_REG (mode, regno);
19395 }
19396
19397 /* Define how to find the value returned by a library function
19398 assuming the value has mode MODE. */
19399 rtx
rs6000_libcall_value(enum machine_mode mode)19400 rs6000_libcall_value (enum machine_mode mode)
19401 {
19402 unsigned int regno;
19403
19404 if (TARGET_32BIT && TARGET_POWERPC64 && mode == DImode)
19405 {
19406 /* Long long return value need be split in -mpowerpc64, 32bit ABI. */
19407 return gen_rtx_PARALLEL (DImode,
19408 gen_rtvec (2,
19409 gen_rtx_EXPR_LIST (VOIDmode,
19410 gen_rtx_REG (SImode, GP_ARG_RETURN),
19411 const0_rtx),
19412 gen_rtx_EXPR_LIST (VOIDmode,
19413 gen_rtx_REG (SImode,
19414 GP_ARG_RETURN + 1),
19415 GEN_INT (4))));
19416 }
19417
19418 if (DECIMAL_FLOAT_MODE_P (mode))
19419 regno = GP_ARG_RETURN;
19420 else if (SCALAR_FLOAT_MODE_P (mode)
19421 && TARGET_HARD_FLOAT && TARGET_FPRS)
19422 regno = FP_ARG_RETURN;
19423 else if (ALTIVEC_VECTOR_MODE (mode)
19424 && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
19425 regno = ALTIVEC_ARG_RETURN;
19426 else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
19427 return rs6000_complex_function_value (mode);
19428 else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
19429 && (mode == DFmode || mode == DCmode))
19430 return spe_build_register_parallel (mode, GP_ARG_RETURN);
19431 else
19432 regno = GP_ARG_RETURN;
19433
19434 return gen_rtx_REG (mode, regno);
19435 }
19436
19437 /* Define the offset between two registers, FROM to be eliminated and its
19438 replacement TO, at the start of a routine. */
19439 HOST_WIDE_INT
rs6000_initial_elimination_offset(int from,int to)19440 rs6000_initial_elimination_offset (int from, int to)
19441 {
19442 rs6000_stack_t *info = rs6000_stack_info ();
19443 HOST_WIDE_INT offset;
19444
19445 if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
19446 offset = info->push_p ? 0 : -info->total_size;
19447 else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
19448 {
19449 offset = info->push_p ? 0 : -info->total_size;
19450 if (FRAME_GROWS_DOWNWARD)
19451 offset += info->fixed_size + info->vars_size + info->parm_size;
19452 }
19453 else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
19454 offset = FRAME_GROWS_DOWNWARD
19455 ? info->fixed_size + info->vars_size + info->parm_size
19456 : 0;
19457 else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
19458 offset = info->total_size;
19459 else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
19460 offset = info->push_p ? info->total_size : 0;
19461 else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
19462 offset = 0;
19463 else
19464 gcc_unreachable ();
19465
19466 return offset;
19467 }
19468
19469 /* Return true if TYPE is a SPE or AltiVec opaque type. */
19470
19471 static bool
rs6000_is_opaque_type(tree type)19472 rs6000_is_opaque_type (tree type)
19473 {
19474 return (type == opaque_V2SI_type_node
19475 || type == opaque_V2SF_type_node
19476 || type == opaque_p_V2SI_type_node
19477 || type == opaque_V4SI_type_node);
19478 }
19479
19480 static rtx
rs6000_dwarf_register_span(rtx reg)19481 rs6000_dwarf_register_span (rtx reg)
19482 {
19483 unsigned regno;
19484
19485 if (TARGET_SPE
19486 && (SPE_VECTOR_MODE (GET_MODE (reg))
19487 || (TARGET_E500_DOUBLE && GET_MODE (reg) == DFmode)))
19488 ;
19489 else
19490 return NULL_RTX;
19491
19492 regno = REGNO (reg);
19493
19494 /* The duality of the SPE register size wreaks all kinds of havoc.
19495 This is a way of distinguishing r0 in 32-bits from r0 in
19496 64-bits. */
19497 return
19498 gen_rtx_PARALLEL (VOIDmode,
19499 BYTES_BIG_ENDIAN
19500 ? gen_rtvec (2,
19501 gen_rtx_REG (SImode, regno + 1200),
19502 gen_rtx_REG (SImode, regno))
19503 : gen_rtvec (2,
19504 gen_rtx_REG (SImode, regno),
19505 gen_rtx_REG (SImode, regno + 1200)));
19506 }
19507
19508 /* Map internal gcc register numbers to DWARF2 register numbers. */
19509
19510 unsigned int
rs6000_dbx_register_number(unsigned int regno)19511 rs6000_dbx_register_number (unsigned int regno)
19512 {
19513 if (regno <= 63 || write_symbols != DWARF2_DEBUG)
19514 return regno;
19515 if (regno == MQ_REGNO)
19516 return 100;
19517 if (regno == LINK_REGISTER_REGNUM)
19518 return 108;
19519 if (regno == COUNT_REGISTER_REGNUM)
19520 return 109;
19521 if (CR_REGNO_P (regno))
19522 return regno - CR0_REGNO + 86;
19523 if (regno == XER_REGNO)
19524 return 101;
19525 if (ALTIVEC_REGNO_P (regno))
19526 return regno - FIRST_ALTIVEC_REGNO + 1124;
19527 if (regno == VRSAVE_REGNO)
19528 return 356;
19529 if (regno == VSCR_REGNO)
19530 return 67;
19531 if (regno == SPE_ACC_REGNO)
19532 return 99;
19533 if (regno == SPEFSCR_REGNO)
19534 return 612;
19535 /* SPE high reg number. We get these values of regno from
19536 rs6000_dwarf_register_span. */
19537 gcc_assert (regno >= 1200 && regno < 1232);
19538 return regno;
19539 }
19540
19541 /* target hook eh_return_filter_mode */
19542 static enum machine_mode
rs6000_eh_return_filter_mode(void)19543 rs6000_eh_return_filter_mode (void)
19544 {
19545 return TARGET_32BIT ? SImode : word_mode;
19546 }
19547
19548 /* Target hook for scalar_mode_supported_p. */
19549 static bool
rs6000_scalar_mode_supported_p(enum machine_mode mode)19550 rs6000_scalar_mode_supported_p (enum machine_mode mode)
19551 {
19552 if (DECIMAL_FLOAT_MODE_P (mode))
19553 return true;
19554 else
19555 return default_scalar_mode_supported_p (mode);
19556 }
19557
19558 /* Target hook for vector_mode_supported_p. */
19559 static bool
rs6000_vector_mode_supported_p(enum machine_mode mode)19560 rs6000_vector_mode_supported_p (enum machine_mode mode)
19561 {
19562
19563 if (TARGET_SPE && SPE_VECTOR_MODE (mode))
19564 return true;
19565
19566 else if (TARGET_ALTIVEC && ALTIVEC_VECTOR_MODE (mode))
19567 return true;
19568
19569 else
19570 return false;
19571 }
19572
19573 /* Target hook for invalid_arg_for_unprototyped_fn. */
19574 static const char *
invalid_arg_for_unprototyped_fn(tree typelist,tree funcdecl,tree val)19575 invalid_arg_for_unprototyped_fn (tree typelist, tree funcdecl, tree val)
19576 {
19577 return (!rs6000_darwin64_abi
19578 && typelist == 0
19579 && TREE_CODE (TREE_TYPE (val)) == VECTOR_TYPE
19580 && (funcdecl == NULL_TREE
19581 || (TREE_CODE (funcdecl) == FUNCTION_DECL
19582 && DECL_BUILT_IN_CLASS (funcdecl) != BUILT_IN_MD)))
19583 ? N_("AltiVec argument passed to unprototyped function")
19584 : NULL;
19585 }
19586
19587 /* For TARGET_SECURE_PLT 32-bit PIC code we can save PIC register
19588 setup by using __stack_chk_fail_local hidden function instead of
19589 calling __stack_chk_fail directly. Otherwise it is better to call
19590 __stack_chk_fail directly. */
19591
19592 static tree
rs6000_stack_protect_fail(void)19593 rs6000_stack_protect_fail (void)
19594 {
19595 return (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
19596 ? default_hidden_stack_protect_fail ()
19597 : default_external_stack_protect_fail ();
19598 }
19599
19600 #include "gt-rs6000.h"
19601