📄 t_vtx_x86_gcc.s
字号:
/* Unfortunately, have to play with the stack in the non-fv case: */#if !defined (STDCALL_API)GLOBL( _tnl_x86_dispatch_attrf1 )GLOBL( _tnl_x86_dispatch_attrf2 )GLOBL( _tnl_x86_dispatch_attrf3 )GLOBL( _tnl_x86_dispatch_attrf4 ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ leal 16(%esp), %edx /* address of first float on stack */ movl %edx, (%esp) /* save as 'v' */ call *SUBST(0) /* 0x0 --> tabfv[attr][n] */ addl $12, %esp /* tear down frame */ ret /* return */GLOBL( _tnl_x86_dispatch_attrf4_end )GLOBL( _tnl_x86_dispatch_attrf3_end )GLOBL( _tnl_x86_dispatch_attrf2_end )GLOBL( _tnl_x86_dispatch_attrf1_end )#else /* defined(STDCALL_API) */GLOBL( _tnl_x86_dispatch_attrf1 ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ leal 16(%esp), %edx /* address of first float on stack */ movl %edx, (%esp) /* save as 'v' */ call *SUBST(0) /* 0x0 --> tabfv[attr][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $4 /* return */GLOBL( _tnl_x86_dispatch_attrf1_end )GLOBL( _tnl_x86_dispatch_attrf2 ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ leal 16(%esp), %edx /* address of first float on stack */ movl %edx, (%esp) /* save as 'v' */ call *SUBST(0) /* 0x0 --> tabfv[attr][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $8 /* return */GLOBL( _tnl_x86_dispatch_attrf2_end )GLOBL( _tnl_x86_dispatch_attrf3 ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ leal 16(%esp), %edx /* address of first float on stack */ movl %edx, (%esp) /* save as 'v' */ call *SUBST(0) /* 0x0 --> tabfv[attr][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $12 /* return */GLOBL( _tnl_x86_dispatch_attrf3_end )GLOBL( _tnl_x86_dispatch_attrf4 ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ leal 16(%esp), %edx /* address of first float on stack */ movl %edx, (%esp) /* save as 'v' */ call *SUBST(0) /* 0x0 --> tabfv[attr][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $16 /* return */GLOBL( _tnl_x86_dispatch_attrf4_end )#endif /* defined(STDCALL_API) *//* The fv case is simpler: */GLOBL( _tnl_x86_dispatch_attrfv ) jmp *SUBST(0) /* 0x0 --> tabfv[attr][n] */GLOBL( _tnl_x86_dispatch_attrfv_end )/* MultiTexcoord: the address of the function pointer must be * calculated, but can use the index argument slot to hold 'v', and * avoid setting up a new stack frame. * * [dBorca] * right, this would be the preferred approach, but gcc does not * clean up the stack after each function call when optimizing (-fdefer-pop); * can it make assumptions about what's already on the stack? I dunno, * but in this case, we can't mess with the caller's stack frame, and * we must use a model like `_x86_dispatch_attrfv' above. Caveat emptor! *//* Also, will only need a maximum of four of each of these per context: */#if !defined (STDCALL_API)GLOBL( _tnl_x86_dispatch_multitexcoordf1 )GLOBL( _tnl_x86_dispatch_multitexcoordf2 )GLOBL( _tnl_x86_dispatch_multitexcoordf3 )GLOBL( _tnl_x86_dispatch_multitexcoordf4 ) movl 4(%esp), %ecx leal 8(%esp), %edx andl $7, %ecx movl %edx, 4(%esp) sall $4, %ecx jmp *SUBST(0)(%ecx) /* 0x0 - tabfv[tex0][n] */GLOBL( _tnl_x86_dispatch_multitexcoordf4_end )GLOBL( _tnl_x86_dispatch_multitexcoordf3_end )GLOBL( _tnl_x86_dispatch_multitexcoordf2_end )GLOBL( _tnl_x86_dispatch_multitexcoordf1_end )GLOBL( _tnl_x86_dispatch_multitexcoordfv ) movl 4(%esp), %ecx movl 8(%esp), %edx andl $7, %ecx movl %edx, 4(%esp) sall $4, %ecx jmp *SUBST(0)(%ecx) /* 0x0 - tabfv[tex0][n] */GLOBL( _tnl_x86_dispatch_multitexcoordfv_end )#else /* defined (STDCALL_API) */GLOBL( _tnl_x86_dispatch_multitexcoordf1 ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ movl 16(%esp), %ecx leal 20(%esp), %edx andl $7, %ecx movl %edx, (%esp) sall $4, %ecx call *SUBST(0)(%ecx) /* 0x0 - tabfv[tex0][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $8 /* return */GLOBL( _tnl_x86_dispatch_multitexcoordf1_end )GLOBL( _tnl_x86_dispatch_multitexcoordf2 ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ movl 16(%esp), %ecx leal 20(%esp), %edx andl $7, %ecx movl %edx, (%esp) sall $4, %ecx call *SUBST(0)(%ecx) /* 0x0 - tabfv[tex0][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $12 /* return */GLOBL( _tnl_x86_dispatch_multitexcoordf2_end )GLOBL( _tnl_x86_dispatch_multitexcoordf3 ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ movl 16(%esp), %ecx leal 20(%esp), %edx andl $7, %ecx movl %edx, (%esp) sall $4, %ecx call *SUBST(0)(%ecx) /* 0x0 - tabfv[tex0][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $16 /* return */GLOBL( _tnl_x86_dispatch_multitexcoordf3_end )GLOBL( _tnl_x86_dispatch_multitexcoordf4 ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ movl 16(%esp), %ecx leal 20(%esp), %edx andl $7, %ecx movl %edx, (%esp) sall $4, %ecx call *SUBST(0)(%ecx) /* 0x0 - tabfv[tex0][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $20 /* return */GLOBL( _tnl_x86_dispatch_multitexcoordf4_end )GLOBL( _tnl_x86_dispatch_multitexcoordfv ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ movl 16(%esp), %ecx movl 20(%esp), %edx andl $7, %ecx movl %edx, (%esp) sall $4, %ecx call *SUBST(0)(%ecx) /* 0x0 - tabfv[tex0][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $8 /* return */GLOBL( _tnl_x86_dispatch_multitexcoordfv_end )#endif /* defined (STDCALL_API) *//* VertexAttrib: the address of the function pointer must be * calculated. */#if !defined (STDCALL_API)GLOBL( _tnl_x86_dispatch_vertexattribf1 )GLOBL( _tnl_x86_dispatch_vertexattribf2 )GLOBL( _tnl_x86_dispatch_vertexattribf3 )GLOBL( _tnl_x86_dispatch_vertexattribf4 ) movl 4(%esp), %eax cmpl $16, %eax jb .8 /* "cmovge" is not supported on all CPUs */ movl $16, %eax.8: leal 8(%esp), %ecx /* calculate 'v' */ movl %ecx, 4(%esp) /* save in 1st arg slot */ sall $4, %eax jmp *SUBST(0)(%eax) /* 0x0 - tabfv[0][n] */GLOBL( _tnl_x86_dispatch_vertexattribf4_end )GLOBL( _tnl_x86_dispatch_vertexattribf3_end )GLOBL( _tnl_x86_dispatch_vertexattribf2_end )GLOBL( _tnl_x86_dispatch_vertexattribf1_end )GLOBL( _tnl_x86_dispatch_vertexattribfv ) movl 4(%esp), %eax cmpl $16, %eax jb .9 /* "cmovge" is not supported on all CPUs */ movl $16, %eax.9: movl 8(%esp), %ecx /* load 'v' */ movl %ecx, 4(%esp) /* save in 1st arg slot */ sall $4, %eax jmp *SUBST(0)(%eax) /* 0x0 - tabfv[0][n] */GLOBL( _tnl_x86_dispatch_vertexattribfv_end )#else /* defined (STDCALL_API) */GLOBL( _tnl_x86_dispatch_vertexattribf1 ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ movl 16(%esp), %eax cmpl $16, %eax jb .81 /* "cmovge" is not supported on all CPUs */ movl $16, %eax.81: leal 20(%esp), %ecx /* load 'v' */ movl %ecx, (%esp) /* save in 1st arg slot */ sall $4, %eax call *SUBST(0)(%eax) /* 0x0 - tabfv[0][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $8 /* return */GLOBL( _tnl_x86_dispatch_vertexattribf1_end )GLOBL( _tnl_x86_dispatch_vertexattribf2 ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ movl 16(%esp), %eax cmpl $16, %eax jb .82 /* "cmovge" is not supported on all CPUs */ movl $16, %eax.82: leal 20(%esp), %ecx /* load 'v' */ movl %ecx, (%esp) /* save in 1st arg slot */ sall $4, %eax call *SUBST(0)(%eax) /* 0x0 - tabfv[0][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $12 /* return */GLOBL( _tnl_x86_dispatch_vertexattribf2_end )GLOBL( _tnl_x86_dispatch_vertexattribf3 ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ movl 16(%esp), %eax cmpl $16, %eax jb .83 /* "cmovge" is not supported on all CPUs */ movl $16, %eax.83: leal 20(%esp), %ecx /* load 'v' */ movl %ecx, (%esp) /* save in 1st arg slot */ sall $4, %eax call *SUBST(0)(%eax) /* 0x0 - tabfv[0][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $16 /* return */GLOBL( _tnl_x86_dispatch_vertexattribf3_end )GLOBL( _tnl_x86_dispatch_vertexattribf4 ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ movl 16(%esp), %eax cmpl $16, %eax jb .84 /* "cmovge" is not supported on all CPUs */ movl $16, %eax.84: leal 20(%esp), %ecx /* load 'v' */ movl %ecx, (%esp) /* save in 1st arg slot */ sall $4, %eax call *SUBST(0)(%eax) /* 0x0 - tabfv[0][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $20 /* return */GLOBL( _tnl_x86_dispatch_vertexattribf4_end )GLOBL( _tnl_x86_dispatch_vertexattribfv ) subl $12, %esp /* gcc does 16 byte alignment of stack frames? */ movl 16(%esp), %eax cmpl $16, %eax jb .9 /* "cmovge" is not supported on all CPUs */ movl $16, %eax.9: movl 20(%esp), %ecx /* load 'v' */ movl %ecx, (%esp) /* save in 1st arg slot */ sall $4, %eax call *SUBST(0)(%eax) /* 0x0 - tabfv[0][n] */ addl $8, %esp /* tear down frame (4 shaved off by the callee) */ ret $8 /* return */GLOBL( _tnl_x86_dispatch_vertexattribfv_end )#endif /* defined (STDCALL_API) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -