This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RE: [Ping] [PATCH, 8/10] aarch64: ccmp insn patterns



> -----Original Message-----
> From: Richard Henderson [mailto:rth@redhat.com]
> Sent: Sunday, October 12, 2014 4:12 AM
> To: Zhenqiang Chen; gcc-patches@gcc.gnu.org
> Subject: Re: [Ping] [PATCH, 8/10] aarch64: ccmp insn patterns
> 
> On 09/22/2014 11:45 PM, Zhenqiang Chen wrote:
> > +(define_expand "cbranchcc4"
> > +  [(set (pc) (if_then_else
> > +	      (match_operator 0 "aarch64_comparison_operator"
> > +	       [(match_operand 1 "cc_register" "")
> > +	        (const_int 0)])
> > +	      (label_ref (match_operand 3 "" ""))
> > +	      (pc)))]
> > +  ""
> > +  " ")
> 
> Extra space.

Updated.
 
> > +(define_insn "*ccmp_and"
> > +  [(set (match_operand 6 "ccmp_cc_register" "")
> > +	(compare
> > +	 (and:SI
> > +	  (match_operator 4 "aarch64_comparison_operator"
> > +	   [(match_operand 0 "ccmp_cc_register" "")
> > +	    (match_operand 1 "aarch64_plus_operand" "")])
> > +	  (match_operator 5 "aarch64_comparison_operator"
> > +	   [(match_operand:GPI 2 "register_operand" "r,r,r")
> > +	    (match_operand:GPI 3 "aarch64_ccmp_operand" "r,Uss,Usn")]))
> > +	 (const_int 0)))]
> > +  ""
> > +  {
> > +    return aarch64_output_ccmp (operands, true, which_alternative);
> > +  }
> > +  [(set_attr "type" "alus_sreg,alus_imm,alus_imm")]
> > +)
> > +
> > +(define_insn "*ccmp_ior"
> > +  [(set (match_operand 6 "ccmp_cc_register" "")
> > +	(compare
> > +	 (ior:SI
> > +	  (match_operator 4 "aarch64_comparison_operator"
> > +	   [(match_operand 0 "ccmp_cc_register" "")
> > +	    (match_operand 1 "aarch64_plus_operand" "")])
> > +	  (match_operator 5 "aarch64_comparison_operator"
> > +	   [(match_operand:GPI 2 "register_operand" "r,r,r")
> > +	    (match_operand:GPI 3 "aarch64_ccmp_operand" "r,Uss,Usn")]))
> > +	 (const_int 0)))]
> > +  ""
> > +  {
> > +    return aarch64_output_ccmp (operands, false, which_alternative);
> > +  }
> > +  [(set_attr "type" "alus_sreg,alus_imm,alus_imm")]
> 
> Surely not aarch64_plus_operand for operand 1.  That's a comparison with
> the flags register.  Surely (const_int 0) is the only valid operand there.
> 
> These could be combined with a code iterator, and thus there would be
> exactly one call to aarch64_output_ccmp, and thus inlined.  Although...
> 
> It seems to me that you don't need a function call at all.  How about
> 
> AND
>   "@
>    ccmp\\t%<w>2, %<w>3, %K5, %m4
>    ccmp\\t%<w>2, %<w>3, %K5, %m4
>    ccmn\\t%<w>2, #%n3, %K5, %m4"
> 
> IOR
>   "@
>    ccmp\\t%<w>2, %<w>3, %k5, %M4
>    ccmp\\t%<w>2, %<w>3, %k5, %M4
>    ccmn\\t%<w>2, #%n3, %k5, %M4"
> 
> where 'k' and 'K' are new print_operand codes that output the nzcv (or its
> inverse) integer for the comparison, much like 'm' and 'M' print the name
of
> the comparison.

Updated with a bit change.

+   ccmp\\t%<w>2, %<w>3, %z5, %k4
+   ccmp\\t%<w>2, %<w>3, %z5, %k4
+   ccmn\\t%<w>2, #%n3, %z5, %k4"

z/Z is the k/K as you suggested. I can not reuse m/M since they are special
for cbranchcc (with CCMP). So I use new added k/K.

Thanks!
-Zhenqiang

Attachment: 7-8-ccmp-patterns.patch
Description: Binary data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]