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