This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Problem with reloading in a new backend...


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 <stelian@popies.net>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]