/* * Copyright (C) 2007-2009 Gabest * http://www.gabest.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This Program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GNU Make; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * http://www.gnu.org/copyleft/gpl.html * */ #pragma once // sse2 #if _M_SSE >= 0x200 #include #include #ifndef _MM_DENORMALS_ARE_ZERO #define _MM_DENORMALS_ARE_ZERO 0x0040 #endif #define MXCSR (_MM_DENORMALS_ARE_ZERO | _MM_MASK_MASK | _MM_ROUND_NEAREST | _MM_FLUSH_ZERO_ON) #if _MSC_VER < 1500 __forceinline __m128i _mm_castps_si128(__m128 a) {return *(__m128i*)&a;} __forceinline __m128 _mm_castsi128_ps(__m128i a) {return *(__m128*)&a;} __forceinline __m128i _mm_castpd_si128(__m128d a) {return *(__m128i*)&a;} __forceinline __m128d _mm_castsi128_pd(__m128i a) {return *(__m128d*)&a;} __forceinline __m128d _mm_castps_pd(__m128 a) {return *(__m128d*)&a;} __forceinline __m128 _mm_castpd_ps(__m128d a) {return *(__m128*)&a;} #endif #define _MM_TRANSPOSE4_SI128(row0, row1, row2, row3) \ { \ __m128 tmp0 = _mm_shuffle_ps(_mm_castsi128_ps(row0), _mm_castsi128_ps(row1), 0x44); \ __m128 tmp2 = _mm_shuffle_ps(_mm_castsi128_ps(row0), _mm_castsi128_ps(row1), 0xEE); \ __m128 tmp1 = _mm_shuffle_ps(_mm_castsi128_ps(row2), _mm_castsi128_ps(row3), 0x44); \ __m128 tmp3 = _mm_shuffle_ps(_mm_castsi128_ps(row2), _mm_castsi128_ps(row3), 0xEE); \ (row0) = _mm_castps_si128(_mm_shuffle_ps(tmp0, tmp1, 0x88)); \ (row1) = _mm_castps_si128(_mm_shuffle_ps(tmp0, tmp1, 0xDD)); \ (row2) = _mm_castps_si128(_mm_shuffle_ps(tmp2, tmp3, 0x88)); \ (row3) = _mm_castps_si128(_mm_shuffle_ps(tmp2, tmp3, 0xDD)); \ } #else #error TODO: GSVector4 and GSRasterizer needs SSE2 #endif // sse3 #if _M_SSE >= 0x301 #include #endif // sse4 #if _M_SSE >= 0x401 #include #endif