fx_3dnow_fasttmp.h [plain text]
#if !defined(NASM_ASSEMBLER) && !defined(MASM_ASSEMBLER)
#define TAGLLBL(a) TAG(.L##a)
#else
#define TAGLLBL(a) TAG(a)
#endif
#if !GLIDE3
#define GR_VERTEX_X_OFFSET 0
#define GR_VERTEX_Y_OFFSET 4
#define GR_VERTEX_Z_OFFSET 8
#define GR_VERTEX_R_OFFSET 12
#define GR_VERTEX_G_OFFSET 16
#define GR_VERTEX_B_OFFSET 20
#define GR_VERTEX_OOZ_OFFSET 24
#define GR_VERTEX_A_OFFSET 28
#define GR_VERTEX_OOW_OFFSET 32
#else
#define GR_VERTEX_X_OFFSET 0
#define GR_VERTEX_Y_OFFSET 4
#define GR_VERTEX_OOZ_OFFSET 8
#define GR_VERTEX_OOW_OFFSET 12
#define GR_VERTEX_R_OFFSET 16
#define GR_VERTEX_G_OFFSET 20
#define GR_VERTEX_B_OFFSET 24
#define GR_VERTEX_A_OFFSET 28
#define GR_VERTEX_Z_OFFSET 32
#endif
#define GR_VERTEX_SOW_TMU0_OFFSET 36
#define GR_VERTEX_TOW_TMU0_OFFSET 40
#define GR_VERTEX_OOW_TMU0_OFFSET 44
#define GR_VERTEX_SOW_TMU1_OFFSET 48
#define GR_VERTEX_TOW_TMU1_OFFSET 52
#define GR_VERTEX_OOW_TMU1_OFFSET 56
#define MAT_SY 20
#define MAT_SZ 40
#define MAT_TX 48
#define MAT_TY 52
#define MAT_TZ 56
GLOBL GLNAME( TAG(fx_3dnow_project_vertices) )
GLNAME( TAG(fx_3dnow_project_vertices) ):
PUSH_L ( EBP )
MOV_L ( REGOFF(8, ESP), ECX )
MOV_L ( REGOFF(12, ESP), EDX )
CMP_L ( ECX, EDX )
JE ( TAGLLBL(FXPV_end) )
FEMMS
PREFETCH ( REGIND(ECX) )
MOV_L ( REGOFF(16, ESP), EBP )
MOV_L ( REGOFF(20, ESP), EAX )
MOVD ( REGOFF(MAT_TX, EBP), MM6 )
PUNPCKLDQ ( REGOFF(MAT_TY, EBP), MM6 )
#if !defined(FX_V2)
MOV_L ( CONST(0x49400000), REGOFF(-8, ESP) )
MOV_L ( CONST(0x49400000), REGOFF(-4, ESP) )
#endif
MOVQ ( REGOFF(-8, ESP), MM4 )
PFADD ( MM4, MM6 )
MOVD ( REGIND(EBP), MM5 )
PUNPCKLDQ ( REGOFF(MAT_SY, EBP), MM5 )
MOVD ( REGOFF(MAT_SZ, EBP), MM1 )
ALIGNTEXT32
TAGLLBL(FXPV_loop_start):
PREFETCH ( REGOFF(64, ECX) )
MOVD ( REGOFF(12, ECX), MM0 )
PFRCP ( MM0, MM0 )
MOVD ( REGOFF(12, ECX), MM7 )
PFRCPIT1 ( MM0, MM7 )
PFRCPIT2 ( MM0, MM7 )
PUNPCKLDQ ( MM7, MM7 )
#if (TYPE & SETUP_RGBA)
MOVD ( REGOFF(CLIP_R, ECX ), MM0 )
MOVD ( MM0, REGOFF(GR_VERTEX_R_OFFSET, ECX) )
#endif
#if (TYPE & SETUP_TMU1)
MOVQ ( REGOFF(CLIP_S1, ECX), MM0 )
PFMUL ( MM7, MM0 )
MOVQ ( MM0, REGOFF(GR_VERTEX_SOW_TMU1_OFFSET, ECX) )
#endif
#if (TYPE & SETUP_TMU0)
MOVQ ( REGOFF(CLIP_S0, ECX), MM0 )
PFMUL ( MM7, MM0 )
MOVQ ( MM0, REGOFF(GR_VERTEX_SOW_TMU0_OFFSET, ECX) )
#endif
MOVQ ( REGIND(ECX), MM2 )
PFMUL ( MM7, MM2 )
MOVD ( REGOFF(8, ECX), MM3 )
PFMUL ( MM7, MM3 )
MOVD ( REGOFF(MAT_TZ, EBP), MM0 )
PFMUL ( MM1, MM3 )
PFADD ( MM0, MM3 )
PFMUL ( MM5, MM2 )
PFADD ( MM6, MM2 )
#if !defined(FX_V2)
PFSUB ( MM4, MM2 )
#endif
MOVQ ( MM2, REGOFF(GR_VERTEX_X_OFFSET, ECX) )
MOVD ( MM3, REGOFF(GR_VERTEX_OOZ_OFFSET, ECX) )
MOVD ( MM7, REGOFF(GR_VERTEX_OOW_OFFSET, ECX) )
ADD_L ( EAX, ECX )
CMP_L ( ECX, EDX )
JA ( TAGLLBL(FXPV_loop_start) )
TAGLLBL(FXPV_end):
FEMMS
POP_L ( EBP )
RET
GLOBL GLNAME( TAG(fx_3dnow_project_clipped_vertices) )
GLNAME( TAG(fx_3dnow_project_clipped_vertices) ):
PUSH_L ( EBP )
MOV_L ( REGOFF(8, ESP), ECX )
MOV_L ( REGOFF(12, ESP), EDX )
FEMMS
PUSH_L ( EDI )
PUSH_L ( ESI )
PREFETCH ( REGIND(ECX) )
MOV_L ( REGOFF(24, ESP), EBP )
MOV_L ( REGOFF(28, ESP), EAX )
MOV_L ( REGOFF(32, ESP), ESI )
MOVD ( REGOFF(MAT_TX, EBP), MM6 )
PUNPCKLDQ ( REGOFF(MAT_TY, EBP), MM6 )
#if !defined(FX_V2)
MOV_L ( CONST(0x49400000), REGOFF(-8, ESP) )
MOV_L ( CONST(0x49400000), REGOFF(-4, ESP) )
#endif
MOVQ ( REGOFF(-8, ESP), MM4 )
PFADD ( MM4, MM6 )
MOVD ( REGIND(EBP), MM5 )
PUNPCKLDQ ( REGOFF(MAT_SY, EBP), MM5 )
MOVD ( REGOFF(MAT_SZ, EBP), MM1 )
ALIGNTEXT32
TAGLLBL(FXPCV_loop_start):
PREFETCH ( REGOFF(64, ECX) )
CMP_B ( CONST(0), REGIND(ESI) )
JNE ( TAGLLBL(FXPCV_skip) )
MOVD ( REGOFF(12, ECX), MM0)
PFRCP ( MM0, MM0 )
MOVD ( REGOFF(12, ECX), MM7)
PFRCPIT1 ( MM0, MM7 )
PFRCPIT2 ( MM0, MM7 )
PUNPCKLDQ ( MM7, MM7 )
#if (TYPE & SETUP_RGBA)
MOVD ( REGOFF(CLIP_R, ECX ), MM0 )
MOVD ( MM0, REGOFF(GR_VERTEX_R_OFFSET, ECX) )
#endif
#if (TYPE & SETUP_TMU1)
MOVQ ( REGOFF(CLIP_S1, ECX), MM0 )
PFMUL ( MM7, MM0 )
MOVQ ( MM0, REGOFF(GR_VERTEX_SOW_TMU1_OFFSET, ECX) )
#endif
#if (TYPE & SETUP_TMU0)
MOVQ ( REGOFF(CLIP_S0, ECX), MM0 )
PFMUL ( MM7, MM0 )
MOVQ ( MM0, REGOFF(GR_VERTEX_SOW_TMU0_OFFSET, ECX) )
#endif
MOVQ ( REGIND(ECX), MM2 )
PFMUL ( MM7, MM2 )
MOVD ( REGOFF(8, ECX), MM3 )
PFMUL ( MM7, MM3 )
MOVD ( REGOFF(MAT_TZ, EBP), MM0 )
PFMUL ( MM1, MM3 )
PFADD ( MM0, MM3 )
PFMUL ( MM5, MM2 )
PFADD ( MM6, MM2 )
#if !defined(FX_V2)
PFSUB ( MM4, MM2 )
#endif
MOVQ ( MM2, REGOFF(GR_VERTEX_X_OFFSET, ECX) )
MOVD ( MM3, REGOFF(GR_VERTEX_OOZ_OFFSET, ECX) )
MOVD ( MM7, REGOFF(GR_VERTEX_OOW_OFFSET, ECX) )
TAGLLBL(FXPCV_skip):
ADD_L ( EAX, ECX )
INC_L ( ESI )
CMP_L ( ECX, EDX )
JA ( TAGLLBL(FXPCV_loop_start) )
POP_L ( ESI )
POP_L ( EDI )
TAGLLBL(FXPCV_end):
FEMMS
POP_L ( EBP )
RET
#undef TYPE
#undef TAG
#undef SIZE