a little mistake: ofcourse the desired code is:

ldi r24, 0x01 ; 1
sts 0x00F7, __zero_reg__
sts 0x00F6, r24

and not the one posed earlier.

On Thu, May 19, 2011 at 12:18 PM, Ilya Lesokhin <ilya.lesok...@gmail.com>wrote:

>  Hi,
>
> I would like to split a movhi instruction from an immediate to a const
> address to 2 movqi instructions.
> (I'm using gcc 4.5.3 but i dont think it matters in this case)
>
>  My motivation is the following:
> Code in the form:
> OCR2RA = 1;
>
> compiles to:
>
> ldi r24, 0x01 ; 1
> ldi r25, 0x00 ; 0
> sts 0x00F7, r25
> sts 0x00F6, r24
>
> instead of
>
> ldi r24, 0x01 ; 1
> ldi r25, 0x00 ; 0
> sts 0x00F7, r25
> sts 0x00F6, __zero_reg__
>
> I'm pretty sure its caused by the following code:
>
> (define_expand "movhi"
>
> [(set (match_operand:HI 0 "nonimmediate_operand" "")
>
> (match_operand:HI 1 "general_operand" ""))]
>
> ""
>
> "
>
> {
>
>  /* One of the ops has to be in a register. */
>
> if (!register_operand(operand0, HImode)
>
> && !(register_operand(operand1, HImode) || const0_rtx == operands[1]))
>
> {
>
> operands[1] = copy_to_mode_reg(HImode, operand1);
>
> }
>
> }")
>
>
>
> i would like to fix it but i know very little about gcc internals.
>
>
>
> i tried to do something like:
>
> (define_expand "movhi"
>
> [(set (match_operand:HI 0 "nonimmediate_operand" "")
>
> (match_operand:HI 1 "general_operand" ""))]
>
> ""
>
> "
>
> {
>
> rtx base = XEXP (operands[0], 0);
>
> if (GET_CODE (operands[1]) == CONST_INT
>
> && CONSTANT_ADDRESS_P (base))
>
> {
>
> short value = INTVAL (operands[1]);
>
> short address = INTVAL (base);
>
> emit_move_insn(gen_rtx_MEM(QImode,address+1), GEN_INT(value >> 8));
>
> emit_move_insn(gen_rtx_MEM(QImode,address), GEN_INT(value & 0xff));
>
> DONE;
>
> }
>
> else /* One of the ops has to be in a register. */
>
> if (!register_operand(operand0, HImode)
>
> && !(register_operand(operand1, HImode) || const0_rtx == operands[1]))
>
> {
>
> operands[1] = copy_to_mode_reg(HImode, operand1);
>
> }
>
> }")
>
> but then i get Segmentation fault when trying to compile code.
>
> Can someone please point me to the right direction?
>
> Thank,
>
> Ilya.
>
_______________________________________________
AVR-GCC-list mailing list
AVR-GCC-list@nongnu.org
https://lists.nongnu.org/mailman/listinfo/avr-gcc-list

Reply via email to