diff options
author | Andrew Stubbs <ams@codesourcery.com> | 2023-04-27 15:34:28 +0100 |
---|---|---|
committer | Andrew Stubbs <ams@codesourcery.com> | 2023-06-19 12:35:35 +0100 |
commit | d9d6774527bccc5ce0394851aa232f8abdaade4c (patch) | |
tree | 089556cc71cd794fc7a61351af5a8a50c1a9944a /gcc | |
parent | 1ff8ba48a2958b5917653e1bc2ddd5ff22097fe7 (diff) | |
download | gcc-d9d6774527bccc5ce0394851aa232f8abdaade4c.zip gcc-d9d6774527bccc5ce0394851aa232f8abdaade4c.tar.gz gcc-d9d6774527bccc5ce0394851aa232f8abdaade4c.tar.bz2 |
amdgcn: implement vector div and mod libfuncs
Also divmod, but only for scalar modes, for now (because there are no complex
int vectors yet).
gcc/ChangeLog:
* config/gcn/gcn.cc (gcn_expand_divmod_libfunc): New function.
(gcn_init_libfuncs): Add div and mod functions for all modes.
Add placeholders for divmod functions.
(TARGET_EXPAND_DIVMOD_LIBFUNC): Define.
libgcc/ChangeLog:
* config/gcn/lib2-divmod-di.c: Reimplement like lib2-divmod.c.
* config/gcn/lib2-divmod.c: Likewise.
* config/gcn/lib2-gcn.h: Add new types and prototypes for all the
new vector libfuncs.
* config/gcn/t-amdgcn: Add new files.
* config/gcn/amdgcn_veclib.h: New file.
* config/gcn/lib2-vec_divmod-di.c: New file.
* config/gcn/lib2-vec_divmod-hi.c: New file.
* config/gcn/lib2-vec_divmod-qi.c: New file.
* config/gcn/lib2-vec_divmod.c: New file.
gcc/testsuite/ChangeLog:
* gcc.dg/tree-ssa/predcom-2.c: Avoid vectors on amdgcn.
* gcc.dg/unroll-8.c: Likewise.
* gcc.dg/vect/slp-26.c: Change expected results on amdgdn.
* lib/target-supports.exp
(check_effective_target_vect_int_mod): Add amdgcn.
(check_effective_target_divmod): Likewise.
* gcc.target/gcn/simd-math-3-16.c: New test.
* gcc.target/gcn/simd-math-3-2.c: New test.
* gcc.target/gcn/simd-math-3-32.c: New test.
* gcc.target/gcn/simd-math-3-4.c: New test.
* gcc.target/gcn/simd-math-3-8.c: New test.
* gcc.target/gcn/simd-math-3-char-16.c: New test.
* gcc.target/gcn/simd-math-3-char-2.c: New test.
* gcc.target/gcn/simd-math-3-char-32.c: New test.
* gcc.target/gcn/simd-math-3-char-4.c: New test.
* gcc.target/gcn/simd-math-3-char-8.c: New test.
* gcc.target/gcn/simd-math-3-char-run-16.c: New test.
* gcc.target/gcn/simd-math-3-char-run-2.c: New test.
* gcc.target/gcn/simd-math-3-char-run-32.c: New test.
* gcc.target/gcn/simd-math-3-char-run-4.c: New test.
* gcc.target/gcn/simd-math-3-char-run-8.c: New test.
* gcc.target/gcn/simd-math-3-char-run.c: New test.
* gcc.target/gcn/simd-math-3-char.c: New test.
* gcc.target/gcn/simd-math-3-long-16.c: New test.
* gcc.target/gcn/simd-math-3-long-2.c: New test.
* gcc.target/gcn/simd-math-3-long-32.c: New test.
* gcc.target/gcn/simd-math-3-long-4.c: New test.
* gcc.target/gcn/simd-math-3-long-8.c: New test.
* gcc.target/gcn/simd-math-3-long-run-16.c: New test.
* gcc.target/gcn/simd-math-3-long-run-2.c: New test.
* gcc.target/gcn/simd-math-3-long-run-32.c: New test.
* gcc.target/gcn/simd-math-3-long-run-4.c: New test.
* gcc.target/gcn/simd-math-3-long-run-8.c: New test.
* gcc.target/gcn/simd-math-3-long-run.c: New test.
* gcc.target/gcn/simd-math-3-long.c: New test.
* gcc.target/gcn/simd-math-3-run-16.c: New test.
* gcc.target/gcn/simd-math-3-run-2.c: New test.
* gcc.target/gcn/simd-math-3-run-32.c: New test.
* gcc.target/gcn/simd-math-3-run-4.c: New test.
* gcc.target/gcn/simd-math-3-run-8.c: New test.
* gcc.target/gcn/simd-math-3-run.c: New test.
* gcc.target/gcn/simd-math-3-short-16.c: New test.
* gcc.target/gcn/simd-math-3-short-2.c: New test.
* gcc.target/gcn/simd-math-3-short-32.c: New test.
* gcc.target/gcn/simd-math-3-short-4.c: New test.
* gcc.target/gcn/simd-math-3-short-8.c: New test.
* gcc.target/gcn/simd-math-3-short-run-16.c: New test.
* gcc.target/gcn/simd-math-3-short-run-2.c: New test.
* gcc.target/gcn/simd-math-3-short-run-32.c: New test.
* gcc.target/gcn/simd-math-3-short-run-4.c: New test.
* gcc.target/gcn/simd-math-3-short-run-8.c: New test.
* gcc.target/gcn/simd-math-3-short-run.c: New test.
* gcc.target/gcn/simd-math-3-short.c: New test.
* gcc.target/gcn/simd-math-3.c: New test.
* gcc.target/gcn/simd-math-4-char-run.c: New test.
* gcc.target/gcn/simd-math-4-char.c: New test.
* gcc.target/gcn/simd-math-4-long-run.c: New test.
* gcc.target/gcn/simd-math-4-long.c: New test.
* gcc.target/gcn/simd-math-4-run.c: New test.
* gcc.target/gcn/simd-math-4-short-run.c: New test.
* gcc.target/gcn/simd-math-4-short.c: New test.
* gcc.target/gcn/simd-math-4.c: New test.
* gcc.target/gcn/simd-math-5-16.c: New test.
* gcc.target/gcn/simd-math-5-32.c: New test.
* gcc.target/gcn/simd-math-5-4.c: New test.
* gcc.target/gcn/simd-math-5-8.c: New test.
* gcc.target/gcn/simd-math-5-char-16.c: New test.
* gcc.target/gcn/simd-math-5-char-32.c: New test.
* gcc.target/gcn/simd-math-5-char-4.c: New test.
* gcc.target/gcn/simd-math-5-char-8.c: New test.
* gcc.target/gcn/simd-math-5-char-run-16.c: New test.
* gcc.target/gcn/simd-math-5-char-run-32.c: New test.
* gcc.target/gcn/simd-math-5-char-run-4.c: New test.
* gcc.target/gcn/simd-math-5-char-run-8.c: New test.
* gcc.target/gcn/simd-math-5-char-run.c: New test.
* gcc.target/gcn/simd-math-5-char.c: New test.
* gcc.target/gcn/simd-math-5-long-16.c: New test.
* gcc.target/gcn/simd-math-5-long-32.c: New test.
* gcc.target/gcn/simd-math-5-long-4.c: New test.
* gcc.target/gcn/simd-math-5-long-8.c: New test.
* gcc.target/gcn/simd-math-5-long-run-16.c: New test.
* gcc.target/gcn/simd-math-5-long-run-32.c: New test.
* gcc.target/gcn/simd-math-5-long-run-4.c: New test.
* gcc.target/gcn/simd-math-5-long-run-8.c: New test.
* gcc.target/gcn/simd-math-5-long-run.c: New test.
* gcc.target/gcn/simd-math-5-long.c: New test.
* gcc.target/gcn/simd-math-5-run-16.c: New test.
* gcc.target/gcn/simd-math-5-run-32.c: New test.
* gcc.target/gcn/simd-math-5-run-4.c: New test.
* gcc.target/gcn/simd-math-5-run-8.c: New test.
* gcc.target/gcn/simd-math-5-run.c: New test.
* gcc.target/gcn/simd-math-5-short-16.c: New test.
* gcc.target/gcn/simd-math-5-short-32.c: New test.
* gcc.target/gcn/simd-math-5-short-4.c: New test.
* gcc.target/gcn/simd-math-5-short-8.c: New test.
* gcc.target/gcn/simd-math-5-short-run-16.c: New test.
* gcc.target/gcn/simd-math-5-short-run-32.c: New test.
* gcc.target/gcn/simd-math-5-short-run-4.c: New test.
* gcc.target/gcn/simd-math-5-short-run-8.c: New test.
* gcc.target/gcn/simd-math-5-short-run.c: New test.
* gcc.target/gcn/simd-math-5-short.c: New test.
* gcc.target/gcn/simd-math-5.c: New test.
Diffstat (limited to 'gcc')
101 files changed, 1197 insertions, 7 deletions
diff --git a/gcc/config/gcn/gcn.cc b/gcc/config/gcn/gcn.cc index ead89a9..02f4ded 100644 --- a/gcc/config/gcn/gcn.cc +++ b/gcc/config/gcn/gcn.cc @@ -3786,6 +3786,47 @@ gcn_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value) TRAMPOLINE_SIZE))); } +/* Implement TARGET_EXPAND_DIVMOD_LIBFUNC. + + There are divmod libfuncs for all modes except TImode. They return the + two values packed into a larger integer/vector. */ + +void +gcn_expand_divmod_libfunc (rtx libfunc, machine_mode mode, rtx op0, rtx op1, + rtx *quot, rtx *rem) +{ + machine_mode innermode = (VECTOR_MODE_P (mode) + ? GET_MODE_INNER (mode) : mode); + machine_mode wideinnermode = VOIDmode; + machine_mode widemode = VOIDmode; + + switch (innermode) + { + case E_QImode: + case E_HImode: + case E_SImode: + wideinnermode = DImode; + break; + case E_DImode: + wideinnermode = TImode; + break; + default: + gcc_unreachable (); + } + + if (VECTOR_MODE_P (mode)) + widemode = VnMODE (GET_MODE_NUNITS (mode), wideinnermode); + else + widemode = wideinnermode; + + emit_library_call_value (libfunc, gen_rtx_REG (widemode, RETURN_VALUE_REG), + LCT_NORMAL, widemode, op0, mode, op1, mode); + + *quot = gen_rtx_REG (mode, RETURN_VALUE_REG); + *rem = gen_rtx_REG (mode, + RETURN_VALUE_REG + (wideinnermode == TImode ? 2 : 1)); +} + /* }}} */ /* {{{ Miscellaneous. */ @@ -4224,6 +4265,207 @@ gcn_init_libfuncs (void) set_optab_libfunc (popcount_optab, TImode, "__popcountti2"); set_optab_libfunc (parity_optab, TImode, "__parityti2"); set_optab_libfunc (bswap_optab, TImode, "__bswapti2"); + + set_optab_libfunc (sdivmod_optab, SImode, "__divmodsi4"); + set_optab_libfunc (udivmod_optab, SImode, "__udivmodsi4"); + set_optab_libfunc (sdivmod_optab, DImode, "__divmoddi4"); + set_optab_libfunc (udivmod_optab, DImode, "__udivmoddi4"); + + set_optab_libfunc (sdiv_optab, V2QImode, "__divv2qi3"); + set_optab_libfunc (udiv_optab, V2QImode, "__udivv2qi3"); + set_optab_libfunc (smod_optab, V2QImode, "__modv2qi3"); + set_optab_libfunc (umod_optab, V2QImode, "__umodv2qi3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V2QImode, "__divmodv2qi4"); + set_optab_libfunc (udivmod_optab, V2QImode, "__udivmodv2qi4"); +#endif + set_optab_libfunc (sdiv_optab, V4QImode, "__divv4qi3"); + set_optab_libfunc (udiv_optab, V4QImode, "__udivv4qi3"); + set_optab_libfunc (smod_optab, V4QImode, "__modv4qi3"); + set_optab_libfunc (umod_optab, V4QImode, "__umodv4qi3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V4QImode, "__divmodv4qi4"); + set_optab_libfunc (udivmod_optab, V4QImode, "__udivmodv4qi4"); +#endif + set_optab_libfunc (sdiv_optab, V8QImode, "__divv8qi3"); + set_optab_libfunc (udiv_optab, V8QImode, "__udivv8qi3"); + set_optab_libfunc (smod_optab, V8QImode, "__modv8qi3"); + set_optab_libfunc (umod_optab, V8QImode, "__umodv8qi3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V8QImode, "__divmodv8qi4"); + set_optab_libfunc (udivmod_optab, V8QImode, "__udivmodv8qi4"); +#endif + set_optab_libfunc (sdiv_optab, V16QImode, "__divv16qi3"); + set_optab_libfunc (udiv_optab, V16QImode, "__udivv16qi3"); + set_optab_libfunc (smod_optab, V16QImode, "__modv16qi3"); + set_optab_libfunc (umod_optab, V16QImode, "__umodv16qi3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V16QImode, "__divmodv16qi4"); + set_optab_libfunc (udivmod_optab, V16QImode, "__udivmodv16qi4"); +#endif + set_optab_libfunc (sdiv_optab, V32QImode, "__divv32qi3"); + set_optab_libfunc (udiv_optab, V32QImode, "__udivv32qi3"); + set_optab_libfunc (smod_optab, V32QImode, "__modv32qi3"); + set_optab_libfunc (umod_optab, V32QImode, "__umodv32qi3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V32QImode, "__divmodv32qi4"); + set_optab_libfunc (udivmod_optab, V32QImode, "__udivmodv32qi4"); +#endif + set_optab_libfunc (sdiv_optab, V64QImode, "__divv64qi3"); + set_optab_libfunc (udiv_optab, V64QImode, "__udivv64qi3"); + set_optab_libfunc (smod_optab, V64QImode, "__modv64qi3"); + set_optab_libfunc (umod_optab, V64QImode, "__umodv64qi3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V64QImode, "__divmodv64qi4"); + set_optab_libfunc (udivmod_optab, V64QImode, "__udivmodv64qi4"); +#endif + + set_optab_libfunc (sdiv_optab, V2HImode, "__divv2hi3"); + set_optab_libfunc (udiv_optab, V2HImode, "__udivv2hi3"); + set_optab_libfunc (smod_optab, V2HImode, "__modv2hi3"); + set_optab_libfunc (umod_optab, V2HImode, "__umodv2hi3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V2HImode, "__divmodv2hi4"); + set_optab_libfunc (udivmod_optab, V2HImode, "__udivmodv2hi4"); +#endif + set_optab_libfunc (sdiv_optab, V4HImode, "__divv4hi3"); + set_optab_libfunc (udiv_optab, V4HImode, "__udivv4hi3"); + set_optab_libfunc (smod_optab, V4HImode, "__modv4hi3"); + set_optab_libfunc (umod_optab, V4HImode, "__umodv4hi3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V4HImode, "__divmodv4hi4"); + set_optab_libfunc (udivmod_optab, V4HImode, "__udivmodv4hi4"); +#endif + set_optab_libfunc (sdiv_optab, V8HImode, "__divv8hi3"); + set_optab_libfunc (udiv_optab, V8HImode, "__udivv8hi3"); + set_optab_libfunc (smod_optab, V8HImode, "__modv8hi3"); + set_optab_libfunc (umod_optab, V8HImode, "__umodv8hi3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V8HImode, "__divmodv8hi4"); + set_optab_libfunc (udivmod_optab, V8HImode, "__udivmodv8hi4"); +#endif + set_optab_libfunc (sdiv_optab, V16HImode, "__divv16hi3"); + set_optab_libfunc (udiv_optab, V16HImode, "__udivv16hi3"); + set_optab_libfunc (smod_optab, V16HImode, "__modv16hi3"); + set_optab_libfunc (umod_optab, V16HImode, "__umodv16hi3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V16HImode, "__divmodv16hi4"); + set_optab_libfunc (udivmod_optab, V16HImode, "__udivmodv16hi4"); +#endif + set_optab_libfunc (sdiv_optab, V32HImode, "__divv32hi3"); + set_optab_libfunc (udiv_optab, V32HImode, "__udivv32hi3"); + set_optab_libfunc (smod_optab, V32HImode, "__modv32hi3"); + set_optab_libfunc (umod_optab, V32HImode, "__umodv32hi3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V32HImode, "__divmodv32hi4"); + set_optab_libfunc (udivmod_optab, V32HImode, "__udivmodv32hi4"); +#endif + set_optab_libfunc (sdiv_optab, V64HImode, "__divv64hi3"); + set_optab_libfunc (udiv_optab, V64HImode, "__udivv64hi3"); + set_optab_libfunc (smod_optab, V64HImode, "__modv64hi3"); + set_optab_libfunc (umod_optab, V64HImode, "__umodv64hi3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V64HImode, "__divmodv64hi4"); + set_optab_libfunc (udivmod_optab, V64HImode, "__udivmodv64hi4"); +#endif + + set_optab_libfunc (sdiv_optab, V2SImode, "__divv2si3"); + set_optab_libfunc (udiv_optab, V2SImode, "__udivv2si3"); + set_optab_libfunc (smod_optab, V2SImode, "__modv2si3"); + set_optab_libfunc (umod_optab, V2SImode, "__umodv2si3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V2SImode, "__divmodv2si4"); + set_optab_libfunc (udivmod_optab, V2SImode, "__udivmodv2si4"); +#endif + set_optab_libfunc (sdiv_optab, V4SImode, "__divv4si3"); + set_optab_libfunc (udiv_optab, V4SImode, "__udivv4si3"); + set_optab_libfunc (smod_optab, V4SImode, "__modv4si3"); + set_optab_libfunc (umod_optab, V4SImode, "__umodv4si3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V4SImode, "__divmodv4si4"); + set_optab_libfunc (udivmod_optab, V4SImode, "__udivmodv4si4"); +#endif + set_optab_libfunc (sdiv_optab, V8SImode, "__divv8si3"); + set_optab_libfunc (udiv_optab, V8SImode, "__udivv8si3"); + set_optab_libfunc (smod_optab, V8SImode, "__modv8si3"); + set_optab_libfunc (umod_optab, V8SImode, "__umodv8si3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V8SImode, "__divmodv8si4"); + set_optab_libfunc (udivmod_optab, V8SImode, "__udivmodv8si4"); +#endif + set_optab_libfunc (sdiv_optab, V16SImode, "__divv16si3"); + set_optab_libfunc (udiv_optab, V16SImode, "__udivv16si3"); + set_optab_libfunc (smod_optab, V16SImode, "__modv16si3"); + set_optab_libfunc (umod_optab, V16SImode, "__umodv16si3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V16SImode, "__divmodv16si4"); + set_optab_libfunc (udivmod_optab, V16SImode, "__udivmodv16si4"); +#endif + set_optab_libfunc (sdiv_optab, V32SImode, "__divv32si3"); + set_optab_libfunc (udiv_optab, V32SImode, "__udivv32si3"); + set_optab_libfunc (smod_optab, V32SImode, "__modv32si3"); + set_optab_libfunc (umod_optab, V32SImode, "__umodv32si3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V32SImode, "__divmodv32si4"); + set_optab_libfunc (udivmod_optab, V32SImode, "__udivmodv32si4"); +#endif + set_optab_libfunc (sdiv_optab, V64SImode, "__divv64si3"); + set_optab_libfunc (udiv_optab, V64SImode, "__udivv64si3"); + set_optab_libfunc (smod_optab, V64SImode, "__modv64si3"); + set_optab_libfunc (umod_optab, V64SImode, "__umodv64si3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V64SImode, "__divmodv64si4"); + set_optab_libfunc (udivmod_optab, V64SImode, "__udivmodv64si4"); +#endif + + set_optab_libfunc (sdiv_optab, V2DImode, "__divv2di3"); + set_optab_libfunc (udiv_optab, V2DImode, "__udivv2di3"); + set_optab_libfunc (smod_optab, V2DImode, "__modv2di3"); + set_optab_libfunc (umod_optab, V2DImode, "__umodv2di3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V2DImode, "__divmodv2di4"); + set_optab_libfunc (udivmod_optab, V2DImode, "__udivmodv2di4"); +#endif + set_optab_libfunc (sdiv_optab, V4DImode, "__divv4di3"); + set_optab_libfunc (udiv_optab, V4DImode, "__udivv4di3"); + set_optab_libfunc (smod_optab, V4DImode, "__modv4di3"); + set_optab_libfunc (umod_optab, V4DImode, "__umodv4di3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V4DImode, "__divmodv4di4"); + set_optab_libfunc (udivmod_optab, V4DImode, "__udivmodv4di4"); +#endif + set_optab_libfunc (sdiv_optab, V8DImode, "__divv8di3"); + set_optab_libfunc (udiv_optab, V8DImode, "__udivv8di3"); + set_optab_libfunc (smod_optab, V8DImode, "__modv8di3"); + set_optab_libfunc (umod_optab, V8DImode, "__umodv8di3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V8DImode, "__divmodv8di4"); + set_optab_libfunc (udivmod_optab, V8DImode, "__udivmodv8di4"); +#endif + set_optab_libfunc (sdiv_optab, V16DImode, "__divv16di3"); + set_optab_libfunc (udiv_optab, V16DImode, "__udivv16di3"); + set_optab_libfunc (smod_optab, V16DImode, "__modv16di3"); + set_optab_libfunc (umod_optab, V16DImode, "__umodv16di3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V16DImode, "__divmodv16di4"); + set_optab_libfunc (udivmod_optab, V16DImode, "__udivmodv16di4"); +#endif + set_optab_libfunc (sdiv_optab, V32DImode, "__divv32di3"); + set_optab_libfunc (udiv_optab, V32DImode, "__udivv32di3"); + set_optab_libfunc (smod_optab, V32DImode, "__modv32di3"); + set_optab_libfunc (umod_optab, V32DImode, "__umodv32di3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V32DImode, "__divmodv32di4"); + set_optab_libfunc (udivmod_optab, V32DImode, "__udivmodv32di4"); +#endif + set_optab_libfunc (sdiv_optab, V64DImode, "__divv64di3"); + set_optab_libfunc (udiv_optab, V64DImode, "__udivv64di3"); + set_optab_libfunc (smod_optab, V64DImode, "__modv64di3"); + set_optab_libfunc (umod_optab, V64DImode, "__umodv64di3"); +#if 0 + set_optab_libfunc (sdivmod_optab, V64DImode, "__divmodv64di4"); + set_optab_libfunc (udivmod_optab, V64DImode, "__udivmodv64di4"); +#endif } /* Expand the CMP_SWAP GCN builtins. We have our own versions that do @@ -7495,6 +7737,8 @@ gcn_dwarf_register_span (rtx rtl) #define TARGET_EMUTLS_VAR_INIT gcn_emutls_var_init #undef TARGET_EXPAND_BUILTIN #define TARGET_EXPAND_BUILTIN gcn_expand_builtin +#undef TARGET_EXPAND_DIVMOD_LIBFUNC +#define TARGET_EXPAND_DIVMOD_LIBFUNC gcn_expand_divmod_libfunc #undef TARGET_FRAME_POINTER_REQUIRED #define TARGET_FRAME_POINTER_REQUIRED gcn_frame_pointer_rqd #undef TARGET_FUNCTION_ARG diff --git a/gcc/testsuite/gcc.dg/tree-ssa/predcom-2.c b/gcc/testsuite/gcc.dg/tree-ssa/predcom-2.c index d8fe51c..1c54679 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/predcom-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/predcom-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -funroll-loops --param max-unroll-times=8 -fpredictive-commoning -fdump-tree-pcom-details -fno-tree-pre" } */ +/* { dg-additional-options "-fno-tree-vectorize" { target amdgcn-*-* } } */ void abort (void); diff --git a/gcc/testsuite/gcc.dg/unroll-8.c b/gcc/testsuite/gcc.dg/unroll-8.c index dfcfe2e..c4f6ac9 100644 --- a/gcc/testsuite/gcc.dg/unroll-8.c +++ b/gcc/testsuite/gcc.dg/unroll-8.c @@ -1,5 +1,7 @@ /* { dg-do compile } */ /* { dg-options "-O2 -fdump-rtl-loop2_unroll -funroll-loops" } */ +/* { dg-additional-options "-fno-tree-vectorize" { target amdgcn-*-* } } */ + struct a {int a[7];}; int t(struct a *a, int n) { diff --git a/gcc/testsuite/gcc.dg/vect/slp-26.c b/gcc/testsuite/gcc.dg/vect/slp-26.c index 01f4e4e..f8b49ff 100644 --- a/gcc/testsuite/gcc.dg/vect/slp-26.c +++ b/gcc/testsuite/gcc.dg/vect/slp-26.c @@ -46,7 +46,7 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" { target { ! mips_msa } } } } */ -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { mips_msa } } } } */ -/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 0 "vect" { target { ! mips_msa } } } } */ -/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" { target { mips_msa } } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" { target { ! { mips_msa || amdgcn-*-* } } } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { mips_msa || amdgcn-*-* } } } } */ +/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 0 "vect" { target { ! { mips_msa || amdgcn-*-* } } } } } */ +/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" { target { mips_msa || amdgcn-*-* } } } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-16.c new file mode 100644 index 0000000..20fa12f --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-16.c @@ -0,0 +1,13 @@ +#define STYPE v16si +#define UTYPE v16usi +#define N 16 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv16si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv16si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv16si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv16si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv16si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv16si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divsi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivsi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-2.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-2.c new file mode 100644 index 0000000..3baffe9 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-2.c @@ -0,0 +1,13 @@ +#define STYPE v2si +#define UTYPE v2usi +#define N 2 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv2si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv2si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv2si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv2si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv2si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv2si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divsi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivsi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-32.c new file mode 100644 index 0000000..eab4815 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-32.c @@ -0,0 +1,13 @@ +#define STYPE v32si +#define UTYPE v32usi +#define N 32 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv32si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv32si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv32si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv32si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv32si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv32si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divsi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivsi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-4.c new file mode 100644 index 0000000..370ca63 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-4.c @@ -0,0 +1,13 @@ +#define STYPE v4si +#define UTYPE v4usi +#define N 4 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv4si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv4si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv4si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv4si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv4si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv4si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divsi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivsi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-8.c new file mode 100644 index 0000000..833608e --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-8.c @@ -0,0 +1,13 @@ +#define STYPE v8si +#define UTYPE v8usi +#define N 8 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv8si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv8si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv8si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv8si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv8si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv8si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divsi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivsi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-char-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-16.c new file mode 100644 index 0000000..f156d49 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-16.c @@ -0,0 +1,11 @@ +#define STYPE v16qi +#define UTYPE v16uqi +#define N 16 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv16qi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv16qi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv16qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv16qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv16qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv16qi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-char-2.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-2.c new file mode 100644 index 0000000..be4b905 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-2.c @@ -0,0 +1,11 @@ +#define STYPE v2qi +#define UTYPE v2uqi +#define N 2 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv2qi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv2qi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv2qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv2qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv2qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv2qi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-char-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-32.c new file mode 100644 index 0000000..b0cadec --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-32.c @@ -0,0 +1,11 @@ +#define STYPE v32qi +#define UTYPE v32uqi +#define N 32 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv32qi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv32qi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv32qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv32qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv32qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv32qi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-char-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-4.c new file mode 100644 index 0000000..4dc7c78 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-4.c @@ -0,0 +1,11 @@ +#define STYPE v4qi +#define UTYPE v4uqi +#define N 4 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv4qi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv4qi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv4qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv4qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv4qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv4qi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-char-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-8.c new file mode 100644 index 0000000..ea3753a --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-8.c @@ -0,0 +1,11 @@ +#define STYPE v8qi +#define UTYPE v8uqi +#define N 8 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv8qi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv8qi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv8qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv8qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv8qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv8qi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-16.c new file mode 100644 index 0000000..159b980 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-16.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-char-16.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-2.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-2.c new file mode 100644 index 0000000..6e730d0 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-2.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-char-2.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-32.c new file mode 100644 index 0000000..8e4932b --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-32.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-char-32.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-4.c new file mode 100644 index 0000000..d07a431 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-4.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-char-4.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-8.c new file mode 100644 index 0000000..64f789a --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run-8.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-char-8.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run.c new file mode 100644 index 0000000..4e2d4c0 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-char-run.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-char.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-char.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-char.c new file mode 100644 index 0000000..478d09e --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-char.c @@ -0,0 +1,10 @@ +#define STYPE v64qi +#define UTYPE v64uqi +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv64qi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv64qi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv64qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv64qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv64qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv64qi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-long-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-16.c new file mode 100644 index 0000000..530f29e --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-16.c @@ -0,0 +1,11 @@ +#define STYPE v16di +#define UTYPE v16udi +#define N 16 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv16di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv16di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv16di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv16di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv16di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv16di3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-long-2.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-2.c new file mode 100644 index 0000000..1c3e833 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-2.c @@ -0,0 +1,11 @@ +#define STYPE v2di +#define UTYPE v2udi +#define N 2 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv2di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv2di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv2di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv2di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv2di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv2di3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-long-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-32.c new file mode 100644 index 0000000..c8556a8 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-32.c @@ -0,0 +1,11 @@ +#define STYPE v32di +#define UTYPE v32udi +#define N 32 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv32di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv32di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv32di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv32di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv32di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv32di3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-long-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-4.c new file mode 100644 index 0000000..514396c --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-4.c @@ -0,0 +1,11 @@ +#define STYPE v4di +#define UTYPE v4udi +#define N 4 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv4di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv4di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv4di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv4di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv4di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv4di3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-long-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-8.c new file mode 100644 index 0000000..428e3a5 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-8.c @@ -0,0 +1,11 @@ +#define STYPE v8di +#define UTYPE v8udi +#define N 8 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv8di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv8di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv8di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv8di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv8di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv8di3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-16.c new file mode 100644 index 0000000..7ce9c92 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-16.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-long-16.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-2.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-2.c new file mode 100644 index 0000000..20996a5 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-2.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-long-2.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-32.c new file mode 100644 index 0000000..1ca25ac --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-32.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-long-32.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-4.c new file mode 100644 index 0000000..b31769a --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-4.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-long-4.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-8.c new file mode 100644 index 0000000..930256a --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run-8.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-long-8.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run.c new file mode 100644 index 0000000..363e425 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-long-run.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-long.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-long.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-long.c new file mode 100644 index 0000000..321297b --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-long.c @@ -0,0 +1,10 @@ +#define STYPE v64di +#define UTYPE v64udi +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv64di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv64di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv64di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv64di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv64di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv64di3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-run-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-run-16.c new file mode 100644 index 0000000..ae8cdbf --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-run-16.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-16.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-run-2.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-run-2.c new file mode 100644 index 0000000..7d80382 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-run-2.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-2.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-run-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-run-32.c new file mode 100644 index 0000000..127fd36 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-run-32.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-32.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-run-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-run-4.c new file mode 100644 index 0000000..e1d5b5d --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-run-4.c @@ -0,0 +1,3 @@ +/* { dg-do run } */ +#include "simd-math-3-4.c" + diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-run-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-run-8.c new file mode 100644 index 0000000..ec98b60 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-run-8.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-8.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-run.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-run.c new file mode 100644 index 0000000..aca508c --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-run.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-short-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-16.c new file mode 100644 index 0000000..80f0414 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-16.c @@ -0,0 +1,11 @@ +#define STYPE v16hi +#define UTYPE v16uhi +#define N 16 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv16hi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv16hi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv16hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv16hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv16hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv16hi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-short-2.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-2.c new file mode 100644 index 0000000..37e5008 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-2.c @@ -0,0 +1,11 @@ +#define STYPE v2hi +#define UTYPE v2uhi +#define N 2 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv2hi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv2hi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv2hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv2hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv2hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv2hi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-short-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-32.c new file mode 100644 index 0000000..79aada0 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-32.c @@ -0,0 +1,11 @@ +#define STYPE v32hi +#define UTYPE v32uhi +#define N 32 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv32hi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv32hi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv32hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv32hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv32hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv32hi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-short-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-4.c new file mode 100644 index 0000000..014acac --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-4.c @@ -0,0 +1,11 @@ +#define STYPE v4hi +#define UTYPE v4uhi +#define N 4 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv4hi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv4hi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv4hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv4hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv4hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv4hi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-short-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-8.c new file mode 100644 index 0000000..308b72b --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-8.c @@ -0,0 +1,11 @@ +#define STYPE v8hi +#define UTYPE v8uhi +#define N 8 +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv8hi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv8hi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv8hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv8hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv8hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv8hi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-16.c new file mode 100644 index 0000000..8ca866c --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-16.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-short-16.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-2.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-2.c new file mode 100644 index 0000000..6c6d8b6 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-2.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-short-2.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-32.c new file mode 100644 index 0000000..8c30ebc --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-32.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-short-32.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-4.c new file mode 100644 index 0000000..e70697e --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-4.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-short-4.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-8.c new file mode 100644 index 0000000..9cb9a6f --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run-8.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-short-8.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run.c new file mode 100644 index 0000000..08f7267 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-short-run.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-3-short.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3-short.c b/gcc/testsuite/gcc.target/gcn/simd-math-3-short.c new file mode 100644 index 0000000..1ade288 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3-short.c @@ -0,0 +1,10 @@ +#define STYPE v64hi +#define UTYPE v64uhi +#include "simd-math-3.c" + +/* { dg-final { scan-assembler-times {__divmodv64hi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv64hi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv64hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv64hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv64hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv64hi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-3.c b/gcc/testsuite/gcc.target/gcn/simd-math-3.c new file mode 100644 index 0000000..def8385 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-3.c @@ -0,0 +1,186 @@ +/* Test that signed and unsigned division and modulus use the correct + vector routines and give the correct results. */ + +/* Setting it this way ensures the run tests use the same flag as the + compile tests. */ +#pragma GCC optimize("O2") + +typedef signed char v2qi __attribute__ ((vector_size (2))); +typedef signed char v4qi __attribute__ ((vector_size (4))); +typedef signed char v8qi __attribute__ ((vector_size (8))); +typedef signed char v16qi __attribute__ ((vector_size (16))); +typedef signed char v32qi __attribute__ ((vector_size (32))); +typedef signed char v64qi __attribute__ ((vector_size (64))); + +typedef unsigned char v2uqi __attribute__ ((vector_size (2))); +typedef unsigned char v4uqi __attribute__ ((vector_size (4))); +typedef unsigned char v8uqi __attribute__ ((vector_size (8))); +typedef unsigned char v16uqi __attribute__ ((vector_size (16))); +typedef unsigned char v32uqi __attribute__ ((vector_size (32))); +typedef unsigned char v64uqi __attribute__ ((vector_size (64))); + +typedef short v2hi __attribute__ ((vector_size (4))); +typedef short v4hi __attribute__ ((vector_size (8))); +typedef short v8hi __attribute__ ((vector_size (16))); +typedef short v16hi __attribute__ ((vector_size (32))); +typedef short v32hi __attribute__ ((vector_size (64))); +typedef short v64hi __attribute__ ((vector_size (128))); + +typedef unsigned short v2uhi __attribute__ ((vector_size (4))); +typedef unsigned short v4uhi __attribute__ ((vector_size (8))); +typedef unsigned short v8uhi __attribute__ ((vector_size (16))); +typedef unsigned short v16uhi __attribute__ ((vector_size (32))); +typedef unsigned short v32uhi __attribute__ ((vector_size (64))); +typedef unsigned short v64uhi __attribute__ ((vector_size (128))); + +typedef int v2si __attribute__ ((vector_size (8))); +typedef int v4si __attribute__ ((vector_size (16))); +typedef int v8si __attribute__ ((vector_size (32))); +typedef int v16si __attribute__ ((vector_size (64))); +typedef int v32si __attribute__ ((vector_size (128))); +typedef int v64si __attribute__ ((vector_size (256))); + +typedef unsigned int v2usi __attribute__ ((vector_size (8))); +typedef unsigned int v4usi __attribute__ ((vector_size (16))); +typedef unsigned int v8usi __attribute__ ((vector_size (32))); +typedef unsigned int v16usi __attribute__ ((vector_size (64))); +typedef unsigned int v32usi __attribute__ ((vector_size (128))); +typedef unsigned int v64usi __attribute__ ((vector_size (256))); + +typedef long v2di __attribute__ ((vector_size (16))); +typedef long v4di __attribute__ ((vector_size (32))); +typedef long v8di __attribute__ ((vector_size (64))); +typedef long v16di __attribute__ ((vector_size (128))); +typedef long v32di __attribute__ ((vector_size (256))); +typedef long v64di __attribute__ ((vector_size (512))); + +typedef unsigned long v2udi __attribute__ ((vector_size (16))); +typedef unsigned long v4udi __attribute__ ((vector_size (32))); +typedef unsigned long v8udi __attribute__ ((vector_size (64))); +typedef unsigned long v16udi __attribute__ ((vector_size (128))); +typedef unsigned long v32udi __attribute__ ((vector_size (256))); +typedef unsigned long v64udi __attribute__ ((vector_size (512))); + +#ifndef STYPE +#define STYPE v64si +#define UTYPE v64usi +#endif +#ifndef N +#define N 64 +#endif + +STYPE a; +STYPE b; +UTYPE ua; +UTYPE ub; + +int main() +{ + int i; + STYPE squot, srem; + UTYPE usquot, usrem; + STYPE vquot, vrem; + UTYPE uvquot, uvrem; + STYPE vquot2, vrem2; + UTYPE uvquot2, uvrem2; + STYPE refquot, refrem; + UTYPE urefquot, urefrem; + + for (i = 0; i < N; i++) + { + a[i] = i * (i >> 2) + (i >> 1); + ua[i] = a[i]; + b[i] = i; + ub[i] = i; + } + + for (i = 0; i < N; i++) + { + /* Calculate reference values using regular scalar div and mod. */ + refquot[i] = a[i] / b[i]; + __asm__ ("" ::: "memory"); + refrem[i] = a[i] % b[i]; + urefquot[i] = ua[i] / ub[i]; + __asm__ ("" ::: "memory"); + urefrem[i] = ua[i] % ub[i]; + } + + __asm__ ("" ::: "memory"); + /* Scalar with divmod. */ + for (i = 0; i < N; i++) + { + squot[i] = a[i] / b[i]; + srem[i] = a[i] % b[i]; + usquot[i] = ua[i] / ub[i]; + usrem[i] = ua[i] % ub[i]; + } + + __asm__ ("" ::: "memory"); + /* Vectorized with divmod. */ + vquot = a / b; + vrem = a % b; + uvquot = ua / ub; + uvrem = ua % ub; + + __asm__ ("" ::: "memory"); + /* Vectorized with separte div and mod. */ + vquot2 = a / b; + __asm__ ("" ::: "memory"); + vrem2 = a % b; + uvquot2 = ua / ub; + __asm__ ("" ::: "memory"); + uvrem2 = ua % ub; + +#ifdef DEBUG +#define DUMP(VAR) \ + __builtin_printf ("%8s: ", #VAR); \ + for (i = 0; i < N; i++) \ + __builtin_printf ("%d ", (int)VAR[i]); \ + __builtin_printf ("\n"); + DUMP (refquot) + DUMP (squot) + DUMP (vquot) + DUMP (vquot2) + __builtin_printf ("\n"); + DUMP (urefquot) + DUMP (usquot) + DUMP (uvquot) + DUMP (uvquot2) + __builtin_printf ("\n"); + DUMP (refrem) + DUMP (srem) + DUMP (vrem) + DUMP (vrem2) + __builtin_printf ("\n"); + DUMP (urefrem) + DUMP (usrem) + DUMP (uvrem) + DUMP (uvrem2) + __builtin_printf ("\n"); +#endif + + for (i = 0; i < N; i++) + if (squot[i] != refquot[i] + || vquot[i] != refquot[i] + || vquot2[i] != refquot[i] + || usquot[i] != urefquot[i] + || uvquot[i] != urefquot[i] + || uvquot2[i] != urefquot[i] + || srem[i] != refrem[i] + || vrem[i] != refrem[i] + || vrem2[i] != refrem[i] + || usrem[i] != urefrem[i] + || uvrem[i] != urefrem[i] + || uvrem2[i] != urefrem[i]) + __builtin_abort (); + return 0; +} + +/* { dg-final { scan-assembler-times {__divmodv64si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv64si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv64si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv64si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__modv64si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv64si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divsi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivsi3@rel32@lo} 1 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-4-char-run.c b/gcc/testsuite/gcc.target/gcn/simd-math-4-char-run.c new file mode 100644 index 0000000..b328a3e --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-4-char-run.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-4-char.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-4-char.c b/gcc/testsuite/gcc.target/gcn/simd-math-4-char.c new file mode 100644 index 0000000..df24bd4 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-4-char.c @@ -0,0 +1,9 @@ +#define TYPE v64qi +#include "simd-math-4.c" + +/* { dg-final { scan-assembler-times {__divmodv64qi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv64qi4@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__divv64qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv64qi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv64qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv64qi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-4-long-run.c b/gcc/testsuite/gcc.target/gcn/simd-math-4-long-run.c new file mode 100644 index 0000000..34cbc46 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-4-long-run.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-4-long.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-4-long.c b/gcc/testsuite/gcc.target/gcn/simd-math-4-long.c new file mode 100644 index 0000000..768a0df --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-4-long.c @@ -0,0 +1,9 @@ +#define TYPE v64di +#include "simd-math-4.c" + +/* { dg-final { scan-assembler-times {__divmodv64di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv64di4@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__divv64di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv64di3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv64di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv64di3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-4-run.c b/gcc/testsuite/gcc.target/gcn/simd-math-4-run.c new file mode 100644 index 0000000..3b98c0e --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-4-run.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-4.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-4-short-run.c b/gcc/testsuite/gcc.target/gcn/simd-math-4-short-run.c new file mode 100644 index 0000000..4cbeb97 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-4-short-run.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-4-short.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-4-short.c b/gcc/testsuite/gcc.target/gcn/simd-math-4-short.c new file mode 100644 index 0000000..f010942 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-4-short.c @@ -0,0 +1,9 @@ +#define TYPE v64hi +#include "simd-math-4.c" + +/* { dg-final { scan-assembler-times {__divmodv64hi4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv64hi4@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__divv64hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv64hi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv64hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv64hi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-4.c new file mode 100644 index 0000000..833dfe2a --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-4.c @@ -0,0 +1,99 @@ +/* Test that signed division and modulus give the correct result with + different variations of signedness. */ + +/* Setting it this way ensures the run tests use the same flag as the + compile tests. */ +#pragma GCC optimize("O2") + +typedef char v64qi __attribute__ ((vector_size (64))); +typedef short v64hi __attribute__ ((vector_size (128))); +typedef int v64si __attribute__ ((vector_size (256))); +typedef long v64di __attribute__ ((vector_size (512))); + +#ifndef TYPE +#define TYPE v64si +#endif +#define N 64 + +TYPE a; +TYPE b; + +int main() +{ + int i; + TYPE squot, srem; + TYPE usquot, usrem; + TYPE vquot, vrem; + TYPE vquot2, vrem2; + TYPE refquot, refrem; + + for (i = 0; i < 64; i++) + { + a[i] = i * (i >> 2) * (i&1 ? -1 : 1); + b[i] = i * (i&2 ? -1 : 1); + } + + for (i = 0; i < N; i++) + { + /* Calculate reference values using regular scalar div and mod. */ + refquot[i] = a[i] / b[i]; + __asm__ ("" ::: "memory"); + refrem[i] = a[i] % b[i]; + } + + __asm__ ("" ::: "memory"); + /* Scalar with divmod. */ + for (i = 0; i < N; i++) + { + squot[i] = a[i] / b[i]; + srem[i] = a[i] % b[i]; + } + + __asm__ ("" ::: "memory"); + /* Vectorized with divmod. */ + vquot = a / b; + vrem = a % b; + + __asm__ ("" ::: "memory"); + /* Vectorized with separte div and mod. */ + vquot2 = a / b; + __asm__ ("" ::: "memory"); + vrem2 = a % b; + +#ifdef DEBUG +#define DUMP(VAR) \ + __builtin_printf ("%8s: ", #VAR); \ + for (i = 0; i < N; i++) \ + __builtin_printf ("%d ", (int)VAR[i]); \ + __builtin_printf ("\n"); + DUMP (refquot) + DUMP (squot) + DUMP (vquot) + DUMP (vquot2) + __builtin_printf ("\n"); + DUMP (refrem) + DUMP (srem) + DUMP (vrem) + DUMP (vrem2) + __builtin_printf ("\n"); +#endif + + for (i = 0; i < N; i++) + if (squot[i] != refquot[i] + || vquot[i] != refquot[i] + || vquot2[i] != refquot[i] + || srem[i] != refrem[i] + || vrem[i] != refrem[i] + || vrem2[i] != refrem[i]) + __builtin_abort (); + return 0; +} + +/* { dg-final { scan-assembler-times {__divmodv64si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv64si4@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__divv64si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv64si3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv64si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv64si3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__divsi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivsi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-16.c new file mode 100644 index 0000000..41c1167 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-16.c @@ -0,0 +1,8 @@ +#define N 16 +#include "simd-math-5.c" + +/* { dg-final { scan-assembler-times {__divmodv16si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv16si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv16si3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv16si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv16si3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-32.c new file mode 100644 index 0000000..3fb92b2 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-32.c @@ -0,0 +1,8 @@ +#define N 32 +#include "simd-math-5.c" + +/* { dg-final { scan-assembler-times {__divmodv32si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv32si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv32si3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv32si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv32si3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-4.c new file mode 100644 index 0000000..ffcd512 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-4.c @@ -0,0 +1,8 @@ +#define N 4 +#include "simd-math-5.c" + +/* { dg-final { scan-assembler-times {__divmodv4si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv4si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv4si3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv4si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv4si3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-8.c new file mode 100644 index 0000000..5d855b6 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-8.c @@ -0,0 +1,8 @@ +#define N 8 +#include "simd-math-5.c" + +/* { dg-final { scan-assembler-times {__divmodv8si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv8si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv8si3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv8si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv8si3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-char-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-16.c new file mode 100644 index 0000000..0ebf640 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-16.c @@ -0,0 +1,11 @@ +#define TYPE char +#define N 16 +#include "simd-math-5.c" + +/* C integer promotion means that div uses HImode and divmod doesn't match. */ +/* { dg-final { scan-assembler-times {__divmod16.i4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv16hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divv16qi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__udivv16qi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv16qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv16qi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-char-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-32.c new file mode 100644 index 0000000..0905f31 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-32.c @@ -0,0 +1,11 @@ +#define TYPE char +#define N 32 +#include "simd-math-5.c" + +/* C integer promotion means that div uses HImode and divmod doesn't match. */ +/* { dg-final { scan-assembler-times {__divmod32.i4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv32hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divv32qi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__udivv32qi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv32qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv32qi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-char-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-4.c new file mode 100644 index 0000000..772fe37 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-4.c @@ -0,0 +1,11 @@ +#define TYPE char +#define N 4 +#include "simd-math-5.c" + +/* C integer promotion means that div uses HImode and divmod doesn't match. */ +/* { dg-final { scan-assembler-times {__divmod4.i4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv4hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divv4qi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__udivv4qi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv4qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv4qi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-char-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-8.c new file mode 100644 index 0000000..539ce9a --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-8.c @@ -0,0 +1,11 @@ +#define TYPE char +#define N 8 +#include "simd-math-5.c" + +/* C integer promotion means that div uses HImode and divmod doesn't match. */ +/* { dg-final { scan-assembler-times {__divmod8.i4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv8hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divv8qi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__udivv8qi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv8qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv8qi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run-16.c new file mode 100644 index 0000000..0f1af08 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run-16.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-char-16.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run-32.c new file mode 100644 index 0000000..a2794c8 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run-32.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-char-32.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run-4.c new file mode 100644 index 0000000..a8e4187 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run-4.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-char-4.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run-8.c new file mode 100644 index 0000000..7a6a959 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run-8.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-char-8.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run.c new file mode 100644 index 0000000..d3ca775 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-char-run.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-char.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-char.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-char.c new file mode 100644 index 0000000..2321c83 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-char.c @@ -0,0 +1,10 @@ +#define TYPE char +#include "simd-math-5.c" + +/* C integer promotion means that div uses HImode and divmod doesn't match. */ +/* { dg-final { scan-assembler-times {__divmodv64si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv64hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divv64qi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__udivv64qi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv64qi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv64qi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-long-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-16.c new file mode 100644 index 0000000..659907d --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-16.c @@ -0,0 +1,9 @@ +#define TYPE long +#define N 16 +#include "simd-math-5.c" + +/* { dg-final { scan-assembler-times {__divmodv16di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv16di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv16di3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv16di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv16di3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-long-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-32.c new file mode 100644 index 0000000..b03fd09 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-32.c @@ -0,0 +1,9 @@ +#define TYPE long +#define N 32 +#include "simd-math-5.c" + +/* { dg-final { scan-assembler-times {__divmodv32di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv32di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv32di3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv32di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv32di3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-long-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-4.c new file mode 100644 index 0000000..a8877b6 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-4.c @@ -0,0 +1,9 @@ +#define TYPE long +#define N 4 +#include "simd-math-5.c" + +/* { dg-final { scan-assembler-times {__divmodv4di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv4di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv4di3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv4di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv4di3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-long-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-8.c new file mode 100644 index 0000000..5b1106c --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-8.c @@ -0,0 +1,9 @@ +#define TYPE long +#define N 8 +#include "simd-math-5.c" + +/* { dg-final { scan-assembler-times {__divmodv8di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv8di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv8di3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv8di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv8di3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run-16.c new file mode 100644 index 0000000..2091925 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run-16.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-long-16.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run-32.c new file mode 100644 index 0000000..c7ff7ca --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run-32.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-long-32.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run-4.c new file mode 100644 index 0000000..c6cf334 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run-4.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-long-4.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run-8.c new file mode 100644 index 0000000..85fdf6f --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run-8.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-long-8.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run.c new file mode 100644 index 0000000..b948fa0 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-long-run.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-long.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-long.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-long.c new file mode 100644 index 0000000..37b6cef --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-long.c @@ -0,0 +1,8 @@ +#define TYPE long +#include "simd-math-5.c" + +/* { dg-final { scan-assembler-times {__divmodv64di4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv64di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv64di3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv64di3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv64di3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-run-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-run-16.c new file mode 100644 index 0000000..2091925 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-run-16.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-long-16.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-run-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-run-32.c new file mode 100644 index 0000000..c7ff7ca --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-run-32.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-long-32.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-run-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-run-4.c new file mode 100644 index 0000000..c6cf334 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-run-4.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-long-4.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-run-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-run-8.c new file mode 100644 index 0000000..85fdf6f --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-run-8.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-long-8.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-run.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-run.c new file mode 100644 index 0000000..de6504c --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-run.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-short-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-16.c new file mode 100644 index 0000000..5d5953b --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-16.c @@ -0,0 +1,11 @@ +#define TYPE short +#define N 16 +#include "simd-math-5.c" + +/* C integer promotion means that div uses SImode and divmod doesn't match. */ +/* { dg-final { scan-assembler-times {__divmod16.i4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv16si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divv16hi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__udivv16hi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv16hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv16hi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-short-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-32.c new file mode 100644 index 0000000..bf8a3ad --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-32.c @@ -0,0 +1,11 @@ +#define TYPE short +#define N 32 +#include "simd-math-5.c" + +/* C integer promotion means that div uses SImode and divmod doesn't match. */ +/* { dg-final { scan-assembler-times {__divmod32.i4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv32si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divv32hi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__udivv32hi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv32hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv32hi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-short-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-4.c new file mode 100644 index 0000000..a2cb46c --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-4.c @@ -0,0 +1,11 @@ +#define TYPE short +#define N 4 +#include "simd-math-5.c" + +/* C integer promotion means that div uses SImode and divmod doesn't match. */ +/* { dg-final { scan-assembler-times {__divmod4.i4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv4si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divv4hi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__udivv4hi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv4hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv4hi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-short-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-8.c new file mode 100644 index 0000000..fa343e5 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-8.c @@ -0,0 +1,11 @@ +#define TYPE short +#define N 8 +#include "simd-math-5.c" + +/* C integer promotion means that div uses SImode and divmod doesn't match. */ +/* { dg-final { scan-assembler-times {__divmod8.i4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv8si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divv8hi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__udivv8hi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv8hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv8hi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run-16.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run-16.c new file mode 100644 index 0000000..3fc946e --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run-16.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-short-16.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run-32.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run-32.c new file mode 100644 index 0000000..34b1d75 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run-32.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-short-32.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run-4.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run-4.c new file mode 100644 index 0000000..09385c7 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run-4.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-short-4.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run-8.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run-8.c new file mode 100644 index 0000000..1de4d26 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run-8.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-short-8.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run.c new file mode 100644 index 0000000..2e0c490 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-short-run.c @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "simd-math-5-short.c" diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5-short.c b/gcc/testsuite/gcc.target/gcn/simd-math-5-short.c new file mode 100644 index 0000000..84cdc9b --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5-short.c @@ -0,0 +1,10 @@ +#define TYPE short +#include "simd-math-5.c" + +/* C integer promotion means that div uses SImode and divmod doesn't match. */ +/* { dg-final { scan-assembler-times {__divmodv64si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__divv64si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__divv64hi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__udivv64hi3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv64hi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv64hi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/gcc.target/gcn/simd-math-5.c b/gcc/testsuite/gcc.target/gcn/simd-math-5.c new file mode 100644 index 0000000..bc181b4 --- /dev/null +++ b/gcc/testsuite/gcc.target/gcn/simd-math-5.c @@ -0,0 +1,88 @@ +/* Test that the auto-vectorizer uses the libgcc vectorized division and + modulus functions. */ + +/* Setting it this way ensures the run tests use the same flag as the + compile tests. */ +#pragma GCC optimize("O2") + +#ifndef TYPE +#define TYPE int +#endif +#ifndef N +#define N 64 +#endif + +TYPE a[N]; +TYPE b[N]; + +int main() +{ + int i; + TYPE quot[N], rem[N]; + TYPE quot2[N], rem2[N]; + TYPE refquot[N], refrem[N]; + + for (i = 0; i < N; i++) + { + a[i] = i * (i >> 2) + (i >> 1); + b[i] = i; + } + __asm__ ("" ::: "memory"); + + /* Vector divmod. */ + for (i = 0; i < N; i++) + { + quot[i] = (TYPE)a[i] / (TYPE)b[i]; + rem[i] = (TYPE)a[i] % (TYPE)b[i]; + } + __asm__ ("" ::: "memory"); + + /* Vector div. */ + for (i = 0; i < N; i++) + quot2[i] = (TYPE)a[i] / (TYPE)b[i]; + __asm__ ("" ::: "memory"); + + /* Vector mod. */ + for (i = 0; i < N; i++) + rem2[i] = (TYPE)a[i] % (TYPE)b[i]; + + /* Calculate reference values with no vectorization. */ + for (i = 0; i < N; i++) + { + refquot[i] = (TYPE)a[i] / (TYPE)b[i]; + __asm__ ("" ::: "memory"); + refrem[i] = (TYPE)a[i] % (TYPE)b[i]; + } + +#ifdef DEBUG +#define DUMP(VAR) \ + __builtin_printf ("%8s: ", #VAR); \ + for (i = 0; i < N; i++) \ + __builtin_printf ("%d ", (int)VAR[i]); \ + __builtin_printf ("\n"); + DUMP (refquot) + DUMP (quot) + DUMP (quot2) + __builtin_printf ("\n"); + DUMP (refrem) + DUMP (rem) + DUMP (rem2) +#endif + + for (i = 0; i < N; i++) + if (quot[i] != refquot[i] + || quot2[i] != refquot[i] + || rem[i] != refrem[i] + || rem2[i] != refrem[i]) + __builtin_abort (); + return 0; +} + +/* { dg-final { scan-assembler-times {__divmodv64si4@rel32@lo} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {__udivmodv64si4@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__divv64si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivv64si3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__modv64si3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__umodv64si3@rel32@lo} 0 } } */ +/* { dg-final { scan-assembler-times {__divsi3@rel32@lo} 1 } } */ +/* { dg-final { scan-assembler-times {__udivsi3@rel32@lo} 0 } } */ diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 7782249..d79ad4b 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -8493,8 +8493,9 @@ proc check_effective_target_vect_long_mult { } { proc check_effective_target_vect_int_mod { } { return [check_cached_effective_target_indexed vect_int_mod { - expr { [istarget powerpc*-*-*] - && [check_effective_target_has_arch_pwr10] }}] + expr { ([istarget powerpc*-*-*] + && [check_effective_target_has_arch_pwr10]) + || [istarget amdgcn-*-*] }}] } # Return 1 if the target supports vector even/odd elements extraction, 0 otherwise. @@ -11627,7 +11628,8 @@ proc check_effective_target_divmod { } { #TODO: Add checks for all targets that have either hardware divmod insn # or define libfunc for divmod. if { [istarget arm*-*-*] - || [istarget i?86-*-*] || [istarget x86_64-*-*] } { + || [istarget i?86-*-*] || [istarget x86_64-*-*] + || [istarget amdgcn-*-*] } { return 1 } return 0 |