Hi,

Please review the attached patch. It fixes trunk GCC compilation, which
is something I think should be done before v3 release. We already talked
about this on IRC and the comment has short explanation, let me know if
more info is needed.

Cheers,
Jacek
commit 6e3516a0ce3418dae9cd144b3380a0a91a195a4b
Author: Jacek Caban <[email protected]>
Date:   Thu Sep 12 11:26:03 2013 +0200

    intrin.h: Fixes for GCC 4.9.

diff --git a/mingw-w64-headers/crt/intrin.h b/mingw-w64-headers/crt/intrin.h
index ca52e97..4397c43 100644
--- a/mingw-w64-headers/crt/intrin.h
+++ b/mingw-w64-headers/crt/intrin.h
@@ -40,6 +40,20 @@
 #include <stddef.h>
 #include <psdk_inc/intrin-impl.h>
 
+/*
+ * Intrins shiped with GCC conflict with our versions in C++, because they 
don't use extern "C"
+ * linkage while our variants use them. We try to work around this by 
including those headers
+ * here wrapped in extern "C" block. It's still possible that those intrins 
will get default
+ * C++ linkage (when GCC headers are explicitly included before intrin.h), but 
at least their
+ * guards will prevent duplicated declarations and avoid conflicts.
+ *
+ * On GCC 4.9 we may always include those headers. On older GCCs, we may do it 
only if CPU
+ * features used by them are enabled, so we need to check macros like __SSE__ 
or __MMX__ first.
+ */
+#if __MINGW_GNUC_PREREQ(4, 9)
+#define __MINGW_FORCE_SYS_INTRINS
+#endif
+
 #if defined(__GNUC__) && \
    (defined(__i386__) || defined(__x86_64__))
   extern unsigned int __builtin_ia32_crc32qi (unsigned int, unsigned char);
@@ -64,6 +78,7 @@ extern "C" {
 
 #endif
 
+#ifndef __MINGW_FORCE_SYS_INTRINS
 #ifndef __MMX__
 typedef union __m64 { char v[7]; } __m64;
 #endif
@@ -74,12 +89,13 @@ typedef union __m128 { char v[16]; } __m128;
 typedef union __m128d { char v[16]; } __m128d;
 typedef union __m128i { char v[16]; } __m128i;
 #endif
+#endif
 
 #ifndef WINAPI
 #define WINAPI __stdcall
 #endif
 
-#ifdef __MMX__
+#if defined(__MMX__) || defined(__MINGW_FORCE_SYS_INTRINS)
 #if defined(__cplusplus)
 extern "C" {
 #endif
@@ -90,7 +106,7 @@ extern "C" {
 #endif
 
 /* NOTE: it's not included by MS version, but we do it to try work around 
C++/C linkage differences */
-#ifdef __SSE2__
+#if defined(__SSE2__) || defined(__MINGW_FORCE_SYS_INTRINS)
 #if defined(__cplusplus)
 extern "C" {
 #endif
@@ -100,7 +116,7 @@ extern "C" {
 #endif
 #endif
 
-#ifdef __SSE3__
+#if defined(__SSE3__) || defined(__MINGW_FORCE_SYS_INTRINS)
 #if defined(__cplusplus)
 extern "C" {
 #endif
@@ -529,7 +545,7 @@ extern "C" {
     __MACHINEIA64(void __yield(void))
     __MACHINEIA64(void __fci(void*))
 
-#if !defined(__GNUC__) || !defined(__MMX__)
+#if !defined(__GNUC__) || (!defined(__MMX__) && 
!defined(__MINGW_FORCE_SYS_INTRINS))
     __MACHINEX86X_NOX64(void _m_empty(void))
     __MACHINEX86X_NOX64(__m64 _m_from_int(int))
     __MACHINEX86X_NOX64(int _m_to_int(__m64))
@@ -605,7 +621,7 @@ extern "C" {
 #undef _m_pinsrw
     __MACHINEX86X_NOX64(__m64 _m_pinsrw(__m64,int,int))
 #pragma pop_macro ("_m_pinsrw")
-#if !defined(__GNUC__) || !defined(__SSE2__)
+#if !defined(__GNUC__) || (!defined(__SSE2__) && 
!defined(__MINGW_FORCE_SYS_INTRINS))
     __MACHINEX86X_NOX64(__m64 _m_pmaxsw(__m64,__m64))
     __MACHINEX86X_NOX64(__m64 _m_pmaxub(__m64,__m64))
     __MACHINEX86X_NOX64(__m64 _m_pminsw(__m64,__m64))
@@ -617,7 +633,7 @@ extern "C" {
 #undef _m_pshufw
     __MACHINEX86X_NOX64(__m64 _m_pshufw(__m64,int))
 #pragma pop_macro ("_m_pshufw")
-#if !defined(__GNUC__) || !defined(__SSE2__)
+#if !defined(__GNUC__) || (!defined(__SSE2__) && 
!defined(__MINGW_FORCE_SYS_INTRINS))
     __MACHINEX86X_NOX64(void _m_maskmovq(__m64,__m64,char*))
     __MACHINEX86X_NOX64(__m64 _m_pavgb(__m64,__m64))
     __MACHINEX86X_NOX64(__m64 _m_pavgw(__m64,__m64))
@@ -625,7 +641,7 @@ extern "C" {
 #endif
     __MACHINEX86X_NOWIN64(__m64 _m_from_float(float))
     __MACHINEX86X_NOWIN64(float _m_to_float(__m64))
-#if !defined(__GNUC__) || !defined(__SSE2__)
+#if !defined(__GNUC__) || (!defined(__SSE2__) && 
!defined(__MINGW_FORCE_SYS_INTRINS))
     __MACHINEX86X_NOIA64(__m128 _mm_add_ss(__m128,__m128))
     __MACHINEX86X_NOIA64(__m128 _mm_add_ps(__m128,__m128))
     __MACHINEX86X_NOIA64(__m128 _mm_sub_ss(__m128,__m128))
@@ -695,7 +711,7 @@ extern "C" {
 #undef _mm_shuffle_ps
     __MACHINEX86X_NOIA64(__m128 _mm_shuffle_ps(__m128,__m128,int const))
 #pragma pop_macro ("_mm_shuffle_ps")
-#if !defined(__GNUC__) || !defined(__SSE2__)
+#if !defined(__GNUC__) || (!defined(__SSE2__) && 
!defined(__MINGW_FORCE_SYS_INTRINS))
     __MACHINEX86X_NOIA64(__m128 _mm_unpackhi_ps(__m128,__m128))
     __MACHINEX86X_NOIA64(__m128 _mm_unpacklo_ps(__m128,__m128))
     __MACHINEX86X_NOIA64(__m128 _mm_loadh_pi(__m128,__m64 const*))
@@ -755,7 +771,7 @@ extern "C" {
     __MACHINEX86X_NOWIN64(__m64 _m_pfpnacc(__m64,__m64))
     __MACHINEX86X_NOWIN64(__m64 _m_pi2fw(__m64))
     __MACHINEX86X_NOWIN64(__m64 _m_pswapd(__m64))
-#if !defined(__GNUC__) || !defined(__SSE2__)
+#if !defined(__GNUC__) || (!defined(__SSE2__) && 
!defined(__MINGW_FORCE_SYS_INTRINS))
     __MACHINEX86X(__m128d _mm_add_sd(__m128d,__m128d))
     __MACHINEX86X(__m128d _mm_add_pd(__m128d,__m128d))
     __MACHINEX86X(__m128d _mm_div_sd(__m128d,__m128d))
@@ -855,11 +871,11 @@ extern "C" {
     __MACHINEX86X(__m128i _mm_add_epi32(__m128i,__m128i))
 #endif
 
-#if !defined(__GNUC__) || !defined(__MMX__)
+#if !defined(__GNUC__) || (!defined(__MMX__) && 
!defined(__MINGW_FORCE_SYS_INTRINS))
     __MACHINEX86X_NOX64(__m64 _mm_add_si64(__m64,__m64))
 #endif
 
-#if !defined(__GNUC__) || !defined(__SSE2__)
+#if !defined(__GNUC__) || (!defined(__SSE2__) && 
!defined(__MINGW_FORCE_SYS_INTRINS))
     __MACHINEX86X(__m128i _mm_add_epi64(__m128i,__m128i))
     __MACHINEX86X(__m128i _mm_adds_epi8(__m128i,__m128i))
     __MACHINEX86X(__m128i _mm_adds_epi16(__m128i,__m128i))
@@ -882,10 +898,10 @@ extern "C" {
     __MACHINEX86X(__m128i _mm_sub_epi16(__m128i,__m128i))
     __MACHINEX86X(__m128i _mm_sub_epi32(__m128i,__m128i))
 #endif
-#if !defined(__GNUC__) || !defined(__MMX__)
+#if !defined(__GNUC__) || (!defined(__MMX__) && 
!defined(__MINGW_FORCE_SYS_INTRINS))
     __MACHINEX86X_NOX64(__m64 _mm_sub_si64(__m64,__m64))
 #endif
-#if !defined(__GNUC__) || !defined(__SSE2__)
+#if !defined(__GNUC__) || (!defined(__SSE2__) && 
!defined(__MINGW_FORCE_SYS_INTRINS))
     __MACHINEX86X(__m128i _mm_sub_epi64(__m128i,__m128i))
     __MACHINEX86X(__m128i _mm_subs_epi8(__m128i,__m128i))
     __MACHINEX86X(__m128i _mm_subs_epi16(__m128i,__m128i))
@@ -973,7 +989,7 @@ extern "C" {
     __MACHINEX86X(void _mm_stream_si32(int*,int))
     __MACHINEX86X(void _mm_pause(void))
 #endif
-#if !defined(__GNUC__) || !defined(__SSE3__)
+#if !defined(__GNUC__) || (!defined(__SSE3__) && 
!defined(__MINGW_FORCE_SYS_INTRINS))
     __MACHINEX86X(__m128 _mm_addsub_ps(__m128,__m128))
     __MACHINEX86X(__m128d _mm_addsub_pd(__m128d,__m128d))
     __MACHINEX86X(__m128 _mm_hadd_ps(__m128,__m128))
@@ -1045,7 +1061,7 @@ extern "C" {
     /* __MACHINEI(void __outwordstring(unsigned short Port,unsigned short 
*Buffer,unsigned __LONG32 Count)) moved to psdk_inc/intrin-impl.h */
     /* __MACHINEI(void __outdwordstring(unsigned short Port,unsigned __LONG32 
*Buffer,unsigned __LONG32 Count)) moved to psdk_inc/intrin-impl.h */
     __MACHINEI(unsigned int __getcallerseflags())
-#if !defined(__GNUC__) || !defined(__SSE2__)
+#if !defined(__GNUC__) || (!defined(__SSE2__) && 
!defined(__MINGW_FORCE_SYS_INTRINS))
     __MACHINEX64(__MINGW_EXTENSION __m128i _mm_set_epi64x(__int64 i1,__int64 
i0))
     __MACHINEX64(__MINGW_EXTENSION __m128i _mm_set1_epi64x(__int64 i))
     __MACHINEX64(__MINGW_EXTENSION __int64 _mm_cvtsd_si64x(__m128d a))
------------------------------------------------------------------------------
LIMITED TIME SALE - Full Year of Microsoft Training For Just $49.99!
1,500+ hours of tutorials including VisualStudio 2012, Windows 8, SharePoint
2013, SQL 2012, MVC 4, more. BEST VALUE: New Multi-Library Power Pack includes
Mobile, Cloud, Java, and UX Design. Lowest price ever! Ends 9/20/13. 
http://pubads.g.doubleclick.net/gampad/clk?id=58041151&iu=/4140/ostg.clktrk
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to