adding movz to machine description
Rask Ingemann Lambertsen
rask@sygehus.dk
Tue Jul 25 18:25:00 GMT 2006
On Fri, Jul 07, 2006 at 04:25:08PM +0200, Petar Bajic wrote:
> but my "movz" look like this
>
> if (c == 0)
> a = b;
>
> or asm: movz r1, r2, r3 ;; ((if r3 == 0, move r2 to r1))
>
> there is no 'else' branch.
There _is_ an 'else' branch:
if (r3 == 0)
r1 = r2;
else
r1 = r1;
With that, the insn definition is easy enough:
(define_insn "*movz"
[(set (match_operand:SI 0 "register_operand" "=d")
(if_then_else (eq (match_operand:SI 1 "register_operand" "d")
(const_int 0))
(match_operand:SI 2 "register_operand" "d")
(match_operand:SI 3 "register_operand" "0")))]
""
"movz\t%0, %2, %1"
)
This is not all that different from the "*movsicc_noc" pattern in i386.md.
You may want to add a reverse conditional pattern too, i.e. with (ne ...)
instead of (eq ...) and operands 2 and 3 swapped.
As for the expander, I don't know enough of our target machine to write one,
and I'm not sure you need one. Passes such as combine, ce1, ce2 and ce3 may
create "*movz".
Having read the rest of the thread, I suggest you reread the documentation
about define_expand, in particular the description of the DONE and FAIL
macros for the preparation statements and how they affect the generation of
the RTL template.
--
Rask Ingemann Lambertsen
More information about the Gcc-help
mailing list