Hi Carl,
on 2023/8/29 04:00, Carl Love wrote:
>
> GCC maintainers:
>
> Version 4, additional define_insn name fix. Change Log fix for the
> UNSPEC_DQUAN. Retested patch on Power 10 LE.
>
> Version 3, fixed the built-in instance names. Missed removing the "n"
> the name. Added the tighter constraints on the predicates for the
> define_insn. Updated the wording for the built-ins in the
> documentation file. Changed the test file name again. Updated the
> ChangeLog file, added the PR target line. Retested the patch on Power
> 10LE and Power 8 and Power 9.
>
> Version 2, renamed the built-in instances. Changed the name of the
> overloaded built-in. Added the missing documentation for the new
> built-ins. Fixed typos. Changed name of the test. Updated the
> effective target for the test. Retested the patch on Power 10LE and
> Power 8 and Power 9.
>
> The following patch adds four built-ins for the decimal floating point
> (DFP) quantize instructions on rs6000. The built-ins are for 64-bit
> and 128-bit DFP operands.
>
> The patch also adds a test case for the new builtins.
>
> The Patch has been tested on Power 10LE and Power 9 LE/BE.
>
> Please let me know if the patch is acceptable for mainline. Thanks.
>
> Carl Love
>
>
>
> rs6000, add overloaded DFP quantize support
>
> Add decimal floating point (DFP) quantize built-ins for both 64-bit DFP
> and 128-DFP operands. In each case, there is an immediate version and a
> variable version of the built-in. The RM value is a 2-bit constant int
> which specifies the rounding mode to use. For the immediate versions of
> the built-in, the TE field is a 5-bit constant that specifies the value of
> the ideal exponent for the result. The built-in specifications are:
>
> __Decimal64 builtin_dfp_quantize (_Decimal64, _Decimal64,
> const int RM)
> __Decimal64 builtin_dfp_quantize (const int TE, _Decimal64,
> const int RM)
> __Decimal128 builtin_dfp_quantize (_Decimal128, _Decimal128,
>const int RM)
> __Decimal128 builtin_dfp_quantize (const int TE, _Decimal128,
>const int RM)
>
> A testcase is added for the new built-in definitions.
>
> gcc/ChangeLog:
> * config/rs6000/dfp.md (UNSPEC_DQUAN): New unspec.
> (dfp_dqua_, dfp_dquai_): New define_insn.
> * config/rs6000/rs6000-builtins.def (__builtin_dfp_dqua,
> __builtin_dfp_dquai, __builtin_dfp_dquaq, __builtin_dfp_dquaqi):
> New buit-in definitions.
> * config/rs6000/rs6000-overload.def (__builtin_dfp_quantize): New
> overloaded definition.
> * doc/extend.texi: Add documentation for __builtin_dfp_quantize.
>
> gcc/testsuite/
> * gcc.target/powerpc/pr93448.c: New test case.
>
> PR target/93448
> ---
> gcc/config/rs6000/dfp.md | 25 ++-
> gcc/config/rs6000/rs6000-builtins.def | 15 ++
> gcc/config/rs6000/rs6000-overload.def | 10 ++
> gcc/doc/extend.texi| 17 ++
> gcc/testsuite/gcc.target/powerpc/pr93448.c | 200 +
> 5 files changed, 266 insertions(+), 1 deletion(-)
> create mode 100644 gcc/testsuite/gcc.target/powerpc/pr93448.c
>
> diff --git a/gcc/config/rs6000/dfp.md b/gcc/config/rs6000/dfp.md
> index 5ed8a73ac51..bf4a227b0eb 100644
> --- a/gcc/config/rs6000/dfp.md
> +++ b/gcc/config/rs6000/dfp.md
> @@ -271,7 +271,8 @@ (define_c_enum "unspec"
> UNSPEC_DIEX
> UNSPEC_DSCLI
> UNSPEC_DTSTSFI
> - UNSPEC_DSCRI])
> + UNSPEC_DSCRI
> + UNSPEC_DQUAN])
>
> (define_code_iterator DFP_TEST [eq lt gt unordered])
>
> @@ -395,3 +396,25 @@ (define_insn "dfp_dscri_"
>"dscri %0,%1,%2"
>[(set_attr "type" "dfp")
> (set_attr "size" "")])
> +
> +(define_insn "dfp_dqua_"
> + [(set (match_operand:DDTD 0 "gpc_reg_operand" "=d")
> +(unspec:DDTD [(match_operand:DDTD 1 "gpc_reg_operand" "d")
> + (match_operand:DDTD 2 "gpc_reg_operand" "d")
> + (match_operand:SI 3 "const_0_to_3_operand" "n")]
> + UNSPEC_DQUAN))]
> + "TARGET_DFP"
> + "dqua %0,%1,%2,%3"
> + [(set_attr "type" "dfp")
> + (set_attr "size" "")])
> +
> +(define_insn "dfp_dquai_"
> + [(set (match_operand:DDTD 0 "gpc_reg_operand" "=d")
> +(unspec:DDTD [(match_operand:SI 1 "s5bit_cint_operand" "n")
> + (match_operand:DDTD 2 "gpc_reg_operand" "d")
> + (match_operand:SI 3 "const_0_to_3_operand" "n")]
> + UNSPEC_DQUAN))]
> + "TARGET_DFP"
> + "dquai %1,%0,%2,%3"
> + [(set_attr "type" "dfp")
> + (set_attr "size" "")])
> diff --git a/gcc/config/rs6000/rs6000-builtins.def
> b/gcc/config/rs6000/rs6000-builtins.def
> index 8a294d6c934..ce40600e803 100644
> --- a/gcc/config/rs6000/rs6000-builtins.def
> +++ b/gcc/config/rs6000/rs6000-builtins.def
> @@ -2983,6 +29