From 0cd9e9eeeadf90b732ed7bbad30739d1b0d9128b Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Tue, 4 Jun 2013 07:41:18 +0000 Subject: [PATCH] expmed.c (extract_bit_field_1): In the larger-than-a-word case... * expmed.c (extract_bit_field_1): In the larger-than-a-word case, factor out the processing order as in store_bit_field_1. From-SVN: r199637 --- gcc/ChangeLog | 7 ++++++- gcc/expmed.c | 12 +++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f3ef8a074bb..cae512a705b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2013-06-04 Eric Botcazou + + * expmed.c (extract_bit_field_1): In the larger-than-a-word case, factor + out the processing order as in store_bit_field_1. + 2013-06-04 Jan Hubicka PR middle-end/57500 @@ -33,7 +38,7 @@ 2013-06-03 Jakub Jelinek PR rtl-optimization/57268 - * sched-deps.c (sched_analyze_2): Don't flush_pedning_lists + * sched-deps.c (sched_analyze_2): Don't flush_pending_lists if DEBUG_INSN_P (insn). Reapply diff --git a/gcc/expmed.c b/gcc/expmed.c index daadd3def5d..79f3424961d 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -1486,6 +1486,7 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, This is because the most significant word is the one which may be less than full. */ + unsigned int backwards = WORDS_BIG_ENDIAN; unsigned int nwords = (bitsize + (BITS_PER_WORD - 1)) / BITS_PER_WORD; unsigned int i; rtx last; @@ -1503,13 +1504,14 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, if I is 1, use the next to lowest word; and so on. */ /* Word number in TARGET to use. */ unsigned int wordnum - = (WORDS_BIG_ENDIAN + = (backwards ? GET_MODE_SIZE (GET_MODE (target)) / UNITS_PER_WORD - i - 1 : i); /* Offset from start of field in OP0. */ - unsigned int bit_offset = (WORDS_BIG_ENDIAN - ? MAX (0, ((int) bitsize - ((int) i + 1) - * (int) BITS_PER_WORD)) + unsigned int bit_offset = (backwards + ? MAX ((int) bitsize - ((int) i + 1) + * BITS_PER_WORD, + 0) : (int) i * BITS_PER_WORD); rtx target_part = operand_subword (target, wordnum, 1, VOIDmode); rtx result_part @@ -1541,7 +1543,7 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, for (i = nwords; i < total_words; i++) emit_move_insn (operand_subword (target, - WORDS_BIG_ENDIAN ? total_words - i - 1 : i, + backwards ? total_words - i - 1 : i, 1, VOIDmode), const0_rtx); } -- 2.30.2