Mohamed Shafi wrote:

> The restriction is that if the base
> register is not Stack Pointer then this kind of address cannot come in
> a load instruction but only in store instruction.
> 
>  To implement this i added constrains for all supported memory
> operations in QImode. So the pattern is as follows
> 
> (define_insn "movqi"
>   [(set (match_operand:QI 0 "nonimmediate_operand"
>              "=b,b,d,t,d, b,Ss0, Ss1, a,Se1,  Sb2,  b,Sd3,  d,Se0")
>         (match_operand:QI 1 "general_operand"
>               "I,L,d,d,t, Ss0,b,  b,  Se1,a,  b,    Sd3,b,  Se0,d"))]
> 
> where
> d is data registers
> a is address registers
> b is data and address registers
> Sb2 is Rn + offset addressing mode
> Sd3 is SP + offset addressing mode
> 
> Se0 - (Rn), (Rn)+, (Rn)-, (Rn + Ri) and Post modify register addressing mode
> Se1 - Se0 excluding Post modify register addressing mode
> 
> I believe that there are enough combinations available for the reload
> to try for alternate addressing mode if it encounters the restrictive
> addressing mode. But I am still getting the following error
> 
> main1.c:11: error: insn does not satisfy its constraints:
> (insn 30 29 7 2 main1.c:9 (set (reg:QI 2 d2 [orig:61 <variable>.a+1 ] [61])
>         (mem/s/j:QI (plus:SI (reg:SI 16 r0)
>                 (const_int 1 [0x1])) [0 <variable>.a+1 S1 A8])) 41
> {movqi} (nil))
> main1.c:11: internal compiler error: in reload_cse_simplify_operands,
> at postreload.c:396

  This approach can't work.  There has to be a combination of constraints to
accept any and every combination of operands permitted by the predicates
"nonimmediate_operand" and "general_operand".  Since neither of these exclude
base registers beside the SP, they make it through to recog which punts when
it can't find a which_alternative set to use.  In this case general_operand
has allowed an operand of type (mem (plus (reg) (const)), equivalent to your
Sb2 constraint, but there is no constraint for operand 1 that permits that.

  You can't use constraints to filter the initial selection performed by
predicates.  What I think you need to do is to have a variant version of
general_operand that refuses Sb2 types.

    cheers,
      DaveK

Reply via email to