gcc80: Handle TZ specific "%+" format in strftime.
[dragonfly.git] / contrib / gcc-8.0 / gcc / optabs.c
1 /* Expand the basic unary and binary arithmetic operations, for GNU compiler.
2    Copyright (C) 1987-2018 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "backend.h"
25 #include "target.h"
26 #include "rtl.h"
27 #include "tree.h"
28 #include "memmodel.h"
29 #include "predict.h"
30 #include "tm_p.h"
31 #include "expmed.h"
32 #include "optabs.h"
33 #include "emit-rtl.h"
34 #include "recog.h"
35 #include "diagnostic-core.h"
36 #include "rtx-vector-builder.h"
37
38 /* Include insn-config.h before expr.h so that HAVE_conditional_move
39    is properly defined.  */
40 #include "stor-layout.h"
41 #include "except.h"
42 #include "dojump.h"
43 #include "explow.h"
44 #include "expr.h"
45 #include "optabs-tree.h"
46 #include "libfuncs.h"
47
48 static void prepare_float_lib_cmp (rtx, rtx, enum rtx_code, rtx *,
49                                    machine_mode *);
50 static rtx expand_unop_direct (machine_mode, optab, rtx, rtx, int);
51 static void emit_libcall_block_1 (rtx_insn *, rtx, rtx, rtx, bool);
52
53 /* Debug facility for use in GDB.  */
54 void debug_optab_libfuncs (void);
55 \f
56 /* Add a REG_EQUAL note to the last insn in INSNS.  TARGET is being set to
57    the result of operation CODE applied to OP0 (and OP1 if it is a binary
58    operation).
59
60    If the last insn does not set TARGET, don't do anything, but return 1.
61
62    If the last insn or a previous insn sets TARGET and TARGET is one of OP0
63    or OP1, don't add the REG_EQUAL note but return 0.  Our caller can then
64    try again, ensuring that TARGET is not one of the operands.  */
65
66 static int
67 add_equal_note (rtx_insn *insns, rtx target, enum rtx_code code, rtx op0, rtx op1)
68 {
69   rtx_insn *last_insn;
70   rtx set;
71   rtx note;
72
73   gcc_assert (insns && INSN_P (insns) && NEXT_INSN (insns));
74
75   if (GET_RTX_CLASS (code) != RTX_COMM_ARITH
76       && GET_RTX_CLASS (code) != RTX_BIN_ARITH
77       && GET_RTX_CLASS (code) != RTX_COMM_COMPARE
78       && GET_RTX_CLASS (code) != RTX_COMPARE
79       && GET_RTX_CLASS (code) != RTX_UNARY)
80     return 1;
81
82   if (GET_CODE (target) == ZERO_EXTRACT)
83     return 1;
84
85   for (last_insn = insns;
86        NEXT_INSN (last_insn) != NULL_RTX;
87        last_insn = NEXT_INSN (last_insn))
88     ;
89
90   /* If TARGET is in OP0 or OP1, punt.  We'd end up with a note referencing
91      a value changing in the insn, so the note would be invalid for CSE.  */
92   if (reg_overlap_mentioned_p (target, op0)
93       || (op1 && reg_overlap_mentioned_p (target, op1)))
94     {
95       if (MEM_P (target)
96           && (rtx_equal_p (target, op0)
97               || (op1 && rtx_equal_p (target, op1))))
98         {
99           /* For MEM target, with MEM = MEM op X, prefer no REG_EQUAL note
100              over expanding it as temp = MEM op X, MEM = temp.  If the target
101              supports MEM = MEM op X instructions, it is sometimes too hard
102              to reconstruct that form later, especially if X is also a memory,
103              and due to multiple occurrences of addresses the address might
104              be forced into register unnecessarily.
105              Note that not emitting the REG_EQUIV note might inhibit
106              CSE in some cases.  */
107           set = single_set (last_insn);
108           if (set
109               && GET_CODE (SET_SRC (set)) == code
110               && MEM_P (SET_DEST (set))
111               && (rtx_equal_p (SET_DEST (set), XEXP (SET_SRC (set), 0))
112                   || (op1 && rtx_equal_p (SET_DEST (set),
113                                           XEXP (SET_SRC (set), 1)))))
114             return 1;
115         }
116       return 0;
117     }
118
119   set = set_for_reg_notes (last_insn);
120   if (set == NULL_RTX)
121     return 1;
122
123   if (! rtx_equal_p (SET_DEST (set), target)
124       /* For a STRICT_LOW_PART, the REG_NOTE applies to what is inside it.  */
125       && (GET_CODE (SET_DEST (set)) != STRICT_LOW_PART
126           || ! rtx_equal_p (XEXP (SET_DEST (set), 0), target)))
127     return 1;
128
129   if (GET_RTX_CLASS (code) == RTX_UNARY)
130     switch (code)
131       {
132       case FFS:
133       case CLZ:
134       case CTZ:
135       case CLRSB:
136       case POPCOUNT:
137       case PARITY:
138       case BSWAP:
139         if (GET_MODE (op0) != VOIDmode && GET_MODE (target) != GET_MODE (op0))
140           {
141             note = gen_rtx_fmt_e (code, GET_MODE (op0), copy_rtx (op0));
142             if (GET_MODE_UNIT_SIZE (GET_MODE (op0))
143                 > GET_MODE_UNIT_SIZE (GET_MODE (target)))
144               note = simplify_gen_unary (TRUNCATE, GET_MODE (target),
145                                          note, GET_MODE (op0));
146             else
147               note = simplify_gen_unary (ZERO_EXTEND, GET_MODE (target),
148                                          note, GET_MODE (op0));
149             break;
150           }
151         /* FALLTHRU */
152       default:
153         note = gen_rtx_fmt_e (code, GET_MODE (target), copy_rtx (op0));
154         break;
155       }
156   else
157     note = gen_rtx_fmt_ee (code, GET_MODE (target), copy_rtx (op0), copy_rtx (op1));
158
159   set_unique_reg_note (last_insn, REG_EQUAL, note);
160
161   return 1;
162 }
163 \f
164 /* Given two input operands, OP0 and OP1, determine what the correct from_mode
165    for a widening operation would be.  In most cases this would be OP0, but if
166    that's a constant it'll be VOIDmode, which isn't useful.  */
167
168 static machine_mode
169 widened_mode (machine_mode to_mode, rtx op0, rtx op1)
170 {
171   machine_mode m0 = GET_MODE (op0);
172   machine_mode m1 = GET_MODE (op1);
173   machine_mode result;
174
175   if (m0 == VOIDmode && m1 == VOIDmode)
176     return to_mode;
177   else if (m0 == VOIDmode || GET_MODE_UNIT_SIZE (m0) < GET_MODE_UNIT_SIZE (m1))
178     result = m1;
179   else
180     result = m0;
181
182   if (GET_MODE_UNIT_SIZE (result) > GET_MODE_UNIT_SIZE (to_mode))
183     return to_mode;
184
185   return result;
186 }
187 \f
188 /* Widen OP to MODE and return the rtx for the widened operand.  UNSIGNEDP
189    says whether OP is signed or unsigned.  NO_EXTEND is nonzero if we need
190    not actually do a sign-extend or zero-extend, but can leave the
191    higher-order bits of the result rtx undefined, for example, in the case
192    of logical operations, but not right shifts.  */
193
194 static rtx
195 widen_operand (rtx op, machine_mode mode, machine_mode oldmode,
196                int unsignedp, int no_extend)
197 {
198   rtx result;
199   scalar_int_mode int_mode;
200
201   /* If we don't have to extend and this is a constant, return it.  */
202   if (no_extend && GET_MODE (op) == VOIDmode)
203     return op;
204
205   /* If we must extend do so.  If OP is a SUBREG for a promoted object, also
206      extend since it will be more efficient to do so unless the signedness of
207      a promoted object differs from our extension.  */
208   if (! no_extend
209       || !is_a <scalar_int_mode> (mode, &int_mode)
210       || (GET_CODE (op) == SUBREG && SUBREG_PROMOTED_VAR_P (op)
211           && SUBREG_CHECK_PROMOTED_SIGN (op, unsignedp)))
212     return convert_modes (mode, oldmode, op, unsignedp);
213
214   /* If MODE is no wider than a single word, we return a lowpart or paradoxical
215      SUBREG.  */
216   if (GET_MODE_SIZE (int_mode) <= UNITS_PER_WORD)
217     return gen_lowpart (int_mode, force_reg (GET_MODE (op), op));
218
219   /* Otherwise, get an object of MODE, clobber it, and set the low-order
220      part to OP.  */
221
222   result = gen_reg_rtx (int_mode);
223   emit_clobber (result);
224   emit_move_insn (gen_lowpart (GET_MODE (op), result), op);
225   return result;
226 }
227 \f
228 /* Expand vector widening operations.
229
230    There are two different classes of operations handled here:
231    1) Operations whose result is wider than all the arguments to the operation.
232       Examples: VEC_UNPACK_HI/LO_EXPR, VEC_WIDEN_MULT_HI/LO_EXPR
233       In this case OP0 and optionally OP1 would be initialized,
234       but WIDE_OP wouldn't (not relevant for this case).
235    2) Operations whose result is of the same size as the last argument to the
236       operation, but wider than all the other arguments to the operation.
237       Examples: WIDEN_SUM_EXPR, VEC_DOT_PROD_EXPR.
238       In the case WIDE_OP, OP0 and optionally OP1 would be initialized.
239
240    E.g, when called to expand the following operations, this is how
241    the arguments will be initialized:
242                                 nops    OP0     OP1     WIDE_OP
243    widening-sum                 2       oprnd0  -       oprnd1
244    widening-dot-product         3       oprnd0  oprnd1  oprnd2
245    widening-mult                2       oprnd0  oprnd1  -
246    type-promotion (vec-unpack)  1       oprnd0  -       -  */
247
248 rtx
249 expand_widen_pattern_expr (sepops ops, rtx op0, rtx op1, rtx wide_op,
250                            rtx target, int unsignedp)
251 {
252   struct expand_operand eops[4];
253   tree oprnd0, oprnd1, oprnd2;
254   machine_mode wmode = VOIDmode, tmode0, tmode1 = VOIDmode;
255   optab widen_pattern_optab;
256   enum insn_code icode;
257   int nops = TREE_CODE_LENGTH (ops->code);
258   int op;
259
260   oprnd0 = ops->op0;
261   tmode0 = TYPE_MODE (TREE_TYPE (oprnd0));
262   widen_pattern_optab =
263     optab_for_tree_code (ops->code, TREE_TYPE (oprnd0), optab_default);
264   if (ops->code == WIDEN_MULT_PLUS_EXPR
265       || ops->code == WIDEN_MULT_MINUS_EXPR)
266     icode = find_widening_optab_handler (widen_pattern_optab,
267                                          TYPE_MODE (TREE_TYPE (ops->op2)),
268                                          tmode0);
269   else
270     icode = optab_handler (widen_pattern_optab, tmode0);
271   gcc_assert (icode != CODE_FOR_nothing);
272
273   if (nops >= 2)
274     {
275       oprnd1 = ops->op1;
276       tmode1 = TYPE_MODE (TREE_TYPE (oprnd1));
277     }
278
279   /* The last operand is of a wider mode than the rest of the operands.  */
280   if (nops == 2)
281     wmode = tmode1;
282   else if (nops == 3)
283     {
284       gcc_assert (tmode1 == tmode0);
285       gcc_assert (op1);
286       oprnd2 = ops->op2;
287       wmode = TYPE_MODE (TREE_TYPE (oprnd2));
288     }
289
290   op = 0;
291   create_output_operand (&eops[op++], target, TYPE_MODE (ops->type));
292   create_convert_operand_from (&eops[op++], op0, tmode0, unsignedp);
293   if (op1)
294     create_convert_operand_from (&eops[op++], op1, tmode1, unsignedp);
295   if (wide_op)
296     create_convert_operand_from (&eops[op++], wide_op, wmode, unsignedp);
297   expand_insn (icode, op, eops);
298   return eops[0].value;
299 }
300
301 /* Generate code to perform an operation specified by TERNARY_OPTAB
302    on operands OP0, OP1 and OP2, with result having machine-mode MODE.
303
304    UNSIGNEDP is for the case where we have to widen the operands
305    to perform the operation.  It says to use zero-extension.
306
307    If TARGET is nonzero, the value
308    is generated there, if it is convenient to do so.
309    In all cases an rtx is returned for the locus of the value;
310    this may or may not be TARGET.  */
311
312 rtx
313 expand_ternary_op (machine_mode mode, optab ternary_optab, rtx op0,
314                    rtx op1, rtx op2, rtx target, int unsignedp)
315 {
316   struct expand_operand ops[4];
317   enum insn_code icode = optab_handler (ternary_optab, mode);
318
319   gcc_assert (optab_handler (ternary_optab, mode) != CODE_FOR_nothing);
320
321   create_output_operand (&ops[0], target, mode);
322   create_convert_operand_from (&ops[1], op0, mode, unsignedp);
323   create_convert_operand_from (&ops[2], op1, mode, unsignedp);
324   create_convert_operand_from (&ops[3], op2, mode, unsignedp);
325   expand_insn (icode, 4, ops);
326   return ops[0].value;
327 }
328
329
330 /* Like expand_binop, but return a constant rtx if the result can be
331    calculated at compile time.  The arguments and return value are
332    otherwise the same as for expand_binop.  */
333
334 rtx
335 simplify_expand_binop (machine_mode mode, optab binoptab,
336                        rtx op0, rtx op1, rtx target, int unsignedp,
337                        enum optab_methods methods)
338 {
339   if (CONSTANT_P (op0) && CONSTANT_P (op1))
340     {
341       rtx x = simplify_binary_operation (optab_to_code (binoptab),
342                                          mode, op0, op1);
343       if (x)
344         return x;
345     }
346
347   return expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods);
348 }
349
350 /* Like simplify_expand_binop, but always put the result in TARGET.
351    Return true if the expansion succeeded.  */
352
353 bool
354 force_expand_binop (machine_mode mode, optab binoptab,
355                     rtx op0, rtx op1, rtx target, int unsignedp,
356                     enum optab_methods methods)
357 {
358   rtx x = simplify_expand_binop (mode, binoptab, op0, op1,
359                                  target, unsignedp, methods);
360   if (x == 0)
361     return false;
362   if (x != target)
363     emit_move_insn (target, x);
364   return true;
365 }
366
367 /* Create a new vector value in VMODE with all elements set to OP.  The
368    mode of OP must be the element mode of VMODE.  If OP is a constant,
369    then the return value will be a constant.  */
370
371 rtx
372 expand_vector_broadcast (machine_mode vmode, rtx op)
373 {
374   int n;
375   rtvec vec;
376
377   gcc_checking_assert (VECTOR_MODE_P (vmode));
378
379   if (valid_for_const_vector_p (vmode, op))
380     return gen_const_vec_duplicate (vmode, op);
381
382   insn_code icode = optab_handler (vec_duplicate_optab, vmode);
383   if (icode != CODE_FOR_nothing)
384     {
385       struct expand_operand ops[2];
386       create_output_operand (&ops[0], NULL_RTX, vmode);
387       create_input_operand (&ops[1], op, GET_MODE (op));
388       expand_insn (icode, 2, ops);
389       return ops[0].value;
390     }
391
392   if (!GET_MODE_NUNITS (vmode).is_constant (&n))
393     return NULL;
394
395   /* ??? If the target doesn't have a vec_init, then we have no easy way
396      of performing this operation.  Most of this sort of generic support
397      is hidden away in the vector lowering support in gimple.  */
398   icode = convert_optab_handler (vec_init_optab, vmode,
399                                  GET_MODE_INNER (vmode));
400   if (icode == CODE_FOR_nothing)
401     return NULL;
402
403   vec = rtvec_alloc (n);
404   for (int i = 0; i < n; ++i)
405     RTVEC_ELT (vec, i) = op;
406   rtx ret = gen_reg_rtx (vmode);
407   emit_insn (GEN_FCN (icode) (ret, gen_rtx_PARALLEL (vmode, vec)));
408
409   return ret;
410 }
411
412 /* This subroutine of expand_doubleword_shift handles the cases in which
413    the effective shift value is >= BITS_PER_WORD.  The arguments and return
414    value are the same as for the parent routine, except that SUPERWORD_OP1
415    is the shift count to use when shifting OUTOF_INPUT into INTO_TARGET.
416    INTO_TARGET may be null if the caller has decided to calculate it.  */
417
418 static bool
419 expand_superword_shift (optab binoptab, rtx outof_input, rtx superword_op1,
420                         rtx outof_target, rtx into_target,
421                         int unsignedp, enum optab_methods methods)
422 {
423   if (into_target != 0)
424     if (!force_expand_binop (word_mode, binoptab, outof_input, superword_op1,
425                              into_target, unsignedp, methods))
426       return false;
427
428   if (outof_target != 0)
429     {
430       /* For a signed right shift, we must fill OUTOF_TARGET with copies
431          of the sign bit, otherwise we must fill it with zeros.  */
432       if (binoptab != ashr_optab)
433         emit_move_insn (outof_target, CONST0_RTX (word_mode));
434       else
435         if (!force_expand_binop (word_mode, binoptab, outof_input,
436                                  gen_int_shift_amount (word_mode,
437                                                        BITS_PER_WORD - 1),
438                                  outof_target, unsignedp, methods))
439           return false;
440     }
441   return true;
442 }
443
444 /* This subroutine of expand_doubleword_shift handles the cases in which
445    the effective shift value is < BITS_PER_WORD.  The arguments and return
446    value are the same as for the parent routine.  */
447
448 static bool
449 expand_subword_shift (scalar_int_mode op1_mode, optab binoptab,
450                       rtx outof_input, rtx into_input, rtx op1,
451                       rtx outof_target, rtx into_target,
452                       int unsignedp, enum optab_methods methods,
453                       unsigned HOST_WIDE_INT shift_mask)
454 {
455   optab reverse_unsigned_shift, unsigned_shift;
456   rtx tmp, carries;
457
458   reverse_unsigned_shift = (binoptab == ashl_optab ? lshr_optab : ashl_optab);
459   unsigned_shift = (binoptab == ashl_optab ? ashl_optab : lshr_optab);
460
461   /* The low OP1 bits of INTO_TARGET come from the high bits of OUTOF_INPUT.
462      We therefore need to shift OUTOF_INPUT by (BITS_PER_WORD - OP1) bits in
463      the opposite direction to BINOPTAB.  */
464   if (CONSTANT_P (op1) || shift_mask >= BITS_PER_WORD)
465     {
466       carries = outof_input;
467       tmp = immed_wide_int_const (wi::shwi (BITS_PER_WORD,
468                                             op1_mode), op1_mode);
469       tmp = simplify_expand_binop (op1_mode, sub_optab, tmp, op1,
470                                    0, true, methods);
471     }
472   else
473     {
474       /* We must avoid shifting by BITS_PER_WORD bits since that is either
475          the same as a zero shift (if shift_mask == BITS_PER_WORD - 1) or
476          has unknown behavior.  Do a single shift first, then shift by the
477          remainder.  It's OK to use ~OP1 as the remainder if shift counts
478          are truncated to the mode size.  */
479       carries = expand_binop (word_mode, reverse_unsigned_shift,
480                               outof_input, const1_rtx, 0, unsignedp, methods);
481       if (shift_mask == BITS_PER_WORD - 1)
482         {
483           tmp = immed_wide_int_const
484             (wi::minus_one (GET_MODE_PRECISION (op1_mode)), op1_mode);
485           tmp = simplify_expand_binop (op1_mode, xor_optab, op1, tmp,
486                                        0, true, methods);
487         }
488       else
489         {
490           tmp = immed_wide_int_const (wi::shwi (BITS_PER_WORD - 1,
491                                                 op1_mode), op1_mode);
492           tmp = simplify_expand_binop (op1_mode, sub_optab, tmp, op1,
493                                        0, true, methods);
494         }
495     }
496   if (tmp == 0 || carries == 0)
497     return false;
498   carries = expand_binop (word_mode, reverse_unsigned_shift,
499                           carries, tmp, 0, unsignedp, methods);
500   if (carries == 0)
501     return false;
502
503   /* Shift INTO_INPUT logically by OP1.  This is the last use of INTO_INPUT
504      so the result can go directly into INTO_TARGET if convenient.  */
505   tmp = expand_binop (word_mode, unsigned_shift, into_input, op1,
506                       into_target, unsignedp, methods);
507   if (tmp == 0)
508     return false;
509
510   /* Now OR in the bits carried over from OUTOF_INPUT.  */
511   if (!force_expand_binop (word_mode, ior_optab, tmp, carries,
512                            into_target, unsignedp, methods))
513     return false;
514
515   /* Use a standard word_mode shift for the out-of half.  */
516   if (outof_target != 0)
517     if (!force_expand_binop (word_mode, binoptab, outof_input, op1,
518                              outof_target, unsignedp, methods))
519       return false;
520
521   return true;
522 }
523
524
525 /* Try implementing expand_doubleword_shift using conditional moves.
526    The shift is by < BITS_PER_WORD if (CMP_CODE CMP1 CMP2) is true,
527    otherwise it is by >= BITS_PER_WORD.  SUBWORD_OP1 and SUPERWORD_OP1
528    are the shift counts to use in the former and latter case.  All other
529    arguments are the same as the parent routine.  */
530
531 static bool
532 expand_doubleword_shift_condmove (scalar_int_mode op1_mode, optab binoptab,
533                                   enum rtx_code cmp_code, rtx cmp1, rtx cmp2,
534                                   rtx outof_input, rtx into_input,
535                                   rtx subword_op1, rtx superword_op1,
536                                   rtx outof_target, rtx into_target,
537                                   int unsignedp, enum optab_methods methods,
538                                   unsigned HOST_WIDE_INT shift_mask)
539 {
540   rtx outof_superword, into_superword;
541
542   /* Put the superword version of the output into OUTOF_SUPERWORD and
543      INTO_SUPERWORD.  */
544   outof_superword = outof_target != 0 ? gen_reg_rtx (word_mode) : 0;
545   if (outof_target != 0 && subword_op1 == superword_op1)
546     {
547       /* The value INTO_TARGET >> SUBWORD_OP1, which we later store in
548          OUTOF_TARGET, is the same as the value of INTO_SUPERWORD.  */
549       into_superword = outof_target;
550       if (!expand_superword_shift (binoptab, outof_input, superword_op1,
551                                    outof_superword, 0, unsignedp, methods))
552         return false;
553     }
554   else
555     {
556       into_superword = gen_reg_rtx (word_mode);
557       if (!expand_superword_shift (binoptab, outof_input, superword_op1,
558                                    outof_superword, into_superword,
559                                    unsignedp, methods))
560         return false;
561     }
562
563   /* Put the subword version directly in OUTOF_TARGET and INTO_TARGET.  */
564   if (!expand_subword_shift (op1_mode, binoptab,
565                              outof_input, into_input, subword_op1,
566                              outof_target, into_target,
567                              unsignedp, methods, shift_mask))
568     return false;
569
570   /* Select between them.  Do the INTO half first because INTO_SUPERWORD
571      might be the current value of OUTOF_TARGET.  */
572   if (!emit_conditional_move (into_target, cmp_code, cmp1, cmp2, op1_mode,
573                               into_target, into_superword, word_mode, false))
574     return false;
575
576   if (outof_target != 0)
577     if (!emit_conditional_move (outof_target, cmp_code, cmp1, cmp2, op1_mode,
578                                 outof_target, outof_superword,
579                                 word_mode, false))
580       return false;
581
582   return true;
583 }
584
585 /* Expand a doubleword shift (ashl, ashr or lshr) using word-mode shifts.
586    OUTOF_INPUT and INTO_INPUT are the two word-sized halves of the first
587    input operand; the shift moves bits in the direction OUTOF_INPUT->
588    INTO_TARGET.  OUTOF_TARGET and INTO_TARGET are the equivalent words
589    of the target.  OP1 is the shift count and OP1_MODE is its mode.
590    If OP1 is constant, it will have been truncated as appropriate
591    and is known to be nonzero.
592
593    If SHIFT_MASK is zero, the result of word shifts is undefined when the
594    shift count is outside the range [0, BITS_PER_WORD).  This routine must
595    avoid generating such shifts for OP1s in the range [0, BITS_PER_WORD * 2).
596
597    If SHIFT_MASK is nonzero, all word-mode shift counts are effectively
598    masked by it and shifts in the range [BITS_PER_WORD, SHIFT_MASK) will
599    fill with zeros or sign bits as appropriate.
600
601    If SHIFT_MASK is BITS_PER_WORD - 1, this routine will synthesize
602    a doubleword shift whose equivalent mask is BITS_PER_WORD * 2 - 1.
603    Doing this preserves semantics required by SHIFT_COUNT_TRUNCATED.
604    In all other cases, shifts by values outside [0, BITS_PER_UNIT * 2)
605    are undefined.
606
607    BINOPTAB, UNSIGNEDP and METHODS are as for expand_binop.  This function
608    may not use INTO_INPUT after modifying INTO_TARGET, and similarly for
609    OUTOF_INPUT and OUTOF_TARGET.  OUTOF_TARGET can be null if the parent
610    function wants to calculate it itself.
611
612    Return true if the shift could be successfully synthesized.  */
613
614 static bool
615 expand_doubleword_shift (scalar_int_mode op1_mode, optab binoptab,
616                          rtx outof_input, rtx into_input, rtx op1,
617                          rtx outof_target, rtx into_target,
618                          int unsignedp, enum optab_methods methods,
619                          unsigned HOST_WIDE_INT shift_mask)
620 {
621   rtx superword_op1, tmp, cmp1, cmp2;
622   enum rtx_code cmp_code;
623
624   /* See if word-mode shifts by BITS_PER_WORD...BITS_PER_WORD * 2 - 1 will
625      fill the result with sign or zero bits as appropriate.  If so, the value
626      of OUTOF_TARGET will always be (SHIFT OUTOF_INPUT OP1).   Recursively call
627      this routine to calculate INTO_TARGET (which depends on both OUTOF_INPUT
628      and INTO_INPUT), then emit code to set up OUTOF_TARGET.
629
630      This isn't worthwhile for constant shifts since the optimizers will
631      cope better with in-range shift counts.  */
632   if (shift_mask >= BITS_PER_WORD
633       && outof_target != 0
634       && !CONSTANT_P (op1))
635     {
636       if (!expand_doubleword_shift (op1_mode, binoptab,
637                                     outof_input, into_input, op1,
638                                     0, into_target,
639                                     unsignedp, methods, shift_mask))
640         return false;
641       if (!force_expand_binop (word_mode, binoptab, outof_input, op1,
642                                outof_target, unsignedp, methods))
643         return false;
644       return true;
645     }
646
647   /* Set CMP_CODE, CMP1 and CMP2 so that the rtx (CMP_CODE CMP1 CMP2)
648      is true when the effective shift value is less than BITS_PER_WORD.
649      Set SUPERWORD_OP1 to the shift count that should be used to shift
650      OUTOF_INPUT into INTO_TARGET when the condition is false.  */
651   tmp = immed_wide_int_const (wi::shwi (BITS_PER_WORD, op1_mode), op1_mode);
652   if (!CONSTANT_P (op1) && shift_mask == BITS_PER_WORD - 1)
653     {
654       /* Set CMP1 to OP1 & BITS_PER_WORD.  The result is zero iff OP1
655          is a subword shift count.  */
656       cmp1 = simplify_expand_binop (op1_mode, and_optab, op1, tmp,
657                                     0, true, methods);
658       cmp2 = CONST0_RTX (op1_mode);
659       cmp_code = EQ;
660       superword_op1 = op1;
661     }
662   else
663     {
664       /* Set CMP1 to OP1 - BITS_PER_WORD.  */
665       cmp1 = simplify_expand_binop (op1_mode, sub_optab, op1, tmp,
666                                     0, true, methods);
667       cmp2 = CONST0_RTX (op1_mode);
668       cmp_code = LT;
669       superword_op1 = cmp1;
670     }
671   if (cmp1 == 0)
672     return false;
673
674   /* If we can compute the condition at compile time, pick the
675      appropriate subroutine.  */
676   tmp = simplify_relational_operation (cmp_code, SImode, op1_mode, cmp1, cmp2);
677   if (tmp != 0 && CONST_INT_P (tmp))
678     {
679       if (tmp == const0_rtx)
680         return expand_superword_shift (binoptab, outof_input, superword_op1,
681                                        outof_target, into_target,
682                                        unsignedp, methods);
683       else
684         return expand_subword_shift (op1_mode, binoptab,
685                                      outof_input, into_input, op1,
686                                      outof_target, into_target,
687                                      unsignedp, methods, shift_mask);
688     }
689
690   /* Try using conditional moves to generate straight-line code.  */
691   if (HAVE_conditional_move)
692     {
693       rtx_insn *start = get_last_insn ();
694       if (expand_doubleword_shift_condmove (op1_mode, binoptab,
695                                             cmp_code, cmp1, cmp2,
696                                             outof_input, into_input,
697                                             op1, superword_op1,
698                                             outof_target, into_target,
699                                             unsignedp, methods, shift_mask))
700         return true;
701       delete_insns_since (start);
702     }
703
704   /* As a last resort, use branches to select the correct alternative.  */
705   rtx_code_label *subword_label = gen_label_rtx ();
706   rtx_code_label *done_label = gen_label_rtx ();
707
708   NO_DEFER_POP;
709   do_compare_rtx_and_jump (cmp1, cmp2, cmp_code, false, op1_mode,
710                            0, 0, subword_label,
711                            profile_probability::uninitialized ());
712   OK_DEFER_POP;
713
714   if (!expand_superword_shift (binoptab, outof_input, superword_op1,
715                                outof_target, into_target,
716                                unsignedp, methods))
717     return false;
718
719   emit_jump_insn (targetm.gen_jump (done_label));
720   emit_barrier ();
721   emit_label (subword_label);
722
723   if (!expand_subword_shift (op1_mode, binoptab,
724                              outof_input, into_input, op1,
725                              outof_target, into_target,
726                              unsignedp, methods, shift_mask))
727     return false;
728
729   emit_label (done_label);
730   return true;
731 }
732 \f
733 /* Subroutine of expand_binop.  Perform a double word multiplication of
734    operands OP0 and OP1 both of mode MODE, which is exactly twice as wide
735    as the target's word_mode.  This function return NULL_RTX if anything
736    goes wrong, in which case it may have already emitted instructions
737    which need to be deleted.
738
739    If we want to multiply two two-word values and have normal and widening
740    multiplies of single-word values, we can do this with three smaller
741    multiplications.
742
743    The multiplication proceeds as follows:
744                                  _______________________
745                                 [__op0_high_|__op0_low__]
746                                  _______________________
747         *                       [__op1_high_|__op1_low__]
748         _______________________________________________
749                                  _______________________
750     (1)                         [__op0_low__*__op1_low__]
751                      _______________________
752     (2a)            [__op0_low__*__op1_high_]
753                      _______________________
754     (2b)            [__op0_high_*__op1_low__]
755          _______________________
756     (3) [__op0_high_*__op1_high_]
757
758
759   This gives a 4-word result.  Since we are only interested in the
760   lower 2 words, partial result (3) and the upper words of (2a) and
761   (2b) don't need to be calculated.  Hence (2a) and (2b) can be
762   calculated using non-widening multiplication.
763
764   (1), however, needs to be calculated with an unsigned widening
765   multiplication.  If this operation is not directly supported we
766   try using a signed widening multiplication and adjust the result.
767   This adjustment works as follows:
768
769       If both operands are positive then no adjustment is needed.
770
771       If the operands have different signs, for example op0_low < 0 and
772       op1_low >= 0, the instruction treats the most significant bit of
773       op0_low as a sign bit instead of a bit with significance
774       2**(BITS_PER_WORD-1), i.e. the instruction multiplies op1_low
775       with 2**BITS_PER_WORD - op0_low, and two's complements the
776       result.  Conclusion: We need to add op1_low * 2**BITS_PER_WORD to
777       the result.
778
779       Similarly, if both operands are negative, we need to add
780       (op0_low + op1_low) * 2**BITS_PER_WORD.
781
782       We use a trick to adjust quickly.  We logically shift op0_low right
783       (op1_low) BITS_PER_WORD-1 steps to get 0 or 1, and add this to
784       op0_high (op1_high) before it is used to calculate 2b (2a).  If no
785       logical shift exists, we do an arithmetic right shift and subtract
786       the 0 or -1.  */
787
788 static rtx
789 expand_doubleword_mult (machine_mode mode, rtx op0, rtx op1, rtx target,
790                        bool umulp, enum optab_methods methods)
791 {
792   int low = (WORDS_BIG_ENDIAN ? 1 : 0);
793   int high = (WORDS_BIG_ENDIAN ? 0 : 1);
794   rtx wordm1 = (umulp ? NULL_RTX
795                 : gen_int_shift_amount (word_mode, BITS_PER_WORD - 1));
796   rtx product, adjust, product_high, temp;
797
798   rtx op0_high = operand_subword_force (op0, high, mode);
799   rtx op0_low = operand_subword_force (op0, low, mode);
800   rtx op1_high = operand_subword_force (op1, high, mode);
801   rtx op1_low = operand_subword_force (op1, low, mode);
802
803   /* If we're using an unsigned multiply to directly compute the product
804      of the low-order words of the operands and perform any required
805      adjustments of the operands, we begin by trying two more multiplications
806      and then computing the appropriate sum.
807
808      We have checked above that the required addition is provided.
809      Full-word addition will normally always succeed, especially if
810      it is provided at all, so we don't worry about its failure.  The
811      multiplication may well fail, however, so we do handle that.  */
812
813   if (!umulp)
814     {
815       /* ??? This could be done with emit_store_flag where available.  */
816       temp = expand_binop (word_mode, lshr_optab, op0_low, wordm1,
817                            NULL_RTX, 1, methods);
818       if (temp)
819         op0_high = expand_binop (word_mode, add_optab, op0_high, temp,
820                                  NULL_RTX, 0, OPTAB_DIRECT);
821       else
822         {
823           temp = expand_binop (word_mode, ashr_optab, op0_low, wordm1,
824                                NULL_RTX, 0, methods);
825           if (!temp)
826             return NULL_RTX;
827           op0_high = expand_binop (word_mode, sub_optab, op0_high, temp,
828                                    NULL_RTX, 0, OPTAB_DIRECT);
829         }
830
831       if (!op0_high)
832         return NULL_RTX;
833     }
834
835   adjust = expand_binop (word_mode, smul_optab, op0_high, op1_low,
836                          NULL_RTX, 0, OPTAB_DIRECT);
837   if (!adjust)
838     return NULL_RTX;
839
840   /* OP0_HIGH should now be dead.  */
841
842   if (!umulp)
843     {
844       /* ??? This could be done with emit_store_flag where available.  */
845       temp = expand_binop (word_mode, lshr_optab, op1_low, wordm1,
846                            NULL_RTX, 1, methods);
847       if (temp)
848         op1_high = expand_binop (word_mode, add_optab, op1_high, temp,
849                                  NULL_RTX, 0, OPTAB_DIRECT);
850       else
851         {
852           temp = expand_binop (word_mode, ashr_optab, op1_low, wordm1,
853                                NULL_RTX, 0, methods);
854           if (!temp)
855             return NULL_RTX;
856           op1_high = expand_binop (word_mode, sub_optab, op1_high, temp,
857                                    NULL_RTX, 0, OPTAB_DIRECT);
858         }
859
860       if (!op1_high)
861         return NULL_RTX;
862     }
863
864   temp = expand_binop (word_mode, smul_optab, op1_high, op0_low,
865                        NULL_RTX, 0, OPTAB_DIRECT);
866   if (!temp)
867     return NULL_RTX;
868
869   /* OP1_HIGH should now be dead.  */
870
871   adjust = expand_binop (word_mode, add_optab, adjust, temp,
872                          NULL_RTX, 0, OPTAB_DIRECT);
873
874   if (target && !REG_P (target))
875     target = NULL_RTX;
876
877   /* *_widen_optab needs to determine operand mode, make sure at least
878      one operand has non-VOID mode.  */
879   if (GET_MODE (op0_low) == VOIDmode && GET_MODE (op1_low) == VOIDmode)
880     op0_low = force_reg (word_mode, op0_low);
881
882   if (umulp)
883     product = expand_binop (mode, umul_widen_optab, op0_low, op1_low,
884                             target, 1, OPTAB_DIRECT);
885   else
886     product = expand_binop (mode, smul_widen_optab, op0_low, op1_low,
887                             target, 1, OPTAB_DIRECT);
888
889   if (!product)
890     return NULL_RTX;
891
892   product_high = operand_subword (product, high, 1, mode);
893   adjust = expand_binop (word_mode, add_optab, product_high, adjust,
894                          NULL_RTX, 0, OPTAB_DIRECT);
895   emit_move_insn (product_high, adjust);
896   return product;
897 }
898 \f
899 /* Wrapper around expand_binop which takes an rtx code to specify
900    the operation to perform, not an optab pointer.  All other
901    arguments are the same.  */
902 rtx
903 expand_simple_binop (machine_mode mode, enum rtx_code code, rtx op0,
904                      rtx op1, rtx target, int unsignedp,
905                      enum optab_methods methods)
906 {
907   optab binop = code_to_optab (code);
908   gcc_assert (binop);
909
910   return expand_binop (mode, binop, op0, op1, target, unsignedp, methods);
911 }
912
913 /* Return whether OP0 and OP1 should be swapped when expanding a commutative
914    binop.  Order them according to commutative_operand_precedence and, if
915    possible, try to put TARGET or a pseudo first.  */
916 static bool
917 swap_commutative_operands_with_target (rtx target, rtx op0, rtx op1)
918 {
919   int op0_prec = commutative_operand_precedence (op0);
920   int op1_prec = commutative_operand_precedence (op1);
921
922   if (op0_prec < op1_prec)
923     return true;
924
925   if (op0_prec > op1_prec)
926     return false;
927
928   /* With equal precedence, both orders are ok, but it is better if the
929      first operand is TARGET, or if both TARGET and OP0 are pseudos.  */
930   if (target == 0 || REG_P (target))
931     return (REG_P (op1) && !REG_P (op0)) || target == op1;
932   else
933     return rtx_equal_p (op1, target);
934 }
935
936 /* Return true if BINOPTAB implements a shift operation.  */
937
938 static bool
939 shift_optab_p (optab binoptab)
940 {
941   switch (optab_to_code (binoptab))
942     {
943     case ASHIFT:
944     case SS_ASHIFT:
945     case US_ASHIFT:
946     case ASHIFTRT:
947     case LSHIFTRT:
948     case ROTATE:
949     case ROTATERT:
950       return true;
951
952     default:
953       return false;
954     }
955 }
956
957 /* Return true if BINOPTAB implements a commutative binary operation.  */
958
959 static bool
960 commutative_optab_p (optab binoptab)
961 {
962   return (GET_RTX_CLASS (optab_to_code (binoptab)) == RTX_COMM_ARITH
963           || binoptab == smul_widen_optab
964           || binoptab == umul_widen_optab
965           || binoptab == smul_highpart_optab
966           || binoptab == umul_highpart_optab);
967 }
968
969 /* X is to be used in mode MODE as operand OPN to BINOPTAB.  If we're
970    optimizing, and if the operand is a constant that costs more than
971    1 instruction, force the constant into a register and return that
972    register.  Return X otherwise.  UNSIGNEDP says whether X is unsigned.  */
973
974 static rtx
975 avoid_expensive_constant (machine_mode mode, optab binoptab,
976                           int opn, rtx x, bool unsignedp)
977 {
978   bool speed = optimize_insn_for_speed_p ();
979
980   if (mode != VOIDmode
981       && optimize
982       && CONSTANT_P (x)
983       && (rtx_cost (x, mode, optab_to_code (binoptab), opn, speed)
984           > set_src_cost (x, mode, speed)))
985     {
986       if (CONST_INT_P (x))
987         {
988           HOST_WIDE_INT intval = trunc_int_for_mode (INTVAL (x), mode);
989           if (intval != INTVAL (x))
990             x = GEN_INT (intval);
991         }
992       else
993         x = convert_modes (mode, VOIDmode, x, unsignedp);
994       x = force_reg (mode, x);
995     }
996   return x;
997 }
998
999 /* Helper function for expand_binop: handle the case where there
1000    is an insn ICODE that directly implements the indicated operation.
1001    Returns null if this is not possible.  */
1002 static rtx
1003 expand_binop_directly (enum insn_code icode, machine_mode mode, optab binoptab,
1004                        rtx op0, rtx op1,
1005                        rtx target, int unsignedp, enum optab_methods methods,
1006                        rtx_insn *last)
1007 {
1008   machine_mode xmode0 = insn_data[(int) icode].operand[1].mode;
1009   machine_mode xmode1 = insn_data[(int) icode].operand[2].mode;
1010   machine_mode mode0, mode1, tmp_mode;
1011   struct expand_operand ops[3];
1012   bool commutative_p;
1013   rtx_insn *pat;
1014   rtx xop0 = op0, xop1 = op1;
1015   bool canonicalize_op1 = false;
1016
1017   /* If it is a commutative operator and the modes would match
1018      if we would swap the operands, we can save the conversions.  */
1019   commutative_p = commutative_optab_p (binoptab);
1020   if (commutative_p
1021       && GET_MODE (xop0) != xmode0 && GET_MODE (xop1) != xmode1
1022       && GET_MODE (xop0) == xmode1 && GET_MODE (xop1) == xmode1)
1023     std::swap (xop0, xop1);
1024
1025   /* If we are optimizing, force expensive constants into a register.  */
1026   xop0 = avoid_expensive_constant (xmode0, binoptab, 0, xop0, unsignedp);
1027   if (!shift_optab_p (binoptab))
1028     xop1 = avoid_expensive_constant (xmode1, binoptab, 1, xop1, unsignedp);
1029   else
1030     /* Shifts and rotates often use a different mode for op1 from op0;
1031        for VOIDmode constants we don't know the mode, so force it
1032        to be canonicalized using convert_modes.  */
1033     canonicalize_op1 = true;
1034
1035   /* In case the insn wants input operands in modes different from
1036      those of the actual operands, convert the operands.  It would
1037      seem that we don't need to convert CONST_INTs, but we do, so
1038      that they're properly zero-extended, sign-extended or truncated
1039      for their mode.  */
1040
1041   mode0 = GET_MODE (xop0) != VOIDmode ? GET_MODE (xop0) : mode;
1042   if (xmode0 != VOIDmode && xmode0 != mode0)
1043     {
1044       xop0 = convert_modes (xmode0, mode0, xop0, unsignedp);
1045       mode0 = xmode0;
1046     }
1047
1048   mode1 = ((GET_MODE (xop1) != VOIDmode || canonicalize_op1)
1049            ? GET_MODE (xop1) : mode);
1050   if (xmode1 != VOIDmode && xmode1 != mode1)
1051     {
1052       xop1 = convert_modes (xmode1, mode1, xop1, unsignedp);
1053       mode1 = xmode1;
1054     }
1055
1056   /* If operation is commutative,
1057      try to make the first operand a register.
1058      Even better, try to make it the same as the target.
1059      Also try to make the last operand a constant.  */
1060   if (commutative_p
1061       && swap_commutative_operands_with_target (target, xop0, xop1))
1062     std::swap (xop0, xop1);
1063
1064   /* Now, if insn's predicates don't allow our operands, put them into
1065      pseudo regs.  */
1066
1067   if (binoptab == vec_pack_trunc_optab
1068       || binoptab == vec_pack_usat_optab
1069       || binoptab == vec_pack_ssat_optab
1070       || binoptab == vec_pack_ufix_trunc_optab
1071       || binoptab == vec_pack_sfix_trunc_optab)
1072     {
1073       /* The mode of the result is different then the mode of the
1074          arguments.  */
1075       tmp_mode = insn_data[(int) icode].operand[0].mode;
1076       if (VECTOR_MODE_P (mode)
1077           && maybe_ne (GET_MODE_NUNITS (tmp_mode), 2 * GET_MODE_NUNITS (mode)))
1078         {
1079           delete_insns_since (last);
1080           return NULL_RTX;
1081         }
1082     }
1083   else
1084     tmp_mode = mode;
1085
1086   create_output_operand (&ops[0], target, tmp_mode);
1087   create_input_operand (&ops[1], xop0, mode0);
1088   create_input_operand (&ops[2], xop1, mode1);
1089   pat = maybe_gen_insn (icode, 3, ops);
1090   if (pat)
1091     {
1092       /* If PAT is composed of more than one insn, try to add an appropriate
1093          REG_EQUAL note to it.  If we can't because TEMP conflicts with an
1094          operand, call expand_binop again, this time without a target.  */
1095       if (INSN_P (pat) && NEXT_INSN (pat) != NULL_RTX
1096           && ! add_equal_note (pat, ops[0].value,
1097                                optab_to_code (binoptab),
1098                                ops[1].value, ops[2].value))
1099         {
1100           delete_insns_since (last);
1101           return expand_binop (mode, binoptab, op0, op1, NULL_RTX,
1102                                unsignedp, methods);
1103         }
1104
1105       emit_insn (pat);
1106       return ops[0].value;
1107     }
1108   delete_insns_since (last);
1109   return NULL_RTX;
1110 }
1111
1112 /* Generate code to perform an operation specified by BINOPTAB
1113    on operands OP0 and OP1, with result having machine-mode MODE.
1114
1115    UNSIGNEDP is for the case where we have to widen the operands
1116    to perform the operation.  It says to use zero-extension.
1117
1118    If TARGET is nonzero, the value
1119    is generated there, if it is convenient to do so.
1120    In all cases an rtx is returned for the locus of the value;
1121    this may or may not be TARGET.  */
1122
1123 rtx
1124 expand_binop (machine_mode mode, optab binoptab, rtx op0, rtx op1,
1125               rtx target, int unsignedp, enum optab_methods methods)
1126 {
1127   enum optab_methods next_methods
1128     = (methods == OPTAB_LIB || methods == OPTAB_LIB_WIDEN
1129        ? OPTAB_WIDEN : methods);
1130   enum mode_class mclass;
1131   enum insn_code icode;
1132   machine_mode wider_mode;
1133   scalar_int_mode int_mode;
1134   rtx libfunc;
1135   rtx temp;
1136   rtx_insn *entry_last = get_last_insn ();
1137   rtx_insn *last;
1138
1139   mclass = GET_MODE_CLASS (mode);
1140
1141   /* If subtracting an integer constant, convert this into an addition of
1142      the negated constant.  */
1143
1144   if (binoptab == sub_optab && CONST_INT_P (op1))
1145     {
1146       op1 = negate_rtx (mode, op1);
1147       binoptab = add_optab;
1148     }
1149   /* For shifts, constant invalid op1 might be expanded from different
1150      mode than MODE.  As those are invalid, force them to a register
1151      to avoid further problems during expansion.  */
1152   else if (CONST_INT_P (op1)
1153            && shift_optab_p (binoptab)
1154            && UINTVAL (op1) >= GET_MODE_BITSIZE (GET_MODE_INNER (mode)))
1155     {
1156       op1 = gen_int_mode (INTVAL (op1), GET_MODE_INNER (mode));
1157       op1 = force_reg (GET_MODE_INNER (mode), op1);
1158     }
1159
1160   /* Record where to delete back to if we backtrack.  */
1161   last = get_last_insn ();
1162
1163   /* If we can do it with a three-operand insn, do so.  */
1164
1165   if (methods != OPTAB_MUST_WIDEN)
1166     {
1167       if (convert_optab_p (binoptab))
1168         {
1169           machine_mode from_mode = widened_mode (mode, op0, op1);
1170           icode = find_widening_optab_handler (binoptab, mode, from_mode);
1171         }
1172       else
1173         icode = optab_handler (binoptab, mode);
1174       if (icode != CODE_FOR_nothing)
1175         {
1176           temp = expand_binop_directly (icode, mode, binoptab, op0, op1,
1177                                         target, unsignedp, methods, last);
1178           if (temp)
1179             return temp;
1180         }
1181     }
1182
1183   /* If we were trying to rotate, and that didn't work, try rotating
1184      the other direction before falling back to shifts and bitwise-or.  */
1185   if (((binoptab == rotl_optab
1186         && (icode = optab_handler (rotr_optab, mode)) != CODE_FOR_nothing)
1187        || (binoptab == rotr_optab
1188            && (icode = optab_handler (rotl_optab, mode)) != CODE_FOR_nothing))
1189       && is_int_mode (mode, &int_mode))
1190     {
1191       optab otheroptab = (binoptab == rotl_optab ? rotr_optab : rotl_optab);
1192       rtx newop1;
1193       unsigned int bits = GET_MODE_PRECISION (int_mode);
1194
1195       if (CONST_INT_P (op1))
1196         newop1 = gen_int_shift_amount (int_mode, bits - INTVAL (op1));
1197       else if (targetm.shift_truncation_mask (int_mode) == bits - 1)
1198         newop1 = negate_rtx (GET_MODE (op1), op1);
1199       else
1200         newop1 = expand_binop (GET_MODE (op1), sub_optab,
1201                                gen_int_mode (bits, GET_MODE (op1)), op1,
1202                                NULL_RTX, unsignedp, OPTAB_DIRECT);
1203
1204       temp = expand_binop_directly (icode, int_mode, otheroptab, op0, newop1,
1205                                     target, unsignedp, methods, last);
1206       if (temp)
1207         return temp;
1208     }
1209
1210   /* If this is a multiply, see if we can do a widening operation that
1211      takes operands of this mode and makes a wider mode.  */
1212
1213   if (binoptab == smul_optab
1214       && GET_MODE_2XWIDER_MODE (mode).exists (&wider_mode)
1215       && (convert_optab_handler ((unsignedp
1216                                   ? umul_widen_optab
1217                                   : smul_widen_optab),
1218                                  wider_mode, mode) != CODE_FOR_nothing))
1219     {
1220       /* *_widen_optab needs to determine operand mode, make sure at least
1221          one operand has non-VOID mode.  */
1222       if (GET_MODE (op0) == VOIDmode && GET_MODE (op1) == VOIDmode)
1223         op0 = force_reg (mode, op0);
1224       temp = expand_binop (wider_mode,
1225                            unsignedp ? umul_widen_optab : smul_widen_optab,
1226                            op0, op1, NULL_RTX, unsignedp, OPTAB_DIRECT);
1227
1228       if (temp != 0)
1229         {
1230           if (GET_MODE_CLASS (mode) == MODE_INT
1231               && TRULY_NOOP_TRUNCATION_MODES_P (mode, GET_MODE (temp)))
1232             return gen_lowpart (mode, temp);
1233           else
1234             return convert_to_mode (mode, temp, unsignedp);
1235         }
1236     }
1237
1238   /* If this is a vector shift by a scalar, see if we can do a vector
1239      shift by a vector.  If so, broadcast the scalar into a vector.  */
1240   if (mclass == MODE_VECTOR_INT)
1241     {
1242       optab otheroptab = unknown_optab;
1243
1244       if (binoptab == ashl_optab)
1245         otheroptab = vashl_optab;
1246       else if (binoptab == ashr_optab)
1247         otheroptab = vashr_optab;
1248       else if (binoptab == lshr_optab)
1249         otheroptab = vlshr_optab;
1250       else if (binoptab == rotl_optab)
1251         otheroptab = vrotl_optab;
1252       else if (binoptab == rotr_optab)
1253         otheroptab = vrotr_optab;
1254
1255       if (otheroptab
1256           && (icode = optab_handler (otheroptab, mode)) != CODE_FOR_nothing)
1257         {
1258           /* The scalar may have been extended to be too wide.  Truncate
1259              it back to the proper size to fit in the broadcast vector.  */
1260           scalar_mode inner_mode = GET_MODE_INNER (mode);
1261           if (!CONST_INT_P (op1)
1262               && (GET_MODE_BITSIZE (as_a <scalar_int_mode> (GET_MODE (op1)))
1263                   > GET_MODE_BITSIZE (inner_mode)))
1264             op1 = force_reg (inner_mode,
1265                              simplify_gen_unary (TRUNCATE, inner_mode, op1,
1266                                                  GET_MODE (op1)));
1267           rtx vop1 = expand_vector_broadcast (mode, op1);
1268           if (vop1)
1269             {
1270               temp = expand_binop_directly (icode, mode, otheroptab, op0, vop1,
1271                                             target, unsignedp, methods, last);
1272               if (temp)
1273                 return temp;
1274             }
1275         }
1276     }
1277
1278   /* Look for a wider mode of the same class for which we think we
1279      can open-code the operation.  Check for a widening multiply at the
1280      wider mode as well.  */
1281
1282   if (CLASS_HAS_WIDER_MODES_P (mclass)
1283       && methods != OPTAB_DIRECT && methods != OPTAB_LIB)
1284     FOR_EACH_WIDER_MODE (wider_mode, mode)
1285       {
1286         machine_mode next_mode;
1287         if (optab_handler (binoptab, wider_mode) != CODE_FOR_nothing
1288             || (binoptab == smul_optab
1289                 && GET_MODE_WIDER_MODE (wider_mode).exists (&next_mode)
1290                 && (find_widening_optab_handler ((unsignedp
1291                                                   ? umul_widen_optab
1292                                                   : smul_widen_optab),
1293                                                  next_mode, mode)
1294                     != CODE_FOR_nothing)))
1295           {
1296             rtx xop0 = op0, xop1 = op1;
1297             int no_extend = 0;
1298
1299             /* For certain integer operations, we need not actually extend
1300                the narrow operands, as long as we will truncate
1301                the results to the same narrowness.  */
1302
1303             if ((binoptab == ior_optab || binoptab == and_optab
1304                  || binoptab == xor_optab
1305                  || binoptab == add_optab || binoptab == sub_optab
1306                  || binoptab == smul_optab || binoptab == ashl_optab)
1307                 && mclass == MODE_INT)
1308               {
1309                 no_extend = 1;
1310                 xop0 = avoid_expensive_constant (mode, binoptab, 0,
1311                                                  xop0, unsignedp);
1312                 if (binoptab != ashl_optab)
1313                   xop1 = avoid_expensive_constant (mode, binoptab, 1,
1314                                                    xop1, unsignedp);
1315               }
1316
1317             xop0 = widen_operand (xop0, wider_mode, mode, unsignedp, no_extend);
1318
1319             /* The second operand of a shift must always be extended.  */
1320             xop1 = widen_operand (xop1, wider_mode, mode, unsignedp,
1321                                   no_extend && binoptab != ashl_optab);
1322
1323             temp = expand_binop (wider_mode, binoptab, xop0, xop1, NULL_RTX,
1324                                  unsignedp, OPTAB_DIRECT);
1325             if (temp)
1326               {
1327                 if (mclass != MODE_INT
1328                     || !TRULY_NOOP_TRUNCATION_MODES_P (mode, wider_mode))
1329                   {
1330                     if (target == 0)
1331                       target = gen_reg_rtx (mode);
1332                     convert_move (target, temp, 0);
1333                     return target;
1334                   }
1335                 else
1336                   return gen_lowpart (mode, temp);
1337               }
1338             else
1339               delete_insns_since (last);
1340           }
1341       }
1342
1343   /* If operation is commutative,
1344      try to make the first operand a register.
1345      Even better, try to make it the same as the target.
1346      Also try to make the last operand a constant.  */
1347   if (commutative_optab_p (binoptab)
1348       && swap_commutative_operands_with_target (target, op0, op1))
1349     std::swap (op0, op1);
1350
1351   /* These can be done a word at a time.  */
1352   if ((binoptab == and_optab || binoptab == ior_optab || binoptab == xor_optab)
1353       && is_int_mode (mode, &int_mode)
1354       && GET_MODE_SIZE (int_mode) > UNITS_PER_WORD
1355       && optab_handler (binoptab, word_mode) != CODE_FOR_nothing)
1356     {
1357       int i;
1358       rtx_insn *insns;
1359
1360       /* If TARGET is the same as one of the operands, the REG_EQUAL note
1361          won't be accurate, so use a new target.  */
1362       if (target == 0
1363           || target == op0
1364           || target == op1
1365           || !valid_multiword_target_p (target))
1366         target = gen_reg_rtx (int_mode);
1367
1368       start_sequence ();
1369
1370       /* Do the actual arithmetic.  */
1371       for (i = 0; i < GET_MODE_BITSIZE (int_mode) / BITS_PER_WORD; i++)
1372         {
1373           rtx target_piece = operand_subword (target, i, 1, int_mode);
1374           rtx x = expand_binop (word_mode, binoptab,
1375                                 operand_subword_force (op0, i, int_mode),
1376                                 operand_subword_force (op1, i, int_mode),
1377                                 target_piece, unsignedp, next_methods);
1378
1379           if (x == 0)
1380             break;
1381
1382           if (target_piece != x)
1383             emit_move_insn (target_piece, x);
1384         }
1385
1386       insns = get_insns ();
1387       end_sequence ();
1388
1389       if (i == GET_MODE_BITSIZE (int_mode) / BITS_PER_WORD)
1390         {
1391           emit_insn (insns);
1392           return target;
1393         }
1394     }
1395
1396   /* Synthesize double word shifts from single word shifts.  */
1397   if ((binoptab == lshr_optab || binoptab == ashl_optab
1398        || binoptab == ashr_optab)
1399       && is_int_mode (mode, &int_mode)
1400       && (CONST_INT_P (op1) || optimize_insn_for_speed_p ())
1401       && GET_MODE_SIZE (int_mode) == 2 * UNITS_PER_WORD
1402       && GET_MODE_PRECISION (int_mode) == GET_MODE_BITSIZE (int_mode)
1403       && optab_handler (binoptab, word_mode) != CODE_FOR_nothing
1404       && optab_handler (ashl_optab, word_mode) != CODE_FOR_nothing
1405       && optab_handler (lshr_optab, word_mode) != CODE_FOR_nothing)
1406     {
1407       unsigned HOST_WIDE_INT shift_mask, double_shift_mask;
1408       scalar_int_mode op1_mode;
1409
1410       double_shift_mask = targetm.shift_truncation_mask (int_mode);
1411       shift_mask = targetm.shift_truncation_mask (word_mode);
1412       op1_mode = (GET_MODE (op1) != VOIDmode
1413                   ? as_a <scalar_int_mode> (GET_MODE (op1))
1414                   : word_mode);
1415
1416       /* Apply the truncation to constant shifts.  */
1417       if (double_shift_mask > 0 && CONST_INT_P (op1))
1418         op1 = gen_int_mode (INTVAL (op1) & double_shift_mask, op1_mode);
1419
1420       if (op1 == CONST0_RTX (op1_mode))
1421         return op0;
1422
1423       /* Make sure that this is a combination that expand_doubleword_shift
1424          can handle.  See the comments there for details.  */
1425       if (double_shift_mask == 0
1426           || (shift_mask == BITS_PER_WORD - 1
1427               && double_shift_mask == BITS_PER_WORD * 2 - 1))
1428         {
1429           rtx_insn *insns;
1430           rtx into_target, outof_target;
1431           rtx into_input, outof_input;
1432           int left_shift, outof_word;
1433
1434           /* If TARGET is the same as one of the operands, the REG_EQUAL note
1435              won't be accurate, so use a new target.  */
1436           if (target == 0
1437               || target == op0
1438               || target == op1
1439               || !valid_multiword_target_p (target))
1440             target = gen_reg_rtx (int_mode);
1441
1442           start_sequence ();
1443
1444           /* OUTOF_* is the word we are shifting bits away from, and
1445              INTO_* is the word that we are shifting bits towards, thus
1446              they differ depending on the direction of the shift and
1447              WORDS_BIG_ENDIAN.  */
1448
1449           left_shift = binoptab == ashl_optab;
1450           outof_word = left_shift ^ ! WORDS_BIG_ENDIAN;
1451
1452           outof_target = operand_subword (target, outof_word, 1, int_mode);
1453           into_target = operand_subword (target, 1 - outof_word, 1, int_mode);
1454
1455           outof_input = operand_subword_force (op0, outof_word, int_mode);
1456           into_input = operand_subword_force (op0, 1 - outof_word, int_mode);
1457
1458           if (expand_doubleword_shift (op1_mode, binoptab,
1459                                        outof_input, into_input, op1,
1460                                        outof_target, into_target,
1461                                        unsignedp, next_methods, shift_mask))
1462             {
1463               insns = get_insns ();
1464               end_sequence ();
1465
1466               emit_insn (insns);
1467               return target;
1468             }
1469           end_sequence ();
1470         }
1471     }
1472
1473   /* Synthesize double word rotates from single word shifts.  */
1474   if ((binoptab == rotl_optab || binoptab == rotr_optab)
1475       && is_int_mode (mode, &int_mode)
1476       && CONST_INT_P (op1)
1477       && GET_MODE_PRECISION (int_mode) == 2 * BITS_PER_WORD
1478       && optab_handler (ashl_optab, word_mode) != CODE_FOR_nothing
1479       && optab_handler (lshr_optab, word_mode) != CODE_FOR_nothing)
1480     {
1481       rtx_insn *insns;
1482       rtx into_target, outof_target;
1483       rtx into_input, outof_input;
1484       rtx inter;
1485       int shift_count, left_shift, outof_word;
1486
1487       /* If TARGET is the same as one of the operands, the REG_EQUAL note
1488          won't be accurate, so use a new target. Do this also if target is not
1489          a REG, first because having a register instead may open optimization
1490          opportunities, and second because if target and op0 happen to be MEMs
1491          designating the same location, we would risk clobbering it too early
1492          in the code sequence we generate below.  */
1493       if (target == 0
1494           || target == op0
1495           || target == op1
1496           || !REG_P (target)
1497           || !valid_multiword_target_p (target))
1498         target = gen_reg_rtx (int_mode);
1499
1500       start_sequence ();
1501
1502       shift_count = INTVAL (op1);
1503
1504       /* OUTOF_* is the word we are shifting bits away from, and
1505          INTO_* is the word that we are shifting bits towards, thus
1506          they differ depending on the direction of the shift and
1507          WORDS_BIG_ENDIAN.  */
1508
1509       left_shift = (binoptab == rotl_optab);
1510       outof_word = left_shift ^ ! WORDS_BIG_ENDIAN;
1511
1512       outof_target = operand_subword (target, outof_word, 1, int_mode);
1513       into_target = operand_subword (target, 1 - outof_word, 1, int_mode);
1514
1515       outof_input = operand_subword_force (op0, outof_word, int_mode);
1516       into_input = operand_subword_force (op0, 1 - outof_word, int_mode);
1517
1518       if (shift_count == BITS_PER_WORD)
1519         {
1520           /* This is just a word swap.  */
1521           emit_move_insn (outof_target, into_input);
1522           emit_move_insn (into_target, outof_input);
1523           inter = const0_rtx;
1524         }
1525       else
1526         {
1527           rtx into_temp1, into_temp2, outof_temp1, outof_temp2;
1528           HOST_WIDE_INT first_shift_count, second_shift_count;
1529           optab reverse_unsigned_shift, unsigned_shift;
1530
1531           reverse_unsigned_shift = (left_shift ^ (shift_count < BITS_PER_WORD)
1532                                     ? lshr_optab : ashl_optab);
1533
1534           unsigned_shift = (left_shift ^ (shift_count < BITS_PER_WORD)
1535                             ? ashl_optab : lshr_optab);
1536
1537           if (shift_count > BITS_PER_WORD)
1538             {
1539               first_shift_count = shift_count - BITS_PER_WORD;
1540               second_shift_count = 2 * BITS_PER_WORD - shift_count;
1541             }
1542           else
1543             {
1544               first_shift_count = BITS_PER_WORD - shift_count;
1545               second_shift_count = shift_count;
1546             }
1547           rtx first_shift_count_rtx
1548             = gen_int_shift_amount (word_mode, first_shift_count);
1549           rtx second_shift_count_rtx
1550             = gen_int_shift_amount (word_mode, second_shift_count);
1551
1552           into_temp1 = expand_binop (word_mode, unsigned_shift,
1553                                      outof_input, first_shift_count_rtx,
1554                                      NULL_RTX, unsignedp, next_methods);
1555           into_temp2 = expand_binop (word_mode, reverse_unsigned_shift,
1556                                      into_input, second_shift_count_rtx,
1557                                      NULL_RTX, unsignedp, next_methods);
1558
1559           if (into_temp1 != 0 && into_temp2 != 0)
1560             inter = expand_binop (word_mode, ior_optab, into_temp1, into_temp2,
1561                                   into_target, unsignedp, next_methods);
1562           else
1563             inter = 0;
1564
1565           if (inter != 0 && inter != into_target)
1566             emit_move_insn (into_target, inter);
1567
1568           outof_temp1 = expand_binop (word_mode, unsigned_shift,
1569                                       into_input, first_shift_count_rtx,
1570                                       NULL_RTX, unsignedp, next_methods);
1571           outof_temp2 = expand_binop (word_mode, reverse_unsigned_shift,
1572                                       outof_input, second_shift_count_rtx,
1573                                       NULL_RTX, unsignedp, next_methods);
1574
1575           if (inter != 0 && outof_temp1 != 0 && outof_temp2 != 0)
1576             inter = expand_binop (word_mode, ior_optab,
1577                                   outof_temp1, outof_temp2,
1578                                   outof_target, unsignedp, next_methods);
1579
1580           if (inter != 0 && inter != outof_target)
1581             emit_move_insn (outof_target, inter);
1582         }
1583
1584       insns = get_insns ();
1585       end_sequence ();
1586
1587       if (inter != 0)
1588         {
1589           emit_insn (insns);
1590           return target;
1591         }
1592     }
1593
1594   /* These can be done a word at a time by propagating carries.  */
1595   if ((binoptab == add_optab || binoptab == sub_optab)
1596       && is_int_mode (mode, &int_mode)
1597       && GET_MODE_SIZE (int_mode) >= 2 * UNITS_PER_WORD
1598       && optab_handler (binoptab, word_mode) != CODE_FOR_nothing)
1599     {
1600       unsigned int i;
1601       optab otheroptab = binoptab == add_optab ? sub_optab : add_optab;
1602       const unsigned int nwords = GET_MODE_BITSIZE (int_mode) / BITS_PER_WORD;
1603       rtx carry_in = NULL_RTX, carry_out = NULL_RTX;
1604       rtx xop0, xop1, xtarget;
1605
1606       /* We can handle either a 1 or -1 value for the carry.  If STORE_FLAG
1607          value is one of those, use it.  Otherwise, use 1 since it is the
1608          one easiest to get.  */
1609 #if STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1
1610       int normalizep = STORE_FLAG_VALUE;
1611 #else
1612       int normalizep = 1;
1613 #endif
1614
1615       /* Prepare the operands.  */
1616       xop0 = force_reg (int_mode, op0);
1617       xop1 = force_reg (int_mode, op1);
1618
1619       xtarget = gen_reg_rtx (int_mode);
1620
1621       if (target == 0 || !REG_P (target) || !valid_multiword_target_p (target))
1622         target = xtarget;
1623
1624       /* Indicate for flow that the entire target reg is being set.  */
1625       if (REG_P (target))
1626         emit_clobber (xtarget);
1627
1628       /* Do the actual arithmetic.  */
1629       for (i = 0; i < nwords; i++)
1630         {
1631           int index = (WORDS_BIG_ENDIAN ? nwords - i - 1 : i);
1632           rtx target_piece = operand_subword (xtarget, index, 1, int_mode);
1633           rtx op0_piece = operand_subword_force (xop0, index, int_mode);
1634           rtx op1_piece = operand_subword_force (xop1, index, int_mode);
1635           rtx x;
1636
1637           /* Main add/subtract of the input operands.  */
1638           x = expand_binop (word_mode, binoptab,
1639                             op0_piece, op1_piece,
1640                             target_piece, unsignedp, next_methods);
1641           if (x == 0)
1642             break;
1643
1644           if (i + 1 < nwords)
1645             {
1646               /* Store carry from main add/subtract.  */
1647               carry_out = gen_reg_rtx (word_mode);
1648               carry_out = emit_store_flag_force (carry_out,
1649                                                  (binoptab == add_optab
1650                                                   ? LT : GT),
1651                                                  x, op0_piece,
1652                                                  word_mode, 1, normalizep);
1653             }
1654
1655           if (i > 0)
1656             {
1657               rtx newx;
1658
1659               /* Add/subtract previous carry to main result.  */
1660               newx = expand_binop (word_mode,
1661                                    normalizep == 1 ? binoptab : otheroptab,
1662                                    x, carry_in,
1663                                    NULL_RTX, 1, next_methods);
1664
1665               if (i + 1 < nwords)
1666                 {
1667                   /* Get out carry from adding/subtracting carry in.  */
1668                   rtx carry_tmp = gen_reg_rtx (word_mode);
1669                   carry_tmp = emit_store_flag_force (carry_tmp,
1670                                                      (binoptab == add_optab
1671                                                       ? LT : GT),
1672                                                      newx, x,
1673                                                      word_mode, 1, normalizep);
1674
1675                   /* Logical-ior the two poss. carry together.  */
1676                   carry_out = expand_binop (word_mode, ior_optab,
1677                                             carry_out, carry_tmp,
1678                                             carry_out, 0, next_methods);
1679                   if (carry_out == 0)
1680                     break;
1681                 }
1682               emit_move_insn (target_piece, newx);
1683             }
1684           else
1685             {
1686               if (x != target_piece)
1687                 emit_move_insn (target_piece, x);
1688             }
1689
1690           carry_in = carry_out;
1691         }
1692
1693       if (i == GET_MODE_BITSIZE (int_mode) / (unsigned) BITS_PER_WORD)
1694         {
1695           if (optab_handler (mov_optab, int_mode) != CODE_FOR_nothing
1696               || ! rtx_equal_p (target, xtarget))
1697             {
1698               rtx_insn *temp = emit_move_insn (target, xtarget);
1699
1700               set_dst_reg_note (temp, REG_EQUAL,
1701                                 gen_rtx_fmt_ee (optab_to_code (binoptab),
1702                                                 int_mode, copy_rtx (xop0),
1703                                                 copy_rtx (xop1)),
1704                                 target);
1705             }
1706           else
1707             target = xtarget;
1708
1709           return target;
1710         }
1711
1712       else
1713         delete_insns_since (last);
1714     }
1715
1716   /* Attempt to synthesize double word multiplies using a sequence of word
1717      mode multiplications.  We first attempt to generate a sequence using a
1718      more efficient unsigned widening multiply, and if that fails we then
1719      try using a signed widening multiply.  */
1720
1721   if (binoptab == smul_optab
1722       && is_int_mode (mode, &int_mode)
1723       && GET_MODE_SIZE (int_mode) == 2 * UNITS_PER_WORD
1724       && optab_handler (smul_optab, word_mode) != CODE_FOR_nothing
1725       && optab_handler (add_optab, word_mode) != CODE_FOR_nothing)
1726     {
1727       rtx product = NULL_RTX;
1728       if (convert_optab_handler (umul_widen_optab, int_mode, word_mode)
1729           != CODE_FOR_nothing)
1730         {
1731           product = expand_doubleword_mult (int_mode, op0, op1, target,
1732                                             true, methods);
1733           if (!product)
1734             delete_insns_since (last);
1735         }
1736
1737       if (product == NULL_RTX
1738           && (convert_optab_handler (smul_widen_optab, int_mode, word_mode)
1739               != CODE_FOR_nothing))
1740         {
1741           product = expand_doubleword_mult (int_mode, op0, op1, target,
1742                                             false, methods);
1743           if (!product)
1744             delete_insns_since (last);
1745         }
1746
1747       if (product != NULL_RTX)
1748         {
1749           if (optab_handler (mov_optab, int_mode) != CODE_FOR_nothing)
1750             {
1751               rtx_insn *move = emit_move_insn (target ? target : product,
1752                                                product);
1753               set_dst_reg_note (move,
1754                                 REG_EQUAL,
1755                                 gen_rtx_fmt_ee (MULT, int_mode,
1756                                                 copy_rtx (op0),
1757                                                 copy_rtx (op1)),
1758                                 target ? target : product);
1759             }
1760           return product;
1761         }
1762     }
1763
1764   /* It can't be open-coded in this mode.
1765      Use a library call if one is available and caller says that's ok.  */
1766
1767   libfunc = optab_libfunc (binoptab, mode);
1768   if (libfunc
1769       && (methods == OPTAB_LIB || methods == OPTAB_LIB_WIDEN))
1770     {
1771       rtx_insn *insns;
1772       rtx op1x = op1;
1773       machine_mode op1_mode = mode;
1774       rtx value;
1775
1776       start_sequence ();
1777
1778       if (shift_optab_p (binoptab))
1779         {
1780           op1_mode = targetm.libgcc_shift_count_mode ();
1781           /* Specify unsigned here,
1782              since negative shift counts are meaningless.  */
1783           op1x = convert_to_mode (op1_mode, op1, 1);
1784         }
1785
1786       if (GET_MODE (op0) != VOIDmode
1787           && GET_MODE (op0) != mode)
1788         op0 = convert_to_mode (mode, op0, unsignedp);
1789
1790       /* Pass 1 for NO_QUEUE so we don't lose any increments
1791          if the libcall is cse'd or moved.  */
1792       value = emit_library_call_value (libfunc,
1793                                        NULL_RTX, LCT_CONST, mode,
1794                                        op0, mode, op1x, op1_mode);
1795
1796       insns = get_insns ();
1797       end_sequence ();
1798
1799       bool trapv = trapv_binoptab_p (binoptab);
1800       target = gen_reg_rtx (mode);
1801       emit_libcall_block_1 (insns, target, value,
1802                             trapv ? NULL_RTX
1803                             : gen_rtx_fmt_ee (optab_to_code (binoptab),
1804                                               mode, op0, op1), trapv);
1805
1806       return target;
1807     }
1808
1809   delete_insns_since (last);
1810
1811   /* It can't be done in this mode.  Can we do it in a wider mode?  */
1812
1813   if (! (methods == OPTAB_WIDEN || methods == OPTAB_LIB_WIDEN
1814          || methods == OPTAB_MUST_WIDEN))
1815     {
1816       /* Caller says, don't even try.  */
1817       delete_insns_since (entry_last);
1818       return 0;
1819     }
1820
1821   /* Compute the value of METHODS to pass to recursive calls.
1822      Don't allow widening to be tried recursively.  */
1823
1824   methods = (methods == OPTAB_LIB_WIDEN ? OPTAB_LIB : OPTAB_DIRECT);
1825
1826   /* Look for a wider mode of the same class for which it appears we can do
1827      the operation.  */
1828
1829   if (CLASS_HAS_WIDER_MODES_P (mclass))
1830     {
1831       /* This code doesn't make sense for conversion optabs, since we
1832          wouldn't then want to extend the operands to be the same size
1833          as the result.  */
1834       gcc_assert (!convert_optab_p (binoptab));
1835       FOR_EACH_WIDER_MODE (wider_mode, mode)
1836         {
1837           if (optab_handler (binoptab, wider_mode)
1838               || (methods == OPTAB_LIB
1839                   && optab_libfunc (binoptab, wider_mode)))
1840             {
1841               rtx xop0 = op0, xop1 = op1;
1842               int no_extend = 0;
1843
1844               /* For certain integer operations, we need not actually extend
1845                  the narrow operands, as long as we will truncate
1846                  the results to the same narrowness.  */
1847
1848               if ((binoptab == ior_optab || binoptab == and_optab
1849                    || binoptab == xor_optab
1850                    || binoptab == add_optab || binoptab == sub_optab
1851                    || binoptab == smul_optab || binoptab == ashl_optab)
1852                   && mclass == MODE_INT)
1853                 no_extend = 1;
1854
1855               xop0 = widen_operand (xop0, wider_mode, mode,
1856                                     unsignedp, no_extend);
1857
1858               /* The second operand of a shift must always be extended.  */
1859               xop1 = widen_operand (xop1, wider_mode, mode, unsignedp,
1860                                     no_extend && binoptab != ashl_optab);
1861
1862               temp = expand_binop (wider_mode, binoptab, xop0, xop1, NULL_RTX,
1863                                    unsignedp, methods);
1864               if (temp)
1865                 {
1866                   if (mclass != MODE_INT
1867                       || !TRULY_NOOP_TRUNCATION_MODES_P (mode, wider_mode))
1868                     {
1869                       if (target == 0)
1870                         target = gen_reg_rtx (mode);
1871                       convert_move (target, temp, 0);
1872                       return target;
1873                     }
1874                   else
1875                     return gen_lowpart (mode, temp);
1876                 }
1877               else
1878                 delete_insns_since (last);
1879             }
1880         }
1881     }
1882
1883   delete_insns_since (entry_last);
1884   return 0;
1885 }
1886 \f
1887 /* Expand a binary operator which has both signed and unsigned forms.
1888    UOPTAB is the optab for unsigned operations, and SOPTAB is for
1889    signed operations.
1890
1891    If we widen unsigned operands, we may use a signed wider operation instead
1892    of an unsigned wider operation, since the result would be the same.  */
1893
1894 rtx
1895 sign_expand_binop (machine_mode mode, optab uoptab, optab soptab,
1896                    rtx op0, rtx op1, rtx target, int unsignedp,
1897                    enum optab_methods methods)
1898 {
1899   rtx temp;
1900   optab direct_optab = unsignedp ? uoptab : soptab;
1901   bool save_enable;
1902
1903   /* Do it without widening, if possible.  */
1904   temp = expand_binop (mode, direct_optab, op0, op1, target,
1905                        unsignedp, OPTAB_DIRECT);
1906   if (temp || methods == OPTAB_DIRECT)
1907     return temp;
1908
1909   /* Try widening to a signed int.  Disable any direct use of any
1910      signed insn in the current mode.  */
1911   save_enable = swap_optab_enable (soptab, mode, false);
1912
1913   temp = expand_binop (mode, soptab, op0, op1, target,
1914                        unsignedp, OPTAB_WIDEN);
1915
1916   /* For unsigned operands, try widening to an unsigned int.  */
1917   if (!temp && unsignedp)
1918     temp = expand_binop (mode, uoptab, op0, op1, target,
1919                          unsignedp, OPTAB_WIDEN);
1920   if (temp || methods == OPTAB_WIDEN)
1921     goto egress;
1922
1923   /* Use the right width libcall if that exists.  */
1924   temp = expand_binop (mode, direct_optab, op0, op1, target,
1925                        unsignedp, OPTAB_LIB);
1926   if (temp || methods == OPTAB_LIB)
1927     goto egress;
1928
1929   /* Must widen and use a libcall, use either signed or unsigned.  */
1930   temp = expand_binop (mode, soptab, op0, op1, target,
1931                        unsignedp, methods);
1932   if (!temp && unsignedp)
1933     temp = expand_binop (mode, uoptab, op0, op1, target,
1934                          unsignedp, methods);
1935
1936  egress:
1937   /* Undo the fiddling above.  */
1938   if (save_enable)
1939     swap_optab_enable (soptab, mode, true);
1940   return temp;
1941 }
1942 \f
1943 /* Generate code to perform an operation specified by UNOPPTAB
1944    on operand OP0, with two results to TARG0 and TARG1.
1945    We assume that the order of the operands for the instruction
1946    is TARG0, TARG1, OP0.
1947
1948    Either TARG0 or TARG1 may be zero, but what that means is that
1949    the result is not actually wanted.  We will generate it into
1950    a dummy pseudo-reg and discard it.  They may not both be zero.
1951
1952    Returns 1 if this operation can be performed; 0 if not.  */
1953
1954 int
1955 expand_twoval_unop (optab unoptab, rtx op0, rtx targ0, rtx targ1,
1956                     int unsignedp)
1957 {
1958   machine_mode mode = GET_MODE (targ0 ? targ0 : targ1);
1959   enum mode_class mclass;
1960   machine_mode wider_mode;
1961   rtx_insn *entry_last = get_last_insn ();
1962   rtx_insn *last;
1963
1964   mclass = GET_MODE_CLASS (mode);
1965
1966   if (!targ0)
1967     targ0 = gen_reg_rtx (mode);
1968   if (!targ1)
1969     targ1 = gen_reg_rtx (mode);
1970
1971   /* Record where to go back to if we fail.  */
1972   last = get_last_insn ();
1973
1974   if (optab_handler (unoptab, mode) != CODE_FOR_nothing)
1975     {
1976       struct expand_operand ops[3];
1977       enum insn_code icode = optab_handler (unoptab, mode);
1978
1979       create_fixed_operand (&ops[0], targ0);
1980       create_fixed_operand (&ops[1], targ1);
1981       create_convert_operand_from (&ops[2], op0, mode, unsignedp);
1982       if (maybe_expand_insn (icode, 3, ops))
1983         return 1;
1984     }
1985
1986   /* It can't be done in this mode.  Can we do it in a wider mode?  */
1987
1988   if (CLASS_HAS_WIDER_MODES_P (mclass))
1989     {
1990       FOR_EACH_WIDER_MODE (wider_mode, mode)
1991         {
1992           if (optab_handler (unoptab, wider_mode) != CODE_FOR_nothing)
1993             {
1994               rtx t0 = gen_reg_rtx (wider_mode);
1995               rtx t1 = gen_reg_rtx (wider_mode);
1996               rtx cop0 = convert_modes (wider_mode, mode, op0, unsignedp);
1997
1998               if (expand_twoval_unop (unoptab, cop0, t0, t1, unsignedp))
1999                 {
2000                   convert_move (targ0, t0, unsignedp);
2001                   convert_move (targ1, t1, unsignedp);
2002                   return 1;
2003                 }
2004               else
2005                 delete_insns_since (last);
2006             }
2007         }
2008     }
2009
2010   delete_insns_since (entry_last);
2011   return 0;
2012 }
2013 \f
2014 /* Generate code to perform an operation specified by BINOPTAB
2015    on operands OP0 and OP1, with two results to TARG1 and TARG2.
2016    We assume that the order of the operands for the instruction
2017    is TARG0, OP0, OP1, TARG1, which would fit a pattern like
2018    [(set TARG0 (operate OP0 OP1)) (set TARG1 (operate ...))].
2019
2020    Either TARG0 or TARG1 may be zero, but what that means is that
2021    the result is not actually wanted.  We will generate it into
2022    a dummy pseudo-reg and discard it.  They may not both be zero.
2023
2024    Returns 1 if this operation can be performed; 0 if not.  */
2025
2026 int
2027 expand_twoval_binop (optab binoptab, rtx op0, rtx op1, rtx targ0, rtx targ1,
2028                      int unsignedp)
2029 {
2030   machine_mode mode = GET_MODE (targ0 ? targ0 : targ1);
2031   enum mode_class mclass;
2032   machine_mode wider_mode;
2033   rtx_insn *entry_last = get_last_insn ();
2034   rtx_insn *last;
2035
2036   mclass = GET_MODE_CLASS (mode);
2037
2038   if (!targ0)
2039     targ0 = gen_reg_rtx (mode);
2040   if (!targ1)
2041     targ1 = gen_reg_rtx (mode);
2042
2043   /* Record where to go back to if we fail.  */
2044   last = get_last_insn ();
2045
2046   if (optab_handler (binoptab, mode) != CODE_FOR_nothing)
2047     {
2048       struct expand_operand ops[4];
2049       enum insn_code icode = optab_handler (binoptab, mode);
2050       machine_mode mode0 = insn_data[icode].operand[1].mode;
2051       machine_mode mode1 = insn_data[icode].operand[2].mode;
2052       rtx xop0 = op0, xop1 = op1;
2053
2054       /* If we are optimizing, force expensive constants into a register.  */
2055       xop0 = avoid_expensive_constant (mode0, binoptab, 0, xop0, unsignedp);
2056       xop1 = avoid_expensive_constant (mode1, binoptab, 1, xop1, unsignedp);
2057
2058       create_fixed_operand (&ops[0], targ0);
2059       create_convert_operand_from (&ops[1], op0, mode, unsignedp);
2060       create_convert_operand_from (&ops[2], op1, mode, unsignedp);
2061       create_fixed_operand (&ops[3], targ1);
2062       if (maybe_expand_insn (icode, 4, ops))
2063         return 1;
2064       delete_insns_since (last);
2065     }
2066
2067   /* It can't be done in this mode.  Can we do it in a wider mode?  */
2068
2069   if (CLASS_HAS_WIDER_MODES_P (mclass))
2070     {
2071       FOR_EACH_WIDER_MODE (wider_mode, mode)
2072         {
2073           if (optab_handler (binoptab, wider_mode) != CODE_FOR_nothing)
2074             {
2075               rtx t0 = gen_reg_rtx (wider_mode);
2076               rtx t1 = gen_reg_rtx (wider_mode);
2077               rtx cop0 = convert_modes (wider_mode, mode, op0, unsignedp);
2078               rtx cop1 = convert_modes (wider_mode, mode, op1, unsignedp);
2079
2080               if (expand_twoval_binop (binoptab, cop0, cop1,
2081                                        t0, t1, unsignedp))
2082                 {
2083                   convert_move (targ0, t0, unsignedp);
2084                   convert_move (targ1, t1, unsignedp);
2085                   return 1;
2086                 }
2087               else
2088                 delete_insns_since (last);
2089             }
2090         }
2091     }
2092
2093   delete_insns_since (entry_last);
2094   return 0;
2095 }
2096
2097 /* Expand the two-valued library call indicated by BINOPTAB, but
2098    preserve only one of the values.  If TARG0 is non-NULL, the first
2099    value is placed into TARG0; otherwise the second value is placed
2100    into TARG1.  Exactly one of TARG0 and TARG1 must be non-NULL.  The
2101    value stored into TARG0 or TARG1 is equivalent to (CODE OP0 OP1).
2102    This routine assumes that the value returned by the library call is
2103    as if the return value was of an integral mode twice as wide as the
2104    mode of OP0.  Returns 1 if the call was successful.  */
2105
2106 bool
2107 expand_twoval_binop_libfunc (optab binoptab, rtx op0, rtx op1,
2108                              rtx targ0, rtx targ1, enum rtx_code code)
2109 {
2110   machine_mode mode;
2111   machine_mode libval_mode;
2112   rtx libval;
2113   rtx_insn *insns;
2114   rtx libfunc;
2115
2116   /* Exactly one of TARG0 or TARG1 should be non-NULL.  */
2117   gcc_assert (!targ0 != !targ1);
2118
2119   mode = GET_MODE (op0);
2120   libfunc = optab_libfunc (binoptab, mode);
2121   if (!libfunc)
2122     return false;
2123
2124   /* The value returned by the library function will have twice as
2125      many bits as the nominal MODE.  */
2126   libval_mode = smallest_int_mode_for_size (2 * GET_MODE_BITSIZE (mode));
2127   start_sequence ();
2128   libval = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
2129                                     libval_mode,
2130                                     op0, mode,
2131                                     op1, mode);
2132   /* Get the part of VAL containing the value that we want.  */
2133   libval = simplify_gen_subreg (mode, libval, libval_mode,
2134                                 targ0 ? 0 : GET_MODE_SIZE (mode));
2135   insns = get_insns ();
2136   end_sequence ();
2137   /* Move the into the desired location.  */
2138   emit_libcall_block (insns, targ0 ? targ0 : targ1, libval,
2139                       gen_rtx_fmt_ee (code, mode, op0, op1));
2140
2141   return true;
2142 }
2143
2144 \f
2145 /* Wrapper around expand_unop which takes an rtx code to specify
2146    the operation to perform, not an optab pointer.  All other
2147    arguments are the same.  */
2148 rtx
2149 expand_simple_unop (machine_mode mode, enum rtx_code code, rtx op0,
2150                     rtx target, int unsignedp)
2151 {
2152   optab unop = code_to_optab (code);
2153   gcc_assert (unop);
2154
2155   return expand_unop (mode, unop, op0, target, unsignedp);
2156 }
2157
2158 /* Try calculating
2159         (clz:narrow x)
2160    as
2161         (clz:wide (zero_extend:wide x)) - ((width wide) - (width narrow)).
2162
2163    A similar operation can be used for clrsb.  UNOPTAB says which operation
2164    we are trying to expand.  */
2165 static rtx
2166 widen_leading (scalar_int_mode mode, rtx op0, rtx target, optab unoptab)
2167 {
2168   opt_scalar_int_mode wider_mode_iter;
2169   FOR_EACH_WIDER_MODE (wider_mode_iter, mode)
2170     {
2171       scalar_int_mode wider_mode = wider_mode_iter.require ();
2172       if (optab_handler (unoptab, wider_mode) != CODE_FOR_nothing)
2173         {
2174           rtx xop0, temp;
2175           rtx_insn *last;
2176
2177           last = get_last_insn ();
2178
2179           if (target == 0)
2180             target = gen_reg_rtx (mode);
2181           xop0 = widen_operand (op0, wider_mode, mode,
2182                                 unoptab != clrsb_optab, false);
2183           temp = expand_unop (wider_mode, unoptab, xop0, NULL_RTX,
2184                               unoptab != clrsb_optab);
2185           if (temp != 0)
2186             temp = expand_binop
2187               (wider_mode, sub_optab, temp,
2188                gen_int_mode (GET_MODE_PRECISION (wider_mode)
2189                              - GET_MODE_PRECISION (mode),
2190                              wider_mode),
2191                target, true, OPTAB_DIRECT);
2192           if (temp == 0)
2193             delete_insns_since (last);
2194
2195           return temp;
2196         }
2197     }
2198   return 0;
2199 }
2200
2201 /* Try calculating clz of a double-word quantity as two clz's of word-sized
2202    quantities, choosing which based on whether the high word is nonzero.  */
2203 static rtx
2204 expand_doubleword_clz (scalar_int_mode mode, rtx op0, rtx target)
2205 {
2206   rtx xop0 = force_reg (mode, op0);
2207   rtx subhi = gen_highpart (word_mode, xop0);
2208   rtx sublo = gen_lowpart (word_mode, xop0);
2209   rtx_code_label *hi0_label = gen_label_rtx ();
2210   rtx_code_label *after_label = gen_label_rtx ();
2211   rtx_insn *seq;
2212   rtx temp, result;
2213
2214   /* If we were not given a target, use a word_mode register, not a
2215      'mode' register.  The result will fit, and nobody is expecting
2216      anything bigger (the return type of __builtin_clz* is int).  */
2217   if (!target)
2218     target = gen_reg_rtx (word_mode);
2219
2220   /* In any case, write to a word_mode scratch in both branches of the
2221      conditional, so we can ensure there is a single move insn setting
2222      'target' to tag a REG_EQUAL note on.  */
2223   result = gen_reg_rtx (word_mode);
2224
2225   start_sequence ();
2226
2227   /* If the high word is not equal to zero,
2228      then clz of the full value is clz of the high word.  */
2229   emit_cmp_and_jump_insns (subhi, CONST0_RTX (word_mode), EQ, 0,
2230                            word_mode, true, hi0_label);
2231
2232   temp = expand_unop_direct (word_mode, clz_optab, subhi, result, true);
2233   if (!temp)
2234     goto fail;
2235
2236   if (temp != result)
2237     convert_move (result, temp, true);
2238
2239   emit_jump_insn (targetm.gen_jump (after_label));
2240   emit_barrier ();
2241
2242   /* Else clz of the full value is clz of the low word plus the number
2243      of bits in the high word.  */
2244   emit_label (hi0_label);
2245
2246   temp = expand_unop_direct (word_mode, clz_optab, sublo, 0, true);
2247   if (!temp)
2248     goto fail;
2249   temp = expand_binop (word_mode, add_optab, temp,
2250                        gen_int_mode (GET_MODE_BITSIZE (word_mode), word_mode),
2251                        result, true, OPTAB_DIRECT);
2252   if (!temp)
2253     goto fail;
2254   if (temp != result)
2255     convert_move (result, temp, true);
2256
2257   emit_label (after_label);
2258   convert_move (target, result, true);
2259
2260   seq = get_insns ();
2261   end_sequence ();
2262
2263   add_equal_note (seq, target, CLZ, xop0, 0);
2264   emit_insn (seq);
2265   return target;
2266
2267  fail:
2268   end_sequence ();
2269   return 0;
2270 }
2271
2272 /* Try calculating popcount of a double-word quantity as two popcount's of
2273    word-sized quantities and summing up the results.  */
2274 static rtx
2275 expand_doubleword_popcount (scalar_int_mode mode, rtx op0, rtx target)
2276 {
2277   rtx t0, t1, t;
2278   rtx_insn *seq;
2279
2280   start_sequence ();
2281
2282   t0 = expand_unop_direct (word_mode, popcount_optab,
2283                            operand_subword_force (op0, 0, mode), NULL_RTX,
2284                            true);
2285   t1 = expand_unop_direct (word_mode, popcount_optab,
2286                            operand_subword_force (op0, 1, mode), NULL_RTX,
2287                            true);
2288   if (!t0 || !t1)
2289     {
2290       end_sequence ();
2291       return NULL_RTX;
2292     }
2293
2294   /* If we were not given a target, use a word_mode register, not a
2295      'mode' register.  The result will fit, and nobody is expecting
2296      anything bigger (the return type of __builtin_popcount* is int).  */
2297   if (!target)
2298     target = gen_reg_rtx (word_mode);
2299
2300   t = expand_binop (word_mode, add_optab, t0, t1, target, 0, OPTAB_DIRECT);
2301
2302   seq = get_insns ();
2303   end_sequence ();
2304
2305   add_equal_note (seq, t, POPCOUNT, op0, 0);
2306   emit_insn (seq);
2307   return t;
2308 }
2309
2310 /* Try calculating
2311         (parity:wide x)
2312    as
2313         (parity:narrow (low (x) ^ high (x))) */
2314 static rtx
2315 expand_doubleword_parity (scalar_int_mode mode, rtx op0, rtx target)
2316 {
2317   rtx t = expand_binop (word_mode, xor_optab,
2318                         operand_subword_force (op0, 0, mode),
2319                         operand_subword_force (op0, 1, mode),
2320                         NULL_RTX, 0, OPTAB_DIRECT);
2321   return expand_unop (word_mode, parity_optab, t, target, true);
2322 }
2323
2324 /* Try calculating
2325         (bswap:narrow x)
2326    as
2327         (lshiftrt:wide (bswap:wide x) ((width wide) - (width narrow))).  */
2328 static rtx
2329 widen_bswap (scalar_int_mode mode, rtx op0, rtx target)
2330 {
2331   rtx x;
2332   rtx_insn *last;
2333   opt_scalar_int_mode wider_mode_iter;
2334
2335   FOR_EACH_WIDER_MODE (wider_mode_iter, mode)
2336     if (optab_handler (bswap_optab, wider_mode_iter.require ())
2337         != CODE_FOR_nothing)
2338       break;
2339
2340   if (!wider_mode_iter.exists ())
2341     return NULL_RTX;
2342
2343   scalar_int_mode wider_mode = wider_mode_iter.require ();
2344   last = get_last_insn ();
2345
2346   x = widen_operand (op0, wider_mode, mode, true, true);
2347   x = expand_unop (wider_mode, bswap_optab, x, NULL_RTX, true);
2348
2349   gcc_assert (GET_MODE_PRECISION (wider_mode) == GET_MODE_BITSIZE (wider_mode)
2350               && GET_MODE_PRECISION (mode) == GET_MODE_BITSIZE (mode));
2351   if (x != 0)
2352     x = expand_shift (RSHIFT_EXPR, wider_mode, x,
2353                       GET_MODE_BITSIZE (wider_mode)
2354                       - GET_MODE_BITSIZE (mode),
2355                       NULL_RTX, true);
2356
2357   if (x != 0)
2358     {
2359       if (target == 0)
2360         target = gen_reg_rtx (mode);
2361       emit_move_insn (target, gen_lowpart (mode, x));
2362     }
2363   else
2364     delete_insns_since (last);
2365
2366   return target;
2367 }
2368
2369 /* Try calculating bswap as two bswaps of two word-sized operands.  */
2370
2371 static rtx
2372 expand_doubleword_bswap (machine_mode mode, rtx op, rtx target)
2373 {
2374   rtx t0, t1;
2375
2376   t1 = expand_unop (word_mode, bswap_optab,
2377                     operand_subword_force (op, 0, mode), NULL_RTX, true);
2378   t0 = expand_unop (word_mode, bswap_optab,
2379                     operand_subword_force (op, 1, mode), NULL_RTX, true);
2380
2381   if (target == 0 || !valid_multiword_target_p (target))
2382     target = gen_reg_rtx (mode);
2383   if (REG_P (target))
2384     emit_clobber (target);
2385   emit_move_insn (operand_subword (target, 0, 1, mode), t0);
2386   emit_move_insn (operand_subword (target, 1, 1, mode), t1);
2387
2388   return target;
2389 }
2390
2391 /* Try calculating (parity x) as (and (popcount x) 1), where
2392    popcount can also be done in a wider mode.  */
2393 static rtx
2394 expand_parity (scalar_int_mode mode, rtx op0, rtx target)
2395 {
2396   enum mode_class mclass = GET_MODE_CLASS (mode);
2397   opt_scalar_int_mode wider_mode_iter;
2398   FOR_EACH_MODE_FROM (wider_mode_iter, mode)
2399     {
2400       scalar_int_mode wider_mode = wider_mode_iter.require ();
2401       if (optab_handler (popcount_optab, wider_mode) != CODE_FOR_nothing)
2402         {
2403           rtx xop0, temp;
2404           rtx_insn *last;
2405
2406           last = get_last_insn ();
2407
2408           if (target == 0 || GET_MODE (target) != wider_mode)
2409             target = gen_reg_rtx (wider_mode);
2410
2411           xop0 = widen_operand (op0, wider_mode, mode, true, false);
2412           temp = expand_unop (wider_mode, popcount_optab, xop0, NULL_RTX,
2413                               true);
2414           if (temp != 0)
2415             temp = expand_binop (wider_mode, and_optab, temp, const1_rtx,
2416                                  target, true, OPTAB_DIRECT);
2417
2418           if (temp)
2419             {
2420               if (mclass != MODE_INT
2421                   || !TRULY_NOOP_TRUNCATION_MODES_P (mode, wider_mode))
2422                 return convert_to_mode (mode, temp, 0);
2423               else
2424                 return gen_lowpart (mode, temp);
2425             }
2426           else
2427             delete_insns_since (last);
2428         }
2429     }
2430   return 0;
2431 }
2432
2433 /* Try calculating ctz(x) as K - clz(x & -x) ,
2434    where K is GET_MODE_PRECISION(mode) - 1.
2435
2436    Both __builtin_ctz and __builtin_clz are undefined at zero, so we
2437    don't have to worry about what the hardware does in that case.  (If
2438    the clz instruction produces the usual value at 0, which is K, the
2439    result of this code sequence will be -1; expand_ffs, below, relies
2440    on this.  It might be nice to have it be K instead, for consistency
2441    with the (very few) processors that provide a ctz with a defined
2442    value, but that would take one more instruction, and it would be
2443    less convenient for expand_ffs anyway.  */
2444
2445 static rtx
2446 expand_ctz (scalar_int_mode mode, rtx op0, rtx target)
2447 {
2448   rtx_insn *seq;
2449   rtx temp;
2450
2451   if (optab_handler (clz_optab, mode) == CODE_FOR_nothing)
2452     return 0;
2453
2454   start_sequence ();
2455
2456   temp = expand_unop_direct (mode, neg_optab, op0, NULL_RTX, true);
2457   if (temp)
2458     temp = expand_binop (mode, and_optab, op0, temp, NULL_RTX,
2459                          true, OPTAB_DIRECT);
2460   if (temp)
2461     temp = expand_unop_direct (mode, clz_optab, temp, NULL_RTX, true);
2462   if (temp)
2463     temp = expand_binop (mode, sub_optab,
2464                          gen_int_mode (GET_MODE_PRECISION (mode) - 1, mode),
2465                          temp, target,
2466                          true, OPTAB_DIRECT);
2467   if (temp == 0)
2468     {
2469       end_sequence ();
2470       return 0;
2471     }
2472
2473   seq = get_insns ();
2474   end_sequence ();
2475
2476   add_equal_note (seq, temp, CTZ, op0, 0);
2477   emit_insn (seq);
2478   return temp;
2479 }
2480
2481
2482 /* Try calculating ffs(x) using ctz(x) if we have that instruction, or
2483    else with the sequence used by expand_clz.
2484
2485    The ffs builtin promises to return zero for a zero value and ctz/clz
2486    may have an undefined value in that case.  If they do not give us a
2487    convenient value, we have to generate a test and branch.  */
2488 static rtx
2489 expand_ffs (scalar_int_mode mode, rtx op0, rtx target)
2490 {
2491   HOST_WIDE_INT val = 0;
2492   bool defined_at_zero = false;
2493   rtx temp;
2494   rtx_insn *seq;
2495
2496   if (optab_handler (ctz_optab, mode) != CODE_FOR_nothing)
2497     {
2498       start_sequence ();
2499
2500       temp = expand_unop_direct (mode, ctz_optab, op0, 0, true);
2501       if (!temp)
2502         goto fail;
2503
2504       defined_at_zero = (CTZ_DEFINED_VALUE_AT_ZERO (mode, val) == 2);
2505     }
2506   else if (optab_handler (clz_optab, mode) != CODE_FOR_nothing)
2507     {
2508       start_sequence ();
2509       temp = expand_ctz (mode, op0, 0);
2510       if (!temp)
2511         goto fail;
2512
2513       if (CLZ_DEFINED_VALUE_AT_ZERO (mode, val) == 2)
2514         {
2515           defined_at_zero = true;
2516           val = (GET_MODE_PRECISION (mode) - 1) - val;
2517         }
2518     }
2519   else
2520     return 0;
2521
2522   if (defined_at_zero && val == -1)
2523     /* No correction needed at zero.  */;
2524   else
2525     {
2526       /* We don't try to do anything clever with the situation found
2527          on some processors (eg Alpha) where ctz(0:mode) ==
2528          bitsize(mode).  If someone can think of a way to send N to -1
2529          and leave alone all values in the range 0..N-1 (where N is a
2530          power of two), cheaper than this test-and-branch, please add it.
2531
2532          The test-and-branch is done after the operation itself, in case
2533          the operation sets condition codes that can be recycled for this.
2534          (This is true on i386, for instance.)  */
2535
2536       rtx_code_label *nonzero_label = gen_label_rtx ();
2537       emit_cmp_and_jump_insns (op0, CONST0_RTX (mode), NE, 0,
2538                                mode, true, nonzero_label);
2539
2540       convert_move (temp, GEN_INT (-1), false);
2541       emit_label (nonzero_label);
2542     }
2543
2544   /* temp now has a value in the range -1..bitsize-1.  ffs is supposed
2545      to produce a value in the range 0..bitsize.  */
2546   temp = expand_binop (mode, add_optab, temp, gen_int_mode (1, mode),
2547                        target, false, OPTAB_DIRECT);
2548   if (!temp)
2549     goto fail;
2550
2551   seq = get_insns ();
2552   end_sequence ();
2553
2554   add_equal_note (seq, temp, FFS, op0, 0);
2555   emit_insn (seq);
2556   return temp;
2557
2558  fail:
2559   end_sequence ();
2560   return 0;
2561 }
2562
2563 /* Extract the OMODE lowpart from VAL, which has IMODE.  Under certain
2564    conditions, VAL may already be a SUBREG against which we cannot generate
2565    a further SUBREG.  In this case, we expect forcing the value into a
2566    register will work around the situation.  */
2567
2568 static rtx
2569 lowpart_subreg_maybe_copy (machine_mode omode, rtx val,
2570                            machine_mode imode)
2571 {
2572   rtx ret;
2573   ret = lowpart_subreg (omode, val, imode);
2574   if (ret == NULL)
2575     {
2576       val = force_reg (imode, val);
2577       ret = lowpart_subreg (omode, val, imode);
2578       gcc_assert (ret != NULL);
2579     }
2580   return ret;
2581 }
2582
2583 /* Expand a floating point absolute value or negation operation via a
2584    logical operation on the sign bit.  */
2585
2586 static rtx
2587 expand_absneg_bit (enum rtx_code code, scalar_float_mode mode,
2588                    rtx op0, rtx target)
2589 {
2590   const struct real_format *fmt;
2591   int bitpos, word, nwords, i;
2592   scalar_int_mode imode;
2593   rtx temp;
2594   rtx_insn *insns;
2595
2596   /* The format has to have a simple sign bit.  */
2597   fmt = REAL_MODE_FORMAT (mode);
2598   if (fmt == NULL)
2599     return NULL_RTX;
2600
2601   bitpos = fmt->signbit_rw;
2602   if (bitpos < 0)
2603     return NULL_RTX;
2604
2605   /* Don't create negative zeros if the format doesn't support them.  */
2606   if (code == NEG && !fmt->has_signed_zero)
2607     return NULL_RTX;
2608
2609   if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD)
2610     {
2611       if (!int_mode_for_mode (mode).exists (&imode))
2612         return NULL_RTX;
2613       word = 0;
2614       nwords = 1;
2615     }
2616   else
2617     {
2618       imode = word_mode;
2619
2620       if (FLOAT_WORDS_BIG_ENDIAN)
2621         word = (GET_MODE_BITSIZE (mode) - bitpos) / BITS_PER_WORD;
2622       else
2623         word = bitpos / BITS_PER_WORD;
2624       bitpos = bitpos % BITS_PER_WORD;
2625       nwords = (GET_MODE_BITSIZE (mode) + BITS_PER_WORD - 1) / BITS_PER_WORD;
2626     }
2627
2628   wide_int mask = wi::set_bit_in_zero (bitpos, GET_MODE_PRECISION (imode));
2629   if (code == ABS)
2630     mask = ~mask;
2631
2632   if (target == 0
2633       || target == op0
2634       || (nwords > 1 && !valid_multiword_target_p (target)))
2635     target = gen_reg_rtx (mode);
2636
2637   if (nwords > 1)
2638     {
2639       start_sequence ();
2640
2641       for (i = 0; i < nwords; ++i)
2642         {
2643           rtx targ_piece = operand_subword (target, i, 1, mode);
2644           rtx op0_piece = operand_subword_force (op0, i, mode);
2645
2646           if (i == word)
2647             {
2648               temp = expand_binop (imode, code == ABS ? and_optab : xor_optab,
2649                                    op0_piece,
2650                                    immed_wide_int_const (mask, imode),
2651                                    targ_piece, 1, OPTAB_LIB_WIDEN);
2652               if (temp != targ_piece)
2653                 emit_move_insn (targ_piece, temp);
2654             }
2655           else
2656             emit_move_insn (targ_piece, op0_piece);
2657         }
2658
2659       insns = get_insns ();
2660       end_sequence ();
2661
2662       emit_insn (insns);
2663     }
2664   else
2665     {
2666       temp = expand_binop (imode, code == ABS ? and_optab : xor_optab,
2667                            gen_lowpart (imode, op0),
2668                            immed_wide_int_const (mask, imode),
2669                            gen_lowpart (imode, target), 1, OPTAB_LIB_WIDEN);
2670       target = lowpart_subreg_maybe_copy (mode, temp, imode);
2671
2672       set_dst_reg_note (get_last_insn (), REG_EQUAL,
2673                         gen_rtx_fmt_e (code, mode, copy_rtx (op0)),
2674                         target);
2675     }
2676
2677   return target;
2678 }
2679
2680 /* As expand_unop, but will fail rather than attempt the operation in a
2681    different mode or with a libcall.  */
2682 static rtx
2683 expand_unop_direct (machine_mode mode, optab unoptab, rtx op0, rtx target,
2684                     int unsignedp)
2685 {
2686   if (optab_handler (unoptab, mode) != CODE_FOR_nothing)
2687     {
2688       struct expand_operand ops[2];
2689       enum insn_code icode = optab_handler (unoptab, mode);
2690       rtx_insn *last = get_last_insn ();
2691       rtx_insn *pat;
2692
2693       create_output_operand (&ops[0], target, mode);
2694       create_convert_operand_from (&ops[1], op0, mode, unsignedp);
2695       pat = maybe_gen_insn (icode, 2, ops);
2696       if (pat)
2697         {
2698           if (INSN_P (pat) && NEXT_INSN (pat) != NULL_RTX
2699               && ! add_equal_note (pat, ops[0].value,
2700                                    optab_to_code (unoptab),
2701                                    ops[1].value, NULL_RTX))
2702             {
2703               delete_insns_since (last);
2704               return expand_unop (mode, unoptab, op0, NULL_RTX, unsignedp);
2705             }
2706
2707           emit_insn (pat);
2708
2709           return ops[0].value;
2710         }
2711     }
2712   return 0;
2713 }
2714
2715 /* Generate code to perform an operation specified by UNOPTAB
2716    on operand OP0, with result having machine-mode MODE.
2717
2718    UNSIGNEDP is for the case where we have to widen the operands
2719    to perform the operation.  It says to use zero-extension.
2720
2721    If TARGET is nonzero, the value
2722    is generated there, if it is convenient to do so.
2723    In all cases an rtx is returned for the locus of the value;
2724    this may or may not be TARGET.  */
2725
2726 rtx
2727 expand_unop (machine_mode mode, optab unoptab, rtx op0, rtx target,
2728              int unsignedp)
2729 {
2730   enum mode_class mclass = GET_MODE_CLASS (mode);
2731   machine_mode wider_mode;
2732   scalar_int_mode int_mode;
2733   scalar_float_mode float_mode;
2734   rtx temp;
2735   rtx libfunc;
2736
2737   temp = expand_unop_direct (mode, unoptab, op0, target, unsignedp);
2738   if (temp)
2739     return temp;
2740
2741   /* It can't be done in this mode.  Can we open-code it in a wider mode?  */
2742
2743   /* Widening (or narrowing) clz needs special treatment.  */
2744   if (unoptab == clz_optab)
2745     {
2746       if (is_a <scalar_int_mode> (mode, &int_mode))
2747         {
2748           temp = widen_leading (int_mode, op0, target, unoptab);
2749           if (temp)
2750             return temp;
2751
2752           if (GET_MODE_SIZE (int_mode) == 2 * UNITS_PER_WORD
2753               && optab_handler (unoptab, word_mode) != CODE_FOR_nothing)
2754             {
2755               temp = expand_doubleword_clz (int_mode, op0, target);
2756               if (temp)
2757                 return temp;
2758             }
2759         }
2760
2761       goto try_libcall;
2762     }
2763
2764   if (unoptab == clrsb_optab)
2765     {
2766       if (is_a <scalar_int_mode> (mode, &int_mode))
2767         {
2768           temp = widen_leading (int_mode, op0, target, unoptab);
2769           if (temp)
2770             return temp;
2771         }
2772       goto try_libcall;
2773     }
2774
2775   if (unoptab == popcount_optab
2776       && is_a <scalar_int_mode> (mode, &int_mode)
2777       && GET_MODE_SIZE (int_mode) == 2 * UNITS_PER_WORD
2778       && optab_handler (unoptab, word_mode) != CODE_FOR_nothing
2779       && optimize_insn_for_speed_p ())
2780     {
2781       temp = expand_doubleword_popcount (int_mode, op0, target);
2782       if (temp)
2783         return temp;
2784     }
2785
2786   if (unoptab == parity_optab
2787       && is_a <scalar_int_mode> (mode, &int_mode)
2788       && GET_MODE_SIZE (int_mode) == 2 * UNITS_PER_WORD
2789       && (optab_handler (unoptab, word_mode) != CODE_FOR_nothing
2790           || optab_handler (popcount_optab, word_mode) != CODE_FOR_nothing)
2791       && optimize_insn_for_speed_p ())
2792     {
2793       temp = expand_doubleword_parity (int_mode, op0, target);
2794       if (temp)
2795         return temp;
2796     }
2797
2798   /* Widening (or narrowing) bswap needs special treatment.  */
2799   if (unoptab == bswap_optab)
2800     {
2801       /* HImode is special because in this mode BSWAP is equivalent to ROTATE
2802          or ROTATERT.  First try these directly; if this fails, then try the
2803          obvious pair of shifts with allowed widening, as this will probably
2804          be always more efficient than the other fallback methods.  */
2805       if (mode == HImode)
2806         {
2807           rtx_insn *last;
2808           rtx temp1, temp2;
2809
2810           if (optab_handler (rotl_optab, mode) != CODE_FOR_nothing)
2811             {
2812               temp = expand_binop (mode, rotl_optab, op0,
2813                                    gen_int_shift_amount (mode, 8),
2814                                    target, unsignedp, OPTAB_DIRECT);
2815               if (temp)
2816                 return temp;
2817              }
2818
2819           if (optab_handler (rotr_optab, mode) != CODE_FOR_nothing)
2820             {
2821               temp = expand_binop (mode, rotr_optab, op0,
2822                                    gen_int_shift_amount (mode, 8),
2823                                    target, unsignedp, OPTAB_DIRECT);
2824               if (temp)
2825                 return temp;
2826             }
2827
2828           last = get_last_insn ();
2829
2830           temp1 = expand_binop (mode, ashl_optab, op0,
2831                                 gen_int_shift_amount (mode, 8), NULL_RTX,
2832                                 unsignedp, OPTAB_WIDEN);
2833           temp2 = expand_binop (mode, lshr_optab, op0,
2834                                 gen_int_shift_amount (mode, 8), NULL_RTX,
2835                                 unsignedp, OPTAB_WIDEN);
2836           if (temp1 && temp2)
2837             {
2838               temp = expand_binop (mode, ior_optab, temp1, temp2, target,
2839                                    unsignedp, OPTAB_WIDEN);
2840               if (temp)
2841                 return temp;
2842             }
2843
2844           delete_insns_since (last);
2845         }
2846
2847       if (is_a <scalar_int_mode> (mode, &int_mode))
2848         {
2849           temp = widen_bswap (int_mode, op0, target);
2850           if (temp)
2851             return temp;
2852
2853           if (GET_MODE_SIZE (int_mode) == 2 * UNITS_PER_WORD
2854               && optab_handler (unoptab, word_mode) != CODE_FOR_nothing)
2855             {
2856               temp = expand_doubleword_bswap (mode, op0, target);
2857               if (temp)
2858                 return temp;
2859             }
2860         }
2861
2862       goto try_libcall;
2863     }
2864
2865   if (CLASS_HAS_WIDER_MODES_P (mclass))
2866     FOR_EACH_WIDER_MODE (wider_mode, mode)
2867       {
2868         if (optab_handler (unoptab, wider_mode) != CODE_FOR_nothing)
2869           {
2870             rtx xop0 = op0;
2871             rtx_insn *last = get_last_insn ();
2872
2873             /* For certain operations, we need not actually extend
2874                the narrow operand, as long as we will truncate the
2875                results to the same narrowness.  */
2876
2877             xop0 = widen_operand (xop0, wider_mode, mode, unsignedp,
2878                                   (unoptab == neg_optab
2879                                    || unoptab == one_cmpl_optab)
2880                                   && mclass == MODE_INT);
2881
2882             temp = expand_unop (wider_mode, unoptab, xop0, NULL_RTX,
2883                                 unsignedp);
2884
2885             if (temp)
2886               {
2887                 if (mclass != MODE_INT
2888                     || !TRULY_NOOP_TRUNCATION_MODES_P (mode, wider_mode))
2889                   {
2890                     if (target == 0)
2891                       target = gen_reg_rtx (mode);
2892                     convert_move (target, temp, 0);
2893                     return target;
2894                   }
2895                 else
2896                   return gen_lowpart (mode, temp);
2897               }
2898             else
2899               delete_insns_since (last);
2900           }
2901       }
2902
2903   /* These can be done a word at a time.  */
2904   if (unoptab == one_cmpl_optab
2905       && is_int_mode (mode, &int_mode)
2906       && GET_MODE_SIZE (int_mode) > UNITS_PER_WORD
2907       && optab_handler (unoptab, word_mode) != CODE_FOR_nothing)
2908     {
2909       int i;
2910       rtx_insn *insns;
2911
2912       if (target == 0 || target == op0 || !valid_multiword_target_p (target))
2913         target = gen_reg_rtx (int_mode);
2914
2915       start_sequence ();
2916
2917       /* Do the actual arithmetic.  */
2918       for (i = 0; i < GET_MODE_BITSIZE (int_mode) / BITS_PER_WORD; i++)
2919         {
2920           rtx target_piece = operand_subword (target, i, 1, int_mode);
2921           rtx x = expand_unop (word_mode, unoptab,
2922                                operand_subword_force (op0, i, int_mode),
2923                                target_piece, unsignedp);
2924
2925           if (target_piece != x)
2926             emit_move_insn (target_piece, x);
2927         }
2928
2929       insns = get_insns ();
2930       end_sequence ();
2931
2932       emit_insn (insns);
2933       return target;
2934     }
2935
2936   if (optab_to_code (unoptab) == NEG)
2937     {
2938       /* Try negating floating point values by flipping the sign bit.  */
2939       if (is_a <scalar_float_mode> (mode, &float_mode))
2940         {
2941           temp = expand_absneg_bit (NEG, float_mode, op0, target);
2942           if (temp)
2943             return temp;
2944         }
2945
2946       /* If there is no negation pattern, and we have no negative zero,
2947          try subtracting from zero.  */
2948       if (!HONOR_SIGNED_ZEROS (mode))
2949         {
2950           temp = expand_binop (mode, (unoptab == negv_optab
2951                                       ? subv_optab : sub_optab),
2952                                CONST0_RTX (mode), op0, target,
2953                                unsignedp, OPTAB_DIRECT);
2954           if (temp)
2955             return temp;
2956         }
2957     }
2958
2959   /* Try calculating parity (x) as popcount (x) % 2.  */
2960   if (unoptab == parity_optab && is_a <scalar_int_mode> (mode, &int_mode))
2961     {
2962       temp = expand_parity (int_mode, op0, target);
2963       if (temp)
2964         return temp;
2965     }
2966
2967   /* Try implementing ffs (x) in terms of clz (x).  */
2968   if (unoptab == ffs_optab && is_a <scalar_int_mode> (mode, &int_mode))
2969     {
2970       temp = expand_ffs (int_mode, op0, target);
2971       if (temp)
2972         return temp;
2973     }
2974
2975   /* Try implementing ctz (x) in terms of clz (x).  */
2976   if (unoptab == ctz_optab && is_a <scalar_int_mode> (mode, &int_mode))
2977     {
2978       temp = expand_ctz (int_mode, op0, target);
2979       if (temp)
2980         return temp;
2981     }
2982
2983  try_libcall:
2984   /* Now try a library call in this mode.  */
2985   libfunc = optab_libfunc (unoptab, mode);
2986   if (libfunc)
2987     {
2988       rtx_insn *insns;
2989       rtx value;
2990       rtx eq_value;
2991       machine_mode outmode = mode;
2992
2993       /* All of these functions return small values.  Thus we choose to
2994          have them return something that isn't a double-word.  */
2995       if (unoptab == ffs_optab || unoptab == clz_optab || unoptab == ctz_optab
2996           || unoptab == clrsb_optab || unoptab == popcount_optab
2997           || unoptab == parity_optab)
2998         outmode
2999           = GET_MODE (hard_libcall_value (TYPE_MODE (integer_type_node),
3000                                           optab_libfunc (unoptab, mode)));
3001
3002       start_sequence ();
3003
3004       /* Pass 1 for NO_QUEUE so we don't lose any increments
3005          if the libcall is cse'd or moved.  */
3006       value = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST, outmode,
3007                                        op0, mode);
3008       insns = get_insns ();
3009       end_sequence ();
3010
3011       target = gen_reg_rtx (outmode);
3012       bool trapv = trapv_unoptab_p (unoptab);
3013       if (trapv)
3014         eq_value = NULL_RTX;
3015       else
3016         {
3017           eq_value = gen_rtx_fmt_e (optab_to_code (unoptab), mode, op0);
3018           if (GET_MODE_UNIT_SIZE (outmode) < GET_MODE_UNIT_SIZE (mode))
3019             eq_value = simplify_gen_unary (TRUNCATE, outmode, eq_value, mode);
3020           else if (GET_MODE_UNIT_SIZE (outmode) > GET_MODE_UNIT_SIZE (mode))
3021             eq_value = simplify_gen_unary (ZERO_EXTEND,
3022                                            outmode, eq_value, mode);
3023         }
3024       emit_libcall_block_1 (insns, target, value, eq_value, trapv);
3025
3026       return target;
3027     }
3028
3029   /* It can't be done in this mode.  Can we do it in a wider mode?  */
3030
3031   if (CLASS_HAS_WIDER_MODES_P (mclass))
3032     {
3033       FOR_EACH_WIDER_MODE (wider_mode, mode)
3034         {
3035           if (optab_handler (unoptab, wider_mode) != CODE_FOR_nothing
3036               || optab_libfunc (unoptab, wider_mode))
3037             {
3038               rtx xop0 = op0;
3039               rtx_insn *last = get_last_insn ();
3040
3041               /* For certain operations, we need not actually extend
3042                  the narrow operand, as long as we will truncate the
3043                  results to the same narrowness.  */
3044               xop0 = widen_operand (xop0, wider_mode, mode, unsignedp,
3045                                     (unoptab == neg_optab
3046                                      || unoptab == one_cmpl_optab
3047                                      || unoptab == bswap_optab)
3048                                     && mclass == MODE_INT);
3049
3050               temp = expand_unop (wider_mode, unoptab, xop0, NULL_RTX,
3051                                   unsignedp);
3052
3053               /* If we are generating clz using wider mode, adjust the
3054                  result.  Similarly for clrsb.  */
3055               if ((unoptab == clz_optab || unoptab == clrsb_optab)
3056                   && temp != 0)
3057                 {
3058                   scalar_int_mode wider_int_mode
3059                     = as_a <scalar_int_mode> (wider_mode);
3060                   int_mode = as_a <scalar_int_mode> (mode);
3061                   temp = expand_binop
3062                     (wider_mode, sub_optab, temp,
3063                      gen_int_mode (GET_MODE_PRECISION (wider_int_mode)
3064                                    - GET_MODE_PRECISION (int_mode),
3065                                    wider_int_mode),
3066                      target, true, OPTAB_DIRECT);
3067                 }
3068
3069               /* Likewise for bswap.  */
3070               if (unoptab == bswap_optab && temp != 0)
3071                 {
3072                   scalar_int_mode wider_int_mode
3073                     = as_a <scalar_int_mode> (wider_mode);
3074                   int_mode = as_a <scalar_int_mode> (mode);
3075                   gcc_assert (GET_MODE_PRECISION (wider_int_mode)
3076                               == GET_MODE_BITSIZE (wider_int_mode)
3077                               && GET_MODE_PRECISION (int_mode)
3078                                  == GET_MODE_BITSIZE (int_mode));
3079
3080                   temp = expand_shift (RSHIFT_EXPR, wider_int_mode, temp,
3081                                        GET_MODE_BITSIZE (wider_int_mode)
3082                                        - GET_MODE_BITSIZE (int_mode),
3083                                        NULL_RTX, true);
3084                 }
3085
3086               if (temp)
3087                 {
3088                   if (mclass != MODE_INT)
3089                     {
3090                       if (target == 0)
3091                         target = gen_reg_rtx (mode);
3092                       convert_move (target, temp, 0);
3093                       return target;
3094                     }
3095                   else
3096                     return gen_lowpart (mode, temp);
3097                 }
3098               else
3099                 delete_insns_since (last);
3100             }
3101         }
3102     }
3103
3104   /* One final attempt at implementing negation via subtraction,
3105      this time allowing widening of the operand.  */
3106   if (optab_to_code (unoptab) == NEG && !HONOR_SIGNED_ZEROS (mode))
3107     {
3108       rtx temp;
3109       temp = expand_binop (mode,
3110                            unoptab == negv_optab ? subv_optab : sub_optab,
3111                            CONST0_RTX (mode), op0,
3112                            target, unsignedp, OPTAB_LIB_WIDEN);
3113       if (temp)
3114         return temp;
3115     }
3116
3117   return 0;
3118 }
3119 \f
3120 /* Emit code to compute the absolute value of OP0, with result to
3121    TARGET if convenient.  (TARGET may be 0.)  The return value says
3122    where the result actually is to be found.
3123
3124    MODE is the mode of the operand; the mode of the result is
3125    different but can be deduced from MODE.
3126
3127  */
3128
3129 rtx
3130 expand_abs_nojump (machine_mode mode, rtx op0, rtx target,
3131                    int result_unsignedp)
3132 {
3133   rtx temp;
3134
3135   if (GET_MODE_CLASS (mode) != MODE_INT
3136       || ! flag_trapv)
3137     result_unsignedp = 1;
3138
3139   /* First try to do it with a special abs instruction.  */
3140   temp = expand_unop (mode, result_unsignedp ? abs_optab : absv_optab,
3141                       op0, target, 0);
3142   if (temp != 0)
3143     return temp;
3144
3145   /* For floating point modes, try clearing the sign bit.  */
3146   scalar_float_mode float_mode;
3147   if (is_a <scalar_float_mode> (mode, &float_mode))
3148     {
3149       temp = expand_absneg_bit (ABS, float_mode, op0, target);
3150       if (temp)
3151         return temp;
3152     }
3153
3154   /* If we have a MAX insn, we can do this as MAX (x, -x).  */
3155   if (optab_handler (smax_optab, mode) != CODE_FOR_nothing
3156       && !HONOR_SIGNED_ZEROS (mode))
3157     {
3158       rtx_insn *last = get_last_insn ();
3159
3160       temp = expand_unop (mode, result_unsignedp ? neg_optab : negv_optab,
3161                           op0, NULL_RTX, 0);
3162       if (temp != 0)
3163         temp = expand_binop (mode, smax_optab, op0, temp, target, 0,
3164                              OPTAB_WIDEN);
3165
3166       if (temp != 0)
3167         return temp;
3168
3169       delete_insns_since (last);
3170     }
3171
3172   /* If this machine has expensive jumps, we can do integer absolute
3173      value of X as (((signed) x >> (W-1)) ^ x) - ((signed) x >> (W-1)),
3174      where W is the width of MODE.  */
3175
3176   scalar_int_mode int_mode;
3177   if (is_int_mode (mode, &int_mode)
3178       && BRANCH_COST (optimize_insn_for_speed_p (),
3179                       false) >= 2)
3180     {
3181       rtx extended = expand_shift (RSHIFT_EXPR, int_mode, op0,
3182                                    GET_MODE_PRECISION (int_mode) - 1,
3183                                    NULL_RTX, 0);
3184
3185       temp = expand_binop (int_mode, xor_optab, extended, op0, target, 0,
3186                            OPTAB_LIB_WIDEN);
3187       if (temp != 0)
3188         temp = expand_binop (int_mode,
3189                              result_unsignedp ? sub_optab : subv_optab,
3190                              temp, extended, target, 0, OPTAB_LIB_WIDEN);
3191
3192       if (temp != 0)
3193         return temp;
3194     }
3195
3196   return NULL_RTX;
3197 }
3198
3199 rtx
3200 expand_abs (machine_mode mode, rtx op0, rtx target,
3201             int result_unsignedp, int safe)
3202 {
3203   rtx temp;
3204   rtx_code_label *op1;
3205
3206   if (GET_MODE_CLASS (mode) != MODE_INT
3207       || ! flag_trapv)
3208     result_unsignedp = 1;
3209
3210   temp = expand_abs_nojump (mode, op0, target, result_unsignedp);
3211   if (temp != 0)
3212     return temp;
3213
3214   /* If that does not win, use conditional jump and negate.  */
3215
3216   /* It is safe to use the target if it is the same
3217      as the source if this is also a pseudo register */
3218   if (op0 == target && REG_P (op0)
3219       && REGNO (op0) >= FIRST_PSEUDO_REGISTER)
3220     safe = 1;
3221
3222   op1 = gen_label_rtx ();
3223   if (target == 0 || ! safe
3224       || GET_MODE (target) != mode
3225       || (MEM_P (target) && MEM_VOLATILE_P (target))
3226       || (REG_P (target)
3227           && REGNO (target) < FIRST_PSEUDO_REGISTER))
3228     target = gen_reg_rtx (mode);
3229
3230   emit_move_insn (target, op0);
3231   NO_DEFER_POP;
3232
3233   do_compare_rtx_and_jump (target, CONST0_RTX (mode), GE, 0, mode,
3234                            NULL_RTX, NULL, op1,
3235                            profile_probability::uninitialized ());
3236
3237   op0 = expand_unop (mode, result_unsignedp ? neg_optab : negv_optab,
3238                      target, target, 0);
3239   if (op0 != target)
3240     emit_move_insn (target, op0);
3241   emit_label (op1);
3242   OK_DEFER_POP;
3243   return target;
3244 }
3245
3246 /* Emit code to compute the one's complement absolute value of OP0
3247    (if (OP0 < 0) OP0 = ~OP0), with result to TARGET if convenient.
3248    (TARGET may be NULL_RTX.)  The return value says where the result
3249    actually is to be found.
3250
3251    MODE is the mode of the operand; the mode of the result is
3252    different but can be deduced from MODE.  */
3253
3254 rtx
3255 expand_one_cmpl_abs_nojump (machine_mode mode, rtx op0, rtx target)
3256 {
3257   rtx temp;
3258
3259   /* Not applicable for floating point modes.  */
3260   if (FLOAT_MODE_P (mode))
3261     return NULL_RTX;
3262
3263   /* If we have a MAX insn, we can do this as MAX (x, ~x).  */
3264   if (optab_handler (smax_optab, mode) != CODE_FOR_nothing)
3265     {
3266       rtx_insn *last = get_last_insn ();
3267
3268       temp = expand_unop (mode, one_cmpl_optab, op0, NULL_RTX, 0);
3269       if (temp != 0)
3270         temp = expand_binop (mode, smax_optab, op0, temp, target, 0,
3271                              OPTAB_WIDEN);
3272
3273       if (temp != 0)
3274         return temp;
3275
3276       delete_insns_since (last);
3277     }
3278
3279   /* If this machine has expensive jumps, we can do one's complement
3280      absolute value of X as (((signed) x >> (W-1)) ^ x).  */
3281
3282   scalar_int_mode int_mode;
3283   if (is_int_mode (mode, &int_mode)
3284       && BRANCH_COST (optimize_insn_for_speed_p (),
3285                      false) >= 2)
3286     {
3287       rtx extended = expand_shift (RSHIFT_EXPR, int_mode, op0,
3288                                    GET_MODE_PRECISION (int_mode) - 1,
3289                                    NULL_RTX, 0);
3290
3291       temp = expand_binop (int_mode, xor_optab, extended, op0, target, 0,
3292                            OPTAB_LIB_WIDEN);
3293
3294       if (temp != 0)
3295         return temp;
3296     }
3297
3298   return NULL_RTX;
3299 }
3300
3301 /* A subroutine of expand_copysign, perform the copysign operation using the
3302    abs and neg primitives advertised to exist on the target.  The assumption
3303    is that we have a split register file, and leaving op0 in fp registers,
3304    and not playing with subregs so much, will help the register allocator.  */
3305
3306 static rtx
3307 expand_copysign_absneg (scalar_float_mode mode, rtx op0, rtx op1, rtx target,
3308                         int bitpos, bool op0_is_abs)
3309 {
3310   scalar_int_mode imode;
3311   enum insn_code icode;
3312   rtx sign;
3313   rtx_code_label *label;
3314
3315   if (target == op1)
3316     target = NULL_RTX;
3317
3318   /* Check if the back end provides an insn that handles signbit for the
3319      argument's mode. */
3320   icode = optab_handler (signbit_optab, mode);
3321   if (icode != CODE_FOR_nothing)
3322     {
3323       imode = as_a <scalar_int_mode> (insn_data[(int) icode].operand[0].mode);
3324       sign = gen_reg_rtx (imode);
3325       emit_unop_insn (icode, sign, op1, UNKNOWN);
3326     }
3327   else
3328     {
3329       if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD)
3330         {
3331           if (!int_mode_for_mode (mode).exists (&imode))
3332             return NULL_RTX;
3333           op1 = gen_lowpart (imode, op1);
3334         }
3335       else
3336         {
3337           int word;
3338
3339           imode = word_mode;
3340           if (FLOAT_WORDS_BIG_ENDIAN)
3341             word = (GET_MODE_BITSIZE (mode) - bitpos) / BITS_PER_WORD;
3342           else
3343             word = bitpos / BITS_PER_WORD;
3344           bitpos = bitpos % BITS_PER_WORD;
3345           op1 = operand_subword_force (op1, word, mode);
3346         }
3347
3348       wide_int mask = wi::set_bit_in_zero (bitpos, GET_MODE_PRECISION (imode));
3349       sign = expand_binop (imode, and_optab, op1,
3350                            immed_wide_int_const (mask, imode),
3351                            NULL_RTX, 1, OPTAB_LIB_WIDEN);
3352     }
3353
3354   if (!op0_is_abs)
3355     {
3356       op0 = expand_unop (mode, abs_optab, op0, target, 0);
3357       if (op0 == NULL)
3358         return NULL_RTX;
3359       target = op0;
3360     }
3361   else
3362     {
3363       if (target == NULL_RTX)
3364         target = copy_to_reg (op0);
3365       else
3366         emit_move_insn (target, op0);
3367     }
3368
3369   label = gen_label_rtx ();
3370   emit_cmp_and_jump_insns (sign, const0_rtx, EQ, NULL_RTX, imode, 1, label);
3371
3372   if (CONST_DOUBLE_AS_FLOAT_P (op0))
3373     op0 = simplify_unary_operation (NEG, mode, op0, mode);
3374   else
3375     op0 = expand_unop (mode, neg_optab, op0, target, 0);
3376   if (op0 != target)
3377     emit_move_insn (target, op0);
3378
3379   emit_label (label);
3380
3381   return target;
3382 }
3383
3384
3385 /* A subroutine of expand_copysign, perform the entire copysign operation
3386    with integer bitmasks.  BITPOS is the position of the sign bit; OP0_IS_ABS
3387    is true if op0 is known to have its sign bit clear.  */
3388
3389 static rtx
3390 expand_copysign_bit (scalar_float_mode mode, rtx op0, rtx op1, rtx target,
3391                      int bitpos, bool op0_is_abs)
3392 {
3393   scalar_int_mode imode;
3394   int word, nwords, i;
3395   rtx temp;
3396   rtx_insn *insns;
3397
3398   if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD)
3399     {
3400       if (!int_mode_for_mode (mode).exists (&imode))
3401         return NULL_RTX;
3402       word = 0;
3403       nwords = 1;
3404     }
3405   else
3406     {
3407       imode = word_mode;
3408
3409       if (FLOAT_WORDS_BIG_ENDIAN)
3410         word = (GET_MODE_BITSIZE (mode) - bitpos) / BITS_PER_WORD;
3411       else
3412         word = bitpos / BITS_PER_WORD;
3413       bitpos = bitpos % BITS_PER_WORD;
3414       nwords = (GET_MODE_BITSIZE (mode) + BITS_PER_WORD - 1) / BITS_PER_WORD;
3415     }
3416
3417   wide_int mask = wi::set_bit_in_zero (bitpos, GET_MODE_PRECISION (imode));
3418
3419   if (target == 0
3420       || target == op0
3421       || target == op1
3422       || (nwords > 1 && !valid_multiword_target_p (target)))
3423     target = gen_reg_rtx (mode);
3424
3425   if (nwords > 1)
3426     {
3427       start_sequence ();
3428
3429       for (i = 0; i < nwords; ++i)
3430         {
3431           rtx targ_piece = operand_subword (target, i, 1, mode);
3432           rtx op0_piece = operand_subword_force (op0, i, mode);
3433
3434           if (i == word)
3435             {
3436               if (!op0_is_abs)
3437                 op0_piece
3438                   = expand_binop (imode, and_optab, op0_piece,
3439                                   immed_wide_int_const (~mask, imode),
3440                                   NULL_RTX, 1, OPTAB_LIB_WIDEN);
3441               op1 = expand_binop (imode, and_optab,
3442                                   operand_subword_force (op1, i, mode),
3443                                   immed_wide_int_const (mask, imode),
3444                                   NULL_RTX, 1, OPTAB_LIB_WIDEN);
3445
3446               temp = expand_binop (imode, ior_optab, op0_piece, op1,
3447                                    targ_piece, 1, OPTAB_LIB_WIDEN);
3448               if (temp != targ_piece)
3449                 emit_move_insn (targ_piece, temp);
3450             }
3451           else
3452             emit_move_insn (targ_piece, op0_piece);
3453         }
3454
3455       insns = get_insns ();
3456       end_sequence ();
3457
3458       emit_insn (insns);
3459     }
3460   else
3461     {
3462       op1 = expand_binop (imode, and_optab, gen_lowpart (imode, op1),
3463                           immed_wide_int_const (mask, imode),
3464                           NULL_RTX, 1, OPTAB_LIB_WIDEN);
3465
3466       op0 = gen_lowpart (imode, op0);
3467       if (!op0_is_abs)
3468         op0 = expand_binop (imode, and_optab, op0,
3469                             immed_wide_int_const (~mask, imode),
3470                             NULL_RTX, 1, OPTAB_LIB_WIDEN);
3471
3472       temp = expand_binop (imode, ior_optab, op0, op1,
3473                            gen_lowpart (imode, target), 1, OPTAB_LIB_WIDEN);
3474       target = lowpart_subreg_maybe_copy (mode, temp, imode);
3475     }
3476
3477   return target;
3478 }
3479
3480 /* Expand the C99 copysign operation.  OP0 and OP1 must be the same
3481    scalar floating point mode.  Return NULL if we do not know how to
3482    expand the operation inline.  */
3483
3484 rtx
3485 expand_copysign (rtx op0, rtx op1, rtx target)
3486 {
3487   scalar_float_mode mode;
3488   const struct real_format *fmt;
3489   bool op0_is_abs;
3490   rtx temp;
3491
3492   mode = as_a <scalar_float_mode> (GET_MODE (op0));
3493   gcc_assert (GET_MODE (op1) == mode);
3494
3495   /* First try to do it with a special instruction.  */
3496   temp = expand_binop (mode, copysign_optab, op0, op1,
3497                        target, 0, OPTAB_DIRECT);
3498   if (temp)
3499     return temp;
3500
3501   fmt = REAL_MODE_FORMAT (mode);
3502   if (fmt == NULL || !fmt->has_signed_zero)
3503     return NULL_RTX;
3504
3505   op0_is_abs = false;
3506   if (CONST_DOUBLE_AS_FLOAT_P (op0))
3507     {
3508       if (real_isneg (CONST_DOUBLE_REAL_VALUE (op0)))
3509         op0 = simplify_unary_operation (ABS, mode, op0, mode);
3510       op0_is_abs = true;
3511     }
3512
3513   if (fmt->signbit_ro >= 0
3514       && (CONST_DOUBLE_AS_FLOAT_P (op0) 
3515           || (optab_handler (neg_optab, mode) != CODE_FOR_nothing
3516               && optab_handler (abs_optab, mode) != CODE_FOR_nothing)))
3517     {
3518       temp = expand_copysign_absneg (mode, op0, op1, target,
3519                                      fmt->signbit_ro, op0_is_abs);
3520       if (temp)
3521         return temp;
3522     }
3523
3524   if (fmt->signbit_rw < 0)
3525     return NULL_RTX;
3526   return expand_copysign_bit (mode, op0, op1, target,
3527                               fmt->signbit_rw, op0_is_abs);
3528 }
3529 \f
3530 /* Generate an instruction whose insn-code is INSN_CODE,
3531    with two operands: an output TARGET and an input OP0.
3532    TARGET *must* be nonzero, and the output is always stored there.
3533    CODE is an rtx code such that (CODE OP0) is an rtx that describes
3534    the value that is stored into TARGET.
3535
3536    Return false if expansion failed.  */
3537
3538 bool
3539 maybe_emit_unop_insn (enum insn_code icode, rtx target, rtx op0,
3540                       enum rtx_code code)
3541 {
3542   struct expand_operand ops[2];
3543   rtx_insn *pat;
3544
3545   create_output_operand (&ops[0], target, GET_MODE (target));
3546   create_input_operand (&ops[1], op0, GET_MODE (op0));
3547   pat = maybe_gen_insn (icode, 2, ops);
3548   if (!pat)
3549     return false;
3550
3551   if (INSN_P (pat) && NEXT_INSN (pat) != NULL_RTX
3552       && code != UNKNOWN)
3553     add_equal_note (pat, ops[0].value, code, ops[1].value, NULL_RTX);
3554
3555   emit_insn (pat);
3556
3557   if (ops[0].value != target)
3558     emit_move_insn (target, ops[0].value);
3559   return true;
3560 }
3561 /* Generate an instruction whose insn-code is INSN_CODE,
3562    with two operands: an output TARGET and an input OP0.
3563    TARGET *must* be nonzero, and the output is always stored there.
3564    CODE is an rtx code such that (CODE OP0) is an rtx that describes
3565    the value that is stored into TARGET.  */
3566
3567 void
3568 emit_unop_insn (enum insn_code icode, rtx target, rtx op0, enum rtx_code code)
3569 {
3570   bool ok = maybe_emit_unop_insn (icode, target, op0, code);
3571   gcc_assert (ok);
3572 }
3573 \f
3574 struct no_conflict_data
3575 {
3576   rtx target;
3577   rtx_insn *first, *insn;
3578   bool must_stay;
3579 };
3580
3581 /* Called via note_stores by emit_libcall_block.  Set P->must_stay if
3582    the currently examined clobber / store has to stay in the list of
3583    insns that constitute the actual libcall block.  */
3584 static void
3585 no_conflict_move_test (rtx dest, const_rtx set, void *p0)
3586 {
3587   struct no_conflict_data *p= (struct no_conflict_data *) p0;
3588
3589   /* If this inns directly contributes to setting the target, it must stay.  */
3590   if (reg_overlap_mentioned_p (p->target, dest))
3591     p->must_stay = true;
3592   /* If we haven't committed to keeping any other insns in the list yet,
3593      there is nothing more to check.  */
3594   else if (p->insn == p->first)
3595     return;
3596   /* If this insn sets / clobbers a register that feeds one of the insns
3597      already in the list, this insn has to stay too.  */
3598   else if (reg_overlap_mentioned_p (dest, PATTERN (p->first))
3599            || (CALL_P (p->first) && (find_reg_fusage (p->first, USE, dest)))
3600            || reg_used_between_p (dest, p->first, p->insn)
3601            /* Likewise if this insn depends on a register set by a previous
3602               insn in the list, or if it sets a result (presumably a hard
3603               register) that is set or clobbered by a previous insn.
3604               N.B. the modified_*_p (SET_DEST...) tests applied to a MEM
3605               SET_DEST perform the former check on the address, and the latter
3606               check on the MEM.  */
3607            || (GET_CODE (set) == SET
3608                && (modified_in_p (SET_SRC (set), p->first)
3609                    || modified_in_p (SET_DEST (set), p->first)
3610                    || modified_between_p (SET_SRC (set), p->first, p->insn)
3611                    || modified_between_p (SET_DEST (set), p->first, p->insn))))
3612     p->must_stay = true;
3613 }
3614
3615 \f
3616 /* Emit code to make a call to a constant function or a library call.
3617
3618    INSNS is a list containing all insns emitted in the call.
3619    These insns leave the result in RESULT.  Our block is to copy RESULT
3620    to TARGET, which is logically equivalent to EQUIV.
3621
3622    We first emit any insns that set a pseudo on the assumption that these are
3623    loading constants into registers; doing so allows them to be safely cse'ed
3624    between blocks.  Then we emit all the other insns in the block, followed by
3625    an insn to move RESULT to TARGET.  This last insn will have a REQ_EQUAL
3626    note with an operand of EQUIV.  */
3627
3628 static void
3629 emit_libcall_block_1 (rtx_insn *insns, rtx target, rtx result, rtx equiv,
3630                       bool equiv_may_trap)
3631 {
3632   rtx final_dest = target;
3633   rtx_insn *next, *last, *insn;
3634
3635   /* If this is a reg with REG_USERVAR_P set, then it could possibly turn
3636      into a MEM later.  Protect the libcall block from this change.  */
3637   if (! REG_P (target) || REG_USERVAR_P (target))
3638     target = gen_reg_rtx (GET_MODE (target));
3639
3640   /* If we're using non-call exceptions, a libcall corresponding to an
3641      operation that may trap may also trap.  */
3642   /* ??? See the comment in front of make_reg_eh_region_note.  */
3643   if (cfun->can_throw_non_call_exceptions
3644       && (equiv_may_trap || may_trap_p (equiv)))
3645     {
3646       for (insn = insns; insn; insn = NEXT_INSN (insn))
3647         if (CALL_P (insn))
3648           {
3649             rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
3650             if (note)
3651               {
3652                 int lp_nr = INTVAL (XEXP (note, 0));
3653                 if (lp_nr == 0 || lp_nr == INT_MIN)
3654                   remove_note (insn, note);
3655               }
3656           }
3657     }
3658   else
3659     {
3660       /* Look for any CALL_INSNs in this sequence, and attach a REG_EH_REGION
3661          reg note to indicate that this call cannot throw or execute a nonlocal
3662          goto (unless there is already a REG_EH_REGION note, in which case
3663          we update it).  */
3664       for (insn = insns; insn; insn = NEXT_INSN (insn))
3665         if (CALL_P (insn))
3666           make_reg_eh_region_note_nothrow_nononlocal (insn);
3667     }
3668
3669   /* First emit all insns that set pseudos.  Remove them from the list as
3670      we go.  Avoid insns that set pseudos which were referenced in previous
3671      insns.  These can be generated by move_by_pieces, for example,
3672      to update an address.  Similarly, avoid insns that reference things
3673      set in previous insns.  */
3674
3675   for (insn = insns; insn; insn = next)
3676     {
3677       rtx set = single_set (insn);
3678
3679       next = NEXT_INSN (insn);
3680
3681       if (set != 0 && REG_P (SET_DEST (set))
3682           && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
3683         {
3684           struct no_conflict_data data;
3685
3686           data.target = const0_rtx;
3687           data.first = insns;
3688           data.insn = insn;
3689           data.must_stay = 0;
3690           note_stores (PATTERN (insn), no_conflict_move_test, &data);
3691           if (! data.must_stay)
3692             {
3693               if (PREV_INSN (insn))
3694                 SET_NEXT_INSN (PREV_INSN (insn)) = next;
3695               else
3696                 insns = next;
3697
3698               if (next)
3699                 SET_PREV_INSN (next) = PREV_INSN (insn);
3700
3701               add_insn (insn);
3702             }
3703         }
3704
3705       /* Some ports use a loop to copy large arguments onto the stack.
3706          Don't move anything outside such a loop.  */
3707       if (LABEL_P (insn))
3708         break;
3709     }
3710
3711   /* Write the remaining insns followed by the final copy.  */
3712   for (insn = insns; insn; insn = next)
3713     {
3714       next = NEXT_INSN (insn);
3715
3716       add_insn (insn);
3717     }
3718
3719   last = emit_move_insn (target, result);
3720   if (equiv)
3721     set_dst_reg_note (last, REG_EQUAL, copy_rtx (equiv), target);
3722
3723   if (final_dest != target)
3724     emit_move_insn (final_dest, target);
3725 }
3726
3727 void
3728 emit_libcall_block (rtx_insn *insns, rtx target, rtx result, rtx equiv)
3729 {
3730   emit_libcall_block_1 (insns, target, result, equiv, false);
3731 }
3732 \f
3733 /* Nonzero if we can perform a comparison of mode MODE straightforwardly.
3734    PURPOSE describes how this comparison will be used.  CODE is the rtx
3735    comparison code we will be using.
3736
3737    ??? Actually, CODE is slightly weaker than that.  A target is still
3738    required to implement all of the normal bcc operations, but not
3739    required to implement all (or any) of the unordered bcc operations.  */
3740
3741 int
3742 can_compare_p (enum rtx_code code, machine_mode mode,
3743                enum can_compare_purpose purpose)
3744 {
3745   rtx test;
3746   test = gen_rtx_fmt_ee (code, mode, const0_rtx, const0_rtx);
3747   do
3748     {
3749       enum insn_code icode;
3750
3751       if (purpose == ccp_jump
3752           && (icode = optab_handler (cbranch_optab, mode)) != CODE_FOR_nothing
3753           && insn_operand_matches (icode, 0, test))
3754         return 1;
3755       if (purpose == ccp_store_flag
3756           && (icode = optab_handler (cstore_optab, mode)) != CODE_FOR_nothing
3757           && insn_operand_matches (icode, 1, test))
3758         return 1;
3759       if (purpose == ccp_cmov
3760           && optab_handler (cmov_optab, mode) != CODE_FOR_nothing)
3761         return 1;
3762
3763       mode = GET_MODE_WIDER_MODE (mode).else_void ();
3764       PUT_MODE (test, mode);
3765     }
3766   while (mode != VOIDmode);
3767
3768   return 0;
3769 }
3770
3771 /* This function is called when we are going to emit a compare instruction that
3772    compares the values found in X and Y, using the rtl operator COMPARISON.
3773
3774    If they have mode BLKmode, then SIZE specifies the size of both operands.
3775
3776    UNSIGNEDP nonzero says that the operands are unsigned;
3777    this matters if they need to be widened (as given by METHODS).
3778
3779    *PTEST is where the resulting comparison RTX is returned or NULL_RTX
3780    if we failed to produce one.
3781
3782    *PMODE is the mode of the inputs (in case they are const_int).
3783
3784    This function performs all the setup necessary so that the caller only has
3785    to emit a single comparison insn.  This setup can involve doing a BLKmode
3786    comparison or emitting a library call to perform the comparison if no insn
3787    is available to handle it.
3788    The values which are passed in through pointers can be modified; the caller
3789    should perform the comparison on the modified values.  Constant
3790    comparisons must have already been folded.  */
3791
3792 static void
3793 prepare_cmp_insn (rtx x, rtx y, enum rtx_code comparison, rtx size,
3794                   int unsignedp, enum optab_methods methods,
3795                   rtx *ptest, machine_mode *pmode)
3796 {
3797   machine_mode mode = *pmode;
3798   rtx libfunc, test;
3799   machine_mode cmp_mode;
3800   enum mode_class mclass;
3801
3802   /* The other methods are not needed.  */
3803   gcc_assert (methods == OPTAB_DIRECT || methods == OPTAB_WIDEN
3804               || methods == OPTAB_LIB_WIDEN);
3805
3806   /* If we are optimizing, force expensive constants into a register.  */
3807   if (CONSTANT_P (x) && optimize
3808       && (rtx_cost (x, mode, COMPARE, 0, optimize_insn_for_speed_p ())
3809           > COSTS_N_INSNS (1)))
3810     x = force_reg (mode, x);
3811
3812   if (CONSTANT_P (y) && optimize
3813       && (rtx_cost (y, mode, COMPARE, 1, optimize_insn_for_speed_p ())
3814           > COSTS_N_INSNS (1)))
3815     y = force_reg (mode, y);
3816
3817 #if HAVE_cc0
3818   /* Make sure if we have a canonical comparison.  The RTL
3819      documentation states that canonical comparisons are required only
3820      for targets which have cc0.  */
3821   gcc_assert (!CONSTANT_P (x) || CONSTANT_P (y));
3822 #endif
3823
3824   /* Don't let both operands fail to indicate the mode.  */
3825   if (GET_MODE (x) == VOIDmode && GET_MODE (y) == VOIDmode)
3826     x = force_reg (mode, x);
3827   if (mode == VOIDmode)
3828     mode = GET_MODE (x) != VOIDmode ? GET_MODE (x) : GET_MODE (y);
3829
3830   /* Handle all BLKmode compares.  */
3831
3832   if (mode == BLKmode)
3833     {
3834       machine_mode result_mode;
3835       enum insn_code cmp_code;
3836       rtx result;
3837       rtx opalign
3838         = GEN_INT (MIN (MEM_ALIGN (x), MEM_ALIGN (y)) / BITS_PER_UNIT);
3839
3840       gcc_assert (size);
3841
3842       /* Try to use a memory block compare insn - either cmpstr
3843          or cmpmem will do.  */
3844       opt_scalar_int_mode cmp_mode_iter;
3845       FOR_EACH_MODE_IN_CLASS (cmp_mode_iter, MODE_INT)
3846         {
3847           scalar_int_mode cmp_mode = cmp_mode_iter.require ();
3848           cmp_code = direct_optab_handler (cmpmem_optab, cmp_mode);
3849           if (cmp_code == CODE_FOR_nothing)
3850             cmp_code = direct_optab_handler (cmpstr_optab, cmp_mode);
3851           if (cmp_code == CODE_FOR_nothing)
3852             cmp_code = direct_optab_handler (cmpstrn_optab, cmp_mode);
3853           if (cmp_code == CODE_FOR_nothing)
3854             continue;
3855
3856           /* Must make sure the size fits the insn's mode.  */
3857           if (CONST_INT_P (size)
3858               ? INTVAL (size) >= (1 << GET_MODE_BITSIZE (cmp_mode))
3859               : (GET_MODE_BITSIZE (as_a <scalar_int_mode> (GET_MODE (size)))
3860                  > GET_MODE_BITSIZE (cmp_mode)))
3861             continue;
3862
3863           result_mode = insn_data[cmp_code].operand[0].mode;
3864           result = gen_reg_rtx (result_mode);
3865           size = convert_to_mode (cmp_mode, size, 1);
3866           emit_insn (GEN_FCN (cmp_code) (result, x, y, size, opalign));
3867
3868           *ptest = gen_rtx_fmt_ee (comparison, VOIDmode, result, const0_rtx);
3869           *pmode = result_mode;
3870           return;
3871         }
3872
3873       if (methods != OPTAB_LIB && methods != OPTAB_LIB_WIDEN)
3874         goto fail;
3875
3876       /* Otherwise call a library function.  */
3877       result = emit_block_comp_via_libcall (XEXP (x, 0), XEXP (y, 0), size);
3878
3879       x = result;
3880       y = const0_rtx;
3881       mode = TYPE_MODE (integer_type_node);
3882       methods = OPTAB_LIB_WIDEN;
3883       unsignedp = false;
3884     }
3885
3886   /* Don't allow operands to the compare to trap, as that can put the
3887      compare and branch in different basic blocks.  */
3888   if (cfun->can_throw_non_call_exceptions)
3889     {
3890       if (may_trap_p (x))
3891         x = copy_to_reg (x);
3892       if (may_trap_p (y))
3893         y = copy_to_reg (y);
3894     }
3895
3896   if (GET_MODE_CLASS (mode) == MODE_CC)
3897     {
3898       enum insn_code icode = optab_handler (cbranch_optab, CCmode);
3899       test = gen_rtx_fmt_ee (comparison, VOIDmode, x, y);
3900       gcc_assert (icode != CODE_FOR_nothing
3901                   && insn_operand_matches (icode, 0, test));
3902       *ptest = test;
3903       return;
3904     }
3905
3906   mclass = GET_MODE_CLASS (mode);
3907   test = gen_rtx_fmt_ee (comparison, VOIDmode, x, y);
3908   FOR_EACH_MODE_FROM (cmp_mode, mode)
3909     {
3910       enum insn_code icode;
3911       icode = optab_handler (cbranch_optab, cmp_mode);
3912       if (icode != CODE_FOR_nothing
3913           && insn_operand_matches (icode, 0, test))
3914         {
3915           rtx_insn *last = get_last_insn ();
3916           rtx op0 = prepare_operand (icode, x, 1, mode, cmp_mode, unsignedp);
3917           rtx op1 = prepare_operand (icode, y, 2, mode, cmp_mode, unsignedp);
3918           if (op0 && op1
3919               && insn_operand_matches (icode, 1, op0)
3920               && insn_operand_matches (icode, 2, op1))
3921             {
3922               XEXP (test, 0) = op0;
3923               XEXP (test, 1) = op1;
3924               *ptest = test;
3925               *pmode = cmp_mode;
3926               return;
3927             }
3928           delete_insns_since (last);
3929         }
3930
3931       if (methods == OPTAB_DIRECT || !CLASS_HAS_WIDER_MODES_P (mclass))
3932         break;
3933     }
3934
3935   if (methods != OPTAB_LIB_WIDEN)
3936     goto fail;
3937
3938   if (SCALAR_FLOAT_MODE_P (mode))
3939     {
3940       /* Small trick if UNORDERED isn't implemented by the hardware.  */
3941       if (comparison == UNORDERED && rtx_equal_p (x, y))
3942         {
3943           prepare_cmp_insn (x, y, UNLT, NULL_RTX, unsignedp, OPTAB_WIDEN,
3944                             ptest, pmode);
3945           if (*ptest)
3946             return;
3947         }
3948
3949       prepare_float_lib_cmp (x, y, comparison, ptest, pmode);
3950     }
3951   else
3952     {
3953       rtx result;
3954       machine_mode ret_mode;
3955
3956       /* Handle a libcall just for the mode we are using.  */
3957       libfunc = optab_libfunc (cmp_optab, mode);
3958       gcc_assert (libfunc);
3959
3960       /* If we want unsigned, and this mode has a distinct unsigned
3961          comparison routine, use that.  */
3962       if (unsignedp)
3963         {
3964           rtx ulibfunc = optab_libfunc (ucmp_optab, mode);
3965           if (ulibfunc)
3966             libfunc = ulibfunc;
3967         }
3968
3969       ret_mode = targetm.libgcc_cmp_return_mode ();
3970       result = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
3971                                         ret_mode, x, mode, y, mode);
3972
3973       /* There are two kinds of comparison routines. Biased routines
3974          return 0/1/2, and unbiased routines return -1/0/1. Other parts
3975          of gcc expect that the comparison operation is equivalent
3976          to the modified comparison. For signed comparisons compare the
3977          result against 1 in the biased case, and zero in the unbiased
3978          case. For unsigned comparisons always compare against 1 after
3979          biasing the unbiased result by adding 1. This gives us a way to
3980          represent LTU.
3981          The comparisons in the fixed-point helper library are always
3982          biased.  */
3983       x = result;
3984       y = const1_rtx;
3985
3986       if (!TARGET_LIB_INT_CMP_BIASED && !ALL_FIXED_POINT_MODE_P (mode))
3987         {
3988           if (unsignedp)
3989             x = plus_constant (ret_mode, result, 1);
3990           else
3991             y = const0_rtx;
3992         }
3993
3994       *pmode = ret_mode;
3995       prepare_cmp_insn (x, y, comparison, NULL_RTX, unsignedp, methods,
3996                         ptest, pmode);
3997     }
3998
3999   return;
4000
4001  fail:
4002   *ptest = NULL_RTX;
4003 }
4004
4005 /* Before emitting an insn with code ICODE, make sure that X, which is going
4006    to be used for operand OPNUM of the insn, is converted from mode MODE to
4007    WIDER_MODE (UNSIGNEDP determines whether it is an unsigned conversion), and
4008    that it is accepted by the operand predicate.  Return the new value.  */
4009
4010 rtx
4011 prepare_operand (enum insn_code icode, rtx x, int opnum, machine_mode mode,
4012                  machine_mode wider_mode, int unsignedp)
4013 {
4014   if (mode != wider_mode)
4015     x = convert_modes (wider_mode, mode, x, unsignedp);
4016
4017   if (!insn_operand_matches (icode, opnum, x))
4018     {
4019       machine_mode op_mode = insn_data[(int) icode].operand[opnum].mode;
4020       if (reload_completed)
4021         return NULL_RTX;
4022       if (GET_MODE (x) != op_mode && GET_MODE (x) != VOIDmode)
4023         return NULL_RTX;
4024       x = copy_to_mode_reg (op_mode, x);
4025     }
4026
4027   return x;
4028 }
4029
4030 /* Subroutine of emit_cmp_and_jump_insns; this function is called when we know
4031    we can do the branch.  */
4032
4033 static void
4034 emit_cmp_and_jump_insn_1 (rtx test, machine_mode mode, rtx label,
4035                           profile_probability prob)
4036 {
4037   machine_mode optab_mode;
4038   enum mode_class mclass;
4039   enum insn_code icode;
4040   rtx_insn *insn;
4041
4042   mclass = GET_MODE_CLASS (mode);
4043   optab_mode = (mclass == MODE_CC) ? CCmode : mode;
4044   icode = optab_handler (cbranch_optab, optab_mode);
4045
4046   gcc_assert (icode != CODE_FOR_nothing);
4047   gcc_assert (insn_operand_matches (icode, 0, test));
4048   insn = emit_jump_insn (GEN_FCN (icode) (test, XEXP (test, 0),
4049                                           XEXP (test, 1), label));
4050   if (prob.initialized_p ()
4051       && profile_status_for_fn (cfun) != PROFILE_ABSENT
4052       && insn
4053       && JUMP_P (insn)
4054       && any_condjump_p (insn)
4055       && !find_reg_note (insn, REG_BR_PROB, 0))
4056     add_reg_br_prob_note (insn, prob);
4057 }
4058
4059 /* Generate code to compare X with Y so that the condition codes are
4060    set and to jump to LABEL if the condition is true.  If X is a
4061    constant and Y is not a constant, then the comparison is swapped to
4062    ensure that the comparison RTL has the canonical form.
4063
4064    UNSIGNEDP nonzero says that X and Y are unsigned; this matters if they
4065    need to be widened.  UNSIGNEDP is also used to select the proper
4066    branch condition code.
4067
4068    If X and Y have mode BLKmode, then SIZE specifies the size of both X and Y.
4069
4070    MODE is the mode of the inputs (in case they are const_int).
4071
4072    COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.).
4073    It will be potentially converted into an unsigned variant based on
4074    UNSIGNEDP to select a proper jump instruction.
4075    
4076    PROB is the probability of jumping to LABEL.  */
4077
4078 void
4079 emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_code comparison, rtx size,
4080                          machine_mode mode, int unsignedp, rtx label,
4081                          profile_probability prob)
4082 {
4083   rtx op0 = x, op1 = y;
4084   rtx test;
4085
4086   /* Swap operands and condition to ensure canonical RTL.  */
4087   if (swap_commutative_operands_p (x, y)
4088       && can_compare_p (swap_condition (comparison), mode, ccp_jump))
4089     {
4090       op0 = y, op1 = x;
4091       comparison = swap_condition (comparison);
4092     }
4093
4094   /* If OP0 is still a constant, then both X and Y must be constants
4095      or the opposite comparison is not supported.  Force X into a register
4096      to create canonical RTL.  */
4097   if (CONSTANT_P (op0))
4098     op0 = force_reg (mode, op0);
4099
4100   if (unsignedp)
4101     comparison = unsigned_condition (comparison);
4102
4103   prepare_cmp_insn (op0, op1, comparison, size, unsignedp, OPTAB_LIB_WIDEN,
4104                     &test, &mode);
4105   emit_cmp_and_jump_insn_1 (test, mode, label, prob);
4106 }
4107
4108 \f
4109 /* Emit a library call comparison between floating point X and Y.
4110    COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.).  */
4111
4112 static void
4113 prepare_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison,
4114                        rtx *ptest, machine_mode *pmode)
4115 {
4116   enum rtx_code swapped = swap_condition (comparison);
4117   enum rtx_code reversed = reverse_condition_maybe_unordered (comparison);
4118   machine_mode orig_mode = GET_MODE (x);
4119   machine_mode mode;
4120   rtx true_rtx, false_rtx;
4121   rtx value, target, equiv;
4122   rtx_insn *insns;
4123   rtx libfunc = 0;
4124   bool reversed_p = false;
4125   scalar_int_mode cmp_mode = targetm.libgcc_cmp_return_mode ();
4126
4127   FOR_EACH_MODE_FROM (mode, orig_mode)
4128     {
4129       if (code_to_optab (comparison)
4130           && (libfunc = optab_libfunc (code_to_optab (comparison), mode)))
4131         break;
4132
4133       if (code_to_optab (swapped)
4134           && (libfunc = optab_libfunc (code_to_optab (swapped), mode)))
4135         {
4136           std::swap (x, y);
4137           comparison = swapped;
4138           break;
4139         }
4140
4141       if (code_to_optab (reversed)
4142           && (libfunc = optab_libfunc (code_to_optab (reversed), mode)))
4143         {
4144           comparison = reversed;
4145           reversed_p = true;
4146           break;
4147         }
4148     }
4149
4150   gcc_assert (mode != VOIDmode);
4151
4152   if (mode != orig_mode)
4153     {
4154       x = convert_to_mode (mode, x, 0);
4155       y = convert_to_mode (mode, y, 0);
4156     }
4157
4158   /* Attach a REG_EQUAL note describing the semantics of the libcall to
4159      the RTL.  The allows the RTL optimizers to delete the libcall if the
4160      condition can be determined at compile-time.  */
4161   if (comparison == UNORDERED
4162       || FLOAT_LIB_COMPARE_RETURNS_BOOL (mode, comparison))
4163     {
4164       true_rtx = const_true_rtx;
4165       false_rtx = const0_rtx;
4166     }
4167   else
4168     {
4169       switch (comparison)
4170         {
4171         case EQ:
4172           true_rtx = const0_rtx;
4173           false_rtx = const_true_rtx;
4174           break;
4175
4176         case NE:
4177           true_rtx = const_true_rtx;
4178           false_rtx = const0_rtx;
4179           break;
4180
4181         case GT:
4182           true_rtx = const1_rtx;
4183           false_rtx = const0_rtx;
4184           break;
4185
4186         case GE:
4187           true_rtx = const0_rtx;
4188           false_rtx = constm1_rtx;
4189           break;
4190
4191         case LT:
4192           true_rtx = constm1_rtx;
4193           false_rtx = const0_rtx;
4194           break;
4195
4196         case LE:
4197           true_rtx = const0_rtx;
4198           false_rtx = const1_rtx;
4199           break;
4200
4201         default:
4202           gcc_unreachable ();
4203         }
4204     }
4205
4206   if (comparison == UNORDERED)
4207     {
4208       rtx temp = simplify_gen_relational (NE, cmp_mode, mode, x, x);
4209       equiv = simplify_gen_relational (NE, cmp_mode, mode, y, y);
4210       equiv = simplify_gen_ternary (IF_THEN_ELSE, cmp_mode, cmp_mode,
4211                                     temp, const_true_rtx, equiv);
4212     }
4213   else
4214     {
4215       equiv = simplify_gen_relational (comparison, cmp_mode, mode, x, y);
4216       if (! FLOAT_LIB_COMPARE_RETURNS_BOOL (mode, comparison))
4217         equiv = simplify_gen_ternary (IF_THEN_ELSE, cmp_mode, cmp_mode,
4218                                       equiv, true_rtx, false_rtx);
4219     }
4220
4221   start_sequence ();
4222   value = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
4223                                    cmp_mode, x, mode, y, mode);
4224   insns = get_insns ();
4225   end_sequence ();
4226
4227   target = gen_reg_rtx (cmp_mode);
4228   emit_libcall_block (insns, target, value, equiv);
4229
4230   if (comparison == UNORDERED
4231       || FLOAT_LIB_COMPARE_RETURNS_BOOL (mode, comparison)
4232       || reversed_p)
4233     *ptest = gen_rtx_fmt_ee (reversed_p ? EQ : NE, VOIDmode, target, false_rtx);
4234   else
4235     *ptest = gen_rtx_fmt_ee (comparison, VOIDmode, target, const0_rtx);
4236
4237   *pmode = cmp_mode;
4238 }
4239 \f
4240 /* Generate code to indirectly jump to a location given in the rtx LOC.  */
4241
4242 void
4243 emit_indirect_jump (rtx loc)
4244 {
4245   if (!targetm.have_indirect_jump ())
4246     sorry ("indirect jumps are not available on this target");
4247   else
4248     {
4249       struct expand_operand ops[1];
4250       create_address_operand (&ops[0], loc);
4251       expand_jump_insn (targetm.code_for_indirect_jump, 1, ops);
4252       emit_barrier ();
4253     }
4254 }
4255 \f
4256
4257 /* Emit a conditional move instruction if the machine supports one for that
4258    condition and machine mode.
4259
4260    OP0 and OP1 are the operands that should be compared using CODE.  CMODE is
4261    the mode to use should they be constants.  If it is VOIDmode, they cannot
4262    both be constants.
4263
4264    OP2 should be stored in TARGET if the comparison is true, otherwise OP3
4265    should be stored there.  MODE is the mode to use should they be constants.
4266    If it is VOIDmode, they cannot both be constants.
4267
4268    The result is either TARGET (perhaps modified) or NULL_RTX if the operation
4269    is not supported.  */
4270
4271 rtx
4272 emit_conditional_move (rtx target, enum rtx_code code, rtx op0, rtx op1,
4273                        machine_mode cmode, rtx op2, rtx op3,
4274                        machine_mode mode, int unsignedp)
4275 {
4276   rtx comparison;
4277   rtx_insn *last;
4278   enum insn_code icode;
4279   enum rtx_code reversed;
4280
4281   /* If the two source operands are identical, that's just a move.  */
4282
4283   if (rtx_equal_p (op2, op3))
4284     {
4285       if (!target)
4286         target = gen_reg_rtx (mode);
4287
4288       emit_move_insn (target, op3);
4289       return target;
4290     }
4291
4292   /* If one operand is constant, make it the second one.  Only do this
4293      if the other operand is not constant as well.  */
4294
4295   if (swap_commutative_operands_p (op0, op1))
4296     {
4297       std::swap (op0, op1);
4298       code = swap_condition (code);
4299     }
4300
4301   /* get_condition will prefer to generate LT and GT even if the old
4302      comparison was against zero, so undo that canonicalization here since
4303      comparisons against zero are cheaper.  */
4304   if (code == LT && op1 == const1_rtx)
4305     code = LE, op1 = const0_rtx;
4306   else if (code == GT && op1 == constm1_rtx)
4307     code = GE, op1 = const0_rtx;
4308
4309   if (cmode == VOIDmode)
4310     cmode = GET_MODE (op0);
4311
4312   enum rtx_code orig_code = code;
4313   bool swapped = false;
4314   if (swap_commutative_operands_p (op2, op3)
4315       && ((reversed = reversed_comparison_code_parts (code, op0, op1, NULL))
4316           != UNKNOWN))
4317     {
4318       std::swap (op2, op3);
4319       code = reversed;
4320       swapped = true;
4321     }
4322
4323   if (mode == VOIDmode)
4324     mode = GET_MODE (op2);
4325
4326   icode = direct_optab_handler (movcc_optab, mode);
4327
4328   if (icode == CODE_FOR_nothing)
4329     return NULL_RTX;
4330
4331   if (!target)
4332     target = gen_reg_rtx (mode);
4333
4334   for (int pass = 0; ; pass++)
4335     {
4336       code = unsignedp ? unsigned_condition (code) : code;
4337       comparison = simplify_gen_relational (code, VOIDmode, cmode, op0, op1);
4338
4339       /* We can get const0_rtx or const_true_rtx in some circumstances.  Just
4340          punt and let the caller figure out how best to deal with this
4341          situation.  */
4342       if (COMPARISON_P (comparison))
4343         {
4344           saved_pending_stack_adjust save;
4345           save_pending_stack_adjust (&save);
4346           last = get_last_insn ();
4347           do_pending_stack_adjust ();
4348           machine_mode cmpmode = cmode;
4349           prepare_cmp_insn (XEXP (comparison, 0), XEXP (comparison, 1),
4350                             GET_CODE (comparison), NULL_RTX, unsignedp,
4351                             OPTAB_WIDEN, &comparison, &cmpmode);
4352           if (comparison)
4353             {
4354               struct expand_operand ops[4];
4355
4356               create_output_operand (&ops[0], target, mode);
4357               create_fixed_operand (&ops[1], comparison);
4358               create_input_operand (&ops[2], op2, mode);
4359               create_input_operand (&ops[3], op3, mode);
4360               if (maybe_expand_insn (icode, 4, ops))
4361                 {
4362                   if (ops[0].value != target)
4363                     convert_move (target, ops[0].value, false);
4364                   return target;
4365                 }
4366             }
4367           delete_insns_since (last);
4368           restore_pending_stack_adjust (&save);
4369         }
4370
4371       if (pass == 1)
4372         return NULL_RTX;
4373
4374       /* If the preferred op2/op3 order is not usable, retry with other
4375          operand order, perhaps it will expand successfully.  */
4376       if (swapped)
4377         code = orig_code;
4378       else if ((reversed = reversed_comparison_code_parts (orig_code, op0, op1,
4379                                                            NULL))
4380                != UNKNOWN)
4381         code = reversed;
4382       else
4383         return NULL_RTX;
4384       std::swap (op2, op3);
4385     }
4386 }
4387
4388
4389 /* Emit a conditional negate or bitwise complement using the
4390    negcc or notcc optabs if available.  Return NULL_RTX if such operations
4391    are not available.  Otherwise return the RTX holding the result.
4392    TARGET is the desired destination of the result.  COMP is the comparison
4393    on which to negate.  If COND is true move into TARGET the negation
4394    or bitwise complement of OP1.  Otherwise move OP2 into TARGET.
4395    CODE is either NEG or NOT.  MODE is the machine mode in which the
4396    operation is performed.  */
4397
4398 rtx
4399 emit_conditional_neg_or_complement (rtx target, rtx_code code,
4400                                      machine_mode mode, rtx cond, rtx op1,
4401                                      rtx op2)
4402 {
4403   optab op = unknown_optab;
4404   if (code == NEG)
4405     op = negcc_optab;
4406   else if (code == NOT)
4407     op = notcc_optab;
4408   else
4409     gcc_unreachable ();
4410
4411   insn_code icode = direct_optab_handler (op, mode);
4412
4413   if (icode == CODE_FOR_nothing)
4414     return NULL_RTX;
4415
4416   if (!target)
4417     target = gen_reg_rtx (mode);
4418
4419   rtx_insn *last = get_last_insn ();
4420   struct expand_operand ops[4];
4421
4422   create_output_operand (&ops[0], target, mode);
4423   create_fixed_operand (&ops[1], cond);
4424   create_input_operand (&ops[2], op1, mode);
4425   create_input_operand (&ops[3], op2, mode);
4426
4427   if (maybe_expand_insn (icode, 4, ops))
4428     {
4429       if (ops[0].value != target)
4430         convert_move (target, ops[0].value, false);
4431
4432       return target;
4433     }
4434   delete_insns_since (last);
4435   return NULL_RTX;
4436 }
4437
4438 /* Emit a conditional addition instruction if the machine supports one for that
4439    condition and machine mode.
4440
4441    OP0 and OP1 are the operands that should be compared using CODE.  CMODE is
4442    the mode to use should they be constants.  If it is VOIDmode, they cannot
4443    both be constants.
4444
4445    OP2 should be stored in TARGET if the comparison is false, otherwise OP2+OP3
4446    should be stored there.  MODE is the mode to use should they be constants.
4447    If it is VOIDmode, they cannot both be constants.
4448
4449    The result is either TARGET (perhaps modified) or NULL_RTX if the operation
4450    is not supported.  */
4451
4452 rtx
4453 emit_conditional_add (rtx target, enum rtx_code code, rtx op0, rtx op1,
4454                       machine_mode cmode, rtx op2, rtx op3,
4455                       machine_mode mode, int unsignedp)
4456 {
4457   rtx comparison;
4458   rtx_insn *last;
4459   enum insn_code icode;
4460
4461   /* If one operand is constant, make it the second one.  Only do this
4462      if the other operand is not constant as well.  */
4463
4464   if (swap_commutative_operands_p (op0, op1))
4465     {
4466       std::swap (op0, op1);
4467       code = swap_condition (code);
4468     }
4469
4470   /* get_condition will prefer to generate LT and GT even if the old
4471      comparison was against zero, so undo that canonicalization here since
4472      comparisons against zero are cheaper.  */
4473   if (code == LT && op1 == const1_rtx)
4474     code = LE, op1 = const0_rtx;
4475   else if (code == GT && op1 == constm1_rtx)
4476     code = GE, op1 = const0_rtx;
4477
4478   if (cmode == VOIDmode)
4479     cmode = GET_MODE (op0);
4480
4481   if (mode == VOIDmode)
4482     mode = GET_MODE (op2);
4483
4484   icode = optab_handler (addcc_optab, mode);
4485
4486   if (icode == CODE_FOR_nothing)
4487     return 0;
4488
4489   if (!target)
4490     target = gen_reg_rtx (mode);
4491
4492   code = unsignedp ? unsigned_condition (code) : code;
4493   comparison = simplify_gen_relational (code, VOIDmode, cmode, op0, op1);
4494
4495   /* We can get const0_rtx or const_true_rtx in some circumstances.  Just
4496      return NULL and let the caller figure out how best to deal with this
4497      situation.  */
4498   if (!COMPARISON_P (comparison))
4499     return NULL_RTX;
4500
4501   do_pending_stack_adjust ();
4502   last = get_last_insn ();
4503   prepare_cmp_insn (XEXP (comparison, 0), XEXP (comparison, 1),
4504                     GET_CODE (comparison), NULL_RTX, unsignedp, OPTAB_WIDEN,
4505                     &comparison, &cmode);
4506   if (comparison)
4507     {
4508       struct expand_operand ops[4];
4509
4510       create_output_operand (&ops[0], target, mode);
4511       create_fixed_operand (&ops[1], comparison);
4512       create_input_operand (&ops[2], op2, mode);
4513       create_input_operand (&ops[3], op3, mode);
4514       if (maybe_expand_insn (icode, 4, ops))
4515         {
4516           if (ops[0].value != target)
4517             convert_move (target, ops[0].value, false);
4518           return target;
4519         }
4520     }
4521   delete_insns_since (last);
4522   return NULL_RTX;
4523 }
4524 \f
4525 /* These functions attempt to generate an insn body, rather than
4526    emitting the insn, but if the gen function already emits them, we
4527    make no attempt to turn them back into naked patterns.  */
4528
4529 /* Generate and return an insn body to add Y to X.  */
4530
4531 rtx_insn *
4532 gen_add2_insn (rtx x, rtx y)
4533 {
4534   enum insn_code icode = optab_handler (add_optab, GET_MODE (x));
4535
4536   gcc_assert (insn_operand_matches (icode, 0, x));
4537   gcc_assert (insn_operand_matches (icode, 1, x));
4538   gcc_assert (insn_operand_matches (icode, 2, y));
4539
4540   return GEN_FCN (icode) (x, x, y);
4541 }
4542
4543 /* Generate and return an insn body to add r1 and c,
4544    storing the result in r0.  */
4545
4546 rtx_insn *
4547 gen_add3_insn (rtx r0, rtx r1, rtx c)
4548 {
4549   enum insn_code icode = optab_handler (add_optab, GET_MODE (r0));
4550
4551   if (icode == CODE_FOR_nothing
4552       || !insn_operand_matches (icode, 0, r0)
4553       || !insn_operand_matches (icode, 1, r1)
4554       || !insn_operand_matches (icode, 2, c))
4555     return NULL;
4556
4557   return GEN_FCN (icode) (r0, r1, c);
4558 }
4559
4560 int
4561 have_add2_insn (rtx x, rtx y)
4562 {
4563   enum insn_code icode;
4564
4565   gcc_assert (GET_MODE (x) != VOIDmode);
4566
4567   icode = optab_handler (add_optab, GET_MODE (x));
4568
4569   if (icode == CODE_FOR_nothing)
4570     return 0;
4571
4572   if (!insn_operand_matches (icode, 0, x)
4573       || !insn_operand_matches (icode, 1, x)
4574       || !insn_operand_matches (icode, 2, y))
4575     return 0;
4576
4577   return 1;
4578 }
4579
4580 /* Generate and return an insn body to add Y to X.  */
4581
4582 rtx_insn *
4583 gen_addptr3_insn (rtx x, rtx y, rtx z)
4584 {
4585   enum insn_code icode = optab_handler (addptr3_optab, GET_MODE (x));
4586
4587   gcc_assert (insn_operand_matches (icode, 0, x));
4588   gcc_assert (insn_operand_matches (icode, 1, y));
4589   gcc_assert (insn_operand_matches (icode, 2, z));
4590
4591   return GEN_FCN (icode) (x, y, z);
4592 }
4593
4594 /* Return true if the target implements an addptr pattern and X, Y,
4595    and Z are valid for the pattern predicates.  */
4596
4597 int
4598 have_addptr3_insn (rtx x, rtx y, rtx z)
4599 {
4600   enum insn_code icode;
4601
4602   gcc_assert (GET_MODE (x) != VOIDmode);
4603
4604   icode = optab_handler (addptr3_optab, GET_MODE (x));
4605
4606   if (icode == CODE_FOR_nothing)
4607     return 0;
4608
4609   if (!insn_operand_matches (icode, 0, x)
4610       || !insn_operand_matches (icode, 1, y)
4611       || !insn_operand_matches (icode, 2, z))
4612     return 0;
4613
4614   return 1;
4615 }
4616
4617 /* Generate and return an insn body to subtract Y from X.  */
4618
4619 rtx_insn *
4620 gen_sub2_insn (rtx x, rtx y)
4621 {
4622   enum insn_code icode = optab_handler (sub_optab, GET_MODE (x));
4623
4624   gcc_assert (insn_operand_matches (icode, 0, x));
4625   gcc_assert (insn_operand_matches (icode, 1, x));
4626   gcc_assert (insn_operand_matches (icode, 2, y));
4627
4628   return GEN_FCN (icode) (x, x, y);
4629 }
4630
4631 /* Generate and return an insn body to subtract r1 and c,
4632    storing the result in r0.  */
4633
4634 rtx_insn *
4635 gen_sub3_insn (rtx r0, rtx r1, rtx c)
4636 {
4637   enum insn_code icode = optab_handler (sub_optab, GET_MODE (r0));
4638
4639   if (icode == CODE_FOR_nothing
4640       || !insn_operand_matches (icode, 0, r0)
4641       || !insn_operand_matches (icode, 1, r1)
4642       || !insn_operand_matches (icode, 2, c))
4643     return NULL;
4644
4645   return GEN_FCN (icode) (r0, r1, c);
4646 }
4647
4648 int
4649 have_sub2_insn (rtx x, rtx y)
4650 {
4651   enum insn_code icode;
4652
4653   gcc_assert (GET_MODE (x) != VOIDmode);
4654
4655   icode = optab_handler (sub_optab, GET_MODE (x));
4656
4657   if (icode == CODE_FOR_nothing)
4658     return 0;
4659
4660   if (!insn_operand_matches (icode, 0, x)
4661       || !insn_operand_matches (icode, 1, x)
4662       || !insn_operand_matches (icode, 2, y))
4663     return 0;
4664
4665   return 1;
4666 }
4667 \f
4668 /* Generate the body of an insn to extend Y (with mode MFROM)
4669    into X (with mode MTO).  Do zero-extension if UNSIGNEDP is nonzero.  */
4670
4671 rtx_insn *
4672 gen_extend_insn (rtx x, rtx y, machine_mode mto,
4673                  machine_mode mfrom, int unsignedp)
4674 {
4675   enum insn_code icode = can_extend_p (mto, mfrom, unsignedp);
4676   return GEN_FCN (icode) (x, y);
4677 }
4678 \f
4679 /* Generate code to convert FROM to floating point
4680    and store in TO.  FROM must be fixed point and not VOIDmode.
4681    UNSIGNEDP nonzero means regard FROM as unsigned.
4682    Normally this is done by correcting the final value
4683    if it is negative.  */
4684
4685 void
4686 expand_float (rtx to, rtx from, int unsignedp)
4687 {
4688   enum insn_code icode;
4689   rtx target = to;
4690   scalar_mode from_mode, to_mode;
4691   machine_mode fmode, imode;
4692   bool can_do_signed = false;
4693
4694   /* Crash now, because we won't be able to decide which mode to use.  */
4695   gcc_assert (GET_MODE (from) != VOIDmode);
4696
4697   /* Look for an insn to do the conversion.  Do it in the specified
4698      modes if possible; otherwise convert either input, output or both to
4699      wider mode.  If the integer mode is wider than the mode of FROM,
4700      we can do the conversion signed even if the input is unsigned.  */
4701
4702   FOR_EACH_MODE_FROM (fmode, GET_MODE (to))
4703     FOR_EACH_MODE_FROM (imode, GET_MODE (from))
4704       {
4705         int doing_unsigned = unsignedp;
4706
4707         if (fmode != GET_MODE (to)
4708             && (significand_size (fmode)
4709                 < GET_MODE_UNIT_PRECISION (GET_MODE (from))))
4710           continue;
4711
4712         icode = can_float_p (fmode, imode, unsignedp);
4713         if (icode == CODE_FOR_nothing && unsignedp)
4714           {
4715             enum insn_code scode = can_float_p (fmode, imode, 0);
4716             if (scode != CODE_FOR_nothing)
4717               can_do_signed = true;
4718             if (imode != GET_MODE (from))
4719               icode = scode, doing_unsigned = 0;
4720           }
4721
4722         if (icode != CODE_FOR_nothing)
4723           {
4724             if (imode != GET_MODE (from))
4725               from = convert_to_mode (imode, from, unsignedp);
4726
4727             if (fmode != GET_MODE (to))
4728               target = gen_reg_rtx (fmode);
4729
4730             emit_unop_insn (icode, target, from,
4731                             doing_unsigned ? UNSIGNED_FLOAT : FLOAT);
4732
4733             if (target != to)
4734               convert_move (to, target, 0);
4735             return;
4736           }
4737       }
4738
4739   /* Unsigned integer, and no way to convert directly.  Convert as signed,
4740      then unconditionally adjust the result.  */
4741   if (unsignedp
4742       && can_do_signed
4743       && is_a <scalar_mode> (GET_MODE (to), &to_mode)
4744       && is_a <scalar_mode> (GET_MODE (from), &from_mode))
4745     {
4746       opt_scalar_mode fmode_iter;
4747       rtx_code_label *label = gen_label_rtx ();
4748       rtx temp;
4749       REAL_VALUE_TYPE offset;
4750
4751       /* Look for a usable floating mode FMODE wider than the source and at
4752          least as wide as the target.  Using FMODE will avoid rounding woes
4753          with unsigned values greater than the signed maximum value.  */
4754
4755       FOR_EACH_MODE_FROM (fmode_iter, to_mode)
4756         {
4757           scalar_mode fmode = fmode_iter.require ();
4758           if (GET_MODE_PRECISION (from_mode) < GET_MODE_BITSIZE (fmode)
4759               && can_float_p (fmode, from_mode, 0) != CODE_FOR_nothing)
4760             break;
4761         }
4762
4763       if (!fmode_iter.exists (&fmode))
4764         {
4765           /* There is no such mode.  Pretend the target is wide enough.  */
4766           fmode = to_mode;
4767
4768           /* Avoid double-rounding when TO is narrower than FROM.  */
4769           if ((significand_size (fmode) + 1)
4770               < GET_MODE_PRECISION (from_mode))
4771             {
4772               rtx temp1;
4773               rtx_code_label *neglabel = gen_label_rtx ();
4774
4775               /* Don't use TARGET if it isn't a register, is a hard register,
4776                  or is the wrong mode.  */
4777               if (!REG_P (target)
4778                   || REGNO (target) < FIRST_PSEUDO_REGISTER
4779                   || GET_MODE (target) != fmode)
4780                 target = gen_reg_rtx (fmode);
4781
4782               imode = from_mode;
4783               do_pending_stack_adjust ();
4784
4785               /* Test whether the sign bit is set.  */
4786               emit_cmp_and_jump_insns (from, const0_rtx, LT, NULL_RTX, imode,
4787                                        0, neglabel);
4788
4789               /* The sign bit is not set.  Convert as signed.  */
4790               expand_float (target, from, 0);
4791               emit_jump_insn (targetm.gen_jump (label));
4792               emit_barrier ();
4793
4794               /* The sign bit is set.
4795                  Convert to a usable (positive signed) value by shifting right
4796                  one bit, while remembering if a nonzero bit was shifted
4797                  out; i.e., compute  (from & 1) | (from >> 1).  */
4798
4799               emit_label (neglabel);
4800               temp = expand_binop (imode, and_optab, from, const1_rtx,
4801                                    NULL_RTX, 1, OPTAB_LIB_WIDEN);
4802               temp1 = expand_shift (RSHIFT_EXPR, imode, from, 1, NULL_RTX, 1);
4803               temp = expand_binop (imode, ior_optab, temp, temp1, temp, 1,
4804                                    OPTAB_LIB_WIDEN);
4805               expand_float (target, temp, 0);
4806
4807               /* Multiply by 2 to undo the shift above.  */
4808               temp = expand_binop (fmode, add_optab, target, target,
4809                                    target, 0, OPTAB_LIB_WIDEN);
4810               if (temp != target)
4811                 emit_move_insn (target, temp);
4812
4813               do_pending_stack_adjust ();
4814               emit_label (label);
4815               goto done;
4816             }
4817         }
4818
4819       /* If we are about to do some arithmetic to correct for an
4820          unsigned operand, do it in a pseudo-register.  */
4821
4822       if (to_mode != fmode
4823           || !REG_P (to) || REGNO (to) < FIRST_PSEUDO_REGISTER)
4824         target = gen_reg_rtx (fmode);
4825
4826       /* Convert as signed integer to floating.  */
4827       expand_float (target, from, 0);
4828
4829       /* If FROM is negative (and therefore TO is negative),
4830          correct its value by 2**bitwidth.  */
4831
4832       do_pending_stack_adjust ();
4833       emit_cmp_and_jump_insns (from, const0_rtx, GE, NULL_RTX, from_mode,
4834                                0, label);
4835
4836
4837       real_2expN (&offset, GET_MODE_PRECISION (from_mode), fmode);
4838       temp = expand_binop (fmode, add_optab, target,
4839                            const_double_from_real_value (offset, fmode),
4840                            target, 0, OPTAB_LIB_WIDEN);
4841       if (temp != target)
4842         emit_move_insn (target, temp);
4843
4844       do_pending_stack_adjust ();
4845       emit_label (label);
4846       goto done;
4847     }
4848
4849   /* No hardware instruction available; call a library routine.  */
4850     {
4851       rtx libfunc;
4852       rtx_insn *insns;
4853       rtx value;
4854       convert_optab tab = unsignedp ? ufloat_optab : sfloat_optab;
4855
4856       if (is_narrower_int_mode (GET_MODE (from), SImode))
4857         from = convert_to_mode (SImode, from, unsignedp);
4858
4859       libfunc = convert_optab_libfunc (tab, GET_MODE (to), GET_MODE (from));
4860       gcc_assert (libfunc);
4861
4862       start_sequence ();
4863
4864       value = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
4865                                        GET_MODE (to), from, GET_MODE (from));
4866       insns = get_insns ();
4867       end_sequence ();
4868
4869       emit_libcall_block (insns, target, value,
4870                           gen_rtx_fmt_e (unsignedp ? UNSIGNED_FLOAT : FLOAT,
4871                                          GET_MODE (to), from));
4872     }
4873
4874  done:
4875
4876   /* Copy result to requested destination
4877      if we have been computing in a temp location.  */
4878
4879   if (target != to)
4880     {
4881       if (GET_MODE (target) == GET_MODE (to))
4882         emit_move_insn (to, target);
4883       else
4884         convert_move (to, target, 0);
4885     }
4886 }
4887 \f
4888 /* Generate code to convert FROM to fixed point and store in TO.  FROM
4889    must be floating point.  */
4890
4891 void
4892 expand_fix (rtx to, rtx from, int unsignedp)
4893 {
4894   enum insn_code icode;
4895   rtx target = to;
4896   machine_mode fmode, imode;
4897   opt_scalar_mode fmode_iter;
4898   bool must_trunc = false;
4899
4900   /* We first try to find a pair of modes, one real and one integer, at
4901      least as wide as FROM and TO, respectively, in which we can open-code
4902      this conversion.  If the integer mode is wider than the mode of TO,
4903      we can do the conversion either signed or unsigned.  */
4904
4905   FOR_EACH_MODE_FROM (fmode, GET_MODE (from))
4906     FOR_EACH_MODE_FROM (imode, GET_MODE (to))
4907       {
4908         int doing_unsigned = unsignedp;
4909
4910         icode = can_fix_p (imode, fmode, unsignedp, &must_trunc);
4911         if (icode == CODE_FOR_nothing && imode != GET_MODE (to) && unsignedp)
4912           icode = can_fix_p (imode, fmode, 0, &must_trunc), doing_unsigned = 0;
4913
4914         if (icode != CODE_FOR_nothing)
4915           {
4916             rtx_insn *last = get_last_insn ();
4917             if (fmode != GET_MODE (from))
4918               from = convert_to_mode (fmode, from, 0);
4919
4920             if (must_trunc)
4921               {
4922                 rtx temp = gen_reg_rtx (GET_MODE (from));
4923                 from = expand_unop (GET_MODE (from), ftrunc_optab, from,
4924                                     temp, 0);
4925               }
4926
4927             if (imode != GET_MODE (to))
4928               target = gen_reg_rtx (imode);
4929
4930             if (maybe_emit_unop_insn (icode, target, from,
4931                                       doing_unsigned ? UNSIGNED_FIX : FIX))
4932               {
4933                 if (target != to)
4934                   convert_move (to, target, unsignedp);
4935                 return;
4936               }
4937             delete_insns_since (last);
4938           }
4939       }
4940
4941   /* For an unsigned conversion, there is one more way to do it.
4942      If we have a signed conversion, we generate code that compares
4943      the real value to the largest representable positive number.  If if
4944      is smaller, the conversion is done normally.  Otherwise, subtract
4945      one plus the highest signed number, convert, and add it back.
4946
4947      We only need to check all real modes, since we know we didn't find
4948      anything with a wider integer mode.
4949
4950      This code used to extend FP value into mode wider than the destination.
4951      This is needed for decimal float modes which cannot accurately
4952      represent one plus the highest signed number of the same size, but
4953      not for binary modes.  Consider, for instance conversion from SFmode
4954      into DImode.
4955
4956      The hot path through the code is dealing with inputs smaller than 2^63
4957      and doing just the conversion, so there is no bits to lose.
4958
4959      In the other path we know the value is positive in the range 2^63..2^64-1
4960      inclusive.  (as for other input overflow happens and result is undefined)
4961      So we know that the most important bit set in mantissa corresponds to
4962      2^63.  The subtraction of 2^63 should not generate any rounding as it
4963      simply clears out that bit.  The rest is trivial.  */
4964
4965   scalar_int_mode to_mode;
4966   if (unsignedp
4967       && is_a <scalar_int_mode> (GET_MODE (to), &to_mode)
4968       && HWI_COMPUTABLE_MODE_P (to_mode))
4969     FOR_EACH_MODE_FROM (fmode_iter, as_a <scalar_mode> (GET_MODE (from)))
4970       {
4971         scalar_mode fmode = fmode_iter.require ();
4972         if (CODE_FOR_nothing != can_fix_p (to_mode, fmode,
4973                                            0, &must_trunc)
4974             && (!DECIMAL_FLOAT_MODE_P (fmode)
4975                 || (GET_MODE_BITSIZE (fmode) > GET_MODE_PRECISION (to_mode))))
4976           {
4977             int bitsize;
4978             REAL_VALUE_TYPE offset;
4979             rtx limit;
4980             rtx_code_label *lab1, *lab2;
4981             rtx_insn *insn;
4982
4983             bitsize = GET_MODE_PRECISION (to_mode);
4984             real_2expN (&offset, bitsize - 1, fmode);
4985             limit = const_double_from_real_value (offset, fmode);
4986             lab1 = gen_label_rtx ();
4987             lab2 = gen_label_rtx ();
4988
4989             if (fmode != GET_MODE (from))
4990               from = convert_to_mode (fmode, from, 0);
4991
4992             /* See if we need to do the subtraction.  */
4993             do_pending_stack_adjust ();
4994             emit_cmp_and_jump_insns (from, limit, GE, NULL_RTX,
4995                                      GET_MODE (from), 0, lab1);
4996
4997             /* If not, do the signed "fix" and branch around fixup code.  */
4998             expand_fix (to, from, 0);
4999             emit_jump_insn (targetm.gen_jump (lab2));
5000             emit_barrier ();
5001
5002             /* Otherwise, subtract 2**(N-1), convert to signed number,
5003                then add 2**(N-1).  Do the addition using XOR since this
5004                will often generate better code.  */
5005             emit_label (lab1);
5006             target = expand_binop (GET_MODE (from), sub_optab, from, limit,
5007                                    NULL_RTX, 0, OPTAB_LIB_WIDEN);
5008             expand_fix (to, target, 0);
5009             target = expand_binop (to_mode, xor_optab, to,
5010                                    gen_int_mode
5011                                    (HOST_WIDE_INT_1 << (bitsize - 1),
5012                                     to_mode),
5013                                    to, 1, OPTAB_LIB_WIDEN);
5014
5015             if (target != to)
5016               emit_move_insn (to, target);
5017
5018             emit_label (lab2);
5019
5020             if (optab_handler (mov_optab, to_mode) != CODE_FOR_nothing)
5021               {
5022                 /* Make a place for a REG_NOTE and add it.  */
5023                 insn = emit_move_insn (to, to);
5024                 set_dst_reg_note (insn, REG_EQUAL,
5025                                   gen_rtx_fmt_e (UNSIGNED_FIX, to_mode,
5026                                                  copy_rtx (from)),
5027                                   to);
5028               }
5029
5030             return;
5031           }
5032       }
5033
5034   /* We can't do it with an insn, so use a library call.  But first ensure
5035      that the mode of TO is at least as wide as SImode, since those are the
5036      only library calls we know about.  */
5037
5038   if (is_narrower_int_mode (GET_MODE (to), SImode))
5039     {
5040       target = gen_reg_rtx (SImode);
5041
5042       expand_fix (target, from, unsignedp);
5043     }
5044   else
5045     {
5046       rtx_insn *insns;
5047       rtx value;
5048       rtx libfunc;
5049
5050       convert_optab tab = unsignedp ? ufix_optab : sfix_optab;
5051       libfunc = convert_optab_libfunc (tab, GET_MODE (to), GET_MODE (from));
5052       gcc_assert (libfunc);
5053
5054       start_sequence ();
5055
5056       value = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
5057                                        GET_MODE (to), from, GET_MODE (from));
5058       insns = get_insns ();
5059       end_sequence ();
5060
5061       emit_libcall_block (insns, target, value,
5062                           gen_rtx_fmt_e (unsignedp ? UNSIGNED_FIX : FIX,
5063                                          GET_MODE (to), from));
5064     }
5065
5066   if (target != to)
5067     {
5068       if (GET_MODE (to) == GET_MODE (target))
5069         emit_move_insn (to, target);
5070       else
5071         convert_move (to, target, 0);
5072     }
5073 }
5074
5075
5076 /* Promote integer arguments for a libcall if necessary.
5077    emit_library_call_value cannot do the promotion because it does not
5078    know if it should do a signed or unsigned promotion.  This is because
5079    there are no tree types defined for libcalls.  */
5080
5081 static rtx
5082 prepare_libcall_arg (rtx arg, int uintp)
5083 {
5084   scalar_int_mode mode;
5085   machine_mode arg_mode;
5086   if (is_a <scalar_int_mode> (GET_MODE (arg), &mode))
5087     {
5088       /*  If we need to promote the integer function argument we need to do
5089           it here instead of inside emit_library_call_value because in
5090           emit_library_call_value we don't know if we should do a signed or
5091           unsigned promotion.  */
5092
5093       int unsigned_p = 0;
5094       arg_mode = promote_function_mode (NULL_TREE, mode,
5095                                         &unsigned_p, NULL_TREE, 0);
5096       if (arg_mode != mode)
5097         return convert_to_mode (arg_mode, arg, uintp);
5098     }
5099     return arg;
5100 }
5101
5102 /* Generate code to convert FROM or TO a fixed-point.
5103    If UINTP is true, either TO or FROM is an unsigned integer.
5104    If SATP is true, we need to saturate the result.  */
5105
5106 void
5107 expand_fixed_convert (rtx to, rtx from, int uintp, int satp)
5108 {
5109   machine_mode to_mode = GET_MODE (to);
5110   machine_mode from_mode = GET_MODE (from);
5111   convert_optab tab;
5112   enum rtx_code this_code;
5113   enum insn_code code;
5114   rtx_insn *insns;
5115   rtx value;
5116   rtx libfunc;
5117
5118   if (to_mode == from_mode)
5119     {
5120       emit_move_insn (to, from);
5121       return;
5122     }
5123
5124   if (uintp)
5125     {
5126       tab = satp ? satfractuns_optab : fractuns_optab;
5127       this_code = satp ? UNSIGNED_SAT_FRACT : UNSIGNED_FRACT_CONVERT;
5128     }
5129   else
5130     {
5131       tab = satp ? satfract_optab : fract_optab;
5132       this_code = satp ? SAT_FRACT : FRACT_CONVERT;
5133     }
5134   code = convert_optab_handler (tab, to_mode, from_mode);
5135   if (code != CODE_FOR_nothing)
5136     {
5137       emit_unop_insn (code, to, from, this_code);
5138       return;
5139     }
5140
5141   libfunc = convert_optab_libfunc (tab, to_mode, from_mode);
5142   gcc_assert (libfunc);
5143
5144   from = prepare_libcall_arg (from, uintp);
5145   from_mode = GET_MODE (from);
5146
5147   start_sequence ();
5148   value = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST, to_mode,
5149                                    from, from_mode);
5150   insns = get_insns ();
5151   end_sequence ();
5152
5153   emit_libcall_block (insns, to, value,
5154                       gen_rtx_fmt_e (optab_to_code (tab), to_mode, from));
5155 }
5156
5157 /* Generate code to convert FROM to fixed point and store in TO.  FROM
5158    must be floating point, TO must be signed.  Use the conversion optab
5159    TAB to do the conversion.  */
5160
5161 bool
5162 expand_sfix_optab (rtx to, rtx from, convert_optab tab)
5163 {
5164   enum insn_code icode;
5165   rtx target = to;
5166   machine_mode fmode, imode;
5167
5168   /* We first try to find a pair of modes, one real and one integer, at
5169      least as wide as FROM and TO, respectively, in which we can open-code
5170      this conversion.  If the integer mode is wider than the mode of TO,
5171      we can do the conversion either signed or unsigned.  */
5172
5173   FOR_EACH_MODE_FROM (fmode, GET_MODE (from))
5174     FOR_EACH_MODE_FROM (imode, GET_MODE (to))
5175       {
5176         icode = convert_optab_handler (tab, imode, fmode);
5177         if (icode != CODE_FOR_nothing)
5178           {
5179             rtx_insn *last = get_last_insn ();
5180             if (fmode != GET_MODE (from))
5181               from = convert_to_mode (fmode, from, 0);
5182
5183             if (imode != GET_MODE (to))
5184               target = gen_reg_rtx (imode);
5185
5186             if (!maybe_emit_unop_insn (icode, target, from, UNKNOWN))
5187               {
5188                 delete_insns_since (last);
5189                 continue;
5190               }
5191             if (target != to)
5192               convert_move (to, target, 0);
5193             return true;
5194           }
5195       }
5196
5197   return false;
5198 }
5199 \f
5200 /* Report whether we have an instruction to perform the operation
5201    specified by CODE on operands of mode MODE.  */
5202 int
5203 have_insn_for (enum rtx_code code, machine_mode mode)
5204 {
5205   return (code_to_optab (code)
5206           && (optab_handler (code_to_optab (code), mode)
5207               != CODE_FOR_nothing));
5208 }
5209
5210 /* Print information about the current contents of the optabs on
5211    STDERR.  */
5212
5213 DEBUG_FUNCTION void
5214 debug_optab_libfuncs (void)
5215 {
5216   int i, j, k;
5217
5218   /* Dump the arithmetic optabs.  */
5219   for (i = FIRST_NORM_OPTAB; i <= LAST_NORMLIB_OPTAB; ++i)
5220     for (j = 0; j < NUM_MACHINE_MODES; ++j)
5221       {
5222         rtx l = optab_libfunc ((optab) i, (machine_mode) j);
5223         if (l)
5224           {
5225             gcc_assert (GET_CODE (l) == SYMBOL_REF);
5226             fprintf (stderr, "%s\t%s:\t%s\n",
5227                      GET_RTX_NAME (optab_to_code ((optab) i)),
5228                      GET_MODE_NAME (j),
5229                      XSTR (l, 0));
5230           }
5231       }
5232
5233   /* Dump the conversion optabs.  */
5234   for (i = FIRST_CONV_OPTAB; i <= LAST_CONVLIB_OPTAB; ++i)
5235     for (j = 0; j < NUM_MACHINE_MODES; ++j)
5236       for (k = 0; k < NUM_MACHINE_MODES; ++k)
5237         {
5238           rtx l = convert_optab_libfunc ((optab) i, (machine_mode) j,
5239                                          (machine_mode) k);
5240           if (l)
5241             {
5242               gcc_assert (GET_CODE (l) == SYMBOL_REF);
5243               fprintf (stderr, "%s\t%s\t%s:\t%s\n",
5244                        GET_RTX_NAME (optab_to_code ((optab) i)),
5245                        GET_MODE_NAME (j),
5246                        GET_MODE_NAME (k),
5247                        XSTR (l, 0));
5248             }
5249         }
5250 }
5251
5252 /* Generate insns to trap with code TCODE if OP1 and OP2 satisfy condition
5253    CODE.  Return 0 on failure.  */
5254
5255 rtx_insn *
5256 gen_cond_trap (enum rtx_code code, rtx op1, rtx op2, rtx tcode)
5257 {
5258   machine_mode mode = GET_MODE (op1);
5259   enum insn_code icode;
5260   rtx_insn *insn;
5261   rtx trap_rtx;
5262
5263   if (mode == VOIDmode)
5264     return 0;
5265
5266   icode = optab_handler (ctrap_optab, mode);
5267   if (icode == CODE_FOR_nothing)
5268     return 0;
5269
5270   /* Some targets only accept a zero trap code.  */
5271   if (!insn_operand_matches (icode, 3, tcode))
5272     return 0;
5273
5274   do_pending_stack_adjust ();
5275   start_sequence ();
5276   prepare_cmp_insn (op1, op2, code, NULL_RTX, false, OPTAB_DIRECT,
5277                     &trap_rtx, &mode);
5278   if (!trap_rtx)
5279     insn = NULL;
5280   else
5281     insn = GEN_FCN (icode) (trap_rtx, XEXP (trap_rtx, 0), XEXP (trap_rtx, 1),
5282                             tcode);
5283
5284   /* If that failed, then give up.  */
5285   if (insn == 0)
5286     {
5287       end_sequence ();
5288       return 0;
5289     }
5290
5291   emit_insn (insn);
5292   insn = get_insns ();
5293   end_sequence ();
5294   return insn;
5295 }
5296
5297 /* Return rtx code for TCODE. Use UNSIGNEDP to select signed
5298    or unsigned operation code.  */
5299
5300 enum rtx_code
5301 get_rtx_code (enum tree_code tcode, bool unsignedp)
5302 {
5303   enum rtx_code code;
5304   switch (tcode)
5305     {
5306     case EQ_EXPR:
5307       code = EQ;
5308       break;
5309     case NE_EXPR:
5310       code = NE;
5311       break;
5312     case LT_EXPR:
5313       code = unsignedp ? LTU : LT;
5314       break;
5315     case LE_EXPR:
5316       code = unsignedp ? LEU : LE;
5317       break;
5318     case GT_EXPR:
5319       code = unsignedp ? GTU : GT;
5320       break;
5321     case GE_EXPR:
5322       code = unsignedp ? GEU : GE;
5323       break;
5324
5325     case UNORDERED_EXPR:
5326       code = UNORDERED;
5327       break;
5328     case ORDERED_EXPR:
5329       code = ORDERED;
5330       break;
5331     case UNLT_EXPR:
5332       code = UNLT;
5333       break;
5334     case UNLE_EXPR:
5335       code = UNLE;
5336       break;
5337     case UNGT_EXPR:
5338       code = UNGT;
5339       break;
5340     case UNGE_EXPR:
5341       code = UNGE;
5342       break;
5343     case UNEQ_EXPR:
5344       code = UNEQ;
5345       break;
5346     case LTGT_EXPR:
5347       code = LTGT;
5348       break;
5349
5350     case BIT_AND_EXPR:
5351       code = AND;
5352       break;
5353
5354     case BIT_IOR_EXPR:
5355       code = IOR;
5356       break;
5357
5358     default:
5359       gcc_unreachable ();
5360     }
5361   return code;
5362 }
5363
5364 /* Return a comparison rtx of mode CMP_MODE for COND.  Use UNSIGNEDP to
5365    select signed or unsigned operators.  OPNO holds the index of the
5366    first comparison operand for insn ICODE.  Do not generate the
5367    compare instruction itself.  */
5368
5369 static rtx
5370 vector_compare_rtx (machine_mode cmp_mode, enum tree_code tcode,
5371                     tree t_op0, tree t_op1, bool unsignedp,
5372                     enum insn_code icode, unsigned int opno)
5373 {
5374   struct expand_operand ops[2];
5375   rtx rtx_op0, rtx_op1;
5376   machine_mode m0, m1;
5377   enum rtx_code rcode = get_rtx_code (tcode, unsignedp);
5378
5379   gcc_assert (TREE_CODE_CLASS (tcode) == tcc_comparison);
5380
5381   /* Expand operands.  For vector types with scalar modes, e.g. where int64x1_t
5382      has mode DImode, this can produce a constant RTX of mode VOIDmode; in such
5383      cases, use the original mode.  */
5384   rtx_op0 = expand_expr (t_op0, NULL_RTX, TYPE_MODE (TREE_TYPE (t_op0)),
5385                          EXPAND_STACK_PARM);
5386   m0 = GET_MODE (rtx_op0);
5387   if (m0 == VOIDmode)
5388     m0 = TYPE_MODE (TREE_TYPE (t_op0));
5389
5390   rtx_op1 = expand_expr (t_op1, NULL_RTX, TYPE_MODE (TREE_TYPE (t_op1)),
5391                          EXPAND_STACK_PARM);
5392   m1 = GET_MODE (rtx_op1);
5393   if (m1 == VOIDmode)
5394     m1 = TYPE_MODE (TREE_TYPE (t_op1));
5395
5396   create_input_operand (&ops[0], rtx_op0, m0);
5397   create_input_operand (&ops[1], rtx_op1, m1);
5398   if (!maybe_legitimize_operands (icode, opno, 2, ops))
5399     gcc_unreachable ();
5400   return gen_rtx_fmt_ee (rcode, cmp_mode, ops[0].value, ops[1].value);
5401 }
5402
5403 /* Check if vec_perm mask SEL is a constant equivalent to a shift of
5404    the first vec_perm operand, assuming the second operand is a constant
5405    vector of zeros.  Return the shift distance in bits if so, or NULL_RTX
5406    if the vec_perm is not a shift.  MODE is the mode of the value being
5407    shifted.  */
5408 static rtx
5409 shift_amt_for_vec_perm_mask (machine_mode mode, const vec_perm_indices &sel)
5410 {
5411   unsigned int bitsize = GET_MODE_UNIT_BITSIZE (mode);
5412   poly_int64 first = sel[0];
5413   if (maybe_ge (sel[0], GET_MODE_NUNITS (mode)))
5414     return NULL_RTX;
5415
5416   if (!sel.series_p (0, 1, first, 1))
5417     {
5418       unsigned int nelt;
5419       if (!GET_MODE_NUNITS (mode).is_constant (&nelt))
5420         return NULL_RTX;
5421       for (unsigned int i = 1; i < nelt; i++)
5422         {
5423           poly_int64 expected = i + first;
5424           /* Indices into the second vector are all equivalent.  */
5425           if (maybe_lt (sel[i], nelt)
5426               ? maybe_ne (sel[i], expected)
5427               : maybe_lt (expected, nelt))
5428             return NULL_RTX;
5429         }
5430     }
5431
5432   return gen_int_shift_amount (mode, first * bitsize);
5433 }
5434
5435 /* A subroutine of expand_vec_perm_var for expanding one vec_perm insn.  */
5436
5437 static rtx
5438 expand_vec_perm_1 (enum insn_code icode, rtx target,
5439                    rtx v0, rtx v1, rtx sel)
5440 {
5441   machine_mode tmode = GET_MODE (target);
5442   machine_mode smode = GET_MODE (sel);
5443   struct expand_operand ops[4];
5444
5445   gcc_assert (GET_MODE_CLASS (smode) == MODE_VECTOR_INT
5446               || mode_for_int_vector (tmode).require () == smode);
5447   create_output_operand (&ops[0], target, tmode);
5448   create_input_operand (&ops[3], sel, smode);
5449
5450   /* Make an effort to preserve v0 == v1.  The target expander is able to
5451      rely on this to determine if we're permuting a single input operand.  */
5452   if (rtx_equal_p (v0, v1))
5453     {
5454       if (!insn_operand_matches (icode, 1, v0))
5455         v0 = force_reg (tmode, v0);
5456       gcc_checking_assert (insn_operand_matches (icode, 1, v0));
5457       gcc_checking_assert (insn_operand_matches (icode, 2, v0));
5458
5459       create_fixed_operand (&ops[1], v0);
5460       create_fixed_operand (&ops[2], v0);
5461     }
5462   else
5463     {
5464       create_input_operand (&ops[1], v0, tmode);
5465       create_input_operand (&ops[2], v1, tmode);
5466     }
5467
5468   if (maybe_expand_insn (icode, 4, ops))
5469     return ops[0].value;
5470   return NULL_RTX;
5471 }
5472
5473 /* Implement a permutation of vectors v0 and v1 using the permutation
5474    vector in SEL and return the result.  Use TARGET to hold the result
5475    if nonnull and convenient.
5476
5477    MODE is the mode of the vectors being permuted (V0 and V1).  SEL_MODE
5478    is the TYPE_MODE associated with SEL, or BLKmode if SEL isn't known
5479    to have a particular mode.  */
5480
5481 rtx
5482 expand_vec_perm_const (machine_mode mode, rtx v0, rtx v1,
5483                        const vec_perm_builder &sel, machine_mode sel_mode,
5484                        rtx target)
5485 {
5486   if (!target || !register_operand (target, mode))
5487     target = gen_reg_rtx (mode);
5488
5489   /* Set QIMODE to a different vector mode with byte elements.
5490      If no such mode, or if MODE already has byte elements, use VOIDmode.  */
5491   machine_mode qimode;
5492   if (!qimode_for_vec_perm (mode).exists (&qimode))
5493     qimode = VOIDmode;
5494
5495   rtx_insn *last = get_last_insn ();
5496
5497   bool single_arg_p = rtx_equal_p (v0, v1);
5498   /* Always specify two input vectors here and leave the target to handle
5499      cases in which the inputs are equal.  Not all backends can cope with
5500      the single-input representation when testing for a double-input
5501      target instruction.  */
5502   vec_perm_indices indices (sel, 2, GET_MODE_NUNITS (mode));
5503
5504   /* See if this can be handled with a vec_shr.  We only do this if the
5505      second vector is all zeroes.  */
5506   insn_code shift_code = optab_handler (vec_shr_optab, mode);
5507   insn_code shift_code_qi = ((qimode != VOIDmode && qimode != mode)
5508                              ? optab_handler (vec_shr_optab, qimode)
5509                              : CODE_FOR_nothing);
5510
5511   if (v1 == CONST0_RTX (GET_MODE (v1))
5512       && (shift_code != CODE_FOR_nothing
5513           || shift_code_qi != CODE_FOR_nothing))
5514     {
5515       rtx shift_amt = shift_amt_for_vec_perm_mask (mode, indices);
5516       if (shift_amt)
5517         {
5518           struct expand_operand ops[3];
5519           if (shift_code != CODE_FOR_nothing)
5520             {
5521               create_output_operand (&ops[0], target, mode);
5522               create_input_operand (&ops[1], v0, mode);
5523               create_convert_operand_from_type (&ops[2], shift_amt, sizetype);
5524               if (maybe_expand_insn (shift_code, 3, ops))
5525                 return ops[0].value;
5526             }
5527           if (shift_code_qi != CODE_FOR_nothing)
5528             {
5529               rtx tmp = gen_reg_rtx (qimode);
5530               create_output_operand (&ops[0], tmp, qimode);
5531               create_input_operand (&ops[1], gen_lowpart (qimode, v0), qimode);
5532               create_convert_operand_from_type (&ops[2], shift_amt, sizetype);
5533               if (maybe_expand_insn (shift_code_qi, 3, ops))
5534                 return gen_lowpart (mode, ops[0].value);
5535             }
5536         }
5537     }
5538
5539   if (targetm.vectorize.vec_perm_const != NULL)
5540     {
5541       v0 = force_reg (mode, v0);
5542       if (single_arg_p)
5543         v1 = v0;
5544       else
5545         v1 = force_reg (mode, v1);
5546
5547       if (targetm.vectorize.vec_perm_const (mode, target, v0, v1, indices))
5548         return target;
5549     }
5550
5551   /* Fall back to a constant byte-based permutation.  */
5552   vec_perm_indices qimode_indices;
5553   rtx target_qi = NULL_RTX, v0_qi = NULL_RTX, v1_qi = NULL_RTX;
5554   if (qimode != VOIDmode)
5555     {
5556       qimode_indices.new_expanded_vector (indices, GET_MODE_UNIT_SIZE (mode));
5557       target_qi = gen_reg_rtx (qimode);
5558       v0_qi = gen_lowpart (qimode, v0);
5559       v1_qi = gen_lowpart (qimode, v1);
5560       if (targetm.vectorize.vec_perm_const != NULL
5561           && targetm.vectorize.vec_perm_const (qimode, target_qi, v0_qi,
5562                                                v1_qi, qimode_indices))
5563         return gen_lowpart (mode, target_qi);
5564     }
5565
5566   /* Otherwise expand as a fully variable permuation.  */
5567
5568   /* The optabs are only defined for selectors with the same width
5569      as the values being permuted.  */
5570   machine_mode required_sel_mode;
5571   if (!mode_for_int_vector (mode).exists (&required_sel_mode)
5572       || !VECTOR_MODE_P (required_sel_mode))
5573     {
5574       delete_insns_since (last);
5575       return NULL_RTX;
5576     }
5577
5578   /* We know that it is semantically valid to treat SEL as having SEL_MODE.
5579      If that isn't the mode we want then we need to prove that using
5580      REQUIRED_SEL_MODE is OK.  */
5581   if (sel_mode != required_sel_mode)
5582     {
5583       if (!selector_fits_mode_p (required_sel_mode, indices))
5584         {
5585           delete_insns_since (last);
5586           return NULL_RTX;
5587         }
5588       sel_mode = required_sel_mode;
5589     }
5590
5591   insn_code icode = direct_optab_handler (vec_perm_optab, mode);
5592   if (icode != CODE_FOR_nothing)
5593     {
5594       rtx sel_rtx = vec_perm_indices_to_rtx (sel_mode, indices);
5595       rtx tmp = expand_vec_perm_1 (icode, target, v0, v1, sel_rtx);
5596       if (tmp)
5597         return tmp;
5598     }
5599
5600   if (qimode != VOIDmode
5601       && selector_fits_mode_p (qimode, qimode_indices))
5602     {
5603       icode = direct_optab_handler (vec_perm_optab, qimode);
5604       if (icode != CODE_FOR_nothing)
5605         {
5606           rtx sel_qi = vec_perm_indices_to_rtx (qimode, qimode_indices);
5607           rtx tmp = expand_vec_perm_1 (icode, target_qi, v0_qi, v1_qi, sel_qi);
5608           if (tmp)
5609             return gen_lowpart (mode, tmp);
5610         }
5611     }
5612
5613   delete_insns_since (last);
5614   return NULL_RTX;
5615 }
5616
5617 /* Implement a permutation of vectors v0 and v1 using the permutation
5618    vector in SEL and return the result.  Use TARGET to hold the result
5619    if nonnull and convenient.
5620
5621    MODE is the mode of the vectors being permuted (V0 and V1).
5622    SEL must have the integer equivalent of MODE and is known to be
5623    unsuitable for permutes with a constant permutation vector.  */
5624
5625 rtx
5626 expand_vec_perm_var (machine_mode mode, rtx v0, rtx v1, rtx sel, rtx target)
5627 {
5628   enum insn_code icode;
5629   unsigned int i, u;
5630   rtx tmp, sel_qi;
5631
5632   u = GET_MODE_UNIT_SIZE (mode);
5633
5634   if (!target || GET_MODE (target) != mode)
5635     target = gen_reg_rtx (mode);
5636
5637   icode = direct_optab_handler (vec_perm_optab, mode);
5638   if (icode != CODE_FOR_nothing)
5639     {
5640       tmp = expand_vec_perm_1 (icode, target, v0, v1, sel);
5641       if (tmp)
5642         return tmp;
5643     }
5644
5645   /* As a special case to aid several targets, lower the element-based
5646      permutation to a byte-based permutation and try again.  */
5647   machine_mode qimode;
5648   if (!qimode_for_vec_perm (mode).exists (&qimode)
5649       || maybe_gt (GET_MODE_NUNITS (qimode), GET_MODE_MASK (QImode) + 1))
5650     return NULL_RTX;
5651   icode = direct_optab_handler (vec_perm_optab, qimode);
5652   if (icode == CODE_FOR_nothing)
5653     return NULL_RTX;
5654
5655   /* Multiply each element by its byte size.  */
5656   machine_mode selmode = GET_MODE (sel);
5657   if (u == 2)
5658     sel = expand_simple_binop (selmode, PLUS, sel, sel,
5659                                NULL, 0, OPTAB_DIRECT);
5660   else
5661     sel = expand_simple_binop (selmode, ASHIFT, sel,
5662                                gen_int_shift_amount (selmode, exact_log2 (u)),
5663                                NULL, 0, OPTAB_DIRECT);
5664   gcc_assert (sel != NULL);
5665
5666   /* Broadcast the low byte each element into each of its bytes.
5667      The encoding has U interleaved stepped patterns, one for each
5668      byte of an element.  */
5669   vec_perm_builder const_sel (GET_MODE_SIZE (mode), u, 3);
5670   unsigned int low_byte_in_u = BYTES_BIG_ENDIAN ? u - 1 : 0;
5671   for (i = 0; i < 3; ++i)
5672     for (unsigned int j = 0; j < u; ++j)
5673       const_sel.quick_push (i * u + low_byte_in_u);
5674   sel = gen_lowpart (qimode, sel);
5675   sel = expand_vec_perm_const (qimode, sel, sel, const_sel, qimode, NULL);
5676   gcc_assert (sel != NULL);
5677
5678   /* Add the byte offset to each byte element.  */
5679   /* Note that the definition of the indicies here is memory ordering,
5680      so there should be no difference between big and little endian.  */
5681   rtx_vector_builder byte_indices (qimode, u, 1);
5682   for (i = 0; i < u; ++i)
5683     byte_indices.quick_push (GEN_INT (i));
5684   tmp = byte_indices.build ();
5685   sel_qi = expand_simple_binop (qimode, PLUS, sel, tmp,
5686                                 sel, 0, OPTAB_DIRECT);
5687   gcc_assert (sel_qi != NULL);
5688
5689   tmp = mode != qimode ? gen_reg_rtx (qimode) : target;
5690   tmp = expand_vec_perm_1 (icode, tmp, gen_lowpart (qimode, v0),
5691                            gen_lowpart (qimode, v1), sel_qi);
5692   if (tmp)
5693     tmp = gen_lowpart (mode, tmp);
5694   return tmp;
5695 }
5696
5697 /* Generate insns for a VEC_COND_EXPR with mask, given its TYPE and its
5698    three operands.  */
5699
5700 rtx
5701 expand_vec_cond_mask_expr (tree vec_cond_type, tree op0, tree op1, tree op2,
5702                            rtx target)
5703 {
5704   struct expand_operand ops[4];
5705   machine_mode mode = TYPE_MODE (vec_cond_type);
5706   machine_mode mask_mode = TYPE_MODE (TREE_TYPE (op0));
5707   enum insn_code icode = get_vcond_mask_icode (mode, mask_mode);
5708   rtx mask, rtx_op1, rtx_op2;
5709
5710   if (icode == CODE_FOR_nothing)
5711     return 0;
5712
5713   mask = expand_normal (op0);
5714   rtx_op1 = expand_normal (op1);
5715   rtx_op2 = expand_normal (op2);
5716
5717   mask = force_reg (mask_mode, mask);
5718   rtx_op1 = force_reg (GET_MODE (rtx_op1), rtx_op1);
5719
5720   create_output_operand (&ops[0], target, mode);
5721   create_input_operand (&ops[1], rtx_op1, mode);
5722   create_input_operand (&ops[2], rtx_op2, mode);
5723   create_input_operand (&ops[3], mask, mask_mode);
5724   expand_insn (icode, 4, ops);
5725
5726   return ops[0].value;
5727 }
5728
5729 /* Generate insns for a VEC_COND_EXPR, given its TYPE and its
5730    three operands.  */
5731
5732 rtx
5733 expand_vec_cond_expr (tree vec_cond_type, tree op0, tree op1, tree op2,
5734                       rtx target)
5735 {
5736   struct expand_operand ops[6];
5737   enum insn_code icode;
5738   rtx comparison, rtx_op1, rtx_op2;
5739   machine_mode mode = TYPE_MODE (vec_cond_type);
5740   machine_mode cmp_op_mode;
5741   bool unsignedp;
5742   tree op0a, op0b;
5743   enum tree_code tcode;
5744
5745   if (COMPARISON_CLASS_P (op0))
5746     {
5747       op0a = TREE_OPERAND (op0, 0);
5748       op0b = TREE_OPERAND (op0, 1);
5749       tcode = TREE_CODE (op0);
5750     }
5751   else
5752     {
5753       gcc_assert (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (op0)));
5754       if (get_vcond_mask_icode (mode, TYPE_MODE (TREE_TYPE (op0)))
5755           != CODE_FOR_nothing)
5756         return expand_vec_cond_mask_expr (vec_cond_type, op0, op1,
5757                                           op2, target);
5758       /* Fake op0 < 0.  */
5759       else
5760         {
5761           gcc_assert (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (op0)))
5762                       == MODE_VECTOR_INT);
5763           op0a = op0;
5764           op0b = build_zero_cst (TREE_TYPE (op0));
5765           tcode = LT_EXPR;
5766         }
5767     }
5768   cmp_op_mode = TYPE_MODE (TREE_TYPE (op0a));
5769   unsignedp = TYPE_UNSIGNED (TREE_TYPE (op0a));
5770
5771
5772   gcc_assert (known_eq (GET_MODE_SIZE (mode), GET_MODE_SIZE (cmp_op_mode))
5773               && known_eq (GET_MODE_NUNITS (mode),
5774                            GET_MODE_NUNITS (cmp_op_mode)));
5775
5776   icode = get_vcond_icode (mode, cmp_op_mode, unsignedp);
5777   if (icode == CODE_FOR_nothing)
5778     {
5779       if (tcode == EQ_EXPR || tcode == NE_EXPR)
5780         icode = get_vcond_eq_icode (mode, cmp_op_mode);
5781       if (icode == CODE_FOR_nothing)
5782         return 0;
5783     }
5784
5785   comparison = vector_compare_rtx (VOIDmode, tcode, op0a, op0b, unsignedp,
5786                                    icode, 4);
5787   rtx_op1 = expand_normal (op1);
5788   rtx_op2 = expand_normal (op2);
5789
5790   create_output_operand (&ops[0], target, mode);
5791   create_input_operand (&ops[1], rtx_op1, mode);
5792   create_input_operand (&ops[2], rtx_op2, mode);
5793   create_fixed_operand (&ops[3], comparison);
5794   create_fixed_operand (&ops[4], XEXP (comparison, 0));
5795   create_fixed_operand (&ops[5], XEXP (comparison, 1));
5796   expand_insn (icode, 6, ops);
5797   return ops[0].value;
5798 }
5799
5800 /* Generate VEC_SERIES_EXPR <OP0, OP1>, returning a value of mode VMODE.
5801    Use TARGET for the result if nonnull and convenient.  */
5802
5803 rtx
5804 expand_vec_series_expr (machine_mode vmode, rtx op0, rtx op1, rtx target)
5805 {
5806   struct expand_operand ops[3];
5807   enum insn_code icode;
5808   machine_mode emode = GET_MODE_INNER (vmode);
5809
5810   icode = direct_optab_handler (vec_series_optab, vmode);
5811   gcc_assert (icode != CODE_FOR_nothing);
5812
5813   create_output_operand (&ops[0], target, vmode);
5814   create_input_operand (&ops[1], op0, emode);
5815   create_input_operand (&ops[2], op1, emode);
5816
5817   expand_insn (icode, 3, ops);
5818   return ops[0].value;
5819 }
5820
5821 /* Generate insns for a vector comparison into a mask.  */
5822
5823 rtx
5824 expand_vec_cmp_expr (tree type, tree exp, rtx target)
5825 {
5826   struct expand_operand ops[4];
5827   enum insn_code icode;
5828   rtx comparison;
5829   machine_mode mask_mode = TYPE_MODE (type);
5830   machine_mode vmode;
5831   bool unsignedp;
5832   tree op0a, op0b;
5833   enum tree_code tcode;
5834
5835   op0a = TREE_OPERAND (exp, 0);
5836   op0b = TREE_OPERAND (exp, 1);
5837   tcode = TREE_CODE (exp);
5838
5839   unsignedp = TYPE_UNSIGNED (TREE_TYPE (op0a));
5840   vmode = TYPE_MODE (TREE_TYPE (op0a));
5841
5842   icode = get_vec_cmp_icode (vmode, mask_mode, unsignedp);
5843   if (icode == CODE_FOR_nothing)
5844     {
5845       if (tcode == EQ_EXPR || tcode == NE_EXPR)
5846         icode = get_vec_cmp_eq_icode (vmode, mask_mode);
5847       if (icode == CODE_FOR_nothing)
5848         return 0;
5849     }
5850
5851   comparison = vector_compare_rtx (mask_mode, tcode, op0a, op0b,
5852                                    unsignedp, icode, 2);
5853   create_output_operand (&ops[0], target, mask_mode);
5854   create_fixed_operand (&ops[1], comparison);
5855   create_fixed_operand (&ops[2], XEXP (comparison, 0));
5856   create_fixed_operand (&ops[3], XEXP (comparison, 1));
5857   expand_insn (icode, 4, ops);
5858   return ops[0].value;
5859 }
5860
5861 /* Expand a highpart multiply.  */
5862
5863 rtx
5864 expand_mult_highpart (machine_mode mode, rtx op0, rtx op1,
5865                       rtx target, bool uns_p)
5866 {
5867   struct expand_operand eops[3];
5868   enum insn_code icode;
5869   int method, i;
5870   machine_mode wmode;
5871   rtx m1, m2;
5872   optab tab1, tab2;
5873
5874   method = can_mult_highpart_p (mode, uns_p);
5875   switch (method)
5876     {
5877     case 0:
5878       return NULL_RTX;
5879     case 1:
5880       tab1 = uns_p ? umul_highpart_optab : smul_highpart_optab;
5881       return expand_binop (mode, tab1, op0, op1, target, uns_p,
5882                            OPTAB_LIB_WIDEN);
5883     case 2:
5884       tab1 = uns_p ? vec_widen_umult_even_optab : vec_widen_smult_even_optab;
5885       tab2 = uns_p ? vec_widen_umult_odd_optab : vec_widen_smult_odd_optab;
5886       break;
5887     case 3:
5888       tab1 = uns_p ? vec_widen_umult_lo_optab : vec_widen_smult_lo_optab;
5889       tab2 = uns_p ? vec_widen_umult_hi_optab : vec_widen_smult_hi_optab;
5890       if (BYTES_BIG_ENDIAN)
5891         std::swap (tab1, tab2);
5892       break;
5893     default:
5894       gcc_unreachable ();
5895     }
5896
5897   icode = optab_handler (tab1, mode);
5898   wmode = insn_data[icode].operand[0].mode;
5899   gcc_checking_assert (known_eq (2 * GET_MODE_NUNITS (wmode),
5900                                  GET_MODE_NUNITS (mode)));
5901   gcc_checking_assert (known_eq (GET_MODE_SIZE (wmode), GET_MODE_SIZE (mode)));
5902
5903   create_output_operand (&eops[0], gen_reg_rtx (wmode), wmode);
5904   create_input_operand (&eops[1], op0, mode);
5905   create_input_operand (&eops[2], op1, mode);
5906   expand_insn (icode, 3, eops);
5907   m1 = gen_lowpart (mode, eops[0].value);
5908
5909   create_output_operand (&eops[0], gen_reg_rtx (wmode), wmode);
5910   create_input_operand (&eops[1], op0, mode);
5911   create_input_operand (&eops[2], op1, mode);
5912   expand_insn (optab_handler (tab2, mode), 3, eops);
5913   m2 = gen_lowpart (mode, eops[0].value);
5914
5915   vec_perm_builder sel;
5916   if (method == 2)
5917     {
5918       /* The encoding has 2 interleaved stepped patterns.  */
5919       sel.new_vector (GET_MODE_NUNITS (mode), 2, 3);
5920       for (i = 0; i < 6; ++i)
5921         sel.quick_push (!BYTES_BIG_ENDIAN + (i & ~1)
5922                         + ((i & 1) ? GET_MODE_NUNITS (mode) : 0));
5923     }
5924   else
5925     {
5926       /* The encoding has a single interleaved stepped pattern.  */
5927       sel.new_vector (GET_MODE_NUNITS (mode), 1, 3);
5928       for (i = 0; i < 3; ++i)
5929         sel.quick_push (2 * i + (BYTES_BIG_ENDIAN ? 0 : 1));
5930     }
5931
5932   return expand_vec_perm_const (mode, m1, m2, sel, BLKmode, target);
5933 }
5934 \f
5935 /* Helper function to find the MODE_CC set in a sync_compare_and_swap
5936    pattern.  */
5937
5938 static void
5939 find_cc_set (rtx x, const_rtx pat, void *data)
5940 {
5941   if (REG_P (x) && GET_MODE_CLASS (GET_MODE (x)) == MODE_CC
5942       && GET_CODE (pat) == SET)
5943     {
5944       rtx *p_cc_reg = (rtx *) data;
5945       gcc_assert (!*p_cc_reg);
5946       *p_cc_reg = x;
5947     }
5948 }
5949
5950 /* This is a helper function for the other atomic operations.  This function
5951    emits a loop that contains SEQ that iterates until a compare-and-swap
5952    operation at the end succeeds.  MEM is the memory to be modified.  SEQ is
5953    a set of instructions that takes a value from OLD_REG as an input and
5954    produces a value in NEW_REG as an output.  Before SEQ, OLD_REG will be
5955    set to the current contents of MEM.  After SEQ, a compare-and-swap will
5956    attempt to update MEM with NEW_REG.  The function returns true when the
5957    loop was generated successfully.  */
5958
5959 static bool
5960 expand_compare_and_swap_loop (rtx mem, rtx old_reg, rtx new_reg, rtx seq)
5961 {
5962   machine_mode mode = GET_MODE (mem);
5963   rtx_code_label *label;
5964   rtx cmp_reg, success, oldval;
5965
5966   /* The loop we want to generate looks like
5967
5968         cmp_reg = mem;
5969       label:
5970         old_reg = cmp_reg;
5971         seq;
5972         (success, cmp_reg) = compare-and-swap(mem, old_reg, new_reg)
5973         if (success)
5974           goto label;
5975
5976      Note that we only do the plain load from memory once.  Subsequent
5977      iterations use the value loaded by the compare-and-swap pattern.  */
5978
5979   label = gen_label_rtx ();
5980   cmp_reg = gen_reg_rtx (mode);
5981
5982   emit_move_insn (cmp_reg, mem);
5983   emit_label (label);
5984   emit_move_insn (old_reg, cmp_reg);
5985   if (seq)
5986     emit_insn (seq);
5987
5988   success = NULL_RTX;
5989   oldval = cmp_reg;
5990   if (!expand_atomic_compare_and_swap (&success, &oldval, mem, old_reg,
5991                                        new_reg, false, MEMMODEL_SYNC_SEQ_CST,
5992                                        MEMMODEL_RELAXED))
5993     return false;
5994
5995   if (oldval != cmp_reg)
5996     emit_move_insn (cmp_reg, oldval);
5997
5998   /* Mark this jump predicted not taken.  */
5999   emit_cmp_and_jump_insns (success, const0_rtx, EQ, const0_rtx,
6000                            GET_MODE (success), 1, label,
6001                            profile_probability::guessed_never ());
6002   return true;
6003 }
6004
6005
6006 /* This function tries to emit an atomic_exchange intruction.  VAL is written
6007    to *MEM using memory model MODEL. The previous contents of *MEM are returned,
6008    using TARGET if possible.  */
6009    
6010 static rtx
6011 maybe_emit_atomic_exchange (rtx target, rtx mem, rtx val, enum memmodel model)
6012 {
6013   machine_mode mode = GET_MODE (mem);
6014   enum insn_code icode;
6015
6016   /* If the target supports the exchange directly, great.  */
6017   icode = direct_optab_handler (atomic_exchange_optab, mode);
6018   if (icode != CODE_FOR_nothing)
6019     {
6020       struct expand_operand ops[4];
6021
6022       create_output_operand (&ops[0], target, mode);
6023       create_fixed_operand (&ops[1], mem);
6024       create_input_operand (&ops[2], val, mode);
6025       create_integer_operand (&ops[3], model);
6026       if (maybe_expand_insn (icode, 4, ops))
6027         return ops[0].value;
6028     }
6029
6030   return NULL_RTX;
6031 }
6032
6033 /* This function tries to implement an atomic exchange operation using
6034    __sync_lock_test_and_set. VAL is written to *MEM using memory model MODEL.
6035    The previous contents of *MEM are returned, using TARGET if possible.
6036    Since this instructionn is an acquire barrier only, stronger memory
6037    models may require additional barriers to be emitted.  */
6038
6039 static rtx
6040 maybe_emit_sync_lock_test_and_set (rtx target, rtx mem, rtx val,
6041                                    enum memmodel model)
6042 {
6043   machine_mode mode = GET_MODE (mem);
6044   enum insn_code icode;
6045   rtx_insn *last_insn = get_last_insn ();
6046
6047   icode = optab_handler (sync_lock_test_and_set_optab, mode);
6048
6049   /* Legacy sync_lock_test_and_set is an acquire barrier.  If the pattern
6050      exists, and the memory model is stronger than acquire, add a release 
6051      barrier before the instruction.  */
6052
6053   if (is_mm_seq_cst (model) || is_mm_release (model) || is_mm_acq_rel (model))
6054     expand_mem_thread_fence (model);
6055
6056   if (icode != CODE_FOR_nothing)
6057     {
6058       struct expand_operand ops[3];
6059       create_output_operand (&ops[0], target, mode);
6060       create_fixed_operand (&ops[1], mem);
6061       create_input_operand (&ops[2], val, mode);
6062       if (maybe_expand_insn (icode, 3, ops))
6063         return ops[0].value;
6064     }
6065
6066   /* If an external test-and-set libcall is provided, use that instead of
6067      any external compare-and-swap that we might get from the compare-and-
6068      swap-loop expansion later.  */
6069   if (!can_compare_and_swap_p (mode, false))
6070     {
6071       rtx libfunc = optab_libfunc (sync_lock_test_and_set_optab, mode);
6072       if (libfunc != NULL)
6073         {
6074           rtx addr;
6075
6076           addr = convert_memory_address (ptr_mode, XEXP (mem, 0));
6077           return emit_library_call_value (libfunc, NULL_RTX, LCT_NORMAL,
6078                                           mode, addr, ptr_mode,
6079                                           val, mode);
6080         }
6081     }
6082
6083   /* If the test_and_set can't be emitted, eliminate any barrier that might
6084      have been emitted.  */
6085   delete_insns_since (last_insn);
6086   return NULL_RTX;
6087 }
6088
6089 /* This function tries to implement an atomic exchange operation using a 
6090    compare_and_swap loop. VAL is written to *MEM.  The previous contents of
6091    *MEM are returned, using TARGET if possible.  No memory model is required
6092    since a compare_and_swap loop is seq-cst.  */
6093
6094 static rtx 
6095 maybe_emit_compare_and_swap_exchange_loop (rtx target, rtx mem, rtx val)
6096 {
6097   machine_mode mode = GET_MODE (mem);
6098
6099   if (can_compare_and_swap_p (mode, true))
6100     {
6101       if (!target || !register_operand (target, mode))
6102         target = gen_reg_rtx (mode);
6103       if (expand_compare_and_swap_loop (mem, target, val, NULL_RTX))
6104         return target;
6105     }
6106
6107   return NULL_RTX;
6108 }
6109
6110 /* This function tries to implement an atomic test-and-set operation
6111    using the atomic_test_and_set instruction pattern.  A boolean value
6112    is returned from the operation, using TARGET if possible.  */
6113
6114 static rtx
6115 maybe_emit_atomic_test_and_set (rtx target, rtx mem, enum memmodel model)
6116 {
6117   machine_mode pat_bool_mode;
6118   struct expand_operand ops[3];
6119
6120   if (!targetm.have_atomic_test_and_set ())
6121     return NULL_RTX;
6122
6123   /* While we always get QImode from __atomic_test_and_set, we get
6124      other memory modes from __sync_lock_test_and_set.  Note that we
6125      use no endian adjustment here.  This matches the 4.6 behavior
6126      in the Sparc backend.  */
6127   enum insn_code icode = targetm.code_for_atomic_test_and_set;
6128   gcc_checking_assert (insn_data[icode].operand[1].mode == QImode);
6129   if (GET_MODE (mem) != QImode)
6130     mem = adjust_address_nv (mem, QImode, 0);
6131
6132   pat_bool_mode = insn_data[icode].operand[0].mode;
6133   create_output_operand (&ops[0], target, pat_bool_mode);
6134   create_fixed_operand (&ops[1], mem);
6135   create_integer_operand (&ops[2], model);
6136
6137   if (maybe_expand_insn (icode, 3, ops))
6138     return ops[0].value;
6139   return NULL_RTX;
6140 }
6141
6142 /* This function expands the legacy _sync_lock test_and_set operation which is
6143    generally an atomic exchange.  Some limited targets only allow the
6144    constant 1 to be stored.  This is an ACQUIRE operation. 
6145
6146    TARGET is an optional place to stick the return value.  
6147    MEM is where VAL is stored.  */
6148
6149 rtx
6150 expand_sync_lock_test_and_set (rtx target, rtx mem, rtx val)
6151 {
6152   rtx ret;
6153
6154   /* Try an atomic_exchange first.  */
6155   ret = maybe_emit_atomic_exchange (target, mem, val, MEMMODEL_SYNC_ACQUIRE);
6156   if (ret)
6157     return ret;
6158
6159   ret = maybe_emit_sync_lock_test_and_set (target, mem, val,
6160                                            MEMMODEL_SYNC_ACQUIRE);
6161   if (ret)
6162     return ret;
6163
6164   ret = maybe_emit_compare_and_swap_exchange_loop (target, mem, val);
6165   if (ret)
6166     return ret;
6167
6168   /* If there are no other options, try atomic_test_and_set if the value
6169      being stored is 1.  */
6170   if (val == const1_rtx)
6171     ret = maybe_emit_atomic_test_and_set (target, mem, MEMMODEL_SYNC_ACQUIRE);
6172
6173   return ret;
6174 }
6175
6176 /* This function expands the atomic test_and_set operation:
6177    atomically store a boolean TRUE into MEM and return the previous value.
6178
6179    MEMMODEL is the memory model variant to use.
6180    TARGET is an optional place to stick the return value.  */
6181
6182 rtx
6183 expand_atomic_test_and_set (rtx target, rtx mem, enum memmodel model)
6184 {
6185   machine_mode mode = GET_MODE (mem);
6186   rtx ret, trueval, subtarget;
6187
6188   ret = maybe_emit_atomic_test_and_set (target, mem, model);
6189   if (ret)
6190     return ret;
6191
6192   /* Be binary compatible with non-default settings of trueval, and different
6193      cpu revisions.  E.g. one revision may have atomic-test-and-set, but
6194      another only has atomic-exchange.  */
6195   if (targetm.atomic_test_and_set_trueval == 1)
6196     {
6197       trueval = const1_rtx;
6198       subtarget = target ? target : gen_reg_rtx (mode);
6199     }
6200   else
6201     {
6202       trueval = gen_int_mode (targetm.atomic_test_and_set_trueval, mode);
6203       subtarget = gen_reg_rtx (mode);
6204     }
6205
6206   /* Try the atomic-exchange optab...  */
6207   ret = maybe_emit_atomic_exchange (subtarget, mem, trueval, model);
6208
6209   /* ... then an atomic-compare-and-swap loop ... */
6210   if (!ret)
6211     ret = maybe_emit_compare_and_swap_exchange_loop (subtarget, mem, trueval);
6212
6213   /* ... before trying the vaguely defined legacy lock_test_and_set. */
6214   if (!ret)
6215     ret = maybe_emit_sync_lock_test_and_set (subtarget, mem, trueval, model);
6216
6217   /* Recall that the legacy lock_test_and_set optab was allowed to do magic
6218      things with the value 1.  Thus we try again without trueval.  */
6219   if (!ret && targetm.atomic_test_and_set_trueval != 1)
6220     ret = maybe_emit_sync_lock_test_and_set (subtarget, mem, const1_rtx, model);
6221
6222   /* Failing all else, assume a single threaded environment and simply
6223      perform the operation.  */
6224   if (!ret)
6225     {
6226       /* If the result is ignored skip the move to target.  */
6227       if (subtarget != const0_rtx)
6228         emit_move_insn (subtarget, mem);
6229
6230       emit_move_insn (mem, trueval);
6231       ret = subtarget;
6232     }
6233
6234   /* Recall that have to return a boolean value; rectify if trueval
6235      is not exactly one.  */
6236   if (targetm.atomic_test_and_set_trueval != 1)
6237     ret = emit_store_flag_force (target, NE, ret, const0_rtx, mode, 0, 1);
6238   
6239   return ret;
6240 }
6241
6242 /* This function expands the atomic exchange operation:
6243    atomically store VAL in MEM and return the previous value in MEM.
6244
6245    MEMMODEL is the memory model variant to use.
6246    TARGET is an optional place to stick the return value.  */
6247
6248 rtx
6249 expand_atomic_exchange (rtx target, rtx mem, rtx val, enum memmodel model)
6250 {
6251   machine_mode mode = GET_MODE (mem);
6252   rtx ret;
6253
6254   /* If loads are not atomic for the required size and we are not called to
6255      provide a __sync builtin, do not do anything so that we stay consistent
6256      with atomic loads of the same size.  */
6257   if (!can_atomic_load_p (mode) && !is_mm_sync (model))
6258     return NULL_RTX;
6259
6260   ret = maybe_emit_atomic_exchange (target, mem, val, model);
6261
6262   /* Next try a compare-and-swap loop for the exchange.  */
6263   if (!ret)
6264     ret = maybe_emit_compare_and_swap_exchange_loop (target, mem, val);
6265
6266   return ret;
6267 }
6268
6269 /* This function expands the atomic compare exchange operation:
6270
6271    *PTARGET_BOOL is an optional place to store the boolean success/failure.
6272    *PTARGET_OVAL is an optional place to store the old value from memory.
6273    Both target parameters may be NULL or const0_rtx to indicate that we do
6274    not care about that return value.  Both target parameters are updated on
6275    success to the actual location of the corresponding result.
6276
6277    MEMMODEL is the memory model variant to use.
6278
6279    The return value of the function is true for success.  */
6280
6281 bool
6282 expand_atomic_compare_and_swap (rtx *ptarget_bool, rtx *ptarget_oval,
6283                                 rtx mem, rtx expected, rtx desired,
6284                                 bool is_weak, enum memmodel succ_model,
6285                                 enum memmodel fail_model)
6286 {
6287   machine_mode mode = GET_MODE (mem);
6288   struct expand_operand ops[8];
6289   enum insn_code icode;
6290   rtx target_oval, target_bool = NULL_RTX;
6291   rtx libfunc;
6292
6293   /* If loads are not atomic for the required size and we are not called to
6294      provide a __sync builtin, do not do anything so that we stay consistent
6295      with atomic loads of the same size.  */
6296   if (!can_atomic_load_p (mode) && !is_mm_sync (succ_model))
6297     return false;
6298
6299   /* Load expected into a register for the compare and swap.  */
6300   if (MEM_P (expected))
6301     expected = copy_to_reg (expected);
6302
6303   /* Make sure we always have some place to put the return oldval.
6304      Further, make sure that place is distinct from the input expected,
6305      just in case we need that path down below.  */
6306   if (ptarget_oval && *ptarget_oval == const0_rtx)
6307     ptarget_oval = NULL;
6308
6309   if (ptarget_oval == NULL
6310       || (target_oval = *ptarget_oval) == NULL
6311       || reg_overlap_mentioned_p (expected, target_oval))
6312     target_oval = gen_reg_rtx (mode);
6313
6314   icode = direct_optab_handler (atomic_compare_and_swap_optab, mode);
6315   if (icode != CODE_FOR_nothing)
6316     {
6317       machine_mode bool_mode = insn_data[icode].operand[0].mode;
6318
6319       if (ptarget_bool && *ptarget_bool == const0_rtx)
6320         ptarget_bool = NULL;
6321
6322       /* Make sure we always have a place for the bool operand.  */
6323       if (ptarget_bool == NULL
6324           || (target_bool = *ptarget_bool) == NULL
6325           || GET_MODE (target_bool) != bool_mode)
6326         target_bool = gen_reg_rtx (bool_mode);
6327
6328       /* Emit the compare_and_swap.  */
6329       create_output_operand (&ops[0], target_bool, bool_mode);
6330       create_output_operand (&ops[1], target_oval, mode);
6331       create_fixed_operand (&ops[2], mem);
6332       create_input_operand (&ops[3], expected, mode);
6333       create_input_operand (&ops[4], desired, mode);
6334       create_integer_operand (&ops[5], is_weak);
6335       create_integer_operand (&ops[6], succ_model);
6336       create_integer_operand (&ops[7], fail_model);
6337       if (maybe_expand_insn (icode, 8, ops))
6338         {
6339           /* Return success/failure.  */
6340           target_bool = ops[0].value;
6341           target_oval = ops[1].value;
6342           goto success;
6343         }
6344     }
6345
6346   /* Otherwise fall back to the original __sync_val_compare_and_swap
6347      which is always seq-cst.  */
6348   icode = optab_handler (sync_compare_and_swap_optab, mode);
6349   if (icode != CODE_FOR_nothing)
6350     {
6351       rtx cc_reg;
6352
6353       create_output_operand (&ops[0], target_oval, mode);
6354       create_fixed_operand (&ops[1], mem);
6355       create_input_operand (&ops[2], expected, mode);
6356       create_input_operand (&ops[3], desired, mode);
6357       if (!maybe_expand_insn (icode, 4, ops))
6358         return false;
6359
6360       target_oval = ops[0].value;
6361
6362       /* If the caller isn't interested in the boolean return value,
6363          skip the computation of it.  */
6364       if (ptarget_bool == NULL)
6365         goto success;
6366
6367       /* Otherwise, work out if the compare-and-swap succeeded.  */
6368       cc_reg = NULL_RTX;
6369       if (have_insn_for (COMPARE, CCmode))
6370         note_stores (PATTERN (get_last_insn ()), find_cc_set, &cc_reg);
6371       if (cc_reg)
6372         {
6373           target_bool = emit_store_flag_force (target_bool, EQ, cc_reg,
6374                                                const0_rtx, VOIDmode, 0, 1);
6375           goto success;
6376         }
6377       goto success_bool_from_val;
6378     }
6379
6380   /* Also check for library support for __sync_val_compare_and_swap.  */
6381   libfunc = optab_libfunc (sync_compare_and_swap_optab, mode);
6382   if (libfunc != NULL)
6383     {
6384       rtx addr = convert_memory_address (ptr_mode, XEXP (mem, 0));
6385       rtx target = emit_library_call_value (libfunc, NULL_RTX, LCT_NORMAL,
6386                                             mode, addr, ptr_mode,
6387                                             expected, mode, desired, mode);
6388       emit_move_insn (target_oval, target);
6389
6390       /* Compute the boolean return value only if requested.  */
6391       if (ptarget_bool)
6392         goto success_bool_from_val;
6393       else
6394         goto success;
6395     }
6396
6397   /* Failure.  */
6398   return false;
6399
6400  success_bool_from_val:
6401    target_bool = emit_store_flag_force (target_bool, EQ, target_oval,
6402                                         expected, VOIDmode, 1, 1);
6403  success:
6404   /* Make sure that the oval output winds up where the caller asked.  */
6405   if (ptarget_oval)
6406     *ptarget_oval = target_oval;
6407   if (ptarget_bool)
6408     *ptarget_bool = target_bool;
6409   return true;
6410 }
6411
6412 /* Generate asm volatile("" : : : "memory") as the memory blockage.  */
6413
6414 static void
6415 expand_asm_memory_blockage (void)
6416 {
6417   rtx asm_op, clob;
6418
6419   asm_op = gen_rtx_ASM_OPERANDS (VOIDmode, "", "", 0,
6420                                  rtvec_alloc (0), rtvec_alloc (0),
6421                                  rtvec_alloc (0), UNKNOWN_LOCATION);
6422   MEM_VOLATILE_P (asm_op) = 1;
6423
6424   clob = gen_rtx_SCRATCH (VOIDmode);
6425   clob = gen_rtx_MEM (BLKmode, clob);
6426   clob = gen_rtx_CLOBBER (VOIDmode, clob);
6427
6428   emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, asm_op, clob)));
6429 }
6430
6431 /* Do not propagate memory accesses across this point.  */
6432
6433 static void
6434 expand_memory_blockage (void)
6435 {
6436   if (targetm.have_memory_blockage ())
6437     emit_insn (targetm.gen_memory_blockage ());
6438   else
6439     expand_asm_memory_blockage ();
6440 }
6441
6442 /* This routine will either emit the mem_thread_fence pattern or issue a 
6443    sync_synchronize to generate a fence for memory model MEMMODEL.  */
6444
6445 void
6446 expand_mem_thread_fence (enum memmodel model)
6447 {
6448   if (is_mm_relaxed (model))
6449     return;
6450   if (targetm.have_mem_thread_fence ())
6451     {
6452       emit_insn (targetm.gen_mem_thread_fence (GEN_INT (model)));
6453       expand_memory_blockage ();
6454     }
6455   else if (targetm.have_memory_barrier ())
6456     emit_insn (targetm.gen_memory_barrier ());
6457   else if (synchronize_libfunc != NULL_RTX)
6458     emit_library_call (synchronize_libfunc, LCT_NORMAL, VOIDmode);
6459   else
6460     expand_memory_blockage ();
6461 }
6462
6463 /* Emit a signal fence with given memory model.  */
6464
6465 void
6466 expand_mem_signal_fence (enum memmodel model)
6467 {
6468   /* No machine barrier is required to implement a signal fence, but
6469      a compiler memory barrier must be issued, except for relaxed MM.  */
6470   if (!is_mm_relaxed (model))
6471     expand_memory_blockage ();
6472 }
6473
6474 /* This function expands the atomic load operation:
6475    return the atomically loaded value in MEM.
6476
6477    MEMMODEL is the memory model variant to use.
6478    TARGET is an option place to stick the return value.  */
6479
6480 rtx
6481 expand_atomic_load (rtx target, rtx mem, enum memmodel model)
6482 {
6483   machine_mode mode = GET_MODE (mem);
6484   enum insn_code icode;
6485
6486   /* If the target supports the load directly, great.  */
6487   icode = direct_optab_handler (atomic_load_optab, mode);
6488   if (icode != CODE_FOR_nothing)
6489     {
6490       struct expand_operand ops[3];
6491       rtx_insn *last = get_last_insn ();
6492       if (is_mm_seq_cst (model))
6493         expand_memory_blockage ();
6494
6495       create_output_operand (&ops[0], target, mode);
6496       create_fixed_operand (&ops[1], mem);
6497       create_integer_operand (&ops[2], model);
6498       if (maybe_expand_insn (icode, 3, ops))
6499         {
6500           if (!is_mm_relaxed (model))
6501             expand_memory_blockage ();
6502           return ops[0].value;
6503         }
6504       delete_insns_since (last);
6505     }
6506
6507   /* If the size of the object is greater than word size on this target,
6508      then we assume that a load will not be atomic.  We could try to
6509      emulate a load with a compare-and-swap operation, but the store that
6510      doing this could result in would be incorrect if this is a volatile
6511      atomic load or targetting read-only-mapped memory.  */
6512   if (maybe_gt (GET_MODE_PRECISION (mode), BITS_PER_WORD))
6513     /* If there is no atomic load, leave the library call.  */
6514     return NULL_RTX;
6515
6516   /* Otherwise assume loads are atomic, and emit the proper barriers.  */
6517   if (!target || target == const0_rtx)
6518     target = gen_reg_rtx (mode);
6519
6520   /* For SEQ_CST, emit a barrier before the load.  */
6521   if (is_mm_seq_cst (model))
6522     expand_mem_thread_fence (model);
6523
6524   emit_move_insn (target, mem);
6525
6526   /* Emit the appropriate barrier after the load.  */
6527   expand_mem_thread_fence (model);
6528
6529   return target;
6530 }
6531
6532 /* This function expands the atomic store operation:
6533    Atomically store VAL in MEM.
6534    MEMMODEL is the memory model variant to use.
6535    USE_RELEASE is true if __sync_lock_release can be used as a fall back.
6536    function returns const0_rtx if a pattern was emitted.  */
6537
6538 rtx
6539 expand_atomic_store (rtx mem, rtx val, enum memmodel model, bool use_release)
6540 {
6541   machine_mode mode = GET_MODE (mem);
6542   enum insn_code icode;
6543   struct expand_operand ops[3];
6544
6545   /* If the target supports the store directly, great.  */
6546   icode = direct_optab_handler (atomic_store_optab, mode);
6547   if (icode != CODE_FOR_nothing)
6548     {
6549       rtx_insn *last = get_last_insn ();
6550       if (!is_mm_relaxed (model))
6551         expand_memory_blockage ();
6552       create_fixed_operand (&ops[0], mem);
6553       create_input_operand (&ops[1], val, mode);
6554       create_integer_operand (&ops[2], model);
6555       if (maybe_expand_insn (icode, 3, ops))
6556         {
6557           if (is_mm_seq_cst (model))
6558             expand_memory_blockage ();
6559           return const0_rtx;
6560         }
6561       delete_insns_since (last);
6562     }
6563
6564   /* If using __sync_lock_release is a viable alternative, try it.
6565      Note that this will not be set to true if we are expanding a generic
6566      __atomic_store_n.  */
6567   if (use_release)
6568     {
6569       icode = direct_optab_handler (sync_lock_release_optab, mode);
6570       if (icode != CODE_FOR_nothing)
6571         {
6572           create_fixed_operand (&ops[0], mem);
6573           create_input_operand (&ops[1], const0_rtx, mode);
6574           if (maybe_expand_insn (icode, 2, ops))
6575             {
6576               /* lock_release is only a release barrier.  */
6577               if (is_mm_seq_cst (model))
6578                 expand_mem_thread_fence (model);
6579               return const0_rtx;
6580             }
6581         }
6582     }
6583
6584   /* If the size of the object is greater than word size on this target,
6585      a default store will not be atomic.  */
6586   if (maybe_gt (GET_MODE_PRECISION (mode), BITS_PER_WORD))
6587     {
6588       /* If loads are atomic or we are called to provide a __sync builtin,
6589          we can try a atomic_exchange and throw away the result.  Otherwise,
6590          don't do anything so that we do not create an inconsistency between
6591          loads and stores.  */
6592       if (can_atomic_load_p (mode) || is_mm_sync (model))
6593         {
6594           rtx target = maybe_emit_atomic_exchange (NULL_RTX, mem, val, model);
6595           if (!target)
6596             target = maybe_emit_compare_and_swap_exchange_loop (NULL_RTX, mem,
6597                                                                 val);
6598           if (target)
6599             return const0_rtx;
6600         }
6601         return NULL_RTX;
6602     }
6603
6604   /* Otherwise assume stores are atomic, and emit the proper barriers.  */
6605   expand_mem_thread_fence (model);
6606
6607   emit_move_insn (mem, val);
6608
6609   /* For SEQ_CST, also emit a barrier after the store.  */
6610   if (is_mm_seq_cst (model))
6611     expand_mem_thread_fence (model);
6612
6613   return const0_rtx;
6614 }
6615
6616
6617 /* Structure containing the pointers and values required to process the
6618    various forms of the atomic_fetch_op and atomic_op_fetch builtins.  */
6619
6620 struct atomic_op_functions
6621 {
6622   direct_optab mem_fetch_before;
6623   direct_optab mem_fetch_after;
6624   direct_optab mem_no_result;
6625   optab fetch_before;
6626   optab fetch_after;
6627   direct_optab no_result;
6628   enum rtx_code reverse_code;
6629 };
6630
6631
6632 /* Fill in structure pointed to by OP with the various optab entries for an 
6633    operation of type CODE.  */
6634
6635 static void
6636 get_atomic_op_for_code (struct atomic_op_functions *op, enum rtx_code code)
6637 {
6638   gcc_assert (op!= NULL);
6639
6640   /* If SWITCHABLE_TARGET is defined, then subtargets can be switched
6641      in the source code during compilation, and the optab entries are not
6642      computable until runtime.  Fill in the values at runtime.  */
6643   switch (code)
6644     {
6645     case PLUS:
6646       op->mem_fetch_before = atomic_fetch_add_optab;
6647       op->mem_fetch_after = atomic_add_fetch_optab;
6648       op->mem_no_result = atomic_add_optab;
6649       op->fetch_before = sync_old_add_optab;
6650       op->fetch_after = sync_new_add_optab;
6651       op->no_result = sync_add_optab;
6652       op->reverse_code = MINUS;
6653       break;
6654     case MINUS:
6655       op->mem_fetch_before = atomic_fetch_sub_optab;
6656       op->mem_fetch_after = atomic_sub_fetch_optab;
6657       op->mem_no_result = atomic_sub_optab;
6658       op->fetch_before = sync_old_sub_optab;
6659       op->fetch_after = sync_new_sub_optab;
6660       op->no_result = sync_sub_optab;
6661       op->reverse_code = PLUS;
6662       break;
6663     case XOR:
6664       op->mem_fetch_before = atomic_fetch_xor_optab;
6665       op->mem_fetch_after = atomic_xor_fetch_optab;
6666       op->mem_no_result = atomic_xor_optab;
6667       op->fetch_before = sync_old_xor_optab;
6668       op->fetch_after = sync_new_xor_optab;
6669       op->no_result = sync_xor_optab;
6670       op->reverse_code = XOR;
6671       break;
6672     case AND:
6673       op->mem_fetch_before = atomic_fetch_and_optab;
6674       op->mem_fetch_after = atomic_and_fetch_optab;
6675       op->mem_no_result = atomic_and_optab;
6676       op->fetch_before = sync_old_and_optab;
6677       op->fetch_after = sync_new_and_optab;
6678       op->no_result = sync_and_optab;
6679       op->reverse_code = UNKNOWN;
6680       break;
6681     case IOR:
6682       op->mem_fetch_before = atomic_fetch_or_optab;
6683       op->mem_fetch_after = atomic_or_fetch_optab;
6684       op->mem_no_result = atomic_or_optab;
6685       op->fetch_before = sync_old_ior_optab;
6686       op->fetch_after = sync_new_ior_optab;
6687       op->no_result = sync_ior_optab;
6688       op->reverse_code = UNKNOWN;
6689       break;
6690     case NOT:
6691       op->mem_fetch_before = atomic_fetch_nand_optab;
6692       op->mem_fetch_after = atomic_nand_fetch_optab;
6693       op->mem_no_result = atomic_nand_optab;
6694       op->fetch_before = sync_old_nand_optab;
6695       op->fetch_after = sync_new_nand_optab;
6696       op->no_result = sync_nand_optab;
6697       op->reverse_code = UNKNOWN;
6698       break;
6699     default:
6700       gcc_unreachable ();
6701     }
6702 }
6703
6704 /* See if there is a more optimal way to implement the operation "*MEM CODE VAL"
6705    using memory order MODEL.  If AFTER is true the operation needs to return
6706    the value of *MEM after the operation, otherwise the previous value.  
6707    TARGET is an optional place to place the result.  The result is unused if
6708    it is const0_rtx.
6709    Return the result if there is a better sequence, otherwise NULL_RTX.  */
6710
6711 static rtx
6712 maybe_optimize_fetch_op (rtx target, rtx mem, rtx val, enum rtx_code code,
6713                          enum memmodel model, bool after)
6714 {
6715   /* If the value is prefetched, or not used, it may be possible to replace
6716      the sequence with a native exchange operation.  */
6717   if (!after || target == const0_rtx)
6718     {
6719       /* fetch_and (&x, 0, m) can be replaced with exchange (&x, 0, m).  */
6720       if (code == AND && val == const0_rtx)
6721         {
6722           if (target == const0_rtx)
6723             target = gen_reg_rtx (GET_MODE (mem));
6724           return maybe_emit_atomic_exchange (target, mem, val, model);
6725         }
6726
6727       /* fetch_or (&x, -1, m) can be replaced with exchange (&x, -1, m).  */
6728       if (code == IOR && val == constm1_rtx)
6729         {
6730           if (target == const0_rtx)
6731             target = gen_reg_rtx (GET_MODE (mem));
6732           return maybe_emit_atomic_exchange (target, mem, val, model);
6733         }
6734     }
6735
6736   return NULL_RTX;
6737 }
6738
6739 /* Try to emit an instruction for a specific operation varaition. 
6740    OPTAB contains the OP functions.
6741    TARGET is an optional place to return the result. const0_rtx means unused.
6742    MEM is the memory location to operate on.
6743    VAL is the value to use in the operation.
6744    USE_MEMMODEL is TRUE if the variation with a memory model should be tried.
6745    MODEL is the memory model, if used.
6746    AFTER is true if the returned result is the value after the operation.  */
6747
6748 static rtx 
6749 maybe_emit_op (const struct atomic_op_functions *optab, rtx target, rtx mem,
6750                rtx val, bool use_memmodel, enum memmodel model, bool after)
6751 {
6752   machine_mode mode = GET_MODE (mem);
6753   struct expand_operand ops[4];
6754   enum insn_code icode;
6755   int op_counter = 0;
6756   int num_ops;
6757
6758   /* Check to see if there is a result returned.  */
6759   if (target == const0_rtx)
6760     {
6761       if (use_memmodel)
6762         {
6763           icode = direct_optab_handler (optab->mem_no_result, mode);
6764           create_integer_operand (&ops[2], model);
6765           num_ops = 3;
6766         }
6767       else
6768         {
6769           icode = direct_optab_handler (optab->no_result, mode);
6770           num_ops = 2;
6771         }
6772     }
6773   /* Otherwise, we need to generate a result.  */
6774   else
6775     {
6776       if (use_memmodel)
6777         {
6778           icode = direct_optab_handler (after ? optab->mem_fetch_after
6779                                         : optab->mem_fetch_before, mode);
6780           create_integer_operand (&ops[3], model);
6781           num_ops = 4;
6782         }
6783       else
6784         {
6785           icode = optab_handler (after ? optab->fetch_after
6786                                  : optab->fetch_before, mode);
6787           num_ops = 3;
6788         }
6789       create_output_operand (&ops[op_counter++], target, mode);
6790     }
6791   if (icode == CODE_FOR_nothing)
6792     return NULL_RTX;
6793
6794   create_fixed_operand (&ops[op_counter++], mem);
6795   /* VAL may have been promoted to a wider mode.  Shrink it if so.  */
6796   create_convert_operand_to (&ops[op_counter++], val, mode, true);
6797
6798   if (maybe_expand_insn (icode, num_ops, ops))
6799     return (target == const0_rtx ? const0_rtx : ops[0].value);
6800
6801   return NULL_RTX;
6802
6803
6804
6805 /* This function expands an atomic fetch_OP or OP_fetch operation:
6806    TARGET is an option place to stick the return value.  const0_rtx indicates
6807    the result is unused. 
6808    atomically fetch MEM, perform the operation with VAL and return it to MEM.
6809    CODE is the operation being performed (OP)
6810    MEMMODEL is the memory model variant to use.
6811    AFTER is true to return the result of the operation (OP_fetch).
6812    AFTER is false to return the value before the operation (fetch_OP).  
6813
6814    This function will *only* generate instructions if there is a direct
6815    optab. No compare and swap loops or libcalls will be generated. */
6816
6817 static rtx
6818 expand_atomic_fetch_op_no_fallback (rtx target, rtx mem, rtx val,
6819                                     enum rtx_code code, enum memmodel model,
6820                                     bool after)
6821 {
6822   machine_mode mode = GET_MODE (mem);
6823   struct atomic_op_functions optab;
6824   rtx result;
6825   bool unused_result = (target == const0_rtx);
6826
6827   get_atomic_op_for_code (&optab, code);
6828
6829   /* Check to see if there are any better instructions.  */
6830   result = maybe_optimize_fetch_op (target, mem, val, code, model, after);
6831   if (result)
6832     return result;
6833
6834   /* Check for the case where the result isn't used and try those patterns.  */
6835   if (unused_result)
6836     {
6837       /* Try the memory model variant first.  */
6838       result = maybe_emit_op (&optab, target, mem, val, true, model, true);
6839       if (result)
6840         return result;
6841
6842       /* Next try the old style withuot a memory model.  */
6843       result = maybe_emit_op (&optab, target, mem, val, false, model, true);
6844       if (result)
6845         return result;
6846
6847       /* There is no no-result pattern, so try patterns with a result.  */
6848       target = NULL_RTX;
6849     }
6850
6851   /* Try the __atomic version.  */
6852   result = maybe_emit_op (&optab, target, mem, val, true, model, after);
6853   if (result)
6854     return result;
6855
6856   /* Try the older __sync version.  */
6857   result = maybe_emit_op (&optab, target, mem, val, false, model, after);
6858   if (result)
6859     return result;
6860
6861   /* If the fetch value can be calculated from the other variation of fetch,
6862      try that operation.  */
6863   if (after || unused_result || optab.reverse_code != UNKNOWN)
6864     {
6865       /* Try the __atomic version, then the older __sync version.  */
6866       result = maybe_emit_op (&optab, target, mem, val, true, model, !after);
6867       if (!result)
6868         result = maybe_emit_op (&optab, target, mem, val, false, model, !after);
6869
6870       if (result)
6871         {
6872           /* If the result isn't used, no need to do compensation code.  */
6873           if (unused_result)
6874             return result;
6875
6876           /* Issue compensation code.  Fetch_after  == fetch_before OP val.
6877              Fetch_before == after REVERSE_OP val.  */
6878           if (!after)
6879             code = optab.reverse_code;
6880           if (code == NOT)
6881             {
6882               result = expand_simple_binop (mode, AND, result, val, NULL_RTX,
6883                                             true, OPTAB_LIB_WIDEN);
6884               result = expand_simple_unop (mode, NOT, result, target, true);
6885             }
6886           else
6887             result = expand_simple_binop (mode, code, result, val, target,
6888                                           true, OPTAB_LIB_WIDEN);
6889           return result;
6890         }
6891     }
6892
6893   /* No direct opcode can be generated.  */
6894   return NULL_RTX;
6895 }
6896
6897
6898
6899 /* This function expands an atomic fetch_OP or OP_fetch operation:
6900    TARGET is an option place to stick the return value.  const0_rtx indicates
6901    the result is unused. 
6902    atomically fetch MEM, perform the operation with VAL and return it to MEM.
6903    CODE is the operation being performed (OP)
6904    MEMMODEL is the memory model variant to use.
6905    AFTER is true to return the result of the operation (OP_fetch).
6906    AFTER is false to return the value before the operation (fetch_OP).  */
6907 rtx
6908 expand_atomic_fetch_op (rtx target, rtx mem, rtx val, enum rtx_code code,
6909                         enum memmodel model, bool after)
6910 {
6911   machine_mode mode = GET_MODE (mem);
6912   rtx result;
6913   bool unused_result = (target == const0_rtx);
6914
6915   /* If loads are not atomic for the required size and we are not called to
6916      provide a __sync builtin, do not do anything so that we stay consistent
6917      with atomic loads of the same size.  */
6918   if (!can_atomic_load_p (mode) && !is_mm_sync (model))
6919     return NULL_RTX;
6920
6921   result = expand_atomic_fetch_op_no_fallback (target, mem, val, code, model,
6922                                                after);
6923   
6924   if (result)
6925     return result;
6926
6927   /* Add/sub can be implemented by doing the reverse operation with -(val).  */
6928   if (code == PLUS || code == MINUS)
6929     {
6930       rtx tmp;
6931       enum rtx_code reverse = (code == PLUS ? MINUS : PLUS);
6932
6933       start_sequence ();
6934       tmp = expand_simple_unop (mode, NEG, val, NULL_RTX, true);
6935       result = expand_atomic_fetch_op_no_fallback (target, mem, tmp, reverse,
6936                                                    model, after);
6937       if (result)
6938         {
6939           /* PLUS worked so emit the insns and return.  */
6940           tmp = get_insns ();
6941           end_sequence ();
6942           emit_insn (tmp);
6943           return result;
6944         }
6945
6946       /* PLUS did not work, so throw away the negation code and continue.  */
6947       end_sequence ();
6948     }
6949
6950   /* Try the __sync libcalls only if we can't do compare-and-swap inline.  */
6951   if (!can_compare_and_swap_p (mode, false))
6952     {
6953       rtx libfunc;
6954       bool fixup = false;
6955       enum rtx_code orig_code = code;
6956       struct atomic_op_functions optab;
6957
6958       get_atomic_op_for_code (&optab, code);
6959       libfunc = optab_libfunc (after ? optab.fetch_after
6960                                : optab.fetch_before, mode);
6961       if (libfunc == NULL
6962           && (after || unused_result || optab.reverse_code != UNKNOWN))
6963         {
6964           fixup = true;
6965           if (!after)
6966             code = optab.reverse_code;
6967           libfunc = optab_libfunc (after ? optab.fetch_before
6968                                    : optab.fetch_after, mode);
6969         }
6970       if (libfunc != NULL)
6971         {
6972           rtx addr = convert_memory_address (ptr_mode, XEXP (mem, 0));
6973           result = emit_library_call_value (libfunc, NULL, LCT_NORMAL, mode,
6974                                             addr, ptr_mode, val, mode);
6975
6976           if (!unused_result && fixup)
6977             result = expand_simple_binop (mode, code, result, val, target,
6978                                           true, OPTAB_LIB_WIDEN);
6979           return result;
6980         }
6981
6982       /* We need the original code for any further attempts.  */
6983       code = orig_code;
6984     }
6985
6986   /* If nothing else has succeeded, default to a compare and swap loop.  */
6987   if (can_compare_and_swap_p (mode, true))
6988     {
6989       rtx_insn *insn;
6990       rtx t0 = gen_reg_rtx (mode), t1;
6991
6992       start_sequence ();
6993
6994       /* If the result is used, get a register for it.  */
6995       if (!unused_result) 
6996         {
6997           if (!target || !register_operand (target, mode))
6998             target = gen_reg_rtx (mode);
6999           /* If fetch_before, copy the value now.  */
7000           if (!after)
7001             emit_move_insn (target, t0);
7002         }
7003       else
7004         target = const0_rtx;
7005
7006       t1 = t0;
7007       if (code == NOT)
7008         {
7009           t1 = expand_simple_binop (mode, AND, t1, val, NULL_RTX,
7010                                     true, OPTAB_LIB_WIDEN);
7011           t1 = expand_simple_unop (mode, code, t1, NULL_RTX, true);
7012         }
7013       else
7014         t1 = expand_simple_binop (mode, code, t1, val, NULL_RTX, true, 
7015                                   OPTAB_LIB_WIDEN);
7016
7017       /* For after, copy the value now.  */
7018       if (!unused_result && after)
7019         emit_move_insn (target, t1);
7020       insn = get_insns ();
7021       end_sequence ();
7022
7023       if (t1 != NULL && expand_compare_and_swap_loop (mem, t0, t1, insn))
7024         return target;
7025     }
7026
7027   return NULL_RTX;
7028 }
7029 \f
7030 /* Return true if OPERAND is suitable for operand number OPNO of
7031    instruction ICODE.  */
7032
7033 bool
7034 insn_operand_matches (enum insn_code icode, unsigned int opno, rtx operand)
7035 {
7036   return (!insn_data[(int) icode].operand[opno].predicate
7037           || (insn_data[(int) icode].operand[opno].predicate
7038               (operand, insn_data[(int) icode].operand[opno].mode)));
7039 }
7040 \f
7041 /* TARGET is a target of a multiword operation that we are going to
7042    implement as a series of word-mode operations.  Return true if
7043    TARGET is suitable for this purpose.  */
7044
7045 bool
7046 valid_multiword_target_p (rtx target)
7047 {
7048   machine_mode mode;
7049   int i, size;
7050
7051   mode = GET_MODE (target);
7052   if (!GET_MODE_SIZE (mode).is_constant (&size))
7053     return false;
7054   for (i = 0; i < size; i += UNITS_PER_WORD)
7055     if (!validate_subreg (word_mode, mode, target, i))
7056       return false;
7057   return true;
7058 }
7059
7060 /* Make OP describe an input operand that has value INTVAL and that has
7061    no inherent mode.  This function should only be used for operands that
7062    are always expand-time constants.  The backend may request that INTVAL
7063    be copied into a different kind of rtx, but it must specify the mode
7064    of that rtx if so.  */
7065
7066 void
7067 create_integer_operand (struct expand_operand *op, poly_int64 intval)
7068 {
7069   create_expand_operand (op, EXPAND_INTEGER,
7070                          gen_int_mode (intval, MAX_MODE_INT),
7071                          VOIDmode, false, intval);
7072 }
7073
7074 /* Like maybe_legitimize_operand, but do not change the code of the
7075    current rtx value.  */
7076
7077 static bool
7078 maybe_legitimize_operand_same_code (enum insn_code icode, unsigned int opno,
7079                                     struct expand_operand *op)
7080 {
7081   /* See if the operand matches in its current form.  */
7082   if (insn_operand_matches (icode, opno, op->value))
7083     return true;
7084
7085   /* If the operand is a memory whose address has no side effects,
7086      try forcing the address into a non-virtual pseudo register.
7087      The check for side effects is important because copy_to_mode_reg
7088      cannot handle things like auto-modified addresses.  */
7089   if (insn_data[(int) icode].operand[opno].allows_mem && MEM_P (op->value))
7090     {
7091       rtx addr, mem;
7092
7093       mem = op->value;
7094       addr = XEXP (mem, 0);
7095       if (!(REG_P (addr) && REGNO (addr) > LAST_VIRTUAL_REGISTER)
7096           && !side_effects_p (addr))
7097         {
7098           rtx_insn *last;
7099           machine_mode mode;
7100
7101           last = get_last_insn ();
7102           mode = get_address_mode (mem);
7103           mem = replace_equiv_address (mem, copy_to_mode_reg (mode, addr));
7104           if (insn_operand_matches (icode, opno, mem))
7105             {
7106               op->value = mem;
7107               return true;
7108             }
7109           delete_insns_since (last);
7110         }
7111     }
7112
7113   return false;
7114 }
7115
7116 /* Try to make OP match operand OPNO of instruction ICODE.  Return true
7117    on success, storing the new operand value back in OP.  */
7118
7119 static bool
7120 maybe_legitimize_operand (enum insn_code icode, unsigned int opno,
7121                           struct expand_operand *op)
7122 {
7123   machine_mode mode, imode;
7124   bool old_volatile_ok, result;
7125
7126   mode = op->mode;
7127   switch (op->type)
7128     {
7129     case EXPAND_FIXED:
7130       old_volatile_ok = volatile_ok;
7131       volatile_ok = true;
7132       result = maybe_legitimize_operand_same_code (icode, opno, op);
7133       volatile_ok = old_volatile_ok;
7134       return result;
7135
7136     case EXPAND_OUTPUT:
7137       gcc_assert (mode != VOIDmode);
7138       if (op->value
7139           && op->value != const0_rtx
7140           && GET_MODE (op->value) == mode
7141           && maybe_legitimize_operand_same_code (icode, opno, op))
7142         return true;
7143
7144       op->value = gen_reg_rtx (mode);
7145       op->target = 0;
7146       break;
7147
7148     case EXPAND_INPUT:
7149     input:
7150       gcc_assert (mode != VOIDmode);
7151       gcc_assert (GET_MODE (op->value) == VOIDmode
7152                   || GET_MODE (op->value) == mode);
7153       if (maybe_legitimize_operand_same_code (icode, opno, op))
7154         return true;
7155
7156       op->value = copy_to_mode_reg (mode, op->value);
7157       break;
7158
7159     case EXPAND_CONVERT_TO:
7160       gcc_assert (mode != VOIDmode);
7161       op->value = convert_to_mode (mode, op->value, op->unsigned_p);
7162       goto input;
7163
7164     case EXPAND_CONVERT_FROM:
7165       if (GET_MODE (op->value) != VOIDmode)
7166         mode = GET_MODE (op->value);
7167       else
7168         /* The caller must tell us what mode this value has.  */
7169         gcc_assert (mode != VOIDmode);
7170
7171       imode = insn_data[(int) icode].operand[opno].mode;
7172       if (imode != VOIDmode && imode != mode)
7173         {
7174           op->value = convert_modes (imode, mode, op->value, op->unsigned_p);
7175           mode = imode;
7176         }
7177       goto input;
7178
7179     case EXPAND_ADDRESS:
7180       op->value = convert_memory_address (as_a <scalar_int_mode> (mode),
7181                                           op->value);
7182       goto input;
7183
7184     case EXPAND_INTEGER:
7185       mode = insn_data[(int) icode].operand[opno].mode;
7186       if (mode != VOIDmode
7187           && known_eq (trunc_int_for_mode (op->int_value, mode),
7188                        op->int_value))
7189         {
7190           op->value = gen_int_mode (op->int_value, mode);
7191           goto input;
7192         }
7193       break;
7194     }
7195   return insn_operand_matches (icode, opno, op->value);
7196 }
7197
7198 /* Make OP describe an input operand that should have the same value
7199    as VALUE, after any mode conversion that the target might request.
7200    TYPE is the type of VALUE.  */
7201
7202 void
7203 create_convert_operand_from_type (struct expand_operand *op,
7204                                   rtx value, tree type)
7205 {
7206   create_convert_operand_from (op, value, TYPE_MODE (type),
7207                                TYPE_UNSIGNED (type));
7208 }
7209
7210 /* Try to make operands [OPS, OPS + NOPS) match operands [OPNO, OPNO + NOPS)
7211    of instruction ICODE.  Return true on success, leaving the new operand
7212    values in the OPS themselves.  Emit no code on failure.  */
7213
7214 bool
7215 maybe_legitimize_operands (enum insn_code icode, unsigned int opno,
7216                            unsigned int nops, struct expand_operand *ops)
7217 {
7218   rtx_insn *last;
7219   unsigned int i;
7220
7221   last = get_last_insn ();
7222   for (i = 0; i < nops; i++)
7223     if (!maybe_legitimize_operand (icode, opno + i, &ops[i]))
7224       {
7225         delete_insns_since (last);
7226         return false;
7227       }
7228   return true;
7229 }
7230
7231 /* Try to generate instruction ICODE, using operands [OPS, OPS + NOPS)
7232    as its operands.  Return the instruction pattern on success,
7233    and emit any necessary set-up code.  Return null and emit no
7234    code on failure.  */
7235
7236 rtx_insn *
7237 maybe_gen_insn (enum insn_code icode, unsigned int nops,
7238                 struct expand_operand *ops)
7239 {
7240   gcc_assert (nops == (unsigned int) insn_data[(int) icode].n_generator_args);
7241   if (!maybe_legitimize_operands (icode, 0, nops, ops))
7242     return NULL;
7243
7244   switch (nops)
7245     {
7246     case 1:
7247       return GEN_FCN (icode) (ops[0].value);
7248     case 2:
7249       return GEN_FCN (icode) (ops[0].value, ops[1].value);
7250     case 3:
7251       return GEN_FCN (icode) (ops[0].value, ops[1].value, ops[2].value);
7252     case 4:
7253       return GEN_FCN (icode) (ops[0].value, ops[1].value, ops[2].value,
7254                               ops[3].value);
7255     case 5:
7256       return GEN_FCN (icode) (ops[0].value, ops[1].value, ops[2].value,
7257                               ops[3].value, ops[4].value);
7258     case 6:
7259       return GEN_FCN (icode) (ops[0].value, ops[1].value, ops[2].value,
7260                               ops[3].value, ops[4].value, ops[5].value);
7261     case 7:
7262       return GEN_FCN (icode) (ops[0].value, ops[1].value, ops[2].value,
7263                               ops[3].value, ops[4].value, ops[5].value,
7264                               ops[6].value);
7265     case 8:
7266       return GEN_FCN (icode) (ops[0].value, ops[1].value, ops[2].value,
7267                               ops[3].value, ops[4].value, ops[5].value,
7268                               ops[6].value, ops[7].value);
7269     case 9:
7270       return GEN_FCN (icode) (ops[0].value, ops[1].value, ops[2].value,
7271                               ops[3].value, ops[4].value, ops[5].value,
7272                               ops[6].value, ops[7].value, ops[8].value);
7273     }
7274   gcc_unreachable ();
7275 }
7276
7277 /* Try to emit instruction ICODE, using operands [OPS, OPS + NOPS)
7278    as its operands.  Return true on success and emit no code on failure.  */
7279
7280 bool
7281 maybe_expand_insn (enum insn_code icode, unsigned int nops,
7282                    struct expand_operand *ops)
7283 {
7284   rtx_insn *pat = maybe_gen_insn (icode, nops, ops);
7285   if (pat)
7286     {
7287       emit_insn (pat);
7288       return true;
7289     }
7290   return false;
7291 }
7292
7293 /* Like maybe_expand_insn, but for jumps.  */
7294
7295 bool
7296 maybe_expand_jump_insn (enum insn_code icode, unsigned int nops,
7297                         struct expand_operand *ops)
7298 {
7299   rtx_insn *pat = maybe_gen_insn (icode, nops, ops);
7300   if (pat)
7301     {
7302       emit_jump_insn (pat);
7303       return true;
7304     }
7305   return false;
7306 }
7307
7308 /* Emit instruction ICODE, using operands [OPS, OPS + NOPS)
7309    as its operands.  */
7310
7311 void
7312 expand_insn (enum insn_code icode, unsigned int nops,
7313              struct expand_operand *ops)
7314 {
7315   if (!maybe_expand_insn (icode, nops, ops))
7316     gcc_unreachable ();
7317 }
7318
7319 /* Like expand_insn, but for jumps.  */
7320
7321 void
7322 expand_jump_insn (enum insn_code icode, unsigned int nops,
7323                   struct expand_operand *ops)
7324 {
7325   if (!maybe_expand_jump_insn (icode, nops, ops))
7326     gcc_unreachable ();
7327 }