On 20 December 2010 10:56, Jeff Law <l...@redhat.com> wrote:
> On 12/15/10 07:14, Mohamed Shafi wrote:
>>
>> Hi,
>>
>> I am doing a port in GCC 4.5.1.
>> The target supports storing immediate values into memory location
>> represented by a symbolic address. So in the move pattern i have given
>> constraints to represent this.
>
> Presumably the target does not support storing an immediate value into other
> MEMs?  ie, the only store-immediate is to a symbolic memory operand, right?
>

    yes you are right.

> I think this is a case where you're going to need a secondary reload to
> force the immediate into a register if the destination is a non-symbolic MEM
> or a pseudo without a hard reg and its equivalent address is non-symbolic.
>
    I am not sure how i should be implementing this.
    Currently in define_expand for move i have code to force the
immediate value into a register if the destination is not a symbolic
address. If i understand correctly this is the only place where i can
decide what to do with the source depending on the destination. right?

Moreover for the pattern

(insn 27 25 33 4 pr23848-3.c:12 (set (mem/s/j:QI (reg/f:PQI 12 as0
[69]) [0 S1 A32])
       (reg:QI 93)) 7 {movqi_op} (expr_list:REG_DEAD (reg/f:PQI 12 as0 [69])
       (expr_list:REG_EQUAL (const_int 0 [0x0])
           (nil))))

destination is the src operand gets converted by

          /* This is equivalent to calling find_reloads_toplev.
             The code is duplicated for speed.
             When we find a pseudo always equivalent to a constant,
             we replace it by the constant.  We must be sure, however,
             that we don't try to replace it in the insn in which it
             is being set.  */
          int regno = REGNO (recog_data.operand[i]);
          if (reg_equiv_constant[regno] != 0
              && (set == 0 || &SET_DEST (set) != recog_data.operand_loc[i]))
            {
              /* Record the existing mode so that the check if constants are
                 allowed will work when operand_mode isn't specified.  */

              if (operand_mode[i] == VOIDmode)
                operand_mode[i] = GET_MODE (recog_data.operand[i]);

              substed_operand[i] = recog_data.operand[i]
                = reg_equiv_constant[regno];
            }

and since the destination is already selected for reload

                        /* If the address was already reloaded,
                           we win as well.  */
                        else if (MEM_P (operand)
                                 && address_reloaded[i] == 1)
                          win = 1;

the reload phase never reaches secondary reload.
So i do not understand your answer. Could you explain it briefly.

Regards,
Shafi

Reply via email to