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]

Volatile memory move


Hi,

I am running into trouble with a volatile memory move on my port of GCC4.4.4. The code is:
int main(void)
{
register volatile float sc = 1E35;


  if(sc < 1.000050000e35)
    return 1;
  return 0;
}

The very first part of this code is being expanded as:

;; sc ={v} 1.0000000409184787596297531937521664e+35;

(insn 5 4 6 vol.c:3 (set (reg/f:QI 20)
        (symbol_ref/u:QI ("*?LC0") [flags 0x2])) -1 (nil))

(insn 6 5 7 vol.c:3 (set (reg:QI 1 AL)
        (mem/u/c/i:QI (plus:QI (reg/f:QI 20)
                (const_int 1 [0x1])) [2 S1 A16])) -1 (nil))

(insn 7 6 8 vol.c:3 (set (reg:QI 0 AH)
        (mem/u/c/i:QI (reg/f:QI 20) [2 S1 A16])) -1 (nil))

(insn 8 7 9 vol.c:3 (set (mem/v/c/i:QI (plus:QI (reg/f:QI 14 virtual-stack-vars)
(const_int 1 [0x1])) [2 sc+1 S1 A16])
(reg:QI 1 AL)) -1 (nil))


(insn 9 8 0 vol.c:3 (set (subreg:QI (mem/v/c/i:HI (reg/f:QI 14 virtual-stack-vars) [2 sc+0 S2 A16]) 0)
(reg:QI 0 AH)) -1 (nil))



Now, the problem with this comes with insn 9 that has a subreg:QI of a mem:HI it seems. The raw move we are trying to do is:
(set (mem/v/c/i:HI (reg/f:QI 14 virtual-stack-vars) [2 sc+0 S2 A16])
(mem/u/c/i:HI (reg/f:QI 20) [2 S2 A16]))


To do this we need to go through two QImode registers AL and AH and I have as part of my port:
emit_move_insn(gen_rtx_REG(QImode, RAL), gen_lowpart(QImode, operands[1]));
emit_move_insn(gen_rtx_REG(QImode, RAH), gen_highpart(QImode, operands[1]));
emit_move_insn(gen_lowpart(QImode, operands[0]), gen_rtx_REG(QImode, RAL));
emit_move_insn(gen_highpart(QImode, operands[0]), gen_rtx_REG(QImode, RAH));



The problem here comes with gen_lowpart and gen_highpart applied to: (mem/v/c/i:HI (reg/f:QI 14 virtual-stack-vars) [2 sc+0 S2 A16])

gen_lowpart generates: (mem/v/c/i:QI (plus:QI (reg/f:QI 14 virtual-stack-vars)(const_int 1 [0x1]))

but gen_highpart generates:
(subreg:QI (mem/v/c/i:HI (reg/f:QI 14 virtual-stack-vars) [2 sc+0 S2 A16]) 0)



Why is that? Any suggestion on solving this situation?


Cheers,

Paulo Matos


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