From: Pan Li <pan2...@intel.com>

This patch series would like to support the unsigned SAT_MUL with
the help of mul, instead of the widen_mul.  Aka:

NT __attribute__((noinline))
sat_u_mul_##NT##_fmt_1 (NT a, NT b)
{
  uint64_t x = (uint64_t)a * (uint64_t)b;
  NT max = -1;
  if (x > (uint64_t)(max))
    return max;
  else
    return (NT)x;
}

Take NT as uint32_t as example, we will have:

Before this patch:
  15   |   <bb 2> [local count: 1073741824]:
  16   |   _1 = (long unsigned int) a_4(D);
  17   |   _2 = (long unsigned int) b_5(D);
  18   |   x_6 = _1 * _2;
  19   |   _7 = MIN_EXPR <x_6, 4294967295>;
  20   |   _3 = (uint32_t) _7;
  21   |   return _3;

After this patch:
   9   |   <bb 2> [local count: 1073741824]:
  10   |   _3 = .SAT_MUL (a_4(D), b_5(D)); [tail call]
  11   |   return _3;

The below test suites are passed for this patch:
1. The rv64gcv fully regression tests.
2. The rv32gcv regression tests for sat_mul.
3. The x86 bootstrap tests.
4. The x86 fully regression tests.

Pan Li (2):
  Match: Introduce mul based pattern for unsigned SAT_MUL
  RISC-V: Add test cases for mul based unsigned scalar SAT_MUL

 gcc/match.pd                                     | 14 +++++++++++++-
 .../riscv/sat/sat_u_mul-1-u16-from-u32.c         | 11 +++++++++++
 .../riscv/sat/sat_u_mul-1-u8-from-u16.c          | 11 +++++++++++
 .../riscv/sat/sat_u_mul-1-u8-from-u32.c          | 11 +++++++++++
 .../riscv/sat/sat_u_mul-2-u16-from-u64.c         | 11 +++++++++++
 .../riscv/sat/sat_u_mul-2-u32-from-u64.c         | 11 +++++++++++
 .../riscv/sat/sat_u_mul-2-u8-from-u64.c          | 11 +++++++++++
 .../riscv/sat/sat_u_mul-run-1-u16-from-u32.c     | 16 ++++++++++++++++
 .../riscv/sat/sat_u_mul-run-1-u16-from-u64.c     |  2 +-
 .../riscv/sat/sat_u_mul-run-1-u32-from-u64.c     |  2 +-
 .../riscv/sat/sat_u_mul-run-1-u8-from-u16.c      | 16 ++++++++++++++++
 .../riscv/sat/sat_u_mul-run-1-u8-from-u32.c      | 16 ++++++++++++++++
 .../riscv/sat/sat_u_mul-run-1-u8-from-u64.c      |  2 +-
 13 files changed, 130 insertions(+), 4 deletions(-)
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-1-u16-from-u32.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-1-u8-from-u16.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-1-u8-from-u32.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-2-u16-from-u64.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-2-u32-from-u64.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-2-u8-from-u64.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-1-u16-from-u32.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-1-u8-from-u16.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-1-u8-from-u32.c

-- 
2.43.0

Reply via email to