On 11/20/2012 11:24 AM, Richard Henderson wrote:
> On 11/20/2012 09:29 AM, Richard Sandiford wrote:
>> Gah.  How about this patch, currently bootstrapping on x86_64-linux-gnu
>> as a sanity check?  The last instance seems glaringly obvious in
>> hindsight :-(
>>
>> Richard
>>
>>
>> gcc/
>>      * expmed.c (store_bit_field_1): Use adjust_bitfield_address_size
>>      rather than adjust_bitfield_address to change the mode of a reference.
>>      (extract_bit_field_1): Likewise.
> 
> That patch does fix my ICE.
> 
> It looks all good, too.  As you say, glaringly obvious even.  ;-)

One further point -- get_best_mem_extraction_insn does not work for
the traditional 'extv' patterns that only accept memories.  In
particular, the QImode memory in the extv pattern never matches up
at the beginning of get_traditional_extraction_insn, so that first
"if (mode != struct_mode) return false;" always triggers.

I audited the existing extv patterns and the affected targets are
alpha, sh, and vax.  All of the others implement extv on registers,
which appears to work.  Test case:

struct S { long y __attribute__((packed)); };
long g(struct S *s) { return s->y; }

Before:

        ldq_u $0,0($16)
        ldq_u $1,7($16)
        extql $0,$16,$0
        extqh $1,$16,$16
        bis $0,$16,$0

After:

        ldbu $5,1($16)
        ldbu $8,0($16)
        ldbu $7,2($16)
        ldbu $6,3($16)
        ldbu $4,4($16)
        ldbu $3,5($16)
        sll $5,8,$5
        ldbu $2,6($16)
        ldbu $1,7($16)
        sll $7,16,$7
        sll $6,24,$6
        bis $5,$8,$5
        sll $4,32,$4
        sll $3,40,$3
        bis $7,$5,$5
        sll $2,48,$2
        sll $1,56,$1
        bis $6,$5,$0
        bis $4,$0,$0
        bis $3,$0,$0
        bis $2,$0,$0
        bis $1,$0,$0

I suppose the question is: with only 3 affected targets, is it more
trouble fiddling the somewhat confused "traditional" path, or to
just go ahead and update the backends?


r~

Reply via email to