hello,
    there is a 'movm' problem that puzzled me. In my target machine,
to load a large immediate data, can only move into zero register "R0".
but R0 is a generally register. I defined the the way in the
following:

    if the immediate data (op1) is larger than 1024
     then do
     {
         emit_move_insn(r0_reg_rtx, gen_rtx_CONST_INT(SImode, op1));
//Move the immediate data into R0 register
         emit_move_insn(force_reg (mode, operands[0]), r0_reg_rtx);
                              //move  r0 to default register.
     }

    I have tested the way , it works. But while in optimization, it
causes some redundency codes. like the following c code,(iFrequency is
byte globel data, common_reg, DiffReg are byte globel arrays)

        int i = 0;
        BYTE*   pDiffPair = common_reg + (COMMON_REG_WRITE << 1), *pData = 
DiffReg;
        
               *(pDiffPair + 1) = *(pData + iFrequency);

        pData = pData + 36;

        *(pDiffPair + 5) = *(pData + iFrequency);

        pData = pData + 36;

        *(pDiffPair + 7) = *(pData + iFrequency);

        pData = pData + 36;

        *(pDiffPair + 11) = *(pData + iFrequency);

        pData = pData + 36;     

                *(pDiffPair + 15) = *(pData + iFrequency);

        pData = pData + 36;

        *(pDiffPair + 17) = *(pData + iFrequency);

     the address label "common_reg " used many times. I think it will
load one time. But after optimized with '-Os' or '-O2', it still loads
the label "common_reg " six times..
     I guess it definitely caused  by  "move large immediate" insns.
     I don't know how to solve this problem.
     Does the macro "PREFERRED_RELOAD_CLASS" handle it?
     Any advice is appreciated.
     Thank you very much.



    daniel.tian

Reply via email to