> OK.  Sorry for the delays here.  I wanted to make sure we had the issues 
> WRT operand extension resolved before diving into this.  But in 
> retrospect, this probably could have moved forward independently.

That make much sense to me, thanks a lot.

Pan

-----Original Message-----
From: Jeff Law <jeffreya...@gmail.com> 
Sent: Sunday, August 18, 2024 2:21 AM
To: Li, Pan2 <pan2...@intel.com>; gcc-patches@gcc.gnu.org
Cc: juzhe.zh...@rivai.ai; kito.ch...@gmail.com; rdapp....@gmail.com
Subject: Re: [PATCH v1] RISC-V: Implement the quad and oct .SAT_TRUNC for scalar



On 7/22/24 11:06 PM, pan2...@intel.com wrote:
> From: Pan Li <pan2...@intel.com>
> 
> This patch would like to implement the quad and oct .SAT_TRUNC pattern
> in the riscv backend. Aka:
> 
> Form 1:
>    #define DEF_SAT_U_TRUC_FMT_1(NT, WT)     \
>    NT __attribute__((noinline))             \
>    sat_u_truc_##WT##_to_##NT##_fmt_1 (WT x) \
>    {                                        \
>      bool overflow = x > (WT)(NT)(-1);      \
>      return ((NT)x) | (NT)-overflow;        \
>    }
> 
> DEF_SAT_U_TRUC_FMT_1(uint16_t, uint64_t)
> 
> Before this patch:
>     4   │ __attribute__((noinline))
>     5   │ uint16_t sat_u_truc_uint64_t_to_uint16_t_fmt_1 (uint64_t x)
>     6   │ {
>     7   │   _Bool overflow;
>     8   │   short unsigned int _1;
>     9   │   short unsigned int _2;
>    10   │   short unsigned int _3;
>    11   │   uint16_t _6;
>    12   │
>    13   │ ;;   basic block 2, loop depth 0
>    14   │ ;;    pred:       ENTRY
>    15   │   overflow_5 = x_4(D) > 65535;
>    16   │   _1 = (short unsigned int) x_4(D);
>    17   │   _2 = (short unsigned int) overflow_5;
>    18   │   _3 = -_2;
>    19   │   _6 = _1 | _3;
>    20   │   return _6;
>    21   │ ;;    succ:       EXIT
>    22   │
>    23   │ }
> 
> After this patch:
>     3   │
>     4   │ __attribute__((noinline))
>     5   │ uint16_t sat_u_truc_uint64_t_to_uint16_t_fmt_1 (uint64_t x)
>     6   │ {
>     7   │   uint16_t _6;
>     8   │
>     9   │ ;;   basic block 2, loop depth 0
>    10   │ ;;    pred:       ENTRY
>    11   │   _6 = .SAT_TRUNC (x_4(D)); [tail call]
>    12   │   return _6;
>    13   │ ;;    succ:       EXIT
>    14   │
>    15   │ }
> 
> The below tests suites are passed for this patch
> 1. The rv64gcv fully regression test.
> 2. The rv64gcv build with glibc
> 
> gcc/ChangeLog:
> 
>       * config/riscv/iterators.md (ANYI_QUAD_TRUNC): New iterator for
>       quad truncation.
>       (ANYI_OCT_TRUNC): New iterator for oct truncation.
>       (ANYI_QUAD_TRUNCATED): New attr for truncated quad modes.
>       (ANYI_OCT_TRUNCATED): New attr for truncated oct modes.
>       (anyi_quad_truncated): Ditto but for lower case.
>       (anyi_oct_truncated): Ditto but for lower case.
>       * config/riscv/riscv.md (ustrunc<mode><anyi_quad_truncated>2):
>       Add new pattern for quad truncation.
>       (ustrunc<mode><anyi_oct_truncated>2): Ditto but for oct.
> 
> gcc/testsuite/ChangeLog:
> 
>       * gcc.target/riscv/rvv/autovec/unop/vec_sat_u_trunc-2.c: Adjust
>       the expand dump check times.
>       * gcc.target/riscv/rvv/autovec/unop/vec_sat_u_trunc-3.c: Ditto.
>       * gcc.target/riscv/sat_arith_data.h: Add test helper macros.
>       * gcc.target/riscv/sat_u_trunc-4.c: New test.
>       * gcc.target/riscv/sat_u_trunc-5.c: New test.
>       * gcc.target/riscv/sat_u_trunc-6.c: New test.
>       * gcc.target/riscv/sat_u_trunc-run-4.c: New test.
>       * gcc.target/riscv/sat_u_trunc-run-5.c: New test.
>       * gcc.target/riscv/sat_u_trunc-run-6.c: New test.
OK.  Sorry for the delays here.  I wanted to make sure we had the issues 
WRT operand extension resolved before diving into this.  But in 
retrospect, this probably could have moved forward independently.

Jeff


Reply via email to