アルゴリズム通り素直に組んだもの
PentiumU350で 103秒
K6-2/300で 146秒

for(n=0;n<400000;n++)
{
for(i=0;i<600;i++)
{
__asm
{
align 16
/*
R =
sat.P.X*sat.P.X+sat.P.Y*sat.P.Y+sat.P.Z*sat.P.Z;
// r = float(sqrt(R));
// w = GMdt/(r*R);
w =
float(GMdt/(sqrt(R)*R));
// sat.dmy1 += R;
sat.V.X += w*sat.P.X;
sat.P.X += sat.V.X*dt;
sat.V.Y += w*sat.P.Y;
sat.P.Y += sat.V.Y*dt;
sat.V.Z += w*sat.P.Z;
sat.P.Z += sat.V.Z*dt;
*/
// R =
sat.P.X*sat.P.X+sat.P.Y*sat.P.Y+sat.P.Z*sat.P.Z;
fld sat.P.Z
;Z
fld sat.P.Y
;Y Z
fld sat.P.X
;X Y Z
fld ST(0)
;X X Y Z
fmul ST,ST(1) ;XX X Y Z
fld ST(2)
;Y XX X Y Z
fmul ST,ST(3) ;YY XX X Y Z
fld ST(4)
;Z YY XX X Y Z
fmul ST,ST(5) ;ZZ YY XX X Y Z
fadd ST,ST(1) ;ZZ+YY YY XX X Y Z
fadd ST,ST(2) ;ZZ+YY+XX YY XX X Y Z
fstp R
;YY XX X Y Z
fcompp
;X Y Z
}
w =
float(GMdt/(sqrt(R)*R));
__asm
{
align 16
// sat.V.X += w*sat.P.X;
fld w
;w X Y Z
fld ST(0)
;w w X Y Z
fmul ST,ST(2) ;w*X w X Y Z
fld sat.V.X
;Vx w*X w X Y Z
faddp ST(1),ST ;Vx+wX w X Y Z
fst sat.V.X
;Vx+wX w X Y Z
// sat.P.X +=
sat.V.X*dt;
fld dt
;dt Vx+wX w X Y Z
fmulp ST(1),ST ;(Vx+wX)dt w X Y Z
fadd ST,ST(2)
fstp sat.P.X ;w X Y Z
// sat.V.Y += w*sat.P.Y;
fld ST(0)
;w w X Y Z
fmul ST,ST(3) ;w*Y w X Y Z
fld sat.V.Y
;Vy w*Y w X Y Z
faddp ST(1),ST ;Vy+wY w X Y Z
fst sat.V.Y
;Vy+wY w X Y Z
// sat.P.Y +=
sat.V.Y*dt;
fld dt
;dt Vy+wY w X Y Z
fmulp ST(1),ST ;(Vy+wY)dt w X Y Z
fadd ST,ST(3)
fstp sat.P.Y ;w X Y Z
// sat.V.Z += w*sat.P.Z;
fld ST(0)
;w w X Y Z
fmul ST,ST(4) ;w*Z w X Y Z
fld sat.V.Z
;Vz w*Z w X Y Z
faddp ST(1),ST ;Vz+wZ w X Y Z
fst sat.V.Z
;Vz+wZ w X Y Z
// sat.P.Z +=
sat.V.Z*dt;
fld dt
;dt Vz+wZ w X Y Z
fmulp ST(1),ST ;(Vz+wZ)dt w X Y Z
fadd ST,ST(4)
fstp sat.P.Z ;w X Y Z
fcompp
fcompp
}
}
if (fP == 1 && n < 11)
{
printf("x=%f y=%f
z=%f \n",(float)sat.P.X,(float)sat.P.Y,(float)sat.P.Z);
}
}