OSDN Git Service

3fb76b45a543d4a2b264d6cec66fa48fb75d0025
[pf3gnuchains/gcc-fork.git] / gcc / expmed.c
1 /* Medium-level subroutines: convert bit-field store and extract
2    and shifts, multiplies and divides to rtl instructions.
3    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4    1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA.  */
22
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "toplev.h"
29 #include "rtl.h"
30 #include "tree.h"
31 #include "tm_p.h"
32 #include "flags.h"
33 #include "insn-config.h"
34 #include "expr.h"
35 #include "optabs.h"
36 #include "real.h"
37 #include "recog.h"
38 #include "langhooks.h"
39
40 static void store_fixed_bit_field (rtx, unsigned HOST_WIDE_INT,
41                                    unsigned HOST_WIDE_INT,
42                                    unsigned HOST_WIDE_INT, rtx);
43 static void store_split_bit_field (rtx, unsigned HOST_WIDE_INT,
44                                    unsigned HOST_WIDE_INT, rtx);
45 static rtx extract_fixed_bit_field (enum machine_mode, rtx,
46                                     unsigned HOST_WIDE_INT,
47                                     unsigned HOST_WIDE_INT,
48                                     unsigned HOST_WIDE_INT, rtx, int);
49 static rtx mask_rtx (enum machine_mode, int, int, int);
50 static rtx lshift_value (enum machine_mode, rtx, int, int);
51 static rtx extract_split_bit_field (rtx, unsigned HOST_WIDE_INT,
52                                     unsigned HOST_WIDE_INT, int);
53 static void do_cmp_and_jump (rtx, rtx, enum rtx_code, enum machine_mode, rtx);
54
55 /* Nonzero means divides or modulus operations are relatively cheap for
56    powers of two, so don't use branches; emit the operation instead.
57    Usually, this will mean that the MD file will emit non-branch
58    sequences.  */
59
60 static int sdiv_pow2_cheap, smod_pow2_cheap;
61
62 #ifndef SLOW_UNALIGNED_ACCESS
63 #define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) STRICT_ALIGNMENT
64 #endif
65
66 /* For compilers that support multiple targets with different word sizes,
67    MAX_BITS_PER_WORD contains the biggest value of BITS_PER_WORD.  An example
68    is the H8/300(H) compiler.  */
69
70 #ifndef MAX_BITS_PER_WORD
71 #define MAX_BITS_PER_WORD BITS_PER_WORD
72 #endif
73
74 /* Reduce conditional compilation elsewhere.  */
75 #ifndef HAVE_insv
76 #define HAVE_insv       0
77 #define CODE_FOR_insv   CODE_FOR_nothing
78 #define gen_insv(a,b,c,d) NULL_RTX
79 #endif
80 #ifndef HAVE_extv
81 #define HAVE_extv       0
82 #define CODE_FOR_extv   CODE_FOR_nothing
83 #define gen_extv(a,b,c,d) NULL_RTX
84 #endif
85 #ifndef HAVE_extzv
86 #define HAVE_extzv      0
87 #define CODE_FOR_extzv  CODE_FOR_nothing
88 #define gen_extzv(a,b,c,d) NULL_RTX
89 #endif
90
91 /* Cost of various pieces of RTL.  Note that some of these are indexed by
92    shift count and some by mode.  */
93 static int add_cost, negate_cost, zero_cost;
94 static int shift_cost[MAX_BITS_PER_WORD];
95 static int shiftadd_cost[MAX_BITS_PER_WORD];
96 static int shiftsub_cost[MAX_BITS_PER_WORD];
97 static int mul_cost[NUM_MACHINE_MODES];
98 static int div_cost[NUM_MACHINE_MODES];
99 static int mul_widen_cost[NUM_MACHINE_MODES];
100 static int mul_highpart_cost[NUM_MACHINE_MODES];
101
102 void
103 init_expmed (void)
104 {
105   rtx reg, shift_insn, shiftadd_insn, shiftsub_insn;
106   int dummy;
107   int m;
108   enum machine_mode mode, wider_mode;
109
110   start_sequence ();
111
112   /* This is "some random pseudo register" for purposes of calling recog
113      to see what insns exist.  */
114   reg = gen_rtx_REG (word_mode, 10000);
115
116   zero_cost = rtx_cost (const0_rtx, 0);
117   add_cost = rtx_cost (gen_rtx_PLUS (word_mode, reg, reg), SET);
118
119   shift_insn = emit_insn (gen_rtx_SET (VOIDmode, reg,
120                                        gen_rtx_ASHIFT (word_mode, reg,
121                                                        const0_rtx)));
122
123   shiftadd_insn
124     = emit_insn (gen_rtx_SET (VOIDmode, reg,
125                               gen_rtx_PLUS (word_mode,
126                                             gen_rtx_MULT (word_mode,
127                                                           reg, const0_rtx),
128                                             reg)));
129
130   shiftsub_insn
131     = emit_insn (gen_rtx_SET (VOIDmode, reg,
132                               gen_rtx_MINUS (word_mode,
133                                              gen_rtx_MULT (word_mode,
134                                                            reg, const0_rtx),
135                                              reg)));
136
137   init_recog ();
138
139   shift_cost[0] = 0;
140   shiftadd_cost[0] = shiftsub_cost[0] = add_cost;
141
142   for (m = 1; m < MAX_BITS_PER_WORD; m++)
143     {
144       rtx c_int = GEN_INT ((HOST_WIDE_INT) 1 << m);
145       shift_cost[m] = shiftadd_cost[m] = shiftsub_cost[m] = 32000;
146
147       XEXP (SET_SRC (PATTERN (shift_insn)), 1) = GEN_INT (m);
148       if (recog (PATTERN (shift_insn), shift_insn, &dummy) >= 0)
149         shift_cost[m] = rtx_cost (SET_SRC (PATTERN (shift_insn)), SET);
150
151       XEXP (XEXP (SET_SRC (PATTERN (shiftadd_insn)), 0), 1) = c_int;
152       if (recog (PATTERN (shiftadd_insn), shiftadd_insn, &dummy) >= 0)
153         shiftadd_cost[m] = rtx_cost (SET_SRC (PATTERN (shiftadd_insn)), SET);
154
155       XEXP (XEXP (SET_SRC (PATTERN (shiftsub_insn)), 0), 1) = c_int;
156       if (recog (PATTERN (shiftsub_insn), shiftsub_insn, &dummy) >= 0)
157         shiftsub_cost[m] = rtx_cost (SET_SRC (PATTERN (shiftsub_insn)), SET);
158     }
159
160   negate_cost = rtx_cost (gen_rtx_NEG (word_mode, reg), SET);
161
162   sdiv_pow2_cheap
163     = (rtx_cost (gen_rtx_DIV (word_mode, reg, GEN_INT (32)), SET)
164        <= 2 * add_cost);
165   smod_pow2_cheap
166     = (rtx_cost (gen_rtx_MOD (word_mode, reg, GEN_INT (32)), SET)
167        <= 2 * add_cost);
168
169   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
170        mode != VOIDmode;
171        mode = GET_MODE_WIDER_MODE (mode))
172     {
173       reg = gen_rtx_REG (mode, 10000);
174       div_cost[(int) mode] = rtx_cost (gen_rtx_UDIV (mode, reg, reg), SET);
175       mul_cost[(int) mode] = rtx_cost (gen_rtx_MULT (mode, reg, reg), SET);
176       wider_mode = GET_MODE_WIDER_MODE (mode);
177       if (wider_mode != VOIDmode)
178         {
179           mul_widen_cost[(int) wider_mode]
180             = rtx_cost (gen_rtx_MULT (wider_mode,
181                                       gen_rtx_ZERO_EXTEND (wider_mode, reg),
182                                       gen_rtx_ZERO_EXTEND (wider_mode, reg)),
183                         SET);
184           mul_highpart_cost[(int) mode]
185             = rtx_cost (gen_rtx_TRUNCATE
186                         (mode,
187                          gen_rtx_LSHIFTRT (wider_mode,
188                                            gen_rtx_MULT (wider_mode,
189                                                          gen_rtx_ZERO_EXTEND
190                                                          (wider_mode, reg),
191                                                          gen_rtx_ZERO_EXTEND
192                                                          (wider_mode, reg)),
193                                            GEN_INT (GET_MODE_BITSIZE (mode)))),
194                         SET);
195         }
196     }
197
198   end_sequence ();
199 }
200
201 /* Return an rtx representing minus the value of X.
202    MODE is the intended mode of the result,
203    useful if X is a CONST_INT.  */
204
205 rtx
206 negate_rtx (enum machine_mode mode, rtx x)
207 {
208   rtx result = simplify_unary_operation (NEG, mode, x, mode);
209
210   if (result == 0)
211     result = expand_unop (mode, neg_optab, x, NULL_RTX, 0);
212
213   return result;
214 }
215
216 /* Report on the availability of insv/extv/extzv and the desired mode
217    of each of their operands.  Returns MAX_MACHINE_MODE if HAVE_foo
218    is false; else the mode of the specified operand.  If OPNO is -1,
219    all the caller cares about is whether the insn is available.  */
220 enum machine_mode
221 mode_for_extraction (enum extraction_pattern pattern, int opno)
222 {
223   const struct insn_data *data;
224
225   switch (pattern)
226     {
227     case EP_insv:
228       if (HAVE_insv)
229         {
230           data = &insn_data[CODE_FOR_insv];
231           break;
232         }
233       return MAX_MACHINE_MODE;
234
235     case EP_extv:
236       if (HAVE_extv)
237         {
238           data = &insn_data[CODE_FOR_extv];
239           break;
240         }
241       return MAX_MACHINE_MODE;
242
243     case EP_extzv:
244       if (HAVE_extzv)
245         {
246           data = &insn_data[CODE_FOR_extzv];
247           break;
248         }
249       return MAX_MACHINE_MODE;
250
251     default:
252       abort ();
253     }
254
255   if (opno == -1)
256     return VOIDmode;
257
258   /* Everyone who uses this function used to follow it with
259      if (result == VOIDmode) result = word_mode; */
260   if (data->operand[opno].mode == VOIDmode)
261     return word_mode;
262   return data->operand[opno].mode;
263 }
264
265 \f
266 /* Generate code to store value from rtx VALUE
267    into a bit-field within structure STR_RTX
268    containing BITSIZE bits starting at bit BITNUM.
269    FIELDMODE is the machine-mode of the FIELD_DECL node for this field.
270    ALIGN is the alignment that STR_RTX is known to have.
271    TOTAL_SIZE is the size of the structure in bytes, or -1 if varying.  */
272
273 /* ??? Note that there are two different ideas here for how
274    to determine the size to count bits within, for a register.
275    One is BITS_PER_WORD, and the other is the size of operand 3
276    of the insv pattern.
277
278    If operand 3 of the insv pattern is VOIDmode, then we will use BITS_PER_WORD
279    else, we use the mode of operand 3.  */
280
281 rtx
282 store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
283                  unsigned HOST_WIDE_INT bitnum, enum machine_mode fieldmode,
284                  rtx value, HOST_WIDE_INT total_size)
285 {
286   unsigned int unit
287     = (GET_CODE (str_rtx) == MEM) ? BITS_PER_UNIT : BITS_PER_WORD;
288   unsigned HOST_WIDE_INT offset = bitnum / unit;
289   unsigned HOST_WIDE_INT bitpos = bitnum % unit;
290   rtx op0 = str_rtx;
291   int byte_offset;
292
293   enum machine_mode op_mode = mode_for_extraction (EP_insv, 3);
294
295   /* Discount the part of the structure before the desired byte.
296      We need to know how many bytes are safe to reference after it.  */
297   if (total_size >= 0)
298     total_size -= (bitpos / BIGGEST_ALIGNMENT
299                    * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
300
301   while (GET_CODE (op0) == SUBREG)
302     {
303       /* The following line once was done only if WORDS_BIG_ENDIAN,
304          but I think that is a mistake.  WORDS_BIG_ENDIAN is
305          meaningful at a much higher level; when structures are copied
306          between memory and regs, the higher-numbered regs
307          always get higher addresses.  */
308       offset += (SUBREG_BYTE (op0) / UNITS_PER_WORD);
309       /* We used to adjust BITPOS here, but now we do the whole adjustment
310          right after the loop.  */
311       op0 = SUBREG_REG (op0);
312     }
313
314   value = protect_from_queue (value, 0);
315
316   /* Use vec_extract patterns for extracting parts of vectors whenever
317      available.  */
318   if (VECTOR_MODE_P (GET_MODE (op0))
319       && GET_CODE (op0) != MEM
320       && (vec_set_optab->handlers[(int)GET_MODE (op0)].insn_code
321           != CODE_FOR_nothing)
322       && fieldmode == GET_MODE_INNER (GET_MODE (op0))
323       && bitsize == GET_MODE_BITSIZE (GET_MODE_INNER (GET_MODE (op0)))
324       && !(bitnum % GET_MODE_BITSIZE (GET_MODE_INNER (GET_MODE (op0)))))
325     {
326       enum machine_mode outermode = GET_MODE (op0);
327       enum machine_mode innermode = GET_MODE_INNER (outermode);
328       int icode = (int) vec_set_optab->handlers[(int) outermode].insn_code;
329       int pos = bitnum / GET_MODE_BITSIZE (innermode);
330       rtx rtxpos = GEN_INT (pos);
331       rtx src = value;
332       rtx dest = op0;
333       rtx pat, seq;
334       enum machine_mode mode0 = insn_data[icode].operand[0].mode;
335       enum machine_mode mode1 = insn_data[icode].operand[1].mode;
336       enum machine_mode mode2 = insn_data[icode].operand[2].mode;
337
338       start_sequence ();
339
340       if (! (*insn_data[icode].operand[1].predicate) (src, mode1))
341         src = copy_to_mode_reg (mode1, src);
342
343       if (! (*insn_data[icode].operand[2].predicate) (rtxpos, mode2))
344         rtxpos = copy_to_mode_reg (mode1, rtxpos);
345
346       /* We could handle this, but we should always be called with a pseudo
347          for our targets and all insns should take them as outputs.  */
348       if (! (*insn_data[icode].operand[0].predicate) (dest, mode0)
349           || ! (*insn_data[icode].operand[1].predicate) (src, mode1)
350           || ! (*insn_data[icode].operand[2].predicate) (rtxpos, mode2))
351         abort ();
352       pat = GEN_FCN (icode) (dest, src, rtxpos);
353       seq = get_insns ();
354       end_sequence ();
355       if (pat)
356         {
357           emit_insn (seq);
358           emit_insn (pat);
359           return dest;
360         }
361     }
362
363   if (flag_force_mem)
364     {
365       int old_generating_concat_p = generating_concat_p;
366       generating_concat_p = 0;
367       value = force_not_mem (value);
368       generating_concat_p = old_generating_concat_p;
369     }
370
371   /* If the target is a register, overwriting the entire object, or storing
372      a full-word or multi-word field can be done with just a SUBREG.
373
374      If the target is memory, storing any naturally aligned field can be
375      done with a simple store.  For targets that support fast unaligned
376      memory, any naturally sized, unit aligned field can be done directly.  */
377
378   byte_offset = (bitnum % BITS_PER_WORD) / BITS_PER_UNIT
379                 + (offset * UNITS_PER_WORD);
380
381   if (bitpos == 0
382       && bitsize == GET_MODE_BITSIZE (fieldmode)
383       && (GET_CODE (op0) != MEM
384           ? ((GET_MODE_SIZE (fieldmode) >= UNITS_PER_WORD
385              || GET_MODE_SIZE (GET_MODE (op0)) == GET_MODE_SIZE (fieldmode))
386              && byte_offset % GET_MODE_SIZE (fieldmode) == 0)
387           : (! SLOW_UNALIGNED_ACCESS (fieldmode, MEM_ALIGN (op0))
388              || (offset * BITS_PER_UNIT % bitsize == 0
389                  && MEM_ALIGN (op0) % GET_MODE_BITSIZE (fieldmode) == 0))))
390     {
391       if (GET_MODE (op0) != fieldmode)
392         {
393           if (GET_CODE (op0) == SUBREG)
394             {
395               if (GET_MODE (SUBREG_REG (op0)) == fieldmode
396                   || GET_MODE_CLASS (fieldmode) == MODE_INT
397                   || GET_MODE_CLASS (fieldmode) == MODE_PARTIAL_INT)
398                 op0 = SUBREG_REG (op0);
399               else
400                 /* Else we've got some float mode source being extracted into
401                    a different float mode destination -- this combination of
402                    subregs results in Severe Tire Damage.  */
403                 abort ();
404             }
405           if (GET_CODE (op0) == REG)
406             op0 = gen_rtx_SUBREG (fieldmode, op0, byte_offset);
407           else
408             op0 = adjust_address (op0, fieldmode, offset);
409         }
410       emit_move_insn (op0, value);
411       return value;
412     }
413
414   /* Make sure we are playing with integral modes.  Pun with subregs
415      if we aren't.  This must come after the entire register case above,
416      since that case is valid for any mode.  The following cases are only
417      valid for integral modes.  */
418   {
419     enum machine_mode imode = int_mode_for_mode (GET_MODE (op0));
420     if (imode != GET_MODE (op0))
421       {
422         if (GET_CODE (op0) == MEM)
423           op0 = adjust_address (op0, imode, 0);
424         else if (imode != BLKmode)
425           op0 = gen_lowpart (imode, op0);
426         else
427           abort ();
428       }
429   }
430
431   /* We may be accessing data outside the field, which means
432      we can alias adjacent data.  */
433   if (GET_CODE (op0) == MEM)
434     {
435       op0 = shallow_copy_rtx (op0);
436       set_mem_alias_set (op0, 0);
437       set_mem_expr (op0, 0);
438     }
439
440   /* If OP0 is a register, BITPOS must count within a word.
441      But as we have it, it counts within whatever size OP0 now has.
442      On a bigendian machine, these are not the same, so convert.  */
443   if (BYTES_BIG_ENDIAN
444       && GET_CODE (op0) != MEM
445       && unit > GET_MODE_BITSIZE (GET_MODE (op0)))
446     bitpos += unit - GET_MODE_BITSIZE (GET_MODE (op0));
447
448   /* Storing an lsb-aligned field in a register
449      can be done with a movestrict instruction.  */
450
451   if (GET_CODE (op0) != MEM
452       && (BYTES_BIG_ENDIAN ? bitpos + bitsize == unit : bitpos == 0)
453       && bitsize == GET_MODE_BITSIZE (fieldmode)
454       && (movstrict_optab->handlers[(int) fieldmode].insn_code
455           != CODE_FOR_nothing))
456     {
457       int icode = movstrict_optab->handlers[(int) fieldmode].insn_code;
458
459       /* Get appropriate low part of the value being stored.  */
460       if (GET_CODE (value) == CONST_INT || GET_CODE (value) == REG)
461         value = gen_lowpart (fieldmode, value);
462       else if (!(GET_CODE (value) == SYMBOL_REF
463                  || GET_CODE (value) == LABEL_REF
464                  || GET_CODE (value) == CONST))
465         value = convert_to_mode (fieldmode, value, 0);
466
467       if (! (*insn_data[icode].operand[1].predicate) (value, fieldmode))
468         value = copy_to_mode_reg (fieldmode, value);
469
470       if (GET_CODE (op0) == SUBREG)
471         {
472           if (GET_MODE (SUBREG_REG (op0)) == fieldmode
473               || GET_MODE_CLASS (fieldmode) == MODE_INT
474               || GET_MODE_CLASS (fieldmode) == MODE_PARTIAL_INT)
475             op0 = SUBREG_REG (op0);
476           else
477             /* Else we've got some float mode source being extracted into
478                a different float mode destination -- this combination of
479                subregs results in Severe Tire Damage.  */
480             abort ();
481         }
482
483       emit_insn (GEN_FCN (icode)
484                  (gen_rtx_SUBREG (fieldmode, op0,
485                                   (bitnum % BITS_PER_WORD) / BITS_PER_UNIT
486                                   + (offset * UNITS_PER_WORD)),
487                                   value));
488
489       return value;
490     }
491
492   /* Handle fields bigger than a word.  */
493
494   if (bitsize > BITS_PER_WORD)
495     {
496       /* Here we transfer the words of the field
497          in the order least significant first.
498          This is because the most significant word is the one which may
499          be less than full.
500          However, only do that if the value is not BLKmode.  */
501
502       unsigned int backwards = WORDS_BIG_ENDIAN && fieldmode != BLKmode;
503       unsigned int nwords = (bitsize + (BITS_PER_WORD - 1)) / BITS_PER_WORD;
504       unsigned int i;
505
506       /* This is the mode we must force value to, so that there will be enough
507          subwords to extract.  Note that fieldmode will often (always?) be
508          VOIDmode, because that is what store_field uses to indicate that this
509          is a bit field, but passing VOIDmode to operand_subword_force will
510          result in an abort.  */
511       fieldmode = GET_MODE (value);
512       if (fieldmode == VOIDmode)
513         fieldmode = smallest_mode_for_size (nwords * BITS_PER_WORD, MODE_INT);
514
515       for (i = 0; i < nwords; i++)
516         {
517           /* If I is 0, use the low-order word in both field and target;
518              if I is 1, use the next to lowest word; and so on.  */
519           unsigned int wordnum = (backwards ? nwords - i - 1 : i);
520           unsigned int bit_offset = (backwards
521                                      ? MAX ((int) bitsize - ((int) i + 1)
522                                             * BITS_PER_WORD,
523                                             0)
524                                      : (int) i * BITS_PER_WORD);
525
526           store_bit_field (op0, MIN (BITS_PER_WORD,
527                                      bitsize - i * BITS_PER_WORD),
528                            bitnum + bit_offset, word_mode,
529                            operand_subword_force (value, wordnum, fieldmode),
530                            total_size);
531         }
532       return value;
533     }
534
535   /* From here on we can assume that the field to be stored in is
536      a full-word (whatever type that is), since it is shorter than a word.  */
537
538   /* OFFSET is the number of words or bytes (UNIT says which)
539      from STR_RTX to the first word or byte containing part of the field.  */
540
541   if (GET_CODE (op0) != MEM)
542     {
543       if (offset != 0
544           || GET_MODE_SIZE (GET_MODE (op0)) > UNITS_PER_WORD)
545         {
546           if (GET_CODE (op0) != REG)
547             {
548               /* Since this is a destination (lvalue), we can't copy it to a
549                  pseudo.  We can trivially remove a SUBREG that does not
550                  change the size of the operand.  Such a SUBREG may have been
551                  added above.  Otherwise, abort.  */
552               if (GET_CODE (op0) == SUBREG
553                   && (GET_MODE_SIZE (GET_MODE (op0))
554                       == GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0)))))
555                 op0 = SUBREG_REG (op0);
556               else
557                 abort ();
558             }
559           op0 = gen_rtx_SUBREG (mode_for_size (BITS_PER_WORD, MODE_INT, 0),
560                                 op0, (offset * UNITS_PER_WORD));
561         }
562       offset = 0;
563     }
564   else
565     op0 = protect_from_queue (op0, 1);
566
567   /* If VALUE is a floating-point mode, access it as an integer of the
568      corresponding size.  This can occur on a machine with 64 bit registers
569      that uses SFmode for float.  This can also occur for unaligned float
570      structure fields.  */
571   if (GET_MODE_CLASS (GET_MODE (value)) != MODE_INT
572       && GET_MODE_CLASS (GET_MODE (value)) != MODE_PARTIAL_INT)
573     value = gen_lowpart ((GET_MODE (value) == VOIDmode
574                           ? word_mode : int_mode_for_mode (GET_MODE (value))),
575                          value);
576
577   /* Now OFFSET is nonzero only if OP0 is memory
578      and is therefore always measured in bytes.  */
579
580   if (HAVE_insv
581       && GET_MODE (value) != BLKmode
582       && !(bitsize == 1 && GET_CODE (value) == CONST_INT)
583       /* Ensure insv's size is wide enough for this field.  */
584       && (GET_MODE_BITSIZE (op_mode) >= bitsize)
585       && ! ((GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG)
586             && (bitsize + bitpos > GET_MODE_BITSIZE (op_mode))))
587     {
588       int xbitpos = bitpos;
589       rtx value1;
590       rtx xop0 = op0;
591       rtx last = get_last_insn ();
592       rtx pat;
593       enum machine_mode maxmode = mode_for_extraction (EP_insv, 3);
594       int save_volatile_ok = volatile_ok;
595
596       volatile_ok = 1;
597
598       /* If this machine's insv can only insert into a register, copy OP0
599          into a register and save it back later.  */
600       /* This used to check flag_force_mem, but that was a serious
601          de-optimization now that flag_force_mem is enabled by -O2.  */
602       if (GET_CODE (op0) == MEM
603           && ! ((*insn_data[(int) CODE_FOR_insv].operand[0].predicate)
604                 (op0, VOIDmode)))
605         {
606           rtx tempreg;
607           enum machine_mode bestmode;
608
609           /* Get the mode to use for inserting into this field.  If OP0 is
610              BLKmode, get the smallest mode consistent with the alignment. If
611              OP0 is a non-BLKmode object that is no wider than MAXMODE, use its
612              mode. Otherwise, use the smallest mode containing the field.  */
613
614           if (GET_MODE (op0) == BLKmode
615               || GET_MODE_SIZE (GET_MODE (op0)) > GET_MODE_SIZE (maxmode))
616             bestmode
617               = get_best_mode (bitsize, bitnum, MEM_ALIGN (op0), maxmode,
618                                MEM_VOLATILE_P (op0));
619           else
620             bestmode = GET_MODE (op0);
621
622           if (bestmode == VOIDmode
623               || (SLOW_UNALIGNED_ACCESS (bestmode, MEM_ALIGN (op0))
624                   && GET_MODE_BITSIZE (bestmode) > MEM_ALIGN (op0)))
625             goto insv_loses;
626
627           /* Adjust address to point to the containing unit of that mode.
628              Compute offset as multiple of this unit, counting in bytes.  */
629           unit = GET_MODE_BITSIZE (bestmode);
630           offset = (bitnum / unit) * GET_MODE_SIZE (bestmode);
631           bitpos = bitnum % unit;
632           op0 = adjust_address (op0, bestmode,  offset);
633
634           /* Fetch that unit, store the bitfield in it, then store
635              the unit.  */
636           tempreg = copy_to_reg (op0);
637           store_bit_field (tempreg, bitsize, bitpos, fieldmode, value,
638                            total_size);
639           emit_move_insn (op0, tempreg);
640           return value;
641         }
642       volatile_ok = save_volatile_ok;
643
644       /* Add OFFSET into OP0's address.  */
645       if (GET_CODE (xop0) == MEM)
646         xop0 = adjust_address (xop0, byte_mode, offset);
647
648       /* If xop0 is a register, we need it in MAXMODE
649          to make it acceptable to the format of insv.  */
650       if (GET_CODE (xop0) == SUBREG)
651         /* We can't just change the mode, because this might clobber op0,
652            and we will need the original value of op0 if insv fails.  */
653         xop0 = gen_rtx_SUBREG (maxmode, SUBREG_REG (xop0), SUBREG_BYTE (xop0));
654       if (GET_CODE (xop0) == REG && GET_MODE (xop0) != maxmode)
655         xop0 = gen_rtx_SUBREG (maxmode, xop0, 0);
656
657       /* On big-endian machines, we count bits from the most significant.
658          If the bit field insn does not, we must invert.  */
659
660       if (BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN)
661         xbitpos = unit - bitsize - xbitpos;
662
663       /* We have been counting XBITPOS within UNIT.
664          Count instead within the size of the register.  */
665       if (BITS_BIG_ENDIAN && GET_CODE (xop0) != MEM)
666         xbitpos += GET_MODE_BITSIZE (maxmode) - unit;
667
668       unit = GET_MODE_BITSIZE (maxmode);
669
670       /* Convert VALUE to maxmode (which insv insn wants) in VALUE1.  */
671       value1 = value;
672       if (GET_MODE (value) != maxmode)
673         {
674           if (GET_MODE_BITSIZE (GET_MODE (value)) >= bitsize)
675             {
676               /* Optimization: Don't bother really extending VALUE
677                  if it has all the bits we will actually use.  However,
678                  if we must narrow it, be sure we do it correctly.  */
679
680               if (GET_MODE_SIZE (GET_MODE (value)) < GET_MODE_SIZE (maxmode))
681                 {
682                   rtx tmp;
683
684                   tmp = simplify_subreg (maxmode, value1, GET_MODE (value), 0);
685                   if (! tmp)
686                     tmp = simplify_gen_subreg (maxmode,
687                                                force_reg (GET_MODE (value),
688                                                           value1),
689                                                GET_MODE (value), 0);
690                   value1 = tmp;
691                 }
692               else
693                 value1 = gen_lowpart (maxmode, value1);
694             }
695           else if (GET_CODE (value) == CONST_INT)
696             value1 = gen_int_mode (INTVAL (value), maxmode);
697           else if (!CONSTANT_P (value))
698             /* Parse phase is supposed to make VALUE's data type
699                match that of the component reference, which is a type
700                at least as wide as the field; so VALUE should have
701                a mode that corresponds to that type.  */
702             abort ();
703         }
704
705       /* If this machine's insv insists on a register,
706          get VALUE1 into a register.  */
707       if (! ((*insn_data[(int) CODE_FOR_insv].operand[3].predicate)
708              (value1, maxmode)))
709         value1 = force_reg (maxmode, value1);
710
711       pat = gen_insv (xop0, GEN_INT (bitsize), GEN_INT (xbitpos), value1);
712       if (pat)
713         emit_insn (pat);
714       else
715         {
716           delete_insns_since (last);
717           store_fixed_bit_field (op0, offset, bitsize, bitpos, value);
718         }
719     }
720   else
721     insv_loses:
722     /* Insv is not available; store using shifts and boolean ops.  */
723     store_fixed_bit_field (op0, offset, bitsize, bitpos, value);
724   return value;
725 }
726 \f
727 /* Use shifts and boolean operations to store VALUE
728    into a bit field of width BITSIZE
729    in a memory location specified by OP0 except offset by OFFSET bytes.
730      (OFFSET must be 0 if OP0 is a register.)
731    The field starts at position BITPOS within the byte.
732     (If OP0 is a register, it may be a full word or a narrower mode,
733      but BITPOS still counts within a full word,
734      which is significant on bigendian machines.)
735
736    Note that protect_from_queue has already been done on OP0 and VALUE.  */
737
738 static void
739 store_fixed_bit_field (rtx op0, unsigned HOST_WIDE_INT offset,
740                        unsigned HOST_WIDE_INT bitsize,
741                        unsigned HOST_WIDE_INT bitpos, rtx value)
742 {
743   enum machine_mode mode;
744   unsigned int total_bits = BITS_PER_WORD;
745   rtx subtarget, temp;
746   int all_zero = 0;
747   int all_one = 0;
748
749   /* There is a case not handled here:
750      a structure with a known alignment of just a halfword
751      and a field split across two aligned halfwords within the structure.
752      Or likewise a structure with a known alignment of just a byte
753      and a field split across two bytes.
754      Such cases are not supposed to be able to occur.  */
755
756   if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG)
757     {
758       if (offset != 0)
759         abort ();
760       /* Special treatment for a bit field split across two registers.  */
761       if (bitsize + bitpos > BITS_PER_WORD)
762         {
763           store_split_bit_field (op0, bitsize, bitpos, value);
764           return;
765         }
766     }
767   else
768     {
769       /* Get the proper mode to use for this field.  We want a mode that
770          includes the entire field.  If such a mode would be larger than
771          a word, we won't be doing the extraction the normal way.
772          We don't want a mode bigger than the destination.  */
773
774       mode = GET_MODE (op0);
775       if (GET_MODE_BITSIZE (mode) == 0
776           || GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (word_mode))
777         mode = word_mode;
778       mode = get_best_mode (bitsize, bitpos + offset * BITS_PER_UNIT,
779                             MEM_ALIGN (op0), mode, MEM_VOLATILE_P (op0));
780
781       if (mode == VOIDmode)
782         {
783           /* The only way this should occur is if the field spans word
784              boundaries.  */
785           store_split_bit_field (op0, bitsize, bitpos + offset * BITS_PER_UNIT,
786                                  value);
787           return;
788         }
789
790       total_bits = GET_MODE_BITSIZE (mode);
791
792       /* Make sure bitpos is valid for the chosen mode.  Adjust BITPOS to
793          be in the range 0 to total_bits-1, and put any excess bytes in
794          OFFSET.  */
795       if (bitpos >= total_bits)
796         {
797           offset += (bitpos / total_bits) * (total_bits / BITS_PER_UNIT);
798           bitpos -= ((bitpos / total_bits) * (total_bits / BITS_PER_UNIT)
799                      * BITS_PER_UNIT);
800         }
801
802       /* Get ref to an aligned byte, halfword, or word containing the field.
803          Adjust BITPOS to be position within a word,
804          and OFFSET to be the offset of that word.
805          Then alter OP0 to refer to that word.  */
806       bitpos += (offset % (total_bits / BITS_PER_UNIT)) * BITS_PER_UNIT;
807       offset -= (offset % (total_bits / BITS_PER_UNIT));
808       op0 = adjust_address (op0, mode, offset);
809     }
810
811   mode = GET_MODE (op0);
812
813   /* Now MODE is either some integral mode for a MEM as OP0,
814      or is a full-word for a REG as OP0.  TOTAL_BITS corresponds.
815      The bit field is contained entirely within OP0.
816      BITPOS is the starting bit number within OP0.
817      (OP0's mode may actually be narrower than MODE.)  */
818
819   if (BYTES_BIG_ENDIAN)
820       /* BITPOS is the distance between our msb
821          and that of the containing datum.
822          Convert it to the distance from the lsb.  */
823       bitpos = total_bits - bitsize - bitpos;
824
825   /* Now BITPOS is always the distance between our lsb
826      and that of OP0.  */
827
828   /* Shift VALUE left by BITPOS bits.  If VALUE is not constant,
829      we must first convert its mode to MODE.  */
830
831   if (GET_CODE (value) == CONST_INT)
832     {
833       HOST_WIDE_INT v = INTVAL (value);
834
835       if (bitsize < HOST_BITS_PER_WIDE_INT)
836         v &= ((HOST_WIDE_INT) 1 << bitsize) - 1;
837
838       if (v == 0)
839         all_zero = 1;
840       else if ((bitsize < HOST_BITS_PER_WIDE_INT
841                 && v == ((HOST_WIDE_INT) 1 << bitsize) - 1)
842                || (bitsize == HOST_BITS_PER_WIDE_INT && v == -1))
843         all_one = 1;
844
845       value = lshift_value (mode, value, bitpos, bitsize);
846     }
847   else
848     {
849       int must_and = (GET_MODE_BITSIZE (GET_MODE (value)) != bitsize
850                       && bitpos + bitsize != GET_MODE_BITSIZE (mode));
851
852       if (GET_MODE (value) != mode)
853         {
854           if ((GET_CODE (value) == REG || GET_CODE (value) == SUBREG)
855               && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (value)))
856             value = gen_lowpart (mode, value);
857           else
858             value = convert_to_mode (mode, value, 1);
859         }
860
861       if (must_and)
862         value = expand_binop (mode, and_optab, value,
863                               mask_rtx (mode, 0, bitsize, 0),
864                               NULL_RTX, 1, OPTAB_LIB_WIDEN);
865       if (bitpos > 0)
866         value = expand_shift (LSHIFT_EXPR, mode, value,
867                               build_int_2 (bitpos, 0), NULL_RTX, 1);
868     }
869
870   /* Now clear the chosen bits in OP0,
871      except that if VALUE is -1 we need not bother.  */
872
873   subtarget = (GET_CODE (op0) == REG || ! flag_force_mem) ? op0 : 0;
874
875   if (! all_one)
876     {
877       temp = expand_binop (mode, and_optab, op0,
878                            mask_rtx (mode, bitpos, bitsize, 1),
879                            subtarget, 1, OPTAB_LIB_WIDEN);
880       subtarget = temp;
881     }
882   else
883     temp = op0;
884
885   /* Now logical-or VALUE into OP0, unless it is zero.  */
886
887   if (! all_zero)
888     temp = expand_binop (mode, ior_optab, temp, value,
889                          subtarget, 1, OPTAB_LIB_WIDEN);
890   if (op0 != temp)
891     emit_move_insn (op0, temp);
892 }
893 \f
894 /* Store a bit field that is split across multiple accessible memory objects.
895
896    OP0 is the REG, SUBREG or MEM rtx for the first of the objects.
897    BITSIZE is the field width; BITPOS the position of its first bit
898    (within the word).
899    VALUE is the value to store.
900
901    This does not yet handle fields wider than BITS_PER_WORD.  */
902
903 static void
904 store_split_bit_field (rtx op0, unsigned HOST_WIDE_INT bitsize,
905                        unsigned HOST_WIDE_INT bitpos, rtx value)
906 {
907   unsigned int unit;
908   unsigned int bitsdone = 0;
909
910   /* Make sure UNIT isn't larger than BITS_PER_WORD, we can only handle that
911      much at a time.  */
912   if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG)
913     unit = BITS_PER_WORD;
914   else
915     unit = MIN (MEM_ALIGN (op0), BITS_PER_WORD);
916
917   /* If VALUE is a constant other than a CONST_INT, get it into a register in
918      WORD_MODE.  If we can do this using gen_lowpart_common, do so.  Note
919      that VALUE might be a floating-point constant.  */
920   if (CONSTANT_P (value) && GET_CODE (value) != CONST_INT)
921     {
922       rtx word = gen_lowpart_common (word_mode, value);
923
924       if (word && (value != word))
925         value = word;
926       else
927         value = gen_lowpart_common (word_mode,
928                                     force_reg (GET_MODE (value) != VOIDmode
929                                                ? GET_MODE (value)
930                                                : word_mode, value));
931     }
932   else if (GET_CODE (value) == ADDRESSOF)
933     value = copy_to_reg (value);
934
935   while (bitsdone < bitsize)
936     {
937       unsigned HOST_WIDE_INT thissize;
938       rtx part, word;
939       unsigned HOST_WIDE_INT thispos;
940       unsigned HOST_WIDE_INT offset;
941
942       offset = (bitpos + bitsdone) / unit;
943       thispos = (bitpos + bitsdone) % unit;
944
945       /* THISSIZE must not overrun a word boundary.  Otherwise,
946          store_fixed_bit_field will call us again, and we will mutually
947          recurse forever.  */
948       thissize = MIN (bitsize - bitsdone, BITS_PER_WORD);
949       thissize = MIN (thissize, unit - thispos);
950
951       if (BYTES_BIG_ENDIAN)
952         {
953           int total_bits;
954
955           /* We must do an endian conversion exactly the same way as it is
956              done in extract_bit_field, so that the two calls to
957              extract_fixed_bit_field will have comparable arguments.  */
958           if (GET_CODE (value) != MEM || GET_MODE (value) == BLKmode)
959             total_bits = BITS_PER_WORD;
960           else
961             total_bits = GET_MODE_BITSIZE (GET_MODE (value));
962
963           /* Fetch successively less significant portions.  */
964           if (GET_CODE (value) == CONST_INT)
965             part = GEN_INT (((unsigned HOST_WIDE_INT) (INTVAL (value))
966                              >> (bitsize - bitsdone - thissize))
967                             & (((HOST_WIDE_INT) 1 << thissize) - 1));
968           else
969             /* The args are chosen so that the last part includes the
970                lsb.  Give extract_bit_field the value it needs (with
971                endianness compensation) to fetch the piece we want.  */
972             part = extract_fixed_bit_field (word_mode, value, 0, thissize,
973                                             total_bits - bitsize + bitsdone,
974                                             NULL_RTX, 1);
975         }
976       else
977         {
978           /* Fetch successively more significant portions.  */
979           if (GET_CODE (value) == CONST_INT)
980             part = GEN_INT (((unsigned HOST_WIDE_INT) (INTVAL (value))
981                              >> bitsdone)
982                             & (((HOST_WIDE_INT) 1 << thissize) - 1));
983           else
984             part = extract_fixed_bit_field (word_mode, value, 0, thissize,
985                                             bitsdone, NULL_RTX, 1);
986         }
987
988       /* If OP0 is a register, then handle OFFSET here.
989
990          When handling multiword bitfields, extract_bit_field may pass
991          down a word_mode SUBREG of a larger REG for a bitfield that actually
992          crosses a word boundary.  Thus, for a SUBREG, we must find
993          the current word starting from the base register.  */
994       if (GET_CODE (op0) == SUBREG)
995         {
996           int word_offset = (SUBREG_BYTE (op0) / UNITS_PER_WORD) + offset;
997           word = operand_subword_force (SUBREG_REG (op0), word_offset,
998                                         GET_MODE (SUBREG_REG (op0)));
999           offset = 0;
1000         }
1001       else if (GET_CODE (op0) == REG)
1002         {
1003           word = operand_subword_force (op0, offset, GET_MODE (op0));
1004           offset = 0;
1005         }
1006       else
1007         word = op0;
1008
1009       /* OFFSET is in UNITs, and UNIT is in bits.
1010          store_fixed_bit_field wants offset in bytes.  */
1011       store_fixed_bit_field (word, offset * unit / BITS_PER_UNIT, thissize,
1012                              thispos, part);
1013       bitsdone += thissize;
1014     }
1015 }
1016 \f
1017 /* Generate code to extract a byte-field from STR_RTX
1018    containing BITSIZE bits, starting at BITNUM,
1019    and put it in TARGET if possible (if TARGET is nonzero).
1020    Regardless of TARGET, we return the rtx for where the value is placed.
1021    It may be a QUEUED.
1022
1023    STR_RTX is the structure containing the byte (a REG or MEM).
1024    UNSIGNEDP is nonzero if this is an unsigned bit field.
1025    MODE is the natural mode of the field value once extracted.
1026    TMODE is the mode the caller would like the value to have;
1027    but the value may be returned with type MODE instead.
1028
1029    TOTAL_SIZE is the size in bytes of the containing structure,
1030    or -1 if varying.
1031
1032    If a TARGET is specified and we can store in it at no extra cost,
1033    we do so, and return TARGET.
1034    Otherwise, we return a REG of mode TMODE or MODE, with TMODE preferred
1035    if they are equally easy.  */
1036
1037 rtx
1038 extract_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
1039                    unsigned HOST_WIDE_INT bitnum, int unsignedp, rtx target,
1040                    enum machine_mode mode, enum machine_mode tmode,
1041                    HOST_WIDE_INT total_size)
1042 {
1043   unsigned int unit
1044     = (GET_CODE (str_rtx) == MEM) ? BITS_PER_UNIT : BITS_PER_WORD;
1045   unsigned HOST_WIDE_INT offset = bitnum / unit;
1046   unsigned HOST_WIDE_INT bitpos = bitnum % unit;
1047   rtx op0 = str_rtx;
1048   rtx spec_target = target;
1049   rtx spec_target_subreg = 0;
1050   enum machine_mode int_mode;
1051   enum machine_mode extv_mode = mode_for_extraction (EP_extv, 0);
1052   enum machine_mode extzv_mode = mode_for_extraction (EP_extzv, 0);
1053   enum machine_mode mode1;
1054   int byte_offset;
1055
1056   /* Discount the part of the structure before the desired byte.
1057      We need to know how many bytes are safe to reference after it.  */
1058   if (total_size >= 0)
1059     total_size -= (bitpos / BIGGEST_ALIGNMENT
1060                    * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1061
1062   if (tmode == VOIDmode)
1063     tmode = mode;
1064
1065   while (GET_CODE (op0) == SUBREG)
1066     {
1067       bitpos += SUBREG_BYTE (op0) * BITS_PER_UNIT;
1068       if (bitpos > unit)
1069         {
1070           offset += (bitpos / unit);
1071           bitpos %= unit;
1072         }
1073       op0 = SUBREG_REG (op0);
1074     }
1075
1076   if (GET_CODE (op0) == REG
1077       && mode == GET_MODE (op0)
1078       && bitnum == 0
1079       && bitsize == GET_MODE_BITSIZE (GET_MODE (op0)))
1080     {
1081       /* We're trying to extract a full register from itself.  */
1082       return op0;
1083     }
1084
1085   /* Use vec_extract patterns for extracting parts of vectors whenever
1086      available.  */
1087   if (VECTOR_MODE_P (GET_MODE (op0))
1088       && GET_CODE (op0) != MEM
1089       && (vec_extract_optab->handlers[(int)GET_MODE (op0)].insn_code
1090           != CODE_FOR_nothing)
1091       && ((bitsize + bitnum) / GET_MODE_BITSIZE (GET_MODE_INNER (GET_MODE (op0)))
1092           == bitsize / GET_MODE_BITSIZE (GET_MODE_INNER (GET_MODE (op0)))))
1093     {
1094       enum machine_mode outermode = GET_MODE (op0);
1095       enum machine_mode innermode = GET_MODE_INNER (outermode);
1096       int icode = (int) vec_extract_optab->handlers[(int) outermode].insn_code;
1097       int pos = bitnum / GET_MODE_BITSIZE (innermode);
1098       rtx rtxpos = GEN_INT (pos);
1099       rtx src = op0;
1100       rtx dest = NULL, pat, seq;
1101       enum machine_mode mode0 = insn_data[icode].operand[0].mode;
1102       enum machine_mode mode1 = insn_data[icode].operand[1].mode;
1103       enum machine_mode mode2 = insn_data[icode].operand[2].mode;
1104
1105       if (innermode == tmode || innermode == mode)
1106         dest = target;
1107
1108       if (!dest)
1109         dest = gen_reg_rtx (innermode);
1110
1111       start_sequence ();
1112
1113       if (! (*insn_data[icode].operand[0].predicate) (dest, mode0))
1114         dest = copy_to_mode_reg (mode0, dest);
1115
1116       if (! (*insn_data[icode].operand[1].predicate) (src, mode1))
1117         src = copy_to_mode_reg (mode1, src);
1118
1119       if (! (*insn_data[icode].operand[2].predicate) (rtxpos, mode2))
1120         rtxpos = copy_to_mode_reg (mode1, rtxpos);
1121
1122       /* We could handle this, but we should always be called with a pseudo
1123          for our targets and all insns should take them as outputs.  */
1124       if (! (*insn_data[icode].operand[0].predicate) (dest, mode0)
1125           || ! (*insn_data[icode].operand[1].predicate) (src, mode1)
1126           || ! (*insn_data[icode].operand[2].predicate) (rtxpos, mode2))
1127         abort ();
1128       pat = GEN_FCN (icode) (dest, src, rtxpos);
1129       seq = get_insns ();
1130       end_sequence ();
1131       if (pat)
1132         {
1133           emit_insn (seq);
1134           emit_insn (pat);
1135           return extract_bit_field (dest, bitsize,
1136                                     bitnum - pos * GET_MODE_BITSIZE (innermode),
1137                                     unsignedp, target, mode, tmode, total_size);
1138         }
1139     }
1140
1141   /* Make sure we are playing with integral modes.  Pun with subregs
1142      if we aren't.  */
1143   {
1144     enum machine_mode imode = int_mode_for_mode (GET_MODE (op0));
1145     if (imode != GET_MODE (op0))
1146       {
1147         if (GET_CODE (op0) == MEM)
1148           op0 = adjust_address (op0, imode, 0);
1149         else if (imode != BLKmode)
1150           op0 = gen_lowpart (imode, op0);
1151         else
1152           abort ();
1153       }
1154   }
1155
1156   /* We may be accessing data outside the field, which means
1157      we can alias adjacent data.  */
1158   if (GET_CODE (op0) == MEM)
1159     {
1160       op0 = shallow_copy_rtx (op0);
1161       set_mem_alias_set (op0, 0);
1162       set_mem_expr (op0, 0);
1163     }
1164
1165   /* Extraction of a full-word or multi-word value from a structure
1166      in a register or aligned memory can be done with just a SUBREG.
1167      A subword value in the least significant part of a register
1168      can also be extracted with a SUBREG.  For this, we need the
1169      byte offset of the value in op0.  */
1170
1171   byte_offset = bitpos / BITS_PER_UNIT + offset * UNITS_PER_WORD;
1172
1173   /* If OP0 is a register, BITPOS must count within a word.
1174      But as we have it, it counts within whatever size OP0 now has.
1175      On a bigendian machine, these are not the same, so convert.  */
1176   if (BYTES_BIG_ENDIAN
1177       && GET_CODE (op0) != MEM
1178       && unit > GET_MODE_BITSIZE (GET_MODE (op0)))
1179     bitpos += unit - GET_MODE_BITSIZE (GET_MODE (op0));
1180
1181   /* ??? We currently assume TARGET is at least as big as BITSIZE.
1182      If that's wrong, the solution is to test for it and set TARGET to 0
1183      if needed.  */
1184
1185   /* Only scalar integer modes can be converted via subregs.  There is an
1186      additional problem for FP modes here in that they can have a precision
1187      which is different from the size.  mode_for_size uses precision, but
1188      we want a mode based on the size, so we must avoid calling it for FP
1189      modes.  */
1190   mode1  = (SCALAR_INT_MODE_P (tmode)
1191             ? mode_for_size (bitsize, GET_MODE_CLASS (tmode), 0)
1192             : mode);
1193
1194   if (((bitsize >= BITS_PER_WORD && bitsize == GET_MODE_BITSIZE (mode)
1195         && bitpos % BITS_PER_WORD == 0)
1196        || (mode1 != BLKmode
1197            /* ??? The big endian test here is wrong.  This is correct
1198               if the value is in a register, and if mode_for_size is not
1199               the same mode as op0.  This causes us to get unnecessarily
1200               inefficient code from the Thumb port when -mbig-endian.  */
1201            && (BYTES_BIG_ENDIAN
1202                ? bitpos + bitsize == BITS_PER_WORD
1203                : bitpos == 0)))
1204       && ((GET_CODE (op0) != MEM
1205            && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
1206                                      GET_MODE_BITSIZE (GET_MODE (op0)))
1207            && GET_MODE_SIZE (mode1) != 0
1208            && byte_offset % GET_MODE_SIZE (mode1) == 0)
1209           || (GET_CODE (op0) == MEM
1210               && (! SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (op0))
1211                   || (offset * BITS_PER_UNIT % bitsize == 0
1212                       && MEM_ALIGN (op0) % bitsize == 0)))))
1213     {
1214       if (mode1 != GET_MODE (op0))
1215         {
1216           if (GET_CODE (op0) == SUBREG)
1217             {
1218               if (GET_MODE (SUBREG_REG (op0)) == mode1
1219                   || GET_MODE_CLASS (mode1) == MODE_INT
1220                   || GET_MODE_CLASS (mode1) == MODE_PARTIAL_INT)
1221                 op0 = SUBREG_REG (op0);
1222               else
1223                 /* Else we've got some float mode source being extracted into
1224                    a different float mode destination -- this combination of
1225                    subregs results in Severe Tire Damage.  */
1226                 goto no_subreg_mode_swap;
1227             }
1228           if (GET_CODE (op0) == REG)
1229             op0 = gen_rtx_SUBREG (mode1, op0, byte_offset);
1230           else
1231             op0 = adjust_address (op0, mode1, offset);
1232         }
1233       if (mode1 != mode)
1234         return convert_to_mode (tmode, op0, unsignedp);
1235       return op0;
1236     }
1237  no_subreg_mode_swap:
1238
1239   /* Handle fields bigger than a word.  */
1240
1241   if (bitsize > BITS_PER_WORD)
1242     {
1243       /* Here we transfer the words of the field
1244          in the order least significant first.
1245          This is because the most significant word is the one which may
1246          be less than full.  */
1247
1248       unsigned int nwords = (bitsize + (BITS_PER_WORD - 1)) / BITS_PER_WORD;
1249       unsigned int i;
1250
1251       if (target == 0 || GET_CODE (target) != REG)
1252         target = gen_reg_rtx (mode);
1253
1254       /* Indicate for flow that the entire target reg is being set.  */
1255       emit_insn (gen_rtx_CLOBBER (VOIDmode, target));
1256
1257       for (i = 0; i < nwords; i++)
1258         {
1259           /* If I is 0, use the low-order word in both field and target;
1260              if I is 1, use the next to lowest word; and so on.  */
1261           /* Word number in TARGET to use.  */
1262           unsigned int wordnum
1263             = (WORDS_BIG_ENDIAN
1264                ? GET_MODE_SIZE (GET_MODE (target)) / UNITS_PER_WORD - i - 1
1265                : i);
1266           /* Offset from start of field in OP0.  */
1267           unsigned int bit_offset = (WORDS_BIG_ENDIAN
1268                                      ? MAX (0, ((int) bitsize - ((int) i + 1)
1269                                                 * (int) BITS_PER_WORD))
1270                                      : (int) i * BITS_PER_WORD);
1271           rtx target_part = operand_subword (target, wordnum, 1, VOIDmode);
1272           rtx result_part
1273             = extract_bit_field (op0, MIN (BITS_PER_WORD,
1274                                            bitsize - i * BITS_PER_WORD),
1275                                  bitnum + bit_offset, 1, target_part, mode,
1276                                  word_mode, total_size);
1277
1278           if (target_part == 0)
1279             abort ();
1280
1281           if (result_part != target_part)
1282             emit_move_insn (target_part, result_part);
1283         }
1284
1285       if (unsignedp)
1286         {
1287           /* Unless we've filled TARGET, the upper regs in a multi-reg value
1288              need to be zero'd out.  */
1289           if (GET_MODE_SIZE (GET_MODE (target)) > nwords * UNITS_PER_WORD)
1290             {
1291               unsigned int i, total_words;
1292
1293               total_words = GET_MODE_SIZE (GET_MODE (target)) / UNITS_PER_WORD;
1294               for (i = nwords; i < total_words; i++)
1295                 emit_move_insn
1296                   (operand_subword (target,
1297                                     WORDS_BIG_ENDIAN ? total_words - i - 1 : i,
1298                                     1, VOIDmode),
1299                    const0_rtx);
1300             }
1301           return target;
1302         }
1303
1304       /* Signed bit field: sign-extend with two arithmetic shifts.  */
1305       target = expand_shift (LSHIFT_EXPR, mode, target,
1306                              build_int_2 (GET_MODE_BITSIZE (mode) - bitsize, 0),
1307                              NULL_RTX, 0);
1308       return expand_shift (RSHIFT_EXPR, mode, target,
1309                            build_int_2 (GET_MODE_BITSIZE (mode) - bitsize, 0),
1310                            NULL_RTX, 0);
1311     }
1312
1313   /* From here on we know the desired field is smaller than a word.  */
1314
1315   /* Check if there is a correspondingly-sized integer field, so we can
1316      safely extract it as one size of integer, if necessary; then
1317      truncate or extend to the size that is wanted; then use SUBREGs or
1318      convert_to_mode to get one of the modes we really wanted.  */
1319
1320   int_mode = int_mode_for_mode (tmode);
1321   if (int_mode == BLKmode)
1322     int_mode = int_mode_for_mode (mode);
1323   if (int_mode == BLKmode)
1324     abort ();    /* Should probably push op0 out to memory and then
1325                     do a load.  */
1326
1327   /* OFFSET is the number of words or bytes (UNIT says which)
1328      from STR_RTX to the first word or byte containing part of the field.  */
1329
1330   if (GET_CODE (op0) != MEM)
1331     {
1332       if (offset != 0
1333           || GET_MODE_SIZE (GET_MODE (op0)) > UNITS_PER_WORD)
1334         {
1335           if (GET_CODE (op0) != REG)
1336             op0 = copy_to_reg (op0);
1337           op0 = gen_rtx_SUBREG (mode_for_size (BITS_PER_WORD, MODE_INT, 0),
1338                                 op0, (offset * UNITS_PER_WORD));
1339         }
1340       offset = 0;
1341     }
1342   else
1343     op0 = protect_from_queue (str_rtx, 1);
1344
1345   /* Now OFFSET is nonzero only for memory operands.  */
1346
1347   if (unsignedp)
1348     {
1349       if (HAVE_extzv
1350           && (GET_MODE_BITSIZE (extzv_mode) >= bitsize)
1351           && ! ((GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG)
1352                 && (bitsize + bitpos > GET_MODE_BITSIZE (extzv_mode))))
1353         {
1354           unsigned HOST_WIDE_INT xbitpos = bitpos, xoffset = offset;
1355           rtx bitsize_rtx, bitpos_rtx;
1356           rtx last = get_last_insn ();
1357           rtx xop0 = op0;
1358           rtx xtarget = target;
1359           rtx xspec_target = spec_target;
1360           rtx xspec_target_subreg = spec_target_subreg;
1361           rtx pat;
1362           enum machine_mode maxmode = mode_for_extraction (EP_extzv, 0);
1363
1364           if (GET_CODE (xop0) == MEM)
1365             {
1366               int save_volatile_ok = volatile_ok;
1367               volatile_ok = 1;
1368
1369               /* Is the memory operand acceptable?  */
1370               if (! ((*insn_data[(int) CODE_FOR_extzv].operand[1].predicate)
1371                      (xop0, GET_MODE (xop0))))
1372                 {
1373                   /* No, load into a reg and extract from there.  */
1374                   enum machine_mode bestmode;
1375
1376                   /* Get the mode to use for inserting into this field.  If
1377                      OP0 is BLKmode, get the smallest mode consistent with the
1378                      alignment. If OP0 is a non-BLKmode object that is no
1379                      wider than MAXMODE, use its mode. Otherwise, use the
1380                      smallest mode containing the field.  */
1381
1382                   if (GET_MODE (xop0) == BLKmode
1383                       || (GET_MODE_SIZE (GET_MODE (op0))
1384                           > GET_MODE_SIZE (maxmode)))
1385                     bestmode = get_best_mode (bitsize, bitnum,
1386                                               MEM_ALIGN (xop0), maxmode,
1387                                               MEM_VOLATILE_P (xop0));
1388                   else
1389                     bestmode = GET_MODE (xop0);
1390
1391                   if (bestmode == VOIDmode
1392                       || (SLOW_UNALIGNED_ACCESS (bestmode, MEM_ALIGN (xop0))
1393                           && GET_MODE_BITSIZE (bestmode) > MEM_ALIGN (xop0)))
1394                     goto extzv_loses;
1395
1396                   /* Compute offset as multiple of this unit,
1397                      counting in bytes.  */
1398                   unit = GET_MODE_BITSIZE (bestmode);
1399                   xoffset = (bitnum / unit) * GET_MODE_SIZE (bestmode);
1400                   xbitpos = bitnum % unit;
1401                   xop0 = adjust_address (xop0, bestmode, xoffset);
1402
1403                   /* Fetch it to a register in that size.  */
1404                   xop0 = force_reg (bestmode, xop0);
1405
1406                   /* XBITPOS counts within UNIT, which is what is expected.  */
1407                 }
1408               else
1409                 /* Get ref to first byte containing part of the field.  */
1410                 xop0 = adjust_address (xop0, byte_mode, xoffset);
1411
1412               volatile_ok = save_volatile_ok;
1413             }
1414
1415           /* If op0 is a register, we need it in MAXMODE (which is usually
1416              SImode). to make it acceptable to the format of extzv.  */
1417           if (GET_CODE (xop0) == SUBREG && GET_MODE (xop0) != maxmode)
1418             goto extzv_loses;
1419           if (GET_CODE (xop0) == REG && GET_MODE (xop0) != maxmode)
1420             xop0 = gen_rtx_SUBREG (maxmode, xop0, 0);
1421
1422           /* On big-endian machines, we count bits from the most significant.
1423              If the bit field insn does not, we must invert.  */
1424           if (BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN)
1425             xbitpos = unit - bitsize - xbitpos;
1426
1427           /* Now convert from counting within UNIT to counting in MAXMODE.  */
1428           if (BITS_BIG_ENDIAN && GET_CODE (xop0) != MEM)
1429             xbitpos += GET_MODE_BITSIZE (maxmode) - unit;
1430
1431           unit = GET_MODE_BITSIZE (maxmode);
1432
1433           if (xtarget == 0
1434               || (flag_force_mem && GET_CODE (xtarget) == MEM))
1435             xtarget = xspec_target = gen_reg_rtx (tmode);
1436
1437           if (GET_MODE (xtarget) != maxmode)
1438             {
1439               if (GET_CODE (xtarget) == REG)
1440                 {
1441                   int wider = (GET_MODE_SIZE (maxmode)
1442                                > GET_MODE_SIZE (GET_MODE (xtarget)));
1443                   xtarget = gen_lowpart (maxmode, xtarget);
1444                   if (wider)
1445                     xspec_target_subreg = xtarget;
1446                 }
1447               else
1448                 xtarget = gen_reg_rtx (maxmode);
1449             }
1450
1451           /* If this machine's extzv insists on a register target,
1452              make sure we have one.  */
1453           if (! ((*insn_data[(int) CODE_FOR_extzv].operand[0].predicate)
1454                  (xtarget, maxmode)))
1455             xtarget = gen_reg_rtx (maxmode);
1456
1457           bitsize_rtx = GEN_INT (bitsize);
1458           bitpos_rtx = GEN_INT (xbitpos);
1459
1460           pat = gen_extzv (protect_from_queue (xtarget, 1),
1461                            xop0, bitsize_rtx, bitpos_rtx);
1462           if (pat)
1463             {
1464               emit_insn (pat);
1465               target = xtarget;
1466               spec_target = xspec_target;
1467               spec_target_subreg = xspec_target_subreg;
1468             }
1469           else
1470             {
1471               delete_insns_since (last);
1472               target = extract_fixed_bit_field (int_mode, op0, offset, bitsize,
1473                                                 bitpos, target, 1);
1474             }
1475         }
1476       else
1477       extzv_loses:
1478         target = extract_fixed_bit_field (int_mode, op0, offset, bitsize,
1479                                           bitpos, target, 1);
1480     }
1481   else
1482     {
1483       if (HAVE_extv
1484           && (GET_MODE_BITSIZE (extv_mode) >= bitsize)
1485           && ! ((GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG)
1486                 && (bitsize + bitpos > GET_MODE_BITSIZE (extv_mode))))
1487         {
1488           int xbitpos = bitpos, xoffset = offset;
1489           rtx bitsize_rtx, bitpos_rtx;
1490           rtx last = get_last_insn ();
1491           rtx xop0 = op0, xtarget = target;
1492           rtx xspec_target = spec_target;
1493           rtx xspec_target_subreg = spec_target_subreg;
1494           rtx pat;
1495           enum machine_mode maxmode = mode_for_extraction (EP_extv, 0);
1496
1497           if (GET_CODE (xop0) == MEM)
1498             {
1499               /* Is the memory operand acceptable?  */
1500               if (! ((*insn_data[(int) CODE_FOR_extv].operand[1].predicate)
1501                      (xop0, GET_MODE (xop0))))
1502                 {
1503                   /* No, load into a reg and extract from there.  */
1504                   enum machine_mode bestmode;
1505
1506                   /* Get the mode to use for inserting into this field.  If
1507                      OP0 is BLKmode, get the smallest mode consistent with the
1508                      alignment. If OP0 is a non-BLKmode object that is no
1509                      wider than MAXMODE, use its mode. Otherwise, use the
1510                      smallest mode containing the field.  */
1511
1512                   if (GET_MODE (xop0) == BLKmode
1513                       || (GET_MODE_SIZE (GET_MODE (op0))
1514                           > GET_MODE_SIZE (maxmode)))
1515                     bestmode = get_best_mode (bitsize, bitnum,
1516                                               MEM_ALIGN (xop0), maxmode,
1517                                               MEM_VOLATILE_P (xop0));
1518                   else
1519                     bestmode = GET_MODE (xop0);
1520
1521                   if (bestmode == VOIDmode
1522                       || (SLOW_UNALIGNED_ACCESS (bestmode, MEM_ALIGN (xop0))
1523                           && GET_MODE_BITSIZE (bestmode) > MEM_ALIGN (xop0)))
1524                     goto extv_loses;
1525
1526                   /* Compute offset as multiple of this unit,
1527                      counting in bytes.  */
1528                   unit = GET_MODE_BITSIZE (bestmode);
1529                   xoffset = (bitnum / unit) * GET_MODE_SIZE (bestmode);
1530                   xbitpos = bitnum % unit;
1531                   xop0 = adjust_address (xop0, bestmode, xoffset);
1532
1533                   /* Fetch it to a register in that size.  */
1534                   xop0 = force_reg (bestmode, xop0);
1535
1536                   /* XBITPOS counts within UNIT, which is what is expected.  */
1537                 }
1538               else
1539                 /* Get ref to first byte containing part of the field.  */
1540                 xop0 = adjust_address (xop0, byte_mode, xoffset);
1541             }
1542
1543           /* If op0 is a register, we need it in MAXMODE (which is usually
1544              SImode) to make it acceptable to the format of extv.  */
1545           if (GET_CODE (xop0) == SUBREG && GET_MODE (xop0) != maxmode)
1546             goto extv_loses;
1547           if (GET_CODE (xop0) == REG && GET_MODE (xop0) != maxmode)
1548             xop0 = gen_rtx_SUBREG (maxmode, xop0, 0);
1549
1550           /* On big-endian machines, we count bits from the most significant.
1551              If the bit field insn does not, we must invert.  */
1552           if (BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN)
1553             xbitpos = unit - bitsize - xbitpos;
1554
1555           /* XBITPOS counts within a size of UNIT.
1556              Adjust to count within a size of MAXMODE.  */
1557           if (BITS_BIG_ENDIAN && GET_CODE (xop0) != MEM)
1558             xbitpos += (GET_MODE_BITSIZE (maxmode) - unit);
1559
1560           unit = GET_MODE_BITSIZE (maxmode);
1561
1562           if (xtarget == 0
1563               || (flag_force_mem && GET_CODE (xtarget) == MEM))
1564             xtarget = xspec_target = gen_reg_rtx (tmode);
1565
1566           if (GET_MODE (xtarget) != maxmode)
1567             {
1568               if (GET_CODE (xtarget) == REG)
1569                 {
1570                   int wider = (GET_MODE_SIZE (maxmode)
1571                                > GET_MODE_SIZE (GET_MODE (xtarget)));
1572                   xtarget = gen_lowpart (maxmode, xtarget);
1573                   if (wider)
1574                     xspec_target_subreg = xtarget;
1575                 }
1576               else
1577                 xtarget = gen_reg_rtx (maxmode);
1578             }
1579
1580           /* If this machine's extv insists on a register target,
1581              make sure we have one.  */
1582           if (! ((*insn_data[(int) CODE_FOR_extv].operand[0].predicate)
1583                  (xtarget, maxmode)))
1584             xtarget = gen_reg_rtx (maxmode);
1585
1586           bitsize_rtx = GEN_INT (bitsize);
1587           bitpos_rtx = GEN_INT (xbitpos);
1588
1589           pat = gen_extv (protect_from_queue (xtarget, 1),
1590                           xop0, bitsize_rtx, bitpos_rtx);
1591           if (pat)
1592             {
1593               emit_insn (pat);
1594               target = xtarget;
1595               spec_target = xspec_target;
1596               spec_target_subreg = xspec_target_subreg;
1597             }
1598           else
1599             {
1600               delete_insns_since (last);
1601               target = extract_fixed_bit_field (int_mode, op0, offset, bitsize,
1602                                                 bitpos, target, 0);
1603             }
1604         }
1605       else
1606       extv_loses:
1607         target = extract_fixed_bit_field (int_mode, op0, offset, bitsize,
1608                                           bitpos, target, 0);
1609     }
1610   if (target == spec_target)
1611     return target;
1612   if (target == spec_target_subreg)
1613     return spec_target;
1614   if (GET_MODE (target) != tmode && GET_MODE (target) != mode)
1615     {
1616       /* If the target mode is floating-point, first convert to the
1617          integer mode of that size and then access it as a floating-point
1618          value via a SUBREG.  */
1619       if (GET_MODE_CLASS (tmode) != MODE_INT
1620           && GET_MODE_CLASS (tmode) != MODE_PARTIAL_INT)
1621         {
1622           target = convert_to_mode (mode_for_size (GET_MODE_BITSIZE (tmode),
1623                                                    MODE_INT, 0),
1624                                     target, unsignedp);
1625           return gen_lowpart (tmode, target);
1626         }
1627       else
1628         return convert_to_mode (tmode, target, unsignedp);
1629     }
1630   return target;
1631 }
1632 \f
1633 /* Extract a bit field using shifts and boolean operations
1634    Returns an rtx to represent the value.
1635    OP0 addresses a register (word) or memory (byte).
1636    BITPOS says which bit within the word or byte the bit field starts in.
1637    OFFSET says how many bytes farther the bit field starts;
1638     it is 0 if OP0 is a register.
1639    BITSIZE says how many bits long the bit field is.
1640     (If OP0 is a register, it may be narrower than a full word,
1641      but BITPOS still counts within a full word,
1642      which is significant on bigendian machines.)
1643
1644    UNSIGNEDP is nonzero for an unsigned bit field (don't sign-extend value).
1645    If TARGET is nonzero, attempts to store the value there
1646    and return TARGET, but this is not guaranteed.
1647    If TARGET is not used, create a pseudo-reg of mode TMODE for the value.  */
1648
1649 static rtx
1650 extract_fixed_bit_field (enum machine_mode tmode, rtx op0,
1651                          unsigned HOST_WIDE_INT offset,
1652                          unsigned HOST_WIDE_INT bitsize,
1653                          unsigned HOST_WIDE_INT bitpos, rtx target,
1654                          int unsignedp)
1655 {
1656   unsigned int total_bits = BITS_PER_WORD;
1657   enum machine_mode mode;
1658
1659   if (GET_CODE (op0) == SUBREG || GET_CODE (op0) == REG)
1660     {
1661       /* Special treatment for a bit field split across two registers.  */
1662       if (bitsize + bitpos > BITS_PER_WORD)
1663         return extract_split_bit_field (op0, bitsize, bitpos, unsignedp);
1664     }
1665   else
1666     {
1667       /* Get the proper mode to use for this field.  We want a mode that
1668          includes the entire field.  If such a mode would be larger than
1669          a word, we won't be doing the extraction the normal way.  */
1670
1671       mode = get_best_mode (bitsize, bitpos + offset * BITS_PER_UNIT,
1672                             MEM_ALIGN (op0), word_mode, MEM_VOLATILE_P (op0));
1673
1674       if (mode == VOIDmode)
1675         /* The only way this should occur is if the field spans word
1676            boundaries.  */
1677         return extract_split_bit_field (op0, bitsize,
1678                                         bitpos + offset * BITS_PER_UNIT,
1679                                         unsignedp);
1680
1681       total_bits = GET_MODE_BITSIZE (mode);
1682
1683       /* Make sure bitpos is valid for the chosen mode.  Adjust BITPOS to
1684          be in the range 0 to total_bits-1, and put any excess bytes in
1685          OFFSET.  */
1686       if (bitpos >= total_bits)
1687         {
1688           offset += (bitpos / total_bits) * (total_bits / BITS_PER_UNIT);
1689           bitpos -= ((bitpos / total_bits) * (total_bits / BITS_PER_UNIT)
1690                      * BITS_PER_UNIT);
1691         }
1692
1693       /* Get ref to an aligned byte, halfword, or word containing the field.
1694          Adjust BITPOS to be position within a word,
1695          and OFFSET to be the offset of that word.
1696          Then alter OP0 to refer to that word.  */
1697       bitpos += (offset % (total_bits / BITS_PER_UNIT)) * BITS_PER_UNIT;
1698       offset -= (offset % (total_bits / BITS_PER_UNIT));
1699       op0 = adjust_address (op0, mode, offset);
1700     }
1701
1702   mode = GET_MODE (op0);
1703
1704   if (BYTES_BIG_ENDIAN)
1705     /* BITPOS is the distance between our msb and that of OP0.
1706        Convert it to the distance from the lsb.  */
1707     bitpos = total_bits - bitsize - bitpos;
1708
1709   /* Now BITPOS is always the distance between the field's lsb and that of OP0.
1710      We have reduced the big-endian case to the little-endian case.  */
1711
1712   if (unsignedp)
1713     {
1714       if (bitpos)
1715         {
1716           /* If the field does not already start at the lsb,
1717              shift it so it does.  */
1718           tree amount = build_int_2 (bitpos, 0);
1719           /* Maybe propagate the target for the shift.  */
1720           /* But not if we will return it--could confuse integrate.c.  */
1721           rtx subtarget = (target != 0 && GET_CODE (target) == REG
1722                            && !REG_FUNCTION_VALUE_P (target)
1723                            ? target : 0);
1724           if (tmode != mode) subtarget = 0;
1725           op0 = expand_shift (RSHIFT_EXPR, mode, op0, amount, subtarget, 1);
1726         }
1727       /* Convert the value to the desired mode.  */
1728       if (mode != tmode)
1729         op0 = convert_to_mode (tmode, op0, 1);
1730
1731       /* Unless the msb of the field used to be the msb when we shifted,
1732          mask out the upper bits.  */
1733
1734       if (GET_MODE_BITSIZE (mode) != bitpos + bitsize)
1735         return expand_binop (GET_MODE (op0), and_optab, op0,
1736                              mask_rtx (GET_MODE (op0), 0, bitsize, 0),
1737                              target, 1, OPTAB_LIB_WIDEN);
1738       return op0;
1739     }
1740
1741   /* To extract a signed bit-field, first shift its msb to the msb of the word,
1742      then arithmetic-shift its lsb to the lsb of the word.  */
1743   op0 = force_reg (mode, op0);
1744   if (mode != tmode)
1745     target = 0;
1746
1747   /* Find the narrowest integer mode that contains the field.  */
1748
1749   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
1750        mode = GET_MODE_WIDER_MODE (mode))
1751     if (GET_MODE_BITSIZE (mode) >= bitsize + bitpos)
1752       {
1753         op0 = convert_to_mode (mode, op0, 0);
1754         break;
1755       }
1756
1757   if (GET_MODE_BITSIZE (mode) != (bitsize + bitpos))
1758     {
1759       tree amount
1760         = build_int_2 (GET_MODE_BITSIZE (mode) - (bitsize + bitpos), 0);
1761       /* Maybe propagate the target for the shift.  */
1762       /* But not if we will return the result--could confuse integrate.c.  */
1763       rtx subtarget = (target != 0 && GET_CODE (target) == REG
1764                        && ! REG_FUNCTION_VALUE_P (target)
1765                        ? target : 0);
1766       op0 = expand_shift (LSHIFT_EXPR, mode, op0, amount, subtarget, 1);
1767     }
1768
1769   return expand_shift (RSHIFT_EXPR, mode, op0,
1770                        build_int_2 (GET_MODE_BITSIZE (mode) - bitsize, 0),
1771                        target, 0);
1772 }
1773 \f
1774 /* Return a constant integer (CONST_INT or CONST_DOUBLE) mask value
1775    of mode MODE with BITSIZE ones followed by BITPOS zeros, or the
1776    complement of that if COMPLEMENT.  The mask is truncated if
1777    necessary to the width of mode MODE.  The mask is zero-extended if
1778    BITSIZE+BITPOS is too small for MODE.  */
1779
1780 static rtx
1781 mask_rtx (enum machine_mode mode, int bitpos, int bitsize, int complement)
1782 {
1783   HOST_WIDE_INT masklow, maskhigh;
1784
1785   if (bitsize == 0)
1786     masklow = 0;
1787   else if (bitpos < HOST_BITS_PER_WIDE_INT)
1788     masklow = (HOST_WIDE_INT) -1 << bitpos;
1789   else
1790     masklow = 0;
1791
1792   if (bitpos + bitsize < HOST_BITS_PER_WIDE_INT)
1793     masklow &= ((unsigned HOST_WIDE_INT) -1
1794                 >> (HOST_BITS_PER_WIDE_INT - bitpos - bitsize));
1795
1796   if (bitpos <= HOST_BITS_PER_WIDE_INT)
1797     maskhigh = -1;
1798   else
1799     maskhigh = (HOST_WIDE_INT) -1 << (bitpos - HOST_BITS_PER_WIDE_INT);
1800
1801   if (bitsize == 0)
1802     maskhigh = 0;
1803   else if (bitpos + bitsize > HOST_BITS_PER_WIDE_INT)
1804     maskhigh &= ((unsigned HOST_WIDE_INT) -1
1805                  >> (2 * HOST_BITS_PER_WIDE_INT - bitpos - bitsize));
1806   else
1807     maskhigh = 0;
1808
1809   if (complement)
1810     {
1811       maskhigh = ~maskhigh;
1812       masklow = ~masklow;
1813     }
1814
1815   return immed_double_const (masklow, maskhigh, mode);
1816 }
1817
1818 /* Return a constant integer (CONST_INT or CONST_DOUBLE) rtx with the value
1819    VALUE truncated to BITSIZE bits and then shifted left BITPOS bits.  */
1820
1821 static rtx
1822 lshift_value (enum machine_mode mode, rtx value, int bitpos, int bitsize)
1823 {
1824   unsigned HOST_WIDE_INT v = INTVAL (value);
1825   HOST_WIDE_INT low, high;
1826
1827   if (bitsize < HOST_BITS_PER_WIDE_INT)
1828     v &= ~((HOST_WIDE_INT) -1 << bitsize);
1829
1830   if (bitpos < HOST_BITS_PER_WIDE_INT)
1831     {
1832       low = v << bitpos;
1833       high = (bitpos > 0 ? (v >> (HOST_BITS_PER_WIDE_INT - bitpos)) : 0);
1834     }
1835   else
1836     {
1837       low = 0;
1838       high = v << (bitpos - HOST_BITS_PER_WIDE_INT);
1839     }
1840
1841   return immed_double_const (low, high, mode);
1842 }
1843 \f
1844 /* Extract a bit field that is split across two words
1845    and return an RTX for the result.
1846
1847    OP0 is the REG, SUBREG or MEM rtx for the first of the two words.
1848    BITSIZE is the field width; BITPOS, position of its first bit, in the word.
1849    UNSIGNEDP is 1 if should zero-extend the contents; else sign-extend.  */
1850
1851 static rtx
1852 extract_split_bit_field (rtx op0, unsigned HOST_WIDE_INT bitsize,
1853                          unsigned HOST_WIDE_INT bitpos, int unsignedp)
1854 {
1855   unsigned int unit;
1856   unsigned int bitsdone = 0;
1857   rtx result = NULL_RTX;
1858   int first = 1;
1859
1860   /* Make sure UNIT isn't larger than BITS_PER_WORD, we can only handle that
1861      much at a time.  */
1862   if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG)
1863     unit = BITS_PER_WORD;
1864   else
1865     unit = MIN (MEM_ALIGN (op0), BITS_PER_WORD);
1866
1867   while (bitsdone < bitsize)
1868     {
1869       unsigned HOST_WIDE_INT thissize;
1870       rtx part, word;
1871       unsigned HOST_WIDE_INT thispos;
1872       unsigned HOST_WIDE_INT offset;
1873
1874       offset = (bitpos + bitsdone) / unit;
1875       thispos = (bitpos + bitsdone) % unit;
1876
1877       /* THISSIZE must not overrun a word boundary.  Otherwise,
1878          extract_fixed_bit_field will call us again, and we will mutually
1879          recurse forever.  */
1880       thissize = MIN (bitsize - bitsdone, BITS_PER_WORD);
1881       thissize = MIN (thissize, unit - thispos);
1882
1883       /* If OP0 is a register, then handle OFFSET here.
1884
1885          When handling multiword bitfields, extract_bit_field may pass
1886          down a word_mode SUBREG of a larger REG for a bitfield that actually
1887          crosses a word boundary.  Thus, for a SUBREG, we must find
1888          the current word starting from the base register.  */
1889       if (GET_CODE (op0) == SUBREG)
1890         {
1891           int word_offset = (SUBREG_BYTE (op0) / UNITS_PER_WORD) + offset;
1892           word = operand_subword_force (SUBREG_REG (op0), word_offset,
1893                                         GET_MODE (SUBREG_REG (op0)));
1894           offset = 0;
1895         }
1896       else if (GET_CODE (op0) == REG)
1897         {
1898           word = operand_subword_force (op0, offset, GET_MODE (op0));
1899           offset = 0;
1900         }
1901       else
1902         word = op0;
1903
1904       /* Extract the parts in bit-counting order,
1905          whose meaning is determined by BYTES_PER_UNIT.
1906          OFFSET is in UNITs, and UNIT is in bits.
1907          extract_fixed_bit_field wants offset in bytes.  */
1908       part = extract_fixed_bit_field (word_mode, word,
1909                                       offset * unit / BITS_PER_UNIT,
1910                                       thissize, thispos, 0, 1);
1911       bitsdone += thissize;
1912
1913       /* Shift this part into place for the result.  */
1914       if (BYTES_BIG_ENDIAN)
1915         {
1916           if (bitsize != bitsdone)
1917             part = expand_shift (LSHIFT_EXPR, word_mode, part,
1918                                  build_int_2 (bitsize - bitsdone, 0), 0, 1);
1919         }
1920       else
1921         {
1922           if (bitsdone != thissize)
1923             part = expand_shift (LSHIFT_EXPR, word_mode, part,
1924                                  build_int_2 (bitsdone - thissize, 0), 0, 1);
1925         }
1926
1927       if (first)
1928         result = part;
1929       else
1930         /* Combine the parts with bitwise or.  This works
1931            because we extracted each part as an unsigned bit field.  */
1932         result = expand_binop (word_mode, ior_optab, part, result, NULL_RTX, 1,
1933                                OPTAB_LIB_WIDEN);
1934
1935       first = 0;
1936     }
1937
1938   /* Unsigned bit field: we are done.  */
1939   if (unsignedp)
1940     return result;
1941   /* Signed bit field: sign-extend with two arithmetic shifts.  */
1942   result = expand_shift (LSHIFT_EXPR, word_mode, result,
1943                          build_int_2 (BITS_PER_WORD - bitsize, 0),
1944                          NULL_RTX, 0);
1945   return expand_shift (RSHIFT_EXPR, word_mode, result,
1946                        build_int_2 (BITS_PER_WORD - bitsize, 0), NULL_RTX, 0);
1947 }
1948 \f
1949 /* Add INC into TARGET.  */
1950
1951 void
1952 expand_inc (rtx target, rtx inc)
1953 {
1954   rtx value = expand_binop (GET_MODE (target), add_optab,
1955                             target, inc,
1956                             target, 0, OPTAB_LIB_WIDEN);
1957   if (value != target)
1958     emit_move_insn (target, value);
1959 }
1960
1961 /* Subtract DEC from TARGET.  */
1962
1963 void
1964 expand_dec (rtx target, rtx dec)
1965 {
1966   rtx value = expand_binop (GET_MODE (target), sub_optab,
1967                             target, dec,
1968                             target, 0, OPTAB_LIB_WIDEN);
1969   if (value != target)
1970     emit_move_insn (target, value);
1971 }
1972 \f
1973 /* Output a shift instruction for expression code CODE,
1974    with SHIFTED being the rtx for the value to shift,
1975    and AMOUNT the tree for the amount to shift by.
1976    Store the result in the rtx TARGET, if that is convenient.
1977    If UNSIGNEDP is nonzero, do a logical shift; otherwise, arithmetic.
1978    Return the rtx for where the value is.  */
1979
1980 rtx
1981 expand_shift (enum tree_code code, enum machine_mode mode, rtx shifted,
1982               tree amount, rtx target, int unsignedp)
1983 {
1984   rtx op1, temp = 0;
1985   int left = (code == LSHIFT_EXPR || code == LROTATE_EXPR);
1986   int rotate = (code == LROTATE_EXPR || code == RROTATE_EXPR);
1987   int try;
1988
1989   /* Previously detected shift-counts computed by NEGATE_EXPR
1990      and shifted in the other direction; but that does not work
1991      on all machines.  */
1992
1993   op1 = expand_expr (amount, NULL_RTX, VOIDmode, 0);
1994
1995   if (SHIFT_COUNT_TRUNCATED)
1996     {
1997       if (GET_CODE (op1) == CONST_INT
1998           && ((unsigned HOST_WIDE_INT) INTVAL (op1) >=
1999               (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode)))
2000         op1 = GEN_INT ((unsigned HOST_WIDE_INT) INTVAL (op1)
2001                        % GET_MODE_BITSIZE (mode));
2002       else if (GET_CODE (op1) == SUBREG
2003                && subreg_lowpart_p (op1))
2004         op1 = SUBREG_REG (op1);
2005     }
2006
2007   if (op1 == const0_rtx)
2008     return shifted;
2009
2010   for (try = 0; temp == 0 && try < 3; try++)
2011     {
2012       enum optab_methods methods;
2013
2014       if (try == 0)
2015         methods = OPTAB_DIRECT;
2016       else if (try == 1)
2017         methods = OPTAB_WIDEN;
2018       else
2019         methods = OPTAB_LIB_WIDEN;
2020
2021       if (rotate)
2022         {
2023           /* Widening does not work for rotation.  */
2024           if (methods == OPTAB_WIDEN)
2025             continue;
2026           else if (methods == OPTAB_LIB_WIDEN)
2027             {
2028               /* If we have been unable to open-code this by a rotation,
2029                  do it as the IOR of two shifts.  I.e., to rotate A
2030                  by N bits, compute (A << N) | ((unsigned) A >> (C - N))
2031                  where C is the bitsize of A.
2032
2033                  It is theoretically possible that the target machine might
2034                  not be able to perform either shift and hence we would
2035                  be making two libcalls rather than just the one for the
2036                  shift (similarly if IOR could not be done).  We will allow
2037                  this extremely unlikely lossage to avoid complicating the
2038                  code below.  */
2039
2040               rtx subtarget = target == shifted ? 0 : target;
2041               rtx temp1;
2042               tree type = TREE_TYPE (amount);
2043               tree new_amount = make_tree (type, op1);
2044               tree other_amount
2045                 = fold (build (MINUS_EXPR, type,
2046                                convert (type,
2047                                         build_int_2 (GET_MODE_BITSIZE (mode),
2048                                                      0)),
2049                                amount));
2050
2051               shifted = force_reg (mode, shifted);
2052
2053               temp = expand_shift (left ? LSHIFT_EXPR : RSHIFT_EXPR,
2054                                    mode, shifted, new_amount, subtarget, 1);
2055               temp1 = expand_shift (left ? RSHIFT_EXPR : LSHIFT_EXPR,
2056                                     mode, shifted, other_amount, 0, 1);
2057               return expand_binop (mode, ior_optab, temp, temp1, target,
2058                                    unsignedp, methods);
2059             }
2060
2061           temp = expand_binop (mode,
2062                                left ? rotl_optab : rotr_optab,
2063                                shifted, op1, target, unsignedp, methods);
2064
2065           /* If we don't have the rotate, but we are rotating by a constant
2066              that is in range, try a rotate in the opposite direction.  */
2067
2068           if (temp == 0 && GET_CODE (op1) == CONST_INT
2069               && INTVAL (op1) > 0
2070               && (unsigned int) INTVAL (op1) < GET_MODE_BITSIZE (mode))
2071             temp = expand_binop (mode,
2072                                  left ? rotr_optab : rotl_optab,
2073                                  shifted,
2074                                  GEN_INT (GET_MODE_BITSIZE (mode)
2075                                           - INTVAL (op1)),
2076                                  target, unsignedp, methods);
2077         }
2078       else if (unsignedp)
2079         temp = expand_binop (mode,
2080                              left ? ashl_optab : lshr_optab,
2081                              shifted, op1, target, unsignedp, methods);
2082
2083       /* Do arithmetic shifts.
2084          Also, if we are going to widen the operand, we can just as well
2085          use an arithmetic right-shift instead of a logical one.  */
2086       if (temp == 0 && ! rotate
2087           && (! unsignedp || (! left && methods == OPTAB_WIDEN)))
2088         {
2089           enum optab_methods methods1 = methods;
2090
2091           /* If trying to widen a log shift to an arithmetic shift,
2092              don't accept an arithmetic shift of the same size.  */
2093           if (unsignedp)
2094             methods1 = OPTAB_MUST_WIDEN;
2095
2096           /* Arithmetic shift */
2097
2098           temp = expand_binop (mode,
2099                                left ? ashl_optab : ashr_optab,
2100                                shifted, op1, target, unsignedp, methods1);
2101         }
2102
2103       /* We used to try extzv here for logical right shifts, but that was
2104          only useful for one machine, the VAX, and caused poor code
2105          generation there for lshrdi3, so the code was deleted and a
2106          define_expand for lshrsi3 was added to vax.md.  */
2107     }
2108
2109   if (temp == 0)
2110     abort ();
2111   return temp;
2112 }
2113 \f
2114 enum alg_code { alg_zero, alg_m, alg_shift,
2115                   alg_add_t_m2, alg_sub_t_m2,
2116                   alg_add_factor, alg_sub_factor,
2117                   alg_add_t2_m, alg_sub_t2_m,
2118                   alg_add, alg_subtract, alg_factor, alg_shiftop };
2119
2120 /* This structure records a sequence of operations.
2121    `ops' is the number of operations recorded.
2122    `cost' is their total cost.
2123    The operations are stored in `op' and the corresponding
2124    logarithms of the integer coefficients in `log'.
2125
2126    These are the operations:
2127    alg_zero             total := 0;
2128    alg_m                total := multiplicand;
2129    alg_shift            total := total * coeff
2130    alg_add_t_m2         total := total + multiplicand * coeff;
2131    alg_sub_t_m2         total := total - multiplicand * coeff;
2132    alg_add_factor       total := total * coeff + total;
2133    alg_sub_factor       total := total * coeff - total;
2134    alg_add_t2_m         total := total * coeff + multiplicand;
2135    alg_sub_t2_m         total := total * coeff - multiplicand;
2136
2137    The first operand must be either alg_zero or alg_m.  */
2138
2139 struct algorithm
2140 {
2141   short cost;
2142   short ops;
2143   /* The size of the OP and LOG fields are not directly related to the
2144      word size, but the worst-case algorithms will be if we have few
2145      consecutive ones or zeros, i.e., a multiplicand like 10101010101...
2146      In that case we will generate shift-by-2, add, shift-by-2, add,...,
2147      in total wordsize operations.  */
2148   enum alg_code op[MAX_BITS_PER_WORD];
2149   char log[MAX_BITS_PER_WORD];
2150 };
2151
2152 /* Indicates the type of fixup needed after a constant multiplication.
2153    BASIC_VARIANT means no fixup is needed, NEGATE_VARIANT means that
2154    the result should be negated, and ADD_VARIANT means that the
2155    multiplicand should be added to the result.  */
2156 enum mult_variant {basic_variant, negate_variant, add_variant};
2157
2158 static void synth_mult (struct algorithm *, unsigned HOST_WIDE_INT, int);
2159 static bool choose_mult_variant (enum machine_mode, HOST_WIDE_INT,
2160                                  struct algorithm *, enum mult_variant *, int);
2161 static rtx expand_mult_const (enum machine_mode, rtx, HOST_WIDE_INT, rtx,
2162                               const struct algorithm *, enum mult_variant);
2163 static unsigned HOST_WIDE_INT choose_multiplier (unsigned HOST_WIDE_INT, int,
2164                                                  int, unsigned HOST_WIDE_INT *,
2165                                                  int *, int *);
2166 static unsigned HOST_WIDE_INT invert_mod2n (unsigned HOST_WIDE_INT, int);
2167 static rtx extract_high_half (enum machine_mode, rtx);
2168 static rtx expand_mult_highpart_optab (enum machine_mode, rtx, rtx, rtx,
2169                                        int, int);
2170 /* Compute and return the best algorithm for multiplying by T.
2171    The algorithm must cost less than cost_limit
2172    If retval.cost >= COST_LIMIT, no algorithm was found and all
2173    other field of the returned struct are undefined.  */
2174
2175 static void
2176 synth_mult (struct algorithm *alg_out, unsigned HOST_WIDE_INT t,
2177             int cost_limit)
2178 {
2179   int m;
2180   struct algorithm *alg_in, *best_alg;
2181   int cost;
2182   unsigned HOST_WIDE_INT q;
2183
2184   /* Indicate that no algorithm is yet found.  If no algorithm
2185      is found, this value will be returned and indicate failure.  */
2186   alg_out->cost = cost_limit;
2187
2188   if (cost_limit <= 0)
2189     return;
2190
2191   /* t == 1 can be done in zero cost.  */
2192   if (t == 1)
2193     {
2194       alg_out->ops = 1;
2195       alg_out->cost = 0;
2196       alg_out->op[0] = alg_m;
2197       return;
2198     }
2199
2200   /* t == 0 sometimes has a cost.  If it does and it exceeds our limit,
2201      fail now.  */
2202   if (t == 0)
2203     {
2204       if (zero_cost >= cost_limit)
2205         return;
2206       else
2207         {
2208           alg_out->ops = 1;
2209           alg_out->cost = zero_cost;
2210           alg_out->op[0] = alg_zero;
2211           return;
2212         }
2213     }
2214
2215   /* We'll be needing a couple extra algorithm structures now.  */
2216
2217   alg_in = alloca (sizeof (struct algorithm));
2218   best_alg = alloca (sizeof (struct algorithm));
2219
2220   /* If we have a group of zero bits at the low-order part of T, try
2221      multiplying by the remaining bits and then doing a shift.  */
2222
2223   if ((t & 1) == 0)
2224     {
2225       m = floor_log2 (t & -t);  /* m = number of low zero bits */
2226       if (m < BITS_PER_WORD)
2227         {
2228           q = t >> m;
2229           cost = shift_cost[m];
2230           synth_mult (alg_in, q, cost_limit - cost);
2231
2232           cost += alg_in->cost;
2233           if (cost < cost_limit)
2234             {
2235               struct algorithm *x;
2236               x = alg_in, alg_in = best_alg, best_alg = x;
2237               best_alg->log[best_alg->ops] = m;
2238               best_alg->op[best_alg->ops] = alg_shift;
2239               cost_limit = cost;
2240             }
2241         }
2242     }
2243
2244   /* If we have an odd number, add or subtract one.  */
2245   if ((t & 1) != 0)
2246     {
2247       unsigned HOST_WIDE_INT w;
2248
2249       for (w = 1; (w & t) != 0; w <<= 1)
2250         ;
2251       /* If T was -1, then W will be zero after the loop.  This is another
2252          case where T ends with ...111.  Handling this with (T + 1) and
2253          subtract 1 produces slightly better code and results in algorithm
2254          selection much faster than treating it like the ...0111 case
2255          below.  */
2256       if (w == 0
2257           || (w > 2
2258               /* Reject the case where t is 3.
2259                  Thus we prefer addition in that case.  */
2260               && t != 3))
2261         {
2262           /* T ends with ...111.  Multiply by (T + 1) and subtract 1.  */
2263
2264           cost = add_cost;
2265           synth_mult (alg_in, t + 1, cost_limit - cost);
2266
2267           cost += alg_in->cost;
2268           if (cost < cost_limit)
2269             {
2270               struct algorithm *x;
2271               x = alg_in, alg_in = best_alg, best_alg = x;
2272               best_alg->log[best_alg->ops] = 0;
2273               best_alg->op[best_alg->ops] = alg_sub_t_m2;
2274               cost_limit = cost;
2275             }
2276         }
2277       else
2278         {
2279           /* T ends with ...01 or ...011.  Multiply by (T - 1) and add 1.  */
2280
2281           cost = add_cost;
2282           synth_mult (alg_in, t - 1, cost_limit - cost);
2283
2284           cost += alg_in->cost;
2285           if (cost < cost_limit)
2286             {
2287               struct algorithm *x;
2288               x = alg_in, alg_in = best_alg, best_alg = x;
2289               best_alg->log[best_alg->ops] = 0;
2290               best_alg->op[best_alg->ops] = alg_add_t_m2;
2291               cost_limit = cost;
2292             }
2293         }
2294     }
2295
2296   /* Look for factors of t of the form
2297      t = q(2**m +- 1), 2 <= m <= floor(log2(t - 1)).
2298      If we find such a factor, we can multiply by t using an algorithm that
2299      multiplies by q, shift the result by m and add/subtract it to itself.
2300
2301      We search for large factors first and loop down, even if large factors
2302      are less probable than small; if we find a large factor we will find a
2303      good sequence quickly, and therefore be able to prune (by decreasing
2304      COST_LIMIT) the search.  */
2305
2306   for (m = floor_log2 (t - 1); m >= 2; m--)
2307     {
2308       unsigned HOST_WIDE_INT d;
2309
2310       d = ((unsigned HOST_WIDE_INT) 1 << m) + 1;
2311       if (t % d == 0 && t > d && m < BITS_PER_WORD)
2312         {
2313           cost = MIN (shiftadd_cost[m], add_cost + shift_cost[m]);
2314           synth_mult (alg_in, t / d, cost_limit - cost);
2315
2316           cost += alg_in->cost;
2317           if (cost < cost_limit)
2318             {
2319               struct algorithm *x;
2320               x = alg_in, alg_in = best_alg, best_alg = x;
2321               best_alg->log[best_alg->ops] = m;
2322               best_alg->op[best_alg->ops] = alg_add_factor;
2323               cost_limit = cost;
2324             }
2325           /* Other factors will have been taken care of in the recursion.  */
2326           break;
2327         }
2328
2329       d = ((unsigned HOST_WIDE_INT) 1 << m) - 1;
2330       if (t % d == 0 && t > d && m < BITS_PER_WORD)
2331         {
2332           cost = MIN (shiftsub_cost[m], add_cost + shift_cost[m]);
2333           synth_mult (alg_in, t / d, cost_limit - cost);
2334
2335           cost += alg_in->cost;
2336           if (cost < cost_limit)
2337             {
2338               struct algorithm *x;
2339               x = alg_in, alg_in = best_alg, best_alg = x;
2340               best_alg->log[best_alg->ops] = m;
2341               best_alg->op[best_alg->ops] = alg_sub_factor;
2342               cost_limit = cost;
2343             }
2344           break;
2345         }
2346     }
2347
2348   /* Try shift-and-add (load effective address) instructions,
2349      i.e. do a*3, a*5, a*9.  */
2350   if ((t & 1) != 0)
2351     {
2352       q = t - 1;
2353       q = q & -q;
2354       m = exact_log2 (q);
2355       if (m >= 0 && m < BITS_PER_WORD)
2356         {
2357           cost = shiftadd_cost[m];
2358           synth_mult (alg_in, (t - 1) >> m, cost_limit - cost);
2359
2360           cost += alg_in->cost;
2361           if (cost < cost_limit)
2362             {
2363               struct algorithm *x;
2364               x = alg_in, alg_in = best_alg, best_alg = x;
2365               best_alg->log[best_alg->ops] = m;
2366               best_alg->op[best_alg->ops] = alg_add_t2_m;
2367               cost_limit = cost;
2368             }
2369         }
2370
2371       q = t + 1;
2372       q = q & -q;
2373       m = exact_log2 (q);
2374       if (m >= 0 && m < BITS_PER_WORD)
2375         {
2376           cost = shiftsub_cost[m];
2377           synth_mult (alg_in, (t + 1) >> m, cost_limit - cost);
2378
2379           cost += alg_in->cost;
2380           if (cost < cost_limit)
2381             {
2382               struct algorithm *x;
2383               x = alg_in, alg_in = best_alg, best_alg = x;
2384               best_alg->log[best_alg->ops] = m;
2385               best_alg->op[best_alg->ops] = alg_sub_t2_m;
2386               cost_limit = cost;
2387             }
2388         }
2389     }
2390
2391   /* If cost_limit has not decreased since we stored it in alg_out->cost,
2392      we have not found any algorithm.  */
2393   if (cost_limit == alg_out->cost)
2394     return;
2395
2396   /* If we are getting a too long sequence for `struct algorithm'
2397      to record, make this search fail.  */
2398   if (best_alg->ops == MAX_BITS_PER_WORD)
2399     return;
2400
2401   /* Copy the algorithm from temporary space to the space at alg_out.
2402      We avoid using structure assignment because the majority of
2403      best_alg is normally undefined, and this is a critical function.  */
2404   alg_out->ops = best_alg->ops + 1;
2405   alg_out->cost = cost_limit;
2406   memcpy (alg_out->op, best_alg->op,
2407           alg_out->ops * sizeof *alg_out->op);
2408   memcpy (alg_out->log, best_alg->log,
2409           alg_out->ops * sizeof *alg_out->log);
2410 }
2411 \f
2412 /* Find the cheapest way of multiplying a value of mode MODE by VAL.
2413    Try three variations:
2414
2415        - a shift/add sequence based on VAL itself
2416        - a shift/add sequence based on -VAL, followed by a negation
2417        - a shift/add sequence based on VAL - 1, followed by an addition.
2418
2419    Return true if the cheapest of these cost less than MULT_COST,
2420    describing the algorithm in *ALG and final fixup in *VARIANT.  */
2421
2422 static bool
2423 choose_mult_variant (enum machine_mode mode, HOST_WIDE_INT val,
2424                      struct algorithm *alg, enum mult_variant *variant,
2425                      int mult_cost)
2426 {
2427   struct algorithm alg2;
2428
2429   *variant = basic_variant;
2430   synth_mult (alg, val, mult_cost);
2431
2432   /* This works only if the inverted value actually fits in an
2433      `unsigned int' */
2434   if (HOST_BITS_PER_INT >= GET_MODE_BITSIZE (mode))
2435     {
2436       synth_mult (&alg2, -val, MIN (alg->cost, mult_cost) - negate_cost);
2437       alg2.cost += negate_cost;
2438       if (alg2.cost < alg->cost)
2439         *alg = alg2, *variant = negate_variant;
2440     }
2441
2442   /* This proves very useful for division-by-constant.  */
2443   synth_mult (&alg2, val - 1, MIN (alg->cost, mult_cost) - add_cost);
2444   alg2.cost += add_cost;
2445   if (alg2.cost < alg->cost)
2446     *alg = alg2, *variant = add_variant;
2447
2448   return alg->cost < mult_cost;
2449 }
2450
2451 /* A subroutine of expand_mult, used for constant multiplications.
2452    Multiply OP0 by VAL in mode MODE, storing the result in TARGET if
2453    convenient.  Use the shift/add sequence described by ALG and apply
2454    the final fixup specified by VARIANT.  */
2455
2456 static rtx
2457 expand_mult_const (enum machine_mode mode, rtx op0, HOST_WIDE_INT val,
2458                    rtx target, const struct algorithm *alg,
2459                    enum mult_variant variant)
2460 {
2461   HOST_WIDE_INT val_so_far;
2462   rtx insn, accum, tem;
2463   int opno;
2464   enum machine_mode nmode;
2465
2466   /* op0 must be register to make mult_cost match the precomputed
2467      shiftadd_cost array.  */
2468   op0 = protect_from_queue (op0, 0);
2469
2470   /* Avoid referencing memory over and over.
2471      For speed, but also for correctness when mem is volatile.  */
2472   if (GET_CODE (op0) == MEM)
2473     op0 = force_reg (mode, op0);
2474
2475   /* ACCUM starts out either as OP0 or as a zero, depending on
2476      the first operation.  */
2477
2478   if (alg->op[0] == alg_zero)
2479     {
2480       accum = copy_to_mode_reg (mode, const0_rtx);
2481       val_so_far = 0;
2482     }
2483   else if (alg->op[0] == alg_m)
2484     {
2485       accum = copy_to_mode_reg (mode, op0);
2486       val_so_far = 1;
2487     }
2488   else
2489     abort ();
2490
2491   for (opno = 1; opno < alg->ops; opno++)
2492     {
2493       int log = alg->log[opno];
2494       int preserve = preserve_subexpressions_p ();
2495       rtx shift_subtarget = preserve ? 0 : accum;
2496       rtx add_target
2497         = (opno == alg->ops - 1 && target != 0 && variant != add_variant
2498            && ! preserve)
2499           ? target : 0;
2500       rtx accum_target = preserve ? 0 : accum;
2501
2502       switch (alg->op[opno])
2503         {
2504         case alg_shift:
2505           accum = expand_shift (LSHIFT_EXPR, mode, accum,
2506                                 build_int_2 (log, 0), NULL_RTX, 0);
2507           val_so_far <<= log;
2508           break;
2509
2510         case alg_add_t_m2:
2511           tem = expand_shift (LSHIFT_EXPR, mode, op0,
2512                               build_int_2 (log, 0), NULL_RTX, 0);
2513           accum = force_operand (gen_rtx_PLUS (mode, accum, tem),
2514                                  add_target ? add_target : accum_target);
2515           val_so_far += (HOST_WIDE_INT) 1 << log;
2516           break;
2517
2518         case alg_sub_t_m2:
2519           tem = expand_shift (LSHIFT_EXPR, mode, op0,
2520                               build_int_2 (log, 0), NULL_RTX, 0);
2521           accum = force_operand (gen_rtx_MINUS (mode, accum, tem),
2522                                  add_target ? add_target : accum_target);
2523           val_so_far -= (HOST_WIDE_INT) 1 << log;
2524           break;
2525
2526         case alg_add_t2_m:
2527           accum = expand_shift (LSHIFT_EXPR, mode, accum,
2528                                 build_int_2 (log, 0), shift_subtarget,
2529                                 0);
2530           accum = force_operand (gen_rtx_PLUS (mode, accum, op0),
2531                                  add_target ? add_target : accum_target);
2532           val_so_far = (val_so_far << log) + 1;
2533           break;
2534
2535         case alg_sub_t2_m:
2536           accum = expand_shift (LSHIFT_EXPR, mode, accum,
2537                                 build_int_2 (log, 0), shift_subtarget, 0);
2538           accum = force_operand (gen_rtx_MINUS (mode, accum, op0),
2539                                  add_target ? add_target : accum_target);
2540           val_so_far = (val_so_far << log) - 1;
2541           break;
2542
2543         case alg_add_factor:
2544           tem = expand_shift (LSHIFT_EXPR, mode, accum,
2545                               build_int_2 (log, 0), NULL_RTX, 0);
2546           accum = force_operand (gen_rtx_PLUS (mode, accum, tem),
2547                                  add_target ? add_target : accum_target);
2548           val_so_far += val_so_far << log;
2549           break;
2550
2551         case alg_sub_factor:
2552           tem = expand_shift (LSHIFT_EXPR, mode, accum,
2553                               build_int_2 (log, 0), NULL_RTX, 0);
2554           accum = force_operand (gen_rtx_MINUS (mode, tem, accum),
2555                                  (add_target ? add_target
2556                                   : preserve ? 0 : tem));
2557           val_so_far = (val_so_far << log) - val_so_far;
2558           break;
2559
2560         default:
2561           abort ();
2562         }
2563
2564       /* Write a REG_EQUAL note on the last insn so that we can cse
2565          multiplication sequences.  Note that if ACCUM is a SUBREG,
2566          we've set the inner register and must properly indicate
2567          that.  */
2568
2569       tem = op0, nmode = mode;
2570       if (GET_CODE (accum) == SUBREG)
2571         {
2572           nmode = GET_MODE (SUBREG_REG (accum));
2573           tem = gen_lowpart (nmode, op0);
2574         }
2575
2576       insn = get_last_insn ();
2577       set_unique_reg_note (insn, REG_EQUAL,
2578                            gen_rtx_MULT (nmode, tem, GEN_INT (val_so_far)));
2579     }
2580
2581   if (variant == negate_variant)
2582     {
2583       val_so_far = -val_so_far;
2584       accum = expand_unop (mode, neg_optab, accum, target, 0);
2585     }
2586   else if (variant == add_variant)
2587     {
2588       val_so_far = val_so_far + 1;
2589       accum = force_operand (gen_rtx_PLUS (mode, accum, op0), target);
2590     }
2591
2592   if (val != val_so_far)
2593     abort ();
2594
2595   return accum;
2596 }
2597
2598 /* Perform a multiplication and return an rtx for the result.
2599    MODE is mode of value; OP0 and OP1 are what to multiply (rtx's);
2600    TARGET is a suggestion for where to store the result (an rtx).
2601
2602    We check specially for a constant integer as OP1.
2603    If you want this check for OP0 as well, then before calling
2604    you should swap the two operands if OP0 would be constant.  */
2605
2606 rtx
2607 expand_mult (enum machine_mode mode, rtx op0, rtx op1, rtx target,
2608              int unsignedp)
2609 {
2610   rtx const_op1 = op1;
2611   enum mult_variant variant;
2612   struct algorithm algorithm;
2613
2614   /* synth_mult does an `unsigned int' multiply.  As long as the mode is
2615      less than or equal in size to `unsigned int' this doesn't matter.
2616      If the mode is larger than `unsigned int', then synth_mult works only
2617      if the constant value exactly fits in an `unsigned int' without any
2618      truncation.  This means that multiplying by negative values does
2619      not work; results are off by 2^32 on a 32 bit machine.  */
2620
2621   /* If we are multiplying in DImode, it may still be a win
2622      to try to work with shifts and adds.  */
2623   if (GET_CODE (op1) == CONST_DOUBLE
2624       && GET_MODE_CLASS (GET_MODE (op1)) == MODE_INT
2625       && HOST_BITS_PER_INT >= BITS_PER_WORD
2626       && CONST_DOUBLE_HIGH (op1) == 0)
2627     const_op1 = GEN_INT (CONST_DOUBLE_LOW (op1));
2628   else if (HOST_BITS_PER_INT < GET_MODE_BITSIZE (mode)
2629            && GET_CODE (op1) == CONST_INT
2630            && INTVAL (op1) < 0)
2631     const_op1 = 0;
2632
2633   /* We used to test optimize here, on the grounds that it's better to
2634      produce a smaller program when -O is not used.
2635      But this causes such a terrible slowdown sometimes
2636      that it seems better to use synth_mult always.  */
2637
2638   if (const_op1 && GET_CODE (const_op1) == CONST_INT
2639       && (unsignedp || !flag_trapv))
2640     {
2641       int mult_cost = rtx_cost (gen_rtx_MULT (mode, op0, op1), SET);
2642       mult_cost = MIN (12 * add_cost, mult_cost);
2643
2644       if (choose_mult_variant (mode, INTVAL (const_op1), &algorithm, &variant,
2645                                mult_cost))
2646         return expand_mult_const (mode, op0, INTVAL (const_op1), target,
2647                                   &algorithm, variant);
2648     }
2649
2650   if (GET_CODE (op0) == CONST_DOUBLE)
2651     {
2652       rtx temp = op0;
2653       op0 = op1;
2654       op1 = temp;
2655     }
2656
2657   /* Expand x*2.0 as x+x.  */
2658   if (GET_CODE (op1) == CONST_DOUBLE
2659       && GET_MODE_CLASS (mode) == MODE_FLOAT)
2660     {
2661       REAL_VALUE_TYPE d;
2662       REAL_VALUE_FROM_CONST_DOUBLE (d, op1);
2663
2664       if (REAL_VALUES_EQUAL (d, dconst2))
2665         {
2666           op0 = force_reg (GET_MODE (op0), op0);
2667           return expand_binop (mode, add_optab, op0, op0,
2668                                target, unsignedp, OPTAB_LIB_WIDEN);
2669         }
2670     }
2671
2672   /* This used to use umul_optab if unsigned, but for non-widening multiply
2673      there is no difference between signed and unsigned.  */
2674   op0 = expand_binop (mode,
2675                       ! unsignedp
2676                       && flag_trapv && (GET_MODE_CLASS(mode) == MODE_INT)
2677                       ? smulv_optab : smul_optab,
2678                       op0, op1, target, unsignedp, OPTAB_LIB_WIDEN);
2679   if (op0 == 0)
2680     abort ();
2681   return op0;
2682 }
2683 \f
2684 /* Return the smallest n such that 2**n >= X.  */
2685
2686 int
2687 ceil_log2 (unsigned HOST_WIDE_INT x)
2688 {
2689   return floor_log2 (x - 1) + 1;
2690 }
2691
2692 /* Choose a minimal N + 1 bit approximation to 1/D that can be used to
2693    replace division by D, and put the least significant N bits of the result
2694    in *MULTIPLIER_PTR and return the most significant bit.
2695
2696    The width of operations is N (should be <= HOST_BITS_PER_WIDE_INT), the
2697    needed precision is in PRECISION (should be <= N).
2698
2699    PRECISION should be as small as possible so this function can choose
2700    multiplier more freely.
2701
2702    The rounded-up logarithm of D is placed in *lgup_ptr.  A shift count that
2703    is to be used for a final right shift is placed in *POST_SHIFT_PTR.
2704
2705    Using this function, x/D will be equal to (x * m) >> (*POST_SHIFT_PTR),
2706    where m is the full HOST_BITS_PER_WIDE_INT + 1 bit multiplier.  */
2707
2708 static
2709 unsigned HOST_WIDE_INT
2710 choose_multiplier (unsigned HOST_WIDE_INT d, int n, int precision,
2711                    unsigned HOST_WIDE_INT *multiplier_ptr,
2712                    int *post_shift_ptr, int *lgup_ptr)
2713 {
2714   HOST_WIDE_INT mhigh_hi, mlow_hi;
2715   unsigned HOST_WIDE_INT mhigh_lo, mlow_lo;
2716   int lgup, post_shift;
2717   int pow, pow2;
2718   unsigned HOST_WIDE_INT nl, dummy1;
2719   HOST_WIDE_INT nh, dummy2;
2720
2721   /* lgup = ceil(log2(divisor)); */
2722   lgup = ceil_log2 (d);
2723
2724   if (lgup > n)
2725     abort ();
2726
2727   pow = n + lgup;
2728   pow2 = n + lgup - precision;
2729
2730   if (pow == 2 * HOST_BITS_PER_WIDE_INT)
2731     {
2732       /* We could handle this with some effort, but this case is much better
2733          handled directly with a scc insn, so rely on caller using that.  */
2734       abort ();
2735     }
2736
2737   /* mlow = 2^(N + lgup)/d */
2738  if (pow >= HOST_BITS_PER_WIDE_INT)
2739     {
2740       nh = (HOST_WIDE_INT) 1 << (pow - HOST_BITS_PER_WIDE_INT);
2741       nl = 0;
2742     }
2743   else
2744     {
2745       nh = 0;
2746       nl = (unsigned HOST_WIDE_INT) 1 << pow;
2747     }
2748   div_and_round_double (TRUNC_DIV_EXPR, 1, nl, nh, d, (HOST_WIDE_INT) 0,
2749                         &mlow_lo, &mlow_hi, &dummy1, &dummy2);
2750
2751   /* mhigh = (2^(N + lgup) + 2^N + lgup - precision)/d */
2752   if (pow2 >= HOST_BITS_PER_WIDE_INT)
2753     nh |= (HOST_WIDE_INT) 1 << (pow2 - HOST_BITS_PER_WIDE_INT);
2754   else
2755     nl |= (unsigned HOST_WIDE_INT) 1 << pow2;
2756   div_and_round_double (TRUNC_DIV_EXPR, 1, nl, nh, d, (HOST_WIDE_INT) 0,
2757                         &mhigh_lo, &mhigh_hi, &dummy1, &dummy2);
2758
2759   if (mhigh_hi && nh - d >= d)
2760     abort ();
2761   if (mhigh_hi > 1 || mlow_hi > 1)
2762     abort ();
2763   /* Assert that mlow < mhigh.  */
2764   if (! (mlow_hi < mhigh_hi || (mlow_hi == mhigh_hi && mlow_lo < mhigh_lo)))
2765     abort ();
2766
2767   /* If precision == N, then mlow, mhigh exceed 2^N
2768      (but they do not exceed 2^(N+1)).  */
2769
2770   /* Reduce to lowest terms.  */
2771   for (post_shift = lgup; post_shift > 0; post_shift--)
2772     {
2773       unsigned HOST_WIDE_INT ml_lo = (mlow_hi << (HOST_BITS_PER_WIDE_INT - 1)) | (mlow_lo >> 1);
2774       unsigned HOST_WIDE_INT mh_lo = (mhigh_hi << (HOST_BITS_PER_WIDE_INT - 1)) | (mhigh_lo >> 1);
2775       if (ml_lo >= mh_lo)
2776         break;
2777
2778       mlow_hi = 0;
2779       mlow_lo = ml_lo;
2780       mhigh_hi = 0;
2781       mhigh_lo = mh_lo;
2782     }
2783
2784   *post_shift_ptr = post_shift;
2785   *lgup_ptr = lgup;
2786   if (n < HOST_BITS_PER_WIDE_INT)
2787     {
2788       unsigned HOST_WIDE_INT mask = ((unsigned HOST_WIDE_INT) 1 << n) - 1;
2789       *multiplier_ptr = mhigh_lo & mask;
2790       return mhigh_lo >= mask;
2791     }
2792   else
2793     {
2794       *multiplier_ptr = mhigh_lo;
2795       return mhigh_hi;
2796     }
2797 }
2798
2799 /* Compute the inverse of X mod 2**n, i.e., find Y such that X * Y is
2800    congruent to 1 (mod 2**N).  */
2801
2802 static unsigned HOST_WIDE_INT
2803 invert_mod2n (unsigned HOST_WIDE_INT x, int n)
2804 {
2805   /* Solve x*y == 1 (mod 2^n), where x is odd.  Return y.  */
2806
2807   /* The algorithm notes that the choice y = x satisfies
2808      x*y == 1 mod 2^3, since x is assumed odd.
2809      Each iteration doubles the number of bits of significance in y.  */
2810
2811   unsigned HOST_WIDE_INT mask;
2812   unsigned HOST_WIDE_INT y = x;
2813   int nbit = 3;
2814
2815   mask = (n == HOST_BITS_PER_WIDE_INT
2816           ? ~(unsigned HOST_WIDE_INT) 0
2817           : ((unsigned HOST_WIDE_INT) 1 << n) - 1);
2818
2819   while (nbit < n)
2820     {
2821       y = y * (2 - x*y) & mask;         /* Modulo 2^N */
2822       nbit *= 2;
2823     }
2824   return y;
2825 }
2826
2827 /* Emit code to adjust ADJ_OPERAND after multiplication of wrong signedness
2828    flavor of OP0 and OP1.  ADJ_OPERAND is already the high half of the
2829    product OP0 x OP1.  If UNSIGNEDP is nonzero, adjust the signed product
2830    to become unsigned, if UNSIGNEDP is zero, adjust the unsigned product to
2831    become signed.
2832
2833    The result is put in TARGET if that is convenient.
2834
2835    MODE is the mode of operation.  */
2836
2837 rtx
2838 expand_mult_highpart_adjust (enum machine_mode mode, rtx adj_operand, rtx op0,
2839                              rtx op1, rtx target, int unsignedp)
2840 {
2841   rtx tem;
2842   enum rtx_code adj_code = unsignedp ? PLUS : MINUS;
2843
2844   op1 = gen_int_mode (INTVAL (op1), mode);
2845   tem = expand_shift (RSHIFT_EXPR, mode, op0,
2846                       build_int_2 (GET_MODE_BITSIZE (mode) - 1, 0),
2847                       NULL_RTX, 0);
2848   tem = expand_and (mode, tem, op1, NULL_RTX);
2849   adj_operand
2850     = force_operand (gen_rtx_fmt_ee (adj_code, mode, adj_operand, tem),
2851                      adj_operand);
2852
2853   tem = expand_shift (RSHIFT_EXPR, mode, op1,
2854                       build_int_2 (GET_MODE_BITSIZE (mode) - 1, 0),
2855                       NULL_RTX, 0);
2856   tem = expand_and (mode, tem, op0, NULL_RTX);
2857   target = force_operand (gen_rtx_fmt_ee (adj_code, mode, adj_operand, tem),
2858                           target);
2859
2860   return target;
2861 }
2862
2863 /* Subroutine of expand_mult_highpart.  Return the MODE high part of OP.  */
2864
2865 static rtx
2866 extract_high_half (enum machine_mode mode, rtx op)
2867 {
2868   enum machine_mode wider_mode;
2869
2870   if (mode == word_mode)
2871     return gen_highpart (mode, op);
2872
2873   wider_mode = GET_MODE_WIDER_MODE (mode);
2874   op = expand_shift (RSHIFT_EXPR, wider_mode, op,
2875                      build_int_2 (GET_MODE_BITSIZE (mode), 0), 0, 1);
2876   return convert_modes (mode, wider_mode, op, 0);
2877 }
2878
2879 /* Like expand_mult_highpart, but only consider using a multiplication
2880    optab.  OP1 is an rtx for the constant operand.  */
2881
2882 static rtx
2883 expand_mult_highpart_optab (enum machine_mode mode, rtx op0, rtx op1,
2884                             rtx target, int unsignedp, int max_cost)
2885 {
2886   enum machine_mode wider_mode;
2887   optab moptab;
2888   rtx tem;
2889   int size;
2890
2891   wider_mode = GET_MODE_WIDER_MODE (mode);
2892   size = GET_MODE_BITSIZE (mode);
2893
2894   /* Firstly, try using a multiplication insn that only generates the needed
2895      high part of the product, and in the sign flavor of unsignedp.  */
2896   if (mul_highpart_cost[(int) mode] < max_cost)
2897     {
2898       moptab = unsignedp ? umul_highpart_optab : smul_highpart_optab;
2899       tem = expand_binop (mode, moptab, op0,
2900                           gen_int_mode (INTVAL (op1), mode), target,
2901                           unsignedp, OPTAB_DIRECT);
2902       if (tem)
2903         return tem;
2904     }
2905
2906   /* Secondly, same as above, but use sign flavor opposite of unsignedp.
2907      Need to adjust the result after the multiplication.  */
2908   if (size - 1 < BITS_PER_WORD
2909       && (mul_highpart_cost[(int) mode] + 2 * shift_cost[size-1] + 4 * add_cost
2910           < max_cost))
2911     {
2912       moptab = unsignedp ? smul_highpart_optab : umul_highpart_optab;
2913       tem = expand_binop (mode, moptab, op0,
2914                           gen_int_mode (INTVAL (op1), mode), target,
2915                           unsignedp, OPTAB_DIRECT);
2916       if (tem)
2917         /* We used the wrong signedness.  Adjust the result.  */
2918         return expand_mult_highpart_adjust (mode, tem, op0, op1,
2919                                             tem, unsignedp);
2920     }
2921
2922   /* Try widening multiplication.  */
2923   moptab = unsignedp ? umul_widen_optab : smul_widen_optab;
2924   if (moptab->handlers[(int) wider_mode].insn_code != CODE_FOR_nothing
2925       && mul_widen_cost[(int) wider_mode] < max_cost)
2926     {
2927       tem = expand_binop (wider_mode, moptab, op0, op1, 0,
2928                           unsignedp, OPTAB_WIDEN);
2929       if (tem)
2930         return extract_high_half (mode, tem);
2931     }
2932
2933   /* Try widening the mode and perform a non-widening multiplication.  */
2934   moptab = smul_optab;
2935   if (smul_optab->handlers[(int) wider_mode].insn_code != CODE_FOR_nothing
2936       && size - 1 < BITS_PER_WORD
2937       && mul_cost[(int) wider_mode] + shift_cost[size-1] < max_cost)
2938     {
2939       tem = expand_binop (wider_mode, moptab, op0, op1, 0,
2940                           unsignedp, OPTAB_WIDEN);
2941       if (tem)
2942         return extract_high_half (mode, tem);
2943     }
2944
2945   /* Try widening multiplication of opposite signedness, and adjust.  */
2946   moptab = unsignedp ? smul_widen_optab : umul_widen_optab;
2947   if (moptab->handlers[(int) wider_mode].insn_code != CODE_FOR_nothing
2948       && size - 1 < BITS_PER_WORD
2949       && (mul_widen_cost[(int) wider_mode]
2950           + 2 * shift_cost[size-1] + 4 * add_cost < max_cost))
2951     {
2952       rtx regop1 = force_reg (mode, op1);
2953       tem = expand_binop (wider_mode, moptab, op0, regop1,
2954                           NULL_RTX, ! unsignedp, OPTAB_WIDEN);
2955       if (tem != 0)
2956         {
2957           tem = extract_high_half (mode, tem);
2958           /* We used the wrong signedness.  Adjust the result.  */
2959           return expand_mult_highpart_adjust (mode, tem, op0, op1,
2960                                               target, unsignedp);
2961         }
2962     }
2963
2964   return 0;
2965 }
2966
2967 /* Emit code to multiply OP0 and CNST1, putting the high half of the result
2968    in TARGET if that is convenient, and return where the result is.  If the
2969    operation can not be performed, 0 is returned.
2970
2971    MODE is the mode of operation and result.
2972
2973    UNSIGNEDP nonzero means unsigned multiply.
2974
2975    MAX_COST is the total allowed cost for the expanded RTL.  */
2976
2977 rtx
2978 expand_mult_highpart (enum machine_mode mode, rtx op0,
2979                       unsigned HOST_WIDE_INT cnst1, rtx target,
2980                       int unsignedp, int max_cost)
2981 {
2982   enum machine_mode wider_mode = GET_MODE_WIDER_MODE (mode);
2983   int extra_cost;
2984   bool sign_adjust = false;
2985   enum mult_variant variant;
2986   struct algorithm alg;
2987   rtx op1, tem;
2988
2989   /* We can't support modes wider than HOST_BITS_PER_INT.  */
2990   if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
2991     abort ();
2992
2993   op1 = gen_int_mode (cnst1, wider_mode);
2994   cnst1 &= GET_MODE_MASK (mode);
2995
2996   /* We can't optimize modes wider than BITS_PER_WORD. 
2997      ??? We might be able to perform double-word arithmetic if 
2998      mode == word_mode, however all the cost calculations in
2999      synth_mult etc. assume single-word operations.  */
3000   if (GET_MODE_BITSIZE (wider_mode) > BITS_PER_WORD)
3001     return expand_mult_highpart_optab (mode, op0, op1, target,
3002                                        unsignedp, max_cost);
3003
3004   extra_cost = shift_cost[GET_MODE_BITSIZE (mode) - 1];
3005
3006   /* Check whether we try to multiply by a negative constant.  */
3007   if (!unsignedp && ((cnst1 >> (GET_MODE_BITSIZE (mode) - 1)) & 1))
3008     {
3009       sign_adjust = true;
3010       extra_cost += add_cost;
3011     }
3012
3013   /* See whether shift/add multiplication is cheap enough.  */
3014   if (choose_mult_variant (wider_mode, cnst1, &alg, &variant,
3015                            max_cost - extra_cost))
3016     {
3017       /* See whether the specialized multiplication optabs are
3018          cheaper than the shift/add version.  */
3019       tem = expand_mult_highpart_optab (mode, op0, op1, target,
3020                                         unsignedp, alg.cost + extra_cost);
3021       if (tem)
3022         return tem;
3023
3024       tem = convert_to_mode (wider_mode, op0, unsignedp);
3025       tem = expand_mult_const (wider_mode, tem, cnst1, 0, &alg, variant);
3026       tem = extract_high_half (mode, tem);
3027
3028       /* Adjust result for signedness. */
3029       if (sign_adjust)
3030         tem = force_operand (gen_rtx_MINUS (mode, tem, op0), tem);
3031
3032       return tem;
3033     }
3034   return expand_mult_highpart_optab (mode, op0, op1, target,
3035                                      unsignedp, max_cost);
3036 }
3037 \f
3038 /* Emit the code to divide OP0 by OP1, putting the result in TARGET
3039    if that is convenient, and returning where the result is.
3040    You may request either the quotient or the remainder as the result;
3041    specify REM_FLAG nonzero to get the remainder.
3042
3043    CODE is the expression code for which kind of division this is;
3044    it controls how rounding is done.  MODE is the machine mode to use.
3045    UNSIGNEDP nonzero means do unsigned division.  */
3046
3047 /* ??? For CEIL_MOD_EXPR, can compute incorrect remainder with ANDI
3048    and then correct it by or'ing in missing high bits
3049    if result of ANDI is nonzero.
3050    For ROUND_MOD_EXPR, can use ANDI and then sign-extend the result.
3051    This could optimize to a bfexts instruction.
3052    But C doesn't use these operations, so their optimizations are
3053    left for later.  */
3054 /* ??? For modulo, we don't actually need the highpart of the first product,
3055    the low part will do nicely.  And for small divisors, the second multiply
3056    can also be a low-part only multiply or even be completely left out.
3057    E.g. to calculate the remainder of a division by 3 with a 32 bit
3058    multiply, multiply with 0x55555556 and extract the upper two bits;
3059    the result is exact for inputs up to 0x1fffffff.
3060    The input range can be reduced by using cross-sum rules.
3061    For odd divisors >= 3, the following table gives right shift counts
3062    so that if a number is shifted by an integer multiple of the given
3063    amount, the remainder stays the same:
3064    2, 4, 3, 6, 10, 12, 4, 8, 18, 6, 11, 20, 18, 0, 5, 10, 12, 0, 12, 20,
3065    14, 12, 23, 21, 8, 0, 20, 18, 0, 0, 6, 12, 0, 22, 0, 18, 20, 30, 0, 0,
3066    0, 8, 0, 11, 12, 10, 36, 0, 30, 0, 0, 12, 0, 0, 0, 0, 44, 12, 24, 0,
3067    20, 0, 7, 14, 0, 18, 36, 0, 0, 46, 60, 0, 42, 0, 15, 24, 20, 0, 0, 33,
3068    0, 20, 0, 0, 18, 0, 60, 0, 0, 0, 0, 0, 40, 18, 0, 0, 12
3069
3070    Cross-sum rules for even numbers can be derived by leaving as many bits
3071    to the right alone as the divisor has zeros to the right.
3072    E.g. if x is an unsigned 32 bit number:
3073    (x mod 12) == (((x & 1023) + ((x >> 8) & ~3)) * 0x15555558 >> 2 * 3) >> 28
3074    */
3075
3076 #define EXACT_POWER_OF_2_OR_ZERO_P(x) (((x) & ((x) - 1)) == 0)
3077
3078 rtx
3079 expand_divmod (int rem_flag, enum tree_code code, enum machine_mode mode,
3080                rtx op0, rtx op1, rtx target, int unsignedp)
3081 {
3082   enum machine_mode compute_mode;
3083   rtx tquotient;
3084   rtx quotient = 0, remainder = 0;
3085   rtx last;
3086   int size;
3087   rtx insn, set;
3088   optab optab1, optab2;
3089   int op1_is_constant, op1_is_pow2 = 0;
3090   int max_cost, extra_cost;
3091   static HOST_WIDE_INT last_div_const = 0;
3092   static HOST_WIDE_INT ext_op1;
3093
3094   op1_is_constant = GET_CODE (op1) == CONST_INT;
3095   if (op1_is_constant)
3096     {
3097       ext_op1 = INTVAL (op1);
3098       if (unsignedp)
3099         ext_op1 &= GET_MODE_MASK (mode);
3100       op1_is_pow2 = ((EXACT_POWER_OF_2_OR_ZERO_P (ext_op1)
3101                      || (! unsignedp && EXACT_POWER_OF_2_OR_ZERO_P (-ext_op1))));
3102     }
3103
3104   /*
3105      This is the structure of expand_divmod:
3106
3107      First comes code to fix up the operands so we can perform the operations
3108      correctly and efficiently.
3109
3110      Second comes a switch statement with code specific for each rounding mode.
3111      For some special operands this code emits all RTL for the desired
3112      operation, for other cases, it generates only a quotient and stores it in
3113      QUOTIENT.  The case for trunc division/remainder might leave quotient = 0,
3114      to indicate that it has not done anything.
3115
3116      Last comes code that finishes the operation.  If QUOTIENT is set and
3117      REM_FLAG is set, the remainder is computed as OP0 - QUOTIENT * OP1.  If
3118      QUOTIENT is not set, it is computed using trunc rounding.
3119
3120      We try to generate special code for division and remainder when OP1 is a
3121      constant.  If |OP1| = 2**n we can use shifts and some other fast
3122      operations.  For other values of OP1, we compute a carefully selected
3123      fixed-point approximation m = 1/OP1, and generate code that multiplies OP0
3124      by m.
3125
3126      In all cases but EXACT_DIV_EXPR, this multiplication requires the upper
3127      half of the product.  Different strategies for generating the product are
3128      implemented in expand_mult_highpart.
3129
3130      If what we actually want is the remainder, we generate that by another
3131      by-constant multiplication and a subtraction.  */
3132
3133   /* We shouldn't be called with OP1 == const1_rtx, but some of the
3134      code below will malfunction if we are, so check here and handle
3135      the special case if so.  */
3136   if (op1 == const1_rtx)
3137     return rem_flag ? const0_rtx : op0;
3138
3139     /* When dividing by -1, we could get an overflow.
3140      negv_optab can handle overflows.  */
3141   if (! unsignedp && op1 == constm1_rtx)
3142     {
3143       if (rem_flag)
3144         return const0_rtx;
3145       return expand_unop (mode, flag_trapv && GET_MODE_CLASS(mode) == MODE_INT
3146                           ? negv_optab : neg_optab, op0, target, 0);
3147     }
3148
3149   if (target
3150       /* Don't use the function value register as a target
3151          since we have to read it as well as write it,
3152          and function-inlining gets confused by this.  */
3153       && ((REG_P (target) && REG_FUNCTION_VALUE_P (target))
3154           /* Don't clobber an operand while doing a multi-step calculation.  */
3155           || ((rem_flag || op1_is_constant)
3156               && (reg_mentioned_p (target, op0)
3157                   || (GET_CODE (op0) == MEM && GET_CODE (target) == MEM)))
3158           || reg_mentioned_p (target, op1)
3159           || (GET_CODE (op1) == MEM && GET_CODE (target) == MEM)))
3160     target = 0;
3161
3162   /* Get the mode in which to perform this computation.  Normally it will
3163      be MODE, but sometimes we can't do the desired operation in MODE.
3164      If so, pick a wider mode in which we can do the operation.  Convert
3165      to that mode at the start to avoid repeated conversions.
3166
3167      First see what operations we need.  These depend on the expression
3168      we are evaluating.  (We assume that divxx3 insns exist under the
3169      same conditions that modxx3 insns and that these insns don't normally
3170      fail.  If these assumptions are not correct, we may generate less
3171      efficient code in some cases.)
3172
3173      Then see if we find a mode in which we can open-code that operation
3174      (either a division, modulus, or shift).  Finally, check for the smallest
3175      mode for which we can do the operation with a library call.  */
3176
3177   /* We might want to refine this now that we have division-by-constant
3178      optimization.  Since expand_mult_highpart tries so many variants, it is
3179      not straightforward to generalize this.  Maybe we should make an array
3180      of possible modes in init_expmed?  Save this for GCC 2.7.  */
3181
3182   optab1 = ((op1_is_pow2 && op1 != const0_rtx)
3183             ? (unsignedp ? lshr_optab : ashr_optab)
3184             : (unsignedp ? udiv_optab : sdiv_optab));
3185   optab2 = ((op1_is_pow2 && op1 != const0_rtx)
3186             ? optab1
3187             : (unsignedp ? udivmod_optab : sdivmod_optab));
3188
3189   for (compute_mode = mode; compute_mode != VOIDmode;
3190        compute_mode = GET_MODE_WIDER_MODE (compute_mode))
3191     if (optab1->handlers[(int) compute_mode].insn_code != CODE_FOR_nothing
3192         || optab2->handlers[(int) compute_mode].insn_code != CODE_FOR_nothing)
3193       break;
3194
3195   if (compute_mode == VOIDmode)
3196     for (compute_mode = mode; compute_mode != VOIDmode;
3197          compute_mode = GET_MODE_WIDER_MODE (compute_mode))
3198       if (optab1->handlers[(int) compute_mode].libfunc
3199           || optab2->handlers[(int) compute_mode].libfunc)
3200         break;
3201
3202   /* If we still couldn't find a mode, use MODE, but we'll probably abort
3203      in expand_binop.  */
3204   if (compute_mode == VOIDmode)
3205     compute_mode = mode;
3206
3207   if (target && GET_MODE (target) == compute_mode)
3208     tquotient = target;
3209   else
3210     tquotient = gen_reg_rtx (compute_mode);
3211
3212   size = GET_MODE_BITSIZE (compute_mode);
3213 #if 0
3214   /* It should be possible to restrict the precision to GET_MODE_BITSIZE
3215      (mode), and thereby get better code when OP1 is a constant.  Do that
3216      later.  It will require going over all usages of SIZE below.  */
3217   size = GET_MODE_BITSIZE (mode);
3218 #endif
3219
3220   /* Only deduct something for a REM if the last divide done was
3221      for a different constant.   Then set the constant of the last
3222      divide.  */
3223   max_cost = div_cost[(int) compute_mode]
3224     - (rem_flag && ! (last_div_const != 0 && op1_is_constant
3225                       && INTVAL (op1) == last_div_const)
3226        ? mul_cost[(int) compute_mode] + add_cost : 0);
3227
3228   last_div_const = ! rem_flag && op1_is_constant ? INTVAL (op1) : 0;
3229
3230   /* Now convert to the best mode to use.  */
3231   if (compute_mode != mode)
3232     {
3233       op0 = convert_modes (compute_mode, mode, op0, unsignedp);
3234       op1 = convert_modes (compute_mode, mode, op1, unsignedp);
3235
3236       /* convert_modes may have placed op1 into a register, so we
3237          must recompute the following.  */
3238       op1_is_constant = GET_CODE (op1) == CONST_INT;
3239       op1_is_pow2 = (op1_is_constant
3240                      && ((EXACT_POWER_OF_2_OR_ZERO_P (INTVAL (op1))
3241                           || (! unsignedp
3242                               && EXACT_POWER_OF_2_OR_ZERO_P (-INTVAL (op1)))))) ;
3243     }
3244
3245   /* If one of the operands is a volatile MEM, copy it into a register.  */
3246
3247   if (GET_CODE (op0) == MEM && MEM_VOLATILE_P (op0))
3248     op0 = force_reg (compute_mode, op0);
3249   if (GET_CODE (op1) == MEM && MEM_VOLATILE_P (op1))
3250     op1 = force_reg (compute_mode, op1);
3251
3252   /* If we need the remainder or if OP1 is constant, we need to
3253      put OP0 in a register in case it has any queued subexpressions.  */
3254   if (rem_flag || op1_is_constant)
3255     op0 = force_reg (compute_mode, op0);
3256
3257   last = get_last_insn ();
3258
3259   /* Promote floor rounding to trunc rounding for unsigned operations.  */
3260   if (unsignedp)
3261     {
3262       if (code == FLOOR_DIV_EXPR)
3263         code = TRUNC_DIV_EXPR;
3264       if (code == FLOOR_MOD_EXPR)
3265         code = TRUNC_MOD_EXPR;
3266       if (code == EXACT_DIV_EXPR && op1_is_pow2)
3267         code = TRUNC_DIV_EXPR;
3268     }
3269
3270   if (op1 != const0_rtx)
3271     switch (code)
3272       {
3273       case TRUNC_MOD_EXPR:
3274       case TRUNC_DIV_EXPR:
3275         if (op1_is_constant)
3276           {
3277             if (unsignedp)
3278               {
3279                 unsigned HOST_WIDE_INT mh, ml;
3280                 int pre_shift, post_shift;
3281                 int dummy;
3282                 unsigned HOST_WIDE_INT d = (INTVAL (op1)
3283                                             & GET_MODE_MASK (compute_mode));
3284
3285                 if (EXACT_POWER_OF_2_OR_ZERO_P (d))
3286                   {
3287                     pre_shift = floor_log2 (d);
3288                     if (rem_flag)
3289                       {
3290                         remainder
3291                           = expand_binop (compute_mode, and_optab, op0,
3292                                           GEN_INT (((HOST_WIDE_INT) 1 << pre_shift) - 1),
3293                                           remainder, 1,
3294                                           OPTAB_LIB_WIDEN);
3295                         if (remainder)
3296                           return gen_lowpart (mode, remainder);
3297                       }
3298                     quotient = expand_shift (RSHIFT_EXPR, compute_mode, op0,
3299                                              build_int_2 (pre_shift, 0),
3300                                              tquotient, 1);
3301                   }
3302                 else if (size <= HOST_BITS_PER_WIDE_INT)
3303                   {
3304                     if (d >= ((unsigned HOST_WIDE_INT) 1 << (size - 1)))
3305                       {
3306                         /* Most significant bit of divisor is set; emit an scc
3307                            insn.  */
3308                         quotient = emit_store_flag (tquotient, GEU, op0, op1,
3309                                                     compute_mode, 1, 1);
3310                         if (quotient == 0)
3311                           goto fail1;
3312                       }
3313                     else
3314                       {
3315                         /* Find a suitable multiplier and right shift count
3316                            instead of multiplying with D.  */
3317
3318                         mh = choose_multiplier (d, size, size,
3319                                                 &ml, &post_shift, &dummy);
3320
3321                         /* If the suggested multiplier is more than SIZE bits,
3322                            we can do better for even divisors, using an
3323                            initial right shift.  */
3324                         if (mh != 0 && (d & 1) == 0)
3325                           {
3326                             pre_shift = floor_log2 (d & -d);
3327                             mh = choose_multiplier (d >> pre_shift, size,
3328                                                     size - pre_shift,
3329                                                     &ml, &post_shift, &dummy);
3330                             if (mh)
3331                               abort ();
3332                           }
3333                         else
3334                           pre_shift = 0;
3335
3336                         if (mh != 0)
3337                           {
3338                             rtx t1, t2, t3, t4;
3339
3340                             if (post_shift - 1 >= BITS_PER_WORD)
3341                               goto fail1;
3342
3343                             extra_cost = (shift_cost[post_shift - 1]
3344                                           + shift_cost[1] + 2 * add_cost);
3345                             t1 = expand_mult_highpart (compute_mode, op0, ml,
3346                                                        NULL_RTX, 1,
3347                                                        max_cost - extra_cost);
3348                             if (t1 == 0)
3349                               goto fail1;
3350                             t2 = force_operand (gen_rtx_MINUS (compute_mode,
3351                                                                op0, t1),
3352                                                 NULL_RTX);
3353                             t3 = expand_shift (RSHIFT_EXPR, compute_mode, t2,
3354                                                build_int_2 (1, 0), NULL_RTX,1);
3355                             t4 = force_operand (gen_rtx_PLUS (compute_mode,
3356                                                               t1, t3),
3357                                                 NULL_RTX);
3358                             quotient
3359                               = expand_shift (RSHIFT_EXPR, compute_mode, t4,
3360                                               build_int_2 (post_shift - 1, 0),
3361                                               tquotient, 1);
3362                           }
3363                         else
3364                           {
3365                             rtx t1, t2;
3366
3367                             if (pre_shift >= BITS_PER_WORD
3368                                 || post_shift >= BITS_PER_WORD)
3369                               goto fail1;
3370
3371                             t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
3372                                                build_int_2 (pre_shift, 0),
3373                                                NULL_RTX, 1);
3374                             extra_cost = (shift_cost[pre_shift]
3375                                           + shift_cost[post_shift]);
3376                             t2 = expand_mult_highpart (compute_mode, t1, ml,
3377                                                        NULL_RTX, 1,
3378                                                        max_cost - extra_cost);
3379                             if (t2 == 0)
3380                               goto fail1;
3381                             quotient
3382                               = expand_shift (RSHIFT_EXPR, compute_mode, t2,
3383                                               build_int_2 (post_shift, 0),
3384                                               tquotient, 1);
3385                           }
3386                       }
3387                   }
3388                 else            /* Too wide mode to use tricky code */
3389                   break;
3390
3391                 insn = get_last_insn ();
3392                 if (insn != last
3393                     && (set = single_set (insn)) != 0
3394                     && SET_DEST (set) == quotient)
3395                   set_unique_reg_note (insn,
3396                                        REG_EQUAL,
3397                                        gen_rtx_UDIV (compute_mode, op0, op1));
3398               }
3399             else                /* TRUNC_DIV, signed */
3400               {
3401                 unsigned HOST_WIDE_INT ml;
3402                 int lgup, post_shift;
3403                 HOST_WIDE_INT d = INTVAL (op1);
3404                 unsigned HOST_WIDE_INT abs_d = d >= 0 ? d : -d;
3405
3406                 /* n rem d = n rem -d */
3407                 if (rem_flag && d < 0)
3408                   {
3409                     d = abs_d;
3410                     op1 = gen_int_mode (abs_d, compute_mode);
3411                   }
3412
3413                 if (d == 1)
3414                   quotient = op0;
3415                 else if (d == -1)
3416                   quotient = expand_unop (compute_mode, neg_optab, op0,
3417                                           tquotient, 0);
3418                 else if (abs_d == (unsigned HOST_WIDE_INT) 1 << (size - 1))
3419                   {
3420                     /* This case is not handled correctly below.  */
3421                     quotient = emit_store_flag (tquotient, EQ, op0, op1,
3422                                                 compute_mode, 1, 1);
3423                     if (quotient == 0)
3424                       goto fail1;
3425                   }
3426                 else if (EXACT_POWER_OF_2_OR_ZERO_P (d)
3427                          && (rem_flag ? smod_pow2_cheap : sdiv_pow2_cheap)
3428                          /* ??? The cheap metric is computed only for
3429                             word_mode.  If this operation is wider, this may
3430                             not be so.  Assume true if the optab has an
3431                             expander for this mode.  */
3432                          && (((rem_flag ? smod_optab : sdiv_optab)
3433                               ->handlers[(int) compute_mode].insn_code
3434                               != CODE_FOR_nothing)
3435                              || (sdivmod_optab->handlers[(int) compute_mode]
3436                                  .insn_code != CODE_FOR_nothing)))
3437                   ;
3438                 else if (EXACT_POWER_OF_2_OR_ZERO_P (abs_d))
3439                   {
3440                     lgup = floor_log2 (abs_d);
3441                     if (BRANCH_COST < 1 || (abs_d != 2 && BRANCH_COST < 3))
3442                       {
3443                         rtx label = gen_label_rtx ();
3444                         rtx t1;
3445
3446                         t1 = copy_to_mode_reg (compute_mode, op0);
3447                         do_cmp_and_jump (t1, const0_rtx, GE,
3448                                          compute_mode, label);
3449                         expand_inc (t1, gen_int_mode (abs_d - 1,
3450                                                       compute_mode));
3451                         emit_label (label);
3452                         quotient = expand_shift (RSHIFT_EXPR, compute_mode, t1,
3453                                                  build_int_2 (lgup, 0),
3454                                                  tquotient, 0);
3455                       }
3456                     else
3457                       {
3458                         rtx t1, t2, t3;
3459                         t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
3460                                            build_int_2 (size - 1, 0),
3461                                            NULL_RTX, 0);
3462                         t2 = expand_shift (RSHIFT_EXPR, compute_mode, t1,
3463                                            build_int_2 (size - lgup, 0),
3464                                            NULL_RTX, 1);
3465                         t3 = force_operand (gen_rtx_PLUS (compute_mode,
3466                                                           op0, t2),
3467                                             NULL_RTX);
3468                         quotient = expand_shift (RSHIFT_EXPR, compute_mode, t3,
3469                                                  build_int_2 (lgup, 0),
3470                                                  tquotient, 0);
3471                       }
3472
3473                     /* We have computed OP0 / abs(OP1).  If OP1 is negative, negate
3474                        the quotient.  */
3475                     if (d < 0)
3476                       {
3477                         insn = get_last_insn ();
3478                         if (insn != last
3479                             && (set = single_set (insn)) != 0
3480                             && SET_DEST (set) == quotient
3481                             && abs_d < ((unsigned HOST_WIDE_INT) 1
3482                                         << (HOST_BITS_PER_WIDE_INT - 1)))
3483                           set_unique_reg_note (insn,
3484                                                REG_EQUAL,
3485                                                gen_rtx_DIV (compute_mode,
3486                                                             op0,
3487                                                             GEN_INT
3488                                                             (trunc_int_for_mode
3489                                                              (abs_d,
3490                                                               compute_mode))));
3491
3492                         quotient = expand_unop (compute_mode, neg_optab,
3493                                                 quotient, quotient, 0);
3494                       }
3495                   }
3496                 else if (size <= HOST_BITS_PER_WIDE_INT)
3497                   {
3498                     choose_multiplier (abs_d, size, size - 1,
3499                                        &ml, &post_shift, &lgup);
3500                     if (ml < (unsigned HOST_WIDE_INT) 1 << (size - 1))
3501                       {
3502                         rtx t1, t2, t3;
3503
3504                         if (post_shift >= BITS_PER_WORD
3505                             || size - 1 >= BITS_PER_WORD)
3506                           goto fail1;
3507
3508                         extra_cost = (shift_cost[post_shift]
3509                                       + shift_cost[size - 1] + add_cost);
3510                         t1 = expand_mult_highpart (compute_mode, op0, ml,
3511                                                    NULL_RTX, 0,
3512                                                    max_cost - extra_cost);
3513                         if (t1 == 0)
3514                           goto fail1;
3515                         t2 = expand_shift (RSHIFT_EXPR, compute_mode, t1,
3516                                            build_int_2 (post_shift, 0), NULL_RTX, 0);
3517                         t3 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
3518                                            build_int_2 (size - 1, 0), NULL_RTX, 0);
3519                         if (d < 0)
3520                           quotient
3521                             = force_operand (gen_rtx_MINUS (compute_mode,
3522                                                             t3, t2),
3523                                              tquotient);
3524                         else
3525                           quotient
3526                             = force_operand (gen_rtx_MINUS (compute_mode,
3527                                                             t2, t3),
3528                                              tquotient);
3529                       }
3530                     else
3531                       {
3532                         rtx t1, t2, t3, t4;
3533
3534                         if (post_shift >= BITS_PER_WORD
3535                             || size - 1 >= BITS_PER_WORD)
3536                           goto fail1;
3537
3538                         ml |= (~(unsigned HOST_WIDE_INT) 0) << (size - 1);
3539                         extra_cost = (shift_cost[post_shift]
3540                                       + shift_cost[size - 1] + 2 * add_cost);
3541                         t1 = expand_mult_highpart (compute_mode, op0, ml,
3542                                                    NULL_RTX, 0,
3543                                                    max_cost - extra_cost);
3544                         if (t1 == 0)
3545                           goto fail1;
3546                         t2 = force_operand (gen_rtx_PLUS (compute_mode,
3547                                                           t1, op0),
3548                                             NULL_RTX);
3549                         t3 = expand_shift (RSHIFT_EXPR, compute_mode, t2,
3550                                            build_int_2 (post_shift, 0),
3551                                            NULL_RTX, 0);
3552                         t4 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
3553                                            build_int_2 (size - 1, 0),
3554                                            NULL_RTX, 0);
3555                         if (d < 0)
3556                           quotient
3557                             = force_operand (gen_rtx_MINUS (compute_mode,
3558                                                             t4, t3),
3559                                              tquotient);
3560                         else
3561                           quotient
3562                             = force_operand (gen_rtx_MINUS (compute_mode,
3563                                                             t3, t4),
3564                                              tquotient);
3565                       }
3566                   }
3567                 else            /* Too wide mode to use tricky code */
3568                   break;
3569
3570                 insn = get_last_insn ();
3571                 if (insn != last
3572                     && (set = single_set (insn)) != 0
3573                     && SET_DEST (set) == quotient)
3574                   set_unique_reg_note (insn,
3575                                        REG_EQUAL,
3576                                        gen_rtx_DIV (compute_mode, op0, op1));
3577               }
3578             break;
3579           }
3580       fail1:
3581         delete_insns_since (last);
3582         break;
3583
3584       case FLOOR_DIV_EXPR:
3585       case FLOOR_MOD_EXPR:
3586       /* We will come here only for signed operations.  */
3587         if (op1_is_constant && HOST_BITS_PER_WIDE_INT >= size)
3588           {
3589             unsigned HOST_WIDE_INT mh, ml;
3590             int pre_shift, lgup, post_shift;
3591             HOST_WIDE_INT d = INTVAL (op1);
3592
3593             if (d > 0)
3594               {
3595                 /* We could just as easily deal with negative constants here,
3596                    but it does not seem worth the trouble for GCC 2.6.  */
3597                 if (EXACT_POWER_OF_2_OR_ZERO_P (d))
3598                   {
3599                     pre_shift = floor_log2 (d);
3600                     if (rem_flag)
3601                       {
3602                         remainder = expand_binop (compute_mode, and_optab, op0,
3603                                                   GEN_INT (((HOST_WIDE_INT) 1 << pre_shift) - 1),
3604                                                   remainder, 0, OPTAB_LIB_WIDEN);
3605                         if (remainder)
3606                           return gen_lowpart (mode, remainder);
3607                       }
3608                     quotient = expand_shift (RSHIFT_EXPR, compute_mode, op0,
3609                                              build_int_2 (pre_shift, 0),
3610                                              tquotient, 0);
3611                   }
3612                 else
3613                   {
3614                     rtx t1, t2, t3, t4;
3615
3616                     mh = choose_multiplier (d, size, size - 1,
3617                                             &ml, &post_shift, &lgup);
3618                     if (mh)
3619                       abort ();
3620
3621                     if (post_shift < BITS_PER_WORD
3622                         && size - 1 < BITS_PER_WORD)
3623                       {
3624                         t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
3625                                            build_int_2 (size - 1, 0),
3626                                            NULL_RTX, 0);
3627                         t2 = expand_binop (compute_mode, xor_optab, op0, t1,
3628                                            NULL_RTX, 0, OPTAB_WIDEN);
3629                         extra_cost = (shift_cost[post_shift]
3630                                       + shift_cost[size - 1] + 2 * add_cost);
3631                         t3 = expand_mult_highpart (compute_mode, t2, ml,
3632                                                    NULL_RTX, 1,
3633                                                    max_cost - extra_cost);
3634                         if (t3 != 0)
3635                           {
3636                             t4 = expand_shift (RSHIFT_EXPR, compute_mode, t3,
3637                                                build_int_2 (post_shift, 0),
3638                                                NULL_RTX, 1);
3639                             quotient = expand_binop (compute_mode, xor_optab,
3640                                                      t4, t1, tquotient, 0,
3641                                                      OPTAB_WIDEN);
3642                           }
3643                       }
3644                   }
3645               }
3646             else
3647               {
3648                 rtx nsign, t1, t2, t3, t4;
3649                 t1 = force_operand (gen_rtx_PLUS (compute_mode,
3650                                                   op0, constm1_rtx), NULL_RTX);
3651                 t2 = expand_binop (compute_mode, ior_optab, op0, t1, NULL_RTX,
3652                                    0, OPTAB_WIDEN);
3653                 nsign = expand_shift (RSHIFT_EXPR, compute_mode, t2,
3654                                       build_int_2 (size - 1, 0), NULL_RTX, 0);
3655                 t3 = force_operand (gen_rtx_MINUS (compute_mode, t1, nsign),
3656                                     NULL_RTX);
3657                 t4 = expand_divmod (0, TRUNC_DIV_EXPR, compute_mode, t3, op1,
3658                                     NULL_RTX, 0);
3659                 if (t4)
3660                   {
3661                     rtx t5;
3662                     t5 = expand_unop (compute_mode, one_cmpl_optab, nsign,
3663                                       NULL_RTX, 0);
3664                     quotient = force_operand (gen_rtx_PLUS (compute_mode,
3665                                                             t4, t5),
3666                                               tquotient);
3667                   }
3668               }
3669           }
3670
3671         if (quotient != 0)
3672           break;
3673         delete_insns_since (last);
3674
3675         /* Try using an instruction that produces both the quotient and
3676            remainder, using truncation.  We can easily compensate the quotient
3677            or remainder to get floor rounding, once we have the remainder.
3678            Notice that we compute also the final remainder value here,
3679            and return the result right away.  */
3680         if (target == 0 || GET_MODE (target) != compute_mode)
3681           target = gen_reg_rtx (compute_mode);
3682
3683         if (rem_flag)
3684           {
3685             remainder
3686               = GET_CODE (target) == REG ? target : gen_reg_rtx (compute_mode);
3687             quotient = gen_reg_rtx (compute_mode);
3688           }
3689         else
3690           {
3691             quotient
3692               = GET_CODE (target) == REG ? target : gen_reg_rtx (compute_mode);
3693             remainder = gen_reg_rtx (compute_mode);
3694           }
3695
3696         if (expand_twoval_binop (sdivmod_optab, op0, op1,
3697                                  quotient, remainder, 0))
3698           {
3699             /* This could be computed with a branch-less sequence.
3700                Save that for later.  */
3701             rtx tem;
3702             rtx label = gen_label_rtx ();
3703             do_cmp_and_jump (remainder, const0_rtx, EQ, compute_mode, label);
3704             tem = expand_binop (compute_mode, xor_optab, op0, op1,
3705                                 NULL_RTX, 0, OPTAB_WIDEN);
3706             do_cmp_and_jump (tem, const0_rtx, GE, compute_mode, label);
3707             expand_dec (quotient, const1_rtx);
3708             expand_inc (remainder, op1);
3709             emit_label (label);
3710             return gen_lowpart (mode, rem_flag ? remainder : quotient);
3711           }
3712
3713         /* No luck with division elimination or divmod.  Have to do it
3714            by conditionally adjusting op0 *and* the result.  */
3715         {
3716           rtx label1, label2, label3, label4, label5;
3717           rtx adjusted_op0;
3718           rtx tem;
3719
3720           quotient = gen_reg_rtx (compute_mode);
3721           adjusted_op0 = copy_to_mode_reg (compute_mode, op0);
3722           label1 = gen_label_rtx ();
3723           label2 = gen_label_rtx ();
3724           label3 = gen_label_rtx ();
3725           label4 = gen_label_rtx ();
3726           label5 = gen_label_rtx ();
3727           do_cmp_and_jump (op1, const0_rtx, LT, compute_mode, label2);
3728           do_cmp_and_jump (adjusted_op0, const0_rtx, LT, compute_mode, label1);
3729           tem = expand_binop (compute_mode, sdiv_optab, adjusted_op0, op1,
3730                               quotient, 0, OPTAB_LIB_WIDEN);
3731           if (tem != quotient)
3732             emit_move_insn (quotient, tem);
3733           emit_jump_insn (gen_jump (label5));
3734           emit_barrier ();
3735           emit_label (label1);
3736           expand_inc (adjusted_op0, const1_rtx);
3737           emit_jump_insn (gen_jump (label4));
3738           emit_barrier ();
3739           emit_label (label2);
3740           do_cmp_and_jump (adjusted_op0, const0_rtx, GT, compute_mode, label3);
3741           tem = expand_binop (compute_mode, sdiv_optab, adjusted_op0, op1,
3742                               quotient, 0, OPTAB_LIB_WIDEN);
3743           if (tem != quotient)
3744             emit_move_insn (quotient, tem);
3745           emit_jump_insn (gen_jump (label5));
3746           emit_barrier ();
3747           emit_label (label3);
3748           expand_dec (adjusted_op0, const1_rtx);
3749           emit_label (label4);
3750           tem = expand_binop (compute_mode, sdiv_optab, adjusted_op0, op1,
3751                               quotient, 0, OPTAB_LIB_WIDEN);
3752           if (tem != quotient)
3753             emit_move_insn (quotient, tem);
3754           expand_dec (quotient, const1_rtx);
3755           emit_label (label5);
3756         }
3757         break;
3758
3759       case CEIL_DIV_EXPR:
3760       case CEIL_MOD_EXPR:
3761         if (unsignedp)
3762           {
3763             if (op1_is_constant && EXACT_POWER_OF_2_OR_ZERO_P (INTVAL (op1)))
3764               {
3765                 rtx t1, t2, t3;
3766                 unsigned HOST_WIDE_INT d = INTVAL (op1);
3767                 t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
3768                                    build_int_2 (floor_log2 (d), 0),
3769                                    tquotient, 1);
3770                 t2 = expand_binop (compute_mode, and_optab, op0,
3771                                    GEN_INT (d - 1),
3772                                    NULL_RTX, 1, OPTAB_LIB_WIDEN);
3773                 t3 = gen_reg_rtx (compute_mode);
3774                 t3 = emit_store_flag (t3, NE, t2, const0_rtx,
3775                                       compute_mode, 1, 1);
3776                 if (t3 == 0)
3777                   {
3778                     rtx lab;
3779                     lab = gen_label_rtx ();
3780                     do_cmp_and_jump (t2, const0_rtx, EQ, compute_mode, lab);
3781                     expand_inc (t1, const1_rtx);
3782                     emit_label (lab);
3783                     quotient = t1;
3784                   }
3785                 else
3786                   quotient = force_operand (gen_rtx_PLUS (compute_mode,
3787                                                           t1, t3),
3788                                             tquotient);
3789                 break;
3790               }
3791
3792             /* Try using an instruction that produces both the quotient and
3793                remainder, using truncation.  We can easily compensate the
3794                quotient or remainder to get ceiling rounding, once we have the
3795                remainder.  Notice that we compute also the final remainder
3796                value here, and return the result right away.  */
3797             if (target == 0 || GET_MODE (target) != compute_mode)
3798               target = gen_reg_rtx (compute_mode);
3799
3800             if (rem_flag)
3801               {
3802                 remainder = (GET_CODE (target) == REG
3803                              ? target : gen_reg_rtx (compute_mode));
3804                 quotient = gen_reg_rtx (compute_mode);
3805               }
3806             else
3807               {
3808                 quotient = (GET_CODE (target) == REG
3809                             ? target : gen_reg_rtx (compute_mode));
3810                 remainder = gen_reg_rtx (compute_mode);
3811               }
3812
3813             if (expand_twoval_binop (udivmod_optab, op0, op1, quotient,
3814                                      remainder, 1))
3815               {
3816                 /* This could be computed with a branch-less sequence.
3817                    Save that for later.  */
3818                 rtx label = gen_label_rtx ();
3819                 do_cmp_and_jump (remainder, const0_rtx, EQ,
3820                                  compute_mode, label);
3821                 expand_inc (quotient, const1_rtx);
3822                 expand_dec (remainder, op1);
3823                 emit_label (label);
3824                 return gen_lowpart (mode, rem_flag ? remainder : quotient);
3825               }
3826
3827             /* No luck with division elimination or divmod.  Have to do it
3828                by conditionally adjusting op0 *and* the result.  */
3829             {
3830               rtx label1, label2;
3831               rtx adjusted_op0, tem;
3832
3833               quotient = gen_reg_rtx (compute_mode);
3834               adjusted_op0 = copy_to_mode_reg (compute_mode, op0);
3835               label1 = gen_label_rtx ();
3836               label2 = gen_label_rtx ();
3837               do_cmp_and_jump (adjusted_op0, const0_rtx, NE,
3838                                compute_mode, label1);
3839               emit_move_insn  (quotient, const0_rtx);
3840               emit_jump_insn (gen_jump (label2));
3841               emit_barrier ();
3842               emit_label (label1);
3843               expand_dec (adjusted_op0, const1_rtx);
3844               tem = expand_binop (compute_mode, udiv_optab, adjusted_op0, op1,
3845                                   quotient, 1, OPTAB_LIB_WIDEN);
3846               if (tem != quotient)
3847                 emit_move_insn (quotient, tem);
3848               expand_inc (quotient, const1_rtx);
3849               emit_label (label2);
3850             }
3851           }
3852         else /* signed */
3853           {
3854             if (op1_is_constant && EXACT_POWER_OF_2_OR_ZERO_P (INTVAL (op1))
3855                 && INTVAL (op1) >= 0)
3856               {
3857                 /* This is extremely similar to the code for the unsigned case
3858                    above.  For 2.7 we should merge these variants, but for
3859                    2.6.1 I don't want to touch the code for unsigned since that
3860                    get used in C.  The signed case will only be used by other
3861                    languages (Ada).  */
3862
3863                 rtx t1, t2, t3;
3864                 unsigned HOST_WIDE_INT d = INTVAL (op1);
3865                 t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
3866                                    build_int_2 (floor_log2 (d), 0),
3867                                    tquotient, 0);
3868                 t2 = expand_binop (compute_mode, and_optab, op0,
3869                                    GEN_INT (d - 1),
3870                                    NULL_RTX, 1, OPTAB_LIB_WIDEN);
3871                 t3 = gen_reg_rtx (compute_mode);
3872                 t3 = emit_store_flag (t3, NE, t2, const0_rtx,
3873                                       compute_mode, 1, 1);
3874                 if (t3 == 0)
3875                   {
3876                     rtx lab;
3877                     lab = gen_label_rtx ();
3878                     do_cmp_and_jump (t2, const0_rtx, EQ, compute_mode, lab);
3879                     expand_inc (t1, const1_rtx);
3880                     emit_label (lab);
3881                     quotient = t1;
3882                   }
3883                 else
3884                   quotient = force_operand (gen_rtx_PLUS (compute_mode,
3885                                                           t1, t3),
3886                                             tquotient);
3887                 break;
3888               }
3889
3890             /* Try using an instruction that produces both the quotient and
3891                remainder, using truncation.  We can easily compensate the
3892                quotient or remainder to get ceiling rounding, once we have the
3893                remainder.  Notice that we compute also the final remainder
3894                value here, and return the result right away.  */
3895             if (target == 0 || GET_MODE (target) != compute_mode)
3896               target = gen_reg_rtx (compute_mode);
3897             if (rem_flag)
3898               {
3899                 remainder= (GET_CODE (target) == REG
3900                             ? target : gen_reg_rtx (compute_mode));
3901                 quotient = gen_reg_rtx (compute_mode);
3902               }
3903             else
3904               {
3905                 quotient = (GET_CODE (target) == REG
3906                             ? target : gen_reg_rtx (compute_mode));
3907                 remainder = gen_reg_rtx (compute_mode);
3908               }
3909
3910             if (expand_twoval_binop (sdivmod_optab, op0, op1, quotient,
3911                                      remainder, 0))
3912               {
3913                 /* This could be computed with a branch-less sequence.
3914                    Save that for later.  */
3915                 rtx tem;
3916                 rtx label = gen_label_rtx ();
3917                 do_cmp_and_jump (remainder, const0_rtx, EQ,
3918                                  compute_mode, label);
3919                 tem = expand_binop (compute_mode, xor_optab, op0, op1,
3920                                     NULL_RTX, 0, OPTAB_WIDEN);
3921                 do_cmp_and_jump (tem, const0_rtx, LT, compute_mode, label);
3922                 expand_inc (quotient, const1_rtx);
3923                 expand_dec (remainder, op1);
3924                 emit_label (label);
3925                 return gen_lowpart (mode, rem_flag ? remainder : quotient);
3926               }
3927
3928             /* No luck with division elimination or divmod.  Have to do it
3929                by conditionally adjusting op0 *and* the result.  */
3930             {
3931               rtx label1, label2, label3, label4, label5;
3932               rtx adjusted_op0;
3933               rtx tem;
3934
3935               quotient = gen_reg_rtx (compute_mode);
3936               adjusted_op0 = copy_to_mode_reg (compute_mode, op0);
3937               label1 = gen_label_rtx ();
3938               label2 = gen_label_rtx ();
3939               label3 = gen_label_rtx ();
3940               label4 = gen_label_rtx ();
3941               label5 = gen_label_rtx ();
3942               do_cmp_and_jump (op1, const0_rtx, LT, compute_mode, label2);
3943               do_cmp_and_jump (adjusted_op0, const0_rtx, GT,
3944                                compute_mode, label1);
3945               tem = expand_binop (compute_mode, sdiv_optab, adjusted_op0, op1,
3946                                   quotient, 0, OPTAB_LIB_WIDEN);
3947               if (tem != quotient)
3948                 emit_move_insn (quotient, tem);
3949               emit_jump_insn (gen_jump (label5));
3950               emit_barrier ();
3951               emit_label (label1);
3952               expand_dec (adjusted_op0, const1_rtx);
3953               emit_jump_insn (gen_jump (label4));
3954               emit_barrier ();
3955               emit_label (label2);
3956               do_cmp_and_jump (adjusted_op0, const0_rtx, LT,
3957                                compute_mode, label3);
3958               tem = expand_binop (compute_mode, sdiv_optab, adjusted_op0, op1,
3959                                   quotient, 0, OPTAB_LIB_WIDEN);
3960               if (tem != quotient)
3961                 emit_move_insn (quotient, tem);
3962               emit_jump_insn (gen_jump (label5));
3963               emit_barrier ();
3964               emit_label (label3);
3965               expand_inc (adjusted_op0, const1_rtx);
3966               emit_label (label4);
3967               tem = expand_binop (compute_mode, sdiv_optab, adjusted_op0, op1,
3968                                   quotient, 0, OPTAB_LIB_WIDEN);
3969               if (tem != quotient)
3970                 emit_move_insn (quotient, tem);
3971               expand_inc (quotient, const1_rtx);
3972               emit_label (label5);
3973             }
3974           }
3975         break;
3976
3977       case EXACT_DIV_EXPR:
3978         if (op1_is_constant && HOST_BITS_PER_WIDE_INT >= size)
3979           {
3980             HOST_WIDE_INT d = INTVAL (op1);
3981             unsigned HOST_WIDE_INT ml;
3982             int pre_shift;
3983             rtx t1;
3984
3985             pre_shift = floor_log2 (d & -d);
3986             ml = invert_mod2n (d >> pre_shift, size);
3987             t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
3988                                build_int_2 (pre_shift, 0), NULL_RTX, unsignedp);
3989             quotient = expand_mult (compute_mode, t1,
3990                                     gen_int_mode (ml, compute_mode),
3991                                     NULL_RTX, 1);
3992
3993             insn = get_last_insn ();
3994             set_unique_reg_note (insn,
3995                                  REG_EQUAL,
3996                                  gen_rtx_fmt_ee (unsignedp ? UDIV : DIV,
3997                                                  compute_mode,
3998                                                  op0, op1));
3999           }
4000         break;
4001
4002       case ROUND_DIV_EXPR:
4003       case ROUND_MOD_EXPR:
4004         if (unsignedp)
4005           {
4006             rtx tem;
4007             rtx label;
4008             label = gen_label_rtx ();
4009             quotient = gen_reg_rtx (compute_mode);
4010             remainder = gen_reg_rtx (compute_mode);
4011             if (expand_twoval_binop (udivmod_optab, op0, op1, quotient, remainder, 1) == 0)
4012               {
4013                 rtx tem;
4014                 quotient = expand_binop (compute_mode, udiv_optab, op0, op1,
4015                                          quotient, 1, OPTAB_LIB_WIDEN);
4016                 tem = expand_mult (compute_mode, quotient, op1, NULL_RTX, 1);
4017                 remainder = expand_binop (compute_mode, sub_optab, op0, tem,
4018                                           remainder, 1, OPTAB_LIB_WIDEN);
4019               }
4020             tem = plus_constant (op1, -1);
4021             tem = expand_shift (RSHIFT_EXPR, compute_mode, tem,
4022                                 build_int_2 (1, 0), NULL_RTX, 1);
4023             do_cmp_and_jump (remainder, tem, LEU, compute_mode, label);
4024             expand_inc (quotient, const1_rtx);
4025             expand_dec (remainder, op1);
4026             emit_label (label);
4027           }
4028         else
4029           {
4030             rtx abs_rem, abs_op1, tem, mask;
4031             rtx label;
4032             label = gen_label_rtx ();
4033             quotient = gen_reg_rtx (compute_mode);
4034             remainder = gen_reg_rtx (compute_mode);
4035             if (expand_twoval_binop (sdivmod_optab, op0, op1, quotient, remainder, 0) == 0)
4036               {
4037                 rtx tem;
4038                 quotient = expand_binop (compute_mode, sdiv_optab, op0, op1,
4039                                          quotient, 0, OPTAB_LIB_WIDEN);
4040                 tem = expand_mult (compute_mode, quotient, op1, NULL_RTX, 0);
4041                 remainder = expand_binop (compute_mode, sub_optab, op0, tem,
4042                                           remainder, 0, OPTAB_LIB_WIDEN);
4043               }
4044             abs_rem = expand_abs (compute_mode, remainder, NULL_RTX, 1, 0);
4045             abs_op1 = expand_abs (compute_mode, op1, NULL_RTX, 1, 0);
4046             tem = expand_shift (LSHIFT_EXPR, compute_mode, abs_rem,
4047                                 build_int_2 (1, 0), NULL_RTX, 1);
4048             do_cmp_and_jump (tem, abs_op1, LTU, compute_mode, label);
4049             tem = expand_binop (compute_mode, xor_optab, op0, op1,
4050                                 NULL_RTX, 0, OPTAB_WIDEN);
4051             mask = expand_shift (RSHIFT_EXPR, compute_mode, tem,
4052                                 build_int_2 (size - 1, 0), NULL_RTX, 0);
4053             tem = expand_binop (compute_mode, xor_optab, mask, const1_rtx,
4054                                 NULL_RTX, 0, OPTAB_WIDEN);
4055             tem = expand_binop (compute_mode, sub_optab, tem, mask,
4056                                 NULL_RTX, 0, OPTAB_WIDEN);
4057             expand_inc (quotient, tem);
4058             tem = expand_binop (compute_mode, xor_optab, mask, op1,
4059                                 NULL_RTX, 0, OPTAB_WIDEN);
4060             tem = expand_binop (compute_mode, sub_optab, tem, mask,
4061                                 NULL_RTX, 0, OPTAB_WIDEN);
4062             expand_dec (remainder, tem);
4063             emit_label (label);
4064           }
4065         return gen_lowpart (mode, rem_flag ? remainder : quotient);
4066
4067       default:
4068         abort ();
4069       }
4070
4071   if (quotient == 0)
4072     {
4073       if (target && GET_MODE (target) != compute_mode)
4074         target = 0;
4075
4076       if (rem_flag)
4077         {
4078           /* Try to produce the remainder without producing the quotient.
4079              If we seem to have a divmod pattern that does not require widening,
4080              don't try widening here.  We should really have a WIDEN argument
4081              to expand_twoval_binop, since what we'd really like to do here is
4082              1) try a mod insn in compute_mode
4083              2) try a divmod insn in compute_mode
4084              3) try a div insn in compute_mode and multiply-subtract to get
4085                 remainder
4086              4) try the same things with widening allowed.  */
4087           remainder
4088             = sign_expand_binop (compute_mode, umod_optab, smod_optab,
4089                                  op0, op1, target,
4090                                  unsignedp,
4091                                  ((optab2->handlers[(int) compute_mode].insn_code
4092                                    != CODE_FOR_nothing)
4093                                   ? OPTAB_DIRECT : OPTAB_WIDEN));
4094           if (remainder == 0)
4095             {
4096               /* No luck there.  Can we do remainder and divide at once
4097                  without a library call?  */
4098               remainder = gen_reg_rtx (compute_mode);
4099               if (! expand_twoval_binop ((unsignedp
4100                                           ? udivmod_optab
4101                                           : sdivmod_optab),
4102                                          op0, op1,
4103                                          NULL_RTX, remainder, unsignedp))
4104                 remainder = 0;
4105             }
4106
4107           if (remainder)
4108             return gen_lowpart (mode, remainder);
4109         }
4110
4111       /* Produce the quotient.  Try a quotient insn, but not a library call.
4112          If we have a divmod in this mode, use it in preference to widening
4113          the div (for this test we assume it will not fail). Note that optab2
4114          is set to the one of the two optabs that the call below will use.  */
4115       quotient
4116         = sign_expand_binop (compute_mode, udiv_optab, sdiv_optab,
4117                              op0, op1, rem_flag ? NULL_RTX : target,
4118                              unsignedp,
4119                              ((optab2->handlers[(int) compute_mode].insn_code
4120                                != CODE_FOR_nothing)
4121                               ? OPTAB_DIRECT : OPTAB_WIDEN));
4122
4123       if (quotient == 0)
4124         {
4125           /* No luck there.  Try a quotient-and-remainder insn,
4126              keeping the quotient alone.  */
4127           quotient = gen_reg_rtx (compute_mode);
4128           if (! expand_twoval_binop (unsignedp ? udivmod_optab : sdivmod_optab,
4129                                      op0, op1,
4130                                      quotient, NULL_RTX, unsignedp))
4131             {
4132               quotient = 0;
4133               if (! rem_flag)
4134                 /* Still no luck.  If we are not computing the remainder,
4135                    use a library call for the quotient.  */
4136                 quotient = sign_expand_binop (compute_mode,
4137                                               udiv_optab, sdiv_optab,
4138                                               op0, op1, target,
4139                                               unsignedp, OPTAB_LIB_WIDEN);
4140             }
4141         }
4142     }
4143
4144   if (rem_flag)
4145     {
4146       if (target && GET_MODE (target) != compute_mode)
4147         target = 0;
4148
4149       if (quotient == 0)
4150         /* No divide instruction either.  Use library for remainder.  */
4151         remainder = sign_expand_binop (compute_mode, umod_optab, smod_optab,
4152                                        op0, op1, target,
4153                                        unsignedp, OPTAB_LIB_WIDEN);
4154       else
4155         {
4156           /* We divided.  Now finish doing X - Y * (X / Y).  */
4157           remainder = expand_mult (compute_mode, quotient, op1,
4158                                    NULL_RTX, unsignedp);
4159           remainder = expand_binop (compute_mode, sub_optab, op0,
4160                                     remainder, target, unsignedp,
4161                                     OPTAB_LIB_WIDEN);
4162         }
4163     }
4164
4165   return gen_lowpart (mode, rem_flag ? remainder : quotient);
4166 }
4167 \f
4168 /* Return a tree node with data type TYPE, describing the value of X.
4169    Usually this is an RTL_EXPR, if there is no obvious better choice.
4170    X may be an expression, however we only support those expressions
4171    generated by loop.c.  */
4172
4173 tree
4174 make_tree (tree type, rtx x)
4175 {
4176   tree t;
4177
4178   switch (GET_CODE (x))
4179     {
4180     case CONST_INT:
4181       t = build_int_2 (INTVAL (x),
4182                        (TYPE_UNSIGNED (type)
4183                         && (GET_MODE_BITSIZE (TYPE_MODE (type))
4184                             < HOST_BITS_PER_WIDE_INT))
4185                        || INTVAL (x) >= 0 ? 0 : -1);
4186       TREE_TYPE (t) = type;
4187       return t;
4188
4189     case CONST_DOUBLE:
4190       if (GET_MODE (x) == VOIDmode)
4191         {
4192           t = build_int_2 (CONST_DOUBLE_LOW (x), CONST_DOUBLE_HIGH (x));
4193           TREE_TYPE (t) = type;
4194         }
4195       else
4196         {
4197           REAL_VALUE_TYPE d;
4198
4199           REAL_VALUE_FROM_CONST_DOUBLE (d, x);
4200           t = build_real (type, d);
4201         }
4202
4203       return t;
4204
4205     case CONST_VECTOR:
4206       {
4207         int i, units;
4208         rtx elt;
4209         tree t = NULL_TREE;
4210
4211         units = CONST_VECTOR_NUNITS (x);
4212
4213         /* Build a tree with vector elements.  */
4214         for (i = units - 1; i >= 0; --i)
4215           {
4216             elt = CONST_VECTOR_ELT (x, i);
4217             t = tree_cons (NULL_TREE, make_tree (type, elt), t);
4218           }
4219
4220         return build_vector (type, t);
4221       }
4222
4223     case PLUS:
4224       return fold (build (PLUS_EXPR, type, make_tree (type, XEXP (x, 0)),
4225                           make_tree (type, XEXP (x, 1))));
4226
4227     case MINUS:
4228       return fold (build (MINUS_EXPR, type, make_tree (type, XEXP (x, 0)),
4229                           make_tree (type, XEXP (x, 1))));
4230
4231     case NEG:
4232       return fold (build1 (NEGATE_EXPR, type, make_tree (type, XEXP (x, 0))));
4233
4234     case MULT:
4235       return fold (build (MULT_EXPR, type, make_tree (type, XEXP (x, 0)),
4236                           make_tree (type, XEXP (x, 1))));
4237
4238     case ASHIFT:
4239       return fold (build (LSHIFT_EXPR, type, make_tree (type, XEXP (x, 0)),
4240                           make_tree (type, XEXP (x, 1))));
4241
4242     case LSHIFTRT:
4243       t = lang_hooks.types.unsigned_type (type);
4244       return fold (convert (type,
4245                             build (RSHIFT_EXPR, t,
4246                                    make_tree (t, XEXP (x, 0)),
4247                                    make_tree (type, XEXP (x, 1)))));
4248
4249     case ASHIFTRT:
4250       t = lang_hooks.types.signed_type (type);
4251       return fold (convert (type,
4252                             build (RSHIFT_EXPR, t,
4253                                    make_tree (t, XEXP (x, 0)),
4254                                    make_tree (type, XEXP (x, 1)))));
4255
4256     case DIV:
4257       if (TREE_CODE (type) != REAL_TYPE)
4258         t = lang_hooks.types.signed_type (type);
4259       else
4260         t = type;
4261
4262       return fold (convert (type,
4263                             build (TRUNC_DIV_EXPR, t,
4264                                    make_tree (t, XEXP (x, 0)),
4265                                    make_tree (t, XEXP (x, 1)))));
4266     case UDIV:
4267       t = lang_hooks.types.unsigned_type (type);
4268       return fold (convert (type,
4269                             build (TRUNC_DIV_EXPR, t,
4270                                    make_tree (t, XEXP (x, 0)),
4271                                    make_tree (t, XEXP (x, 1)))));
4272
4273     case SIGN_EXTEND:
4274     case ZERO_EXTEND:
4275       t = lang_hooks.types.type_for_mode (GET_MODE (XEXP (x, 0)),
4276                                           GET_CODE (x) == ZERO_EXTEND);
4277       return fold (convert (type, make_tree (t, XEXP (x, 0))));
4278
4279    default:
4280       t = make_node (RTL_EXPR);
4281       TREE_TYPE (t) = type;
4282
4283       /* If TYPE is a POINTER_TYPE, X might be Pmode with TYPE_MODE being
4284          ptr_mode.  So convert.  */
4285       if (POINTER_TYPE_P (type))
4286         x = convert_memory_address (TYPE_MODE (type), x);
4287
4288       RTL_EXPR_RTL (t) = x;
4289       /* There are no insns to be output
4290          when this rtl_expr is used.  */
4291       RTL_EXPR_SEQUENCE (t) = 0;
4292       return t;
4293     }
4294 }
4295
4296 /* Check whether the multiplication X * MULT + ADD overflows.
4297    X, MULT and ADD must be CONST_*.
4298    MODE is the machine mode for the computation.
4299    X and MULT must have mode MODE.  ADD may have a different mode.
4300    So can X (defaults to same as MODE).
4301    UNSIGNEDP is nonzero to do unsigned multiplication.  */
4302
4303 bool
4304 const_mult_add_overflow_p (rtx x, rtx mult, rtx add, enum machine_mode mode, int unsignedp)
4305 {
4306   tree type, mult_type, add_type, result;
4307
4308   type = lang_hooks.types.type_for_mode (mode, unsignedp);
4309
4310   /* In order to get a proper overflow indication from an unsigned
4311      type, we have to pretend that it's a sizetype.  */
4312   mult_type = type;
4313   if (unsignedp)
4314     {
4315       mult_type = copy_node (type);
4316       TYPE_IS_SIZETYPE (mult_type) = 1;
4317     }
4318
4319   add_type = (GET_MODE (add) == VOIDmode ? mult_type
4320               : lang_hooks.types.type_for_mode (GET_MODE (add), unsignedp));
4321
4322   result = fold (build (PLUS_EXPR, mult_type,
4323                         fold (build (MULT_EXPR, mult_type,
4324                                      make_tree (mult_type, x),
4325                                      make_tree (mult_type, mult))),
4326                         make_tree (add_type, add)));
4327
4328   return TREE_CONSTANT_OVERFLOW (result);
4329 }
4330
4331 /* Return an rtx representing the value of X * MULT + ADD.
4332    TARGET is a suggestion for where to store the result (an rtx).
4333    MODE is the machine mode for the computation.
4334    X and MULT must have mode MODE.  ADD may have a different mode.
4335    So can X (defaults to same as MODE).
4336    UNSIGNEDP is nonzero to do unsigned multiplication.
4337    This may emit insns.  */
4338
4339 rtx
4340 expand_mult_add (rtx x, rtx target, rtx mult, rtx add, enum machine_mode mode,
4341                  int unsignedp)
4342 {
4343   tree type = lang_hooks.types.type_for_mode (mode, unsignedp);
4344   tree add_type = (GET_MODE (add) == VOIDmode
4345                    ? type: lang_hooks.types.type_for_mode (GET_MODE (add),
4346                                                            unsignedp));
4347   tree result =  fold (build (PLUS_EXPR, type,
4348                               fold (build (MULT_EXPR, type,
4349                                            make_tree (type, x),
4350                                            make_tree (type, mult))),
4351                               make_tree (add_type, add)));
4352
4353   return expand_expr (result, target, VOIDmode, 0);
4354 }
4355 \f
4356 /* Compute the logical-and of OP0 and OP1, storing it in TARGET
4357    and returning TARGET.
4358
4359    If TARGET is 0, a pseudo-register or constant is returned.  */
4360
4361 rtx
4362 expand_and (enum machine_mode mode, rtx op0, rtx op1, rtx target)
4363 {
4364   rtx tem = 0;
4365
4366   if (GET_MODE (op0) == VOIDmode && GET_MODE (op1) == VOIDmode)
4367     tem = simplify_binary_operation (AND, mode, op0, op1);
4368   if (tem == 0)
4369     tem = expand_binop (mode, and_optab, op0, op1, target, 0, OPTAB_LIB_WIDEN);
4370
4371   if (target == 0)
4372     target = tem;
4373   else if (tem != target)
4374     emit_move_insn (target, tem);
4375   return target;
4376 }
4377 \f
4378 /* Emit a store-flags instruction for comparison CODE on OP0 and OP1
4379    and storing in TARGET.  Normally return TARGET.
4380    Return 0 if that cannot be done.
4381
4382    MODE is the mode to use for OP0 and OP1 should they be CONST_INTs.  If
4383    it is VOIDmode, they cannot both be CONST_INT.
4384
4385    UNSIGNEDP is for the case where we have to widen the operands
4386    to perform the operation.  It says to use zero-extension.
4387
4388    NORMALIZEP is 1 if we should convert the result to be either zero
4389    or one.  Normalize is -1 if we should convert the result to be
4390    either zero or -1.  If NORMALIZEP is zero, the result will be left
4391    "raw" out of the scc insn.  */
4392
4393 rtx
4394 emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1,
4395                  enum machine_mode mode, int unsignedp, int normalizep)
4396 {
4397   rtx subtarget;
4398   enum insn_code icode;
4399   enum machine_mode compare_mode;
4400   enum machine_mode target_mode = GET_MODE (target);
4401   rtx tem;
4402   rtx last = get_last_insn ();
4403   rtx pattern, comparison;
4404
4405   /* ??? Ok to do this and then fail? */
4406   op0 = protect_from_queue (op0, 0);
4407   op1 = protect_from_queue (op1, 0);
4408
4409   if (unsignedp)
4410     code = unsigned_condition (code);
4411
4412   /* If one operand is constant, make it the second one.  Only do this
4413      if the other operand is not constant as well.  */
4414
4415   if (swap_commutative_operands_p (op0, op1))
4416     {
4417       tem = op0;
4418       op0 = op1;
4419       op1 = tem;
4420       code = swap_condition (code);
4421     }
4422
4423   if (mode == VOIDmode)
4424     mode = GET_MODE (op0);
4425
4426   /* For some comparisons with 1 and -1, we can convert this to
4427      comparisons with zero.  This will often produce more opportunities for
4428      store-flag insns.  */
4429
4430   switch (code)
4431     {
4432     case LT:
4433       if (op1 == const1_rtx)
4434         op1 = const0_rtx, code = LE;
4435       break;
4436     case LE:
4437       if (op1 == constm1_rtx)
4438         op1 = const0_rtx, code = LT;
4439       break;
4440     case GE:
4441       if (op1 == const1_rtx)
4442         op1 = const0_rtx, code = GT;
4443       break;
4444     case GT:
4445       if (op1 == constm1_rtx)
4446         op1 = const0_rtx, code = GE;
4447       break;
4448     case GEU:
4449       if (op1 == const1_rtx)
4450         op1 = const0_rtx, code = NE;
4451       break;
4452     case LTU:
4453       if (op1 == const1_rtx)
4454         op1 = const0_rtx, code = EQ;
4455       break;
4456     default:
4457       break;
4458     }
4459
4460   /* If we are comparing a double-word integer with zero, we can convert
4461      the comparison into one involving a single word.  */
4462   if (GET_MODE_BITSIZE (mode) == BITS_PER_WORD * 2
4463       && GET_MODE_CLASS (mode) == MODE_INT
4464       && op1 == const0_rtx
4465       && (GET_CODE (op0) != MEM || ! MEM_VOLATILE_P (op0)))
4466     {
4467       if (code == EQ || code == NE)
4468         {
4469           rtx op00, op01, op0both;
4470
4471           /* Do a logical OR of the two words and compare the result.  */
4472           op00 = simplify_gen_subreg (word_mode, op0, mode, 0);
4473           op01 = simplify_gen_subreg (word_mode, op0, mode, UNITS_PER_WORD);
4474           op0both = expand_binop (word_mode, ior_optab, op00, op01,
4475                                   NULL_RTX, unsignedp, OPTAB_DIRECT);
4476           if (op0both != 0)
4477             return emit_store_flag (target, code, op0both, op1, word_mode,
4478                                     unsignedp, normalizep);
4479         }
4480       else if (code == LT || code == GE)
4481         {
4482           rtx op0h;
4483
4484           /* If testing the sign bit, can just test on high word.  */
4485           op0h = simplify_gen_subreg (word_mode, op0, mode,
4486                                       subreg_highpart_offset (word_mode, mode));
4487           return emit_store_flag (target, code, op0h, op1, word_mode,
4488                                   unsignedp, normalizep);
4489         }
4490     }
4491
4492   /* From now on, we won't change CODE, so set ICODE now.  */
4493   icode = setcc_gen_code[(int) code];
4494
4495   /* If this is A < 0 or A >= 0, we can do this by taking the ones
4496      complement of A (for GE) and shifting the sign bit to the low bit.  */
4497   if (op1 == const0_rtx && (code == LT || code == GE)
4498       && GET_MODE_CLASS (mode) == MODE_INT
4499       && (normalizep || STORE_FLAG_VALUE == 1
4500           || (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4501               && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
4502                   == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1)))))
4503     {
4504       subtarget = target;
4505
4506       /* If the result is to be wider than OP0, it is best to convert it
4507          first.  If it is to be narrower, it is *incorrect* to convert it
4508          first.  */
4509       if (GET_MODE_SIZE (target_mode) > GET_MODE_SIZE (mode))
4510         {
4511           op0 = protect_from_queue (op0, 0);
4512           op0 = convert_modes (target_mode, mode, op0, 0);
4513           mode = target_mode;
4514         }
4515
4516       if (target_mode != mode)
4517         subtarget = 0;
4518
4519       if (code == GE)
4520         op0 = expand_unop (mode, one_cmpl_optab, op0,
4521                            ((STORE_FLAG_VALUE == 1 || normalizep)
4522                             ? 0 : subtarget), 0);
4523
4524       if (STORE_FLAG_VALUE == 1 || normalizep)
4525         /* If we are supposed to produce a 0/1 value, we want to do
4526            a logical shift from the sign bit to the low-order bit; for
4527            a -1/0 value, we do an arithmetic shift.  */
4528         op0 = expand_shift (RSHIFT_EXPR, mode, op0,
4529                             size_int (GET_MODE_BITSIZE (mode) - 1),
4530                             subtarget, normalizep != -1);
4531
4532       if (mode != target_mode)
4533         op0 = convert_modes (target_mode, mode, op0, 0);
4534
4535       return op0;
4536     }
4537
4538   if (icode != CODE_FOR_nothing)
4539     {
4540       insn_operand_predicate_fn pred;
4541
4542       /* We think we may be able to do this with a scc insn.  Emit the
4543          comparison and then the scc insn.
4544
4545          compare_from_rtx may call emit_queue, which would be deleted below
4546          if the scc insn fails.  So call it ourselves before setting LAST.
4547          Likewise for do_pending_stack_adjust.  */
4548
4549       emit_queue ();
4550       do_pending_stack_adjust ();
4551       last = get_last_insn ();
4552
4553       comparison
4554         = compare_from_rtx (op0, op1, code, unsignedp, mode, NULL_RTX);
4555       if (GET_CODE (comparison) == CONST_INT)
4556         return (comparison == const0_rtx ? const0_rtx
4557                 : normalizep == 1 ? const1_rtx
4558                 : normalizep == -1 ? constm1_rtx
4559                 : const_true_rtx);
4560
4561       /* The code of COMPARISON may not match CODE if compare_from_rtx
4562          decided to swap its operands and reverse the original code.
4563
4564          We know that compare_from_rtx returns either a CONST_INT or
4565          a new comparison code, so it is safe to just extract the
4566          code from COMPARISON.  */
4567       code = GET_CODE (comparison);
4568
4569       /* Get a reference to the target in the proper mode for this insn.  */
4570       compare_mode = insn_data[(int) icode].operand[0].mode;
4571       subtarget = target;
4572       pred = insn_data[(int) icode].operand[0].predicate;
4573       if (preserve_subexpressions_p ()
4574           || ! (*pred) (subtarget, compare_mode))
4575         subtarget = gen_reg_rtx (compare_mode);
4576
4577       pattern = GEN_FCN (icode) (subtarget);
4578       if (pattern)
4579         {
4580           emit_insn (pattern);
4581
4582           /* If we are converting to a wider mode, first convert to
4583              TARGET_MODE, then normalize.  This produces better combining
4584              opportunities on machines that have a SIGN_EXTRACT when we are
4585              testing a single bit.  This mostly benefits the 68k.
4586
4587              If STORE_FLAG_VALUE does not have the sign bit set when
4588              interpreted in COMPARE_MODE, we can do this conversion as
4589              unsigned, which is usually more efficient.  */
4590           if (GET_MODE_SIZE (target_mode) > GET_MODE_SIZE (compare_mode))
4591             {
4592               convert_move (target, subtarget,
4593                             (GET_MODE_BITSIZE (compare_mode)
4594                              <= HOST_BITS_PER_WIDE_INT)
4595                             && 0 == (STORE_FLAG_VALUE
4596                                      & ((HOST_WIDE_INT) 1
4597                                         << (GET_MODE_BITSIZE (compare_mode) -1))));
4598               op0 = target;
4599               compare_mode = target_mode;
4600             }
4601           else
4602             op0 = subtarget;
4603
4604           /* If we want to keep subexpressions around, don't reuse our
4605              last target.  */
4606
4607           if (preserve_subexpressions_p ())
4608             subtarget = 0;
4609
4610           /* Now normalize to the proper value in COMPARE_MODE.  Sometimes
4611              we don't have to do anything.  */
4612           if (normalizep == 0 || normalizep == STORE_FLAG_VALUE)
4613             ;
4614           /* STORE_FLAG_VALUE might be the most negative number, so write
4615              the comparison this way to avoid a compiler-time warning.  */
4616           else if (- normalizep == STORE_FLAG_VALUE)
4617             op0 = expand_unop (compare_mode, neg_optab, op0, subtarget, 0);
4618
4619           /* We don't want to use STORE_FLAG_VALUE < 0 below since this
4620              makes it hard to use a value of just the sign bit due to
4621              ANSI integer constant typing rules.  */
4622           else if (GET_MODE_BITSIZE (compare_mode) <= HOST_BITS_PER_WIDE_INT
4623                    && (STORE_FLAG_VALUE
4624                        & ((HOST_WIDE_INT) 1
4625                           << (GET_MODE_BITSIZE (compare_mode) - 1))))
4626             op0 = expand_shift (RSHIFT_EXPR, compare_mode, op0,
4627                                 size_int (GET_MODE_BITSIZE (compare_mode) - 1),
4628                                 subtarget, normalizep == 1);
4629           else if (STORE_FLAG_VALUE & 1)
4630             {
4631               op0 = expand_and (compare_mode, op0, const1_rtx, subtarget);
4632               if (normalizep == -1)
4633                 op0 = expand_unop (compare_mode, neg_optab, op0, op0, 0);
4634             }
4635           else
4636             abort ();
4637
4638           /* If we were converting to a smaller mode, do the
4639              conversion now.  */
4640           if (target_mode != compare_mode)
4641             {
4642               convert_move (target, op0, 0);
4643               return target;
4644             }
4645           else
4646             return op0;
4647         }
4648     }
4649
4650   delete_insns_since (last);
4651
4652   /* If expensive optimizations, use different pseudo registers for each
4653      insn, instead of reusing the same pseudo.  This leads to better CSE,
4654      but slows down the compiler, since there are more pseudos */
4655   subtarget = (!flag_expensive_optimizations
4656                && (target_mode == mode)) ? target : NULL_RTX;
4657
4658   /* If we reached here, we can't do this with a scc insn.  However, there
4659      are some comparisons that can be done directly.  For example, if
4660      this is an equality comparison of integers, we can try to exclusive-or
4661      (or subtract) the two operands and use a recursive call to try the
4662      comparison with zero.  Don't do any of these cases if branches are
4663      very cheap.  */
4664
4665   if (BRANCH_COST > 0
4666       && GET_MODE_CLASS (mode) == MODE_INT && (code == EQ || code == NE)
4667       && op1 != const0_rtx)
4668     {
4669       tem = expand_binop (mode, xor_optab, op0, op1, subtarget, 1,
4670                           OPTAB_WIDEN);
4671
4672       if (tem == 0)
4673         tem = expand_binop (mode, sub_optab, op0, op1, subtarget, 1,
4674                             OPTAB_WIDEN);
4675       if (tem != 0)
4676         tem = emit_store_flag (target, code, tem, const0_rtx,
4677                                mode, unsignedp, normalizep);
4678       if (tem == 0)
4679         delete_insns_since (last);
4680       return tem;
4681     }
4682
4683   /* Some other cases we can do are EQ, NE, LE, and GT comparisons with
4684      the constant zero.  Reject all other comparisons at this point.  Only
4685      do LE and GT if branches are expensive since they are expensive on
4686      2-operand machines.  */
4687
4688   if (BRANCH_COST == 0
4689       || GET_MODE_CLASS (mode) != MODE_INT || op1 != const0_rtx
4690       || (code != EQ && code != NE
4691           && (BRANCH_COST <= 1 || (code != LE && code != GT))))
4692     return 0;
4693
4694   /* See what we need to return.  We can only return a 1, -1, or the
4695      sign bit.  */
4696
4697   if (normalizep == 0)
4698     {
4699       if (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
4700         normalizep = STORE_FLAG_VALUE;
4701
4702       else if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4703                && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
4704                    == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1)))
4705         ;
4706       else
4707         return 0;
4708     }
4709
4710   /* Try to put the result of the comparison in the sign bit.  Assume we can't
4711      do the necessary operation below.  */
4712
4713   tem = 0;
4714
4715   /* To see if A <= 0, compute (A | (A - 1)).  A <= 0 iff that result has
4716      the sign bit set.  */
4717
4718   if (code == LE)
4719     {
4720       /* This is destructive, so SUBTARGET can't be OP0.  */
4721       if (rtx_equal_p (subtarget, op0))
4722         subtarget = 0;
4723
4724       tem = expand_binop (mode, sub_optab, op0, const1_rtx, subtarget, 0,
4725                           OPTAB_WIDEN);
4726       if (tem)
4727         tem = expand_binop (mode, ior_optab, op0, tem, subtarget, 0,
4728                             OPTAB_WIDEN);
4729     }
4730
4731   /* To see if A > 0, compute (((signed) A) << BITS) - A, where BITS is the
4732      number of bits in the mode of OP0, minus one.  */
4733
4734   if (code == GT)
4735     {
4736       if (rtx_equal_p (subtarget, op0))
4737         subtarget = 0;
4738
4739       tem = expand_shift (RSHIFT_EXPR, mode, op0,
4740                           size_int (GET_MODE_BITSIZE (mode) - 1),
4741                           subtarget, 0);
4742       tem = expand_binop (mode, sub_optab, tem, op0, subtarget, 0,
4743                           OPTAB_WIDEN);
4744     }
4745
4746   if (code == EQ || code == NE)
4747     {
4748       /* For EQ or NE, one way to do the comparison is to apply an operation
4749          that converts the operand into a positive number if it is nonzero
4750          or zero if it was originally zero.  Then, for EQ, we subtract 1 and
4751          for NE we negate.  This puts the result in the sign bit.  Then we
4752          normalize with a shift, if needed.
4753
4754          Two operations that can do the above actions are ABS and FFS, so try
4755          them.  If that doesn't work, and MODE is smaller than a full word,
4756          we can use zero-extension to the wider mode (an unsigned conversion)
4757          as the operation.  */
4758
4759       /* Note that ABS doesn't yield a positive number for INT_MIN, but
4760          that is compensated by the subsequent overflow when subtracting
4761          one / negating.  */
4762
4763       if (abs_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
4764         tem = expand_unop (mode, abs_optab, op0, subtarget, 1);
4765       else if (ffs_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
4766         tem = expand_unop (mode, ffs_optab, op0, subtarget, 1);
4767       else if (GET_MODE_SIZE (mode) < UNITS_PER_WORD)
4768         {
4769           op0 = protect_from_queue (op0, 0);
4770           tem = convert_modes (word_mode, mode, op0, 1);
4771           mode = word_mode;
4772         }
4773
4774       if (tem != 0)
4775         {
4776           if (code == EQ)
4777             tem = expand_binop (mode, sub_optab, tem, const1_rtx, subtarget,
4778                                 0, OPTAB_WIDEN);
4779           else
4780             tem = expand_unop (mode, neg_optab, tem, subtarget, 0);
4781         }
4782
4783       /* If we couldn't do it that way, for NE we can "or" the two's complement
4784          of the value with itself.  For EQ, we take the one's complement of
4785          that "or", which is an extra insn, so we only handle EQ if branches
4786          are expensive.  */
4787
4788       if (tem == 0 && (code == NE || BRANCH_COST > 1))
4789         {
4790           if (rtx_equal_p (subtarget, op0))
4791             subtarget = 0;
4792
4793           tem = expand_unop (mode, neg_optab, op0, subtarget, 0);
4794           tem = expand_binop (mode, ior_optab, tem, op0, subtarget, 0,
4795                               OPTAB_WIDEN);
4796
4797           if (tem && code == EQ)
4798             tem = expand_unop (mode, one_cmpl_optab, tem, subtarget, 0);
4799         }
4800     }
4801
4802   if (tem && normalizep)
4803     tem = expand_shift (RSHIFT_EXPR, mode, tem,
4804                         size_int (GET_MODE_BITSIZE (mode) - 1),
4805                         subtarget, normalizep == 1);
4806
4807   if (tem)
4808     {
4809       if (GET_MODE (tem) != target_mode)
4810         {
4811           convert_move (target, tem, 0);
4812           tem = target;
4813         }
4814       else if (!subtarget)
4815         {
4816           emit_move_insn (target, tem);
4817           tem = target;
4818         }
4819     }
4820   else
4821     delete_insns_since (last);
4822
4823   return tem;
4824 }
4825
4826 /* Like emit_store_flag, but always succeeds.  */
4827
4828 rtx
4829 emit_store_flag_force (rtx target, enum rtx_code code, rtx op0, rtx op1,
4830                        enum machine_mode mode, int unsignedp, int normalizep)
4831 {
4832   rtx tem, label;
4833
4834   /* First see if emit_store_flag can do the job.  */
4835   tem = emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep);
4836   if (tem != 0)
4837     return tem;
4838
4839   if (normalizep == 0)
4840     normalizep = 1;
4841
4842   /* If this failed, we have to do this with set/compare/jump/set code.  */
4843
4844   if (GET_CODE (target) != REG
4845       || reg_mentioned_p (target, op0) || reg_mentioned_p (target, op1))
4846     target = gen_reg_rtx (GET_MODE (target));
4847
4848   emit_move_insn (target, const1_rtx);
4849   label = gen_label_rtx ();
4850   do_compare_rtx_and_jump (op0, op1, code, unsignedp, mode, NULL_RTX,
4851                            NULL_RTX, label);
4852
4853   emit_move_insn (target, const0_rtx);
4854   emit_label (label);
4855
4856   return target;
4857 }
4858 \f
4859 /* Perform possibly multi-word comparison and conditional jump to LABEL
4860    if ARG1 OP ARG2 true where ARG1 and ARG2 are of mode MODE
4861
4862    The algorithm is based on the code in expr.c:do_jump.
4863
4864    Note that this does not perform a general comparison.  Only variants
4865    generated within expmed.c are correctly handled, others abort (but could
4866    be handled if needed).  */
4867
4868 static void
4869 do_cmp_and_jump (rtx arg1, rtx arg2, enum rtx_code op, enum machine_mode mode,
4870                  rtx label)
4871 {
4872   /* If this mode is an integer too wide to compare properly,
4873      compare word by word.  Rely on cse to optimize constant cases.  */
4874
4875   if (GET_MODE_CLASS (mode) == MODE_INT
4876       && ! can_compare_p (op, mode, ccp_jump))
4877     {
4878       rtx label2 = gen_label_rtx ();
4879
4880       switch (op)
4881         {
4882         case LTU:
4883           do_jump_by_parts_greater_rtx (mode, 1, arg2, arg1, label2, label);
4884           break;
4885
4886         case LEU:
4887           do_jump_by_parts_greater_rtx (mode, 1, arg1, arg2, label, label2);
4888           break;
4889
4890         case LT:
4891           do_jump_by_parts_greater_rtx (mode, 0, arg2, arg1, label2, label);
4892           break;
4893
4894         case GT:
4895           do_jump_by_parts_greater_rtx (mode, 0, arg1, arg2, label2, label);
4896           break;
4897
4898         case GE:
4899           do_jump_by_parts_greater_rtx (mode, 0, arg2, arg1, label, label2);
4900           break;
4901
4902           /* do_jump_by_parts_equality_rtx compares with zero.  Luckily
4903              that's the only equality operations we do */
4904         case EQ:
4905           if (arg2 != const0_rtx || mode != GET_MODE(arg1))
4906             abort ();
4907           do_jump_by_parts_equality_rtx (arg1, label2, label);
4908           break;
4909
4910         case NE:
4911           if (arg2 != const0_rtx || mode != GET_MODE(arg1))
4912             abort ();
4913           do_jump_by_parts_equality_rtx (arg1, label, label2);
4914           break;
4915
4916         default:
4917           abort ();
4918         }
4919
4920       emit_label (label2);
4921     }
4922   else
4923     emit_cmp_and_jump_insns (arg1, arg2, op, NULL_RTX, mode, 0, label);
4924 }