#include "stdafx.h"
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <WindowsX.h>
#include <math.h>
#include <xmmintrin.h>
#include <stdio.h>
#include <emmintrin.h>
#include <WinNT.h>
#include <WinNT.rh>
struct MyMatrix
{
union
{
_declspec(align(16)) __m128 v[4];
float m[16];
struct
{
float _m11,_m12,_m13,_m14, _m21,_m22,_m23,_m24, _m31,_m32,_m33,_m34, _m41,_m42,_m43,_m44;
};
};
};
int _tmain(int argc, _TCHAR* argv[])
{
if(IsProcessorFeaturePresent(PF_MMX_INSTRUCTIONS_AVAILABLE))
printf("/nMMX available/n");
else
printf("/nMMX notAvailable/n");
if(IsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE))
printf("/nXMMX available/n");
else
{
printf("/nXMMX notAvailable/n");
return 0;
}
_declspec(align(16)) static float x[4]={1,2,3,4};
_declspec(align(16)) static float y[4]={5,6,7,8};
_declspec(align(16)) static float z[4]={0,0,0,0};
__m128 m0, m1, m2;
_asm
{
movaps xmm0,x
addps xmm0,y
movaps z,xmm0
}
printf("/n x[%f,%f,%f,%f]",x[0],x[1],x[2],x[3]);
printf("/n +y[%f,%f,%f,%f]",y[0],y[1],y[2],y[3]);
printf("/n_____________________________________");
printf("/n=z[%f,%f,%f,%f]/n",z[0],z[1],z[2],z[3]);
//减法
//subps xmm_dest,xmm_src/memory
_asm
{
movaps xmm0,x
subps xmm0,y
movaps z,xmm0
}
printf("/n x[%f,%f,%f,%f]",x[0],x[1],x[2],x[3]);
printf("/n -y[%f,%f,%f,%f]",y[0],y[1],y[2],y[3]);
printf("/n_____________________________________");
printf("/n=z[%f,%f,%f,%f]/n",z[0],z[1],z[2],z[3]);
//除法
//divps xmm_dest, xmm_src/memory
_asm
{
movaps xmm0,x
divps xmm0,y
movaps z,xmm0
}
printf("/n x[%f,%f,%f,%f]",x[0],x[1],x[2],x[3]);
printf("/n /y[%f,%f,%f,%f]",y[0],y[1],y[2],y[3]);
printf("/n_____________________________________");
printf("/n=z[%f,%f,%f,%f]/n",z[0],z[1],z[2],z[3]);
//乘法
//mulps xmm_dest,xmm_src/memory
_asm
{
movaps xmm0,x
mulps xmm0,y
movaps z,xmm0
}
printf("/n x[%f,%f,%f,%f]",x[0],x[1],x[2],x[3]);
printf("/n *y[%f,%f,%f,%f]",y[0],y[1],y[2],y[3]);
printf("/n_____________________________________");
printf("/n=z[%f,%f,%f,%f]/n",z[0],z[1],z[2],z[3]);
//平方根
//sqrtps xmm_dest,xmm_src/memory
_asm
{
sqrtps xmm0, x
movaps z,xmm0
}
printf("/n x[%f,%f,%f,%f]",x[0],x[1],x[2],x[3]);
printf("/n sqrt");
printf("/n_____________________________________");
printf("/n=z[%f,%f,%f,%f]/n",z[0],z[1],z[2],z[3]);
//与运算
//andps xmm_dest,xmm_src/memory
z[0]=0;z[1]=0;z[2]=0;z[3]=0;
_asm
{
//movaps xmm0,x
// andps xmm0,y
// movaps z,xmm0
movaps xmm0,x
movaps xmm1,y
andps xmm0,xmm1
movaps z,xmm0
}
printf("/n x[%f,%f,%f,%f]",x[0],x[1],x[2],x[3]);
printf("/n and y[%f,%f,%f,%f]",y[0],y[1],y[2],y[3]);
printf("/n_____________________________________");
printf("/n=z[%f,%f,%f,%f]/n",z[0],z[1],z[2],z[3]);
//或运算
//orps xmm_dest,xmm_src/memory
z[0]=0;z[1]=0;z[2]=0;z[3]=0;
_asm
{
movaps xmm1,x
orps xmm1,y
movaps z,xmm1
}
printf("/n x[%f,%f,%f,%f]",x[0],x[1],x[2],x[3]);
printf("/n or y[%f,%f,%f,%f]",y[0],y[1],y[2],y[3]);
printf("/n_____________________________________");
printf("/n=z[%f,%f,%f,%f]/n",z[0],z[1],z[2],z[3]);
//异或运算
//xorps xmm_dest,xmm_src/memory
_asm
{
movaps xmm0,x
xorps xmm0,y
movaps z,xmm0
}
printf("/n x[%f,%f,%f,%f]",x[0],x[1],x[2],x[3]);
printf("/n xor y[%f,%f,%f,%f]",y[0],y[1],y[2],y[3]);
printf("/n_____________________________________");
printf("/n=z[%f,%f,%f,%f]/n",z[0],z[1],z[2],z[3]);
//比较运算
//cmpps xmm_dest,xmm_src/memory
z[0]=0;z[1]=0;z[2]=0;z[3]=0;
_asm
{
movaps xmm0,y
movaps xmm1,x
cmpps xmm0,xmm1,6
movaps z,xmm0
}
printf("/n x[%f,%f,%f,%f]",x[0],x[1],x[2],x[3]);
printf("/n 比较 y[%f,%f,%f,%f]",y[0],y[1],y[2],y[3]);
printf("/n_____________________________________");
printf("/n=z[%f,%f,%f,%f]/n",z[0],z[1],z[2],z[3]);
return 0;
}