}
/* A subroutine of extract_bit_field, with the same arguments.
+ If UNSIGNEDP is -1, the result need not be sign or zero extended.
If FALLBACK_P is true, fall back to extract_fixed_bit_field
if we can find no other means of implementing the operation.
if FALLBACK_P is false, return NULL instead. */
rtx result_part
= extract_bit_field_1 (op0, MIN (BITS_PER_WORD,
bitsize - i * BITS_PER_WORD),
- bitnum + bit_offset, 1, target_part,
+ bitnum + bit_offset,
+ (unsignedp ? 1 : -1), target_part,
mode, word_mode, reverse, fallback_p, NULL);
gcc_assert (target_part);
/* Helper function for extract_fixed_bit_field, extracts
the bit field always using MODE, which is the mode of OP0.
+ If UNSIGNEDP is -1, the result need not be sign or zero extended.
The other arguments are as for extract_fixed_bit_field. */
static rtx
/* Unless the msb of the field used to be the msb when we shifted,
mask out the upper bits. */
- if (GET_MODE_BITSIZE (mode) != bitnum + bitsize)
+ if (GET_MODE_BITSIZE (mode) != bitnum + bitsize
+ && unsignedp != -1)
return expand_binop (new_mode, and_optab, op0,
mask_rtx (new_mode, 0, bitsize, 0),
target, 1, OPTAB_LIB_WIDEN);