From: Pan Li <pan2...@intel.com> This patch would like to try to match the the unsigned SAT_MUL form 3, aka below:
#define DEF_SAT_U_MUL_FMT_3(NT, WT) \ NT __attribute__((noinline)) \ sat_u_mul_##NT##_from_##WT##_fmt_3 (NT a, NT b) \ { \ WT x = (WT)a * (WT)b; \ if ((x >> sizeof(a) * 8) == 0) \ return (NT)x; \ else \ return (NT)-1; \ } The NT is uint8_t, uint16_t, uint32_t and uint64_t, while the WT is uint16_t, uint32_t, uint64_t and uint128_t. Before this series if backend implemented usmul, we have: 14 │ <bb 2> [local count: 1073741824]: 15 │ _1 = (long unsigned int) a_5(D); 16 │ _2 = (long unsigned int) b_6(D); 17 │ x_7 = _1 * _2; 18 │ _3 = x_7 >> 32; 19 │ if (_3 == 0) 20 │ goto <bb 3>; [50.00%] 21 │ else 22 │ goto <bb 4>; [50.00%] 23 │ 24 │ <bb 3> [local count: 536870912]: 25 │ 26 │ <bb 4> [local count: 1073741824]: 27 │ # _8 = PHI <x_7(3), 4294967295(2)> 28 │ prephitmp_11 = (unsigned int) _8; 29 │ return prephitmp_11; After this series if backend implemented usmul, we have: 26 │ <bb 4> [local count: 1073741824]: 27 │ # _8 = PHI <x_7(3), 4294967295(2)> 28 │ prephitmp_11 = .SAT_MUL (a_5(D), b_6(D)); 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 (2): Match: Add form 3 for unsigned SAT_MUL RISC-V: Add testcase for scalar unsigned SAT_MUL form 3 gcc/match.pd | 27 ++++++++++++++++++- .../gcc.target/riscv/sat/sat_arith.h | 16 +++++++++++ .../riscv/sat/sat_u_mul-4-u16-from-u128.c | 12 +++++++++ .../riscv/sat/sat_u_mul-4-u16-from-u32.c | 12 +++++++++ .../riscv/sat/sat_u_mul-4-u16-from-u64.c | 12 +++++++++ .../riscv/sat/sat_u_mul-4-u16-from-u64.rv32.c | 12 +++++++++ .../riscv/sat/sat_u_mul-4-u32-from-u128.c | 12 +++++++++ .../riscv/sat/sat_u_mul-4-u32-from-u64.c | 12 +++++++++ .../riscv/sat/sat_u_mul-4-u32-from-u64.rv32.c | 13 +++++++++ .../riscv/sat/sat_u_mul-4-u64-from-u128.c | 13 +++++++++ .../riscv/sat/sat_u_mul-4-u8-from-u128.c | 12 +++++++++ .../riscv/sat/sat_u_mul-4-u8-from-u16.c | 12 +++++++++ .../riscv/sat/sat_u_mul-4-u8-from-u32.c | 12 +++++++++ .../riscv/sat/sat_u_mul-4-u8-from-u64.c | 12 +++++++++ .../riscv/sat/sat_u_mul-4-u8-from-u64.rv32.c | 12 +++++++++ .../riscv/sat/sat_u_mul-run-4-u16-from-u128.c | 16 +++++++++++ .../riscv/sat/sat_u_mul-run-4-u16-from-u32.c | 16 +++++++++++ .../riscv/sat/sat_u_mul-run-4-u16-from-u64.c | 16 +++++++++++ .../sat/sat_u_mul-run-4-u16-from-u64.rv32.c | 16 +++++++++++ .../riscv/sat/sat_u_mul-run-4-u32-from-u128.c | 16 +++++++++++ .../riscv/sat/sat_u_mul-run-4-u32-from-u64.c | 16 +++++++++++ .../sat/sat_u_mul-run-4-u32-from-u64.rv32.c | 16 +++++++++++ .../riscv/sat/sat_u_mul-run-4-u64-from-u128.c | 16 +++++++++++ .../riscv/sat/sat_u_mul-run-4-u8-from-u128.c | 16 +++++++++++ .../riscv/sat/sat_u_mul-run-4-u8-from-u16.c | 16 +++++++++++ .../riscv/sat/sat_u_mul-run-4-u8-from-u32.c | 16 +++++++++++ .../riscv/sat/sat_u_mul-run-4-u8-from-u64.c | 16 +++++++++++ .../sat/sat_u_mul-run-4-u8-from-u64.rv32.c | 16 +++++++++++ 28 files changed, 408 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-4-u16-from-u128.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-4-u16-from-u32.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-4-u16-from-u64.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-4-u16-from-u64.rv32.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-4-u32-from-u128.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-4-u32-from-u64.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-4-u32-from-u64.rv32.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-4-u64-from-u128.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-4-u8-from-u128.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-4-u8-from-u16.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-4-u8-from-u32.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-4-u8-from-u64.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-4-u8-from-u64.rv32.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-4-u16-from-u128.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-4-u16-from-u32.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-4-u16-from-u64.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-4-u16-from-u64.rv32.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-4-u32-from-u128.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-4-u32-from-u64.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-4-u32-from-u64.rv32.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-4-u64-from-u128.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-4-u8-from-u128.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-4-u8-from-u16.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-4-u8-from-u32.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-4-u8-from-u64.c create mode 100644 gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-4-u8-from-u64.rv32.c -- 2.43.0