On Wed, Jan 6, 2016 at 10:18 AM, Uros Bizjak <ubiz...@gmail.com> wrote: > On Tue, Jan 5, 2016 at 10:34 PM, Richard Sandiford > <rdsandif...@googlemail.com> wrote: >> Jakub Jelinek <ja...@redhat.com> writes: >>> On Mon, Jan 04, 2016 at 03:25:48PM -0800, H.J. Lu wrote: >>>> LRA is fine. I should use >>>> >>>> (define_memory_constraint "Bm" >>>> "@internal Vector memory operand." >>>> (match_operand 0 "vector_memory_operand")) >>>> >>>> instead of >>>> >>>> (define_constraint "Bm" >>>> "@internal Vector memory operand." >>>> (match_operand 0 "vector_memory_operand")) >>> >>> I don't think so. At least the documentation says that >>> define_memory_constraint is for MEM constraints where if they are not >>> satisfied they can be made to satisfy by forcing the address into a >>> register. But that is not the case here, if a MEM is misaligned, no >>> equivalent changes to the XEXP (mem, 0) will make it aligned. >> >> Yeah. It seems like a missing feature though. Maybe >> define_memory_constraint should have two conditions, one for >> when the MEM is valid and one for when the address is? >> Guess that isn't stage 3 material though. And maybe longer-term >> we should avoid define_memory_constraint altogether and have an >> automatic way of testing whether replacing the address with a >> register is OK.
If we are going in this direction, is it possible to make define_memory_constraint more general, so it would return register class, not only default BASE_REG_CLASS? Some x86_64 instructions can use only non-REX registers (including registers in the address) when high registers (%ah, %dh, %ch and %bh) are involved. Uros.