OSDN Git Service

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