> -----Original Message-----
> From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches-
> ow...@gcc.gnu.org] On Behalf Of Richard Henderson
> Sent: Monday, October 27, 2014 11:47 PM
> To: Zhenqiang Chen
> Cc: gcc-patches@gcc.gnu.org
> Subject: Re: [Ping] [PATCH, 8/10] aarch64: ccmp insn patterns
> 
> On 10/27/2014 12:49 AM, Zhenqiang Chen wrote:
> > +  {AARCH64_CC_Z, 0}, /* EQ, Z == 1.  */  {0, AARCH64_CC_Z}, /* NE, Z
> > + == 0.  */  {AARCH64_CC_C, 0}, /* CS, C == 1.  */  {0, AARCH64_CC_C},
> > + /* CC, C == 0.  */  {0, 0}, /* MI, not supported*/  {0, 0}, /* PL,
> > + not supported*/  {0, 0}, /* VS, not supported*/  {0, 0}, /* VC, not
> > + supported*/
> 
> Why not go ahead and fill out the table?  You know what needs to go in
these
> slots, after all.

Updated.

> > +  {AARCH64_CC_C, AARCH64_CC_Z}, /* HI, C ==1 && Z == 0.  */
> > + {AARCH64_CC_Z, AARCH64_CC_C}, /* LS, !(C == 1 && Z == 0).  */
> > + {AARCH64_CC_N | AARCH64_CC_V, AARCH64_CC_N}, /* GE, N == V.  */
> > + {AARCH64_CC_N, AARCH64_CC_N | AARCH64_CC_V}, /* LT, N != V.  */
> > + {AARCH64_CC_N | AARCH64_CC_V, AARCH64_CC_Z}, /* GT, Z == 0 && N
> ==
> > + V.  */  {AARCH64_CC_Z, AARCH64_CC_N | AARCH64_CC_V}, /* LE, !(Z ==
> 0
> > + && N == V).  */
> 
> Perhaps it's me, but does it make things clearer to reduce these?
> That is, for the compound conditions, we need not make both sub-conditions
> be false, only one of them.  E.g.
> 
>   {AARCH64_CC_C, 0}           /* HI, C ==1 && Z == 0.  */
>   {0, AARCH64_CC_C}           /* LS, !(C ==1 && Z == 0) */
>   {0, AARCH64_CC_V}           /* GE, N == V */
>   {AARCH64_CC_V, 0}           /* LT, N != V */
>   {0, AARCH64_CC_Z}           /* GT, Z == 0 && N == V */
>   {AARCH64_CC_Z, 0}           /* LE, !(Z == 0 && N == V) */
> 
> At which point it becomes blindingly obvious that while we can't compress
> the table with ~nczv, we can index it with reverse_comparison instead.

Updated.

> > +    case 'k':
> > +      {
> > +   int cond_code;
> > +   rtx op0 = XEXP (x, 0);
> > +   enum rtx_code mode_code;
> > +   /* Print a condition (eq, ne, etc) of ccmp.  */
> > +
> > +   if (!COMPARISON_P (x) || !ccmp_cc_register (op0, GET_MODE
> (op0)))
> > +     {
> > +       output_operand_lossage ("invalid operand for '%%%c'", code);
> > +       return;
> > +     }
> > +
> > +   mode_code = aarch64_ccmp_mode_to_code (GET_MODE (op0));
> > +   cond_code = aarch64_get_condition_code_1 (CCmode, mode_code);
> > +   gcc_assert (cond_code >= 0);
> > +   fputs (aarch64_condition_codes[cond_code], f);
> > +      }
> 
> Is there a branch with all the patches applied?  I can't look back at the
> modified aarch64_get_condition_code_1, but off-hand I can't think of
> why %m/%M wouldn't work.  Surely

It's my fault. %m/%M work well in the new patch.

And I add a check 

aarch64_ccmp_mode_to_code (GET_MODE (operands[1])) == GET_CODE (operands[5])

on the patterns to make sure that the compare and CC mode are aligned.

Thanks!
-Zhenqiang

 
>   aarch64_get_condition_code_1 (GET_MODE (op0), GET_CODE (x))
> 
> will yield the correct cond_code.  If it didn't, then surely branches
wouldn't
> work at all.
> 
> These are not some magic new kind of conditions; they're exactly the same.
> 
> 
> r~

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

Reply via email to