]> gcc.gnu.org Git - gcc.git/blame - gcc/optabs.c
Initial revision
[gcc.git] / gcc / optabs.c
CommitLineData
77c9c6c2 1/* Expand the basic unary and binary arithmetic operations, for GNU compiler.
34e56753 2 Copyright (C) 1987, 1988, 1992 Free Software Foundation, Inc.
77c9c6c2
RK
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU CC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU CC; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21#include "config.h"
22#include "rtl.h"
23#include "tree.h"
24#include "flags.h"
25#include "insn-flags.h"
26#include "insn-codes.h"
27#include "expr.h"
28#include "insn-config.h"
29#include "recog.h"
30
31/* Each optab contains info on how this target machine
32 can perform a particular operation
33 for all sizes and kinds of operands.
34
35 The operation to be performed is often specified
36 by passing one of these optabs as an argument.
37
38 See expr.h for documentation of these optabs. */
39
40optab add_optab;
41optab sub_optab;
42optab smul_optab;
43optab smul_widen_optab;
44optab umul_widen_optab;
45optab sdiv_optab;
46optab sdivmod_optab;
47optab udiv_optab;
48optab udivmod_optab;
49optab smod_optab;
50optab umod_optab;
51optab flodiv_optab;
52optab ftrunc_optab;
53optab and_optab;
54optab ior_optab;
55optab xor_optab;
56optab ashl_optab;
57optab lshr_optab;
58optab lshl_optab;
59optab ashr_optab;
60optab rotl_optab;
61optab rotr_optab;
62optab smin_optab;
63optab smax_optab;
64optab umin_optab;
65optab umax_optab;
66
67optab mov_optab;
68optab movstrict_optab;
69
70optab neg_optab;
71optab abs_optab;
72optab one_cmpl_optab;
73optab ffs_optab;
74
75optab cmp_optab;
76optab ucmp_optab; /* Used only for libcalls for unsigned comparisons. */
77optab tst_optab;
78
79/* SYMBOL_REF rtx's for the library functions that are called
80 implicitly and not via optabs. */
81
82rtx extendsfdf2_libfunc;
83rtx truncdfsf2_libfunc;
84rtx memcpy_libfunc;
85rtx bcopy_libfunc;
86rtx memcmp_libfunc;
87rtx bcmp_libfunc;
88rtx memset_libfunc;
89rtx bzero_libfunc;
90rtx eqsf2_libfunc;
91rtx nesf2_libfunc;
92rtx gtsf2_libfunc;
93rtx gesf2_libfunc;
94rtx ltsf2_libfunc;
95rtx lesf2_libfunc;
96rtx eqdf2_libfunc;
97rtx nedf2_libfunc;
98rtx gtdf2_libfunc;
99rtx gedf2_libfunc;
100rtx ltdf2_libfunc;
101rtx ledf2_libfunc;
6bce1b78
RK
102rtx floatdisf_libfunc;
103rtx floatsisf_libfunc;
104rtx floatdidf_libfunc;
105rtx floatsidf_libfunc;
106rtx fixsfsi_libfunc;
107rtx fixsfdi_libfunc;
108rtx fixdfsi_libfunc;
109rtx fixdfdi_libfunc;
110rtx fixunssfsi_libfunc;
111rtx fixunssfdi_libfunc;
112rtx fixunsdfsi_libfunc;
113rtx fixunsdfdi_libfunc;
77c9c6c2
RK
114
115/* Indexed by the rtx-code for a conditional (eg. EQ, LT,...)
116 gives the gen_function to make a branch to test that condition. */
117
118rtxfun bcc_gen_fctn[NUM_RTX_CODE];
119
120/* Indexed by the rtx-code for a conditional (eg. EQ, LT,...)
121 gives the insn code to make a store-condition insn
122 to test that condition. */
123
124enum insn_code setcc_gen_code[NUM_RTX_CODE];
125
126static void emit_float_lib_cmp ();
127\f
128/* Add a REG_EQUAL note to the last insn in SEQ. TARGET is being set to
129 the result of operation CODE applied to OP0 (and OP1 if it is a binary
130 operation).
131
132 If the last insn does not set TARGET, don't do anything, but return 1.
133
134 If a previous insn sets TARGET and TARGET is one of OP0 or OP1,
135 don't add the REG_EQUAL note but return 0. Our caller can then try
136 again, ensuring that TARGET is not one of the operands. */
137
138static int
139add_equal_note (seq, target, code, op0, op1)
140 rtx seq;
141 rtx target;
142 enum rtx_code code;
143 rtx op0, op1;
144{
145 rtx set;
146 int i;
147 rtx note;
148
149 if ((GET_RTX_CLASS (code) != '1' && GET_RTX_CLASS (code) != '2'
150 && GET_RTX_CLASS (code) != 'c' && GET_RTX_CLASS (code) != '<')
151 || GET_CODE (seq) != SEQUENCE
152 || (set = single_set (XVECEXP (seq, 0, XVECLEN (seq, 0) - 1))) == 0
153 || GET_CODE (target) == ZERO_EXTRACT
154 || (! rtx_equal_p (SET_DEST (set), target)
155 /* For a STRICT_LOW_PART, the REG_NOTE applies to what is inside the
156 SUBREG. */
157 && (GET_CODE (SET_DEST (set)) != STRICT_LOW_PART
158 || ! rtx_equal_p (SUBREG_REG (XEXP (SET_DEST (set), 0)),
159 target))))
160 return 1;
161
162 /* If TARGET is in OP0 or OP1, check if anything in SEQ sets TARGET
163 besides the last insn. */
164 if (reg_overlap_mentioned_p (target, op0)
165 || (op1 && reg_overlap_mentioned_p (target, op1)))
166 for (i = XVECLEN (seq, 0) - 2; i >= 0; i--)
167 if (reg_set_p (target, XVECEXP (seq, 0, i)))
168 return 0;
169
170 if (GET_RTX_CLASS (code) == '1')
171 note = gen_rtx (code, GET_MODE (target), op0);
172 else
173 note = gen_rtx (code, GET_MODE (target), op0, op1);
174
175 REG_NOTES (XVECEXP (seq, 0, XVECLEN (seq, 0) - 1))
176 = gen_rtx (EXPR_LIST, REG_EQUAL, note,
177 REG_NOTES (XVECEXP (seq, 0, XVECLEN (seq, 0) - 1)));
178
179 return 1;
180}
181\f
182/* Generate code to perform an operation specified by BINOPTAB
183 on operands OP0 and OP1, with result having machine-mode MODE.
184
185 UNSIGNEDP is for the case where we have to widen the operands
186 to perform the operation. It says to use zero-extension.
187
188 If TARGET is nonzero, the value
189 is generated there, if it is convenient to do so.
190 In all cases an rtx is returned for the locus of the value;
191 this may or may not be TARGET. */
192
193rtx
194expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
195 enum machine_mode mode;
196 optab binoptab;
197 rtx op0, op1;
198 rtx target;
199 int unsignedp;
200 enum optab_methods methods;
201{
202 enum mode_class class;
203 enum machine_mode wider_mode;
77c9c6c2
RK
204 register rtx temp;
205 int commutative_op = 0;
206 int shift_op = (binoptab->code == ASHIFT
207 || binoptab->code == ASHIFTRT
208 || binoptab->code == LSHIFT
209 || binoptab->code == LSHIFTRT
210 || binoptab->code == ROTATE
211 || binoptab->code == ROTATERT);
212 rtx last;
213
214 class = GET_MODE_CLASS (mode);
215
216 op0 = protect_from_queue (op0, 0);
217 op1 = protect_from_queue (op1, 0);
218 if (target)
219 target = protect_from_queue (target, 1);
220
221 if (flag_force_mem)
222 {
223 op0 = force_not_mem (op0);
224 op1 = force_not_mem (op1);
225 }
226
227 /* If we are inside an appropriately-short loop and one operand is an
228 expensive constant, force it into a register. */
229 if (CONSTANT_P (op0) && preserve_subexpressions_p () && rtx_cost (op0) > 2)
230 op0 = force_reg (mode, op0);
231
232 if (CONSTANT_P (op1) && preserve_subexpressions_p () && rtx_cost (op1) > 2)
34e56753 233 op1 = force_reg (shift_op ? word_mode : mode, op1);
77c9c6c2
RK
234
235#if 0 /* Turned off because it seems to be a kludgy method. */
236 /* If subtracting integer from pointer, and the pointer has a special mode,
237 then change it to an add. We use the add insn of Pmode for combining
238 integers with pointers, and the sub insn to subtract two pointers. */
239
240 if (binoptab == sub_optab
241 && GET_MODE (op0) == Pmode && GET_MODE (op1) != Pmode)
242 {
243 op1 = negate_rtx (GET_MODE(op1), op1);
244 binoptab = add_optab;
245 }
246#endif /* 0 */
247
248 /* Record where to delete back to if we backtrack. */
249 last = get_last_insn ();
250
251 /* If operation is commutative,
252 try to make the first operand a register.
253 Even better, try to make it the same as the target.
254 Also try to make the last operand a constant. */
255 if (GET_RTX_CLASS (binoptab->code) == 'c'
256 || binoptab == smul_widen_optab
257 || binoptab == umul_widen_optab)
258 {
259 commutative_op = 1;
260
261 if (((target == 0 || GET_CODE (target) == REG)
262 ? ((GET_CODE (op1) == REG
263 && GET_CODE (op0) != REG)
264 || target == op1)
265 : rtx_equal_p (op1, target))
266 || GET_CODE (op0) == CONST_INT)
267 {
268 temp = op1;
269 op1 = op0;
270 op0 = temp;
271 }
272 }
273
274 /* If we can do it with a three-operand insn, do so. */
275
276 if (methods != OPTAB_MUST_WIDEN
277 && binoptab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
278 {
279 int icode = (int) binoptab->handlers[(int) mode].insn_code;
280 enum machine_mode mode0 = insn_operand_mode[icode][1];
281 enum machine_mode mode1 = insn_operand_mode[icode][2];
282 rtx pat;
283 rtx xop0 = op0, xop1 = op1;
284
285 if (target)
286 temp = target;
287 else
288 temp = gen_reg_rtx (mode);
289
290 /* If it is a commutative operator and the modes would match
291 if we would swap the operands, we can save the conversions. */
292 if (commutative_op)
293 {
294 if (GET_MODE (op0) != mode0 && GET_MODE (op1) != mode1
295 && GET_MODE (op0) == mode1 && GET_MODE (op1) == mode0)
296 {
297 register rtx tmp;
298
299 tmp = op0; op0 = op1; op1 = tmp;
300 tmp = xop0; xop0 = xop1; xop1 = tmp;
301 }
302 }
303
304 /* In case the insn wants input operands in modes different from
305 the result, convert the operands. */
306
307 if (GET_MODE (op0) != VOIDmode
308 && GET_MODE (op0) != mode0)
309 xop0 = convert_to_mode (mode0, xop0, unsignedp);
310
311 if (GET_MODE (xop1) != VOIDmode
312 && GET_MODE (xop1) != mode1)
313 xop1 = convert_to_mode (mode1, xop1, unsignedp);
314
315 /* Now, if insn's predicates don't allow our operands, put them into
316 pseudo regs. */
317
318 if (! (*insn_operand_predicate[icode][1]) (xop0, mode0))
319 xop0 = copy_to_mode_reg (mode0, xop0);
320
321 if (! (*insn_operand_predicate[icode][2]) (xop1, mode1))
322 xop1 = copy_to_mode_reg (mode1, xop1);
323
324 if (! (*insn_operand_predicate[icode][0]) (temp, mode))
325 temp = gen_reg_rtx (mode);
326
327 pat = GEN_FCN (icode) (temp, xop0, xop1);
328 if (pat)
329 {
330 /* If PAT is a multi-insn sequence, try to add an appropriate
331 REG_EQUAL note to it. If we can't because TEMP conflicts with an
332 operand, call ourselves again, this time without a target. */
333 if (GET_CODE (pat) == SEQUENCE
334 && ! add_equal_note (pat, temp, binoptab->code, xop0, xop1))
335 {
336 delete_insns_since (last);
337 return expand_binop (mode, binoptab, op0, op1, 0, unsignedp,
338 methods);
339 }
340
341 emit_insn (pat);
342 return temp;
343 }
344 else
345 delete_insns_since (last);
346 }
347
348 /* These can be done a word at a time. */
349 if ((binoptab == and_optab || binoptab == ior_optab || binoptab == xor_optab)
350 && class == MODE_INT
351 && GET_MODE_SIZE (mode) > UNITS_PER_WORD
34e56753 352 && binoptab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing)
77c9c6c2
RK
353 {
354 int i;
355 rtx insns;
356 rtx equiv_value;
357
358 /* If TARGET is the same as one of the operands, the REG_EQUAL note
359 won't be accurate, so use a new target. */
360 if (target == 0 || target == op0 || target == op1)
361 target = gen_reg_rtx (mode);
362
363 start_sequence ();
364
365 /* Do the actual arithmetic. */
366 for (i = 0; i < GET_MODE_BITSIZE (mode) / BITS_PER_WORD; i++)
367 {
368 rtx target_piece = operand_subword (target, i, 1, mode);
34e56753 369 rtx x = expand_binop (word_mode, binoptab,
77c9c6c2
RK
370 operand_subword_force (op0, i, mode),
371 operand_subword_force (op1, i, mode),
372 target_piece, unsignedp, methods);
373 if (target_piece != x)
374 emit_move_insn (target_piece, x);
375 }
376
377 insns = get_insns ();
378 end_sequence ();
379
380 if (binoptab->code != UNKNOWN)
381 equiv_value = gen_rtx (binoptab->code, mode, op0, op1);
382 else
383 equiv_value = 0;
384
385 emit_no_conflict_block (insns, target, op0, op1, equiv_value);
386 return target;
387 }
388
389 /* These can be done a word at a time by propagating carries. */
390 if ((binoptab == add_optab || binoptab == sub_optab)
391 && class == MODE_INT
392 && GET_MODE_SIZE (mode) >= 2 * UNITS_PER_WORD
34e56753 393 && binoptab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing)
77c9c6c2
RK
394 {
395 int i;
34e56753 396 rtx carry_tmp = gen_reg_rtx (word_mode);
77c9c6c2
RK
397 optab otheroptab = binoptab == add_optab ? sub_optab : add_optab;
398 int nwords = GET_MODE_BITSIZE (mode) / BITS_PER_WORD;
399 rtx carry_in, carry_out;
400
401 /* We can handle either a 1 or -1 value for the carry. If STORE_FLAG
402 value is one of those, use it. Otherwise, use 1 since it is the
403 one easiest to get. */
404#if STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1
405 int normalizep = STORE_FLAG_VALUE;
406#else
407 int normalizep = 1;
408#endif
409
410 /* Prepare the operands. */
411 op0 = force_reg (mode, op0);
412 op1 = force_reg (mode, op1);
413
414 if (target == 0 || GET_CODE (target) != REG
415 || target == op0 || target == op1)
416 target = gen_reg_rtx (mode);
417
418 /* Do the actual arithmetic. */
419 for (i = 0; i < nwords; i++)
420 {
421 int index = (WORDS_BIG_ENDIAN ? nwords - i - 1 : i);
422 rtx target_piece = operand_subword (target, index, 1, mode);
423 rtx op0_piece = operand_subword_force (op0, index, mode);
424 rtx op1_piece = operand_subword_force (op1, index, mode);
425 rtx x;
426
427 /* Main add/subtract of the input operands. */
34e56753 428 x = expand_binop (word_mode, binoptab,
77c9c6c2
RK
429 op0_piece, op1_piece,
430 target_piece, unsignedp, methods);
431 if (x == 0)
432 break;
433
434 if (i + 1 < nwords)
435 {
436 /* Store carry from main add/subtract. */
34e56753 437 carry_out = gen_reg_rtx (word_mode);
77c9c6c2
RK
438 carry_out = emit_store_flag (carry_out,
439 binoptab == add_optab ? LTU : GTU,
440 x, op0_piece,
34e56753 441 word_mode, 1, normalizep);
77c9c6c2
RK
442 if (!carry_out)
443 break;
444 }
445
446 if (i > 0)
447 {
448 /* Add/subtract previous carry to main result. */
34e56753 449 x = expand_binop (word_mode,
77c9c6c2
RK
450 normalizep == 1 ? binoptab : otheroptab,
451 x, carry_in,
452 target_piece, 1, methods);
453 if (target_piece != x)
454 emit_move_insn (target_piece, x);
455
456 if (i + 1 < nwords)
457 {
458 /* THIS CODE HAS NOT BEEN TESTED. */
459 /* Get out carry from adding/subtracting carry in. */
460 carry_tmp = emit_store_flag (carry_tmp,
461 binoptab == add_optab
462 ? LTU : GTU,
463 x, carry_in,
34e56753 464 word_mode, 1, normalizep);
77c9c6c2 465 /* Logical-ior the two poss. carry together. */
34e56753 466 carry_out = expand_binop (word_mode, ior_optab,
77c9c6c2
RK
467 carry_out, carry_tmp,
468 carry_out, 0, methods);
469 if (!carry_out)
470 break;
471 }
472 }
473
474 carry_in = carry_out;
475 }
476
477 if (i == GET_MODE_BITSIZE (mode) / BITS_PER_WORD)
478 {
479 rtx temp;
480
481 temp = emit_move_insn (target, target);
482 REG_NOTES (temp) = gen_rtx (EXPR_LIST, REG_EQUAL,
483 gen_rtx (binoptab->code, mode, op0, op1),
484 REG_NOTES (temp));
485 return target;
486 }
487 else
488 delete_insns_since (last);
489 }
490
491 /* If we want to multiply two two-word values and have normal and widening
492 multiplies of single-word values, we can do this with three smaller
493 multiplications. Note that we do not make a REG_NO_CONFLICT block here
494 because we are not operating on one word at a time.
495
496 The multiplication proceeds as follows:
34e56753
RS
497 _______________________
498 [__op0_high_|__op0_low__]
499 _______________________
500 * [__op1_high_|__op1_low__]
501 _______________________________________________
502 _______________________
503 (1) [__op0_low__*__op1_low__]
504 _______________________
505 (2a) [__op0_low__*__op1_high_]
506 _______________________
507 (2b) [__op0_high_*__op1_low__]
508 _______________________
509 (3) [__op0_high_*__op1_high_]
77c9c6c2
RK
510
511
512 This gives a 4-word result. Since we are only interested in the
513 lower 2 words, partial result (3) and the upper words of (2a) and
514 (2b) don't need to be calculated. Hence (2a) and (2b) can be
515 calculated using non-widening multiplication.
516
517 (1), however, needs to be calculated with an unsigned widening
518 multiplication. If this operation is not directly supported we
519 try using a signed widening multiplication and adjust the result.
520 This adjustment works as follows:
521
522 If both operands are positive then no adjustment is needed.
523
524 If the operands have different signs, for example op0_low < 0 and
525 op1_low >= 0, the instruction treats the most significant bit of
526 op0_low as a sign bit instead of a bit with significance
527 2**(BITS_PER_WORD-1), i.e. the instruction multiplies op1_low
528 with 2**BITS_PER_WORD - op0_low, and two's complements the
529 result. Conclusion: We need to add op1_low * 2**BITS_PER_WORD to
530 the result.
531
532 Similarly, if both operands are negative, we need to add
533 (op0_low + op1_low) * 2**BITS_PER_WORD.
534
535 We use a trick to adjust quickly. We logically shift op0_low right
536 (op1_low) BITS_PER_WORD-1 steps to get 0 or 1, and add this to
537 op0_high (op1_high) before it is used to calculate 2b (2a). If no
538 logical shift exists, we do an arithmetic right shift and subtract
539 the 0 or -1. */
540
541 if (binoptab == smul_optab
542 && class == MODE_INT
543 && GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD
34e56753
RS
544 && smul_optab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing
545 && add_optab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing
77c9c6c2
RK
546 && ((umul_widen_optab->handlers[(int) mode].insn_code
547 != CODE_FOR_nothing)
548 || (smul_widen_optab->handlers[(int) mode].insn_code
549 != CODE_FOR_nothing)))
550 {
551 int low = (WORDS_BIG_ENDIAN ? 1 : 0);
552 int high = (WORDS_BIG_ENDIAN ? 0 : 1);
553 rtx op0_high = operand_subword_force (op0, high, mode);
554 rtx op0_low = operand_subword_force (op0, low, mode);
555 rtx op1_high = operand_subword_force (op1, high, mode);
556 rtx op1_low = operand_subword_force (op1, low, mode);
557 rtx product = 0;
558 rtx op0_xhigh;
559 rtx op1_xhigh;
560
561 /* If the target is the same as one of the inputs, don't use it. This
562 prevents problems with the REG_EQUAL note. */
563 if (target == op0 || target == op1)
564 target = 0;
565
566 /* Multiply the two lower words to get a double-word product.
567 If unsigned widening multiplication is available, use that;
568 otherwise use the signed form and compensate. */
569
570 if (umul_widen_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
571 {
572 product = expand_binop (mode, umul_widen_optab, op0_low, op1_low,
573 target, 1, OPTAB_DIRECT);
574
575 /* If we didn't succeed, delete everything we did so far. */
576 if (product == 0)
577 delete_insns_since (last);
578 else
579 op0_xhigh = op0_high, op1_xhigh = op1_high;
580 }
581
582 if (product == 0
583 && smul_widen_optab->handlers[(int) mode].insn_code
584 != CODE_FOR_nothing)
585 {
586 rtx wordm1 = gen_rtx (CONST_INT, VOIDmode, BITS_PER_WORD - 1);
587 product = expand_binop (mode, smul_widen_optab, op0_low, op1_low,
588 target, 1, OPTAB_DIRECT);
34e56753 589 op0_xhigh = expand_binop (word_mode, lshr_optab, op0_low, wordm1,
77c9c6c2
RK
590 0, 1, OPTAB_DIRECT);
591 if (op0_xhigh)
34e56753
RS
592 op0_xhigh = expand_binop (word_mode, add_optab, op0_high,
593 op0_xhigh, op0_xhigh, 0, OPTAB_DIRECT);
77c9c6c2
RK
594 else
595 {
34e56753 596 op0_xhigh = expand_binop (word_mode, ashr_optab, op0_low, wordm1,
77c9c6c2
RK
597 0, 0, OPTAB_DIRECT);
598 if (op0_xhigh)
34e56753 599 op0_xhigh = expand_binop (word_mode, sub_optab, op0_high,
77c9c6c2
RK
600 op0_xhigh, op0_xhigh, 0,
601 OPTAB_DIRECT);
602 }
603
34e56753 604 op1_xhigh = expand_binop (word_mode, lshr_optab, op1_low, wordm1,
77c9c6c2
RK
605 0, 1, OPTAB_DIRECT);
606 if (op1_xhigh)
34e56753
RS
607 op1_xhigh = expand_binop (word_mode, add_optab, op1_high,
608 op1_xhigh, op1_xhigh, 0, OPTAB_DIRECT);
77c9c6c2
RK
609 else
610 {
34e56753 611 op1_xhigh = expand_binop (word_mode, ashr_optab, op1_low, wordm1,
77c9c6c2
RK
612 0, 0, OPTAB_DIRECT);
613 if (op1_xhigh)
34e56753 614 op1_xhigh = expand_binop (word_mode, sub_optab, op1_high,
77c9c6c2
RK
615 op1_xhigh, op1_xhigh, 0,
616 OPTAB_DIRECT);
617 }
618 }
619
620 /* If we have been able to directly compute the product of the
621 low-order words of the operands and perform any required adjustments
622 of the operands, we proceed by trying two more multiplications
623 and then computing the appropriate sum.
624
625 We have checked above that the required addition is provided.
626 Full-word addition will normally always succeed, especially if
627 it is provided at all, so we don't worry about its failure. The
628 multiplication may well fail, however, so we do handle that. */
629
630 if (product && op0_xhigh && op1_xhigh)
631 {
632 rtx product_piece;
633 rtx product_high = operand_subword (product, high, 1, mode);
34e56753 634 rtx temp = expand_binop (word_mode, binoptab, op0_low, op1_xhigh, 0,
77c9c6c2
RK
635 0, OPTAB_DIRECT);
636
637 if (temp)
638 {
34e56753 639 product_piece = expand_binop (word_mode, add_optab, temp,
77c9c6c2
RK
640 product_high, product_high,
641 0, OPTAB_LIB_WIDEN);
642 if (product_piece != product_high)
643 emit_move_insn (product_high, product_piece);
644
34e56753 645 temp = expand_binop (word_mode, binoptab, op1_low, op0_xhigh, 0,
77c9c6c2
RK
646 0, OPTAB_DIRECT);
647
34e56753 648 product_piece = expand_binop (word_mode, add_optab, temp,
77c9c6c2
RK
649 product_high, product_high,
650 0, OPTAB_LIB_WIDEN);
651 if (product_piece != product_high)
652 emit_move_insn (product_high, product_piece);
653
654 temp = emit_move_insn (product, product);
655 REG_NOTES (temp) = gen_rtx (EXPR_LIST, REG_EQUAL,
656 gen_rtx (MULT, mode, op0, op1),
657 REG_NOTES (temp));
658
659 return product;
660 }
661 }
662
663 /* If we get here, we couldn't do it for some reason even though we
664 originally thought we could. Delete anything we've emitted in
665 trying to do it. */
666
667 delete_insns_since (last);
668 }
669
670 /* It can't be open-coded in this mode.
671 Use a library call if one is available and caller says that's ok. */
672
673 if (binoptab->handlers[(int) mode].libfunc
674 && (methods == OPTAB_LIB || methods == OPTAB_LIB_WIDEN))
675 {
676 rtx insns;
677 rtx funexp = binoptab->handlers[(int) mode].libfunc;
678
679 start_sequence ();
680
681 /* Pass 1 for NO_QUEUE so we don't lose any increments
682 if the libcall is cse'd or moved. */
683 emit_library_call (binoptab->handlers[(int) mode].libfunc,
684 1, mode, 2, op0, mode, op1,
34e56753 685 (shift_op ? word_mode : mode));
77c9c6c2
RK
686
687 insns = get_insns ();
688 end_sequence ();
689
690 target = gen_reg_rtx (mode);
691 emit_libcall_block (insns, target, hard_libcall_value (mode),
692 gen_rtx (binoptab->code, mode, op0, op1));
693
694 return target;
695 }
696
697 delete_insns_since (last);
698
699 /* It can't be done in this mode. Can we do it in a wider mode? */
700
701 if (! (methods == OPTAB_WIDEN || methods == OPTAB_LIB_WIDEN
702 || methods == OPTAB_MUST_WIDEN))
703 return 0; /* Caller says, don't even try. */
704
705 /* Compute the value of METHODS to pass to recursive calls.
706 Don't allow widening to be tried recursively. */
707
708 methods = (methods == OPTAB_LIB_WIDEN ? OPTAB_LIB : OPTAB_DIRECT);
709
34e56753
RS
710 /* Look for a wider mode of the same class for which it appears we can do
711 the operation. */
77c9c6c2
RK
712
713 if (class == MODE_INT || class == MODE_FLOAT || class == MODE_COMPLEX_FLOAT)
714 {
34e56753 715 for (wider_mode = GET_MODE_WIDER_MODE (mode); wider_mode != VOIDmode;
77c9c6c2
RK
716 wider_mode = GET_MODE_WIDER_MODE (wider_mode))
717 {
718 if ((binoptab->handlers[(int) wider_mode].insn_code
719 != CODE_FOR_nothing)
720 || (methods == OPTAB_LIB
721 && binoptab->handlers[(int) wider_mode].libfunc))
722 {
723 rtx xop0 = op0, xop1 = op1;
724 int no_extend = 0;
725
34e56753 726 /* For certain integer operations, we need not actually extend
77c9c6c2
RK
727 the narrow operands, as long as we will truncate
728 the results to the same narrowness. */
729
34e56753
RS
730 if ((binoptab == ior_optab || binoptab == and_optab
731 || binoptab == xor_optab
732 || binoptab == add_optab || binoptab == sub_optab
733 || binoptab == smul_optab
734 || binoptab == ashl_optab || binoptab == lshl_optab)
735 && class == MODE_INT)
77c9c6c2
RK
736 no_extend = 1;
737
34e56753
RS
738 /* If an operand is a constant integer, we might as well
739 convert it since that is more efficient than using a SUBREG,
740 unlike the case for other operands. */
741
742 if (no_extend && GET_MODE (xop0) != VOIDmode)
743 xop0 = gen_rtx (SUBREG, wider_mode,
744 force_reg (GET_MODE (xop0), xop0), 0);
745 else
746 xop0 = convert_to_mode (wider_mode, xop0, unsignedp);
747
748 if (no_extend && GET_MODE (xop1) != VOIDmode)
749 xop1 = gen_rtx (SUBREG, wider_mode,
750 force_reg (GET_MODE (xop1), xop1), 0);
751 else
752 xop1 = convert_to_mode (wider_mode, xop1, unsignedp);
77c9c6c2
RK
753
754 temp = expand_binop (wider_mode, binoptab, xop0, xop1, 0,
755 unsignedp, methods);
756 if (temp)
757 {
34e56753 758 if (class != MODE_INT)
77c9c6c2
RK
759 {
760 if (target == 0)
761 target = gen_reg_rtx (mode);
762 convert_move (target, temp, 0);
763 return target;
764 }
765 else
766 return gen_lowpart (mode, temp);
767 }
768 else
769 delete_insns_since (last);
770 }
771 }
772 }
773
774 return 0;
775}
776\f
777/* Expand a binary operator which has both signed and unsigned forms.
778 UOPTAB is the optab for unsigned operations, and SOPTAB is for
779 signed operations.
780
781 If we widen unsigned operands, we may use a signed wider operation instead
782 of an unsigned wider operation, since the result would be the same. */
783
784rtx
785sign_expand_binop (mode, uoptab, soptab, op0, op1, target, unsignedp, methods)
786 enum machine_mode mode;
787 optab uoptab, soptab;
788 rtx op0, op1, target;
789 int unsignedp;
790 enum optab_methods methods;
791{
792 register rtx temp;
793 optab direct_optab = unsignedp ? uoptab : soptab;
794 struct optab wide_soptab;
795
796 /* Do it without widening, if possible. */
797 temp = expand_binop (mode, direct_optab, op0, op1, target,
798 unsignedp, OPTAB_DIRECT);
799 if (temp || methods == OPTAB_DIRECT)
800 return temp;
801
802 /* Try widening to a signed int. Make a fake signed optab that
803 hides any signed insn for direct use. */
804 wide_soptab = *soptab;
805 wide_soptab.handlers[(int) mode].insn_code = CODE_FOR_nothing;
806 wide_soptab.handlers[(int) mode].libfunc = 0;
807
808 temp = expand_binop (mode, &wide_soptab, op0, op1, target,
809 unsignedp, OPTAB_WIDEN);
810
811 /* For unsigned operands, try widening to an unsigned int. */
812 if (temp == 0 && unsignedp)
813 temp = expand_binop (mode, uoptab, op0, op1, target,
814 unsignedp, OPTAB_WIDEN);
815 if (temp || methods == OPTAB_WIDEN)
816 return temp;
817
818 /* Use the right width lib call if that exists. */
819 temp = expand_binop (mode, direct_optab, op0, op1, target, unsignedp, OPTAB_LIB);
820 if (temp || methods == OPTAB_LIB)
821 return temp;
822
823 /* Must widen and use a lib call, use either signed or unsigned. */
824 temp = expand_binop (mode, &wide_soptab, op0, op1, target,
825 unsignedp, methods);
826 if (temp != 0)
827 return temp;
828 if (unsignedp)
829 return expand_binop (mode, uoptab, op0, op1, target,
830 unsignedp, methods);
831 return 0;
832}
833\f
834/* Generate code to perform an operation specified by BINOPTAB
835 on operands OP0 and OP1, with two results to TARG1 and TARG2.
836 We assume that the order of the operands for the instruction
837 is TARG0, OP0, OP1, TARG1, which would fit a pattern like
838 [(set TARG0 (operate OP0 OP1)) (set TARG1 (operate ...))].
839
840 Either TARG0 or TARG1 may be zero, but what that means is that
841 that result is not actually wanted. We will generate it into
842 a dummy pseudo-reg and discard it. They may not both be zero.
843
844 Returns 1 if this operation can be performed; 0 if not. */
845
846int
847expand_twoval_binop (binoptab, op0, op1, targ0, targ1, unsignedp)
848 optab binoptab;
849 rtx op0, op1;
850 rtx targ0, targ1;
851 int unsignedp;
852{
853 enum machine_mode mode = GET_MODE (targ0 ? targ0 : targ1);
854 enum mode_class class;
855 enum machine_mode wider_mode;
856 rtx last;
857
858 class = GET_MODE_CLASS (mode);
859
860 op0 = protect_from_queue (op0, 0);
861 op1 = protect_from_queue (op1, 0);
862
863 if (flag_force_mem)
864 {
865 op0 = force_not_mem (op0);
866 op1 = force_not_mem (op1);
867 }
868
869 /* If we are inside an appropriately-short loop and one operand is an
870 expensive constant, force it into a register. */
871 if (CONSTANT_P (op0) && preserve_subexpressions_p () && rtx_cost (op0) > 2)
872 op0 = force_reg (mode, op0);
873
874 if (CONSTANT_P (op1) && preserve_subexpressions_p () && rtx_cost (op1) > 2)
875 op1 = force_reg (mode, op1);
876
877 if (targ0)
878 targ0 = protect_from_queue (targ0, 1);
879 else
880 targ0 = gen_reg_rtx (mode);
881 if (targ1)
882 targ1 = protect_from_queue (targ1, 1);
883 else
884 targ1 = gen_reg_rtx (mode);
885
886 /* Record where to go back to if we fail. */
887 last = get_last_insn ();
888
889 if (binoptab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
890 {
891 int icode = (int) binoptab->handlers[(int) mode].insn_code;
892 enum machine_mode mode0 = insn_operand_mode[icode][1];
893 enum machine_mode mode1 = insn_operand_mode[icode][2];
894 rtx pat;
895 rtx xop0 = op0, xop1 = op1;
896
897 /* In case this insn wants input operands in modes different from the
898 result, convert the operands. */
899 if (GET_MODE (op0) != VOIDmode && GET_MODE (op0) != mode0)
900 xop0 = convert_to_mode (mode0, xop0, unsignedp);
901
902 if (GET_MODE (op1) != VOIDmode && GET_MODE (op1) != mode1)
903 xop1 = convert_to_mode (mode1, xop1, unsignedp);
904
905 /* Now, if insn doesn't accept these operands, put them into pseudos. */
906 if (! (*insn_operand_predicate[icode][1]) (xop0, mode0))
907 xop0 = copy_to_mode_reg (mode0, xop0);
908
909 if (! (*insn_operand_predicate[icode][2]) (xop1, mode1))
910 xop1 = copy_to_mode_reg (mode1, xop1);
911
912 /* We could handle this, but we should always be called with a pseudo
913 for our targets and all insns should take them as outputs. */
914 if (! (*insn_operand_predicate[icode][0]) (targ0, mode)
915 || ! (*insn_operand_predicate[icode][3]) (targ1, mode))
916 abort ();
917
918 pat = GEN_FCN (icode) (targ0, xop0, xop1, targ1);
919 if (pat)
920 {
921 emit_insn (pat);
922 return 1;
923 }
924 else
925 delete_insns_since (last);
926 }
927
928 /* It can't be done in this mode. Can we do it in a wider mode? */
929
930 if (class == MODE_INT || class == MODE_FLOAT || class == MODE_COMPLEX_FLOAT)
931 {
34e56753 932 for (wider_mode = GET_MODE_WIDER_MODE (mode); wider_mode != VOIDmode;
77c9c6c2
RK
933 wider_mode = GET_MODE_WIDER_MODE (wider_mode))
934 {
935 if (binoptab->handlers[(int) wider_mode].insn_code
936 != CODE_FOR_nothing)
937 {
938 register rtx t0 = gen_reg_rtx (wider_mode);
939 register rtx t1 = gen_reg_rtx (wider_mode);
940
941 if (expand_twoval_binop (binoptab,
942 convert_to_mode (wider_mode, op0,
943 unsignedp),
944 convert_to_mode (wider_mode, op1,
945 unsignedp),
946 t0, t1, unsignedp))
947 {
948 convert_move (targ0, t0, unsignedp);
949 convert_move (targ1, t1, unsignedp);
950 return 1;
951 }
952 else
953 delete_insns_since (last);
954 }
955 }
956 }
957
958 return 0;
959}
960\f
961/* Generate code to perform an operation specified by UNOPTAB
962 on operand OP0, with result having machine-mode MODE.
963
964 UNSIGNEDP is for the case where we have to widen the operands
965 to perform the operation. It says to use zero-extension.
966
967 If TARGET is nonzero, the value
968 is generated there, if it is convenient to do so.
969 In all cases an rtx is returned for the locus of the value;
970 this may or may not be TARGET. */
971
972rtx
973expand_unop (mode, unoptab, op0, target, unsignedp)
974 enum machine_mode mode;
975 optab unoptab;
976 rtx op0;
977 rtx target;
978 int unsignedp;
979{
980 enum mode_class class;
981 enum machine_mode wider_mode;
77c9c6c2
RK
982 register rtx temp;
983 rtx last = get_last_insn ();
984 rtx pat;
985
986 class = GET_MODE_CLASS (mode);
987
988 op0 = protect_from_queue (op0, 0);
989
990 if (flag_force_mem)
991 {
992 op0 = force_not_mem (op0);
993 }
994
995 if (target)
996 target = protect_from_queue (target, 1);
997
998 if (unoptab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
999 {
1000 int icode = (int) unoptab->handlers[(int) mode].insn_code;
1001 enum machine_mode mode0 = insn_operand_mode[icode][1];
1002 rtx xop0 = op0;
1003
1004 if (target)
1005 temp = target;
1006 else
1007 temp = gen_reg_rtx (mode);
1008
1009 if (GET_MODE (xop0) != VOIDmode
1010 && GET_MODE (xop0) != mode0)
1011 xop0 = convert_to_mode (mode0, xop0, unsignedp);
1012
1013 /* Now, if insn doesn't accept our operand, put it into a pseudo. */
1014
1015 if (! (*insn_operand_predicate[icode][1]) (xop0, mode0))
1016 xop0 = copy_to_mode_reg (mode0, xop0);
1017
1018 if (! (*insn_operand_predicate[icode][0]) (temp, mode))
1019 temp = gen_reg_rtx (mode);
1020
1021 pat = GEN_FCN (icode) (temp, xop0);
1022 if (pat)
1023 {
1024 if (GET_CODE (pat) == SEQUENCE
1025 && ! add_equal_note (pat, temp, unoptab->code, xop0, 0))
1026 {
1027 delete_insns_since (last);
1028 return expand_unop (mode, unoptab, op0, 0, unsignedp);
1029 }
1030
1031 emit_insn (pat);
1032
1033 return temp;
1034 }
1035 else
1036 delete_insns_since (last);
1037 }
1038
1039 /* These can be done a word at a time. */
1040 if (unoptab == one_cmpl_optab
1041 && class == MODE_INT
1042 && GET_MODE_SIZE (mode) > UNITS_PER_WORD
34e56753 1043 && unoptab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing)
77c9c6c2
RK
1044 {
1045 int i;
1046 rtx insns;
1047
1048 if (target == 0 || target == op0)
1049 target = gen_reg_rtx (mode);
1050
1051 start_sequence ();
1052
1053 /* Do the actual arithmetic. */
1054 for (i = 0; i < GET_MODE_BITSIZE (mode) / BITS_PER_WORD; i++)
1055 {
1056 rtx target_piece = operand_subword (target, i, 1, mode);
34e56753 1057 rtx x = expand_unop (word_mode, unoptab,
77c9c6c2
RK
1058 operand_subword_force (op0, i, mode),
1059 target_piece, unsignedp);
1060 if (target_piece != x)
1061 emit_move_insn (target_piece, x);
1062 }
1063
1064 insns = get_insns ();
1065 end_sequence ();
1066
1067 emit_no_conflict_block (insns, target, op0, 0,
1068 gen_rtx (unoptab->code, mode, op0));
1069 return target;
1070 }
1071
1072 if (unoptab->handlers[(int) mode].libfunc)
1073 {
1074 rtx insns;
1075 rtx funexp = unoptab->handlers[(int) mode].libfunc;
1076
1077 start_sequence ();
1078
1079 /* Pass 1 for NO_QUEUE so we don't lose any increments
1080 if the libcall is cse'd or moved. */
1081 emit_library_call (unoptab->handlers[(int) mode].libfunc,
1082 1, mode, 1, op0, mode);
1083 insns = get_insns ();
1084 end_sequence ();
1085
1086 target = gen_reg_rtx (mode);
1087 emit_libcall_block (insns, target, hard_libcall_value (mode),
1088 gen_rtx (unoptab->code, mode, op0));
1089
1090 return target;
1091 }
1092
1093 /* It can't be done in this mode. Can we do it in a wider mode? */
1094
1095 if (class == MODE_INT || class == MODE_FLOAT || class == MODE_COMPLEX_FLOAT)
1096 {
34e56753 1097 for (wider_mode = GET_MODE_WIDER_MODE (mode); wider_mode != VOIDmode;
77c9c6c2
RK
1098 wider_mode = GET_MODE_WIDER_MODE (wider_mode))
1099 {
1100 if ((unoptab->handlers[(int) wider_mode].insn_code
1101 != CODE_FOR_nothing)
1102 || unoptab->handlers[(int) wider_mode].libfunc)
1103 {
34e56753
RS
1104 rtx xop0 = op0;
1105
1106 /* For certain operations, we need not actually extend
1107 the narrow operand, as long as we will truncate the
1108 results to the same narrowness. */
1109
1110 if ((unoptab == neg_optab || unoptab == one_cmpl_optab)
1111 && class == MODE_INT)
1112 xop0 = gen_rtx (SUBREG, wider_mode, force_reg (mode, xop0), 0);
1113 else
1114 xop0 = convert_to_mode (wider_mode, xop0, unsignedp);
77c9c6c2 1115
34e56753
RS
1116 temp = expand_unop (wider_mode, unoptab, xop0, 0, unsignedp);
1117
1118 if (temp)
77c9c6c2 1119 {
34e56753
RS
1120 if (class != MODE_INT)
1121 {
1122 if (target == 0)
1123 target = gen_reg_rtx (mode);
1124 convert_move (target, temp, 0);
1125 return target;
1126 }
1127 else
1128 return gen_lowpart (mode, temp);
77c9c6c2
RK
1129 }
1130 else
34e56753 1131 delete_insns_since (last);
77c9c6c2
RK
1132 }
1133 }
1134 }
1135
1136 return 0;
1137}
1138\f
1139/* Generate an instruction whose insn-code is INSN_CODE,
1140 with two operands: an output TARGET and an input OP0.
1141 TARGET *must* be nonzero, and the output is always stored there.
1142 CODE is an rtx code such that (CODE OP0) is an rtx that describes
1143 the value that is stored into TARGET. */
1144
1145void
1146emit_unop_insn (icode, target, op0, code)
1147 int icode;
1148 rtx target;
1149 rtx op0;
1150 enum rtx_code code;
1151{
1152 register rtx temp;
1153 enum machine_mode mode0 = insn_operand_mode[icode][1];
1154 rtx pat;
1155
1156 temp = target = protect_from_queue (target, 1);
1157
1158 op0 = protect_from_queue (op0, 0);
1159
1160 if (flag_force_mem)
1161 op0 = force_not_mem (op0);
1162
1163 /* Now, if insn does not accept our operands, put them into pseudos. */
1164
1165 if (! (*insn_operand_predicate[icode][1]) (op0, mode0))
1166 op0 = copy_to_mode_reg (mode0, op0);
1167
1168 if (! (*insn_operand_predicate[icode][0]) (temp, GET_MODE (temp))
1169 || (flag_force_mem && GET_CODE (temp) == MEM))
1170 temp = gen_reg_rtx (GET_MODE (temp));
1171
1172 pat = GEN_FCN (icode) (temp, op0);
1173
1174 if (GET_CODE (pat) == SEQUENCE && code != UNKNOWN)
1175 add_equal_note (pat, temp, code, op0, 0);
1176
1177 emit_insn (pat);
1178
1179 if (temp != target)
1180 emit_move_insn (target, temp);
1181}
1182\f
1183/* Emit code to perform a series of operations on a multi-word quantity, one
1184 word at a time.
1185
1186 Such a block is preceeded by a CLOBBER of the output, consists of multiple
1187 insns, each setting one word of the output, and followed by a SET copying
1188 the output to itself.
1189
1190 Each of the insns setting words of the output receives a REG_NO_CONFLICT
1191 note indicating that it doesn't conflict with the (also multi-word)
1192 inputs. The entire block is surrounded by REG_LIBCALL and REG_RETVAL
1193 notes.
1194
1195 INSNS is a block of code generated to perform the operation, not including
1196 the CLOBBER and final copy. All insns that compute intermediate values
1197 are first emitted, followed by the block as described above. Only
1198 INSNs are allowed in the block; no library calls or jumps may be
1199 present.
1200
1201 TARGET, OP0, and OP1 are the output and inputs of the operations,
1202 respectively. OP1 may be zero for a unary operation.
1203
1204 EQUIV, if non-zero, is an expression to be placed into a REG_EQUAL note
1205 on the last insn.
1206
1207 If TARGET is not a register, INSNS is simply emitted with no special
1208 processing.
1209
1210 The final insn emitted is returned. */
1211
1212rtx
1213emit_no_conflict_block (insns, target, op0, op1, equiv)
1214 rtx insns;
1215 rtx target;
1216 rtx op0, op1;
1217 rtx equiv;
1218{
1219 rtx prev, next, first, last, insn;
1220
1221 if (GET_CODE (target) != REG || reload_in_progress)
1222 return emit_insns (insns);
1223
1224 /* First emit all insns that do not store into words of the output and remove
1225 these from the list. */
1226 for (insn = insns; insn; insn = next)
1227 {
1228 rtx set = 0;
1229 int i;
1230
1231 next = NEXT_INSN (insn);
1232
1233 if (GET_CODE (insn) != INSN)
1234 abort ();
1235
1236 if (GET_CODE (PATTERN (insn)) == SET)
1237 set = PATTERN (insn);
1238 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
1239 {
1240 for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
1241 if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET)
1242 {
1243 set = XVECEXP (PATTERN (insn), 0, i);
1244 break;
1245 }
1246 }
1247
1248 if (set == 0)
1249 abort ();
1250
1251 if (! reg_overlap_mentioned_p (target, SET_DEST (set)))
1252 {
1253 if (PREV_INSN (insn))
1254 NEXT_INSN (PREV_INSN (insn)) = next;
1255 else
1256 insns = next;
1257
1258 if (next)
1259 PREV_INSN (next) = PREV_INSN (insn);
1260
1261 add_insn (insn);
1262 }
1263 }
1264
1265 prev = get_last_insn ();
1266
1267 /* Now write the CLOBBER of the output, followed by the setting of each
1268 of the words, followed by the final copy. */
1269 if (target != op0 && target != op1)
1270 emit_insn (gen_rtx (CLOBBER, VOIDmode, target));
1271
1272 for (insn = insns; insn; insn = next)
1273 {
1274 next = NEXT_INSN (insn);
1275 add_insn (insn);
1276
1277 if (op1 && GET_CODE (op1) == REG)
1278 REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_NO_CONFLICT, op1,
1279 REG_NOTES (insn));
1280
1281 if (op0 && GET_CODE (op0) == REG)
1282 REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_NO_CONFLICT, op0,
1283 REG_NOTES (insn));
1284 }
1285
1286 last = emit_move_insn (target, target);
1287 if (equiv)
1288 REG_NOTES (last) = gen_rtx (EXPR_LIST, REG_EQUAL, equiv, REG_NOTES (last));
1289
1290 if (prev == 0)
1291 first = get_insns ();
1292 else
1293 first = NEXT_INSN (prev);
1294
1295 /* Encapsulate the block so it gets manipulated as a unit. */
1296 REG_NOTES (first) = gen_rtx (INSN_LIST, REG_LIBCALL, last,
1297 REG_NOTES (first));
1298 REG_NOTES (last) = gen_rtx (INSN_LIST, REG_RETVAL, first, REG_NOTES (last));
1299
1300 return last;
1301}
1302\f
1303/* Emit code to make a call to a constant function or a library call.
1304
1305 INSNS is a list containing all insns emitted in the call.
1306 These insns leave the result in RESULT. Our block is to copy RESULT
1307 to TARGET, which is logically equivalent to EQUIV.
1308
1309 We first emit any insns that set a pseudo on the assumption that these are
1310 loading constants into registers; doing so allows them to be safely cse'ed
1311 between blocks. Then we emit all the other insns in the block, followed by
1312 an insn to move RESULT to TARGET. This last insn will have a REQ_EQUAL
1313 note with an operand of EQUIV.
1314
1315 Except for the first group of insns (the ones setting pseudos), the
1316 block is delimited by REG_RETVAL and REG_LIBCALL notes. */
1317
1318void
1319emit_libcall_block (insns, target, result, equiv)
1320 rtx insns;
1321 rtx target;
1322 rtx result;
1323 rtx equiv;
1324{
1325 rtx prev, next, first, last, insn;
1326
1327 /* First emit all insns that set pseudos. Remove them from the list as
1328 we go. */
1329
1330 for (insn = insns; insn; insn = next)
1331 {
1332 rtx set = single_set (insn);
1333
1334 next = NEXT_INSN (insn);
1335
1336 if (set != 0 && GET_CODE (SET_DEST (set)) == REG
1337 && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
1338 {
1339 if (PREV_INSN (insn))
1340 NEXT_INSN (PREV_INSN (insn)) = next;
1341 else
1342 insns = next;
1343
1344 if (next)
1345 PREV_INSN (next) = PREV_INSN (insn);
1346
1347 add_insn (insn);
1348 }
1349 }
1350
1351 prev = get_last_insn ();
1352
1353 /* Write the remaining insns followed by the final copy. */
1354
1355 for (insn = insns; insn; insn = next)
1356 {
1357 next = NEXT_INSN (insn);
1358
1359 add_insn (insn);
1360 }
1361
1362 last = emit_move_insn (target, result);
1363 REG_NOTES (last) = gen_rtx (EXPR_LIST, REG_EQUAL, equiv, REG_NOTES (last));
1364
1365 if (prev == 0)
1366 first = get_insns ();
1367 else
1368 first = NEXT_INSN (prev);
1369
1370 /* Encapsulate the block so it gets manipulated as a unit. */
1371 REG_NOTES (first) = gen_rtx (INSN_LIST, REG_LIBCALL, last,
1372 REG_NOTES (first));
1373 REG_NOTES (last) = gen_rtx (INSN_LIST, REG_RETVAL, first, REG_NOTES (last));
1374}
1375\f
1376/* Generate code to store zero in X. */
1377
1378void
1379emit_clr_insn (x)
1380 rtx x;
1381{
1382 emit_move_insn (x, const0_rtx);
1383}
1384
1385/* Generate code to store 1 in X
1386 assuming it contains zero beforehand. */
1387
1388void
1389emit_0_to_1_insn (x)
1390 rtx x;
1391{
1392 emit_move_insn (x, const1_rtx);
1393}
1394
1395/* Generate code to compare X with Y
1396 so that the condition codes are set.
1397
1398 MODE is the mode of the inputs (in case they are const_int).
1399 UNSIGNEDP nonzero says that X and Y are unsigned;
1400 this matters if they need to be widened.
1401
1402 If they have mode BLKmode, then SIZE specifies the size of both X and Y,
1403 and ALIGN specifies the known shared alignment of X and Y.
1404
1405 COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.).
1406 It is ignored for fixed-point and block comparisons;
1407 it is used only for floating-point comparisons. */
1408
1409void
1410emit_cmp_insn (x, y, comparison, size, mode, unsignedp, align)
1411 rtx x, y;
1412 enum rtx_code comparison;
1413 rtx size;
1414 int unsignedp;
1415 int align;
1416{
1417 enum mode_class class;
1418 enum machine_mode wider_mode;
1419
1420 class = GET_MODE_CLASS (mode);
1421
1422 /* They could both be VOIDmode if both args are immediate constants,
1423 but we should fold that at an earlier stage.
1424 With no special code here, this will call abort,
1425 reminding the programmer to implement such folding. */
1426
1427 if (mode != BLKmode && flag_force_mem)
1428 {
1429 x = force_not_mem (x);
1430 y = force_not_mem (y);
1431 }
1432
1433 /* If we are inside an appropriately-short loop and one operand is an
1434 expensive constant, force it into a register. */
1435 if (CONSTANT_P (x) && preserve_subexpressions_p () && rtx_cost (x) > 2)
1436 x = force_reg (mode, x);
1437
1438 if (CONSTANT_P (y) && preserve_subexpressions_p () && rtx_cost (y) > 2)
1439 y = force_reg (mode, y);
1440
1441 /* Don't let both operands fail to indicate the mode. */
1442 if (GET_MODE (x) == VOIDmode && GET_MODE (y) == VOIDmode)
1443 x = force_reg (mode, x);
1444
1445 /* Handle all BLKmode compares. */
1446
1447 if (mode == BLKmode)
1448 {
1449 emit_queue ();
1450 x = protect_from_queue (x, 0);
1451 y = protect_from_queue (y, 0);
1452
1453 if (size == 0)
1454 abort ();
1455#ifdef HAVE_cmpstrqi
1456 if (HAVE_cmpstrqi
1457 && GET_CODE (size) == CONST_INT
1458 && INTVAL (size) < (1 << GET_MODE_BITSIZE (QImode)))
1459 {
1460 enum machine_mode result_mode
1461 = insn_operand_mode[(int) CODE_FOR_cmpstrqi][0];
1462 rtx result = gen_reg_rtx (result_mode);
1463 emit_insn (gen_cmpstrqi (result, x, y, size,
1464 gen_rtx (CONST_INT, VOIDmode, align)));
1465 emit_cmp_insn (result, const0_rtx, comparison, 0, result_mode, 0, 0);
1466 }
1467 else
1468#endif
1469#ifdef HAVE_cmpstrhi
1470 if (HAVE_cmpstrhi
1471 && GET_CODE (size) == CONST_INT
1472 && INTVAL (size) < (1 << GET_MODE_BITSIZE (HImode)))
1473 {
1474 enum machine_mode result_mode
1475 = insn_operand_mode[(int) CODE_FOR_cmpstrhi][0];
1476 rtx result = gen_reg_rtx (result_mode);
1477 emit_insn (gen_cmpstrhi (result, x, y, size,
1478 gen_rtx (CONST_INT, VOIDmode, align)));
1479 emit_cmp_insn (result, const0_rtx, comparison, 0, result_mode, 0, 0);
1480 }
1481 else
1482#endif
1483#ifdef HAVE_cmpstrsi
1484 if (HAVE_cmpstrsi)
1485 {
1486 enum machine_mode result_mode
1487 = insn_operand_mode[(int) CODE_FOR_cmpstrsi][0];
1488 rtx result = gen_reg_rtx (result_mode);
1489 emit_insn (gen_cmpstrsi (result, x, y,
1490 convert_to_mode (SImode, size, 1),
1491 gen_rtx (CONST_INT, VOIDmode, align)));
1492 emit_cmp_insn (result, const0_rtx, comparison, 0, result_mode, 0, 0);
1493 }
1494 else
1495#endif
1496 {
1497#ifdef TARGET_MEM_FUNCTIONS
1498 emit_library_call (memcmp_libfunc, 0,
1499 TYPE_MODE (integer_type_node), 3,
1500 XEXP (x, 0), Pmode, XEXP (y, 0), Pmode,
1501 size, Pmode);
1502#else
1503 emit_library_call (bcmp_libfunc, 0,
1504 TYPE_MODE (integer_type_node), 3,
1505 XEXP (x, 0), Pmode, XEXP (y, 0), Pmode,
1506 size, Pmode);
1507#endif
1508 emit_cmp_insn (hard_libcall_value (TYPE_MODE (integer_type_node)),
1509 const0_rtx, comparison, 0,
1510 TYPE_MODE (integer_type_node), 0, 0);
1511 }
1512 return;
1513 }
1514
1515 /* Handle some compares against zero. */
1516
1517 if (y == CONST0_RTX (mode)
1518 && tst_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
1519 {
1520 int icode = (int) tst_optab->handlers[(int) mode].insn_code;
1521
1522 emit_queue ();
1523 x = protect_from_queue (x, 0);
1524 y = protect_from_queue (y, 0);
1525
1526 /* Now, if insn does accept these operands, put them into pseudos. */
1527 if (! (*insn_operand_predicate[icode][0])
1528 (x, insn_operand_mode[icode][0]))
1529 x = copy_to_mode_reg (insn_operand_mode[icode][0], x);
1530
1531 emit_insn (GEN_FCN (icode) (x));
1532 return;
1533 }
1534
1535 /* Handle compares for which there is a directly suitable insn. */
1536
1537 if (cmp_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
1538 {
1539 int icode = (int) cmp_optab->handlers[(int) mode].insn_code;
1540
1541 emit_queue ();
1542 x = protect_from_queue (x, 0);
1543 y = protect_from_queue (y, 0);
1544
1545 /* Now, if insn doesn't accept these operands, put them into pseudos. */
1546 if (! (*insn_operand_predicate[icode][0])
1547 (x, insn_operand_mode[icode][0]))
1548 x = copy_to_mode_reg (insn_operand_mode[icode][0], x);
1549
1550 if (! (*insn_operand_predicate[icode][1])
1551 (y, insn_operand_mode[icode][1]))
1552 y = copy_to_mode_reg (insn_operand_mode[icode][1], y);
1553
1554 emit_insn (GEN_FCN (icode) (x, y));
1555 return;
1556 }
1557
1558 /* Try widening if we can find a direct insn that way. */
1559
1560 if (class == MODE_INT || class == MODE_FLOAT || class == MODE_COMPLEX_FLOAT)
1561 {
34e56753 1562 for (wider_mode = GET_MODE_WIDER_MODE (mode); wider_mode != VOIDmode;
77c9c6c2
RK
1563 wider_mode = GET_MODE_WIDER_MODE (wider_mode))
1564 {
1565 if (cmp_optab->handlers[(int) wider_mode].insn_code
1566 != CODE_FOR_nothing)
1567 {
1568 x = convert_to_mode (wider_mode, x, unsignedp);
1569 y = convert_to_mode (wider_mode, y, unsignedp);
1570 emit_cmp_insn (x, y, comparison, 0,
1571 wider_mode, unsignedp, align);
1572 return;
1573 }
1574 }
1575 }
1576
1577 /* Handle a lib call just for the mode we are using. */
1578
1579 if (cmp_optab->handlers[(int) mode].libfunc
1580 && class != MODE_FLOAT)
1581 {
1582 rtx libfunc = cmp_optab->handlers[(int) mode].libfunc;
1583 /* If we want unsigned, and this mode has a distinct unsigned
1584 comparison routine, use that. */
1585 if (unsignedp && ucmp_optab->handlers[(int) mode].libfunc)
1586 libfunc = ucmp_optab->handlers[(int) mode].libfunc;
1587
1588 emit_library_call (libfunc, 0,
1589 SImode, 2, x, mode, y, mode);
1590
1591 /* Integer comparison returns a result that must be compared against 1,
1592 so that even if we do an unsigned compare afterward,
1593 there is still a value that can represent the result "less than". */
1594
1595 emit_cmp_insn (hard_libcall_value (SImode), const1_rtx,
1596 comparison, 0, SImode, unsignedp, 0);
1597 return;
1598 }
1599
1600 if (class == MODE_FLOAT)
1601 emit_float_lib_cmp (x, y, comparison);
1602
1603 else
1604 abort ();
1605}
1606
1607/* Nonzero if a compare of mode MODE can be done straightforwardly
1608 (without splitting it into pieces). */
1609
1610int
1611can_compare_p (mode)
1612 enum machine_mode mode;
1613{
1614 do
1615 {
1616 if (cmp_optab->handlers[(int)mode].insn_code != CODE_FOR_nothing)
1617 return 1;
1618 mode = GET_MODE_WIDER_MODE (mode);
1619 } while (mode != VOIDmode);
1620
1621 return 0;
1622}
1623\f
1624/* Emit a library call comparison between floating point X and Y.
1625 COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.). */
1626
1627static void
1628emit_float_lib_cmp (x, y, comparison)
1629 rtx x, y;
1630 enum rtx_code comparison;
1631{
1632 enum machine_mode mode = GET_MODE (x);
1633 rtx libfunc;
1634
1635 if (mode == SFmode)
1636 switch (comparison)
1637 {
1638 case EQ:
1639 libfunc = eqsf2_libfunc;
1640 break;
1641
1642 case NE:
1643 libfunc = nesf2_libfunc;
1644 break;
1645
1646 case GT:
1647 libfunc = gtsf2_libfunc;
1648 break;
1649
1650 case GE:
1651 libfunc = gesf2_libfunc;
1652 break;
1653
1654 case LT:
1655 libfunc = ltsf2_libfunc;
1656 break;
1657
1658 case LE:
1659 libfunc = lesf2_libfunc;
1660 break;
1661 }
1662 else if (mode == DFmode)
1663 switch (comparison)
1664 {
1665 case EQ:
1666 libfunc = eqdf2_libfunc;
1667 break;
1668
1669 case NE:
1670 libfunc = nedf2_libfunc;
1671 break;
1672
1673 case GT:
1674 libfunc = gtdf2_libfunc;
1675 break;
1676
1677 case GE:
1678 libfunc = gedf2_libfunc;
1679 break;
1680
1681 case LT:
1682 libfunc = ltdf2_libfunc;
1683 break;
1684
1685 case LE:
1686 libfunc = ledf2_libfunc;
1687 break;
1688 }
1689 else
1690 {
1691 enum machine_mode wider_mode;
1692
34e56753 1693 for (wider_mode = GET_MODE_WIDER_MODE (mode); wider_mode != VOIDmode;
77c9c6c2
RK
1694 wider_mode = GET_MODE_WIDER_MODE (wider_mode))
1695 {
1696 if ((cmp_optab->handlers[(int) wider_mode].insn_code
1697 != CODE_FOR_nothing)
1698 || (cmp_optab->handlers[(int) wider_mode].libfunc != 0))
1699 {
1700 x = convert_to_mode (wider_mode, x, 0);
1701 y = convert_to_mode (wider_mode, y, 0);
1702 emit_float_lib_cmp (x, y, comparison);
1703 return;
1704 }
1705 }
1706 abort ();
1707 }
1708
1709 emit_library_call (libfunc, 0,
1710 SImode, 2, x, mode, y, mode);
1711
1712 emit_cmp_insn (hard_libcall_value (SImode), const0_rtx, comparison,
1713 0, SImode, 0, 0);
1714}
1715\f
1716/* Generate code to indirectly jump to a location given in the rtx LOC. */
1717
1718void
1719emit_indirect_jump (loc)
1720 rtx loc;
1721{
1722 if (! ((*insn_operand_predicate[(int)CODE_FOR_indirect_jump][0])
1723 (loc, VOIDmode)))
1724 loc = copy_to_mode_reg (insn_operand_mode[(int)CODE_FOR_indirect_jump][0],
1725 loc);
1726
1727 emit_jump_insn (gen_indirect_jump (loc));
1728}
1729\f
1730/* These three functions generate an insn body and return it
1731 rather than emitting the insn.
1732
1733 They do not protect from queued increments,
1734 because they may be used 1) in protect_from_queue itself
1735 and 2) in other passes where there is no queue. */
1736
1737/* Generate and return an insn body to add Y to X. */
1738
1739rtx
1740gen_add2_insn (x, y)
1741 rtx x, y;
1742{
1743 int icode = (int) add_optab->handlers[(int) GET_MODE (x)].insn_code;
1744
1745 if (! (*insn_operand_predicate[icode][0]) (x, insn_operand_mode[icode][0])
1746 || ! (*insn_operand_predicate[icode][1]) (x, insn_operand_mode[icode][1])
1747 || ! (*insn_operand_predicate[icode][2]) (y, insn_operand_mode[icode][2]))
1748 abort ();
1749
1750 return (GEN_FCN (icode) (x, x, y));
1751}
1752
1753int
1754have_add2_insn (mode)
1755 enum machine_mode mode;
1756{
1757 return add_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing;
1758}
1759
1760/* Generate and return an insn body to subtract Y from X. */
1761
1762rtx
1763gen_sub2_insn (x, y)
1764 rtx x, y;
1765{
1766 int icode = (int) sub_optab->handlers[(int) GET_MODE (x)].insn_code;
1767
1768 if (! (*insn_operand_predicate[icode][0]) (x, insn_operand_mode[icode][0])
1769 || ! (*insn_operand_predicate[icode][1]) (x, insn_operand_mode[icode][1])
1770 || ! (*insn_operand_predicate[icode][2]) (y, insn_operand_mode[icode][2]))
1771 abort ();
1772
1773 return (GEN_FCN (icode) (x, x, y));
1774}
1775
1776int
1777have_sub2_insn (mode)
1778 enum machine_mode mode;
1779{
1780 return sub_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing;
1781}
1782
1783/* Generate the body of an instruction to copy Y into X. */
1784
1785rtx
1786gen_move_insn (x, y)
1787 rtx x, y;
1788{
1789 register enum machine_mode mode = GET_MODE (x);
1790 enum insn_code insn_code;
1791
1792 if (mode == VOIDmode)
1793 mode = GET_MODE (y);
1794
1795 insn_code = mov_optab->handlers[(int) mode].insn_code;
1796
1797 /* Handle MODE_CC modes: If we don't have a special move insn for this mode,
1798 find a mode to do it in. If we have a movcc, use it. Otherwise,
1799 find the MODE_INT mode of the same width. */
1800
1801 if (insn_code == CODE_FOR_nothing)
1802 {
1803 enum machine_mode tmode = VOIDmode;
1804 rtx x1 = x, y1 = y;
1805
1806 if (GET_MODE_CLASS (mode) == MODE_CC && mode != CCmode
1807 && mov_optab->handlers[(int) CCmode].insn_code != CODE_FOR_nothing)
1808 tmode = CCmode;
1809 else if (GET_MODE_CLASS (mode) == MODE_CC)
1810 for (tmode = QImode; tmode != VOIDmode;
1811 tmode = GET_MODE_WIDER_MODE (tmode))
1812 if (GET_MODE_SIZE (tmode) == GET_MODE_SIZE (mode))
1813 break;
1814
1815 if (tmode == VOIDmode)
1816 abort ();
1817
1818 /* Get X and Y in TMODE. We can't use gen_lowpart here because it
1819 may call change_address which is not appropriate if we were
1820 called when a reload was in progress. We don't have to worry
1821 about changing the address since the size in bytes is supposed to
1822 be the same. Copy the MEM to change the mode and move any
1823 substitutions from the old MEM to the new one. */
1824
1825 if (reload_in_progress)
1826 {
1827 x = gen_lowpart_common (tmode, x1);
1828 if (x == 0 && GET_CODE (x1) == MEM)
1829 {
1830 x = gen_rtx (MEM, tmode, XEXP (x1, 0));
1831 RTX_UNCHANGING_P (x) = RTX_UNCHANGING_P (x1);
1832 MEM_IN_STRUCT_P (x) = MEM_IN_STRUCT_P (x1);
1833 MEM_VOLATILE_P (x) = MEM_VOLATILE_P (x1);
1834 copy_replacements (x1, x);
1835 }
1836
1837 y = gen_lowpart_common (tmode, y1);
1838 if (y == 0 && GET_CODE (y1) == MEM)
1839 {
1840 y = gen_rtx (MEM, tmode, XEXP (y1, 0));
1841 RTX_UNCHANGING_P (y) = RTX_UNCHANGING_P (y1);
1842 MEM_IN_STRUCT_P (y) = MEM_IN_STRUCT_P (y1);
1843 MEM_VOLATILE_P (y) = MEM_VOLATILE_P (y1);
1844 copy_replacements (y1, y);
1845 }
1846 }
1847 else
1848 {
1849 x = gen_lowpart (tmode, x);
1850 y = gen_lowpart (tmode, y);
1851 }
1852
1853 insn_code = mov_optab->handlers[(int) tmode].insn_code;
1854 }
1855
1856 return (GEN_FCN (insn_code) (x, y));
1857}
1858\f
1859/* Tables of patterns for extending one integer mode to another. */
34e56753 1860static enum insn_code extendtab[MAX_MACHINE_MODE][MAX_MACHINE_MODE][2];
77c9c6c2 1861
34e56753
RS
1862/* Return the insn code used to extend FROM_MODE to TO_MODE.
1863 UNSIGNEDP specifies zero-extension instead of sign-extension. If
1864 no such operation exists, CODE_FOR_nothing will be returned. */
77c9c6c2 1865
34e56753 1866enum insn_code
77c9c6c2
RK
1867can_extend_p (to_mode, from_mode, unsignedp)
1868 enum machine_mode to_mode, from_mode;
1869 int unsignedp;
1870{
34e56753 1871 return extendtab[(int) to_mode][(int) from_mode][unsignedp];
77c9c6c2
RK
1872}
1873
1874/* Generate the body of an insn to extend Y (with mode MFROM)
1875 into X (with mode MTO). Do zero-extension if UNSIGNEDP is nonzero. */
1876
1877rtx
1878gen_extend_insn (x, y, mto, mfrom, unsignedp)
1879 rtx x, y;
1880 enum machine_mode mto, mfrom;
1881 int unsignedp;
1882{
34e56753 1883 return (GEN_FCN (extendtab[(int) mto][(int) mfrom][unsignedp]) (x, y));
77c9c6c2
RK
1884}
1885
1886static void
1887init_extends ()
1888{
34e56753
RS
1889 enum insn_code *p;
1890
1891 for (p = extendtab[0][0];
1892 p < extendtab[0][0] + sizeof extendtab / sizeof extendtab[0][0][0];
1893 p++)
1894 *p = CODE_FOR_nothing;
77c9c6c2
RK
1895
1896#ifdef HAVE_extendditi2
1897 if (HAVE_extendditi2)
34e56753 1898 extendtab[(int) TImode][(int) DImode][0] = CODE_FOR_extendditi2;
77c9c6c2
RK
1899#endif
1900#ifdef HAVE_extendsiti2
1901 if (HAVE_extendsiti2)
34e56753 1902 extendtab[(int) TImode][(int) SImode][0] = CODE_FOR_extendsiti2;
77c9c6c2
RK
1903#endif
1904#ifdef HAVE_extendhiti2
1905 if (HAVE_extendhiti2)
34e56753 1906 extendtab[(int) TImode][(int) HImode][0] = CODE_FOR_extendhiti2;
77c9c6c2
RK
1907#endif
1908#ifdef HAVE_extendqiti2
1909 if (HAVE_extendqiti2)
34e56753 1910 extendtab[(int) TImode][(int) QImode][0] = CODE_FOR_extendqiti2;
77c9c6c2
RK
1911#endif
1912#ifdef HAVE_extendsidi2
1913 if (HAVE_extendsidi2)
34e56753 1914 extendtab[(int) DImode][(int) SImode][0] = CODE_FOR_extendsidi2;
77c9c6c2
RK
1915#endif
1916#ifdef HAVE_extendhidi2
1917 if (HAVE_extendhidi2)
34e56753 1918 extendtab[(int) DImode][(int) HImode][0] = CODE_FOR_extendhidi2;
77c9c6c2
RK
1919#endif
1920#ifdef HAVE_extendqidi2
1921 if (HAVE_extendqidi2)
34e56753 1922 extendtab[(int) DImode][(int) QImode][0] = CODE_FOR_extendqidi2;
77c9c6c2
RK
1923#endif
1924#ifdef HAVE_extendhisi2
1925 if (HAVE_extendhisi2)
34e56753 1926 extendtab[(int) SImode][(int) HImode][0] = CODE_FOR_extendhisi2;
77c9c6c2
RK
1927#endif
1928#ifdef HAVE_extendqisi2
1929 if (HAVE_extendqisi2)
34e56753 1930 extendtab[(int) SImode][(int) QImode][0] = CODE_FOR_extendqisi2;
77c9c6c2
RK
1931#endif
1932#ifdef HAVE_extendqihi2
1933 if (HAVE_extendqihi2)
34e56753 1934 extendtab[(int) HImode][(int) QImode][0] = CODE_FOR_extendqihi2;
77c9c6c2
RK
1935#endif
1936
1937#ifdef HAVE_zero_extendditi2
1938 if (HAVE_zero_extendsiti2)
34e56753 1939 extendtab[(int) TImode][(int) DImode][1] = CODE_FOR_zero_extendditi2;
77c9c6c2
RK
1940#endif
1941#ifdef HAVE_zero_extendsiti2
1942 if (HAVE_zero_extendsiti2)
34e56753 1943 extendtab[(int) TImode][(int) SImode][1] = CODE_FOR_zero_extendsiti2;
77c9c6c2
RK
1944#endif
1945#ifdef HAVE_zero_extendhiti2
1946 if (HAVE_zero_extendhiti2)
34e56753 1947 extendtab[(int) TImode][(int) HImode][1] = CODE_FOR_zero_extendhiti2;
77c9c6c2
RK
1948#endif
1949#ifdef HAVE_zero_extendqiti2
1950 if (HAVE_zero_extendqiti2)
34e56753 1951 extendtab[(int) TImode][(int) QImode][1] = CODE_FOR_zero_extendqiti2;
77c9c6c2
RK
1952#endif
1953#ifdef HAVE_zero_extendsidi2
1954 if (HAVE_zero_extendsidi2)
34e56753 1955 extendtab[(int) DImode][(int) SImode][1] = CODE_FOR_zero_extendsidi2;
77c9c6c2
RK
1956#endif
1957#ifdef HAVE_zero_extendhidi2
1958 if (HAVE_zero_extendhidi2)
34e56753 1959 extendtab[(int) DImode][(int) HImode][1] = CODE_FOR_zero_extendhidi2;
77c9c6c2
RK
1960#endif
1961#ifdef HAVE_zero_extendqidi2
1962 if (HAVE_zero_extendqidi2)
34e56753 1963 extendtab[(int) DImode][(int) QImode][1] = CODE_FOR_zero_extendqidi2;
77c9c6c2
RK
1964#endif
1965#ifdef HAVE_zero_extendhisi2
1966 if (HAVE_zero_extendhisi2)
34e56753 1967 extendtab[(int) SImode][(int) HImode][1] = CODE_FOR_zero_extendhisi2;
77c9c6c2
RK
1968#endif
1969#ifdef HAVE_zero_extendqisi2
1970 if (HAVE_zero_extendqisi2)
34e56753 1971 extendtab[(int) SImode][(int) QImode][1] = CODE_FOR_zero_extendqisi2;
77c9c6c2
RK
1972#endif
1973#ifdef HAVE_zero_extendqihi2
1974 if (HAVE_zero_extendqihi2)
34e56753 1975 extendtab[(int) HImode][(int) QImode][1] = CODE_FOR_zero_extendqihi2;
77c9c6c2
RK
1976#endif
1977}
1978\f
1979/* can_fix_p and can_float_p say whether the target machine
1980 can directly convert a given fixed point type to
1981 a given floating point type, or vice versa.
1982 The returned value is the CODE_FOR_... value to use,
1983 or CODE_FOR_nothing if these modes cannot be directly converted. */
1984
1985static enum insn_code fixtab[NUM_MACHINE_MODES][NUM_MACHINE_MODES][2];
1986static enum insn_code fixtrunctab[NUM_MACHINE_MODES][NUM_MACHINE_MODES][2];
1987static enum insn_code floattab[NUM_MACHINE_MODES][NUM_MACHINE_MODES][2];
1988
1989/* *TRUNCP_PTR is set to 1 if it is necessary to output
1990 an explicit FTRUNC insn before the fix insn; otherwise 0. */
1991
1992static enum insn_code
1993can_fix_p (fixmode, fltmode, unsignedp, truncp_ptr)
1994 enum machine_mode fltmode, fixmode;
1995 int unsignedp;
1996 int *truncp_ptr;
1997{
1998 *truncp_ptr = 0;
1999 if (fixtrunctab[(int) fltmode][(int) fixmode][unsignedp] != CODE_FOR_nothing)
2000 return fixtrunctab[(int) fltmode][(int) fixmode][unsignedp];
2001
2002 if (ftrunc_optab->handlers[(int) fltmode].insn_code != CODE_FOR_nothing)
2003 {
2004 *truncp_ptr = 1;
2005 return fixtab[(int) fltmode][(int) fixmode][unsignedp];
2006 }
2007 return CODE_FOR_nothing;
2008}
2009
2010static enum insn_code
2011can_float_p (fltmode, fixmode, unsignedp)
2012 enum machine_mode fixmode, fltmode;
2013 int unsignedp;
2014{
2015 return floattab[(int) fltmode][(int) fixmode][unsignedp];
2016}
2017
2018void
2019init_fixtab ()
2020{
2021 enum insn_code *p;
2022 for (p = fixtab[0][0];
2023 p < fixtab[0][0] + sizeof fixtab / sizeof (fixtab[0][0][0]);
2024 p++)
2025 *p = CODE_FOR_nothing;
2026 for (p = fixtrunctab[0][0];
2027 p < fixtrunctab[0][0] + sizeof fixtrunctab / sizeof (fixtrunctab[0][0][0]);
2028 p++)
2029 *p = CODE_FOR_nothing;
2030
2031#ifdef HAVE_fixsfqi2
2032 if (HAVE_fixsfqi2)
2033 fixtab[(int) SFmode][(int) QImode][0] = CODE_FOR_fixsfqi2;
2034#endif
2035#ifdef HAVE_fixsfhi2
2036 if (HAVE_fixsfhi2)
2037 fixtab[(int) SFmode][(int) HImode][0] = CODE_FOR_fixsfhi2;
2038#endif
2039#ifdef HAVE_fixsfsi2
2040 if (HAVE_fixsfsi2)
2041 fixtab[(int) SFmode][(int) SImode][0] = CODE_FOR_fixsfsi2;
2042#endif
2043#ifdef HAVE_fixsfdi2
2044 if (HAVE_fixsfdi2)
2045 fixtab[(int) SFmode][(int) DImode][0] = CODE_FOR_fixsfdi2;
2046#endif
2047
2048#ifdef HAVE_fixdfqi2
2049 if (HAVE_fixdfqi2)
2050 fixtab[(int) DFmode][(int) QImode][0] = CODE_FOR_fixdfqi2;
2051#endif
2052#ifdef HAVE_fixdfhi2
2053 if (HAVE_fixdfhi2)
2054 fixtab[(int) DFmode][(int) HImode][0] = CODE_FOR_fixdfhi2;
2055#endif
2056#ifdef HAVE_fixdfsi2
2057 if (HAVE_fixdfsi2)
2058 fixtab[(int) DFmode][(int) SImode][0] = CODE_FOR_fixdfsi2;
2059#endif
2060#ifdef HAVE_fixdfdi2
2061 if (HAVE_fixdfdi2)
2062 fixtab[(int) DFmode][(int) DImode][0] = CODE_FOR_fixdfdi2;
2063#endif
2064#ifdef HAVE_fixdfti2
2065 if (HAVE_fixdfti2)
2066 fixtab[(int) DFmode][(int) TImode][0] = CODE_FOR_fixdfti2;
2067#endif
2068
2069#ifdef HAVE_fixtfqi2
2070 if (HAVE_fixtfqi2)
2071 fixtab[(int) TFmode][(int) QImode][0] = CODE_FOR_fixtfqi2;
2072#endif
2073#ifdef HAVE_fixtfhi2
2074 if (HAVE_fixtfhi2)
2075 fixtab[(int) TFmode][(int) HImode][0] = CODE_FOR_fixtfhi2;
2076#endif
2077#ifdef HAVE_fixtfsi2
2078 if (HAVE_fixtfsi2)
2079 fixtab[(int) TFmode][(int) SImode][0] = CODE_FOR_fixtfsi2;
2080#endif
2081#ifdef HAVE_fixtfdi2
2082 if (HAVE_fixtfdi2)
2083 fixtab[(int) TFmode][(int) DImode][0] = CODE_FOR_fixtfdi2;
2084#endif
2085#ifdef HAVE_fixtfti2
2086 if (HAVE_fixtfti2)
2087 fixtab[(int) TFmode][(int) TImode][0] = CODE_FOR_fixtfti2;
2088#endif
2089
2090#ifdef HAVE_fixunssfqi2
2091 if (HAVE_fixunssfqi2)
2092 fixtab[(int) SFmode][(int) QImode][1] = CODE_FOR_fixunssfqi2;
2093#endif
2094#ifdef HAVE_fixunssfhi2
2095 if (HAVE_fixunssfhi2)
2096 fixtab[(int) SFmode][(int) HImode][1] = CODE_FOR_fixunssfhi2;
2097#endif
2098#ifdef HAVE_fixunssfsi2
2099 if (HAVE_fixunssfsi2)
2100 fixtab[(int) SFmode][(int) SImode][1] = CODE_FOR_fixunssfsi2;
2101#endif
2102#ifdef HAVE_fixunssfdi2
2103 if (HAVE_fixunssfdi2)
2104 fixtab[(int) SFmode][(int) DImode][1] = CODE_FOR_fixunssfdi2;
2105#endif
2106
2107#ifdef HAVE_fixunsdfqi2
2108 if (HAVE_fixunsdfqi2)
2109 fixtab[(int) DFmode][(int) QImode][1] = CODE_FOR_fixunsdfqi2;
2110#endif
2111#ifdef HAVE_fixunsdfhi2
2112 if (HAVE_fixunsdfhi2)
2113 fixtab[(int) DFmode][(int) HImode][1] = CODE_FOR_fixunsdfhi2;
2114#endif
2115#ifdef HAVE_fixunsdfsi2
2116 if (HAVE_fixunsdfsi2)
2117 fixtab[(int) DFmode][(int) SImode][1] = CODE_FOR_fixunsdfsi2;
2118#endif
2119#ifdef HAVE_fixunsdfdi2
2120 if (HAVE_fixunsdfdi2)
2121 fixtab[(int) DFmode][(int) DImode][1] = CODE_FOR_fixunsdfdi2;
2122#endif
2123#ifdef HAVE_fixunsdfti2
2124 if (HAVE_fixunsdfti2)
2125 fixtab[(int) DFmode][(int) TImode][1] = CODE_FOR_fixunsdfti2;
2126#endif
2127
2128#ifdef HAVE_fixunstfqi2
2129 if (HAVE_fixunstfqi2)
2130 fixtab[(int) TFmode][(int) QImode][1] = CODE_FOR_fixunstfqi2;
2131#endif
2132#ifdef HAVE_fixunstfhi2
2133 if (HAVE_fixunstfhi2)
2134 fixtab[(int) TFmode][(int) HImode][1] = CODE_FOR_fixunstfhi2;
2135#endif
2136#ifdef HAVE_fixunstfsi2
2137 if (HAVE_fixunstfsi2)
2138 fixtab[(int) TFmode][(int) SImode][1] = CODE_FOR_fixunstfsi2;
2139#endif
2140#ifdef HAVE_fixunstfdi2
2141 if (HAVE_fixunstfdi2)
2142 fixtab[(int) TFmode][(int) DImode][1] = CODE_FOR_fixunstfdi2;
2143#endif
2144#ifdef HAVE_fixunstfti2
2145 if (HAVE_fixunstfti2)
2146 fixtab[(int) TFmode][(int) TImode][1] = CODE_FOR_fixunstfti2;
2147#endif
2148
2149#ifdef HAVE_fix_truncsfqi2
2150 if (HAVE_fix_truncsfqi2)
2151 fixtrunctab[(int) SFmode][(int) QImode][0] = CODE_FOR_fix_truncsfqi2;
2152#endif
2153#ifdef HAVE_fix_truncsfhi2
2154 if (HAVE_fix_truncsfhi2)
2155 fixtrunctab[(int) SFmode][(int) HImode][0] = CODE_FOR_fix_truncsfhi2;
2156#endif
2157#ifdef HAVE_fix_truncsfsi2
2158 if (HAVE_fix_truncsfsi2)
2159 fixtrunctab[(int) SFmode][(int) SImode][0] = CODE_FOR_fix_truncsfsi2;
2160#endif
2161#ifdef HAVE_fix_truncsfdi2
2162 if (HAVE_fix_truncsfdi2)
2163 fixtrunctab[(int) SFmode][(int) DImode][0] = CODE_FOR_fix_truncsfdi2;
2164#endif
2165
2166#ifdef HAVE_fix_truncdfqi2
2167 if (HAVE_fix_truncdfsi2)
2168 fixtrunctab[(int) DFmode][(int) QImode][0] = CODE_FOR_fix_truncdfqi2;
2169#endif
2170#ifdef HAVE_fix_truncdfhi2
2171 if (HAVE_fix_truncdfhi2)
2172 fixtrunctab[(int) DFmode][(int) HImode][0] = CODE_FOR_fix_truncdfhi2;
2173#endif
2174#ifdef HAVE_fix_truncdfsi2
2175 if (HAVE_fix_truncdfsi2)
2176 fixtrunctab[(int) DFmode][(int) SImode][0] = CODE_FOR_fix_truncdfsi2;
2177#endif
2178#ifdef HAVE_fix_truncdfdi2
2179 if (HAVE_fix_truncdfdi2)
2180 fixtrunctab[(int) DFmode][(int) DImode][0] = CODE_FOR_fix_truncdfdi2;
2181#endif
2182#ifdef HAVE_fix_truncdfti2
2183 if (HAVE_fix_truncdfti2)
2184 fixtrunctab[(int) DFmode][(int) TImode][0] = CODE_FOR_fix_truncdfti2;
2185#endif
2186
2187#ifdef HAVE_fix_trunctfqi2
2188 if (HAVE_fix_trunctfqi2)
2189 fixtrunctab[(int) TFmode][(int) QImode][0] = CODE_FOR_fix_trunctfqi2;
2190#endif
2191#ifdef HAVE_fix_trunctfhi2
2192 if (HAVE_fix_trunctfhi2)
2193 fixtrunctab[(int) TFmode][(int) HImode][0] = CODE_FOR_fix_trunctfhi2;
2194#endif
2195#ifdef HAVE_fix_trunctfsi2
2196 if (HAVE_fix_trunctfsi2)
2197 fixtrunctab[(int) TFmode][(int) SImode][0] = CODE_FOR_fix_trunctfsi2;
2198#endif
2199#ifdef HAVE_fix_trunctfdi2
2200 if (HAVE_fix_trunctfdi2)
2201 fixtrunctab[(int) TFmode][(int) DImode][0] = CODE_FOR_fix_trunctfdi2;
2202#endif
2203#ifdef HAVE_fix_trunctfti2
2204 if (HAVE_fix_trunctfti2)
2205 fixtrunctab[(int) TFmode][(int) TImode][0] = CODE_FOR_fix_trunctfti2;
2206#endif
2207
2208#ifdef HAVE_fixuns_truncsfqi2
2209 if (HAVE_fixuns_truncsfqi2)
2210 fixtrunctab[(int) SFmode][(int) QImode][1] = CODE_FOR_fixuns_truncsfqi2;
2211#endif
2212#ifdef HAVE_fixuns_truncsfhi2
2213 if (HAVE_fixuns_truncsfhi2)
2214 fixtrunctab[(int) SFmode][(int) HImode][1] = CODE_FOR_fixuns_truncsfhi2;
2215#endif
2216#ifdef HAVE_fixuns_truncsfsi2
2217 if (HAVE_fixuns_truncsfsi2)
2218 fixtrunctab[(int) SFmode][(int) SImode][1] = CODE_FOR_fixuns_truncsfsi2;
2219#endif
2220#ifdef HAVE_fixuns_truncsfdi2
2221 if (HAVE_fixuns_truncsfdi2)
2222 fixtrunctab[(int) SFmode][(int) DImode][1] = CODE_FOR_fixuns_truncsfdi2;
2223#endif
2224
2225#ifdef HAVE_fixuns_truncdfqi2
2226 if (HAVE_fixuns_truncdfqi2)
2227 fixtrunctab[(int) DFmode][(int) QImode][1] = CODE_FOR_fixuns_truncdfqi2;
2228#endif
2229#ifdef HAVE_fixuns_truncdfhi2
2230 if (HAVE_fixuns_truncdfhi2)
2231 fixtrunctab[(int) DFmode][(int) HImode][1] = CODE_FOR_fixuns_truncdfhi2;
2232#endif
2233#ifdef HAVE_fixuns_truncdfsi2
2234 if (HAVE_fixuns_truncdfsi2)
2235 fixtrunctab[(int) DFmode][(int) SImode][1] = CODE_FOR_fixuns_truncdfsi2;
2236#endif
2237#ifdef HAVE_fixuns_truncdfdi2
2238 if (HAVE_fixuns_truncdfdi2)
2239 fixtrunctab[(int) DFmode][(int) DImode][1] = CODE_FOR_fixuns_truncdfdi2;
2240#endif
2241#ifdef HAVE_fixuns_truncdfti2
2242 if (HAVE_fixuns_truncdfti2)
2243 fixtrunctab[(int) DFmode][(int) TImode][1] = CODE_FOR_fixuns_truncdfti2;
2244#endif
2245
2246#ifdef HAVE_fixuns_trunctfqi2
2247 if (HAVE_fixuns_trunctfqi2)
2248 fixtrunctab[(int) TFmode][(int) QImode][1] = CODE_FOR_fixuns_trunctfqi2;
2249#endif
2250#ifdef HAVE_fixuns_trunctfhi2
2251 if (HAVE_fixuns_trunctfhi2)
2252 fixtrunctab[(int) TFmode][(int) HImode][1] = CODE_FOR_fixuns_trunctfhi2;
2253#endif
2254#ifdef HAVE_fixuns_trunctfsi2
2255 if (HAVE_fixuns_trunctfsi2)
2256 fixtrunctab[(int) TFmode][(int) SImode][1] = CODE_FOR_fixuns_trunctfsi2;
2257#endif
2258#ifdef HAVE_fixuns_trunctfdi2
2259 if (HAVE_fixuns_trunctfdi2)
2260 fixtrunctab[(int) TFmode][(int) DImode][1] = CODE_FOR_fixuns_trunctfdi2;
2261#endif
2262#ifdef HAVE_fixuns_trunctfti2
2263 if (HAVE_fixuns_trunctfti2)
2264 fixtrunctab[(int) TFmode][(int) TImode][1] = CODE_FOR_fixuns_trunctfti2;
2265#endif
2266
2267#ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC
2268 /* This flag says the same insns that convert to a signed fixnum
2269 also convert validly to an unsigned one. */
2270 {
2271 int i;
2272 int j;
2273 for (i = 0; i < NUM_MACHINE_MODES; i++)
2274 for (j = 0; j < NUM_MACHINE_MODES; j++)
2275 fixtrunctab[i][j][1] = fixtrunctab[i][j][0];
2276 }
2277#endif
2278}
2279
2280void
2281init_floattab ()
2282{
2283 enum insn_code *p;
2284 for (p = floattab[0][0];
2285 p < floattab[0][0] + sizeof floattab / sizeof (floattab[0][0][0]);
2286 p++)
2287 *p = CODE_FOR_nothing;
2288
2289#ifdef HAVE_floatqisf2
2290 if (HAVE_floatqisf2)
2291 floattab[(int) SFmode][(int) QImode][0] = CODE_FOR_floatqisf2;
2292#endif
2293#ifdef HAVE_floathisf2
2294 if (HAVE_floathisf2)
2295 floattab[(int) SFmode][(int) HImode][0] = CODE_FOR_floathisf2;
2296#endif
2297#ifdef HAVE_floatsisf2
2298 if (HAVE_floatsisf2)
2299 floattab[(int) SFmode][(int) SImode][0] = CODE_FOR_floatsisf2;
2300#endif
2301#ifdef HAVE_floatdisf2
2302 if (HAVE_floatdisf2)
2303 floattab[(int) SFmode][(int) DImode][0] = CODE_FOR_floatdisf2;
2304#endif
2305#ifdef HAVE_floattisf2
2306 if (HAVE_floattisf2)
2307 floattab[(int) SFmode][(int) TImode][0] = CODE_FOR_floattisf2;
2308#endif
2309
2310#ifdef HAVE_floatqidf2
2311 if (HAVE_floatqidf2)
2312 floattab[(int) DFmode][(int) QImode][0] = CODE_FOR_floatqidf2;
2313#endif
2314#ifdef HAVE_floathidf2
2315 if (HAVE_floathidf2)
2316 floattab[(int) DFmode][(int) HImode][0] = CODE_FOR_floathidf2;
2317#endif
2318#ifdef HAVE_floatsidf2
2319 if (HAVE_floatsidf2)
2320 floattab[(int) DFmode][(int) SImode][0] = CODE_FOR_floatsidf2;
2321#endif
2322#ifdef HAVE_floatdidf2
2323 if (HAVE_floatdidf2)
2324 floattab[(int) DFmode][(int) DImode][0] = CODE_FOR_floatdidf2;
2325#endif
2326#ifdef HAVE_floattidf2
2327 if (HAVE_floattidf2)
2328 floattab[(int) DFmode][(int) TImode][0] = CODE_FOR_floattidf2;
2329#endif
2330
2331#ifdef HAVE_floatqitf2
2332 if (HAVE_floatqitf2)
2333 floattab[(int) TFmode][(int) QImode][0] = CODE_FOR_floatqitf2;
2334#endif
2335#ifdef HAVE_floathitf2
2336 if (HAVE_floathitf2)
2337 floattab[(int) TFmode][(int) HImode][0] = CODE_FOR_floathitf2;
2338#endif
2339#ifdef HAVE_floatsitf2
2340 if (HAVE_floatsitf2)
2341 floattab[(int) TFmode][(int) SImode][0] = CODE_FOR_floatsitf2;
2342#endif
2343#ifdef HAVE_floatditf2
2344 if (HAVE_floatditf2)
2345 floattab[(int) TFmode][(int) DImode][0] = CODE_FOR_floatditf2;
2346#endif
2347#ifdef HAVE_floattitf2
2348 if (HAVE_floattitf2)
2349 floattab[(int) TFmode][(int) TImode][0] = CODE_FOR_floattitf2;
2350#endif
2351
2352#ifdef HAVE_floatunsqisf2
2353 if (HAVE_floatunsqisf2)
2354 floattab[(int) SFmode][(int) QImode][1] = CODE_FOR_floatunsqisf2;
2355#endif
2356#ifdef HAVE_floatunshisf2
2357 if (HAVE_floatunshisf2)
2358 floattab[(int) SFmode][(int) HImode][1] = CODE_FOR_floatunshisf2;
2359#endif
2360#ifdef HAVE_floatunssisf2
2361 if (HAVE_floatunssisf2)
2362 floattab[(int) SFmode][(int) SImode][1] = CODE_FOR_floatunssisf2;
2363#endif
2364#ifdef HAVE_floatunsdisf2
2365 if (HAVE_floatunsdisf2)
2366 floattab[(int) SFmode][(int) DImode][1] = CODE_FOR_floatunsdisf2;
2367#endif
2368#ifdef HAVE_floatunstisf2
2369 if (HAVE_floatunstisf2)
2370 floattab[(int) SFmode][(int) TImode][1] = CODE_FOR_floatunstisf2;
2371#endif
2372
2373#ifdef HAVE_floatunsqidf2
2374 if (HAVE_floatunsqidf2)
2375 floattab[(int) DFmode][(int) QImode][1] = CODE_FOR_floatunsqidf2;
2376#endif
2377#ifdef HAVE_floatunshidf2
2378 if (HAVE_floatunshidf2)
2379 floattab[(int) DFmode][(int) HImode][1] = CODE_FOR_floatunshidf2;
2380#endif
2381#ifdef HAVE_floatunssidf2
2382 if (HAVE_floatunssidf2)
2383 floattab[(int) DFmode][(int) SImode][1] = CODE_FOR_floatunssidf2;
2384#endif
2385#ifdef HAVE_floatunsdidf2
2386 if (HAVE_floatunsdidf2)
2387 floattab[(int) DFmode][(int) DImode][1] = CODE_FOR_floatunsdidf2;
2388#endif
2389#ifdef HAVE_floatunstidf2
2390 if (HAVE_floatunstidf2)
2391 floattab[(int) DFmode][(int) TImode][1] = CODE_FOR_floatunstidf2;
2392#endif
2393
2394#ifdef HAVE_floatunsqitf2
2395 if (HAVE_floatunsqitf2)
2396 floattab[(int) TFmode][(int) QImode][1] = CODE_FOR_floatunsqitf2;
2397#endif
2398#ifdef HAVE_floatunshitf2
2399 if (HAVE_floatunshitf2)
2400 floattab[(int) TFmode][(int) HImode][1] = CODE_FOR_floatunshitf2;
2401#endif
2402#ifdef HAVE_floatunssitf2
2403 if (HAVE_floatunssitf2)
2404 floattab[(int) TFmode][(int) SImode][1] = CODE_FOR_floatunssitf2;
2405#endif
2406#ifdef HAVE_floatunsditf2
2407 if (HAVE_floatunsditf2)
2408 floattab[(int) TFmode][(int) DImode][1] = CODE_FOR_floatunsditf2;
2409#endif
2410#ifdef HAVE_floatunstitf2
2411 if (HAVE_floatunstitf2)
2412 floattab[(int) TFmode][(int) TImode][1] = CODE_FOR_floatunstitf2;
2413#endif
2414}
2415\f
2416/* Generate code to convert FROM to floating point
34e56753 2417 and store in TO. FROM must be fixed point and not VOIDmode.
77c9c6c2
RK
2418 UNSIGNEDP nonzero means regard FROM as unsigned.
2419 Normally this is done by correcting the final value
2420 if it is negative. */
2421
2422void
2423expand_float (to, from, unsignedp)
2424 rtx to, from;
2425 int unsignedp;
2426{
2427 enum insn_code icode;
2428 register rtx target = to;
2429 enum machine_mode fmode, imode;
2430
34e56753
RS
2431 /* Crash now, because we won't be able to decide which mode to use. */
2432 if (GET_MODE (from) == VOIDmode)
2433 abort ();
2434
77c9c6c2
RK
2435 /* Look for an insn to do the conversion. Do it in the specified
2436 modes if possible; otherwise convert either input, output or both to
2437 wider mode. If the integer mode is wider than the mode of FROM,
2438 we can do the conversion signed even if the input is unsigned. */
2439
2440 for (imode = GET_MODE (from); imode != VOIDmode;
2441 imode = GET_MODE_WIDER_MODE (imode))
2442 for (fmode = GET_MODE (to); fmode != VOIDmode;
2443 fmode = GET_MODE_WIDER_MODE (fmode))
2444 {
2445 int doing_unsigned = unsignedp;
2446
2447 icode = can_float_p (fmode, imode, unsignedp);
2448 if (icode == CODE_FOR_nothing && imode != GET_MODE (from) && unsignedp)
2449 icode = can_float_p (fmode, imode, 0), doing_unsigned = 0;
2450
2451 if (icode != CODE_FOR_nothing)
2452 {
2453 to = protect_from_queue (to, 1);
2454
2455 if (imode != GET_MODE (from))
2456 from = convert_to_mode (imode, from, unsignedp);
2457 else
2458 from = protect_from_queue (from, 0);
2459
2460 if (fmode != GET_MODE (to))
2461 target = gen_reg_rtx (fmode);
2462
2463 emit_unop_insn (icode, target, from,
2464 doing_unsigned ? UNSIGNED_FLOAT : FLOAT);
2465
2466 if (target != to)
2467 convert_move (to, target, 0);
2468 return;
2469 }
2470 }
2471
2472#if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
2473
2474 /* Unsigned integer, and no way to convert directly.
2475 Convert as signed, then conditionally adjust the result. */
2476 if (unsignedp)
2477 {
2478 rtx label = gen_label_rtx ();
2479 rtx temp;
2480 REAL_VALUE_TYPE offset;
2481
2482 emit_queue ();
2483
2484 to = protect_from_queue (to, 1);
2485 from = protect_from_queue (from, 0);
2486
2487 if (flag_force_mem)
2488 from = force_not_mem (from);
2489
2490 /* If we are about to do some arithmetic to correct for an
2491 unsigned operand, do it in a pseudo-register. */
2492
2493 if (GET_CODE (to) != REG || REGNO (to) <= LAST_VIRTUAL_REGISTER)
2494 target = gen_reg_rtx (GET_MODE (to));
2495
2496 /* Convert as signed integer to floating. */
2497 expand_float (target, from, 0);
2498
2499 /* If FROM is negative (and therefore TO is negative),
2500 correct its value by 2**bitwidth. */
2501
2502 do_pending_stack_adjust ();
2503 emit_cmp_insn (from, const0_rtx, GE, 0, GET_MODE (from), 0, 0);
2504 emit_jump_insn (gen_bge (label));
2505 /* On SCO 3.2.1, ldexp rejects values outside [0.5, 1).
2506 Rather than setting up a dconst_dot_5, let's hope SCO
2507 fixes the bug. */
2508 offset = REAL_VALUE_LDEXP (dconst1, GET_MODE_BITSIZE (GET_MODE (from)));
2509 temp = expand_binop (GET_MODE (to), add_optab, target,
2510 immed_real_const_1 (offset, GET_MODE (to)),
2511 target, 0, OPTAB_LIB_WIDEN);
2512 if (temp != target)
2513 emit_move_insn (target, temp);
2514 do_pending_stack_adjust ();
2515 emit_label (label);
2516 }
2517 else
2518#endif
2519
2520 /* No hardware instruction available; call a library
2521 to convert from SImode or DImode into SFmode or DFmode. */
2522 {
6bce1b78 2523 rtx libfcn;
77c9c6c2
RK
2524 rtx insns;
2525
2526 to = protect_from_queue (to, 1);
2527
2528 if (GET_MODE_SIZE (GET_MODE (from)) < GET_MODE_SIZE (SImode))
2529 from = convert_to_mode (SImode, from, unsignedp);
2530 else
2531 from = protect_from_queue (from, 0);
2532
2533 if (flag_force_mem)
2534 from = force_not_mem (from);
2535
2536 if (GET_MODE (to) == SFmode)
2537 {
2538 if (GET_MODE (from) == SImode)
6bce1b78 2539 libfcn = floatsisf_libfunc;
77c9c6c2 2540 else if (GET_MODE (from) == DImode)
6bce1b78 2541 libfcn = floatdisf_libfunc;
77c9c6c2
RK
2542 else
2543 abort ();
2544 }
2545 else if (GET_MODE (to) == DFmode)
2546 {
2547 if (GET_MODE (from) == SImode)
6bce1b78 2548 libfcn = floatsidf_libfunc;
77c9c6c2 2549 else if (GET_MODE (from) == DImode)
6bce1b78 2550 libfcn = floatdidf_libfunc;
77c9c6c2
RK
2551 else
2552 abort ();
2553 }
2554 else
2555 abort ();
2556
2557 start_sequence ();
2558
6bce1b78 2559 emit_library_call (libfcn, 0, GET_MODE (to), 1, from, GET_MODE (from));
77c9c6c2
RK
2560 insns = get_insns ();
2561 end_sequence ();
2562
2563 emit_libcall_block (insns, target, hard_libcall_value (GET_MODE (to)),
2564 gen_rtx (FLOAT, GET_MODE (to), from));
2565 }
2566
2567 /* Copy result to requested destination
2568 if we have been computing in a temp location. */
2569
2570 if (target != to)
2571 {
2572 if (GET_MODE (target) == GET_MODE (to))
2573 emit_move_insn (to, target);
2574 else
2575 convert_move (to, target, 0);
2576 }
2577}
2578\f
2579/* expand_fix: generate code to convert FROM to fixed point
2580 and store in TO. FROM must be floating point. */
2581
2582static rtx
2583ftruncify (x)
2584 rtx x;
2585{
2586 rtx temp = gen_reg_rtx (GET_MODE (x));
2587 return expand_unop (GET_MODE (x), ftrunc_optab, x, temp, 0);
2588}
2589
2590void
2591expand_fix (to, from, unsignedp)
2592 register rtx to, from;
2593 int unsignedp;
2594{
2595 enum insn_code icode;
2596 register rtx target = to;
2597 enum machine_mode fmode, imode;
2598 int must_trunc = 0;
6bce1b78 2599 rtx libfcn = 0;
77c9c6c2
RK
2600
2601 /* We first try to find a pair of modes, one real and one integer, at
2602 least as wide as FROM and TO, respectively, in which we can open-code
2603 this conversion. If the integer mode is wider than the mode of TO,
2604 we can do the conversion either signed or unsigned. */
2605
2606 for (imode = GET_MODE (to); imode != VOIDmode;
2607 imode = GET_MODE_WIDER_MODE (imode))
2608 for (fmode = GET_MODE (from); fmode != VOIDmode;
2609 fmode = GET_MODE_WIDER_MODE (fmode))
2610 {
2611 int doing_unsigned = unsignedp;
2612
2613 icode = can_fix_p (imode, fmode, unsignedp, &must_trunc);
2614 if (icode == CODE_FOR_nothing && imode != GET_MODE (to) && unsignedp)
2615 icode = can_fix_p (imode, fmode, 0, &must_trunc), doing_unsigned = 0;
2616
2617 if (icode != CODE_FOR_nothing)
2618 {
2619 to = protect_from_queue (to, 1);
2620
2621 if (fmode != GET_MODE (from))
2622 from = convert_to_mode (fmode, from, 0);
2623 else
2624 from = protect_from_queue (from, 0);
2625
2626 if (must_trunc)
2627 from = ftruncify (from);
2628
2629 if (imode != GET_MODE (to))
2630 target = gen_reg_rtx (imode);
2631
2632 emit_unop_insn (icode, target, from,
2633 doing_unsigned ? UNSIGNED_FIX : FIX);
2634 if (target != to)
2635 convert_move (to, target, unsignedp);
2636 return;
2637 }
2638 }
2639
2640#if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
2641 /* For an unsigned conversion, there is one more way to do it.
2642 If we have a signed conversion, we generate code that compares
2643 the real value to the largest representable positive number. If if
2644 is smaller, the conversion is done normally. Otherwise, subtract
2645 one plus the highest signed number, convert, and add it back.
2646
2647 We only need to check all real modes, since we know we didn't find
2648 anything with a wider inetger mode. */
2649
2650 if (unsignedp && GET_MODE_BITSIZE (GET_MODE (to)) <= HOST_BITS_PER_INT)
2651 for (fmode = GET_MODE (from); fmode != VOIDmode;
2652 fmode = GET_MODE_WIDER_MODE (fmode))
2653 /* Make sure we won't lose significant bits doing this. */
2654 if (GET_MODE_BITSIZE (fmode) > GET_MODE_BITSIZE (GET_MODE (to))
2655 && CODE_FOR_nothing != can_fix_p (GET_MODE (to), fmode, 0,
2656 &must_trunc))
2657 {
2658 int bitsize = GET_MODE_BITSIZE (GET_MODE (to));
2659 REAL_VALUE_TYPE offset = REAL_VALUE_LDEXP (dconst1, bitsize - 1);
2660 rtx limit = immed_real_const_1 (offset, fmode);
2661 rtx lab1 = gen_label_rtx ();
2662 rtx lab2 = gen_label_rtx ();
2663 rtx insn;
2664
2665 emit_queue ();
2666 to = protect_from_queue (to, 1);
2667 from = protect_from_queue (from, 0);
2668
2669 if (flag_force_mem)
2670 from = force_not_mem (from);
2671
2672 if (fmode != GET_MODE (from))
2673 from = convert_to_mode (fmode, from, 0);
2674
2675 /* See if we need to do the subtraction. */
2676 do_pending_stack_adjust ();
2677 emit_cmp_insn (from, limit, GE, 0, GET_MODE (from), 0, 0);
2678 emit_jump_insn (gen_bge (lab1));
2679
2680 /* If not, do the signed "fix" and branch around fixup code. */
2681 expand_fix (to, from, 0);
2682 emit_jump_insn (gen_jump (lab2));
2683 emit_barrier ();
2684
2685 /* Otherwise, subtract 2**(N-1), convert to signed number,
2686 then add 2**(N-1). Do the addition using XOR since this
2687 will often generate better code. */
2688 emit_label (lab1);
2689 target = expand_binop (GET_MODE (from), sub_optab, from, limit,
2690 0, 0, OPTAB_LIB_WIDEN);
2691 expand_fix (to, target, 0);
2692 target = expand_binop (GET_MODE (to), xor_optab, to,
2693 gen_rtx (CONST_INT, VOIDmode,
2694 1 << (bitsize - 1)),
2695 to, 1, OPTAB_LIB_WIDEN);
2696
2697 if (target != to)
2698 emit_move_insn (to, target);
2699
2700 emit_label (lab2);
2701
2702 /* Make a place for a REG_NOTE and add it. */
2703 insn = emit_move_insn (to, to);
2704 REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_EQUAL,
2705 gen_rtx (UNSIGNED_FIX, GET_MODE (to),
2706 from), REG_NOTES (insn));
2707
2708 return;
2709 }
2710#endif
2711
2712 /* We can't do it with an insn, so use a library call. But first ensure
2713 that the mode of TO is at least as wide as SImode, since those are the
2714 only library calls we know about. */
2715
2716 if (GET_MODE_SIZE (GET_MODE (to)) < GET_MODE_SIZE (SImode))
2717 {
2718 target = gen_reg_rtx (SImode);
2719
2720 expand_fix (target, from, unsignedp);
2721 }
2722 else if (GET_MODE (from) == SFmode)
2723 {
2724 if (GET_MODE (to) == SImode)
6bce1b78 2725 libfcn = unsignedp ? fixunssfsi_libfunc : fixsfsi_libfunc;
77c9c6c2 2726 else if (GET_MODE (to) == DImode)
6bce1b78 2727 libfcn = unsignedp ? fixunssfdi_libfunc : fixsfdi_libfunc;
77c9c6c2
RK
2728 else
2729 abort ();
2730 }
2731 else if (GET_MODE (from) == DFmode)
2732 {
2733 if (GET_MODE (to) == SImode)
6bce1b78 2734 libfcn = unsignedp ? fixunsdfsi_libfunc : fixdfsi_libfunc;
77c9c6c2 2735 else if (GET_MODE (to) == DImode)
6bce1b78 2736 libfcn = unsignedp ? fixunsdfdi_libfunc : fixdfdi_libfunc;
77c9c6c2
RK
2737 else
2738 abort ();
2739 }
2740 else
2741 abort ();
2742
6bce1b78 2743 if (libfcn)
77c9c6c2
RK
2744 {
2745 rtx insns;
2746
2747 to = protect_from_queue (to, 1);
2748 from = protect_from_queue (from, 0);
2749
2750 if (flag_force_mem)
2751 from = force_not_mem (from);
2752
2753 start_sequence ();
2754
6bce1b78 2755 emit_library_call (libfcn, 0, GET_MODE (to), 1, from, GET_MODE (from));
77c9c6c2
RK
2756 insns = get_insns ();
2757 end_sequence ();
2758
2759 emit_libcall_block (insns, target, hard_libcall_value (GET_MODE (to)),
2760 gen_rtx (unsignedp ? FIX : UNSIGNED_FIX,
2761 GET_MODE (to), from));
2762 }
2763
2764 if (GET_MODE (to) == GET_MODE (target))
2765 emit_move_insn (to, target);
2766 else
2767 convert_move (to, target, 0);
2768}
2769\f
2770static optab
2771init_optab (code)
2772 enum rtx_code code;
2773{
2774 int i;
2775 optab op = (optab) xmalloc (sizeof (struct optab));
2776 op->code = code;
2777 for (i = 0; i < NUM_MACHINE_MODES; i++)
2778 {
2779 op->handlers[i].insn_code = CODE_FOR_nothing;
2780 op->handlers[i].libfunc = 0;
2781 }
2782 return op;
2783}
2784
2785/* Call this once to initialize the contents of the optabs
2786 appropriately for the current target machine. */
2787
2788void
2789init_optabs ()
2790{
2791 int i;
2792
2793 init_fixtab ();
2794 init_floattab ();
2795 init_extends ();
2796
2797 add_optab = init_optab (PLUS);
2798 sub_optab = init_optab (MINUS);
2799 smul_optab = init_optab (MULT);
2800 smul_widen_optab = init_optab (UNKNOWN);
2801 umul_widen_optab = init_optab (UNKNOWN);
2802 sdiv_optab = init_optab (DIV);
2803 sdivmod_optab = init_optab (UNKNOWN);
2804 udiv_optab = init_optab (UDIV);
2805 udivmod_optab = init_optab (UNKNOWN);
2806 smod_optab = init_optab (MOD);
2807 umod_optab = init_optab (UMOD);
2808 flodiv_optab = init_optab (DIV);
2809 ftrunc_optab = init_optab (UNKNOWN);
2810 and_optab = init_optab (AND);
2811 ior_optab = init_optab (IOR);
2812 xor_optab = init_optab (XOR);
2813 ashl_optab = init_optab (ASHIFT);
2814 ashr_optab = init_optab (ASHIFTRT);
2815 lshl_optab = init_optab (LSHIFT);
2816 lshr_optab = init_optab (LSHIFTRT);
2817 rotl_optab = init_optab (ROTATE);
2818 rotr_optab = init_optab (ROTATERT);
2819 smin_optab = init_optab (SMIN);
2820 smax_optab = init_optab (SMAX);
2821 umin_optab = init_optab (UMIN);
2822 umax_optab = init_optab (UMAX);
2823 mov_optab = init_optab (UNKNOWN);
2824 movstrict_optab = init_optab (UNKNOWN);
2825 cmp_optab = init_optab (UNKNOWN);
2826 ucmp_optab = init_optab (UNKNOWN);
2827 tst_optab = init_optab (UNKNOWN);
2828 neg_optab = init_optab (NEG);
2829 abs_optab = init_optab (ABS);
2830 one_cmpl_optab = init_optab (NOT);
2831 ffs_optab = init_optab (FFS);
2832
2833#ifdef HAVE_addqi3
2834 if (HAVE_addqi3)
2835 add_optab->handlers[(int) QImode].insn_code = CODE_FOR_addqi3;
2836#endif
2837#ifdef HAVE_addhi3
2838 if (HAVE_addhi3)
2839 add_optab->handlers[(int) HImode].insn_code = CODE_FOR_addhi3;
2840#endif
2841#ifdef HAVE_addpsi3
2842 if (HAVE_addpsi3)
2843 add_optab->handlers[(int) PSImode].insn_code = CODE_FOR_addpsi3;
2844#endif
2845#ifdef HAVE_addsi3
2846 if (HAVE_addsi3)
2847 add_optab->handlers[(int) SImode].insn_code = CODE_FOR_addsi3;
2848#endif
2849#ifdef HAVE_adddi3
2850 if (HAVE_adddi3)
2851 add_optab->handlers[(int) DImode].insn_code = CODE_FOR_adddi3;
2852#endif
2853#ifdef HAVE_addti3
2854 if (HAVE_addti3)
2855 add_optab->handlers[(int) TImode].insn_code = CODE_FOR_addti3;
2856#endif
2857#ifdef HAVE_addsf3
2858 if (HAVE_addsf3)
2859 add_optab->handlers[(int) SFmode].insn_code = CODE_FOR_addsf3;
2860#endif
2861#ifdef HAVE_adddf3
2862 if (HAVE_adddf3)
2863 add_optab->handlers[(int) DFmode].insn_code = CODE_FOR_adddf3;
2864#endif
2865#ifdef HAVE_addtf3
2866 if (HAVE_addtf3)
2867 add_optab->handlers[(int) TFmode].insn_code = CODE_FOR_addtf3;
2868#endif
2869 add_optab->handlers[(int) SFmode].libfunc
2870 = gen_rtx (SYMBOL_REF, Pmode, "__addsf3");
2871 add_optab->handlers[(int) DFmode].libfunc
2872 = gen_rtx (SYMBOL_REF, Pmode, "__adddf3");
2873
2874#ifdef HAVE_subqi3
2875 if (HAVE_subqi3)
2876 sub_optab->handlers[(int) QImode].insn_code = CODE_FOR_subqi3;
2877#endif
2878#ifdef HAVE_subhi3
2879 if (HAVE_subhi3)
2880 sub_optab->handlers[(int) HImode].insn_code = CODE_FOR_subhi3;
2881#endif
2882#ifdef HAVE_subpsi3
2883 if (HAVE_subpsi3)
2884 sub_optab->handlers[(int) PSImode].insn_code = CODE_FOR_subpsi3;
2885#endif
2886#ifdef HAVE_subsi3
2887 if (HAVE_subsi3)
2888 sub_optab->handlers[(int) SImode].insn_code = CODE_FOR_subsi3;
2889#endif
2890#ifdef HAVE_subdi3
2891 if (HAVE_subdi3)
2892 sub_optab->handlers[(int) DImode].insn_code = CODE_FOR_subdi3;
2893#endif
2894#ifdef HAVE_subti3
2895 if (HAVE_subti3)
2896 sub_optab->handlers[(int) Imode].insn_code = CODE_FOR_subti3;
2897#endif
2898#ifdef HAVE_subsf3
2899 if (HAVE_subsf3)
2900 sub_optab->handlers[(int) SFmode].insn_code = CODE_FOR_subsf3;
2901#endif
2902#ifdef HAVE_subdf3
2903 if (HAVE_subdf3)
2904 sub_optab->handlers[(int) DFmode].insn_code = CODE_FOR_subdf3;
2905#endif
2906#ifdef HAVE_subtf3
2907 if (HAVE_subtf3)
2908 sub_optab->handlers[(int) TFmode].insn_code = CODE_FOR_subtf3;
2909#endif
2910 sub_optab->handlers[(int) SFmode].libfunc
2911 = gen_rtx (SYMBOL_REF, Pmode, "__subsf3");
2912 sub_optab->handlers[(int) DFmode].libfunc
2913 = gen_rtx (SYMBOL_REF, Pmode, "__subdf3");
2914
2915#ifdef HAVE_mulqi3
2916 if (HAVE_mulqi3)
2917 smul_optab->handlers[(int) QImode].insn_code = CODE_FOR_mulqi3;
2918#endif
2919#ifdef HAVE_mulhi3
2920 if (HAVE_mulhi3)
2921 smul_optab->handlers[(int) HImode].insn_code = CODE_FOR_mulhi3;
2922#endif
2923#ifdef HAVE_mulpsi3
2924 if (HAVE_mulpsi3)
2925 smul_optab->handlers[(int) PSImode].insn_code = CODE_FOR_mulpsi3;
2926#endif
2927#ifdef HAVE_mulsi3
2928 if (HAVE_mulsi3)
2929 smul_optab->handlers[(int) SImode].insn_code = CODE_FOR_mulsi3;
2930#endif
2931#ifdef HAVE_muldi3
2932 if (HAVE_muldi3)
2933 smul_optab->handlers[(int) DImode].insn_code = CODE_FOR_muldi3;
2934#endif
2935#ifdef HAVE_multi3
2936 if (HAVE_multi3)
2937 smul_optab->handlers[(int) TImode].insn_code = CODE_FOR_multi3;
2938#endif
2939#ifdef HAVE_mulsf3
2940 if (HAVE_mulsf3)
2941 smul_optab->handlers[(int) SFmode].insn_code = CODE_FOR_mulsf3;
2942#endif
2943#ifdef HAVE_muldf3
2944 if (HAVE_muldf3)
2945 smul_optab->handlers[(int) DFmode].insn_code = CODE_FOR_muldf3;
2946#endif
2947#ifdef HAVE_multf3
2948 if (HAVE_multf3)
2949 smul_optab->handlers[(int) TFmode].insn_code = CODE_FOR_multf3;
2950#endif
2951
2952#ifdef MULSI3_LIBCALL
2953 smul_optab->handlers[(int) SImode].libfunc
2954 = gen_rtx (SYMBOL_REF, Pmode, MULSI3_LIBCALL);
2955#else
2956 smul_optab->handlers[(int) SImode].libfunc
2957 = gen_rtx (SYMBOL_REF, Pmode, "__mulsi3");
2958#endif
2959#ifdef MULDI3_LIBCALL
2960 smul_optab->handlers[(int) DImode].libfunc
2961 = gen_rtx (SYMBOL_REF, Pmode, MULDI3_LIBCALL);
2962#else
2963 smul_optab->handlers[(int) DImode].libfunc
2964 = gen_rtx (SYMBOL_REF, Pmode, "__muldi3");
2965#endif
2966 smul_optab->handlers[(int) SFmode].libfunc
2967 = gen_rtx (SYMBOL_REF, Pmode, "__mulsf3");
2968 smul_optab->handlers[(int) DFmode].libfunc
2969 = gen_rtx (SYMBOL_REF, Pmode, "__muldf3");
2970
2971#ifdef HAVE_mulqihi3
2972 if (HAVE_mulqihi3)
2973 smul_widen_optab->handlers[(int) HImode].insn_code = CODE_FOR_mulqihi3;
2974#endif
2975#ifdef HAVE_mulhisi3
2976 if (HAVE_mulhisi3)
2977 smul_widen_optab->handlers[(int) SImode].insn_code = CODE_FOR_mulhisi3;
2978#endif
2979#ifdef HAVE_mulsidi3
2980 if (HAVE_mulsidi3)
2981 smul_widen_optab->handlers[(int) DImode].insn_code = CODE_FOR_mulsidi3;
2982#endif
2983#ifdef HAVE_mulditi3
2984 if (HAVE_mulditi3)
2985 smul_widen_optab->handlers[(int) TImode].insn_code = CODE_FOR_mulditi3;
2986#endif
2987
2988#ifdef HAVE_umulqihi3
2989 if (HAVE_umulqihi3)
2990 umul_widen_optab->handlers[(int) HImode].insn_code = CODE_FOR_umulqihi3;
2991#endif
2992#ifdef HAVE_umulhisi3
2993 if (HAVE_umulhisi3)
2994 umul_widen_optab->handlers[(int) SImode].insn_code = CODE_FOR_umulhisi3;
2995#endif
2996#ifdef HAVE_umulsidi3
2997 if (HAVE_umulsidi3)
2998 umul_widen_optab->handlers[(int) DImode].insn_code = CODE_FOR_umulsidi3;
2999#endif
3000#ifdef HAVE_umulditi3
3001 if (HAVE_umulditi3)
3002 umul_widen_optab->handlers[(int) TImode].insn_code = CODE_FOR_umulditi3;
3003#endif
3004
3005#ifdef HAVE_divqi3
3006 if (HAVE_divqi3)
3007 sdiv_optab->handlers[(int) QImode].insn_code = CODE_FOR_divqi3;
3008#endif
3009#ifdef HAVE_divhi3
3010 if (HAVE_divhi3)
3011 sdiv_optab->handlers[(int) HImode].insn_code = CODE_FOR_divhi3;
3012#endif
3013#ifdef HAVE_divpsi3
3014 if (HAVE_divpsi3)
3015 sdiv_optab->handlers[(int) PSImode].insn_code = CODE_FOR_divpsi3;
3016#endif
3017#ifdef HAVE_divsi3
3018 if (HAVE_divsi3)
3019 sdiv_optab->handlers[(int) SImode].insn_code = CODE_FOR_divsi3;
3020#endif
3021#ifdef HAVE_divdi3
3022 if (HAVE_divdi3)
3023 sdiv_optab->handlers[(int) DImode].insn_code = CODE_FOR_divdi3;
3024#endif
3025#ifdef HAVE_divti3
3026 if (HAVE_divti3)
3027 sdiv_optab->handlers[(int) TImode].insn_code = CODE_FOR_divti3;
3028#endif
3029
3030#ifdef DIVSI3_LIBCALL
3031 sdiv_optab->handlers[(int) SImode].libfunc
3032 = gen_rtx (SYMBOL_REF, Pmode, DIVSI3_LIBCALL);
3033#else
3034 sdiv_optab->handlers[(int) SImode].libfunc
3035 = gen_rtx (SYMBOL_REF, Pmode, "__divsi3");
3036#endif
3037#ifdef DIVDI3_LIBCALL
3038 sdiv_optab->handlers[(int) DImode].libfunc
3039 = gen_rtx (SYMBOL_REF, Pmode, DIVDI3_LIBCALL);
3040#else
3041 sdiv_optab->handlers[(int) DImode].libfunc
3042 = gen_rtx (SYMBOL_REF, Pmode, "__divdi3");
3043#endif
3044
3045#ifdef HAVE_udivqi3
3046 if (HAVE_udivqi3)
3047 udiv_optab->handlers[(int) QImode].insn_code = CODE_FOR_udivqi3;
3048#endif
3049#ifdef HAVE_udivhi3
3050 if (HAVE_udivhi3)
3051 udiv_optab->handlers[(int) HImode].insn_code = CODE_FOR_udivhi3;
3052#endif
3053#ifdef HAVE_udivpsi3
3054 if (HAVE_udivpsi3)
3055 udiv_optab->handlers[(int) PSImode].insn_code = CODE_FOR_udivpsi3;
3056#endif
3057#ifdef HAVE_udivsi3
3058 if (HAVE_udivsi3)
3059 udiv_optab->handlers[(int) SImode].insn_code = CODE_FOR_udivsi3;
3060#endif
3061#ifdef HAVE_udivdi3
3062 if (HAVE_udivdi3)
3063 udiv_optab->handlers[(int) DImode].insn_code = CODE_FOR_udivdi3;
3064#endif
3065#ifdef HAVE_udivti3
3066 if (HAVE_udivti3)
3067 udiv_optab->handlers[(int) TImode].insn_code = CODE_FOR_udivti3;
3068#endif
3069
3070#ifdef UDIVSI3_LIBCALL
3071 udiv_optab->handlers[(int) SImode].libfunc
3072 = gen_rtx (SYMBOL_REF, Pmode, UDIVSI3_LIBCALL);
3073#else
3074 udiv_optab->handlers[(int) SImode].libfunc
3075 = gen_rtx (SYMBOL_REF, Pmode, "__udivsi3");
3076#endif
3077#ifdef UDIVDI3_LIBCALL
3078 udiv_optab->handlers[(int) DImode].libfunc
3079 = gen_rtx (SYMBOL_REF, Pmode, UDIVDI3_LIBCALL);
3080#else
3081 udiv_optab->handlers[(int) DImode].libfunc
3082 = gen_rtx (SYMBOL_REF, Pmode, "__udivdi3");
3083#endif
3084
3085#ifdef HAVE_divmodqi4
3086 if (HAVE_divmodqi4)
3087 sdivmod_optab->handlers[(int) QImode].insn_code = CODE_FOR_divmodqi4;
3088#endif
3089#ifdef HAVE_divmodhi4
3090 if (HAVE_divmodhi4)
3091 sdivmod_optab->handlers[(int) HImode].insn_code = CODE_FOR_divmodhi4;
3092#endif
3093#ifdef HAVE_divmodsi4
3094 if (HAVE_divmodsi4)
3095 sdivmod_optab->handlers[(int) SImode].insn_code = CODE_FOR_divmodsi4;
3096#endif
3097#ifdef HAVE_divmoddi4
3098 if (HAVE_divmoddi4)
3099 sdivmod_optab->handlers[(int) DImode].insn_code = CODE_FOR_divmoddi4;
3100#endif
3101#ifdef HAVE_divmodti4
3102 if (HAVE_divmodti4)
3103 sdivmod_optab->handlers[(int) TImode].insn_code = CODE_FOR_divmodti4;
3104#endif
3105
3106#ifdef HAVE_udivmodqi4
3107 if (HAVE_udivmodqi4)
3108 udivmod_optab->handlers[(int) QImode].insn_code = CODE_FOR_udivmodqi4;
3109#endif
3110#ifdef HAVE_udivmodhi4
3111 if (HAVE_udivmodhi4)
3112 udivmod_optab->handlers[(int) HImode].insn_code = CODE_FOR_udivmodhi4;
3113#endif
3114#ifdef HAVE_udivmodsi4
3115 if (HAVE_udivmodsi4)
3116 udivmod_optab->handlers[(int) SImode].insn_code = CODE_FOR_udivmodsi4;
3117#endif
3118#ifdef HAVE_udivmoddi4
3119 if (HAVE_udivmoddi4)
3120 udivmod_optab->handlers[(int) DImode].insn_code = CODE_FOR_udivmoddi4;
3121#endif
3122#ifdef HAVE_udivmodti4
3123 if (HAVE_udivmodti4)
3124 udivmod_optab->handlers[(int) TImode].insn_code = CODE_FOR_udivmodti4;
3125#endif
3126
3127#ifdef HAVE_modqi3
3128 if (HAVE_modqi3)
3129 smod_optab->handlers[(int) QImode].insn_code = CODE_FOR_modqi3;
3130#endif
3131#ifdef HAVE_modhi3
3132 if (HAVE_modhi3)
3133 smod_optab->handlers[(int) HImode].insn_code = CODE_FOR_modhi3;
3134#endif
3135#ifdef HAVE_modpsi3
3136 if (HAVE_modpsi3)
3137 smod_optab->handlers[(int) PSImode].insn_code = CODE_FOR_modpsi3;
3138#endif
3139#ifdef HAVE_modsi3
3140 if (HAVE_modsi3)
3141 smod_optab->handlers[(int) SImode].insn_code = CODE_FOR_modsi3;
3142#endif
3143#ifdef HAVE_moddi3
3144 if (HAVE_moddi3)
3145 smod_optab->handlers[(int) DImode].insn_code = CODE_FOR_moddi3;
3146#endif
3147#ifdef HAVE_modti3
3148 if (HAVE_modti3)
3149 smod_optab->handlers[(int) TImode].insn_code = CODE_FOR_modti3;
3150#endif
3151
3152#ifdef MODSI3_LIBCALL
3153 smod_optab->handlers[(int) SImode].libfunc
3154 = gen_rtx (SYMBOL_REF, Pmode, MODSI3_LIBCALL);
3155#else
3156 smod_optab->handlers[(int) SImode].libfunc
3157 = gen_rtx (SYMBOL_REF, Pmode, "__modsi3");
3158#endif
3159#ifdef MODDI3_LIBCALL
3160 smod_optab->handlers[(int) DImode].libfunc
3161 = gen_rtx (SYMBOL_REF, Pmode, MODDI3_LIBCALL);
3162#else
3163 smod_optab->handlers[(int) DImode].libfunc
3164 = gen_rtx (SYMBOL_REF, Pmode, "__moddi3");
3165#endif
3166
3167#ifdef HAVE_umodqi3
3168 if (HAVE_umodqi3)
3169 umod_optab->handlers[(int) QImode].insn_code = CODE_FOR_umodqi3;
3170#endif
3171#ifdef HAVE_umodhi3
3172 if (HAVE_umodhi3)
3173 umod_optab->handlers[(int) HImode].insn_code = CODE_FOR_umodhi3;
3174#endif
3175#ifdef HAVE_umodpsi3
3176 if (HAVE_umodpsi3)
3177 umod_optab->handlers[(int) PSImode].insn_code = CODE_FOR_umodpsi3;
3178#endif
3179#ifdef HAVE_umodsi3
3180 if (HAVE_umodsi3)
3181 umod_optab->handlers[(int) SImode].insn_code = CODE_FOR_umodsi3;
3182#endif
3183#ifdef HAVE_umoddi3
3184 if (HAVE_umoddi3)
3185 umod_optab->handlers[(int) DImode].insn_code = CODE_FOR_umoddi3;
3186#endif
3187#ifdef HAVE_umodti3
3188 if (HAVE_umodti3)
3189 umod_optab->handlers[(int) TImode].insn_code = CODE_FOR_umodti3;
3190#endif
3191
3192#ifdef UMODSI3_LIBCALL
3193 umod_optab->handlers[(int) SImode].libfunc
3194 = gen_rtx (SYMBOL_REF, Pmode, UMODSI3_LIBCALL);
3195#else
3196 umod_optab->handlers[(int) SImode].libfunc
3197 = gen_rtx (SYMBOL_REF, Pmode, "__umodsi3");
3198#endif
3199#ifdef UMODDI3_LIBCALL
3200 umod_optab->handlers[(int) DImode].libfunc
3201 = gen_rtx (SYMBOL_REF, Pmode, UMODDI3_LIBCALL);
3202#else
3203 umod_optab->handlers[(int) DImode].libfunc
3204 = gen_rtx (SYMBOL_REF, Pmode, "__umoddi3");
3205#endif
3206
3207#ifdef HAVE_divsf3
3208 if (HAVE_divsf3)
3209 flodiv_optab->handlers[(int) SFmode].insn_code = CODE_FOR_divsf3;
3210#endif
3211#ifdef HAVE_divdf3
3212 if (HAVE_divdf3)
3213 flodiv_optab->handlers[(int) DFmode].insn_code = CODE_FOR_divdf3;
3214#endif
3215#ifdef HAVE_divtf3
3216 if (HAVE_divtf3)
3217 flodiv_optab->handlers[(int) TFmode].insn_code = CODE_FOR_divtf3;
3218#endif
3219 flodiv_optab->handlers[(int) SFmode].libfunc
3220 = gen_rtx (SYMBOL_REF, Pmode, "__divsf3");
3221 flodiv_optab->handlers[(int) DFmode].libfunc
3222 = gen_rtx (SYMBOL_REF, Pmode, "__divdf3");
3223
3224#ifdef HAVE_ftruncsf2
3225 if (HAVE_ftruncsf2)
3226 ftrunc_optab->handlers[(int) SFmode].insn_code = CODE_FOR_ftruncsf2;
3227#endif
3228#ifdef HAVE_ftruncdf2
3229 if (HAVE_ftruncdf2)
3230 ftrunc_optab->handlers[(int) DFmode].insn_code = CODE_FOR_ftruncdf2;
3231#endif
3232#ifdef HAVE_ftrunctf2
3233 if (HAVE_ftrunctf2)
3234 ftrunc_optab->handlers[(int) TFmode].insn_code = CODE_FOR_ftrunctf2;
3235#endif
3236
3237#ifdef HAVE_andqi3
3238 if (HAVE_andqi3)
3239 and_optab->handlers[(int) QImode].insn_code = CODE_FOR_andqi3;
3240#endif
3241#ifdef HAVE_andhi3
3242 if (HAVE_andhi3)
3243 and_optab->handlers[(int) HImode].insn_code = CODE_FOR_andhi3;
3244#endif
3245#ifdef HAVE_andpsi3
3246 if (HAVE_andpsi3)
3247 and_optab->handlers[(int) PSImode].insn_code = CODE_FOR_andpsi3;
3248#endif
3249#ifdef HAVE_andsi3
3250 if (HAVE_andsi3)
3251 and_optab->handlers[(int) SImode].insn_code = CODE_FOR_andsi3;
3252#endif
3253#ifdef HAVE_anddi3
3254 if (HAVE_anddi3)
3255 and_optab->handlers[(int) DImode].insn_code = CODE_FOR_anddi3;
3256#endif
3257#ifdef HAVE_andti3
3258 if (HAVE_andti3)
3259 and_optab->handlers[(int) TImode].insn_code = CODE_FOR_andti3;
3260#endif
3261
3262#ifdef HAVE_iorqi3
3263 if (HAVE_iorqi3)
3264 ior_optab->handlers[(int) QImode].insn_code = CODE_FOR_iorqi3;
3265#endif
3266#ifdef HAVE_iorhi3
3267 if (HAVE_iorhi3)
3268 ior_optab->handlers[(int) HImode].insn_code = CODE_FOR_iorhi3;
3269#endif
3270#ifdef HAVE_iorpsi3
3271 if (HAVE_iorpsi3)
3272 ior_optab->handlers[(int) PSImode].insn_code = CODE_FOR_iorpsi3;
3273#endif
3274#ifdef HAVE_iorsi3
3275 if (HAVE_iorsi3)
3276 ior_optab->handlers[(int) SImode].insn_code = CODE_FOR_iorsi3;
3277#endif
3278#ifdef HAVE_iordi3
3279 if (HAVE_iordi3)
3280 ior_optab->handlers[(int) DImode].insn_code = CODE_FOR_iordi3;
3281#endif
3282#ifdef HAVE_iorti3
3283 if (HAVE_iorti3)
3284 ior_optab->handlers[(int) TImode].insn_code = CODE_FOR_iorti3;
3285#endif
3286
3287#ifdef HAVE_xorqi3
3288 if (HAVE_xorqi3)
3289 xor_optab->handlers[(int) QImode].insn_code = CODE_FOR_xorqi3;
3290#endif
3291#ifdef HAVE_xorhi3
3292 if (HAVE_xorhi3)
3293 xor_optab->handlers[(int) HImode].insn_code = CODE_FOR_xorhi3;
3294#endif
3295#ifdef HAVE_xorpsi3
3296 if (HAVE_xorpsi3)
3297 xor_optab->handlers[(int) PSImode].insn_code = CODE_FOR_xorpsi3;
3298#endif
3299#ifdef HAVE_xorsi3
3300 if (HAVE_xorsi3)
3301 xor_optab->handlers[(int) SImode].insn_code = CODE_FOR_xorsi3;
3302#endif
3303#ifdef HAVE_xordi3
3304 if (HAVE_xordi3)
3305 xor_optab->handlers[(int) DImode].insn_code = CODE_FOR_xordi3;
3306#endif
3307#ifdef HAVE_xorti3
3308 if (HAVE_xorti3)
3309 xor_optab->handlers[(int) TImode].insn_code = CODE_FOR_xorti3;
3310#endif
3311
3312#ifdef HAVE_ashlqi3
3313 if (HAVE_ashlqi3)
3314 ashl_optab->handlers[(int) QImode].insn_code = CODE_FOR_ashlqi3;
3315#endif
3316#ifdef HAVE_ashlhi3
3317 if (HAVE_ashlhi3)
3318 ashl_optab->handlers[(int) HImode].insn_code = CODE_FOR_ashlhi3;
3319#endif
3320#ifdef HAVE_ashlpsi3
3321 if (HAVE_ashlpsi3)
3322 ashl_optab->handlers[(int) PSImode].insn_code = CODE_FOR_ashlpsi3;
3323#endif
3324#ifdef HAVE_ashlsi3
3325 if (HAVE_ashlsi3)
3326 ashl_optab->handlers[(int) SImode].insn_code = CODE_FOR_ashlsi3;
3327#endif
3328#ifdef HAVE_ashldi3
3329 if (HAVE_ashldi3)
3330 ashl_optab->handlers[(int) DImode].insn_code = CODE_FOR_ashldi3;
3331#endif
3332#ifdef HAVE_ashlti3
3333 if (HAVE_ashlti3)
3334 ashl_optab->handlers[(int) TImode].insn_code = CODE_FOR_ashlti3;
3335#endif
3336 ashl_optab->handlers[(int) SImode].libfunc
3337 = gen_rtx (SYMBOL_REF, Pmode, "__ashlsi3");
3338 ashl_optab->handlers[(int) DImode].libfunc
3339 = gen_rtx (SYMBOL_REF, Pmode, "__ashldi3");
3340
3341#ifdef HAVE_ashrqi3
3342 if (HAVE_ashrqi3)
3343 ashr_optab->handlers[(int) QImode].insn_code = CODE_FOR_ashrqi3;
3344#endif
3345#ifdef HAVE_ashrhi3
3346 if (HAVE_ashrhi3)
3347 ashr_optab->handlers[(int) HImode].insn_code = CODE_FOR_ashrhi3;
3348#endif
3349#ifdef HAVE_ashrpsi3
3350 if (HAVE_ashrpsi3)
3351 ashr_optab->handlers[(int) PSImode].insn_code = CODE_FOR_ashrpsi3;
3352#endif
3353#ifdef HAVE_ashrsi3
3354 if (HAVE_ashrsi3)
3355 ashr_optab->handlers[(int) SImode].insn_code = CODE_FOR_ashrsi3;
3356#endif
3357#ifdef HAVE_ashrdi3
3358 if (HAVE_ashrdi3)
3359 ashr_optab->handlers[(int) DImode].insn_code = CODE_FOR_ashrdi3;
3360#endif
3361#ifdef HAVE_ashrti3
3362 if (HAVE_ashrti3)
3363 ashr_optab->handlers[(int) TImode].insn_code = CODE_FOR_ashrti3;
3364#endif
3365 ashr_optab->handlers[(int) SImode].libfunc
3366 = gen_rtx (SYMBOL_REF, Pmode, "__ashrsi3");
3367 ashr_optab->handlers[(int) DImode].libfunc
3368 = gen_rtx (SYMBOL_REF, Pmode, "__ashrdi3");
3369
3370#ifdef HAVE_lshlqi3
3371 if (HAVE_lshlqi3)
3372 lshl_optab->handlers[(int) QImode].insn_code = CODE_FOR_lshlqi3;
3373#endif
3374#ifdef HAVE_lshlhi3
3375 if (HAVE_lshlhi3)
3376 lshl_optab->handlers[(int) HImode].insn_code = CODE_FOR_lshlhi3;
3377#endif
3378#ifdef HAVE_lshlpsi3
3379 if (HAVE_lshlpsi3)
3380 lshl_optab->handlers[(int) PSImode].insn_code = CODE_FOR_lshlpsi3;
3381#endif
3382#ifdef HAVE_lshlsi3
3383 if (HAVE_lshlsi3)
3384 lshl_optab->handlers[(int) SImode].insn_code = CODE_FOR_lshlsi3;
3385#endif
3386#ifdef HAVE_lshldi3
3387 if (HAVE_lshldi3)
3388 lshl_optab->handlers[(int) DImode].insn_code = CODE_FOR_lshldi3;
3389#endif
3390#ifdef HAVE_lshlti3
3391 if (HAVE_lshlti3)
3392 lshl_optab->handlers[(int) TImode].insn_code = CODE_FOR_lshlti3;
3393#endif
3394 lshl_optab->handlers[(int) SImode].libfunc
3395 = gen_rtx (SYMBOL_REF, Pmode, "__lshlsi3");
3396 lshl_optab->handlers[(int) DImode].libfunc
3397 = gen_rtx (SYMBOL_REF, Pmode, "__lshldi3");
3398
3399#ifdef HAVE_lshrqi3
3400 if (HAVE_lshrqi3)
3401 lshr_optab->handlers[(int) QImode].insn_code = CODE_FOR_lshrqi3;
3402#endif
3403#ifdef HAVE_lshrhi3
3404 if (HAVE_lshrhi3)
3405 lshr_optab->handlers[(int) HImode].insn_code = CODE_FOR_lshrhi3;
3406#endif
3407#ifdef HAVE_lshrpsi3
3408 if (HAVE_lshrpsi3)
3409 lshr_optab->handlers[(int) PSImode].insn_code = CODE_FOR_lshrpsi3;
3410#endif
3411#ifdef HAVE_lshrsi3
3412 if (HAVE_lshrsi3)
3413 lshr_optab->handlers[(int) SImode].insn_code = CODE_FOR_lshrsi3;
3414#endif
3415#ifdef HAVE_lshrdi3
3416 if (HAVE_lshrdi3)
3417 lshr_optab->handlers[(int) DImode].insn_code = CODE_FOR_lshrdi3;
3418#endif
3419#ifdef HAVE_lshrti3
3420 if (HAVE_lshrti3)
3421 lshr_optab->handlers[(int) TImode].insn_code = CODE_FOR_lshrti3;
3422#endif
3423 lshr_optab->handlers[(int) SImode].libfunc
3424 = gen_rtx (SYMBOL_REF, Pmode, "__lshrsi3");
3425 lshr_optab->handlers[(int) DImode].libfunc
3426 = gen_rtx (SYMBOL_REF, Pmode, "__lshrdi3");
3427
3428#ifdef HAVE_rotlqi3
3429 if (HAVE_rotlqi3)
3430 rotl_optab->handlers[(int) QImode].insn_code = CODE_FOR_rotlqi3;
3431#endif
3432#ifdef HAVE_rotlhi3
3433 if (HAVE_rotlhi3)
3434 rotl_optab->handlers[(int) HImode].insn_code = CODE_FOR_rotlhi3;
3435#endif
3436#ifdef HAVE_rotlpsi3
3437 if (HAVE_rotlpsi3)
3438 rotl_optab->handlers[(int) PSImode].insn_code = CODE_FOR_rotlpsi3;
3439#endif
3440#ifdef HAVE_rotlsi3
3441 if (HAVE_rotlsi3)
3442 rotl_optab->handlers[(int) SImode].insn_code = CODE_FOR_rotlsi3;
3443#endif
3444#ifdef HAVE_rotldi3
3445 if (HAVE_rotldi3)
3446 rotl_optab->handlers[(int) DImode].insn_code = CODE_FOR_rotldi3;
3447#endif
3448#ifdef HAVE_rotlti3
3449 if (HAVE_rotlti3)
3450 rotl_optab->handlers[(int) TImode].insn_code = CODE_FOR_rotlti3;
3451#endif
3452 rotl_optab->handlers[(int) SImode].libfunc
3453 = gen_rtx (SYMBOL_REF, Pmode, "__rotlsi3");
3454 rotl_optab->handlers[(int) DImode].libfunc
3455 = gen_rtx (SYMBOL_REF, Pmode, "__rotldi3");
3456
3457#ifdef HAVE_rotrqi3
3458 if (HAVE_rotrqi3)
3459 rotr_optab->handlers[(int) QImode].insn_code = CODE_FOR_rotrqi3;
3460#endif
3461#ifdef HAVE_rotrhi3
3462 if (HAVE_rotrhi3)
3463 rotr_optab->handlers[(int) HImode].insn_code = CODE_FOR_rotrhi3;
3464#endif
3465#ifdef HAVE_rotrpsi3
3466 if (HAVE_rotrpsi3)
3467 rotr_optab->handlers[(int) PSImode].insn_code = CODE_FOR_rotrpsi3;
3468#endif
3469#ifdef HAVE_rotrsi3
3470 if (HAVE_rotrsi3)
3471 rotr_optab->handlers[(int) SImode].insn_code = CODE_FOR_rotrsi3;
3472#endif
3473#ifdef HAVE_rotrdi3
3474 if (HAVE_rotrdi3)
3475 rotr_optab->handlers[(int) DImode].insn_code = CODE_FOR_rotrdi3;
3476#endif
3477#ifdef HAVE_rotrti3
3478 if (HAVE_rotrti3)
3479 rotr_optab->handlers[(int) TImode].insn_code = CODE_FOR_rotrti3;
3480#endif
3481 rotr_optab->handlers[(int) SImode].libfunc
3482 = gen_rtx (SYMBOL_REF, Pmode, "__rotrsi3");
3483 rotr_optab->handlers[(int) DImode].libfunc
3484 = gen_rtx (SYMBOL_REF, Pmode, "__rotrdi3");
3485
3486#ifdef HAVE_sminqi3
3487 if (HAVE_sminqi3)
3488 smin_optab->handlers[(int) QImode].insn_code = CODE_FOR_sminqi3;
3489#endif
3490#ifdef HAVE_sminhi3
3491 if (HAVE_sminhi3)
3492 smin_optab->handlers[(int) HImode].insn_code = CODE_FOR_sminhi3;
3493#endif
3494#ifdef HAVE_sminsi3
3495 if (HAVE_sminsi3)
3496 smin_optab->handlers[(int) SImode].insn_code = CODE_FOR_sminsi3;
3497#endif
3498#ifdef HAVE_smindi3
3499 if (HAVE_smindi3)
3500 smin_optab->handlers[(int) DImode].insn_code = CODE_FOR_smindi3;
3501#endif
3502#ifdef HAVE_sminti3
3503 if (HAVE_sminti3)
3504 smin_optab->handlers[(int) TImode].insn_code = CODE_FOR_sminti3;
3505#endif
3506#ifdef HAVE_sminsf3
3507 if (HAVE_sminsf3)
3508 smin_optab->handlers[(int) SFmode].insn_code = CODE_FOR_sminsf3;
3509#endif
3510#ifdef HAVE_smindf3
3511 if (HAVE_smindf3)
3512 smin_optab->handlers[(int) DFmode].insn_code = CODE_FOR_smindf3;
3513#endif
3514#ifdef HAVE_smintf3
3515 if (HAVE_smintf3)
3516 smin_optab->handlers[(int) TFmode].insn_code = CODE_FOR_smintf3;
3517#endif
3518
3519#ifdef HAVE_smaxqi3
3520 if (HAVE_smaxqi3)
3521 smax_optab->handlers[(int) QImode].insn_code = CODE_FOR_smaxqi3;
3522#endif
3523#ifdef HAVE_smaxhi3
3524 if (HAVE_smaxhi3)
3525 smax_optab->handlers[(int) HImode].insn_code = CODE_FOR_smaxhi3;
3526#endif
3527#ifdef HAVE_smaxsi3
3528 if (HAVE_smaxsi3)
3529 smax_optab->handlers[(int) SImode].insn_code = CODE_FOR_smaxsi3;
3530#endif
3531#ifdef HAVE_smaxdi3
3532 if (HAVE_smaxdi3)
3533 smax_optab->handlers[(int) DImode].insn_code = CODE_FOR_smaxdi3;
3534#endif
3535#ifdef HAVE_smaxti3
3536 if (HAVE_smaxti3)
3537 smax_optab->handlers[(int) TImode].insn_code = CODE_FOR_smaxti3;
3538#endif
3539#ifdef HAVE_smaxsf3
3540 if (HAVE_smaxsf3)
3541 smax_optab->handlers[(int) SFmode].insn_code = CODE_FOR_smaxsf3;
3542#endif
3543#ifdef HAVE_smaxdf3
3544 if (HAVE_smaxdf3)
3545 smax_optab->handlers[(int) DFmode].insn_code = CODE_FOR_smaxdf3;
3546#endif
3547#ifdef HAVE_smaxtf3
3548 if (HAVE_smaxtf3)
3549 smax_optab->handlers[(int) TFmode].insn_code = CODE_FOR_smaxtf3;
3550#endif
3551
3552#ifdef HAVE_uminqi3
3553 if (HAVE_uminqi3)
3554 umin_optab->handlers[(int) QImode].insn_code = CODE_FOR_uminqi3;
3555#endif
3556#ifdef HAVE_uminhi3
3557 if (HAVE_uminhi3)
3558 umin_optab->handlers[(int) HImode].insn_code = CODE_FOR_uminhi3;
3559#endif
3560#ifdef HAVE_uminsi3
3561 if (HAVE_uminsi3)
3562 umin_optab->handlers[(int) SImode].insn_code = CODE_FOR_uminsi3;
3563#endif
3564#ifdef HAVE_umindi3
3565 if (HAVE_umindi3)
3566 umin_optab->handlers[(int) DImode].insn_code = CODE_FOR_umindi3;
3567#endif
3568#ifdef HAVE_uminti3
3569 if (HAVE_uminti3)
3570 umin_optab->handlers[(int) TImode].insn_code = CODE_FOR_uminti3;
3571#endif
3572
3573#ifdef HAVE_umaxqi3
3574 if (HAVE_umaxqi3)
3575 umax_optab->handlers[(int) QImode].insn_code = CODE_FOR_umaxqi3;
3576#endif
3577#ifdef HAVE_umaxhi3
3578 if (HAVE_umaxhi3)
3579 umax_optab->handlers[(int) HImode].insn_code = CODE_FOR_umaxhi3;
3580#endif
3581#ifdef HAVE_umaxsi3
3582 if (HAVE_umaxsi3)
3583 umax_optab->handlers[(int) SImode].insn_code = CODE_FOR_umaxsi3;
3584#endif
3585#ifdef HAVE_umaxdi3
3586 if (HAVE_umaxdi3)
3587 umax_optab->handlers[(int) DImode].insn_code = CODE_FOR_umaxdi3;
3588#endif
3589#ifdef HAVE_umaxti3
3590 if (HAVE_umaxti3)
3591 umax_optab->handlers[(int) TImode].insn_code = CODE_FOR_umaxti3;
3592#endif
3593
3594#ifdef HAVE_negqi2
3595 if (HAVE_negqi2)
3596 neg_optab->handlers[(int) QImode].insn_code = CODE_FOR_negqi2;
3597#endif
3598#ifdef HAVE_neghi2
3599 if (HAVE_neghi2)
3600 neg_optab->handlers[(int) HImode].insn_code = CODE_FOR_neghi2;
3601#endif
3602#ifdef HAVE_negpsi2
3603 if (HAVE_negpsi2)
3604 neg_optab->handlers[(int) PSImode].insn_code = CODE_FOR_negpsi2;
3605#endif
3606#ifdef HAVE_negsi2
3607 if (HAVE_negsi2)
3608 neg_optab->handlers[(int) SImode].insn_code = CODE_FOR_negsi2;
3609#endif
3610#ifdef HAVE_negdi2
3611 if (HAVE_negdi2)
3612 neg_optab->handlers[(int) DImode].insn_code = CODE_FOR_negdi2;
3613#endif
3614#ifdef HAVE_negti2
3615 if (HAVE_negti2)
3616 neg_optab->handlers[(int) TImode].insn_code = CODE_FOR_negti2;
3617#endif
3618#ifdef HAVE_negsf2
3619 if (HAVE_negsf2)
3620 neg_optab->handlers[(int) SFmode].insn_code = CODE_FOR_negsf2;
3621#endif
3622#ifdef HAVE_negdf2
3623 if (HAVE_negdf2)
3624 neg_optab->handlers[(int) DFmode].insn_code = CODE_FOR_negdf2;
3625#endif
3626#ifdef HAVE_negtf2
3627 if (HAVE_negtf2)
3628 neg_optab->handlers[(int) TFmode].insn_code = CODE_FOR_negtf2;
3629#endif
3630 neg_optab->handlers[(int) SImode].libfunc
3631 = gen_rtx (SYMBOL_REF, Pmode, "__negsi2");
3632 neg_optab->handlers[(int) DImode].libfunc
3633 = gen_rtx (SYMBOL_REF, Pmode, "__negdi2");
3634 neg_optab->handlers[(int) SFmode].libfunc
3635 = gen_rtx (SYMBOL_REF, Pmode, "__negsf2");
3636 neg_optab->handlers[(int) DFmode].libfunc
3637 = gen_rtx (SYMBOL_REF, Pmode, "__negdf2");
3638
3639#ifdef HAVE_absqi2
3640 if (HAVE_absqi2)
3641 abs_optab->handlers[(int) QImode].insn_code = CODE_FOR_absqi2;
3642#endif
3643#ifdef HAVE_abshi2
3644 if (HAVE_abshi2)
3645 abs_optab->handlers[(int) HImode].insn_code = CODE_FOR_abshi2;
3646#endif
3647#ifdef HAVE_abspsi2
3648 if (HAVE_abspsi2)
3649 abs_optab->handlers[(int) PSImode].insn_code = CODE_FOR_abspsi2;
3650#endif
3651#ifdef HAVE_abssi2
3652 if (HAVE_abssi2)
3653 abs_optab->handlers[(int) SImode].insn_code = CODE_FOR_abssi2;
3654#endif
3655#ifdef HAVE_absdi2
3656 if (HAVE_absdi2)
3657 abs_optab->handlers[(int) DImode].insn_code = CODE_FOR_absdi2;
3658#endif
3659#ifdef HAVE_absti2
3660 if (HAVE_absti2)
3661 abs_optab->handlers[(int) TImode].insn_code = CODE_FOR_absti2;
3662#endif
3663#ifdef HAVE_abssf2
3664 if (HAVE_abssf2)
3665 abs_optab->handlers[(int) SFmode].insn_code = CODE_FOR_abssf2;
3666#endif
3667#ifdef HAVE_absdf2
3668 if (HAVE_absdf2)
3669 abs_optab->handlers[(int) DFmode].insn_code = CODE_FOR_absdf2;
3670#endif
3671#ifdef HAVE_abstf2
3672 if (HAVE_abstf2)
3673 abs_optab->handlers[(int) TFmode].insn_code = CODE_FOR_abstf2;
3674#endif
3675 /* No library calls here! If there is no abs instruction,
3676 expand_expr will generate a conditional negation. */
3677
3678#ifdef HAVE_one_cmplqi2
3679 if (HAVE_one_cmplqi2)
3680 one_cmpl_optab->handlers[(int) QImode].insn_code = CODE_FOR_one_cmplqi2;
3681#endif
3682#ifdef HAVE_one_cmplhi2
3683 if (HAVE_one_cmplhi2)
3684 one_cmpl_optab->handlers[(int) HImode].insn_code = CODE_FOR_one_cmplhi2;
3685#endif
3686#ifdef HAVE_one_cmplpsi2
3687 if (HAVE_one_cmplpsi2)
3688 one_cmpl_optab->handlers[(int) PSImode].insn_code = CODE_FOR_one_cmplpsi2;
3689#endif
3690#ifdef HAVE_one_cmplsi2
3691 if (HAVE_one_cmplsi2)
3692 one_cmpl_optab->handlers[(int) SImode].insn_code = CODE_FOR_one_cmplsi2;
3693#endif
3694#ifdef HAVE_one_cmpldi2
3695 if (HAVE_one_cmpldi2)
3696 one_cmpl_optab->handlers[(int) DImode].insn_code = CODE_FOR_one_cmpldi2;
3697#endif
3698#ifdef HAVE_one_cmplti2
3699 if (HAVE_one_cmplti2)
3700 one_cmpl_optab->handlers[(int) TImode].insn_code = CODE_FOR_one_cmplti2;
3701#endif
3702 one_cmpl_optab->handlers[(int) SImode].libfunc
3703 = gen_rtx (SYMBOL_REF, Pmode, "__one_cmplsi2");
3704
3705#ifdef HAVE_ffsqi2
3706 if (HAVE_ffsqi2)
3707 ffs_optab->handlers[(int) QImode].insn_code = CODE_FOR_ffsqi2;
3708#endif
3709#ifdef HAVE_ffshi2
3710 if (HAVE_ffshi2)
3711 ffs_optab->handlers[(int) HImode].insn_code = CODE_FOR_ffshi2;
3712#endif
3713#ifdef HAVE_ffspsi2
3714 if (HAVE_ffspsi2)
3715 ffs_optab->handlers[(int) PSImode].insn_code = CODE_FOR_ffspsi2;
3716#endif
3717#ifdef HAVE_ffssi2
3718 if (HAVE_ffssi2)
3719 ffs_optab->handlers[(int) SImode].insn_code = CODE_FOR_ffssi2;
3720#endif
3721#ifdef HAVE_ffsdi2
3722 if (HAVE_ffsdi2)
3723 ffs_optab->handlers[(int) DImode].insn_code = CODE_FOR_ffsdi2;
3724#endif
3725#ifdef HAVE_ffsti2
3726 if (HAVE_ffsti2)
3727 ffs_optab->handlers[(int) TImode].insn_code = CODE_FOR_ffsti2;
3728#endif
3729 ffs_optab->handlers[(int) SImode].libfunc
3730 = gen_rtx (SYMBOL_REF, Pmode, "ffs");
3731
3732#ifdef HAVE_movqi
3733 if (HAVE_movqi)
3734 mov_optab->handlers[(int) QImode].insn_code = CODE_FOR_movqi;
3735#endif
3736#ifdef HAVE_movhi
3737 if (HAVE_movhi)
3738 mov_optab->handlers[(int) HImode].insn_code = CODE_FOR_movhi;
3739#endif
3740#ifdef HAVE_movpsi
3741 if (HAVE_movpsi)
3742 mov_optab->handlers[(int) PSImode].insn_code = CODE_FOR_movpsi;
3743#endif
3744#ifdef HAVE_movsi
3745 if (HAVE_movsi)
3746 mov_optab->handlers[(int) SImode].insn_code = CODE_FOR_movsi;
3747#endif
3748#ifdef HAVE_movdi
3749 if (HAVE_movdi)
3750 mov_optab->handlers[(int) DImode].insn_code = CODE_FOR_movdi;
3751#endif
3752#ifdef HAVE_movti
3753 if (HAVE_movti)
3754 mov_optab->handlers[(int) TImode].insn_code = CODE_FOR_movti;
3755#endif
3756#ifdef HAVE_movsf
3757 if (HAVE_movsf)
3758 mov_optab->handlers[(int) SFmode].insn_code = CODE_FOR_movsf;
3759#endif
3760#ifdef HAVE_movdf
3761 if (HAVE_movdf)
3762 mov_optab->handlers[(int) DFmode].insn_code = CODE_FOR_movdf;
3763#endif
3764#ifdef HAVE_movtf
3765 if (HAVE_movtf)
3766 mov_optab->handlers[(int) TFmode].insn_code = CODE_FOR_movtf;
3767#endif
3768#ifdef HAVE_movcc
3769 if (HAVE_movcc)
3770 mov_optab->handlers[(int) CCmode].insn_code = CODE_FOR_movcc;
3771#endif
3772
3773#ifdef EXTRA_CC_MODES
3774 init_mov_optab ();
3775#endif
3776
3777#ifdef HAVE_movstrictqi
3778 if (HAVE_movstrictqi)
3779 movstrict_optab->handlers[(int) QImode].insn_code = CODE_FOR_movstrictqi;
3780#endif
3781#ifdef HAVE_movstricthi
3782 if (HAVE_movstricthi)
3783 movstrict_optab->handlers[(int) HImode].insn_code = CODE_FOR_movstricthi;
3784#endif
3785#ifdef HAVE_movstrictpsi
3786 if (HAVE_movstrictpsi)
3787 movstrict_optab->handlers[(int) PSImode].insn_code = CODE_FOR_movstrictpsi;
3788#endif
3789#ifdef HAVE_movstrictsi
3790 if (HAVE_movstrictsi)
3791 movstrict_optab->handlers[(int) SImode].insn_code = CODE_FOR_movstrictsi;
3792#endif
3793#ifdef HAVE_movstrictdi
3794 if (HAVE_movstrictdi)
3795 movstrict_optab->handlers[(int) DImode].insn_code = CODE_FOR_movstrictdi;
3796#endif
3797#ifdef HAVE_movstrictti
3798 if (HAVE_movstrictti)
3799 movstrict_optab->handlers[(int) TImode].insn_code = CODE_FOR_movstrictti;
3800#endif
3801
3802#ifdef HAVE_cmpqi
3803 if (HAVE_cmpqi)
3804 cmp_optab->handlers[(int) QImode].insn_code = CODE_FOR_cmpqi;
3805#endif
3806#ifdef HAVE_cmphi
3807 if (HAVE_cmphi)
3808 cmp_optab->handlers[(int) HImode].insn_code = CODE_FOR_cmphi;
3809#endif
3810#ifdef HAVE_cmppsi
3811 if (HAVE_cmppsi)
3812 cmp_optab->handlers[(int) PSImode].insn_code = CODE_FOR_cmppsi;
3813#endif
3814#ifdef HAVE_cmpsi
3815 if (HAVE_cmpsi)
3816 cmp_optab->handlers[(int) SImode].insn_code = CODE_FOR_cmpsi;
3817#endif
3818#ifdef HAVE_cmpdi
3819 if (HAVE_cmpdi)
3820 cmp_optab->handlers[(int) DImode].insn_code = CODE_FOR_cmpdi;
3821#endif
3822#ifdef HAVE_cmpti
3823 if (HAVE_cmpti)
3824 cmp_optab->handlers[(int) TImode].insn_code = CODE_FOR_cmpti;
3825#endif
3826#ifdef HAVE_cmpsf
3827 if (HAVE_cmpsf)
3828 cmp_optab->handlers[(int) SFmode].insn_code = CODE_FOR_cmpsf;
3829#endif
3830#ifdef HAVE_cmpdf
3831 if (HAVE_cmpdf)
3832 cmp_optab->handlers[(int) DFmode].insn_code = CODE_FOR_cmpdf;
3833#endif
3834#ifdef HAVE_cmptf
3835 if (HAVE_cmptf)
3836 cmp_optab->handlers[(int) TFmode].insn_code = CODE_FOR_cmptf;
3837#endif
3838#ifdef HAVE_tstqi
3839 if (HAVE_tstqi)
3840 tst_optab->handlers[(int) QImode].insn_code = CODE_FOR_tstqi;
3841#endif
3842#ifdef HAVE_tsthi
3843 if (HAVE_tsthi)
3844 tst_optab->handlers[(int) HImode].insn_code = CODE_FOR_tsthi;
3845#endif
3846#ifdef HAVE_tstpsi
3847 if (HAVE_tstpsi)
3848 tst_optab->handlers[(int) PSImode].insn_code = CODE_FOR_tstpsi;
3849#endif
3850#ifdef HAVE_tstsi
3851 if (HAVE_tstsi)
3852 tst_optab->handlers[(int) SImode].insn_code = CODE_FOR_tstsi;
3853#endif
3854#ifdef HAVE_tstdi
3855 if (HAVE_tstdi)
3856 tst_optab->handlers[(int) DImode].insn_code = CODE_FOR_tstdi;
3857#endif
3858#ifdef HAVE_tstti
3859 if (HAVE_tstti)
3860 tst_optab->handlers[(int) TImode].insn_code = CODE_FOR_tstti;
3861#endif
3862#ifdef HAVE_tstsf
3863 if (HAVE_tstsf)
3864 tst_optab->handlers[(int) SFmode].insn_code = CODE_FOR_tstsf;
3865#endif
3866#ifdef HAVE_tstdf
3867 if (HAVE_tstdf)
3868 tst_optab->handlers[(int) DFmode].insn_code = CODE_FOR_tstdf;
3869#endif
3870#ifdef HAVE_tsttf
3871 if (HAVE_tsttf)
3872 tst_optab->handlers[(int) TFmode].insn_code = CODE_FOR_tsttf;
3873#endif
3874 /* Comparison libcalls for integers MUST come in pairs, signed/unsigned. */
3875 cmp_optab->handlers[(int) DImode].libfunc
3876 = gen_rtx (SYMBOL_REF, Pmode, "__cmpdi2");
3877 ucmp_optab->handlers[(int) DImode].libfunc
3878 = gen_rtx (SYMBOL_REF, Pmode, "__ucmpdi2");
3879
3880#ifdef HAVE_beq
3881 if (HAVE_beq)
3882 bcc_gen_fctn[(int) EQ] = gen_beq;
3883#endif
3884#ifdef HAVE_bne
3885 if (HAVE_bne)
3886 bcc_gen_fctn[(int) NE] = gen_bne;
3887#endif
3888#ifdef HAVE_bgt
3889 if (HAVE_bgt)
3890 bcc_gen_fctn[(int) GT] = gen_bgt;
3891#endif
3892#ifdef HAVE_bge
3893 if (HAVE_bge)
3894 bcc_gen_fctn[(int) GE] = gen_bge;
3895#endif
3896#ifdef HAVE_bgtu
3897 if (HAVE_bgtu)
3898 bcc_gen_fctn[(int) GTU] = gen_bgtu;
3899#endif
3900#ifdef HAVE_bgeu
3901 if (HAVE_bgeu)
3902 bcc_gen_fctn[(int) GEU] = gen_bgeu;
3903#endif
3904#ifdef HAVE_blt
3905 if (HAVE_blt)
3906 bcc_gen_fctn[(int) LT] = gen_blt;
3907#endif
3908#ifdef HAVE_ble
3909 if (HAVE_ble)
3910 bcc_gen_fctn[(int) LE] = gen_ble;
3911#endif
3912#ifdef HAVE_bltu
3913 if (HAVE_bltu)
3914 bcc_gen_fctn[(int) LTU] = gen_bltu;
3915#endif
3916#ifdef HAVE_bleu
3917 if (HAVE_bleu)
3918 bcc_gen_fctn[(int) LEU] = gen_bleu;
3919#endif
3920
3921 for (i = 0; i < NUM_RTX_CODE; i++)
3922 setcc_gen_code[i] = CODE_FOR_nothing;
3923
3924#ifdef HAVE_seq
3925 if (HAVE_seq)
3926 setcc_gen_code[(int) EQ] = CODE_FOR_seq;
3927#endif
3928#ifdef HAVE_sne
3929 if (HAVE_sne)
3930 setcc_gen_code[(int) NE] = CODE_FOR_sne;
3931#endif
3932#ifdef HAVE_sgt
3933 if (HAVE_sgt)
3934 setcc_gen_code[(int) GT] = CODE_FOR_sgt;
3935#endif
3936#ifdef HAVE_sge
3937 if (HAVE_sge)
3938 setcc_gen_code[(int) GE] = CODE_FOR_sge;
3939#endif
3940#ifdef HAVE_sgtu
3941 if (HAVE_sgtu)
3942 setcc_gen_code[(int) GTU] = CODE_FOR_sgtu;
3943#endif
3944#ifdef HAVE_sgeu
3945 if (HAVE_sgeu)
3946 setcc_gen_code[(int) GEU] = CODE_FOR_sgeu;
3947#endif
3948#ifdef HAVE_slt
3949 if (HAVE_slt)
3950 setcc_gen_code[(int) LT] = CODE_FOR_slt;
3951#endif
3952#ifdef HAVE_sle
3953 if (HAVE_sle)
3954 setcc_gen_code[(int) LE] = CODE_FOR_sle;
3955#endif
3956#ifdef HAVE_sltu
3957 if (HAVE_sltu)
3958 setcc_gen_code[(int) LTU] = CODE_FOR_sltu;
3959#endif
3960#ifdef HAVE_sleu
3961 if (HAVE_sleu)
3962 setcc_gen_code[(int) LEU] = CODE_FOR_sleu;
3963#endif
3964
3965 extendsfdf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__extendsfdf2");
3966 truncdfsf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__truncdfsf2");
3967 memcpy_libfunc = gen_rtx (SYMBOL_REF, Pmode, "memcpy");
3968 bcopy_libfunc = gen_rtx (SYMBOL_REF, Pmode, "bcopy");
3969 memcmp_libfunc = gen_rtx (SYMBOL_REF, Pmode, "memcmp");
3970 bcmp_libfunc = gen_rtx (SYMBOL_REF, Pmode, "bcmp");
3971 memset_libfunc = gen_rtx (SYMBOL_REF, Pmode, "memset");
3972 bzero_libfunc = gen_rtx (SYMBOL_REF, Pmode, "bzero");
3973 eqsf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__eqsf2");
3974 nesf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__nesf2");
3975 gtsf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__gtsf2");
3976 gesf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__gesf2");
3977 ltsf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__ltsf2");
3978 lesf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__lesf2");
3979 eqdf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__eqdf2");
3980 nedf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__nedf2");
3981 gtdf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__gtdf2");
3982 gedf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__gedf2");
3983 ltdf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__ltdf2");
3984 ledf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__ledf2");
6bce1b78
RK
3985 floatdisf_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__floatdisf");
3986 floatsisf_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__floatsisf");
3987 floatdidf_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__floatdidf");
3988 floatsidf_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__floatsidf");
3989 fixsfsi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixsfsi");
3990 fixsfdi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixsfdi");
3991 fixdfsi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixdfsi");
3992 fixdfdi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixdfdi");
3993 fixunssfsi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixunssfsi");
3994 fixunssfdi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixunssfdi");
3995 fixunsdfsi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixunsdfsi");
3996 fixunsdfdi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixunsdfdi");
77c9c6c2 3997}
This page took 0.38733 seconds and 5 git commands to generate.