Porting question: define_expand Vs define_split
Daniel Jacobowitz
drow@false.org
Wed Nov 3 16:52:00 GMT 2004
On Wed, Nov 03, 2004 at 12:11:13PM +0530, Balaji S wrote:
> Hi all,
> I am porting GCC to a new architecture using stormy16 as base.
>
> In my architecture there is no instruction for /neg/ operation. So i
> planned to handle it using /sub/. I am able to accomplish this job by using
> either define_expand or define_split without knowing its internals as
> follows:
>
> (define_expand "neghi2"
> [(set (match_operand:HI 0 "register_operand" "")
> (const_int 0))
> (set (match_dup 0)
> (minus:HI (match_dup 0)
> (match_operand:HI 1 "register_operand" "")))]
> ""
> "")
>
> (define_insn_and_split "neghi2"
> [(set (match_operand:HI 0 "register_operand" "=r")
> (neg:HI (match_operand:HI 1 "register_operand" "0")))]
> ""
> "#"
> "reload_completed"
> [(set (match_dup 0)
> (const_int 0))
> (set (match_dup 0)
> (minus:HI (match_dup 0)
> (match_dup 1)))]
> "")
>
> I do not know whether the above m/c descriptions are correct. Please
> correct me if any mistakes.
The splitter is not correct. You have constrained the input and output
to be in the same register, and are overwriting that register with 0.
The constraints would have to be "=&r" and "r".
--
Daniel Jacobowitz
More information about the Gcc
mailing list