Commit ecfdb16c by H.J. Lu Committed by H.J. Lu

i386: Allow MMX intrinsic emulation with SSE

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-builtins.c (ix86_init_mmx_sse_builtins):
	Likewise.
	* config/i386/i386-expand.c (ix86_expand_builtin): Allow
	SSE/SSE2/SSSE3 to emulate MMX intrinsics with TARGET_MMX_WITH_SSE.
	* config/i386/mmintrin.h: Only require SSE2 if __MMX_WITH_SSE__
	is defined.

gcc/testsuite/

	PR target/89021
	* gcc.target/i386/pr82483-1.c: Error only on ia32.
	* gcc.target/i386/pr82483-2.c: Likewise.

From-SVN: r271252
parent d4410ec0
2019-05-15 H.J. Lu <hongjiu.lu@intel.com> 2019-05-15 H.J. Lu <hongjiu.lu@intel.com>
PR target/89021 PR target/89021
* config/i386/i386-builtin.def: Enable MMX intrinsics with
SSE/SSE2/SSSE3.
* config/i386/i386-builtins.c (ix86_init_mmx_sse_builtins):
Likewise.
* config/i386/i386-expand.c (ix86_expand_builtin): Allow
SSE/SSE2/SSSE3 to emulate MMX intrinsics with TARGET_MMX_WITH_SSE.
* config/i386/mmintrin.h: Only require SSE2 if __MMX_WITH_SSE__
is defined.
2019-05-15 H.J. Lu <hongjiu.lu@intel.com>
PR target/89021
* config/i386/mmx.md (*vec_dupv2sf): Changed to * config/i386/mmx.md (*vec_dupv2sf): Changed to
define_insn_and_split to support SSE emulation. define_insn_and_split to support SSE emulation.
(*vec_extractv2sf_0): Likewise. (*vec_extractv2sf_0): Likewise.
......
...@@ -1058,14 +1058,17 @@ ix86_init_mmx_sse_builtins (void) ...@@ -1058,14 +1058,17 @@ ix86_init_mmx_sse_builtins (void)
VOID_FTYPE_UNSIGNED, IX86_BUILTIN_XABORT); VOID_FTYPE_UNSIGNED, IX86_BUILTIN_XABORT);
/* MMX access to the vec_init patterns. */ /* 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); 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, V4HI_FTYPE_HI_HI_HI_HI,
IX86_BUILTIN_VEC_INIT_V4HI); 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, V8QI_FTYPE_QI_QI_QI_QI_QI_QI_QI_QI,
IX86_BUILTIN_VEC_INIT_V8QI); IX86_BUILTIN_VEC_INIT_V8QI);
...@@ -1087,7 +1090,8 @@ ix86_init_mmx_sse_builtins (void) ...@@ -1087,7 +1090,8 @@ ix86_init_mmx_sse_builtins (void)
"__builtin_ia32_vec_ext_v4hi", "__builtin_ia32_vec_ext_v4hi",
HI_FTYPE_V4HI_INT, IX86_BUILTIN_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); SI_FTYPE_V2SI_INT, IX86_BUILTIN_VEC_EXT_V2SI);
def_builtin_const (OPTION_MASK_ISA_SSE2, 0, "__builtin_ia32_vec_ext_v16qi", def_builtin_const (OPTION_MASK_ISA_SSE2, 0, "__builtin_ia32_vec_ext_v16qi",
......
...@@ -10936,6 +10936,23 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget, ...@@ -10936,6 +10936,23 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
== (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4)) == (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)) != 0)
isa |= (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4); 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) if ((bisa & isa) != bisa || (bisa2 & isa2) != bisa2)
{ {
bool add_abi_p = bisa & OPTION_MASK_ISA_64BIT; bool add_abi_p = bisa & OPTION_MASK_ISA_64BIT;
......
...@@ -29,7 +29,9 @@ ...@@ -29,7 +29,9 @@
#if defined __x86_64__ && !defined __SSE__ || !defined __MMX__ #if defined __x86_64__ && !defined __SSE__ || !defined __MMX__
#pragma GCC push_options #pragma GCC push_options
#ifdef __x86_64__ #ifdef __MMX_WITH_SSE__
#pragma GCC target("sse2")
#elif defined __x86_64__
#pragma GCC target("sse,mmx") #pragma GCC target("sse,mmx")
#else #else
#pragma GCC target("mmx") #pragma GCC target("mmx")
...@@ -315,7 +317,11 @@ _m_paddd (__m64 __m1, __m64 __m2) ...@@ -315,7 +317,11 @@ _m_paddd (__m64 __m1, __m64 __m2)
/* Add the 64-bit values in M1 to the 64-bit values in M2. */ /* Add the 64-bit values in M1 to the 64-bit values in M2. */
#ifndef __SSE2__ #ifndef __SSE2__
#pragma GCC push_options #pragma GCC push_options
#ifdef __MMX_WITH_SSE__
#pragma GCC target("sse2")
#else
#pragma GCC target("sse2,mmx") #pragma GCC target("sse2,mmx")
#endif
#define __DISABLE_SSE2__ #define __DISABLE_SSE2__
#endif /* __SSE2__ */ #endif /* __SSE2__ */
...@@ -427,7 +433,11 @@ _m_psubd (__m64 __m1, __m64 __m2) ...@@ -427,7 +433,11 @@ _m_psubd (__m64 __m1, __m64 __m2)
/* Add the 64-bit values in M1 to the 64-bit values in M2. */ /* Add the 64-bit values in M1 to the 64-bit values in M2. */
#ifndef __SSE2__ #ifndef __SSE2__
#pragma GCC push_options #pragma GCC push_options
#ifdef __MMX_WITH_SSE__
#pragma GCC target("sse2")
#else
#pragma GCC target("sse2,mmx") #pragma GCC target("sse2,mmx")
#endif
#define __DISABLE_SSE2__ #define __DISABLE_SSE2__
#endif /* __SSE2__ */ #endif /* __SSE2__ */
......
2019-05-15 H.J. Lu <hongjiu.lu@intel.com>
PR target/89021
* gcc.target/i386/pr82483-1.c: Error only on ia32.
* gcc.target/i386/pr82483-2.c: Likewise.
2019-05-15 Martin Liska <mliska@suse.cz> 2019-05-15 Martin Liska <mliska@suse.cz>
PR middle-end/90478 PR middle-end/90478
......
/* PR target/82483 */ /* PR target/82483 */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-mssse3 -mno-mmx -Wno-psabi" } */ /* { dg-options "-mssse3 -mno-mmx -Wno-psabi" } */
/* { dg-error "needs isa option" "" { target *-*-* } 0 } */ /* { dg-error "needs isa option" "" { target ia32 } 0 } */
#include <x86intrin.h> #include <x86intrin.h>
......
/* PR target/82483 */ /* PR target/82483 */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-mssse3 -mno-mmx -Wno-psabi" } */ /* { dg-options "-mssse3 -mno-mmx -Wno-psabi" } */
/* { dg-error "needs isa option" "" { target *-*-* } 0 } */ /* { dg-error "needs isa option" "" { target ia32 } 0 } */
#include <x86intrin.h> #include <x86intrin.h>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment