Le jeudi 10 avril 2008 à 15:48 +0200, Stelian Pop a écrit :
> Le mercredi 09 avril 2008 à 18:21 -0400, DJ Delorie a écrit :
> > > Maybe I should reserve a special register for this usage (say r0).
> >
> > That might be the only way, yes.
>
> Ok, I reserved r0 (BP_REGNUM) for such reloads, and I'm generating new
> instructions in LEGITIMIZE_RELOAD_ADDRESS to calculate the memory
> address:
[...]
Now it seems that the register moves are correctly dealt with, but I'm
still having the same problem on calls: just like indirect addressing,
indirect calls are allowed only on even registers.
My patterns look like:
(define_insn "*icall_value"
[(set (match_operand 0 "register_operand" "=r")
(call (mem:QI (match_operand:QI 1 "register_operand" "z"))
(match_operand:QI 2 "" "")))]
""
"icall (%1)"
[(set_attr "cc" "none")]
)
(define_expand "call_value"
[(set (match_operand 0 "register_operand" "=r")
(call (match_operand:QI 1 "memory_operand" "m")
(match_operand:QI 2 "general_operand" "")))]
""
{
if (GET_CODE (XEXP(operands[1], 0)) != REG)
XEXP(operands[1], 0) = force_reg (QImode, XEXP
(operands[1], 0));
}
)
This gives:
(insn 27 26 29 2 ../../../../src/gcc-4.3.0/libgcc/../gcc/libgcc2.c:564
(set (reg/f:QI 114)
(symbol_ref:QI ("__lshrqi3") [flags 0x41])) 1 {*movqi}
(expr_list:REG_EQUIV (symbol_ref:QI ("__lshrqi3") [flags 0x41])
(nil)))
...
(call_insn/u 30 29 31 2
../../../../src/gcc-4.3.0/libgcc/../gcc/libgcc2.c:564 (set (reg:QI 4 r4)
(call (mem:QI (reg/f:QI 114) [0 S1 A16])
(const_int 0 [0x0]))) 37 {*icall_value} (expr_list:REG_DEAD
(reg:QI 5 r5)
(expr_list:REG_EH_REGION (const_int -1 [0xffffffff])
(nil)))
(expr_list:REG_DEP_TRUE (use (reg:QI 5 r5))
(expr_list:REG_DEP_TRUE (use (reg:QI 4 r4 [ D.2373 ]))
(nil))))
And r114 gets reloaded into r1:
Reloads for insn # 30
Reload 0: reload_in (QI) = (symbol_ref:QI ("__lshrqi3") [flags 0x41])
EIGHT_REGS, RELOAD_FOR_INPUT (opnum = 1), can't combine
reload_in_reg: (reg/f:QI 114)
reload_reg_rtx: (reg:QI 1 r1)
Which does not satisfy the *icall_value constraints:
../../../../src/gcc-4.3.0/libgcc/../gcc/libgcc2.c: In function
‘__mulhi3’:
../../../../src/gcc-4.3.0/libgcc/../gcc/libgcc2.c:570: error: insn does
not satisfy its constraints:
(call_insn/u 30 195 162 2
../../../../src/gcc-4.3.0/libgcc/../gcc/libgcc2.c:564 (set (reg:QI 4 r4)
(call (mem:QI (reg:QI 1 r1) [0 S1 A16])
(const_int 0 [0x0]))) 37 {*icall_value}
(expr_list:REG_EH_REGION (const_int -1 [0xffffffff])
(nil))
(expr_list:REG_DEP_TRUE (use (reg:QI 5 r5))
(expr_list:REG_DEP_TRUE (use (reg:QI 4 r4 [ D.2373 ]))
(nil))))
It seems that this reload doesn't pass through LEGITIMIZE_ADDRESS or
LEGITIMIZE_RELOAD_ADDRESS... How can I specify here to choose an EVEN_REGS
in place of the EIGHT_REGS (in fact it should choose one register in the
intersection of EIGHT and EVEN_REGS) ?
Thanks,
--
Stelian Pop <[EMAIL PROTECTED]>