//	Roast+ License

//	SIMD

#ifndef __SFJP_OPENMGL_roast_simd_core_HPP__
#define __SFJP_OPENMGL_roast_simd_core_HPP__

#include <stdio.h>
#include <time.h>
#include <nmmintrin.h>   // MMX-SSE4.2命令セットを使用する場合インクルード //
#include <smmintrin.h>   // MMX-SSE4.1命令セットを使用する場合インクルード //
#include <intrin.h>      // MMX-SSE3命令セットを使用する場合インクルード   //
#include <emmintrin.h>   // MMX-SSE2命令セットを使用する場合インクルード   //
#include <xmmintrin.h>   // MMX-SSE命令セットを使用する場合インクルード    //
#include <mmintrin.h>    // MMX命令セットを使用する場合インクルード        //

//#define _ROAST_SIMD__ENABLE_FAST_INLINE

#define _ROAST_SIMD__ALIGN_16    __declspec(align(16))

#define _ROAST_SIMD__MOVAPS(XMM_NUM,AL16FARY)    __asm movaps xmm ## XMM_NUM, xmmword ptr [AL16FARY]

namespace roast{

	class simd
	{
	public:
		/*	4つのfloat配列をXMMx（x＝xmm_num）に格納する	*/
		//inline static void movaps(int xmm_num, _ROAST_SIMD__ALIGN_16 float f_array_4[4])
		inline static void movaps(int xmm_num, float *f_array_4)
		{
#ifndef _ROAST_SIMD__ENABLE_FAST_INLINE
			_ROAST_SIMD__ALIGN_16 float *f_array_4_ = f_array_4;
#			define __ROAST_SIMD__F__ f_array_4_
#else
#			define __ROAST_SIMD__F__ f_array_4
#endif
			//f_array_4[0] = 1.3f;
			const float *cp_f_array_4 = f_array_4;
			__asm {
				movaps xmm1, xmmword ptr [cp_f_array_4]
			}
			//__asm movaps xmm1, [__ROAST_SIMD__F__]
			/*
			switch( xmm_num )
			{
			case 1:
				__asm movaps xmm1, [__ROAST_SIMD__F__];
				break;
			case 2: __asm movaps xmm2, [__ROAST_SIMD__F__]; break;
			case 3: __asm movaps xmm3, [__ROAST_SIMD__F__]; break;
			case 4: __asm movaps xmm4, [__ROAST_SIMD__F__]; break;
			}*/
		}
		
	};
}

#endif//__SFJP_OPENMGL_roast_simd_core_HPP__
