On Tue, Feb 12, 2019 at 4:07 AM Uros Bizjak <ubiz...@gmail.com> wrote:
>
> On Mon, Feb 11, 2019 at 11:55 PM H.J. Lu <hjl.to...@gmail.com> wrote:
> >
> > Allow MMX intrinsic emulation with SSE/SSE2/SSSE3.  Don't enable MMX ISA
> > by default with TARGET_MMX_WITH_SSE.
> >
> > For pr82483-1.c and pr82483-2.c, "-mssse3 -mno-mmx" compiles in 64-bit
> > mode since MMX intrinsics can be emulated wit SSE.
> >
> > gcc/
> >
> >         PR target/89021
> >         * config/i386/i386-builtin.def: Enable MMX intrinsics with
> >         SSE/SSE2/SSSE3.
> >         * config/i386/i386.c (ix86_option_override_internal): Don't
> >         enable MMX ISA with TARGET_MMX_WITH_SSE by default.
> >         (bdesc_tm): Enable MMX intrinsics with SSE/SSE2/SSSE3.
> >         (ix86_init_mmx_sse_builtins): Likewise.
> >         (ix86_expand_builtin): Allow SSE/SSE2/SSSE3 to emulate MMX
> >         intrinsics with TARGET_MMX_WITH_SSE.
> >         * config/i386/mmintrin.h: Don't require MMX in 64-bit mode.
> >
> > gcc/testsuite/
> >
> >         PR target/89021
> >         * gcc.target/i386/pr82483-1.c: Error only on ia32.
> >         * gcc.target/i386/pr82483-2.c: Likewise.
> > ---
> >  gcc/config/i386/i386-builtin.def          | 126 +++++++++++-----------
> >  gcc/config/i386/i386.c                    |  62 +++++++----
> >  gcc/config/i386/mmintrin.h                |  10 +-
> >  gcc/testsuite/gcc.target/i386/pr82483-1.c |   2 +-
> >  gcc/testsuite/gcc.target/i386/pr82483-2.c |   2 +-
> >  5 files changed, 118 insertions(+), 84 deletions(-)
> >

> > @@ -30810,13 +30815,13 @@ static const struct builtin_description 
> > bdesc_##kind[] =                  \
> >     we're lazy.  Add casts to make them fit.  */
> >  static const struct builtin_description bdesc_tm[] =
> >  {
> > -  { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_WM64", (enum 
> > ix86_builtins) BUILT_IN_TM_STORE_M64, UNKNOWN, VOID_FTYPE_PV2SI_V2SI },
> > -  { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_WaRM64", 
> > (enum ix86_builtins) BUILT_IN_TM_STORE_WAR_M64, UNKNOWN, 
> > VOID_FTYPE_PV2SI_V2SI },
> > -  { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_WaWM64", 
> > (enum ix86_builtins) BUILT_IN_TM_STORE_WAW_M64, UNKNOWN, 
> > VOID_FTYPE_PV2SI_V2SI },
> > -  { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_RM64", (enum 
> > ix86_builtins) BUILT_IN_TM_LOAD_M64, UNKNOWN, V2SI_FTYPE_PCV2SI },
> > -  { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_RaRM64", 
> > (enum ix86_builtins) BUILT_IN_TM_LOAD_RAR_M64, UNKNOWN, V2SI_FTYPE_PCV2SI },
> > -  { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_RaWM64", 
> > (enum ix86_builtins) BUILT_IN_TM_LOAD_RAW_M64, UNKNOWN, V2SI_FTYPE_PCV2SI },
> > -  { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_RfWM64", 
> > (enum ix86_builtins) BUILT_IN_TM_LOAD_RFW_M64, UNKNOWN, V2SI_FTYPE_PCV2SI },
> > +  { OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, 
> > "__builtin__ITM_WM64", (enum ix86_builtins) BUILT_IN_TM_STORE_M64, UNKNOWN, 
> > VOID_FTYPE_PV2SI_V2SI },
> > +  { OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, 
> > "__builtin__ITM_WaRM64", (enum ix86_builtins) BUILT_IN_TM_STORE_WAR_M64, 
> > UNKNOWN, VOID_FTYPE_PV2SI_V2SI },
> > +  { OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, 
> > "__builtin__ITM_WaWM64", (enum ix86_builtins) BUILT_IN_TM_STORE_WAW_M64, 
> > UNKNOWN, VOID_FTYPE_PV2SI_V2SI },
> > +  { OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, 
> > "__builtin__ITM_RM64", (enum ix86_builtins) BUILT_IN_TM_LOAD_M64, UNKNOWN, 
> > V2SI_FTYPE_PCV2SI },
> > +  { OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, 
> > "__builtin__ITM_RaRM64", (enum ix86_builtins) BUILT_IN_TM_LOAD_RAR_M64, 
> > UNKNOWN, V2SI_FTYPE_PCV2SI },
> > +  { OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, 
> > "__builtin__ITM_RaWM64", (enum ix86_builtins) BUILT_IN_TM_LOAD_RAW_M64, 
> > UNKNOWN, V2SI_FTYPE_PCV2SI },
> > +  { OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, 
> > "__builtin__ITM_RfWM64", (enum ix86_builtins) BUILT_IN_TM_LOAD_RFW_M64, 
> > UNKNOWN, V2SI_FTYPE_PCV2SI },
>
> Please explain why you need the above change.

