> -----Original Message----- > From: Richard Henderson [mailto:r...@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
7-8-ccmp-patterns.patch
Description: Binary data