diff options
author | Richard Kenner <kenner@vlsi1.ultra.nyu.edu> | 2000-03-30 11:47:08 +0000 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 2000-03-30 06:47:08 -0500 |
commit | 19caa751a84a1ff3a90a5dc64e3f4c5cac6ce97f (patch) | |
tree | 329b51ffb0413c60bc6cbeaca6487042e3b6592d /gcc/expmed.c | |
parent | 2dc4d9f050c5d46500c925725a5f18303dd882c1 (diff) | |
download | gcc-19caa751a84a1ff3a90a5dc64e3f4c5cac6ce97f.zip gcc-19caa751a84a1ff3a90a5dc64e3f4c5cac6ce97f.tar.gz gcc-19caa751a84a1ff3a90a5dc64e3f4c5cac6ce97f.tar.bz2 |
builtins.c (get_pointer_alignment): Use host_integerp & tree_low_cst.
* builtins.c (get_pointer_alignment): Use host_integerp & tree_low_cst.
(expand_builtin_apply): Pass alignment to emit_block_move in bits.
(expand_builtin_memcpy, expand_builtin_va_copy): Likewise.
(expand_builtin_memset): Likewise, but to clear_storage.
* calls.c (save_fixed_argument_area): Likewise, to move_by_pieces.
(restore_fixed_argument_area): Likewise.
(store_unaligned_arguments_into_pseudos): Likewise, to store_bit_field.
(load_register_parameters): Likewise, to emit_group_load.
(expand_call): Likewise, to emit_group_store and emit_block_move.
(emit_library_call_value_1): Likewise, to emit_block_move.
(store_one_arg): Likewise, and to emit_push_insn.
* expmed.c (extract_bit_field): Alignment is in bits, not bytes.
(extract_fixed_bit_field, extract_split_bit_field): Likewise.
* expr.c (move_by_pieces, move_by_pieces_ninsns): Likewise.
(emit_block_move, emit_group_load, emit_group_store): Likewise.
(clear_by_pieces, clear_storage, emit_push_insn): Likewise.
(expand_assigment, store_expr, store_constructor_field): Likewise.
(expand_expr_unaligned, do_jump, do_compare_and_jump): Likewise.
(store_constructor, store_field, get_inner_reference): Likewise.
Use host_integerp and tree_low_cst; sizes and positions HOST_WIDE_INT.
(expand_expr, case COMPONENT_REF): Likewise.
(copy_blkmode_from_regs): Use UNSIGNED_HOST_WIDE_INT for sizes
and positions; reindent code.
* expr.h (emit_cmp_insn, emit_cmp_and_jump_insns): Alignment unsigned.
* function.c (purge_addressof_1): Pass bit align to store_bit_field.
(assign_parms): Likewise to emit_group_store.
* optbas.c (prepare_cmp_insn): Alignment is in bits.
(emit_cmp_and_jump_insns, emit_cmp_insn): Likewise, and also unsigned.
* stmt.c (expand_value_return): Pass align in bits to emit_group_load.
(expand_return): Likewise to {extract,store}_bit_field.
* stor-layout.c (get_mode_alignment): Minor cleanup.
* config/rs6000/rs6000.h (SLOW_UNALIGNED_ACCESS): Align is in bits.
* config/sh/sh.h (MOVE_BY_PIECES_P): Likewise.
* ch/expr.c (chill_expand_expr): Pass bit alignment to emit_block_move.
From-SVN: r32827
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r-- | gcc/expmed.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c index 25f1958..07e9e82 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -947,7 +947,7 @@ store_split_bit_field (op0, bitsize, bitpos, value, align) TMODE is the mode the caller would like the value to have; but the value may be returned with type MODE instead. - ALIGN is the alignment that STR_RTX is known to have, measured in bytes. + ALIGN is the alignment that STR_RTX is known to have. TOTAL_SIZE is the size in bytes of the containing structure, or -1 if varying. @@ -1068,7 +1068,7 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp, || (GET_CODE (op0) == MEM && (! SLOW_UNALIGNED_ACCESS (mode, align) || (offset * BITS_PER_UNIT % bitsize == 0 - && align * BITS_PER_UNIT % bitsize == 0)))) + && align % bitsize == 0)))) && ((bitsize >= BITS_PER_WORD && bitsize == GET_MODE_BITSIZE (mode) && bitpos % BITS_PER_WORD == 0) || (mode_for_size (bitsize, GET_MODE_CLASS (tmode), 0) != BLKmode @@ -1144,9 +1144,8 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp, rtx result_part = extract_bit_field (op0, MIN (BITS_PER_WORD, bitsize - i * BITS_PER_WORD), - bitnum + bit_offset, - 1, target_part, mode, word_mode, - align, total_size); + bitnum + bit_offset, 1, target_part, mode, + word_mode, align, total_size); if (target_part == 0) abort (); @@ -1262,15 +1261,14 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp, if (GET_MODE (xop0) == BLKmode || (GET_MODE_SIZE (GET_MODE (op0)) > GET_MODE_SIZE (maxmode))) - bestmode = get_best_mode (bitsize, bitnum, - align * BITS_PER_UNIT, maxmode, + bestmode = get_best_mode (bitsize, bitnum, align, maxmode, MEM_VOLATILE_P (xop0)); else bestmode = GET_MODE (xop0); if (bestmode == VOIDmode || (SLOW_UNALIGNED_ACCESS (bestmode, align) - && GET_MODE_SIZE (bestmode) > align)) + && GET_MODE_BITSIZE (bestmode) > align)) goto extzv_loses; /* Compute offset as multiple of this unit, @@ -1400,15 +1398,14 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp, if (GET_MODE (xop0) == BLKmode || (GET_MODE_SIZE (GET_MODE (op0)) > GET_MODE_SIZE (maxmode))) - bestmode = get_best_mode (bitsize, bitnum, - align * BITS_PER_UNIT, maxmode, + bestmode = get_best_mode (bitsize, bitnum, align, maxmode, MEM_VOLATILE_P (xop0)); else bestmode = GET_MODE (xop0); if (bestmode == VOIDmode || (SLOW_UNALIGNED_ACCESS (bestmode, align) - && GET_MODE_SIZE (bestmode) > align)) + && GET_MODE_BITSIZE (bestmode) > align)) goto extv_loses; /* Compute offset as multiple of this unit, @@ -1538,7 +1535,7 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp, and return TARGET, but this is not guaranteed. If TARGET is not used, create a pseudo-reg of mode TMODE for the value. - ALIGN is the alignment that STR_RTX is known to have, measured in bytes. */ + ALIGN is the alignment that STR_RTX is known to have. */ static rtx extract_fixed_bit_field (tmode, op0, offset, bitsize, bitpos, @@ -1565,8 +1562,8 @@ extract_fixed_bit_field (tmode, op0, offset, bitsize, bitpos, includes the entire field. If such a mode would be larger than a word, we won't be doing the extraction the normal way. */ - mode = get_best_mode (bitsize, bitpos + offset * BITS_PER_UNIT, - align * BITS_PER_UNIT, word_mode, + mode = get_best_mode (bitsize, bitpos + offset * BITS_PER_UNIT, align, + word_mode, GET_CODE (op0) == MEM && MEM_VOLATILE_P (op0)); if (mode == VOIDmode) @@ -1759,8 +1756,8 @@ lshift_value (mode, value, bitpos, bitsize) BITSIZE is the field width; BITPOS, position of its first bit, in the word. UNSIGNEDP is 1 if should zero-extend the contents; else sign-extend. - ALIGN is the known alignment of OP0, measured in bytes. - This is also the size of the memory objects to be used. */ + ALIGN is the known alignment of OP0. This is also the size of the + memory objects to be used. */ static rtx extract_split_bit_field (op0, bitsize, bitpos, unsignedp, align) @@ -1779,7 +1776,7 @@ extract_split_bit_field (op0, bitsize, bitpos, unsignedp, align) if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG) unit = BITS_PER_WORD; else - unit = MIN (align * BITS_PER_UNIT, BITS_PER_WORD); + unit = MIN (align, BITS_PER_WORD); while (bitsdone < bitsize) { |