解决了内联问题

                            


从网上看到说,VC会放弃对含有内联汇编代码的函数,这是错误的。

我试验了一下,VC照样会内联含有汇编代码的函数,只要汇编代码里面不要有跳转到C++代码段的指令就可以了。原因可能是你这样跳转,编译器的智商就不足够处理寄存器的恢复问题了。我不知道ICL会不会有能力处理这样的问题?


所以要内联,就要避免跳转到C++代码段,在汇编代码段内部的跳转是允许的。如果VC没有内联,你可以用__forceinline关键字,这样再长的汇编代码都会被内联,十分恐怖就是了。我原来怀疑是成员函数不能内联,后来发现跟这无关。但是成员函数不能使用naked声明,这是一个限制,只好不用了,但是照样可以把光线追踪的核心求交函数写的很完美,既不破坏OOP的设计,又能保持很高的效率,通过内联获得效率是很合算的,而通过汇编优化又是终极手段。


解决了内联问题 FORCEINLINE  bool   /*ASMDECL*/  RayTriangle::intersectEye( e_Ray  * ray, e_RayState  * state )
解决了内联问题
{
解决了内联问题    
float        dot_nd, t;
解决了内联问题    Vector3f    hit, bary;
解决了内联问题    
static const float _2 = 2.0f;
解决了内联问题
解决了内联问题    __asm 
{
解决了内联问题
解决了内联问题        
/*push        ebp                                        ;
解决了内联问题        mov            ebp, esp                                ;
解决了内联问题        sub            esp, __LOCAL_SIZE                        ;
解决了内联问题        push        esi                                        ;
解决了内联问题        push        edi                                        ;
解决了内联问题        mov            dword ptr this, ecx                        ;
*/

解决了内联问题
解决了内联问题
解决了内联问题        
//    dot_nd = - ( normal.x * ray_dir.x + normal.y * ray_dir.y + normal.z * ray_dir.z );
解决了内联问题
解决了内联问题        
//    optimized version :
解决了内联问题
解决了内联问题        
//        xmm0 <--------------------------- 0
解决了内联问题        
//        xmm1
解决了内联问题        
//        xmm2
解决了内联问题        
//        xmm3 <--------------------------- ray->src
解决了内联问题        
//        xmm4 <--------------------------- ray->dir
解决了内联问题        
//        xmm5 <--------------------------- dot_nd
解决了内联问题        
//        xmm6 <--------------------------- t
解决了内联问题        
//        xmm7
解决了内联问题

解决了内联问题        xorps        xmm0, xmm0                                ;
解决了内联问题        mov            edx, dword ptr ray                        ;
解决了内联问题        mov            edi, dword ptr state                    ;
解决了内联问题        mov            esi, dword ptr 
this                        ;
解决了内联问题
解决了内联问题        movaps        xmm3, xmmword ptr [edx]e_Ray.src        ;
解决了内联问题        movaps        xmm4, xmmword ptr [edx]e_Ray.dir        ;
解决了内联问题
解决了内联问题        movaps        xmm5, xmmword ptr [esi]
this.normal        ;
解决了内联问题        movaps        xmm6, xmm5                                ;
解决了内联问题
解决了内联问题        prefetchnta 
byte ptr [esi+TYPE this]                ;
解决了内联问题
解决了内联问题        movaps        xmm7, xmm4                                ;
解决了内联问题        mulps        xmm5, xmm7                                ;
解决了内联问题        movhlps        xmm7, xmm5                                ;
解决了内联问题        addss        xmm7, xmm5                                ;
解决了内联问题        shufps        xmm5, xmm5, 
1                            ;
解决了内联问题        addss        xmm7, xmm5                                ;
解决了内联问题        movaps        xmm5, xmm0                                ;
解决了内联问题        subss        xmm5, xmm7                                ;
解决了内联问题 
解决了内联问题        
//    if( dot_nd <= 0.0f )
解决了内联问题

解决了内联问题        comiss        xmm0, xmm5                                ;
解决了内联问题
解决了内联问题        
//        return false;
解决了内联问题

解决了内联问题        jae            RETURN_FALSE                            ;
解决了内联问题
解决了内联问题
161  :     t = ray_src.x * normal.x + ray_src.y * normal.y + ray_src.z * normal.z + normal.w;
解决了内联问题
解决了内联问题        movaps        xmm7, xmm3                                ;
解决了内联问题        mulps        xmm7, xmm6                                ;
解决了内联问题        movhlps        xmm6, xmm7                                ;
解决了内联问题        addss        xmm6, xmm7                                ;
解决了内联问题        shufps        xmm7, xmm7, 
253                            ;
解决了内联问题        addss        xmm6, xmm7                                ;
解决了内联问题        movhlps        xmm7, xmm7                                ;
解决了内联问题        addss        xmm6, xmm7                                ;
解决了内联问题
解决了内联问题        
//    if( t <= t_near * dot_nd )
解决了内联问题

解决了内联问题        movss        xmm7, dword ptr [edx]e_Ray.t_near        ;
解决了内联问题
解决了内联问题        mulss        xmm7, xmm5                                ;
解决了内联问题        comiss        xmm7, xmm6                                ;
解决了内联问题
解决了内联问题        
//        return false;
解决了内联问题

解决了内联问题        jae            RETURN_FALSE                            ;
解决了内联问题 
解决了内联问题        
//    t_far = MIN( ray->t_far, state->t );
解决了内联问题

解决了内联问题        movss        xmm7, dword ptr [edi]e_RayState.t        ;
解决了内联问题        comiss        xmm7, dword ptr [edx]e_Ray.t_far        ;
解决了内联问题        jbe            CASE_BELOW                                ;
解决了内联问题        movss        xmm7, dword ptr [edx]e_Ray.t_far        ;
解决了内联问题
解决了内联问题CASE_BELOW:
解决了内联问题
解决了内联问题        
//    if( t >= t_far * dot_nd )
解决了内联问题

解决了内联问题        mulss        xmm7, xmm5                                ;
解决了内联问题        comiss        xmm6, xmm7                                ;
解决了内联问题
解决了内联问题        
//        return false;
解决了内联问题

解决了内联问题        jae            RETURN_FALSE                            ;
解决了内联问题
解决了内联问题        
//    hit.arr[ projX ] = ray_src.arr[ projX ] * dot_nd + ray_dir.arr[ projX ] * t;
解决了内联问题

解决了内联问题        movzx        eax, 
byte ptr [esi]this.projX            ;
解决了内联问题        sal            eax, 
2                                    ;
解决了内联问题        movss        xmm1, dword ptr [edx
+eax]e_Ray.src        ;
解决了内联问题        movss        xmm2, dword ptr [edx
+eax]e_Ray.dir        ;
解决了内联问题        mulss        xmm1, xmm5                                ;
解决了内联问题        mulss        xmm2, xmm6                                ;
解决了内联问题        addss        xmm1, xmm2                                ;
解决了内联问题        movss        dword ptr [hit
+eax], xmm1                ;
解决了内联问题
解决了内联问题        
//    hit.arr[ projY ] = ray_src.arr[ projY ] * dot_nd + ray_dir.arr[ projY ] * t;
解决了内联问题

解决了内联问题        movzx        ecx, 
byte ptr [esi]this.projY            ;
解决了内联问题        sal            ecx, 
2                                    ;
解决了内联问题        movss        xmm1, dword ptr [edx
+ecx]e_Ray.src        ;
解决了内联问题        movss        xmm2, dword ptr [edx
+ecx]e_Ray.dir        ;
解决了内联问题        mulss        xmm1, xmm5                                ;
解决了内联问题        mulss        xmm2, xmm6                                ;
解决了内联问题        addss        xmm1, xmm2                                ;
解决了内联问题        movss        dword ptr [hit
+ecx], xmm1                ;
解决了内联问题
解决了内联问题        
//    bary.x = hit.arr[ projX ] * la.x + hit.arr[ projY ] * la.y + la.z * dot_nd;
解决了内联问题

解决了内联问题        movss        xmm7, dword ptr [esi]
this.la.x            ;
解决了内联问题        movss        xmm3, dword ptr [hit
+eax]                ;
解决了内联问题        mulss        xmm7, xmm3                                ;
解决了内联问题        movss        xmm1, dword ptr [esi]
this.la.y            ;
解决了内联问题        movss        xmm4, dword ptr [hit
+ecx]                ;
解决了内联问题        mulss        xmm1, xmm4                                ;
解决了内联问题        addss        xmm7, xmm1                                ;
解决了内联问题        movss        xmm1, dword ptr [esi]
this.la.z            ;
解决了内联问题        mulss        xmm1, xmm5                                ;
解决了内联问题        addss        xmm7, xmm1                                ;
解决了内联问题 
解决了内联问题        
//    if( bary.x < 0.0f || bary.x > dot_nd )
解决了内联问题

解决了内联问题        comiss        xmm0, xmm7                                ;
解决了内联问题        ja            RETURN_FALSE                            ;
解决了内联问题        comiss        xmm7, xmm5                                ;
解决了内联问题        ja            RETURN_FALSE                            ;
解决了内联问题 
解决了内联问题        
//    bary.y = hit.arr[ projX ] * lb.x + hit.arr[ projY ] * lb.y + lb.z * dot_nd;
解决了内联问题

解决了内联问题        movss        xmm2, dword ptr [esi]
this.lb.x            ;
解决了内联问题        mulss        xmm2, xmm3                                ;
解决了内联问题        movss        xmm1, dword ptr [esi]
this.lb.y            ;
解决了内联问题        mulss        xmm1, xmm4                                ;
解决了内联问题        addss        xmm2, xmm1                                ;
解决了内联问题        movss        xmm1, dword ptr [esi]
this.lb.z            ;
解决了内联问题        mulss        xmm1, xmm5                                ;
解决了内联问题        addss        xmm2, xmm1                                ;
解决了内联问题
解决了内联问题        
//    if( bary.y < 0.0f || bary.y > dot_nd )
解决了内联问题

解决了内联问题        comiss        xmm0, xmm2                                ;
解决了内联问题        ja            RETURN_FALSE                            ;
解决了内联问题        comiss        xmm2, xmm5                                ;
解决了内联问题        ja            RETURN_FALSE                            ;
解决了内联问题
解决了内联问题        
//    bary.z = dot_nd - bary.x - bary.y;
解决了内联问题

解决了内联问题        movaps        xmm1, xmm5                                ;
解决了内联问题        subss        xmm1, xmm7                                ;
解决了内联问题        subss        xmm1, xmm2                                ;
解决了内联问题 
解决了内联问题        
//    if( bary.z < 0.0f || bary.z > dot_nd )
解决了内联问题

解决了内联问题        comiss        xmm0, xmm1                                ;
解决了内联问题        ja            RETURN_FALSE                            ;
解决了内联问题        comiss        xmm1, xmm5                                ;
解决了内联问题        ja            RETURN_FALSE                            ;
解决了内联问题
解决了内联问题        rcpss        xmm3, xmm5                                ;
解决了内联问题        
//    r * ( 2.0f - a * r );
解决了内联问题
        movss        xmm4, xmm3                                ;
解决了内联问题        mulss        xmm4, xmm5                                ;
解决了内联问题        movss        xmm0, dword ptr _2                        ;
解决了内联问题        subss        xmm0, xmm4                                ;
解决了内联问题        mulss        xmm0, xmm3                                ;
解决了内联问题        
解决了内联问题        mulss        xmm6, xmm0                                ;
解决了内联问题        movss        dword ptr t, xmm6                        ;
解决了内联问题
解决了内联问题        xorps        xmm3, xmm3                                ;
解决了内联问题        subss        xmm3, xmm5                                ;
解决了内联问题        movss        dword ptr dot_nd, xmm3                    ;
解决了内联问题
解决了内联问题        mulss        xmm7, xmm0                                ;
解决了内联问题        movss        dword ptr bary.x, xmm7                    ;
解决了内联问题
解决了内联问题        mulss        xmm2, xmm0                                ;
解决了内联问题        movss        dword ptr bary.y, xmm2                    ;
解决了内联问题
解决了内联问题        mulss        xmm1, xmm0                                ;
解决了内联问题        movss        dword ptr bary.z, xmm1                    ;
解决了内联问题
解决了内联问题        movss        xmm3, dword ptr [hit
+eax]                ;
解决了内联问题        mulss        xmm3, xmm0                                ;
解决了内联问题        movss        dword ptr [hit
+eax], xmm3                ;
解决了内联问题
解决了内联问题        movss        xmm4, dword ptr [hit
+ecx]                ;
解决了内联问题        mulss        xmm4, xmm0                                ;
解决了内联问题        movss        dword ptr [hit
+ecx], xmm4                ;
解决了内联问题
解决了内联问题        mov            eax, dword ptr g_Rend.scene                ;
解决了内联问题        movss        xmm0, dword ptr [eax]e_Scene.opt.view.clip.min;
解决了内联问题        movss        xmm2, dword ptr [eax]e_Scene.opt.view.clip.max;
解决了内联问题
解决了内联问题        movss        xmm1, dword ptr [edx]e_Ray.dad            ;
解决了内联问题        mulss        xmm1, xmm6                                ;
解决了内联问题
解决了内联问题        
//    if( dist < near_clip || dist > far_clip )
解决了内联问题

解决了内联问题        comiss        xmm0, xmm1                                ;
解决了内联问题        ja            RETURN_FALSE                            ;
解决了内联问题        comiss        xmm1, xmm2                                ;
解决了内联问题        ja            RETURN_FALSE                            ;
解决了内联问题
解决了内联问题        
//    hit.arr[ projZ ] = ray->src.arr[ projZ ] + ray->dir.arr[ projZ ] * t;
解决了内联问题

解决了内联问题        movzx        ecx, 
byte ptr [esi]this.projZ            ;
解决了内联问题        sal            ecx, 
2                                    ;
解决了内联问题        movss        xmm0, dword ptr [edx
+ecx]e_Ray.dir        ;
解决了内联问题        mulss        xmm0, xmm6                                ;
解决了内联问题        addss        xmm0, dword ptr [edx
+ecx]e_Ray.src        ;
解决了内联问题        movss        dword ptr [hit
+ecx], xmm0                ;
解决了内联问题
解决了内联问题        
//    state->normBary = bary;
解决了内联问题

解决了内联问题        mov            ecx, dword ptr bary.x                    ;
解决了内联问题        mov            dword ptr [edi]e_RayState.normBary.x, ecx;
解决了内联问题        mov            edx, dword ptr bary.y                    ;
解决了内联问题        mov            dword ptr [edi]e_RayState.normBary.y, edx;
解决了内联问题        mov            ecx, dword ptr bary.z                    ;
解决了内联问题        mov            dword ptr [edi]e_RayState.normBary.z, ecx;
解决了内联问题
解决了内联问题        
//    state->P        = hit;
解决了内联问题

解决了内联问题        mov            edx, dword ptr hit.x                    ;
解决了内联问题        mov            dword ptr [edi]e_RayState.P.x, edx        ;
解决了内联问题        mov            ecx, dword ptr hit.y                    ;
解决了内联问题        mov            dword ptr [edi]e_RayState.P.y, ecx        ;
解决了内联问题        mov            edx, dword ptr hit.z                    ;
解决了内联问题        mov            dword ptr [edi]e_RayState.P.z, edx        ;
解决了内联问题
解决了内联问题        
//    state->t        = t;
解决了内联问题

解决了内联问题        mov            ecx, dword ptr t                        ;
解决了内联问题        mov            dword ptr [edi]e_RayState.t, ecx        ;
解决了内联问题
解决了内联问题        
//    state->dotNd    = dot_nd;
解决了内联问题

解决了内联问题        mov            edx, dword ptr dot_nd                    ;
解决了内联问题        mov            dword ptr [edi]e_RayState.dotNd, edx    ;
解决了内联问题
解决了内联问题        mov            al, 
1                                    ;
解决了内联问题        jmp            THE_END                                    ;
解决了内联问题
解决了内联问题RETURN_FALSE:
解决了内联问题
解决了内联问题        xor            al, al                                    ;
解决了内联问题
解决了内联问题THE_END:
解决了内联问题
解决了内联问题        
/*pop            edi                                        ;
解决了内联问题        pop            esi                                        ;
解决了内联问题        mov            esp, ebp                                ;
解决了内联问题        pop            ebp                                        ;
解决了内联问题        ret            8                                        ;
*/

解决了内联问题
解决了内联问题    }
    //    __asm
解决了内联问题
}

你可能感兴趣的:(问题)