From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1005) id 024313846077; Thu, 8 Jul 2021 01:56:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 024313846077 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Michael Meissner To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-2135] Generate 128-bit int divide/modulus on power10. X-Act-Checkin: gcc X-Git-Author: Michael Meissner X-Git-Refname: refs/heads/master X-Git-Oldrev: c24a97078221fad98d1f48ed9bd1af2094e1a01d X-Git-Newrev: 852b11da11a181df517c0348df044354ff0656d6 Message-Id: <20210708015622.024313846077@sourceware.org> Date: Thu, 8 Jul 2021 01:56:22 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 08 Jul 2021 01:56:22 -0000 https://gcc.gnu.org/g:852b11da11a181df517c0348df044354ff0656d6 commit r12-2135-g852b11da11a181df517c0348df044354ff0656d6 Author: Michael Meissner Date: Wed Jul 7 21:55:38 2021 -0400 Generate 128-bit int divide/modulus on power10. This patch adds support for the VDIVSQ, VDIVUQ, VMODSQ, and VMODUQ instructions to do 128-bit arithmetic. 2021-07-07 Michael Meissner gcc/ PR target/100809 * config/rs6000/rs6000.md (udivti3): New insn. (divti3): New insn. (umodti3): New insn. (modti3): New insn. gcc/testsuite/ PR target/100809 * gcc.target/powerpc/p10-vdivq-vmodq.c: New test. Diff: --- gcc/config/rs6000/rs6000.md | 34 ++++++++++++++++++++++ gcc/testsuite/gcc.target/powerpc/p10-vdivq-vmodq.c | 27 +++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index e84d0311cc2..2368153269c 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -3234,6 +3234,14 @@ [(set_attr "type" "div") (set_attr "size" "")]) +(define_insn "udivti3" + [(set (match_operand:TI 0 "altivec_register_operand" "=v") + (udiv:TI (match_operand:TI 1 "altivec_register_operand" "v") + (match_operand:TI 2 "altivec_register_operand" "v")))] + "TARGET_POWER10 && TARGET_POWERPC64" + "vdivuq %0,%1,%2" + [(set_attr "type" "vecdiv") + (set_attr "size" "128")]) ;; For powers of two we can do sra[wd]i/addze for divide and then adjust for ;; modulus. If it isn't a power of two, force operands into register and do @@ -3324,6 +3332,15 @@ (set_attr "length" "8,12") (set_attr "cell_micro" "not")]) +(define_insn "divti3" + [(set (match_operand:TI 0 "altivec_register_operand" "=v") + (div:TI (match_operand:TI 1 "altivec_register_operand" "v") + (match_operand:TI 2 "altivec_register_operand" "v")))] + "TARGET_POWER10 && TARGET_POWERPC64" + "vdivsq %0,%1,%2" + [(set_attr "type" "vecdiv") + (set_attr "size" "128")]) + (define_expand "mod3" [(set (match_operand:GPR 0 "gpc_reg_operand") (mod:GPR (match_operand:GPR 1 "gpc_reg_operand") @@ -3424,6 +3441,23 @@ (minus:GPR (match_dup 1) (match_dup 3)))]) +(define_insn "umodti3" + [(set (match_operand:TI 0 "altivec_register_operand" "=v") + (umod:TI (match_operand:TI 1 "altivec_register_operand" "v") + (match_operand:TI 2 "altivec_register_operand" "v")))] + "TARGET_POWER10 && TARGET_POWERPC64" + "vmoduq %0,%1,%2" + [(set_attr "type" "vecdiv") + (set_attr "size" "128")]) + +(define_insn "modti3" + [(set (match_operand:TI 0 "altivec_register_operand" "=v") + (mod:TI (match_operand:TI 1 "altivec_register_operand" "v") + (match_operand:TI 2 "altivec_register_operand" "v")))] + "TARGET_POWER10 && TARGET_POWERPC64" + "vmodsq %0,%1,%2" + [(set_attr "type" "vecdiv") + (set_attr "size" "128")]) ;; Logical instructions ;; The logical instructions are mostly combined by using match_operator, diff --git a/gcc/testsuite/gcc.target/powerpc/p10-vdivq-vmodq.c b/gcc/testsuite/gcc.target/powerpc/p10-vdivq-vmodq.c new file mode 100644 index 00000000000..84685e5ff43 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/p10-vdivq-vmodq.c @@ -0,0 +1,27 @@ +/* { dg-require-effective-target int128 } */ +/* { dg-require-effective-target power10_ok } */ +/* { dg-options "-mdejagnu-cpu=power10 -O2" } */ + +unsigned __int128 u_div(unsigned __int128 a, unsigned __int128 b) +{ + return a/b; +} + +unsigned __int128 u_mod(unsigned __int128 a, unsigned __int128 b) +{ + return a%b; +} +__int128 s_div(__int128 a, __int128 b) +{ + return a/b; +} + +__int128 s_mod(__int128 a, __int128 b) +{ + return a%b; +} + +/* { dg-final { scan-assembler {\mvdivsq\M} } } */ +/* { dg-final { scan-assembler {\mvdivuq\M} } } */ +/* { dg-final { scan-assembler {\mvmodsq\M} } } */ +/* { dg-final { scan-assembler {\mvmoduq\M} } } */