pattern "s<code>_<mode>" not used when generating rtl for float comparison on mips?
Paolo Bonzini
bonzini@gnu.org
Tue Apr 27 13:12:00 GMT 2010
On 04/27/2010 11:42 AM, Amker.Cheng wrote:
> Hi :
> There is a pattern "define_insn "s<code>_<mode>"" in mips md file, like
>
> (define_insn "s<code>_<mode>"
> [(set (match_operand:CC 0 "register_operand" "=z")
> (swapped_fcond:CC (match_operand:SCALARF 1 "register_operand" "f")
> (match_operand:SCALARF 2 "register_operand" "f")))]
> ""
> "c.<swapped_fcond>.<fmt>\t%Z0%2,%1"
> [(set_attr "type" "fcmp")
> (set_attr "mode" "FPSW")])
>
> I am wondering whether this insn pattern would ever be used when generating
> float comparison, Since we use cmp<mode> and branch expand to do the job
> And comparison operation are normally followed by a branch.
> Am i right?
You can get the RTL for these patterns when expanding stores like
a = (b < c);
In this case, GCC tries to avoid a conditional branch and (I suppose you
are on GCC <4.5) instead of cmp<mode> and b<cond> you go through
cmp<mode> and s<cond>. cmp<mode> does nothing but stashing away its
operands, while s<cond> expands RTL for both the comparison and the
above insn.
For GCC >=4.5 there is no cmp<mode> anymore, and branches and store go
through cbranch<mode>4 and cstore<mode>4 respectively. The logic
however is the same, with cstore<mode>4 emitting the RTL for both the
comparison and the conditional store.
Hope this helps,
Paolo
More information about the Gcc
mailing list