]> gcc.gnu.org Git - gcc.git/blame - gcc/expmed.c
*** empty log message ***
[gcc.git] / gcc / expmed.c
CommitLineData
44037a66
TG
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 Free Software Foundation, Inc.
4
5This file is part of GNU CC.
6
7GNU CC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU CC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU CC; see the file COPYING. If not, write to
19the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21
22#include "config.h"
23#include "rtl.h"
24#include "tree.h"
25#include "flags.h"
26#include "insn-flags.h"
27#include "insn-codes.h"
28#include "insn-config.h"
29#include "expr.h"
30#include "real.h"
31#include "recog.h"
32
33static rtx extract_split_bit_field ();
34static rtx extract_fixed_bit_field ();
35static void store_split_bit_field ();
36static void store_fixed_bit_field ();
37static rtx mask_rtx ();
38static rtx lshift_value ();
39
40#define CEIL(x,y) (((x) + (y) - 1) / (y))
41
42/* Non-zero means multiply instructions are cheaper than shifts. */
43int mult_is_very_cheap;
44
45/* Non-zero means divides or modulus operations are relatively cheap for
46 powers of two, so don't use branches; emit the operation instead.
47 Usually, this will mean that the MD file will emit non-branch
48 sequences. */
49
50static int sdiv_pow2_cheap, smod_pow2_cheap;
51
52/* Cost of various pieces of RTL. */
53static int add_cost, shift_cost, mult_cost, negate_cost, lea_cost;
54
55/* Max scale factor for scaled address in lea instruction. */
56static int lea_max_mul;
57
58void
59init_expmed ()
60{
61 char *free_point = (char *) oballoc (1);
62 /* This is "some random pseudo register" for purposes of calling recog
63 to see what insns exist. */
64 rtx reg = gen_rtx (REG, word_mode, FIRST_PSEUDO_REGISTER);
65 rtx pow2 = gen_rtx (CONST_INT, VOIDmode, 32);
66 rtx lea;
67 int i, dummy;
68
aeedc93f 69 add_cost = rtx_cost (gen_rtx (PLUS, word_mode, reg, reg), SET);
44037a66
TG
70 shift_cost = rtx_cost (gen_rtx (LSHIFT, word_mode, reg,
71 /* Using a constant gives better
72 estimate of typical costs.
73 1 or 2 might have quirks. */
aeedc93f
RS
74 gen_rtx (CONST_INT, VOIDmode, 3)), SET);
75 mult_cost = rtx_cost (gen_rtx (MULT, word_mode, reg, reg), SET);
76 negate_cost = rtx_cost (gen_rtx (NEG, word_mode, reg), SET);
44037a66 77
36d747f6 78 /* 999999 is chosen to avoid any plausible faster special case. */
44037a66
TG
79 mult_is_very_cheap
80 = (rtx_cost (gen_rtx (MULT, word_mode, reg,
aeedc93f 81 gen_rtx (CONST_INT, VOIDmode, 999999)), SET)
44037a66 82 < rtx_cost (gen_rtx (LSHIFT, word_mode, reg,
aeedc93f 83 gen_rtx (CONST_INT, VOIDmode, 7)), SET));
44037a66
TG
84
85 sdiv_pow2_cheap
aeedc93f 86 = rtx_cost (gen_rtx (DIV, word_mode, reg, pow2), SET) <= 2 * add_cost;
44037a66 87 smod_pow2_cheap
aeedc93f 88 = rtx_cost (gen_rtx (MOD, word_mode, reg, pow2), SET) <= 2 * add_cost;
44037a66
TG
89
90 init_recog ();
91 for (i = 2;; i <<= 1)
92 {
93 lea = gen_rtx (SET, VOIDmode, reg,
36d747f6 94 gen_rtx (PLUS, word_mode,
44037a66 95 gen_rtx (MULT, word_mode, reg,
36d747f6
RS
96 gen_rtx (CONST_INT, VOIDmode, i)),
97 reg));
44037a66
TG
98 /* Using 0 as second argument is not quite right,
99 but what else is there to do? */
100 if (recog (lea, 0, &dummy) < 0)
101 break;
102 lea_max_mul = i;
aeedc93f 103 lea_cost = rtx_cost (SET_SRC (lea), SET);
44037a66
TG
104 }
105
106 /* Free the objects we just allocated. */
107 obfree (free_point);
108}
109
110/* Return an rtx representing minus the value of X.
111 MODE is the intended mode of the result,
112 useful if X is a CONST_INT. */
113
114rtx
115negate_rtx (mode, x)
116 enum machine_mode mode;
117 rtx x;
118{
119 if (GET_CODE (x) == CONST_INT)
120 {
121 int val = - INTVAL (x);
122 if (GET_MODE_BITSIZE (mode) < HOST_BITS_PER_INT)
123 {
124 /* Sign extend the value from the bits that are significant. */
125 if (val & (1 << (GET_MODE_BITSIZE (mode) - 1)))
126 val |= (-1) << GET_MODE_BITSIZE (mode);
127 else
128 val &= (1 << GET_MODE_BITSIZE (mode)) - 1;
129 }
130 return gen_rtx (CONST_INT, VOIDmode, val);
131 }
132 else
133 return expand_unop (GET_MODE (x), neg_optab, x, 0, 0);
134}
135\f
136/* Generate code to store value from rtx VALUE
137 into a bit-field within structure STR_RTX
138 containing BITSIZE bits starting at bit BITNUM.
139 FIELDMODE is the machine-mode of the FIELD_DECL node for this field.
140 ALIGN is the alignment that STR_RTX is known to have, measured in bytes.
141 TOTAL_SIZE is the size of the structure in bytes, or -1 if varying. */
142
143/* ??? Note that there are two different ideas here for how
144 to determine the size to count bits within, for a register.
145 One is BITS_PER_WORD, and the other is the size of operand 3
146 of the insv pattern. (The latter assumes that an n-bit machine
147 will be able to insert bit fields up to n bits wide.)
148 It isn't certain that either of these is right.
149 extract_bit_field has the same quandary. */
150
151rtx
152store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size)
153 rtx str_rtx;
154 register int bitsize;
155 int bitnum;
156 enum machine_mode fieldmode;
157 rtx value;
158 int align;
159 int total_size;
160{
161 int unit = (GET_CODE (str_rtx) == MEM) ? BITS_PER_UNIT : BITS_PER_WORD;
162 register int offset = bitnum / unit;
163 register int bitpos = bitnum % unit;
164 register rtx op0 = str_rtx;
165
166 if (GET_CODE (str_rtx) == MEM && ! MEM_IN_STRUCT_P (str_rtx))
167 abort ();
168
169 /* Discount the part of the structure before the desired byte.
170 We need to know how many bytes are safe to reference after it. */
171 if (total_size >= 0)
172 total_size -= (bitpos / BIGGEST_ALIGNMENT
173 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
174
175 while (GET_CODE (op0) == SUBREG)
176 {
177 /* The following line once was done only if WORDS_BIG_ENDIAN,
178 but I think that is a mistake. WORDS_BIG_ENDIAN is
179 meaningful at a much higher level; when structures are copied
180 between memory and regs, the higher-numbered regs
181 always get higher addresses. */
182 offset += SUBREG_WORD (op0);
183 /* We used to adjust BITPOS here, but now we do the whole adjustment
184 right after the loop. */
185 op0 = SUBREG_REG (op0);
186 }
187
188#if BYTES_BIG_ENDIAN
189 /* If OP0 is a register, BITPOS must count within a word.
190 But as we have it, it counts within whatever size OP0 now has.
191 On a bigendian machine, these are not the same, so convert. */
192 if (GET_CODE (op0) != MEM && unit > GET_MODE_BITSIZE (GET_MODE (op0)))
193 bitpos += unit - GET_MODE_BITSIZE (GET_MODE (op0));
194#endif
195
196 value = protect_from_queue (value, 0);
197
198 if (flag_force_mem)
199 value = force_not_mem (value);
200
201 /* Note that the adjustment of BITPOS above has no effect on whether
202 BITPOS is 0 in a REG bigger than a word. */
56a2f049
RS
203 if (GET_MODE_SIZE (fieldmode) >= UNITS_PER_WORD
204 && (! STRICT_ALIGNMENT || GET_CODE (op0) != MEM)
44037a66
TG
205 && bitpos == 0 && bitsize == GET_MODE_BITSIZE (fieldmode))
206 {
207 /* Storing in a full-word or multi-word field in a register
208 can be done with just SUBREG. */
209 if (GET_MODE (op0) != fieldmode)
56a2f049
RS
210 if (GET_CODE (op0) == REG)
211 op0 = gen_rtx (SUBREG, fieldmode, op0, offset);
212 else
213 op0 = change_address (op0, fieldmode,
214 plus_constant (XEXP (op0, 0), offset));
44037a66
TG
215 emit_move_insn (op0, value);
216 return value;
217 }
218
219 /* Storing an lsb-aligned field in a register
220 can be done with a movestrict instruction. */
221
222 if (GET_CODE (op0) != MEM
223#if BYTES_BIG_ENDIAN
224 && bitpos + bitsize == unit
225#else
226 && bitpos == 0
227#endif
228 && bitsize == GET_MODE_BITSIZE (fieldmode)
229 && (GET_MODE (op0) == fieldmode
230 || (movstrict_optab->handlers[(int) fieldmode].insn_code
231 != CODE_FOR_nothing)))
232 {
233 /* Get appropriate low part of the value being stored. */
234 if (GET_CODE (value) == CONST_INT || GET_CODE (value) == REG)
235 value = gen_lowpart (fieldmode, value);
236 else if (!(GET_CODE (value) == SYMBOL_REF
237 || GET_CODE (value) == LABEL_REF
238 || GET_CODE (value) == CONST))
239 value = convert_to_mode (fieldmode, value, 0);
240
241 if (GET_MODE (op0) == fieldmode)
242 emit_move_insn (op0, value);
243 else
244 {
245 int icode = movstrict_optab->handlers[(int) fieldmode].insn_code;
246 if(! (*insn_operand_predicate[icode][1]) (value, fieldmode))
247 value = copy_to_mode_reg (fieldmode, value);
248 emit_insn (GEN_FCN (icode)
249 (gen_rtx (SUBREG, fieldmode, op0, offset), value));
250 }
251 return value;
252 }
253
254 /* Handle fields bigger than a word. */
255
256 if (bitsize > BITS_PER_WORD)
257 {
258 /* Here we transfer the words of the field
259 in the order least significant first.
260 This is because the most significant word is the one which may
261 be less than full. */
262
263 int nwords = (bitsize + (BITS_PER_WORD - 1)) / BITS_PER_WORD;
264 int i;
265
266 /* This is the mode we must force value to, so that there will be enough
267 subwords to extract. Note that fieldmode will often (always?) be
268 VOIDmode, because that is what store_field uses to indicate that this
269 is a bit field, but passing VOIDmode to operand_subword_force will
270 result in an abort. */
271 fieldmode = mode_for_size (nwords * BITS_PER_WORD, MODE_INT, 0);
272
273 for (i = 0; i < nwords; i++)
274 {
275 /* If I is 0, use the low-order word in both field and target;
276 if I is 1, use the next to lowest word; and so on. */
277 int wordnum = (WORDS_BIG_ENDIAN ? nwords - i - 1 : i);
278 int bit_offset = (WORDS_BIG_ENDIAN
279 ? MAX (bitsize - (i + 1) * BITS_PER_WORD, 0)
280 : i * BITS_PER_WORD);
281 store_bit_field (op0, MIN (BITS_PER_WORD,
282 bitsize - i * BITS_PER_WORD),
283 bitnum + bit_offset, word_mode,
284 operand_subword_force (value, wordnum, fieldmode),
285 align, total_size);
286 }
287 return value;
288 }
289
290 /* From here on we can assume that the field to be stored in is
291 a full-word (whatever type that is), since it is shorter than a word. */
292
293 /* OFFSET is the number of words or bytes (UNIT says which)
294 from STR_RTX to the first word or byte containing part of the field. */
295
296 if (GET_CODE (op0) == REG)
297 {
298 if (offset != 0
299 || GET_MODE_SIZE (GET_MODE (op0)) > UNITS_PER_WORD)
300 op0 = gen_rtx (SUBREG, TYPE_MODE (type_for_size (BITS_PER_WORD, 0)),
301 op0, offset);
302 offset = 0;
303 }
304 else
305 {
306 op0 = protect_from_queue (op0, 1);
307 }
308
309 /* Now OFFSET is nonzero only if OP0 is memory
310 and is therefore always measured in bytes. */
311
312#ifdef HAVE_insv
313 if (HAVE_insv
314 && !(bitsize == 1 && GET_CODE (value) == CONST_INT)
315 /* Ensure insv's size is wide enough for this field. */
316 && (GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_insv][3])
317 >= bitsize))
318 {
319 int xbitpos = bitpos;
320 rtx value1;
321 rtx xop0 = op0;
322 rtx last = get_last_insn ();
323 rtx pat;
324 enum machine_mode maxmode
325 = insn_operand_mode[(int) CODE_FOR_insv][3];
326
327 int save_volatile_ok = volatile_ok;
328 volatile_ok = 1;
329
330 /* If this machine's insv can only insert into a register, or if we
331 are to force MEMs into a register, copy OP0 into a register and
332 save it back later. */
333 if (GET_CODE (op0) == MEM
334 && (flag_force_mem
335 || ! ((*insn_operand_predicate[(int) CODE_FOR_insv][0])
336 (op0, VOIDmode))))
337 {
338 rtx tempreg;
339 enum machine_mode bestmode;
340
341 /* Get the mode to use for inserting into this field. If OP0 is
342 BLKmode, get the smallest mode consistent with the alignment. If
343 OP0 is a non-BLKmode object that is no wider than MAXMODE, use its
344 mode. Otherwise, use the smallest mode containing the field. */
345
346 if (GET_MODE (op0) == BLKmode
347 || GET_MODE_SIZE (GET_MODE (op0)) > GET_MODE_SIZE (maxmode))
348 bestmode
717702e6
RK
349 = get_best_mode (bitsize, bitnum, align * BITS_PER_UNIT, maxmode,
350 MEM_VOLATILE_P (op0));
44037a66
TG
351 else
352 bestmode = GET_MODE (op0);
353
354 if (bestmode == VOIDmode)
355 goto insv_loses;
356
357 /* Adjust address to point to the containing unit of that mode. */
358 unit = GET_MODE_BITSIZE (bestmode);
359 /* Compute offset as multiple of this unit, counting in bytes. */
360 offset = (bitnum / unit) * GET_MODE_SIZE (bestmode);
361 bitpos = bitnum % unit;
362 op0 = change_address (op0, bestmode,
363 plus_constant (XEXP (op0, 0), offset));
364
365 /* Fetch that unit, store the bitfield in it, then store the unit. */
366 tempreg = copy_to_reg (op0);
367 store_bit_field (tempreg, bitsize, bitpos, fieldmode, value,
368 align, total_size);
369 emit_move_insn (op0, tempreg);
370 return value;
371 }
372 volatile_ok = save_volatile_ok;
373
374 /* Add OFFSET into OP0's address. */
375 if (GET_CODE (xop0) == MEM)
376 xop0 = change_address (xop0, byte_mode,
377 plus_constant (XEXP (xop0, 0), offset));
378
379 /* If xop0 is a register, we need it in MAXMODE
380 to make it acceptable to the format of insv. */
381 if (GET_CODE (xop0) == SUBREG)
382 PUT_MODE (xop0, maxmode);
383 if (GET_CODE (xop0) == REG && GET_MODE (xop0) != maxmode)
384 xop0 = gen_rtx (SUBREG, maxmode, xop0, 0);
385
386 /* On big-endian machines, we count bits from the most significant.
387 If the bit field insn does not, we must invert. */
388
389#if BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN
390 xbitpos = unit - bitsize - xbitpos;
391#endif
392 /* We have been counting XBITPOS within UNIT.
393 Count instead within the size of the register. */
394#if BITS_BIG_ENDIAN
395 if (GET_CODE (xop0) != MEM)
396 xbitpos += GET_MODE_BITSIZE (maxmode) - unit;
397#endif
398 unit = GET_MODE_BITSIZE (maxmode);
399
400 /* Convert VALUE to maxmode (which insv insn wants) in VALUE1. */
401 value1 = value;
402 if (GET_MODE (value) != maxmode)
403 {
404 if (GET_MODE_BITSIZE (GET_MODE (value)) >= bitsize)
405 {
406 /* Optimization: Don't bother really extending VALUE
407 if it has all the bits we will actually use. */
408
409 /* Avoid making subreg of a subreg, or of a mem. */
410 if (GET_CODE (value1) != REG)
411 value1 = copy_to_reg (value1);
412 value1 = gen_rtx (SUBREG, maxmode, value1, 0);
413 }
414 else if (!CONSTANT_P (value))
415 /* Parse phase is supposed to make VALUE's data type
416 match that of the component reference, which is a type
417 at least as wide as the field; so VALUE should have
418 a mode that corresponds to that type. */
419 abort ();
420 }
421
422 /* If this machine's insv insists on a register,
423 get VALUE1 into a register. */
424 if (! ((*insn_operand_predicate[(int) CODE_FOR_insv][3])
425 (value1, maxmode)))
426 value1 = force_reg (maxmode, value1);
427
428 pat = gen_insv (xop0,
429 gen_rtx (CONST_INT, VOIDmode, bitsize),
430 gen_rtx (CONST_INT, VOIDmode, xbitpos),
431 value1);
432 if (pat)
433 emit_insn (pat);
434 else
435 {
436 delete_insns_since (last);
437 store_fixed_bit_field (op0, offset, bitsize, bitpos, value, align);
438 }
439 }
440 else
441 insv_loses:
442#endif
443 /* Insv is not available; store using shifts and boolean ops. */
444 store_fixed_bit_field (op0, offset, bitsize, bitpos, value, align);
445 return value;
446}
447\f
448/* Use shifts and boolean operations to store VALUE
449 into a bit field of width BITSIZE
450 in a memory location specified by OP0 except offset by OFFSET bytes.
451 (OFFSET must be 0 if OP0 is a register.)
452 The field starts at position BITPOS within the byte.
453 (If OP0 is a register, it may be a full word or a narrower mode,
454 but BITPOS still counts within a full word,
455 which is significant on bigendian machines.)
456 STRUCT_ALIGN is the alignment the structure is known to have (in bytes).
457
458 Note that protect_from_queue has already been done on OP0 and VALUE. */
459
460static void
461store_fixed_bit_field (op0, offset, bitsize, bitpos, value, struct_align)
462 register rtx op0;
463 register int offset, bitsize, bitpos;
464 register rtx value;
465 int struct_align;
466{
467 register enum machine_mode mode;
468 int total_bits = BITS_PER_WORD;
469 rtx subtarget, temp;
470 int all_zero = 0;
471 int all_one = 0;
472
473 /* Add OFFSET to OP0's address (if it is in memory)
474 and if a single byte contains the whole bit field
475 change OP0 to a byte. */
476
477 /* There is a case not handled here:
478 a structure with a known alignment of just a halfword
479 and a field split across two aligned halfwords within the structure.
480 Or likewise a structure with a known alignment of just a byte
481 and a field split across two bytes.
482 Such cases are not supposed to be able to occur. */
483
484 if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG)
485 {
486 if (offset != 0)
487 abort ();
488 /* Special treatment for a bit field split across two registers. */
489 if (bitsize + bitpos > BITS_PER_WORD)
490 {
491 store_split_bit_field (op0, bitsize, bitpos, value, BITS_PER_WORD);
492 return;
493 }
494 }
495 else
496 {
497 /* Get the proper mode to use for this field. We want a mode that
498 includes the entire field. If such a mode would be larger than
499 a word, we won't be doing the extraction the normal way. */
500
501 mode = get_best_mode (bitsize, bitpos + offset * BITS_PER_UNIT,
502 struct_align * BITS_PER_UNIT, word_mode,
503 GET_CODE (op0) == MEM && MEM_VOLATILE_P (op0));
504
505 if (mode == VOIDmode)
506 {
507 /* The only way this should occur is if the field spans word
508 boundaries. */
509 store_split_bit_field (op0, bitsize, bitpos + offset * BITS_PER_UNIT,
510 value, struct_align);
511 return;
512 }
513
514 total_bits = GET_MODE_BITSIZE (mode);
515
516 /* Get ref to an aligned byte, halfword, or word containing the field.
517 Adjust BITPOS to be position within a word,
518 and OFFSET to be the offset of that word.
519 Then alter OP0 to refer to that word. */
520 bitpos += (offset % (total_bits / BITS_PER_UNIT)) * BITS_PER_UNIT;
521 offset -= (offset % (total_bits / BITS_PER_UNIT));
522 op0 = change_address (op0, mode,
523 plus_constant (XEXP (op0, 0), offset));
524 }
525
526 mode = GET_MODE (op0);
527
528 /* Now MODE is either some integral mode for a MEM as OP0,
529 or is a full-word for a REG as OP0. TOTAL_BITS corresponds.
530 The bit field is contained entirely within OP0.
531 BITPOS is the starting bit number within OP0.
532 (OP0's mode may actually be narrower than MODE.) */
533
534#if BYTES_BIG_ENDIAN
535 /* BITPOS is the distance between our msb
536 and that of the containing datum.
537 Convert it to the distance from the lsb. */
538
539 bitpos = total_bits - bitsize - bitpos;
540#endif
541 /* Now BITPOS is always the distance between our lsb
542 and that of OP0. */
543
544 /* Shift VALUE left by BITPOS bits. If VALUE is not constant,
545 we must first convert its mode to MODE. */
546
547 if (GET_CODE (value) == CONST_INT)
548 {
549 register int v = INTVAL (value);
550
551 if (bitsize < HOST_BITS_PER_INT)
552 v &= (1 << bitsize) - 1;
553
554 if (v == 0)
555 all_zero = 1;
556 else if ((bitsize < HOST_BITS_PER_INT && v == (1 << bitsize) - 1)
557 || (bitsize == HOST_BITS_PER_INT && v == -1))
558 all_one = 1;
559
560 value = lshift_value (mode, value, bitpos, bitsize);
561 }
562 else
563 {
564 int must_and = (GET_MODE_BITSIZE (GET_MODE (value)) != bitsize
565 && bitpos + bitsize != GET_MODE_BITSIZE (mode));
566
567 if (GET_MODE (value) != mode)
568 {
569 /* If VALUE is a floating-point mode, access it as an integer
570 of the corresponding size, then convert it. This can occur on
571 a machine with 64 bit registers that uses SFmode for float. */
572 if (GET_MODE_CLASS (GET_MODE (value)) == MODE_FLOAT)
573 {
574 if (GET_CODE (value) != REG)
575 value = copy_to_reg (value);
576 value
577 = gen_rtx (SUBREG, word_mode, value, 0);
578 }
579
580 if ((GET_CODE (value) == REG || GET_CODE (value) == SUBREG)
581 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (value)))
582 value = gen_lowpart (mode, value);
583 else
584 value = convert_to_mode (mode, value, 1);
585 }
586
587 if (must_and)
588 value = expand_binop (mode, and_optab, value,
589 mask_rtx (mode, 0, bitsize, 0),
590 0, 1, OPTAB_LIB_WIDEN);
591 if (bitpos > 0)
592 value = expand_shift (LSHIFT_EXPR, mode, value,
593 build_int_2 (bitpos, 0), 0, 1);
594 }
595
596 /* Now clear the chosen bits in OP0,
597 except that if VALUE is -1 we need not bother. */
598
599 subtarget = (GET_CODE (op0) == REG || ! flag_force_mem) ? op0 : 0;
600
601 if (! all_one)
602 {
603 temp = expand_binop (mode, and_optab, op0,
604 mask_rtx (mode, bitpos, bitsize, 1),
605 subtarget, 1, OPTAB_LIB_WIDEN);
606 subtarget = temp;
607 }
608 else
609 temp = op0;
610
611 /* Now logical-or VALUE into OP0, unless it is zero. */
612
613 if (! all_zero)
614 temp = expand_binop (mode, ior_optab, temp, value,
615 subtarget, 1, OPTAB_LIB_WIDEN);
616 if (op0 != temp)
617 emit_move_insn (op0, temp);
618}
619\f
620/* Store a bit field that is split across two words.
621
622 OP0 is the REG, SUBREG or MEM rtx for the first of the two words.
623 BITSIZE is the field width; BITPOS the position of its first bit
624 (within the word).
625 VALUE is the value to store. */
626
627static void
628store_split_bit_field (op0, bitsize, bitpos, value, align)
629 rtx op0;
630 int bitsize, bitpos;
631 rtx value;
632 int align;
633{
634 /* BITSIZE_1 is size of the part in the first word. */
635 int bitsize_1 = BITS_PER_WORD - bitpos % BITS_PER_WORD;
636 /* BITSIZE_2 is size of the rest (in the following word). */
637 int bitsize_2 = bitsize - bitsize_1;
638 rtx part1, part2;
639 int unit = GET_CODE (op0) == MEM ? BITS_PER_UNIT : BITS_PER_WORD;
640 int offset = bitpos / unit;
641 rtx word;
642
643 /* The field must span exactly one word boundary. */
644 if (bitpos / BITS_PER_WORD != (bitpos + bitsize - 1) / BITS_PER_WORD - 1)
645 abort ();
646
647 if (GET_MODE (value) != VOIDmode)
648 value = convert_to_mode (word_mode, value, 1);
649 if (CONSTANT_P (value) && GET_CODE (value) != CONST_INT)
650 value = copy_to_reg (value);
651
652 /* Split the value into two parts:
653 PART1 gets that which goes in the first word; PART2 the other. */
654#if BYTES_BIG_ENDIAN
655 /* PART1 gets the more significant part. */
656 if (GET_CODE (value) == CONST_INT)
657 {
658 part1 = gen_rtx (CONST_INT, VOIDmode,
659 (unsigned) (INTVAL (value)) >> bitsize_2);
660 part2 = gen_rtx (CONST_INT, VOIDmode,
661 (unsigned) (INTVAL (value)) & ((1 << bitsize_2) - 1));
662 }
663 else
664 {
665 part1 = extract_fixed_bit_field (word_mode, value, 0, bitsize_1,
666 BITS_PER_WORD - bitsize, 0, 1,
667 BITS_PER_WORD);
668 part2 = extract_fixed_bit_field (word_mode, value, 0, bitsize_2,
669 BITS_PER_WORD - bitsize_2, 0, 1,
670 BITS_PER_WORD);
671 }
672#else
673 /* PART1 gets the less significant part. */
674 if (GET_CODE (value) == CONST_INT)
675 {
676 part1 = gen_rtx (CONST_INT, VOIDmode,
677 (unsigned) (INTVAL (value)) & ((1 << bitsize_1) - 1));
678 part2 = gen_rtx (CONST_INT, VOIDmode,
679 (unsigned) (INTVAL (value)) >> bitsize_1);
680 }
681 else
682 {
683 part1 = extract_fixed_bit_field (word_mode, value, 0, bitsize_1, 0,
684 0, 1, BITS_PER_WORD);
685 part2 = extract_fixed_bit_field (word_mode, value, 0, bitsize_2,
686 bitsize_1, 0, 1, BITS_PER_WORD);
687 }
688#endif
689
690 /* Store PART1 into the first word. If OP0 is a MEM, pass OP0 and the
691 offset computed above. Otherwise, get the proper word and pass an
692 offset of zero. */
693 word = (GET_CODE (op0) == MEM ? op0
694 : operand_subword (op0, offset, 1, GET_MODE (op0)));
695 if (word == 0)
696 abort ();
697
698 store_fixed_bit_field (word, GET_CODE (op0) == MEM ? offset : 0,
699 bitsize_1, bitpos % unit, part1, align);
700
701 /* Offset op0 by 1 word to get to the following one. */
702 if (GET_CODE (op0) == SUBREG)
703 word = operand_subword (SUBREG_REG (op0), SUBREG_WORD (op0) + offset + 1,
704 1, VOIDmode);
705 else if (GET_CODE (op0) == MEM)
706 word = op0;
707 else
708 word = operand_subword (op0, offset + 1, 1, GET_MODE (op0));
709
710 if (word == 0)
711 abort ();
712
713 /* Store PART2 into the second word. */
714 store_fixed_bit_field (word,
715 (GET_CODE (op0) == MEM
716 ? CEIL (offset + 1, UNITS_PER_WORD) * UNITS_PER_WORD
717 : 0),
718 bitsize_2, 0, part2, align);
719}
720\f
721/* Generate code to extract a byte-field from STR_RTX
722 containing BITSIZE bits, starting at BITNUM,
723 and put it in TARGET if possible (if TARGET is nonzero).
724 Regardless of TARGET, we return the rtx for where the value is placed.
725 It may be a QUEUED.
726
727 STR_RTX is the structure containing the byte (a REG or MEM).
728 UNSIGNEDP is nonzero if this is an unsigned bit field.
729 MODE is the natural mode of the field value once extracted.
730 TMODE is the mode the caller would like the value to have;
731 but the value may be returned with type MODE instead.
732
733 ALIGN is the alignment that STR_RTX is known to have, measured in bytes.
734 TOTAL_SIZE is the size in bytes of the containing structure,
735 or -1 if varying.
736
737 If a TARGET is specified and we can store in it at no extra cost,
738 we do so, and return TARGET.
739 Otherwise, we return a REG of mode TMODE or MODE, with TMODE preferred
740 if they are equally easy. */
741
742rtx
743extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
744 target, mode, tmode, align, total_size)
745 rtx str_rtx;
746 register int bitsize;
747 int bitnum;
748 int unsignedp;
749 rtx target;
750 enum machine_mode mode, tmode;
751 int align;
752 int total_size;
753{
754 int unit = (GET_CODE (str_rtx) == MEM) ? BITS_PER_UNIT : BITS_PER_WORD;
755 register int offset = bitnum / unit;
756 register int bitpos = bitnum % unit;
757 register rtx op0 = str_rtx;
758 rtx spec_target = target;
759 rtx spec_target_subreg = 0;
760
761 if (GET_CODE (str_rtx) == MEM && ! MEM_IN_STRUCT_P (str_rtx))
762 abort ();
763
764 /* Discount the part of the structure before the desired byte.
765 We need to know how many bytes are safe to reference after it. */
766 if (total_size >= 0)
767 total_size -= (bitpos / BIGGEST_ALIGNMENT
768 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
769
770 if (tmode == VOIDmode)
771 tmode = mode;
772
773 while (GET_CODE (op0) == SUBREG)
774 {
775 offset += SUBREG_WORD (op0);
776 op0 = SUBREG_REG (op0);
777 }
778
779#if BYTES_BIG_ENDIAN
780 /* If OP0 is a register, BITPOS must count within a word.
781 But as we have it, it counts within whatever size OP0 now has.
782 On a bigendian machine, these are not the same, so convert. */
783 if (GET_CODE (op0) != MEM && unit > GET_MODE_BITSIZE (GET_MODE (op0)))
784 bitpos += unit - GET_MODE_BITSIZE (GET_MODE (op0));
785#endif
786
787 /* Extracting a full-word or multi-word value
788 from a structure in a register.
789 This can be done with just SUBREG.
790 So too extracting a subword value in
791 the least significant part of the register. */
792
793 if (GET_CODE (op0) == REG
794 && ((bitsize >= BITS_PER_WORD && bitsize == GET_MODE_BITSIZE (mode)
795 && bitpos % BITS_PER_WORD == 0)
796 || (mode_for_size (bitsize, GET_MODE_CLASS (tmode), 0) != BLKmode
797#if BYTES_BIG_ENDIAN
798 && bitpos + bitsize == BITS_PER_WORD
799#else
800 && bitpos == 0
801#endif
802 )))
803 {
804 enum machine_mode mode1
805 = mode_for_size (bitsize, GET_MODE_CLASS (tmode), 0);
806
807 if (mode1 != GET_MODE (op0))
808 op0 = gen_rtx (SUBREG, mode1, op0, offset);
809
810 if (mode1 != mode)
811 return convert_to_mode (tmode, op0, unsignedp);
812 return op0;
813 }
814
815 /* Handle fields bigger than a word. */
816
817 if (bitsize > BITS_PER_WORD)
818 {
819 /* Here we transfer the words of the field
820 in the order least significant first.
821 This is because the most significant word is the one which may
822 be less than full. */
823
824 int nwords = (bitsize + (BITS_PER_WORD - 1)) / BITS_PER_WORD;
825 int i;
826
827 if (target == 0 || GET_CODE (target) != REG)
828 target = gen_reg_rtx (mode);
829
830 for (i = 0; i < nwords; i++)
831 {
832 /* If I is 0, use the low-order word in both field and target;
833 if I is 1, use the next to lowest word; and so on. */
834 int wordnum = (WORDS_BIG_ENDIAN ? nwords - i - 1 : i);
835 int bit_offset = (WORDS_BIG_ENDIAN
836 ? MAX (0, bitsize - (i + 1) * BITS_PER_WORD)
837 : i * BITS_PER_WORD);
838 rtx target_part = operand_subword (target, wordnum, 1, VOIDmode);
839 rtx result_part
840 = extract_bit_field (op0, MIN (BITS_PER_WORD,
841 bitsize - i * BITS_PER_WORD),
842 bitnum + bit_offset,
843 1, target_part, mode, word_mode,
844 align, total_size);
845
846 if (target_part == 0)
847 abort ();
848
849 if (result_part != target_part)
850 emit_move_insn (target_part, result_part);
851 }
852
853 return target;
854 }
855
856 /* From here on we know the desired field is smaller than a word
857 so we can assume it is an integer. So we can safely extract it as one
858 size of integer, if necessary, and then truncate or extend
859 to the size that is wanted. */
860
861 /* OFFSET is the number of words or bytes (UNIT says which)
862 from STR_RTX to the first word or byte containing part of the field. */
863
864 if (GET_CODE (op0) == REG)
865 {
866 if (offset != 0
867 || GET_MODE_SIZE (GET_MODE (op0)) > UNITS_PER_WORD)
868 op0 = gen_rtx (SUBREG, TYPE_MODE (type_for_size (BITS_PER_WORD, 0)),
869 op0, offset);
870 offset = 0;
871 }
872 else
873 {
874 op0 = protect_from_queue (str_rtx, 1);
875 }
876
877 /* Now OFFSET is nonzero only for memory operands. */
878
879 if (unsignedp)
880 {
881#ifdef HAVE_extzv
882 if (HAVE_extzv
883 && (GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_extzv][0])
884 >= bitsize))
885 {
886 int xbitpos = bitpos, xoffset = offset;
887 rtx bitsize_rtx, bitpos_rtx;
888 rtx last = get_last_insn();
889 rtx xop0 = op0;
890 rtx xtarget = target;
891 rtx xspec_target = spec_target;
892 rtx xspec_target_subreg = spec_target_subreg;
893 rtx pat;
894 enum machine_mode maxmode
895 = insn_operand_mode[(int) CODE_FOR_extzv][0];
896
897 if (GET_CODE (xop0) == MEM)
898 {
899 int save_volatile_ok = volatile_ok;
900 volatile_ok = 1;
901
902 /* Is the memory operand acceptable? */
903 if (flag_force_mem
904 || ! ((*insn_operand_predicate[(int) CODE_FOR_extzv][1])
905 (xop0, GET_MODE (xop0))))
906 {
907 /* No, load into a reg and extract from there. */
908 enum machine_mode bestmode;
909
910 /* Get the mode to use for inserting into this field. If
911 OP0 is BLKmode, get the smallest mode consistent with the
912 alignment. If OP0 is a non-BLKmode object that is no
913 wider than MAXMODE, use its mode. Otherwise, use the
914 smallest mode containing the field. */
915
916 if (GET_MODE (xop0) == BLKmode
917 || (GET_MODE_SIZE (GET_MODE (op0))
918 > GET_MODE_SIZE (maxmode)))
919 bestmode = get_best_mode (bitsize, bitnum,
920 align * BITS_PER_UNIT, maxmode,
717702e6 921 MEM_VOLATILE_P (xop0));
44037a66
TG
922 else
923 bestmode = GET_MODE (xop0);
924
925 if (bestmode == VOIDmode)
926 goto extzv_loses;
927
928 /* Compute offset as multiple of this unit,
929 counting in bytes. */
930 unit = GET_MODE_BITSIZE (bestmode);
931 xoffset = (bitnum / unit) * GET_MODE_SIZE (bestmode);
932 xbitpos = bitnum % unit;
933 xop0 = change_address (xop0, bestmode,
934 plus_constant (XEXP (xop0, 0),
935 xoffset));
936 /* Fetch it to a register in that size. */
937 xop0 = force_reg (bestmode, xop0);
938
939 /* XBITPOS counts within UNIT, which is what is expected. */
940 }
941 else
942 /* Get ref to first byte containing part of the field. */
943 xop0 = change_address (xop0, byte_mode,
944 plus_constant (XEXP (xop0, 0), xoffset));
945
946 volatile_ok = save_volatile_ok;
947 }
948
949 /* If op0 is a register, we need it in MAXMODE (which is usually
950 SImode). to make it acceptable to the format of extzv. */
951 if (GET_CODE (xop0) == SUBREG && GET_MODE (xop0) != maxmode)
952 abort ();
953 if (GET_CODE (xop0) == REG && GET_MODE (xop0) != maxmode)
954 xop0 = gen_rtx (SUBREG, maxmode, xop0, 0);
955
956 /* On big-endian machines, we count bits from the most significant.
957 If the bit field insn does not, we must invert. */
958#if BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN
959 xbitpos = unit - bitsize - xbitpos;
960#endif
961 /* Now convert from counting within UNIT to counting in MAXMODE. */
962#if BITS_BIG_ENDIAN
963 if (GET_CODE (xop0) != MEM)
964 xbitpos += GET_MODE_BITSIZE (maxmode) - unit;
965#endif
966 unit = GET_MODE_BITSIZE (maxmode);
967
968 if (xtarget == 0
969 || (flag_force_mem && GET_CODE (xtarget) == MEM))
970 xtarget = xspec_target = gen_reg_rtx (tmode);
971
972 if (GET_MODE (xtarget) != maxmode)
973 {
974 if (GET_CODE (xtarget) == REG)
b7a09135
RS
975 {
976 int wider = (GET_MODE_SIZE (maxmode)
977 > GET_MODE_SIZE (GET_MODE (xtarget)));
978 xtarget = gen_lowpart (maxmode, xtarget);
979 if (wider)
980 xspec_target_subreg = xtarget;
981 }
44037a66
TG
982 else
983 xtarget = gen_reg_rtx (maxmode);
984 }
985
986 /* If this machine's extzv insists on a register target,
987 make sure we have one. */
988 if (! ((*insn_operand_predicate[(int) CODE_FOR_extzv][0])
989 (xtarget, maxmode)))
990 xtarget = gen_reg_rtx (maxmode);
991
992 bitsize_rtx = gen_rtx (CONST_INT, VOIDmode, bitsize);
993 bitpos_rtx = gen_rtx (CONST_INT, VOIDmode, xbitpos);
994
995 pat = gen_extzv (protect_from_queue (xtarget, 1),
996 xop0, bitsize_rtx, bitpos_rtx);
997 if (pat)
998 {
999 emit_insn (pat);
1000 target = xtarget;
1001 spec_target = xspec_target;
1002 spec_target_subreg = xspec_target_subreg;
1003 }
1004 else
1005 {
1006 delete_insns_since (last);
1007 target = extract_fixed_bit_field (tmode, op0, offset, bitsize,
1008 bitpos, target, 1, align);
1009 }
1010 }
1011 else
1012 extzv_loses:
1013#endif
1014 target = extract_fixed_bit_field (tmode, op0, offset, bitsize, bitpos,
1015 target, 1, align);
1016 }
1017 else
1018 {
1019#ifdef HAVE_extv
1020 if (HAVE_extv
1021 && (GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_extv][0])
1022 >= bitsize))
1023 {
1024 int xbitpos = bitpos, xoffset = offset;
1025 rtx bitsize_rtx, bitpos_rtx;
1026 rtx last = get_last_insn();
1027 rtx xop0 = op0, xtarget = target;
1028 rtx xspec_target = spec_target;
1029 rtx xspec_target_subreg = spec_target_subreg;
1030 rtx pat;
1031 enum machine_mode maxmode
1032 = insn_operand_mode[(int) CODE_FOR_extv][0];
1033
1034 if (GET_CODE (xop0) == MEM)
1035 {
1036 /* Is the memory operand acceptable? */
1037 if (! ((*insn_operand_predicate[(int) CODE_FOR_extv][1])
1038 (xop0, GET_MODE (xop0))))
1039 {
1040 /* No, load into a reg and extract from there. */
1041 enum machine_mode bestmode;
1042
1043 /* Get the mode to use for inserting into this field. If
1044 OP0 is BLKmode, get the smallest mode consistent with the
1045 alignment. If OP0 is a non-BLKmode object that is no
1046 wider than MAXMODE, use its mode. Otherwise, use the
1047 smallest mode containing the field. */
1048
1049 if (GET_MODE (xop0) == BLKmode
1050 || (GET_MODE_SIZE (GET_MODE (op0))
1051 > GET_MODE_SIZE (maxmode)))
1052 bestmode = get_best_mode (bitsize, bitnum,
1053 align * BITS_PER_UNIT, maxmode,
717702e6 1054 MEM_VOLATILE_P (xop0));
44037a66
TG
1055 else
1056 bestmode = GET_MODE (xop0);
1057
1058 if (bestmode == VOIDmode)
1059 goto extv_loses;
1060
1061 /* Compute offset as multiple of this unit,
1062 counting in bytes. */
1063 unit = GET_MODE_BITSIZE (bestmode);
1064 xoffset = (bitnum / unit) * GET_MODE_SIZE (bestmode);
1065 xbitpos = bitnum % unit;
1066 xop0 = change_address (xop0, bestmode,
1067 plus_constant (XEXP (xop0, 0),
1068 xoffset));
1069 /* Fetch it to a register in that size. */
1070 xop0 = force_reg (bestmode, xop0);
1071
1072 /* XBITPOS counts within UNIT, which is what is expected. */
1073 }
1074 else
1075 /* Get ref to first byte containing part of the field. */
1076 xop0 = change_address (xop0, byte_mode,
1077 plus_constant (XEXP (xop0, 0), xoffset));
1078 }
1079
1080 /* If op0 is a register, we need it in MAXMODE (which is usually
1081 SImode) to make it acceptable to the format of extv. */
1082 if (GET_CODE (xop0) == SUBREG && GET_MODE (xop0) != maxmode)
1083 abort ();
1084 if (GET_CODE (xop0) == REG && GET_MODE (xop0) != maxmode)
1085 xop0 = gen_rtx (SUBREG, maxmode, xop0, 0);
1086
1087 /* On big-endian machines, we count bits from the most significant.
1088 If the bit field insn does not, we must invert. */
1089#if BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN
1090 xbitpos = unit - bitsize - xbitpos;
1091#endif
1092 /* XBITPOS counts within a size of UNIT.
1093 Adjust to count within a size of MAXMODE. */
1094#if BITS_BIG_ENDIAN
1095 if (GET_CODE (xop0) != MEM)
1096 xbitpos += (GET_MODE_BITSIZE (maxmode) - unit);
1097#endif
1098 unit = GET_MODE_BITSIZE (maxmode);
1099
1100 if (xtarget == 0
1101 || (flag_force_mem && GET_CODE (xtarget) == MEM))
1102 xtarget = xspec_target = gen_reg_rtx (tmode);
1103
1104 if (GET_MODE (xtarget) != maxmode)
1105 {
1106 if (GET_CODE (xtarget) == REG)
b7a09135
RS
1107 {
1108 int wider = (GET_MODE_SIZE (maxmode)
1109 > GET_MODE_SIZE (GET_MODE (xtarget)));
1110 xtarget = gen_lowpart (maxmode, xtarget);
1111 if (wider)
1112 xspec_target_subreg = xtarget;
1113 }
44037a66
TG
1114 else
1115 xtarget = gen_reg_rtx (maxmode);
1116 }
1117
1118 /* If this machine's extv insists on a register target,
1119 make sure we have one. */
1120 if (! ((*insn_operand_predicate[(int) CODE_FOR_extv][0])
1121 (xtarget, maxmode)))
1122 xtarget = gen_reg_rtx (maxmode);
1123
1124 bitsize_rtx = gen_rtx (CONST_INT, VOIDmode, bitsize);
1125 bitpos_rtx = gen_rtx (CONST_INT, VOIDmode, xbitpos);
1126
1127 pat = gen_extv (protect_from_queue (xtarget, 1),
1128 xop0, bitsize_rtx, bitpos_rtx);
1129 if (pat)
1130 {
1131 emit_insn (pat);
1132 target = xtarget;
1133 spec_target = xspec_target;
1134 spec_target_subreg = xspec_target_subreg;
1135 }
1136 else
1137 {
1138 delete_insns_since (last);
1139 target = extract_fixed_bit_field (tmode, op0, offset, bitsize,
1140 bitpos, target, 0, align);
1141 }
1142 }
1143 else
1144 extv_loses:
1145#endif
1146 target = extract_fixed_bit_field (tmode, op0, offset, bitsize, bitpos,
1147 target, 0, align);
1148 }
1149 if (target == spec_target)
1150 return target;
1151 if (target == spec_target_subreg)
1152 return spec_target;
1153 if (GET_MODE (target) != tmode && GET_MODE (target) != mode)
1154 {
1155 /* If the target mode is floating-point, first convert to the
1156 integer mode of that size and then access it as a floating-point
1157 value via a SUBREG. */
1158 if (GET_MODE_CLASS (tmode) == MODE_FLOAT)
1159 {
1160 target = convert_to_mode (mode_for_size (GET_MODE_BITSIZE (tmode),
1161 MODE_INT, 0),
1162 target, unsignedp);
1163 if (GET_CODE (target) != REG)
1164 target = copy_to_reg (target);
1165 return gen_rtx (SUBREG, tmode, target, 0);
1166 }
1167 else
1168 return convert_to_mode (tmode, target, unsignedp);
1169 }
1170 return target;
1171}
1172\f
1173/* Extract a bit field using shifts and boolean operations
1174 Returns an rtx to represent the value.
1175 OP0 addresses a register (word) or memory (byte).
1176 BITPOS says which bit within the word or byte the bit field starts in.
1177 OFFSET says how many bytes farther the bit field starts;
1178 it is 0 if OP0 is a register.
1179 BITSIZE says how many bits long the bit field is.
1180 (If OP0 is a register, it may be narrower than a full word,
1181 but BITPOS still counts within a full word,
1182 which is significant on bigendian machines.)
1183
1184 UNSIGNEDP is nonzero for an unsigned bit field (don't sign-extend value).
1185 If TARGET is nonzero, attempts to store the value there
1186 and return TARGET, but this is not guaranteed.
1187 If TARGET is not used, create a pseudo-reg of mode TMODE for the value.
1188
1189 ALIGN is the alignment that STR_RTX is known to have, measured in bytes. */
1190
1191static rtx
1192extract_fixed_bit_field (tmode, op0, offset, bitsize, bitpos,
1193 target, unsignedp, align)
1194 enum machine_mode tmode;
1195 register rtx op0, target;
1196 register int offset, bitsize, bitpos;
1197 int unsignedp;
1198 int align;
1199{
1200 int total_bits = BITS_PER_WORD;
1201 enum machine_mode mode;
1202
1203 if (GET_CODE (op0) == SUBREG || GET_CODE (op0) == REG)
1204 {
1205 /* Special treatment for a bit field split across two registers. */
1206 if (bitsize + bitpos > BITS_PER_WORD)
1207 return extract_split_bit_field (op0, bitsize, bitpos,
1208 unsignedp, align);
1209 }
1210 else
1211 {
1212 /* Get the proper mode to use for this field. We want a mode that
1213 includes the entire field. If such a mode would be larger than
1214 a word, we won't be doing the extraction the normal way. */
1215
1216 mode = get_best_mode (bitsize, bitpos + offset * BITS_PER_UNIT,
1217 align * BITS_PER_UNIT, word_mode,
1218 GET_CODE (op0) == MEM && MEM_VOLATILE_P (op0));
1219
1220 if (mode == VOIDmode)
1221 /* The only way this should occur is if the field spans word
1222 boundaries. */
1223 return extract_split_bit_field (op0, bitsize,
1224 bitpos + offset * BITS_PER_UNIT,
1225 unsignedp, align);
1226
1227 total_bits = GET_MODE_BITSIZE (mode);
1228
1229 /* Get ref to an aligned byte, halfword, or word containing the field.
1230 Adjust BITPOS to be position within a word,
1231 and OFFSET to be the offset of that word.
1232 Then alter OP0 to refer to that word. */
1233 bitpos += (offset % (total_bits / BITS_PER_UNIT)) * BITS_PER_UNIT;
1234 offset -= (offset % (total_bits / BITS_PER_UNIT));
1235 op0 = change_address (op0, mode,
1236 plus_constant (XEXP (op0, 0), offset));
1237 }
1238
1239 mode = GET_MODE (op0);
1240
1241#if BYTES_BIG_ENDIAN
1242 /* BITPOS is the distance between our msb and that of OP0.
1243 Convert it to the distance from the lsb. */
1244
1245 bitpos = total_bits - bitsize - bitpos;
1246#endif
1247 /* Now BITPOS is always the distance between the field's lsb and that of OP0.
1248 We have reduced the big-endian case to the little-endian case. */
1249
1250 if (unsignedp)
1251 {
1252 if (bitpos)
1253 {
1254 /* If the field does not already start at the lsb,
1255 shift it so it does. */
1256 tree amount = build_int_2 (bitpos, 0);
1257 /* Maybe propagate the target for the shift. */
1258 /* But not if we will return it--could confuse integrate.c. */
1259 rtx subtarget = (target != 0 && GET_CODE (target) == REG
1260 && !REG_FUNCTION_VALUE_P (target)
1261 ? target : 0);
1262 if (tmode != mode) subtarget = 0;
1263 op0 = expand_shift (RSHIFT_EXPR, mode, op0, amount, subtarget, 1);
1264 }
1265 /* Convert the value to the desired mode. */
1266 if (mode != tmode)
1267 op0 = convert_to_mode (tmode, op0, 1);
1268
1269 /* Unless the msb of the field used to be the msb when we shifted,
1270 mask out the upper bits. */
1271
1272 if (GET_MODE_BITSIZE (mode) != bitpos + bitsize
1273#if 0
1274#ifdef SLOW_ZERO_EXTEND
1275 /* Always generate an `and' if
1276 we just zero-extended op0 and SLOW_ZERO_EXTEND, since it
1277 will combine fruitfully with the zero-extend. */
1278 || tmode != mode
1279#endif
1280#endif
1281 )
1282 return expand_binop (GET_MODE (op0), and_optab, op0,
1283 mask_rtx (GET_MODE (op0), 0, bitsize, 0),
1284 target, 1, OPTAB_LIB_WIDEN);
1285 return op0;
1286 }
1287
1288 /* To extract a signed bit-field, first shift its msb to the msb of the word,
1289 then arithmetic-shift its lsb to the lsb of the word. */
1290 op0 = force_reg (mode, op0);
1291 if (mode != tmode)
1292 target = 0;
1293
1294 /* Find the narrowest integer mode that contains the field. */
1295
1296 for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
1297 mode = GET_MODE_WIDER_MODE (mode))
1298 if (GET_MODE_BITSIZE (mode) >= bitsize + bitpos)
1299 {
1300 op0 = convert_to_mode (mode, op0, 0);
1301 break;
1302 }
1303
1304 if (GET_MODE_BITSIZE (mode) != (bitsize + bitpos))
1305 {
1306 tree amount = build_int_2 (GET_MODE_BITSIZE (mode) - (bitsize + bitpos), 0);
1307 /* Maybe propagate the target for the shift. */
1308 /* But not if we will return the result--could confuse integrate.c. */
1309 rtx subtarget = (target != 0 && GET_CODE (target) == REG
1310 && ! REG_FUNCTION_VALUE_P (target)
1311 ? target : 0);
1312 op0 = expand_shift (LSHIFT_EXPR, mode, op0, amount, subtarget, 1);
1313 }
1314
1315 return expand_shift (RSHIFT_EXPR, mode, op0,
1316 build_int_2 (GET_MODE_BITSIZE (mode) - bitsize, 0),
1317 target, 0);
1318}
1319\f
1320/* Return a constant integer (CONST_INT or CONST_DOUBLE) mask value
1321 of mode MODE with BITSIZE ones followed by BITPOS zeros, or the
1322 complement of that if COMPLEMENT. The mask is truncated if
1323 necessary to the width of mode MODE. */
1324
1325static rtx
1326mask_rtx (mode, bitpos, bitsize, complement)
1327 enum machine_mode mode;
1328 int bitpos, bitsize, complement;
1329{
1330 int masklow, maskhigh;
1331
1332 if (bitpos < HOST_BITS_PER_INT)
1333 masklow = -1 << bitpos;
1334 else
1335 masklow = 0;
1336
1337 if (bitpos + bitsize < HOST_BITS_PER_INT)
1338 masklow &= (unsigned) -1 >> (HOST_BITS_PER_INT - bitpos - bitsize);
1339
1340 if (bitpos <= HOST_BITS_PER_INT)
1341 maskhigh = -1;
1342 else
1343 maskhigh = -1 << (bitpos - HOST_BITS_PER_INT);
1344
1345 if (bitpos + bitsize > HOST_BITS_PER_INT)
1346 maskhigh &= (unsigned) -1 >> (2 * HOST_BITS_PER_INT - bitpos - bitsize);
1347 else
1348 maskhigh = 0;
1349
1350 if (complement)
1351 {
1352 maskhigh = ~maskhigh;
1353 masklow = ~masklow;
1354 }
1355
1356 return immed_double_const (masklow, maskhigh, mode);
1357}
1358
1359/* Return a constant integer (CONST_INT or CONST_DOUBLE) rtx with the value
1360 VALUE truncated to BITSIZE bits and then shifted left BITPOS bits. */
1361
1362static rtx
1363lshift_value (mode, value, bitpos, bitsize)
1364 enum machine_mode mode;
1365 rtx value;
1366 int bitpos, bitsize;
1367{
1368 unsigned v = INTVAL (value);
1369 int low, high;
1370
1371 if (bitsize < HOST_BITS_PER_INT)
1372 v &= ~(-1 << bitsize);
1373
1374 if (bitpos < HOST_BITS_PER_INT)
1375 {
1376 low = v << bitpos;
1377 high = (bitpos > 0 ? (v >> (HOST_BITS_PER_INT - bitpos)) : 0);
1378 }
1379 else
1380 {
1381 low = 0;
1382 high = v << (bitpos - HOST_BITS_PER_INT);
1383 }
1384
1385 return immed_double_const (low, high, mode);
1386}
1387\f
1388/* Extract a bit field that is split across two words
1389 and return an RTX for the result.
1390
1391 OP0 is the REG, SUBREG or MEM rtx for the first of the two words.
1392 BITSIZE is the field width; BITPOS, position of its first bit, in the word.
1393 UNSIGNEDP is 1 if should zero-extend the contents; else sign-extend. */
1394
1395static rtx
1396extract_split_bit_field (op0, bitsize, bitpos, unsignedp, align)
1397 rtx op0;
1398 int bitsize, bitpos, unsignedp, align;
1399{
1400 /* BITSIZE_1 is size of the part in the first word. */
1401 int bitsize_1 = BITS_PER_WORD - bitpos % BITS_PER_WORD;
1402 /* BITSIZE_2 is size of the rest (in the following word). */
1403 int bitsize_2 = bitsize - bitsize_1;
1404 rtx part1, part2, result;
1405 int unit = GET_CODE (op0) == MEM ? BITS_PER_UNIT : BITS_PER_WORD;
1406 int offset = bitpos / unit;
1407 rtx word;
1408
1409 /* The field must span exactly one word boundary. */
1410 if (bitpos / BITS_PER_WORD != (bitpos + bitsize - 1) / BITS_PER_WORD - 1)
1411 abort ();
1412
1413 /* Get the part of the bit field from the first word. If OP0 is a MEM,
1414 pass OP0 and the offset computed above. Otherwise, get the proper
1415 word and pass an offset of zero. */
1416 word = (GET_CODE (op0) == MEM ? op0
1417 : operand_subword_force (op0, offset, GET_MODE (op0)));
1418 part1 = extract_fixed_bit_field (word_mode, word,
1419 GET_CODE (op0) == MEM ? offset : 0,
1420 bitsize_1, bitpos % unit, 0, 1, align);
1421
1422 /* Offset op0 by 1 word to get to the following one. */
1423 if (GET_CODE (op0) == SUBREG)
1424 word = operand_subword_force (SUBREG_REG (op0),
1425 SUBREG_WORD (op0) + offset + 1, VOIDmode);
1426 else if (GET_CODE (op0) == MEM)
1427 word = op0;
1428 else
1429 word = operand_subword_force (op0, offset + 1, GET_MODE (op0));
1430
1431 /* Get the part of the bit field from the second word. */
1432 part2 = extract_fixed_bit_field (word_mode, word,
1433 (GET_CODE (op0) == MEM
1434 ? CEIL (offset + 1, UNITS_PER_WORD) * UNITS_PER_WORD
1435 : 0),
1436 bitsize_2, 0, 0, 1, align);
1437
1438 /* Shift the more significant part up to fit above the other part. */
1439#if BYTES_BIG_ENDIAN
1440 part1 = expand_shift (LSHIFT_EXPR, word_mode, part1,
1441 build_int_2 (bitsize_2, 0), 0, 1);
1442#else
1443 part2 = expand_shift (LSHIFT_EXPR, word_mode, part2,
1444 build_int_2 (bitsize_1, 0), 0, 1);
1445#endif
1446
1447 /* Combine the two parts with bitwise or. This works
1448 because we extracted both parts as unsigned bit fields. */
1449 result = expand_binop (word_mode, ior_optab, part1, part2, 0, 1,
1450 OPTAB_LIB_WIDEN);
1451
1452 /* Unsigned bit field: we are done. */
1453 if (unsignedp)
1454 return result;
1455 /* Signed bit field: sign-extend with two arithmetic shifts. */
1456 result = expand_shift (LSHIFT_EXPR, word_mode, result,
1457 build_int_2 (BITS_PER_WORD - bitsize, 0), 0, 0);
1458 return expand_shift (RSHIFT_EXPR, word_mode, result,
1459 build_int_2 (BITS_PER_WORD - bitsize, 0), 0, 0);
1460}
1461\f
1462/* Add INC into TARGET. */
1463
1464void
1465expand_inc (target, inc)
1466 rtx target, inc;
1467{
1468 rtx value = expand_binop (GET_MODE (target), add_optab,
1469 target, inc,
1470 target, 0, OPTAB_LIB_WIDEN);
1471 if (value != target)
1472 emit_move_insn (target, value);
1473}
1474
1475/* Subtract DEC from TARGET. */
1476
1477void
1478expand_dec (target, dec)
1479 rtx target, dec;
1480{
1481 rtx value = expand_binop (GET_MODE (target), sub_optab,
1482 target, dec,
1483 target, 0, OPTAB_LIB_WIDEN);
1484 if (value != target)
1485 emit_move_insn (target, value);
1486}
1487\f
1488/* Output a shift instruction for expression code CODE,
1489 with SHIFTED being the rtx for the value to shift,
1490 and AMOUNT the tree for the amount to shift by.
1491 Store the result in the rtx TARGET, if that is convenient.
1492 If UNSIGNEDP is nonzero, do a logical shift; otherwise, arithmetic.
1493 Return the rtx for where the value is. */
1494
1495rtx
1496expand_shift (code, mode, shifted, amount, target, unsignedp)
1497 enum tree_code code;
1498 register enum machine_mode mode;
1499 rtx shifted;
1500 tree amount;
1501 register rtx target;
1502 int unsignedp;
1503{
1504 register rtx op1, temp = 0;
1505 register int left = (code == LSHIFT_EXPR || code == LROTATE_EXPR);
1506 register int rotate = (code == LROTATE_EXPR || code == RROTATE_EXPR);
1507 int try;
1508
1509 /* Previously detected shift-counts computed by NEGATE_EXPR
1510 and shifted in the other direction; but that does not work
1511 on all machines. */
1512
1513 op1 = expand_expr (amount, 0, VOIDmode, 0);
1514
1515 if (op1 == const0_rtx)
1516 return shifted;
1517
1518 for (try = 0; temp == 0 && try < 3; try++)
1519 {
1520 enum optab_methods methods;
1521
1522 if (try == 0)
1523 methods = OPTAB_DIRECT;
1524 else if (try == 1)
1525 methods = OPTAB_WIDEN;
1526 else
1527 methods = OPTAB_LIB_WIDEN;
1528
1529 if (rotate)
1530 {
1531 /* Widening does not work for rotation. */
1532 if (methods == OPTAB_WIDEN)
1533 continue;
1534 else if (methods == OPTAB_LIB_WIDEN)
1535 methods = OPTAB_LIB;
1536
1537 temp = expand_binop (mode,
1538 left ? rotl_optab : rotr_optab,
1539 shifted, op1, target, unsignedp, methods);
1540 }
1541 else if (unsignedp)
1542 {
1543 temp = expand_binop (mode,
1544 left ? lshl_optab : lshr_optab,
1545 shifted, op1, target, unsignedp, methods);
1546 if (temp == 0 && left)
1547 temp = expand_binop (mode, ashl_optab,
1548 shifted, op1, target, unsignedp, methods);
1549 }
1550
1551 /* Do arithmetic shifts.
1552 Also, if we are going to widen the operand, we can just as well
1553 use an arithmetic right-shift instead of a logical one. */
1554 if (temp == 0 && ! rotate
1555 && (! unsignedp || (! left && methods == OPTAB_WIDEN)))
1556 {
1557 enum optab_methods methods1 = methods;
1558
1559 /* If trying to widen a log shift to an arithmetic shift,
1560 don't accept an arithmetic shift of the same size. */
1561 if (unsignedp)
1562 methods1 = OPTAB_MUST_WIDEN;
1563
1564 /* Arithmetic shift */
1565
1566 temp = expand_binop (mode,
1567 left ? ashl_optab : ashr_optab,
1568 shifted, op1, target, unsignedp, methods1);
1569 }
1570
1571#ifdef HAVE_extzv
1572 /* We can do a logical (unsigned) right shift with a bit-field
1573 extract insn. But first check if one of the above methods worked. */
1574 if (temp != 0)
1575 return temp;
1576
1577 if (unsignedp && code == RSHIFT_EXPR && ! BITS_BIG_ENDIAN && HAVE_extzv)
1578 {
1579 enum machine_mode output_mode
1580 = insn_operand_mode[(int) CODE_FOR_extzv][0];
1581
1582 if ((methods == OPTAB_DIRECT && mode == output_mode)
1583 || (methods == OPTAB_WIDEN
1584 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (output_mode)))
1585 {
1586 /* Note convert_to_mode does protect_from_queue. */
1587 rtx shifted1 = convert_to_mode (output_mode, shifted, 1);
1588 enum machine_mode length_mode
1589 = insn_operand_mode[(int) CODE_FOR_extzv][2];
1590 enum machine_mode pos_mode
1591 = insn_operand_mode[(int) CODE_FOR_extzv][3];
1592 rtx target1 = 0;
1593 rtx last = get_last_insn ();
1594 rtx width;
1595 rtx xop1 = op1;
1596 rtx pat;
1597
1598 if (target != 0)
1599 target1 = protect_from_queue (target, 1);
1600
1601 /* We define extract insns as having OUTPUT_MODE in a register
1602 and the mode of operand 1 in memory. Since we want
1603 OUTPUT_MODE, we will always force the operand into a
1604 register. At some point we might want to support MEM
1605 directly. */
1606 shifted1 = force_reg (output_mode, shifted1);
1607
1608 /* If we don't have or cannot use a suggested target,
1609 make a place for the result, in the proper mode. */
1610 if (methods == OPTAB_WIDEN || target1 == 0
1611 || ! ((*insn_operand_predicate[(int) CODE_FOR_extzv][0])
1612 (target1, output_mode)))
1613 target1 = gen_reg_rtx (output_mode);
1614
1615 xop1 = convert_to_mode (pos_mode, xop1,
1616 TREE_UNSIGNED (TREE_TYPE (amount)));
1617
1618 /* If this machine's extzv insists on a register for
1619 operand 3 (position), arrange for that. */
1620 if (! ((*insn_operand_predicate[(int) CODE_FOR_extzv][3])
1621 (xop1, pos_mode)))
1622 xop1 = force_reg (pos_mode, xop1);
1623
1624 /* WIDTH gets the width of the bit field to extract:
1625 wordsize minus # bits to shift by. */
1626 if (GET_CODE (xop1) == CONST_INT)
1627 width = gen_rtx (CONST_INT, VOIDmode,
1628 (GET_MODE_BITSIZE (mode) - INTVAL (op1)));
1629 else
1630 {
1631 /* Now get the width in the proper mode. */
1632 width = convert_to_mode (length_mode, op1,
1633 TREE_UNSIGNED (TREE_TYPE (amount)));
1634
1635 width = expand_binop (length_mode, sub_optab,
1636 gen_rtx (CONST_INT, VOIDmode,
1637 GET_MODE_BITSIZE (mode)),
1638 width, 0, 0, OPTAB_LIB_WIDEN);
1639 }
1640
1641 /* If this machine's extzv insists on a register for
1642 operand 2 (length), arrange for that. */
1643 if (! ((*insn_operand_predicate[(int) CODE_FOR_extzv][2])
1644 (width, length_mode)))
1645 width = force_reg (length_mode, width);
1646
1647 /* Now extract with WIDTH, omitting OP1 least sig bits. */
1648 pat = gen_extzv (target1, shifted1, width, xop1);
1649 if (pat)
1650 {
1651 emit_insn (pat);
1652 temp = convert_to_mode (mode, target1, 1);
1653 }
1654 else
1655 delete_insns_since (last);
1656 }
1657
1658 /* Can also do logical shift with signed bit-field extract
1659 followed by inserting the bit-field at a different position.
1660 That strategy is not yet implemented. */
1661 }
1662#endif /* HAVE_extzv */
1663 }
1664
1665 if (temp == 0)
1666 abort ();
1667 return temp;
1668}
1669\f
1670enum alg_code { alg_add, alg_subtract, alg_compound };
1671
1672/* This structure records a sequence of operations.
1673 `ops' is the number of operations recorded.
1674 `cost' is their total cost.
1675 The operations are stored in `op' and the corresponding
1676 integer coefficients in `coeff'.
1677 These are the operations:
1678 alg_add Add to the total the multiplicand times the coefficient.
1679 alg_subtract Subtract the multiplicand times the coefficient.
1680 alg_compound This coefficient plus or minus the following one
1681 is multiplied into the total. The following operation
1682 is alg_add or alg_subtract to indicate whether to add
1683 or subtract the two coefficients. */
1684
1685#ifndef MAX_BITS_PER_WORD
1686#define MAX_BITS_PER_WORD BITS_PER_WORD
1687#endif
1688
1689struct algorithm
1690{
1691 int cost;
1692 unsigned int ops;
1693 enum alg_code op[MAX_BITS_PER_WORD];
1694 unsigned int coeff[MAX_BITS_PER_WORD];
1695};
1696
1697/* Compute and return the best algorithm for multiplying by T.
1698 Assume that add insns cost ADD_COST and shifts cost SHIFT_COST.
1699 Return cost -1 if would cost more than MAX_COST. */
1700
1701static struct algorithm
1702synth_mult (t, add_cost, shift_cost, max_cost)
1703 unsigned int t;
1704 int add_cost, shift_cost;
1705 int max_cost;
1706{
1707 int m, n;
1708 struct algorithm *best_alg = (struct algorithm *)alloca (sizeof (struct algorithm));
1709 struct algorithm *alg_in = (struct algorithm *)alloca (sizeof (struct algorithm));
1710 unsigned int cost;
1711
1712 /* No matter what happens, we want to return a valid algorithm. */
1713 best_alg->cost = max_cost;
1714 best_alg->ops = 0;
1715
1716 /* Is t an exponent of 2, so we can just do a shift? */
1717
1718 if ((t & -t) == t)
1719 {
1720 if (t > 1)
1721 {
1722 if (max_cost >= shift_cost)
1723 {
1724 best_alg->cost = shift_cost;
1725 best_alg->ops = 1;
1726 best_alg->op[0] = alg_add;
1727 best_alg->coeff[0] = t;
1728 }
1729 else
1730 best_alg->cost = -1;
1731 }
1732 else if (t == 1)
1733 {
1734 if (max_cost >= 0)
1735 best_alg->cost = 0;
1736 }
1737 else
1738 best_alg->cost = 0;
1739
1740 return *best_alg;
1741 }
1742
1743 /* If MAX_COST just permits as little as an addition (or less), we won't
1744 succeed in synthesizing an algorithm for t. Return immediately with
1745 an indication of failure. */
1746 if (max_cost <= add_cost)
1747 {
1748 best_alg->cost = -1;
1749 return *best_alg;
1750 }
1751
1752 /* Look for factors of t of the form
1753 t = q(2**m +- 1), 2 <= m <= floor(log2(t)) - 1.
1754 If we find such a factor, we can multiply by t using an algorithm that
1755 multiplies by q, shift the result by m and add/subtract it to itself. */
1756
1757 for (m = floor_log2 (t) - 1; m >= 2; m--)
1758 {
1759 int m_exp_2 = 1 << m;
1760 int d;
1761
1762 d = m_exp_2 + 1;
1763 if (t % d == 0)
1764 {
1765 int q = t / d;
1766
1767 cost = add_cost + shift_cost * 2;
1768
1769 *alg_in = synth_mult (q, add_cost, shift_cost,
1770 MIN (max_cost, best_alg->cost) - cost);
1771
1772 if (alg_in->cost >= 0)
1773 {
1774 cost += alg_in->cost;
1775
1776 if (cost < best_alg->cost)
1777 {
1778 struct algorithm *x;
1779 x = alg_in;
1780 alg_in = best_alg;
1781 best_alg = x;
1782 best_alg->coeff[best_alg->ops] = m_exp_2;
1783 best_alg->op[best_alg->ops++] = alg_compound;
1784 best_alg->coeff[best_alg->ops] = 1;
1785 best_alg->op[best_alg->ops++] = alg_add;
1786 best_alg->cost = cost;
1787 }
1788 }
1789 }
1790
1791 d = m_exp_2 - 1;
1792 if (t % d == 0)
1793 {
1794 int q = t / d;
1795
1796 cost = add_cost + shift_cost * 2;
1797
1798 *alg_in = synth_mult (q, add_cost, shift_cost,
1799 MIN (max_cost, best_alg->cost) - cost);
1800
1801 if (alg_in->cost >= 0)
1802 {
1803 cost += alg_in->cost;
1804
1805 if (cost < best_alg->cost)
1806 {
1807 struct algorithm *x;
1808 x = alg_in;
1809 alg_in = best_alg;
1810 best_alg = x;
1811 best_alg->coeff[best_alg->ops] = m_exp_2;
1812 best_alg->op[best_alg->ops++] = alg_compound;
1813 best_alg->coeff[best_alg->ops] = 1;
1814 best_alg->op[best_alg->ops++] = alg_subtract;
1815 best_alg->cost = cost;
1816 }
1817 }
1818 }
1819 }
1820
1821 /* Try load effective address instructions, i.e. do a*3, a*5, a*9. */
1822
1823 {
1824 int q;
1825 int w;
1826
1827 q = t & -t; /* get out lsb */
1828 w = (t - q) & -(t - q); /* get out next lsb */
1829
1830 if (w / q <= lea_max_mul)
1831 {
1832 cost = lea_cost + (q != 1 ? shift_cost : 0);
1833
1834 *alg_in = synth_mult (t - q - w, add_cost, shift_cost,
1835 MIN (max_cost, best_alg->cost) - cost);
1836
1837 if (alg_in->cost >= 0)
1838 {
1839 cost += alg_in->cost;
1840
1841 /* Use <= to prefer this method to the factoring method
1842 when the cost appears the same, because this method
1843 uses fewer temporary registers. */
1844 if (cost <= best_alg->cost)
1845 {
1846 struct algorithm *x;
1847 x = alg_in;
1848 alg_in = best_alg;
1849 best_alg = x;
1850 best_alg->coeff[best_alg->ops] = w;
1851 best_alg->op[best_alg->ops++] = alg_add;
1852 best_alg->coeff[best_alg->ops] = q;
1853 best_alg->op[best_alg->ops++] = alg_add;
1854 best_alg->cost = cost;
1855 }
1856 }
1857 }
1858 }
1859
1860 /* Now, use the good old method to add or subtract at the leftmost
1861 1-bit. */
1862
1863 {
1864 int q;
1865 int w;
1866
1867 q = t & -t; /* get out lsb */
1868 for (w = q; (w & t) != 0; w <<= 1)
1869 ;
1870 if ((w > q << 1)
1871 /* Reject the case where t has only two bits.
1872 Thus we prefer addition in that case. */
1873 && !(t < w && w == q << 2))
1874 {
1875 /* There are many bits in a row. Make 'em by subtraction. */
1876
1877 cost = add_cost;
1878 if (q != 1)
1879 cost += shift_cost;
1880
1881 *alg_in = synth_mult (t + q, add_cost, shift_cost,
1882 MIN (max_cost, best_alg->cost) - cost);
1883
1884 if (alg_in->cost >= 0)
1885 {
1886 cost += alg_in->cost;
1887
1888 /* Use <= to prefer this method to the factoring method
1889 when the cost appears the same, because this method
1890 uses fewer temporary registers. */
1891 if (cost <= best_alg->cost)
1892 {
1893 struct algorithm *x;
1894 x = alg_in;
1895 alg_in = best_alg;
1896 best_alg = x;
1897 best_alg->coeff[best_alg->ops] = q;
1898 best_alg->op[best_alg->ops++] = alg_subtract;
1899 best_alg->cost = cost;
1900 }
1901 }
1902 }
1903 else
1904 {
1905 /* There's only one bit at the left. Make it by addition. */
1906
1907 cost = add_cost;
1908 if (q != 1)
1909 cost += shift_cost;
1910
1911 *alg_in = synth_mult (t - q, add_cost, shift_cost,
1912 MIN (max_cost, best_alg->cost) - cost);
1913
1914 if (alg_in->cost >= 0)
1915 {
1916 cost += alg_in->cost;
1917
1918 if (cost <= best_alg->cost)
1919 {
1920 struct algorithm *x;
1921 x = alg_in;
1922 alg_in = best_alg;
1923 best_alg = x;
1924 best_alg->coeff[best_alg->ops] = q;
1925 best_alg->op[best_alg->ops++] = alg_add;
1926 best_alg->cost = cost;
1927 }
1928 }
1929 }
1930 }
1931
1932 if (best_alg->cost >= max_cost)
1933 best_alg->cost = -1;
1934 return *best_alg;
1935}
1936\f
1937/* Perform a multiplication and return an rtx for the result.
1938 MODE is mode of value; OP0 and OP1 are what to multiply (rtx's);
1939 TARGET is a suggestion for where to store the result (an rtx).
1940
1941 We check specially for a constant integer as OP1.
1942 If you want this check for OP0 as well, then before calling
1943 you should swap the two operands if OP0 would be constant. */
1944
1945rtx
1946expand_mult (mode, op0, op1, target, unsignedp)
1947 enum machine_mode mode;
1948 register rtx op0, op1, target;
1949 int unsignedp;
1950{
1951 rtx const_op1 = op1;
1952
1953 /* If we are multiplying in DImode, it may still be a win
1954 to try to work with shifts and adds. */
1955 if (GET_CODE (op1) == CONST_DOUBLE
1956 && GET_MODE_CLASS (GET_MODE (op1)) == MODE_INT
1957 && HOST_BITS_PER_INT <= BITS_PER_WORD)
1958 {
1959 if ((CONST_DOUBLE_HIGH (op1) == 0 && CONST_DOUBLE_LOW (op1) >= 0)
1960 || (CONST_DOUBLE_HIGH (op1) == -1 && CONST_DOUBLE_LOW (op1) < 0))
1961 const_op1 = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_LOW (op1));
1962 }
1963
66c1f88e
RS
1964 /* We used to test optimize here, on the grounds that it's better to
1965 produce a smaller program when -O is not used.
1966 But this causes such a terrible slowdown sometimes
1967 that it seems better to use synth_mult always. */
1968 if (GET_CODE (const_op1) == CONST_INT && ! mult_is_very_cheap)
44037a66
TG
1969 {
1970 struct algorithm alg;
1971 struct algorithm neg_alg;
1972 int negate = 0;
1973 int absval = INTVAL (op1);
1974 rtx last;
1975
1976 /* Try to do the computation two ways: multiply by the negative of OP1
1977 and then negate, or do the multiplication directly. The latter is
1978 usually faster for positive numbers and the former for negative
1979 numbers, but the opposite can be faster if the original value
1980 has a factor of 2**m +/- 1, while the negated value does not or
1981 vice versa. */
1982
1983 alg = synth_mult (absval, add_cost, shift_cost, mult_cost);
1984 neg_alg = synth_mult (- absval, add_cost, shift_cost,
1985 mult_cost - negate_cost);
1986
1987 if (neg_alg.cost >= 0 && neg_alg.cost + negate_cost < alg.cost)
1988 alg = neg_alg, negate = 1, absval = - absval;
1989
1990 if (alg.cost >= 0)
1991 {
1992 /* If we found something, it must be cheaper than multiply.
1993 So use it. */
1994 int opno = 0;
1995 rtx accum, tem;
1996 int factors_seen = 0;
1997
1998 op0 = protect_from_queue (op0, 0);
1999
2000 /* Avoid referencing memory over and over.
2001 For speed, but also for correctness when mem is volatile. */
2002 if (GET_CODE (op0) == MEM)
2003 op0 = force_reg (mode, op0);
2004
2005 if (alg.ops == 0)
2006 accum = copy_to_mode_reg (mode, op0);
2007 else
2008 {
2009 /* 1 if this is the last in a series of adds and subtracts. */
2010 int last = (1 == alg.ops || alg.op[1] == alg_compound);
2011 int log = floor_log2 (alg.coeff[0]);
2012 if (! factors_seen && ! last)
2013 log -= floor_log2 (alg.coeff[1]);
2014
2015 if (alg.op[0] != alg_add)
2016 abort ();
2017 accum = expand_shift (LSHIFT_EXPR, mode, op0,
2018 build_int_2 (log, 0),
2019 0, 0);
2020 }
2021
2022 while (++opno < alg.ops)
2023 {
2024 int log = floor_log2 (alg.coeff[opno]);
2025 /* 1 if this is the last in a series of adds and subtracts. */
2026 int last = (opno + 1 == alg.ops
2027 || alg.op[opno + 1] == alg_compound);
2028
2029 /* If we have not yet seen any separate factors (alg_compound)
2030 then turn op0<<a1 + op0<<a2 + op0<<a3... into
2031 (op0<<(a1-a2) + op0)<<(a2-a3) + op0... */
2032 switch (alg.op[opno])
2033 {
2034 case alg_add:
2035 if (factors_seen)
2036 {
2037 tem = expand_shift (LSHIFT_EXPR, mode, op0,
2038 build_int_2 (log, 0), 0, 0);
2039 accum = force_operand (gen_rtx (PLUS, mode, accum, tem),
2040 accum);
2041 }
2042 else
2043 {
2044 if (! last)
2045 log -= floor_log2 (alg.coeff[opno + 1]);
2046 accum = force_operand (gen_rtx (PLUS, mode, accum, op0),
2047 accum);
2048 accum = expand_shift (LSHIFT_EXPR, mode, accum,
2049 build_int_2 (log, 0), accum, 0);
2050 }
2051 break;
2052
2053 case alg_subtract:
2054 if (factors_seen)
2055 {
2056 tem = expand_shift (LSHIFT_EXPR, mode, op0,
2057 build_int_2 (log, 0), 0, 0);
2058 accum = force_operand (gen_rtx (MINUS, mode, accum, tem),
2059 accum);
2060 }
2061 else
2062 {
2063 if (! last)
2064 log -= floor_log2 (alg.coeff[opno + 1]);
2065 accum = force_operand (gen_rtx (MINUS, mode, accum, op0),
2066 accum);
2067 accum = expand_shift (LSHIFT_EXPR, mode, accum,
2068 build_int_2 (log, 0), accum, 0);
2069 }
2070
2071 break;
2072
2073 case alg_compound:
2074 factors_seen = 1;
2075 tem = expand_shift (LSHIFT_EXPR, mode, accum,
2076 build_int_2 (log, 0), 0, 0);
2077
2078 log = floor_log2 (alg.coeff[opno + 1]);
2079 accum = expand_shift (LSHIFT_EXPR, mode, accum,
2080 build_int_2 (log, 0), 0, 0);
2081 opno++;
2082 if (alg.op[opno] == alg_add)
2083 accum = force_operand (gen_rtx (PLUS, mode, tem, accum),
2084 tem);
2085 else
2086 accum = force_operand (gen_rtx (MINUS, mode, tem, accum),
2087 tem);
2088 }
2089 }
2090
2091 /* Write a REG_EQUAL note on the last insn so that we can cse
2092 multiplication sequences. We need not do this if we were
2093 multiplying by a power of two, since only one insn would have
2094 been generated.
2095
2096 ??? We could also write REG_EQUAL notes on the last insn of
2097 each sequence that uses a single temporary, but it is not
2098 clear how to calculate the partial product so far.
2099
2100 Torbjorn: Can you do this? */
2101
2102 if (exact_log2 (absval) < 0)
2103 {
2104 last = get_last_insn ();
2105 REG_NOTES (last)
2106 = gen_rtx (EXPR_LIST, REG_EQUAL,
2107 gen_rtx (MULT, mode, op0,
2108 negate ? gen_rtx (CONST_INT,
2109 VOIDmode, absval)
2110 : op1),
2111 REG_NOTES (last));
2112 }
2113
2114 return (negate ? expand_unop (mode, neg_optab, accum, target, 0)
2115 : accum);
2116 }
2117 }
2118
2119 /* This used to use umul_optab if unsigned,
2120 but I think that for non-widening multiply there is no difference
2121 between signed and unsigned. */
2122 op0 = expand_binop (mode, smul_optab,
2123 op0, op1, target, unsignedp, OPTAB_LIB_WIDEN);
2124 if (op0 == 0)
2125 abort ();
2126 return op0;
2127}
2128\f
2129/* Emit the code to divide OP0 by OP1, putting the result in TARGET
2130 if that is convenient, and returning where the result is.
2131 You may request either the quotient or the remainder as the result;
2132 specify REM_FLAG nonzero to get the remainder.
2133
2134 CODE is the expression code for which kind of division this is;
2135 it controls how rounding is done. MODE is the machine mode to use.
2136 UNSIGNEDP nonzero means do unsigned division. */
2137
2138/* ??? For CEIL_MOD_EXPR, can compute incorrect remainder with ANDI
2139 and then correct it by or'ing in missing high bits
2140 if result of ANDI is nonzero.
2141 For ROUND_MOD_EXPR, can use ANDI and then sign-extend the result.
2142 This could optimize to a bfexts instruction.
2143 But C doesn't use these operations, so their optimizations are
2144 left for later. */
2145
2146rtx
2147expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp)
2148 int rem_flag;
2149 enum tree_code code;
2150 enum machine_mode mode;
2151 register rtx op0, op1, target;
2152 int unsignedp;
2153{
2154 register rtx result = 0;
2155 enum machine_mode compute_mode;
2156 int log = -1;
2157 int can_clobber_op0;
2158 int mod_insn_no_good = 0;
2159 rtx adjusted_op0 = op0;
2160 optab optab1, optab2;
2161
2162 /* Don't use the function value register as a target
2163 since we have to read it as well as write it,
2164 and function-inlining gets confused by this. */
2165 if (target && REG_P (target) && REG_FUNCTION_VALUE_P (target))
2166 target = 0;
2167
2168 /* Don't clobber an operand while doing a multi-step calculation. */
2169 if (target)
2170 if ((rem_flag && (reg_mentioned_p (target, op0)
2171 || (GET_CODE (op0) == MEM && GET_CODE (target) == MEM)))
2172 || reg_mentioned_p (target, op1)
2173 || (GET_CODE (op1) == MEM && GET_CODE (target) == MEM))
2174 target = 0;
2175
2176 can_clobber_op0 = (GET_CODE (op0) == REG && op0 == target);
2177
2178 if (GET_CODE (op1) == CONST_INT)
2179 log = exact_log2 (INTVAL (op1));
2180
2181 /* If log is >= 0, we are dividing by 2**log, and will do it by shifting,
2182 which is really floor-division. Otherwise we will really do a divide,
2183 and we assume that is trunc-division.
2184
2185 We must correct the dividend by adding or subtracting something
2186 based on the divisor, in order to do the kind of rounding specified
2187 by CODE. The correction depends on what kind of rounding is actually
2188 available, and that depends on whether we will shift or divide.
2189
2190 In many of these cases it is possible to perform the operation by a
2191 clever series of logical operations (shifts and/or exclusive-ors).
2192 Although avoiding the jump has the advantage that it extends the basic
2193 block and allows further optimization, the branch-free code is normally
2194 at least one instruction longer in the (most common) case where the
2195 dividend is non-negative. Performance measurements of the two
2196 alternatives show that the branch-free code is slightly faster on the
2197 IBM ROMP but slower on CISC processors (significantly slower on the
2198 VAX). Accordingly, the jump code has been retained.
2199
2200 On machines where the jump code is slower, the cost of a DIV or MOD
2201 operation can be set small (less than twice that of an addition); in
2202 that case, we pretend that we don't have a power of two and perform
2203 a normal division or modulus operation. */
2204
2205 if ((code == TRUNC_MOD_EXPR || code == TRUNC_DIV_EXPR)
2206 && ! unsignedp
2207 && (rem_flag ? smod_pow2_cheap : sdiv_pow2_cheap))
2208 log = -1;
2209
2210 /* Get the mode in which to perform this computation. Normally it will
2211 be MODE, but sometimes we can't do the desired operation in MODE.
2212 If so, pick a wider mode in which we can do the operation. Convert
2213 to that mode at the start to avoid repeated conversions.
2214
2215 First see what operations we need. These depend on the expression
2216 we are evaluating. (We assume that divxx3 insns exist under the
2217 same conditions that modxx3 insns and that these insns don't normally
2218 fail. If these assumptions are not correct, we may generate less
2219 efficient code in some cases.)
2220
2221 Then see if we find a mode in which we can open-code that operation
2222 (either a division, modulus, or shift). Finally, check for the smallest
2223 mode for which we can do the operation with a library call. */
2224
2225 optab1 = (log >= 0 ? (unsignedp ? lshr_optab : ashr_optab)
2226 : (unsignedp ? udiv_optab : sdiv_optab));
2227 optab2 = (log >= 0 ? optab1 : (unsignedp ? udivmod_optab : sdivmod_optab));
2228
2229 for (compute_mode = mode; compute_mode != VOIDmode;
2230 compute_mode = GET_MODE_WIDER_MODE (compute_mode))
2231 if (optab1->handlers[(int) compute_mode].insn_code != CODE_FOR_nothing
2232 || optab2->handlers[(int) compute_mode].insn_code != CODE_FOR_nothing)
2233 break;
2234
2235 if (compute_mode == VOIDmode)
2236 for (compute_mode = mode; compute_mode != VOIDmode;
2237 compute_mode = GET_MODE_WIDER_MODE (compute_mode))
2238 if (optab1->handlers[(int) compute_mode].libfunc
2239 || optab2->handlers[(int) compute_mode].libfunc)
2240 break;
2241
2242 /* If we still couldn't find a mode, use MODE; we'll probably abort in
2243 expand_binop. */
2244 if (compute_mode == VOIDmode)
2245 compute_mode = mode;
2246
2247 /* Now convert to the best mode to use. Show we made a copy of OP0
2248 and hence we can clobber it (we cannot use a SUBREG to widen
2249 something. */
2250 if (compute_mode != mode)
2251 {
2252 adjusted_op0 = op0 = convert_to_mode (compute_mode, op0, unsignedp);
2253 can_clobber_op0 = 1;
2254 op1 = convert_to_mode (compute_mode, op1, unsignedp);
2255 }
2256
c2a47e48
RK
2257 /* If we are computing the remainder and one of the operands is a volatile
2258 MEM, copy it into a register. */
2259
2260 if (rem_flag && GET_CODE (op0) == MEM && MEM_VOLATILE_P (op0))
2261 adjusted_op0 = op0 = force_reg (compute_mode, op0), can_clobber_op0 = 1;
2262 if (rem_flag && GET_CODE (op1) == MEM && MEM_VOLATILE_P (op1))
2263 op1 = force_reg (compute_mode, op1);
2264
d8064a5d
RS
2265 /* If we are computing the remainder, op0 will be needed later to calculate
2266 X - Y * (X / Y), therefore cannot be clobbered. */
2267 if (rem_flag)
2268 can_clobber_op0 = 0;
2269
44037a66
TG
2270 if (target == 0 || GET_MODE (target) != compute_mode)
2271 target = gen_reg_rtx (compute_mode);
2272
2273 switch (code)
2274 {
2275 case TRUNC_MOD_EXPR:
2276 case TRUNC_DIV_EXPR:
2277 if (log >= 0 && ! unsignedp)
2278 {
2279 rtx label = gen_label_rtx ();
2280 if (! can_clobber_op0)
2281 {
36d747f6
RS
2282 adjusted_op0 = copy_to_suggested_reg (adjusted_op0, target,
2283 compute_mode);
44037a66
TG
2284 /* Copy op0 to a reg, since emit_cmp_insn will call emit_queue
2285 which will screw up mem refs for autoincrements. */
2286 op0 = force_reg (compute_mode, op0);
2287 }
2288 emit_cmp_insn (adjusted_op0, const0_rtx, GE, 0, compute_mode, 0, 0);
2289 emit_jump_insn (gen_bge (label));
2290 expand_inc (adjusted_op0, plus_constant (op1, -1));
2291 emit_label (label);
2292 mod_insn_no_good = 1;
2293 }
2294 break;
2295
2296 case FLOOR_DIV_EXPR:
2297 case FLOOR_MOD_EXPR:
2298 if (log < 0 && ! unsignedp)
2299 {
2300 rtx label = gen_label_rtx ();
2301 if (! can_clobber_op0)
2302 {
36d747f6
RS
2303 adjusted_op0 = copy_to_suggested_reg (adjusted_op0, target,
2304 compute_mode);
44037a66
TG
2305 /* Copy op0 to a reg, since emit_cmp_insn will call emit_queue
2306 which will screw up mem refs for autoincrements. */
2307 op0 = force_reg (compute_mode, op0);
2308 }
2309 emit_cmp_insn (adjusted_op0, const0_rtx, GE, 0, compute_mode, 0, 0);
2310 emit_jump_insn (gen_bge (label));
2311 expand_dec (adjusted_op0, op1);
2312 expand_inc (adjusted_op0, const1_rtx);
2313 emit_label (label);
2314 mod_insn_no_good = 1;
2315 }
2316 break;
2317
2318 case CEIL_DIV_EXPR:
2319 case CEIL_MOD_EXPR:
2320 if (! can_clobber_op0)
2321 {
36d747f6
RS
2322 adjusted_op0 = copy_to_suggested_reg (adjusted_op0, target,
2323 compute_mode);
44037a66
TG
2324 /* Copy op0 to a reg, since emit_cmp_insn will call emit_queue
2325 which will screw up mem refs for autoincrements. */
2326 op0 = force_reg (compute_mode, op0);
2327 }
2328 if (log < 0)
2329 {
2330 rtx label = 0;
2331 if (! unsignedp)
2332 {
2333 label = gen_label_rtx ();
2334 emit_cmp_insn (adjusted_op0, const0_rtx, LE, 0, compute_mode, 0, 0);
2335 emit_jump_insn (gen_ble (label));
2336 }
2337 expand_inc (adjusted_op0, op1);
2338 expand_dec (adjusted_op0, const1_rtx);
2339 if (! unsignedp)
2340 emit_label (label);
2341 }
2342 else
2343 {
2344 adjusted_op0 = expand_binop (compute_mode, add_optab,
2345 adjusted_op0, plus_constant (op1, -1),
2346 0, 0, OPTAB_LIB_WIDEN);
2347 }
2348 mod_insn_no_good = 1;
2349 break;
2350
2351 case ROUND_DIV_EXPR:
2352 case ROUND_MOD_EXPR:
2353 if (! can_clobber_op0)
2354 {
36d747f6
RS
2355 adjusted_op0 = copy_to_suggested_reg (adjusted_op0, target,
2356 compute_mode);
44037a66
TG
2357 /* Copy op0 to a reg, since emit_cmp_insn will call emit_queue
2358 which will screw up mem refs for autoincrements. */
2359 op0 = force_reg (compute_mode, op0);
2360 }
2361 if (log < 0)
2362 {
2363 op1 = expand_shift (RSHIFT_EXPR, compute_mode, op1,
2364 integer_one_node, 0, 0);
2365 if (! unsignedp)
2366 {
2367 rtx label = gen_label_rtx ();
2368 emit_cmp_insn (adjusted_op0, const0_rtx, GE, 0, compute_mode, 0, 0);
2369 emit_jump_insn (gen_bge (label));
2370 expand_unop (compute_mode, neg_optab, op1, op1, 0);
2371 emit_label (label);
2372 }
2373 expand_inc (adjusted_op0, op1);
2374 }
2375 else
2376 {
2377 op1 = gen_rtx (CONST_INT, VOIDmode, (1 << log) / 2);
2378 expand_inc (adjusted_op0, op1);
2379 }
2380 mod_insn_no_good = 1;
2381 break;
2382 }
2383
2384 if (rem_flag && !mod_insn_no_good)
2385 {
2386 /* Try to produce the remainder directly */
2387 if (log >= 0)
2388 result = expand_binop (compute_mode, and_optab, adjusted_op0,
2389 gen_rtx (CONST_INT, VOIDmode,
2390 (1 << log) - 1),
2391 target, 1, OPTAB_LIB_WIDEN);
2392 else
2393 {
2394 /* See if we can do remainder without a library call. */
2395 result = sign_expand_binop (mode, umod_optab, smod_optab,
2396 adjusted_op0, op1, target,
2397 unsignedp, OPTAB_WIDEN);
2398 if (result == 0)
2399 {
2400 /* No luck there. Can we do remainder and divide at once
2401 without a library call? */
2402 result = gen_reg_rtx (compute_mode);
2403 if (! expand_twoval_binop (unsignedp
2404 ? udivmod_optab : sdivmod_optab,
2405 adjusted_op0, op1,
2406 0, result, unsignedp))
2407 result = 0;
2408 }
2409 }
2410 }
2411
2412 if (result)
2413 return gen_lowpart (mode, result);
2414
2415 /* Produce the quotient. */
2416 if (log >= 0)
2417 result = expand_shift (RSHIFT_EXPR, compute_mode, adjusted_op0,
2418 build_int_2 (log, 0), target, unsignedp);
2419 else if (rem_flag && !mod_insn_no_good)
2420 /* If producing quotient in order to subtract for remainder,
2421 and a remainder subroutine would be ok,
2422 don't use a divide subroutine. */
2423 result = sign_expand_binop (compute_mode, udiv_optab, sdiv_optab,
2424 adjusted_op0, op1, 0, unsignedp, OPTAB_WIDEN);
2425 else
2426 {
2427 /* Try a quotient insn, but not a library call. */
2428 result = sign_expand_binop (compute_mode, udiv_optab, sdiv_optab,
2429 adjusted_op0, op1, rem_flag ? 0 : target,
2430 unsignedp, OPTAB_WIDEN);
2431 if (result == 0)
2432 {
2433 /* No luck there. Try a quotient-and-remainder insn,
2434 keeping the quotient alone. */
2435 result = gen_reg_rtx (mode);
2436 if (! expand_twoval_binop (unsignedp ? udivmod_optab : sdivmod_optab,
2437 adjusted_op0, op1,
2438 result, 0, unsignedp))
2439 result = 0;
2440 }
2441
2442 /* If still no luck, use a library call. */
2443 if (result == 0)
2444 result = sign_expand_binop (compute_mode, udiv_optab, sdiv_optab,
2445 adjusted_op0, op1, rem_flag ? 0 : target,
2446 unsignedp, OPTAB_LIB_WIDEN);
2447 }
2448
2449 /* If we really want the remainder, get it by subtraction. */
2450 if (rem_flag)
2451 {
2452 if (result == 0)
2453 /* No divide instruction either. Use library for remainder. */
2454 result = sign_expand_binop (compute_mode, umod_optab, smod_optab,
2455 op0, op1, target,
2456 unsignedp, OPTAB_LIB_WIDEN);
2457 else
2458 {
2459 /* We divided. Now finish doing X - Y * (X / Y). */
2460 result = expand_mult (compute_mode, result, op1, target, unsignedp);
2461 if (! result) abort ();
2462 result = expand_binop (compute_mode, sub_optab, op0,
2463 result, target, unsignedp, OPTAB_LIB_WIDEN);
2464 }
2465 }
2466
2467 if (result == 0)
2468 abort ();
2469
2470 return gen_lowpart (mode, result);
2471}
2472\f
2473/* Return a tree node with data type TYPE, describing the value of X.
2474 Usually this is an RTL_EXPR, if there is no obvious better choice.
2475 X may be an expression, however we only support those expressions
2476 generated by loop.c. */
2477
2478tree
2479make_tree (type, x)
2480 tree type;
2481 rtx x;
2482{
2483 tree t;
2484
2485 switch (GET_CODE (x))
2486 {
2487 case CONST_INT:
2488 t = build_int_2 (INTVAL (x),
2489 ! TREE_UNSIGNED (type) && INTVAL (x) >= 0 ? 0 : -1);
2490 TREE_TYPE (t) = type;
2491 return t;
2492
2493 case CONST_DOUBLE:
2494 if (GET_MODE (x) == VOIDmode)
2495 {
2496 t = build_int_2 (CONST_DOUBLE_LOW (x), CONST_DOUBLE_HIGH (x));
2497 TREE_TYPE (t) = type;
2498 }
2499 else
2500 {
2501 REAL_VALUE_TYPE d;
2502
2503 REAL_VALUE_FROM_CONST_DOUBLE (d, x);
2504 t = build_real (type, d);
2505 }
2506
2507 return t;
2508
2509 case PLUS:
2510 return fold (build (PLUS_EXPR, type, make_tree (type, XEXP (x, 0)),
2511 make_tree (type, XEXP (x, 1))));
2512
2513 case MINUS:
2514 return fold (build (MINUS_EXPR, type, make_tree (type, XEXP (x, 0)),
2515 make_tree (type, XEXP (x, 1))));
2516
2517 case NEG:
2518 return fold (build1 (NEGATE_EXPR, type, make_tree (type, XEXP (x, 0))));
2519
2520 case MULT:
2521 return fold (build (MULT_EXPR, type, make_tree (type, XEXP (x, 0)),
2522 make_tree (type, XEXP (x, 1))));
2523
2524 case ASHIFT:
2525 return fold (build (LSHIFT_EXPR, type, make_tree (type, XEXP (x, 0)),
2526 make_tree (type, XEXP (x, 1))));
2527
2528 case LSHIFTRT:
2529 return fold (convert (type,
2530 build (RSHIFT_EXPR, unsigned_type (type),
2531 make_tree (unsigned_type (type),
2532 XEXP (x, 0)),
2533 make_tree (type, XEXP (x, 1)))));
2534
2535 case ASHIFTRT:
2536 return fold (convert (type,
2537 build (RSHIFT_EXPR, signed_type (type),
2538 make_tree (signed_type (type), XEXP (x, 0)),
2539 make_tree (type, XEXP (x, 1)))));
2540
2541 case DIV:
2542 if (TREE_CODE (type) != REAL_TYPE)
2543 t = signed_type (type);
2544 else
2545 t = type;
2546
2547 return fold (convert (type,
2548 build (TRUNC_DIV_EXPR, t,
2549 make_tree (t, XEXP (x, 0)),
2550 make_tree (t, XEXP (x, 1)))));
2551 case UDIV:
2552 t = unsigned_type (type);
2553 return fold (convert (type,
2554 build (TRUNC_DIV_EXPR, t,
2555 make_tree (t, XEXP (x, 0)),
2556 make_tree (t, XEXP (x, 1)))));
2557 default:
2558 t = make_node (RTL_EXPR);
2559 TREE_TYPE (t) = type;
2560 RTL_EXPR_RTL (t) = x;
2561 /* There are no insns to be output
2562 when this rtl_expr is used. */
2563 RTL_EXPR_SEQUENCE (t) = 0;
2564 return t;
2565 }
2566}
2567
2568/* Return an rtx representing the value of X * MULT + ADD.
2569 TARGET is a suggestion for where to store the result (an rtx).
2570 MODE is the machine mode for the computation.
2571 X and MULT must have mode MODE. ADD may have a different mode.
2572 So can X (defaults to same as MODE).
2573 UNSIGNEDP is non-zero to do unsigned multiplication.
2574 This may emit insns. */
2575
2576rtx
2577expand_mult_add (x, target, mult, add, mode, unsignedp)
2578 rtx x, target, mult, add;
2579 enum machine_mode mode;
2580 int unsignedp;
2581{
2582 tree type = type_for_mode (mode, unsignedp);
2583 tree add_type = (GET_MODE (add) == VOIDmode
36d747f6 2584 ? type : type_for_mode (GET_MODE (add), unsignedp));
44037a66
TG
2585 tree result = fold (build (PLUS_EXPR, type,
2586 fold (build (MULT_EXPR, type,
2587 make_tree (type, x),
2588 make_tree (type, mult))),
2589 make_tree (add_type, add)));
2590
2591 return expand_expr (result, target, VOIDmode, 0);
2592}
2593\f
2594/* Compute the logical-and of OP0 and OP1, storing it in TARGET
2595 and returning TARGET.
2596
2597 If TARGET is 0, a pseudo-register or constant is returned. */
2598
2599rtx
2600expand_and (op0, op1, target)
2601 rtx op0, op1, target;
2602{
2603 enum machine_mode mode = VOIDmode;
2604 rtx tem;
2605
2606 if (GET_MODE (op0) != VOIDmode)
2607 mode = GET_MODE (op0);
2608 else if (GET_MODE (op1) != VOIDmode)
2609 mode = GET_MODE (op1);
2610
2611 if (mode != VOIDmode)
2612 tem = expand_binop (mode, and_optab, op0, op1, target, 0, OPTAB_LIB_WIDEN);
2613 else if (GET_CODE (op0) == CONST_INT && GET_CODE (op1) == CONST_INT)
2614 tem = gen_rtx (CONST_INT, VOIDmode, INTVAL (op0) & INTVAL (op1));
2615 else
2616 abort ();
2617
2618 if (target == 0)
2619 target = tem;
2620 else if (tem != target)
2621 emit_move_insn (target, tem);
2622 return target;
2623}
2624\f
2625/* Emit a store-flags instruction for comparison CODE on OP0 and OP1
2626 and storing in TARGET. Normally return TARGET.
2627 Return 0 if that cannot be done.
2628
2629 MODE is the mode to use for OP0 and OP1 should they be CONST_INTs. If
2630 it is VOIDmode, they cannot both be CONST_INT.
2631
2632 UNSIGNEDP is for the case where we have to widen the operands
2633 to perform the operation. It says to use zero-extension.
2634
2635 NORMALIZEP is 1 if we should convert the result to be either zero
2636 or one one. Normalize is -1 if we should convert the result to be
2637 either zero or -1. If NORMALIZEP is zero, the result will be left
2638 "raw" out of the scc insn. */
2639
2640rtx
2641emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep)
2642 rtx target;
2643 enum rtx_code code;
2644 rtx op0, op1;
2645 enum machine_mode mode;
2646 int unsignedp;
2647 int normalizep;
2648{
2649 rtx subtarget;
2650 enum insn_code icode;
2651 enum machine_mode compare_mode;
2652 enum machine_mode target_mode = GET_MODE (target);
2653 rtx tem;
2654 rtx last = 0;
2655 rtx pattern, comparison;
2656
2657 if (mode == VOIDmode)
2658 mode = GET_MODE (op0);
2659
2660 /* For some comparisons with 1 and -1, we can convert this to
2661 comparisons with zero. This will often produce more opportunities for
2662 store-flag insns. */
2663
2664 switch (code)
2665 {
2666 case LT:
2667 if (op1 == const1_rtx)
2668 op1 = const0_rtx, code = LE;
2669 break;
2670 case LE:
2671 if (op1 == constm1_rtx)
2672 op1 = const0_rtx, code = LT;
2673 break;
2674 case GE:
2675 if (op1 == const1_rtx)
2676 op1 = const0_rtx, code = GT;
2677 break;
2678 case GT:
2679 if (op1 == constm1_rtx)
2680 op1 = const0_rtx, code = GE;
2681 break;
2682 case GEU:
2683 if (op1 == const1_rtx)
2684 op1 = const0_rtx, code = NE;
2685 break;
2686 case LTU:
2687 if (op1 == const1_rtx)
2688 op1 = const0_rtx, code = EQ;
2689 break;
2690 }
2691
2692 /* From now on, we won't change CODE, so set ICODE now. */
2693 icode = setcc_gen_code[(int) code];
2694
2695 /* If this is A < 0 or A >= 0, we can do this by taking the ones
2696 complement of A (for GE) and shifting the sign bit to the low bit. */
2697 if (op1 == const0_rtx && (code == LT || code == GE)
2698 && GET_MODE_CLASS (mode) == MODE_INT
2699 && (normalizep || STORE_FLAG_VALUE == 1
2700 || (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_INT
2701 && STORE_FLAG_VALUE == 1 << (GET_MODE_BITSIZE (mode) - 1))))
2702 {
2703 rtx subtarget = target;
2704
2705 /* If the result is to be wider than OP0, it is best to convert it
2706 first. If it is to be narrower, it is *incorrect* to convert it
2707 first. */
2708 if (GET_MODE_SIZE (target_mode) > GET_MODE_SIZE (mode))
2709 {
2710 op0 = convert_to_mode (target_mode, op0, 0);
2711 mode = target_mode;
2712 }
2713
2714 if (target_mode != mode)
2715 subtarget = 0;
2716
2717 if (code == GE)
2718 op0 = expand_unop (mode, one_cmpl_optab, op0, subtarget, 0);
2719
2720 if (normalizep || STORE_FLAG_VALUE == 1)
2721 /* If we are supposed to produce a 0/1 value, we want to do
2722 a logical shift from the sign bit to the low-order bit; for
2723 a -1/0 value, we do an arithmetic shift. */
2724 op0 = expand_shift (RSHIFT_EXPR, mode, op0,
2725 size_int (GET_MODE_BITSIZE (mode) - 1),
2726 subtarget, normalizep != -1);
2727
2728 if (mode != target_mode)
2729 op0 = convert_to_mode (target_mode, op0, 0);
2730
2731 return op0;
2732 }
2733
2734 if (icode != CODE_FOR_nothing)
2735 {
2736 /* We think we may be able to do this with a scc insn. Emit the
2737 comparison and then the scc insn.
2738
2739 compare_from_rtx may call emit_queue, which would be deleted below
2740 if the scc insn fails. So call it ourselves before setting LAST. */
2741
2742 emit_queue ();
2743 last = get_last_insn ();
2744
2745 comparison = compare_from_rtx (op0, op1, code, unsignedp, mode, 0, 0);
2746 if (GET_CODE (comparison) == CONST_INT)
2747 return (comparison == const0_rtx ? const0_rtx
2748 : normalizep == 1 ? const1_rtx
2749 : normalizep == -1 ? constm1_rtx
2750 : const_true_rtx);
2751
2752 /* Get a reference to the target in the proper mode for this insn. */
2753 compare_mode = insn_operand_mode[(int) icode][0];
2754 subtarget = target;
2755 if (preserve_subexpressions_p ()
2756 || ! (*insn_operand_predicate[(int) icode][0]) (subtarget, compare_mode))
2757 subtarget = gen_reg_rtx (compare_mode);
2758
2759 pattern = GEN_FCN (icode) (subtarget);
2760 if (pattern)
2761 {
2762 emit_insn (pattern);
2763
2764 /* If we are converting to a wider mode, first convert to
2765 TARGET_MODE, then normalize. This produces better combining
2766 opportunities on machines that have a SIGN_EXTRACT when we are
2767 testing a single bit. This mostly benefits the 68k.
2768
2769 If STORE_FLAG_VALUE does not have the sign bit set when
2770 interpreted in COMPARE_MODE, we can do this conversion as
2771 unsigned, which is usually more efficient. */
2772 if (GET_MODE_SIZE (target_mode) > GET_MODE_SIZE (compare_mode))
2773 {
2774 convert_move (target, subtarget,
2775 (GET_MODE_BITSIZE (compare_mode)
2776 <= HOST_BITS_PER_INT)
2777 && 0 == (STORE_FLAG_VALUE
2778 & (1 << (GET_MODE_BITSIZE (compare_mode) -1))));
2779 op0 = target;
2780 compare_mode = target_mode;
2781 }
2782 else
2783 op0 = subtarget;
2784
4b980e20
RK
2785 /* If we want to keep subexpressions around, don't reuse our
2786 last target. */
2787
2788 if (preserve_subexpressions_p ())
2789 subtarget = 0;
2790
44037a66
TG
2791 /* Now normalize to the proper value in COMPARE_MODE. Sometimes
2792 we don't have to do anything. */
2793 if (normalizep == 0 || normalizep == STORE_FLAG_VALUE)
2794 ;
2795 else if (normalizep == - STORE_FLAG_VALUE)
2796 op0 = expand_unop (compare_mode, neg_optab, op0, subtarget, 0);
2797
2798 /* We don't want to use STORE_FLAG_VALUE < 0 below since this
2799 makes it hard to use a value of just the sign bit due to
2800 ANSI integer constant typing rules. */
2801 else if (GET_MODE_BITSIZE (compare_mode) <= HOST_BITS_PER_INT
2802 && (STORE_FLAG_VALUE
2803 & (1 << (GET_MODE_BITSIZE (compare_mode) - 1))))
2804 op0 = expand_shift (RSHIFT_EXPR, compare_mode, op0,
2805 size_int (GET_MODE_BITSIZE (compare_mode) - 1),
2806 subtarget, normalizep == 1);
2807 else if (STORE_FLAG_VALUE & 1)
2808 {
2809 op0 = expand_and (op0, const1_rtx, subtarget);
2810 if (normalizep == -1)
2811 op0 = expand_unop (compare_mode, neg_optab, op0, op0, 0);
2812 }
2813 else
2814 abort ();
2815
2816 /* If we were converting to a smaller mode, do the
2817 conversion now. */
2818 if (target_mode != compare_mode)
2819 {
2820 convert_move (target, op0);
2821 return target;
2822 }
2823 else
2824 return op0;
2825 }
2826 }
2827
2828 if (last)
2829 delete_insns_since (last);
2830
2831 subtarget = target_mode == mode ? target : 0;
2832
2833 /* If we reached here, we can't do this with a scc insn. However, there
2834 are some comparisons that can be done directly. For example, if
2835 this is an equality comparison of integers, we can try to exclusive-or
2836 (or subtract) the two operands and use a recursive call to try the
2837 comparison with zero. Don't do any of these cases if branches are
2838 very cheap. */
2839
2840 if (BRANCH_COST >= 0
2841 && GET_MODE_CLASS (mode) == MODE_INT && (code == EQ || code == NE)
2842 && op1 != const0_rtx)
2843 {
2844 tem = expand_binop (mode, xor_optab, op0, op1, subtarget, 1,
2845 OPTAB_WIDEN);
2846
2847 if (tem == 0)
2848 tem = expand_binop (mode, sub_optab, op0, op1, subtarget, 1,
2849 OPTAB_WIDEN);
2850 if (tem != 0)
2851 tem = emit_store_flag (target, code, tem, const0_rtx,
2852 mode, unsignedp, normalizep);
2853 if (tem == 0)
2854 delete_insns_since (last);
2855 return tem;
2856 }
2857
2858 /* Some other cases we can do are EQ, NE, LE, and GT comparisons with
2859 the constant zero. Reject all other comparisons at this point. Only
2860 do LE and GT if branches are expensive since they are expensive on
2861 2-operand machines. */
2862
2863 if (BRANCH_COST == 0
2864 || GET_MODE_CLASS (mode) != MODE_INT || op1 != const0_rtx
2865 || (code != EQ && code != NE
2866 && (BRANCH_COST <= 1 || (code != LE && code != GT))))
2867 return 0;
2868
2869 /* See what we need to return. We can only return a 1, -1, or the
2870 sign bit. */
2871
2872 if (normalizep == 0)
2873 {
2874 if (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
2875 normalizep = STORE_FLAG_VALUE;
2876
2877 else if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_INT
2878 && STORE_FLAG_VALUE == 1 << (GET_MODE_BITSIZE (mode) - 1))
2879 ;
2880 else
2881 return 0;
2882 }
2883
2884 /* Try to put the result of the comparison in the sign bit. Assume we can't
2885 do the necessary operation below. */
2886
2887 tem = 0;
2888
2889 /* To see if A <= 0, compute (A | (A - 1)). A <= 0 iff that result has
2890 the sign bit set. */
2891
2892 if (code == LE)
2893 {
2894 /* This is destructive, so SUBTARGET can't be OP0. */
2895 if (rtx_equal_p (subtarget, op0))
2896 subtarget = 0;
2897
2898 tem = expand_binop (mode, sub_optab, op0, const1_rtx, subtarget, 0,
2899 OPTAB_WIDEN);
2900 if (tem)
2901 tem = expand_binop (mode, ior_optab, op0, tem, subtarget, 0,
2902 OPTAB_WIDEN);
2903 }
2904
2905 /* To see if A > 0, compute (((signed) A) << BITS) - A, where BITS is the
2906 number of bits in the mode of OP0, minus one. */
2907
2908 if (code == GT)
2909 {
2910 if (rtx_equal_p (subtarget, op0))
2911 subtarget = 0;
2912
2913 tem = expand_shift (RSHIFT_EXPR, mode, op0,
2914 size_int (GET_MODE_BITSIZE (mode) - 1),
2915 subtarget, 0);
2916 tem = expand_binop (mode, sub_optab, tem, op0, subtarget, 0,
2917 OPTAB_WIDEN);
2918 }
2919
2920 if (code == EQ || code == NE)
2921 {
2922 /* For EQ or NE, one way to do the comparison is to apply an operation
2923 that converts the operand into a positive number if it is non-zero
2924 or zero if it was originally zero. Then, for EQ, we subtract 1 and
2925 for NE we negate. This puts the result in the sign bit. Then we
2926 normalize with a shift, if needed.
2927
2928 Two operations that can do the above actions are ABS and FFS, so try
2929 them. If that doesn't work, and MODE is smaller than a full word,
36d747f6 2930 we can use zero-extension to the wider mode (an unsigned conversion)
44037a66
TG
2931 as the operation. */
2932
2933 if (abs_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
2934 tem = expand_unop (mode, abs_optab, op0, subtarget, 1);
2935 else if (ffs_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
2936 tem = expand_unop (mode, ffs_optab, op0, subtarget, 1);
2937 else if (GET_MODE_SIZE (mode) < UNITS_PER_WORD)
2938 {
2939 mode = word_mode;
2940 tem = convert_to_mode (mode, op0, 1);
2941 }
2942
2943 if (tem != 0)
2944 {
2945 if (code == EQ)
2946 tem = expand_binop (mode, sub_optab, tem, const1_rtx, subtarget,
2947 0, OPTAB_WIDEN);
2948 else
2949 tem = expand_unop (mode, neg_optab, tem, subtarget, 0);
2950 }
2951
2952 /* If we couldn't do it that way, for NE we can "or" the two's complement
2953 of the value with itself. For EQ, we take the one's complement of
2954 that "or", which is an extra insn, so we only handle EQ if branches
2955 are expensive. */
2956
2957 if (tem == 0 && (code == NE || BRANCH_COST > 1))
2958 {
36d747f6
RS
2959 if (rtx_equal_p (subtarget, op0))
2960 subtarget = 0;
2961
44037a66
TG
2962 tem = expand_unop (mode, neg_optab, op0, subtarget, 0);
2963 tem = expand_binop (mode, ior_optab, tem, op0, subtarget, 0,
2964 OPTAB_WIDEN);
2965
2966 if (tem && code == EQ)
2967 tem = expand_unop (mode, one_cmpl_optab, tem, subtarget, 0);
2968 }
2969 }
2970
2971 if (tem && normalizep)
2972 tem = expand_shift (RSHIFT_EXPR, mode, tem,
2973 size_int (GET_MODE_BITSIZE (mode) - 1),
2974 tem, normalizep == 1);
2975
2976 if (tem && GET_MODE (tem) != target_mode)
2977 {
2978 convert_move (target, tem, 0);
2979 tem = target;
2980 }
2981
2982 if (tem == 0)
2983 delete_insns_since (last);
2984
2985 return tem;
2986}
2987 emit_jump_insn ((*bcc_gen_fctn[(int) code]) (label));
2988 emit_move_insn (target, const1_rtx);
2989 emit_label (label);
2990
2991 return target;
2992}
This page took 0.382378 seconds and 5 git commands to generate.