movsi on a 16 bit machine

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I am working on a new port for a 16-bit machine.

I have trouble with movsi.

As the machine is 16-bit, movsi cannot be done in one shot. So I split
it into two movhi:

(define_insn_and_split "movsi"
  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,m")
        (match_operand:SI 1 "general_operand" "rim,r"))]
  ""
  "#"
  "reload_completed"
 [(set (match_dup 2)
       (match_dup 3))
  (set (match_dup 4)
       (match_dup 5))]
  {
    operands[2] = simplify_gen_subreg(HImode,operands[0],SImode,0);
    operands[4] = simplify_gen_subreg(HImode,operands[0],SImode,2);
    operands[3] = simplify_gen_subreg(HImode,operands[1],SImode,0);
    operands[5] = simplify_gen_subreg(HImode,operands[1],SImode,2);
  }
)

But there is a problem (rare) when the following case is encountered:

move 4(R0),R0
move 6(R0),R1

Here, the operands considered are:
operand0: R0:R1  (16 bits + 16 bits)
operand1: 4(R0):6(R0)  (16 bits + 16 bits)

this should be moving operand1 into operand0 but operand1 is addressed
by R0 and R0 is modified at first line, so second line is false.

I would like to modify the implementation to fix it but I do not know how.
Please help.

Regards,

Florent.

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux