Thanks for explaining. I see, cmove is well designed for such cases.

Pan

-----Original Message-----
From: Uros Bizjak <ubiz...@gmail.com> 
Sent: Wednesday, June 5, 2024 4:46 PM
To: Li, Pan2 <pan2...@intel.com>
Cc: Richard Biener <richard.guent...@gmail.com>; gcc-patches@gcc.gnu.org; 
juzhe.zh...@rivai.ai; kito.ch...@gmail.com; tamar.christ...@arm.com
Subject: Re: [PATCH v1] Internal-fn: Support new IFN SAT_SUB for unsigned 
scalar int

On Wed, Jun 5, 2024 at 10:38 AM Li, Pan2 <pan2...@intel.com> wrote:
>
> > I see. x86 doesn't have scalar saturating instructions, so the scalar
> > version indeed can't be converted.
>
> > I will amend x86 testcases after the vector part of your patch is committed.
>
> Thanks for the confirmation. Just curious, the .SAT_SUB for scalar has sorts 
> of forms, like a branch version as below.
>
> .SAT_SUB (x, y) = x > y ? x - y : 0. // or leverage __builtin_sub_overflow 
> here
>
> It is reasonable to implement the scalar .SAT_SUB for x86? Given somehow we 
> can eliminate the branch here.

x86 will emit cmove in the above case:

       movl    %edi, %eax
       xorl    %edx, %edx
       subl    %esi, %eax
       cmpl    %edi, %esi
       cmovnb  %edx, %eax

Maybe we can reuse flags from the subtraction here to avoid the compare.

Uros.

Reply via email to