Hi.

I have problems figuring out why reload gives up on this:

reload failure for reload 1
../../../cvssrc/gcc/gcc/libgcc2.c: In function '__moddi3':
../../../cvssrc/gcc/gcc/libgcc2.c:1101: error: unable to find a register to
spill in class 'DX_REGS'
../../../cvssrc/gcc/gcc/libgcc2.c:1101: error: these are the reloads for
insn # 425:
Reload 0: reload_in (HI) = (reg:HI 4 d [+2 ])
        reload_out (HI) = (reg:HI 0 c [199])
        AX_REGS, RELOAD_OTHER (opnum = 0)
        reload_in_reg: (reg:HI 4 d [+2 ])
        reload_out_reg: (reg:HI 0 c [199])
Reload 1: reload_out (HI) = (scratch:HI)
        DX_REGS, RELOAD_FOR_OUTPUT (opnum = 3)
        reload_out_reg: (scratch:HI)
../../../cvssrc/gcc/gcc/libgcc2.c:1101: error: this is the insn:
(insn 425 422 432 30 ../../../cvssrc/gcc/gcc/libgcc2.c:911 (parallel [
            (set (reg:HI 0 c [199])
                (mult:HI (reg:HI 4 d [+2 ])
                    (reg:HI 6 b [orig:629 __d0 ] [629])))
            (clobber (scratch:HI))
            (clobber (reg:CC 12 cc))
        ]) 309 {*mulhi3} (nil)
    (expr_list:REG_UNUSED (reg:CC 12 cc)
        (expr_list:REG_UNUSED (scratch:HI)
            (expr_list:REG_DEAD (reg:HI 4 d [+2 ])
                (expr_list:REG_UNUSED (reg:CC 12 cc)
                    (expr_list:REG_UNUSED (scratch:HI)
                        (nil)))))))
../../../cvssrc/gcc/gcc/libgcc2.c:1101: internal compiler error: in
spill_failure, at reload1.c:1915

The *mulhi3 pattern is this:
(define_insn "*mulhi3"
        [(set (match_operand:HI 0 "single_register_operand" "=a")
              (mult:HI (match_operand:HI 1 "single_register_operand" "%0")
                       (match_operand:HI 2 "general_operand" "rm")))
         (clobber (match_scratch:HI 3 "=d"))
         (clobber (reg:CC CC_REG))]
        ""
        "mulw\t%2"
)

where the constraint "a" matches the register class AX_REGS consiting of
(reg:HI 2 a), the constraint "d" matches the register class DX_REGS
consiting of (reg:HI 4 d) and the predicate "single_register_operand" is:

(define_predicate "single_register_operand"
        (and (match_operand 0 "register_operand")
             (ior (not (match_code "subreg"))
                  (match_test "GET_MODE_SIZE (GET_MODE (SUBREG_REG (op)))
                               <= UNITS_PER_WORD")))
)

In other words, like "register_operand" register but reject subregs of
registers larger than a word - 16 bits.

The insn seems perfectly possible to reload:
(set (mem:HI stack-slot-d) (reg:HI 4 d))
(set (mem:HI stack-slot-a) (reg:HI 2 a))
(set (reg:HI 2 a) (mem:HI stack-slot-d))

(parallel [(set (reg:HI 2 a)
                (mult:HI (reg:HI 2 a) (reg:HI 6 b)))
           (clobber (reg:HI 4 d))
           (clobber (reg:CC CC_REG))]

(set (reg:HI 0 c) (reg:HI 2 a))
(set (reg:HI a) (mem:HI stack-slot-a))
(set (reg:HI d) (mem:HI stack-slot-d))

What am I missing?

-- 
Rask Ingemann Lambertsen

Reply via email to