> This patch splits out a fairly common operation: that of narrowing a MEM
> to a particular mode and adjusting the bit number accordingly.
> 
> I've kept with "bit_field" rather than "bitfield" for consistency with
> the callers, although we do have "bitfield" in "adjust_bitfield_address".

My bad.  Feel free to rename it.

> gcc/
>       * expmed.c (narrow_bit_field_mem): New function.
>       (store_bit_field_using_insv, store_bit_field_1, store_fixed_bit_field)
>       (extract_bit_field_1): Use it.

This is a good cleanup but...

> Index: gcc/expmed.c
> ===================================================================
> --- gcc/expmed.c      2012-10-30 19:25:44.797368678 +0000
> +++ gcc/expmed.c      2012-10-30 19:25:47.730368671 +0000
> @@ -387,6 +387,23 @@ mode_for_extraction (enum extraction_pat
>    return data->operand[opno].mode;
>  }
> 
> +/* Adjust bitfield memory MEM so that it points to the first unit of
> +   mode MODE that contains the bitfield at bit position BITNUM.
> +   Set NEW_BITNUM to the bit position of the field within the
> +   new memory.  */
> +
> +static rtx
> +narrow_bit_field_mem (rtx mem, enum machine_mode mode,
> +                   unsigned HOST_WIDE_INT bitnum,
> +                   unsigned HOST_WIDE_INT &new_bitnum)
> +{
> +  unsigned int unit = GET_MODE_BITSIZE (mode);
> +  unsigned HOST_WIDE_INT offset = bitnum / unit * GET_MODE_SIZE (mode);
> +  mem = adjust_bitfield_address (mem, mode, offset);
> +  new_bitnum = bitnum % unit;
> +  return mem;
> +}

Ugh. :-)  I cannot see any advantages in using references here except for...

> +    /* Get a reference to the first byte of the field.  */
> +    xop0 = narrow_bit_field_mem (xop0, byte_mode, bitnum, bitnum);

> +    op0 = narrow_bit_field_mem (op0, byte_mode, bitnum, bitnum);

... mightily confusing the reader here.

-- 
Eric Botcazou

Reply via email to