>         switch (which_alternative) {
>         case 0:                         /* register to register */

Better to just use the @ syntax that gcc offers, to provide multiple
patterns:

        "@
        tfr %0,%1
        ldih %0, hi(%1); ldil %0, lo(%1)
        ldih %0, hi(%1); ldil %0, lo(%1)
        st %1,(%0)
        ld %0,(%1)"

Everything else should have been sorted out by the constraints.

> This seems to work ok, but I still have issues at reload time, because
> of the base register addressing mode: in the reload pass gcc generates
> moves from/to the stack:

You might need to define LEGITIMIZE_RELOAD_ADDRESS, or at least
LEGITIMIZE_ADDRESS.  I don't know if reload has assumptions about such
offsets, but the m32c port has a limit on the offset range so it might
help you figure out your port.

Reply via email to