In 64-bit mode, SSE2 can be used to emulate MMX instructions without 3DNOW. We can use SSE2 to support 64-bit vectors.
PR target/89021 * config/i386/i386.h (TARGET_MMX_WITH_SSE): New. * config/i386/i386.h (VALID_SSE2_REG_MODE): Allow 64-bit vector modes for TARGET_MMX_WITH_SSE. (SSE_REG_MODE_P): Likewise. --- gcc/config/i386/i386.h | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 83b025e0cf5..c1df3ec3326 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -585,6 +585,11 @@ extern unsigned char ix86_arch_features[X86_ARCH_LAST]; #define TARGET_FISTTP (TARGET_SSE3 && TARGET_80387) +/* In 64-bit mode, SSE2 can be used to emulate MMX instructions. + FIXME: All 3DNOW patterns needs to be updated with SSE emulation. */ +#define TARGET_MMX_WITH_SSE \ + (TARGET_64BIT && TARGET_SSE2 && !TARGET_3DNOW) + extern unsigned char x86_prefetch_sse; #define TARGET_PREFETCH_SSE x86_prefetch_sse @@ -1143,9 +1148,16 @@ extern const char *host_detect_local_cpu (int argc, const char **argv); || (MODE) == V4SImode || (MODE) == V4SFmode || (MODE) == V8HImode \ || (MODE) == TFmode || (MODE) == V1TImode) +/* NB: Don't use VALID_MMX_REG_MODE with TARGET_MMX_WITH_SSE since we + want to include 8-byte vector modes, like V2SFmode, but not DImode + nor SImode. */ #define VALID_SSE2_REG_MODE(MODE) \ ((MODE) == V16QImode || (MODE) == V8HImode || (MODE) == V2DFmode \ - || (MODE) == V2DImode || (MODE) == DFmode) + || (MODE) == V2DImode || (MODE) == DFmode \ + || (TARGET_MMX_WITH_SSE && ((MODE) == V1DImode || (MODE) == V8QImode \ + || (MODE) == V4HImode \ + || (MODE) == V2SImode \ + || (MODE) == V2SFmode))) #define VALID_SSE_REG_MODE(MODE) \ ((MODE) == V1TImode || (MODE) == TImode \ @@ -1188,7 +1200,11 @@ extern const char *host_detect_local_cpu (int argc, const char **argv); || (MODE) == V4DImode || (MODE) == V8SFmode || (MODE) == V4DFmode \ || (MODE) == V2TImode || (MODE) == V8DImode || (MODE) == V64QImode \ || (MODE) == V16SImode || (MODE) == V32HImode || (MODE) == V8DFmode \ - || (MODE) == V16SFmode) + || (MODE) == V16SFmode \ + || (TARGET_MMX_WITH_SSE && ((MODE) == V1DImode || (MODE) == V8QImode \ + || (MODE) == V4HImode \ + || (MODE) == V2SImode \ + || (MODE) == V2SFmode))) #define X87_FLOAT_MODE_P(MODE) \ (TARGET_80387 && ((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode)) -- 2.20.1