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

This patch series would like to support the unsigned SAT_MUL with
the help of uint128_t.  Aka:

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

while NT can be uint8_t, uint16_t, uint32_t and uint64_t.

Before this patch:
  15   │   <bb 2> [local count: 1073741824]:
  16   │   _1 = (__int128 unsigned) a_4(D);
  17   │   _2 = (__int128 unsigned) b_5(D);
  18   │   _9 = (unsigned long) _1;
  19   │   _10 = (unsigned long) _2;
  20   │   x_6 = _9 w* _10;
  21   │   _7 = MIN_EXPR <x_6, 255>;
  22   │   _3 = (uint8_t) _7;
  23   │   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 x86 bootstrap tests.
3. The x86 fully regression tests.

Pan Li (4):
  Internal-fn: Introduce new IFN_SAT_MUL for unsigned int
  Widening-Mul: Support unsigned scalar SAT_MUL form 1
  RISC-V: Implement unsigned scalar SAT_MUL from uint128_t
  RISC-V: Add test cases for unsigned scalar SAT_MUL from uint128_t

 gcc/config/riscv/riscv-protos.h               |  1 +
 gcc/config/riscv/riscv.cc                     | 82 +++++++++++++++++++
 gcc/config/riscv/riscv.md                     | 11 +++
 gcc/internal-fn.cc                            |  1 +
 gcc/internal-fn.def                           |  1 +
 gcc/match.pd                                  | 31 +++++++
 gcc/optabs.def                                |  2 +-
 .../gcc.target/riscv/sat/sat_arith.h          | 23 ++++++
 .../gcc.target/riscv/sat/sat_arith_data.h     | 62 ++++++++++++++
 .../riscv/sat/sat_u_mul-1-u16-from-u128.c     | 11 +++
 .../riscv/sat/sat_u_mul-1-u32-from-u128.c     | 11 +++
 .../riscv/sat/sat_u_mul-1-u64-from-u128.c     | 11 +++
 .../riscv/sat/sat_u_mul-1-u8-from-u128.c      | 11 +++
 .../riscv/sat/sat_u_mul-run-1-u16-from-u128.c | 16 ++++
 .../riscv/sat/sat_u_mul-run-1-u32-from-u128.c | 16 ++++
 .../riscv/sat/sat_u_mul-run-1-u64-from-u128.c | 16 ++++
 .../riscv/sat/sat_u_mul-run-1-u8-from-u128.c  | 16 ++++
 gcc/tree-ssa-math-opts.cc                     | 26 ++++++
 18 files changed, 347 insertions(+), 1 deletion(-)
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-1-u16-from-u128.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-1-u32-from-u128.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-1-u64-from-u128.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-1-u8-from-u128.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-1-u16-from-u128.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-1-u32-from-u128.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-1-u64-from-u128.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-1-u8-from-u128.c

-- 
2.43.0

Reply via email to