I've got this code:

(define_insn "andhi3_24"
  [(set (match_operand:HI 0 "mra_operand" 
"=Sd,Sd,*Rhl,*Rhl,RhiSd,??Rmm,RhiSd,??Rmm")
        (and:HI (match_operand:HI 1 "mra_operand" "%0,0,*0,*0,0,0,0,0")
                (match_operand:HI 2 "mrai_operand" 
"Imb,Imw,*Imb,*Imw,iRhiSd,?Rmm,?Rmm,iRhiSd")))]
  "TARGET_A24"
  "@
   bclr\t%B2,%0
   bclr\t%B2-8,1+%0
   bclr\t%B2,%h0
   bclr\t%B2-8,%H0
   and.w\t%X2,%0
   and.w\t%X2,%0
   and.w\t%X2,%0
   and.w\t%X2,%0"
  [(set_attr "flags" "n,n,n,n,sz,sz,sz,sz")]
  )

Originally, the '*' constraints were missing.  It failed:

/greed/dj/ges/gnupro/head/gnupro/gcc/testsuite/gcc.c-torture/execute/pr17133.c: 
In function 'pure_alloc':
/greed/dj/ges/gnupro/head/gnupro/gcc/testsuite/gcc.c-torture/execute/pr17133.c:19:
 error: unable to find a register to spill in class 'HL_REGS'
/greed/dj/ges/gnupro/head/gnupro/gcc/testsuite/gcc.c-torture/execute/pr17133.c:19:
 error: this is the insn:
(insn 31 30 32 6 
/greed/dj/ges/gnupro/head/gnupro/gcc/testsuite/gcc.c-torture/execute/pr17133.c:13
 (set (reg:HI 0 r0 [41])
        (and:HI (subreg:HI (reg/f:PSI 5 a1 [orig:29 bar.0 ] [29]) 0)
            (const_int -2 [0xfffffffe]))) 26 {andhi3_24} (expr_list:REG_DEAD 
(reg/f:PSI 5 a1 [orig:29 bar.0 ] [29])
        (nil)))
/greed/dj/ges/gnupro/head/gnupro/gcc/testsuite/gcc.c-torture/execute/pr17133.c:19:
 internal compiler error: in spill_failure, at reload1.c:2093

I added the '*' constraints to keep it from using HL_REGS class (HL
includes R0 and R1, HI includes R0 through R3) but it seems to be
ignoring them.

If I remove those alternatives completely, the code compiles properly.

How can I get register allocation to use HI_REGS as the allocation
class?

I still want the bclr opcodes to be used *if* the constraints hold.  I
just don't want them to limit register choices.

What am I missing?

Reply via email to