Reverted.

> >    { OPTION_MASK_ISA_SSE, 0, CODE_FOR_nothing, "__builtin__ITM_WM128", 
> > (enum ix86_builtins) BUILT_IN_TM_STORE_M128, UNKNOWN, VOID_FTYPE_PV4SF_V4SF 
> > },
> >    { OPTION_MASK_ISA_SSE, 0, CODE_FOR_nothing, "__builtin__ITM_WaRM128", 
> > (enum ix86_builtins) BUILT_IN_TM_STORE_WAR_M128, UNKNOWN, 
> > VOID_FTYPE_PV4SF_V4SF },
> > @@ -30834,7 +30839,7 @@ static const struct builtin_description bdesc_tm[] =
> >    { OPTION_MASK_ISA_AVX, 0, CODE_FOR_nothing, "__builtin__ITM_RaWM256", 
> > (enum ix86_builtins) BUILT_IN_TM_LOAD_RAW_M256, UNKNOWN, V8SF_FTYPE_PCV8SF 
> > },
> >    { OPTION_MASK_ISA_AVX, 0, CODE_FOR_nothing, "__builtin__ITM_RfWM256", 
> > (enum ix86_builtins) BUILT_IN_TM_LOAD_RFW_M256, UNKNOWN, V8SF_FTYPE_PCV8SF 
> > },
> >
> > -  { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_LM64", (enum 
> > ix86_builtins) BUILT_IN_TM_LOG_M64, UNKNOWN, VOID_FTYPE_PCVOID },
> > +  { OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, 
> > "__builtin__ITM_LM64", (enum ix86_builtins) BUILT_IN_TM_LOG_M64, UNKNOWN, 
> > VOID_FTYPE_PCVOID },
> >    { OPTION_MASK_ISA_SSE, 0, CODE_FOR_nothing, "__builtin__ITM_LM128", 
> > (enum ix86_builtins) BUILT_IN_TM_LOG_M128, UNKNOWN, VOID_FTYPE_PCVOID },
> >    { OPTION_MASK_ISA_AVX, 0, CODE_FOR_nothing, "__builtin__ITM_LM256", 
> > (enum ix86_builtins) BUILT_IN_TM_LOG_M256, UNKNOWN, VOID_FTYPE_PCVOID },
> >  };
> > @@ -31509,14 +31514,17 @@ ix86_init_mmx_sse_builtins (void)
> >                VOID_FTYPE_UNSIGNED, IX86_BUILTIN_XABORT);
> >
> >    /* MMX access to the vec_init patterns.  */
> > -  def_builtin_const (OPTION_MASK_ISA_MMX, 0, 
> > "__builtin_ia32_vec_init_v2si",
> > +  def_builtin_const (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_SSE2, 0,
> > +                    "__builtin_ia32_vec_init_v2si",
> >                      V2SI_FTYPE_INT_INT, IX86_BUILTIN_VEC_INIT_V2SI);
> >
> > -  def_builtin_const (OPTION_MASK_ISA_MMX, 0, 
> > "__builtin_ia32_vec_init_v4hi",
> > +  def_builtin_const (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_SSE2, 0,
> > +                    "__builtin_ia32_vec_init_v4hi",
> >                      V4HI_FTYPE_HI_HI_HI_HI,
> >                      IX86_BUILTIN_VEC_INIT_V4HI);
> >
> > -  def_builtin_const (OPTION_MASK_ISA_MMX, 0, 
> > "__builtin_ia32_vec_init_v8qi",
> > +  def_builtin_const (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_SSE2, 0,
> > +                    "__builtin_ia32_vec_init_v8qi",
> >                      V8QI_FTYPE_QI_QI_QI_QI_QI_QI_QI_QI,
> >                      IX86_BUILTIN_VEC_INIT_V8QI);
> >
> > @@ -31538,7 +31546,8 @@ ix86_init_mmx_sse_builtins (void)
> >                      "__builtin_ia32_vec_ext_v4hi",
> >                      HI_FTYPE_V4HI_INT, IX86_BUILTIN_VEC_EXT_V4HI);
> >
> > -  def_builtin_const (OPTION_MASK_ISA_MMX, 0, "__builtin_ia32_vec_ext_v2si",
> > +  def_builtin_const (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_SSE2, 0,
> > +                    "__builtin_ia32_vec_ext_v2si",
> >                      SI_FTYPE_V2SI_INT, IX86_BUILTIN_VEC_EXT_V2SI);
> >
> >    def_builtin_const (OPTION_MASK_ISA_SSE2, 0, 
> > "__builtin_ia32_vec_ext_v16qi",
> > @@ -36671,6 +36680,23 @@ ix86_expand_builtin (tree exp, rtx target, rtx 
> > subtarget,
> >         == (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4))
> >        && (isa & (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4)) != 0)
> >      isa |= (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4);
> > +  /* Use SSE/SSE2/SSSE3 to emulate MMX intrinsics in 64-bit mode when
> > +     MMX is disabled.  */
> > +  if (TARGET_MMX_WITH_SSE)
> > +    {
> > +      if (((bisa & (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_MMX))
> > +          == (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_MMX))
> > +         && (isa & (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_MMX)) != 0)
> > +       isa |= (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_MMX);
> > +      if (((bisa & (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_MMX))
> > +          == (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_MMX))
> > +         && (isa & (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_MMX)) != 0)
> > +       isa |= (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_MMX);
> > +      if (((bisa & (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_MMX))
> > +          == (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_MMX))
> > +         && (isa & (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_MMX)) != 0)
> > +       isa |= (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_MMX);
> > +    }
> >    if ((bisa & isa) != bisa || (bisa2 & isa2) != bisa2)
> >      {
> >        char *opts = ix86_target_string (bisa, bisa2, 0, 0, NULL, NULL,
> > diff --git a/gcc/config/i386/mmintrin.h b/gcc/config/i386/mmintrin.h
> > index 238b3df3121..7b613658111 100644
> > --- a/gcc/config/i386/mmintrin.h
> > +++ b/gcc/config/i386/mmintrin.h
> > @@ -30,7 +30,7 @@
> >  #if defined __x86_64__ && !defined __SSE__ || !defined __MMX__
> >  #pragma GCC push_options
> >  #ifdef __x86_64__
> > -#pragma GCC target("sse,mmx")
> > +#pragma GCC target("sse2")
> >  #else
> >  #pragma GCC target("mmx")
> >  #endif
> > @@ -315,7 +315,11 @@ _m_paddd (__m64 __m1, __m64 __m2)
> >  /* Add the 64-bit values in M1 to the 64-bit values in M2.  */
> >  #ifndef __SSE2__
> >  #pragma GCC push_options
> > +#ifdef __x86_64__
> > +#pragma GCC target("sse2")
> > +#else
> >  #pragma GCC target("sse2,mmx")
> > +#endif
> >  #define __DISABLE_SSE2__
> >  #endif /* __SSE2__ */
> > @@ -427,7 +431,11 @@ _m_psubd (__m64 __m1, __m64 __m2)
> >  /* Add the 64-bit values in M1 to the 64-bit values in M2.  */
> >  #ifndef __SSE2__
> >  #pragma GCC push_options
> > +#ifdef __x86_64__
> > +#pragma GCC target("sse2")
> > +#else
> >  #pragma GCC target("sse2,mmx")
> > +#endif
> >  #define __DISABLE_SSE2__
> >  #endif /* __SSE2__ */
>
> Please also explain the need for the above changes.
>

These are needed to allow SSE emulation of MMX intrinsics.  Without it,
I got

[hjl@gnu-cfl-1 gcc]$ cat
/export/gnu/import/git/gitlab/x86-gcc/gcc/testsuite/gcc.target/i386/sse2-mmx-4.c
/* { dg-do run { target { ! ia32 } } } */
/* { dg-options "-O2 -msse2 -mno-mmx" } */

#include "mmx-4.c"
[hjl@gnu-cfl-1 gcc]$ ./xgcc -B./ -S -O2 -msse2 -mno-mmx
/export/gnu/import/git/gitlab/x86-gcc/gcc/testsuite/gcc.target/i386/sse2-mmx-4.c
In file included from
/export/gnu/import/git/gitlab/x86-gcc/gcc/testsuite/gcc.target/i386/mmx-4.c:6,
                 from
/export/gnu/import/git/gitlab/x86-gcc/gcc/testsuite/gcc.target/i386/sse2-mmx-4.c:4:
/export/gnu/import/git/gitlab/x86-gcc/gcc/testsuite/gcc.target/i386/mmx-4.c:
In function ‘mmx_tests’:
./include/mmintrin.h:595:1: error: inlining failed in call to
always_inline ‘_mm_sll_si64’: target specific option mismatch
  595 | _mm_sll_si64 (__m64 __m, __m64 __count)
      | ^~~~~~~~~~~~
In file included from
/export/gnu/import/git/gitlab/x86-gcc/gcc/testsuite/gcc.target/i386/sse2-mmx-4.c:4:
/export/gnu/import/git/gitlab/x86-gcc/gcc/testsuite/gcc.target/i386/mmx-4.c:141:11:
note: called from here
  141 |   c64.v = _mm_sll_si64 (m64_64, s64);
      |           ^~~~~~~~~~~~~~~~~~~~~~~~~~
...

-- 
H.J.

Reply via email to