ホーム 道しるべ 憩いの広場 濃緑空間 濃緑研の日記

オイラー法FPUアセンブリ
ホーム ] 上へ ] オイラ−法プログラム ] オイラー法(3DNow!) ] RungeKutta法プログラム ] [ オイラー法FPUアセンブリ ]

 

アルゴリズム通り素直に組んだもの

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);
        }
    }