more fixes to NASM sources

This commit is contained in:
dborca
2003-06-13 07:22:59 +00:00
parent 12753febc7
commit b1363fbf0f
9 changed files with 265 additions and 380 deletions

View File

@@ -5,7 +5,9 @@
# Web : http://www.geocities.com/dborca
#
# $Header$
# $Log$
# $Log$
# Revision 1.1.2.3 2003/06/07 09:53:24 dborca
# initial checkin for NASM sources
#

View File

@@ -1,3 +1,11 @@
/*
* CPU detection code
*
* $Header$
* $Log$
*/
#include <signal.h>
#include <setjmp.h>
#include <string.h>
@@ -20,23 +28,30 @@ typedef unsigned long word32;
#define _3DNOWPLUS_FEATURE_BIT 0x40000000
#define _MMXPLUS_FEATURE_BIT 0x00400000
/* Testing code */
/* Testing code:
* TEST_SSE = xorps xmm0, xmm0
* TEST_SSE2 = xorpd xmm0, xmm0
* TEST_3DNOW = femms
* TEST_MMX = emms
* TEST_3DNOWPLUS = femms | pswapd mm0, mm0 | femms
* TEST_MMXPLUS = emms | pminsw mm0, mm0 | emms
*/
#ifdef __GNUC__
#define TEST_CPUID(f) __asm __volatile ("cpuid"::"a"(f):"%ebx", "%ecx", "%edx")
#define TEST_SSE() __asm __volatile ("xorps %xmm0, %xmm0")
#define TEST_SSE2() __asm __volatile ("xorpd %xmm0, %xmm0")
#define TEST_3DNOW() __asm __volatile ("femms")
#define TEST_MMX() __asm __volatile ("emms")
#define TEST_3DNOWPLUS() __asm __volatile ("femms; pswapd %mm0, %mm0; femms")
#define TEST_MMXPLUS() __asm __volatile ("emms; pminsw %mm0, %mm0; emms")
#define TEST_SSE() __asm __volatile (".byte 0x0f, 0x57, 0xc0")
#define TEST_SSE2() __asm __volatile (".byte 0x66, 0x0f, 0x57, 0xc0")
#define TEST_3DNOW() __asm __volatile (".byte 0x0f, 0x0e")
#define TEST_MMX() __asm __volatile (".byte 0x0f, 0x77")
#define TEST_3DNOWPLUS() __asm __volatile (".byte 0x0f, 0x0e, 0x0f, 0x0f, 0xc0, 0xbb, 0x0f, 0x0e")
#define TEST_MMXPLUS() __asm __volatile (".byte 0x0f, 0x77, 0x0f, 0xea, 0xc0, 0x0f, 0x77")
#else
#define TEST_CPUID(f) __asm { _asm mov eax, f _asm cpuid }
#define TEST_SSE() __asm { _asm _emit 0x0f _asm _emit 0x57 _asm _emit 0xc0 }
#define TEST_SSE2() __asm { _asm _emit 0x66 _asm _emit 0x0f _asm _emit 0x57 _asm _emit 0xc0 }
#define TEST_3DNOW() __asm { _asm _emit 0x0f _asm _emit 0x0e }
#define TEST_MMX() __asm { _asm emms }
#define TEST_MMX() __asm { _asm _emit 0x0f _asm _emit 0x77 }
#define TEST_3DNOWPLUS() __asm { _asm _emit 0x0f _asm _emit 0x0e _asm _emit 0x0f _asm _emit 0x0f _asm _emit 0xc0 _asm _emit 0xbb _asm _emit 0x0f _asm _emit 0x0e }
#define TEST_MMXPLUS() __asm { _asm emms _asm _emit 0x0f _asm _emit 0xea _asm _emit 0xc0 _asm emms }
#define TEST_MMXPLUS() __asm { _asm _emit 0x0f _asm _emit 0x77 _asm _emit 0x0f _asm _emit 0xea _asm _emit 0xc0 _asm _emit 0x0f _asm _emit 0x77 }
#endif
@@ -116,12 +131,14 @@ static int has_feature (int feature)
/***
*
* void map_mname(int, int, const char *, char *) maps family and model to processor name
*
****************************************************/
static void map_mname (int family, int model, const char * v_name, char *m_name)
/* Desc: maps family and model to processor name
*
* In : family, model, vendor, ptr to store name
* Out : -
*
* Note: incomplete
*/
static void map_mname (int family, int model, const char *v_name, char *m_name)
{
if (!strncmp("AuthenticAMD", v_name, 12)) {
switch (family) { /* extract family code */
@@ -160,10 +177,12 @@ static void map_mname (int family, int model, const char * v_name, char *m_name)
}
break;
case 6: /* Athlon */
switch (model) { /* No model numbers are currently defined */
case 1:
switch (model) { /* extract model code */
case 3:
strcpy (m_name,"AMD Duron");
break;
default:
strcpy (m_name,"AMD ATHLON");
strcpy (m_name,"AMD Athlon");
}
break;
}
@@ -244,19 +263,13 @@ static void map_mname (int family, int model, const char * v_name, char *m_name)
/***
*
* int _cpuid (_p_info *pinfo)
*
* Entry:
*
* pinfo: pointer to _p_info.
*
* Exit:
*
* Returns int with capablity bit set even if pinfo = NULL
*
****************************************************/
/* Desc: get CPU info
*
* In : pointer to _p_info
* Out : features
*
* Note: -
*/
int _cpuid (_p_info *pinfo)
{
word32 dwStandard = 0;

View File

@@ -19,6 +19,9 @@
;; $Header$
;; $Revision$
;; $Log$
;; Revision 1.1.8.3 2003/06/07 09:53:24 dborca
;; initial checkin for NASM sources
;;
;; Revision 1.1.8.1 2003/04/06 18:23:09 koolsmoky
;; initial checkin of dos win32 glide
;;
@@ -93,16 +96,12 @@
;;; Definitions of cvg regs and glide root structures.
%INCLUDE "fxgasm.h"
extern _GlideRoot
extern _grValidateState
%IFDEF __WIN32__
extern _grCommandTransportMakeRoom@12
%ELSE
extern _grCommandTransportMakeRoom
%ENDIF
extrn _GlideRoot
extrn _grCommandTransportMakeRoom, 12
extrn _grValidateState
%IFDEF HAL_CSIM
extern halStore32
extrn halStore32, 8
%ENDIF
%MACRO GR_FIFO_WRITE 3
@@ -219,31 +218,11 @@ Y equ 4
%MACRO PROC_TYPE 1
%IFDEF GL_AMD3D
%IFDEF __WIN32__
global _trisetup_3DNow_%1@12
_trisetup_3DNow_%1@12:
%ELSE
global _trisetup_3DNow_%1
_trisetup_3DNow_%1:
%ENDIF
proc _trisetup_3DNow_%1, 12
%ELIFDEF GL_SSE
proc _trisetup_SSE_%1, 12
%ELSE
%IFDEF GL_SSE
%IFDEF __WIN32__
global _trisetup_SSE_%1@12
_trisetup_SSE_%1@12:
%ELSE
global _trisetup_SSE_%1
_trisetup_SSE_%1:
%ENDIF
%ELSE
%IFDEF __WIN32__
global _trisetup_Default_%1@12
_trisetup_Default_%1@12:
%ELSE
global _trisetup_Default_%1
_trisetup_Default_%1:
%ENDIF
%ENDIF
proc _trisetup_Default_%1, 12
%ENDIF
%ENDM
@@ -278,6 +257,8 @@ PROC_TYPE clip_nocull_invalid
%undef GLIDE_CLIP_COORDS
%undef GLIDE_VALIDATE_STATE
endp
ALIGN 32
PROC_TYPE clip_cull_invalid
@@ -294,6 +275,8 @@ PROC_TYPE clip_cull_invalid
%undef GLIDE_CULLING
%undef GLIDE_CLIP_COORDS
%undef GLIDE_VALIDATE_STATE
endp
ALIGN 32
PROC_TYPE clip_cull_valid
@@ -311,6 +294,8 @@ PROC_TYPE clip_cull_valid
%undef GLIDE_CULLING
%undef GLIDE_CLIP_COORDS
%undef GLIDE_VALIDATE_STATE
endp
ALIGN 32
PROC_TYPE clip_nocull_valid
@@ -329,6 +314,8 @@ PROC_TYPE clip_nocull_valid
%undef GLIDE_CLIP_COORDS
%undef GLIDE_VALIDATE_STATE
endp
ALIGN 32
PROC_TYPE win_nocull_invalid
@@ -346,6 +333,8 @@ PROC_TYPE win_nocull_invalid
%undef GLIDE_CLIP_COORDS
%undef GLIDE_VALIDATE_STATE
endp
ALIGN 32
PROC_TYPE win_cull_invalid
@@ -363,6 +352,8 @@ PROC_TYPE win_cull_invalid
%undef GLIDE_CLIP_COORDS
%undef GLIDE_VALIDATE_STATE
endp
ALIGN 32
PROC_TYPE win_cull_valid
@@ -379,6 +370,8 @@ PROC_TYPE win_cull_valid
%undef GLIDE_CULLING
%undef GLIDE_CLIP_COORDS
%undef GLIDE_VALIDATE_STATE
endp
ALIGN 32
PROC_TYPE win_nocull_valid
@@ -397,15 +390,11 @@ PROC_TYPE win_nocull_valid
%undef GLIDE_CLIP_COORDS
%undef GLIDE_VALIDATE_STATE
endp
%IFDEF GL_AMD3D
ALIGN 32
%IFDEF __WIN32__
global _trisetup_clip_coor_thunk@12
_trisetup_clip_coor_thunk@12:
%ELSE
global _trisetup_clip_coor_thunk
_trisetup_clip_coor_thunk:
%ENDIF
proc _trisetup_clip_coor_thunk, 12
%define procPtr eax
%define vPtr ecx
@@ -419,8 +408,7 @@ _trisetup_clip_coor_thunk:
;; If debugging make sure that we're in clip coordinates
%IFDEF GLIDE_DEBUG
mov eax, [gc + CoordinateSpace]
test eax, 1
test dword [gc + CoordinateSpace], 1
jnz __clipSpace
xor eax, eax
mov [eax], eax
@@ -429,19 +417,14 @@ __clipSpace:
invoke procPtr, 1, 3, vPtr ; (*gc->curArchProcs.drawTrianglesProc)(grDrawVertexArray, 3, vPtr)
ret 12 ; pop 3 dwords (vertex addrs) and return
ret ; pop 3 dwords (vertex addrs) and return
endp
%ENDIF ; GL_AMD3D
%IFDEF GL_SSE
ALIGN 32
%IFDEF __WIN32__
global _trisetup_SSE_clip_coor_thunk@12
_trisetup_SSE_clip_coor_thunk@12:
%ELSE
global _trisetup_SSE_clip_coor_thunk
_trisetup_SSE_clip_coor_thunk:
%ENDIF
proc _trisetup_SSE_clip_coor_thunk, 12
%define procPtr eax
%define vPtr ecx
@@ -455,8 +438,7 @@ _trisetup_SSE_clip_coor_thunk:
;; If debugging make sure that we're in clip coordinates
%IFDEF GLIDE_DEBUG
mov eax, [gc + CoordinateSpace]
test eax, 1
test dword [gc + CoordinateSpace], 1
jnz __clipSpace
xor eax, eax
mov [eax], eax
@@ -465,6 +447,7 @@ __clipSpace:
invoke procPtr, 1, 3, vPtr ; (*gc->curArchProcs.drawTrianglesProc)(grDrawVertexArray, 3, vPtr)
ret 12 ; pop 3 dwords (vertex addrs) and return
ret ; pop 3 dwords (vertex addrs) and return
endp
%ENDIF ; GL_SSE

View File

@@ -20,6 +20,9 @@
;; $Header$
;; $Revision$
;; $Log$
;; Revision 1.1.8.3 2003/06/07 09:53:24 dborca
;; initial checkin for NASM sources
;;
;; Revision 1.1.8.1 2003/04/06 18:23:09 koolsmoky
;; initial checkin of dos win32 glide
;;
@@ -120,7 +123,7 @@
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD arguments off stack
ret ; return, pop 3 DWORD arguments off stack
win_coordinates:
%endif ; GLIDE_CLIP_COORDS
@@ -191,11 +194,7 @@ win_coordinates:
cmp ebx, tempVal ; fifo space required >= space available ?
jge .__triBegin ; yup, push out triangle data to Voodoo
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, tempVal, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, tempVal, 0, __LINE__; note: updates fifoPtr
%ENDIF
jmp .__triBegin ; merge back with short path
@@ -213,11 +212,7 @@ win_coordinates:
cmp ebx, tempVal ; fifo spce available >= space needed ?
jge .__triBegin ; yup, ready to draw triangle
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, tempVal, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, tempVal, 0, __LINE__; note: updates fifoPtr
%ENDIF
%ELSE ; !GLIDE_CULLING
;; Prologue stuff
@@ -252,7 +247,7 @@ win_coordinates:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD arguments off stack
ret ; return, pop 3 DWORD arguments off stack
ALIGN 16
win_coordinates:
@@ -278,11 +273,7 @@ no_validation:
cmp ebx, tempVal ; fifo spce available >= space needed ?
jge .__triBegin ; yup, ready to draw triangle
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, tempVal, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, tempVal, 0, __LINE__; note: updates fifoPtr
%ENDIF
jmp .__triBegin ; large distance due to alignment
%endif ; GLIDE_CULLING
@@ -580,7 +571,7 @@ no_validation:
femms ; no more AMD3D code, clear FPU/MMX regs
ret 12 ; return to caller
ret ; return to caller
%IF GLIDE_CULLING
@@ -601,7 +592,7 @@ no_validation:
pop esi
pop edi
ret 12
ret
%ENDIF ; GLIDE_CULLING
%ENDIF ; !GLIDE_CLIP_COORDS
@@ -672,7 +663,7 @@ no_validation:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD arguments off stack
ret ; return, pop 3 DWORD arguments off stack
win_coordinates:
%endif ; GLIDE_CLIP_COORDS
@@ -755,11 +746,7 @@ win_coordinates:
cmp ebx, tempVal ; fifo space required >= space available ?
jge .__triBegin ; yup, push out triangle data to Voodoo
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, tempVal, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, tempVal, 0, __LINE__; note: updates fifoPtr
%ENDIF
jmp .__triBegin ; merge back with short path
@@ -777,11 +764,7 @@ win_coordinates:
cmp ebx, tempVal ; fifo spce available >= space needed ?
jge .__triBegin ; yup, ready to draw triangle
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, tempVal, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, tempVal, 0, __LINE__; note: updates fifoPtr
%ENDIF
%ELSE ; !GLIDE_CULLING
;; Prologue stuff
@@ -816,7 +799,7 @@ win_coordinates:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD arguments off stack
ret ; return, pop 3 DWORD arguments off stack
ALIGN 16
win_coordinates:
@@ -849,11 +832,7 @@ no_validation:
cmp ebx, tempVal ; fifo spce available >= space needed ?
jge .__triBegin ; yup, ready to draw triangle
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, tempVal, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, tempVal, 0, __LINE__; note: updates fifoPtr
%ENDIF
jmp .__triBegin ; large distance due to alignment
%endif ; GLIDE_CULLING
@@ -1149,7 +1128,7 @@ no_validation:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return to caller
ret ; return to caller
%IF GLIDE_CULLING
@@ -1168,7 +1147,7 @@ no_validation:
pop esi
pop edi
ret 12
ret
%ENDIF ; GLIDE_CULLING
%ENDIF ; !GLIDE_CLIP_COORDS
@@ -1322,12 +1301,8 @@ no_validation:
cmp ebx, eax
jge .__triBegin
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, eax, 0, __LINE__
%ELSE
invoke _grCommandTransportMakeRoom, eax, 0, __LINE__
%ENDIF
;; Send triangle parameters
@@ -1427,7 +1402,7 @@ no_validation:
mov [gc + trisProcessed], ecx
pop esi
ret 12
ret
%ENDIF ; !GLIDE_CLIP_COOR
%ENDIF ; !GL_SSE
%ENDIF ; !GL_AMD3D

View File

@@ -21,13 +21,9 @@
%include "xos.inc"
extern _GlideRoot
extern _grValidateState
%IFDEF __WIN32__
extern _grCommandTransportMakeRoom@12
%ELSE
extern _grCommandTransportMakeRoom
%ENDIF
extrn _GlideRoot
extrn _grValidateState
extrn _grCommandTransportMakeRoom, 12
%ifdef GL_AMD3D
@@ -54,19 +50,10 @@ vertices DD 0
segment TEXT
ALIGN 32
%IFDEF __WIN32__
global _grDrawTriangles_3DNow@12
%ELSE
global _grDrawTriangles_3DNow
%ENDIF
proc _grDrawTriangles_3DNow, 12
%define _mode 20
%define _count 24
%define _pointers 28
%IFDEF __WIN32__
_grDrawTriangles_3DNow@12:
%ELSE
_grDrawTriangles_3DNow:
%ENDIF
; 930 : {
; 931 : #define FN_NAME "_grDrawTriangles"
@@ -198,11 +185,7 @@ _grDrawTriangles_3DNow:
cmp eax, ecx ; fifo space avail >= packet size ?
jge .win_tri_begin_ND ; yup, start writing triangle data
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, ecx, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, ecx, 0, __LINE__; note: updates fifoPtr
%ENDIF
align 32
.win_tri_begin_ND:
@@ -316,7 +299,7 @@ _grDrawTriangles_3DNow:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD parameters off stack
ret ; return, pop 3 DWORD parameters off stack
.fifo_aligned_ND:
@@ -398,7 +381,7 @@ _grDrawTriangles_3DNow:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD parameters off stack
ret ; return, pop 3 DWORD parameters off stack
align 32
@@ -427,11 +410,7 @@ _grDrawTriangles_3DNow:
cmp eax, ecx ; fifo space avail >= packet size ?
jge .win_tri_begin_D ; yup, start writing triangle data
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, ecx, 0, __LINE__ ; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, ecx, 0, __LINE__ ; note: updates fifoPtr
%ENDIF
align 32
.win_tri_begin_D:
@@ -523,7 +502,7 @@ _grDrawTriangles_3DNow:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD parameters off stack
ret ; return, pop 3 DWORD parameters off stack
.fifo_aligned_D:
@@ -605,7 +584,7 @@ _grDrawTriangles_3DNow:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD parameters off stack
ret ; return, pop 3 DWORD parameters off stack
ALIGN 32
@@ -671,11 +650,7 @@ _grDrawTriangles_3DNow:
cmp eax, ecx ; fifo space avail >= packet size ?
jge .clip_tri_begin ; yup, start writing triangle data
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, ecx, 0, __LINE__ ; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, ecx, 0, __LINE__ ; note: updates fifoPtr
%ENDIF
align 32
.clip_tri_begin:
@@ -1098,7 +1073,8 @@ _grDrawTriangles_3DNow:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD parameters
ret ; return, pop 3 DWORD parameters
endp
_pktype equ 20
_type equ 24
@@ -1118,13 +1094,8 @@ _type equ 24
%define Y 4
ALIGN 32
%IFDEF __WIN32__
global _grDrawVertexList_3DNow_Window@20
_grDrawVertexList_3DNow_Window@20:
%ELSE
global _grDrawVertexList_3DNow_Window
_grDrawVertexList_3DNow_Window:
%ENDIF
proc _grDrawVertexList_3DNow_Window, 20
; 132 : {
SET_TLSBASE edx ; get thread local storage base pointer
@@ -1205,11 +1176,7 @@ _grDrawVertexList_3DNow_Window:
cmp eax, ecx ; fifo space avail >= packet size ?
jge .win_strip_begin_ND ; yup, start writing strip data
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, ecx, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, ecx, 0, __LINE__; note: updates fifoPtr
%ENDIF
align 32
.win_strip_begin_ND:
@@ -1338,7 +1305,7 @@ _grDrawVertexList_3DNow_Window:
pop esi ; restore caller's register variable
pop edi ; restire caller's register variable
ret 20 ; return, pop 5 DWORD parameters off stack
ret ; return, pop 5 DWORD parameters off stack
ALIGN 32
@@ -1438,7 +1405,7 @@ _grDrawVertexList_3DNow_Window:
pop esi ; restore caller's register variable
pop edi ; restire caller's register variable
ret 20 ; return, pop 5 DWORD parameters off stack
ret ; return, pop 5 DWORD parameters off stack
ALIGN 32
@@ -1466,11 +1433,7 @@ _grDrawVertexList_3DNow_Window:
cmp eax, ecx ; fifo space avail >= packet size ?
jge .win_strip_begin_D ; yup, start writing strip data
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, ecx, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, ecx, 0, __LINE__; note: updates fifoPtr
%ENDIF
align 32
.win_strip_begin_D:
@@ -1600,7 +1563,7 @@ _grDrawVertexList_3DNow_Window:
pop esi ; restore caller's register variable
pop edi ; restire caller's register variable
ret 20 ; return, pop 5 DWORD parameters off stack
ret ; return, pop 5 DWORD parameters off stack
ALIGN 32
@@ -1701,20 +1664,15 @@ _grDrawVertexList_3DNow_Window:
pop esi ; restore caller's register variable
pop edi ; restire caller's register variable
ret 20 ; return, pop 5 DWORD parameters off stack
ret ; return, pop 5 DWORD parameters off stack
endp
ALIGN 32
%IFDEF __WIN32__
global _grDrawVertexList_3DNow_Clip@20
_grDrawVertexList_3DNow_Clip@20:
%ELSE
global _grDrawVertexList_3DNow_Clip
_grDrawVertexList_3DNow_Clip:
%ENDIF
proc _grDrawVertexList_3DNow_Clip, 20
; 132 : {
SET_TLSBASE edx ; get thread local storage base pointer
@@ -1794,11 +1752,7 @@ _grDrawVertexList_3DNow_Clip:
cmp eax, ecx ; fifo space avail >= packet size ?
jge .clip_strip_begin ; yup, start writing strip data
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, ecx, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, ecx, 0, __LINE__; note: updates fifoPtr
%ENDIF
align 32
.clip_strip_begin:
@@ -2184,7 +2138,8 @@ _grDrawVertexList_3DNow_Clip:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 20 ; return, pop 5 DWORD parameters off stack
ret ; return, pop 5 DWORD parameters off stack
endp
;;--------------------------------------------------------------------------
;; end AMD3D version
@@ -2216,19 +2171,10 @@ vertices DD 0
segment TEXT
ALIGN 32
%IFDEF __WIN32__
global _grDrawTriangles_SSE@12
%ELSE
global _grDrawTriangles_SSE
%ENDIF
proc _grDrawTriangles_SSE, 12
%define _mode 20
%define _count 24
%define _pointers 28
%IFDEF __WIN32__
_grDrawTriangles_SSE@12:
%ELSE
_grDrawTriangles_SSE:
%ENDIF
; 930 : {
; 931 : #define FN_NAME "_grDrawTriangles"
@@ -2367,11 +2313,7 @@ _grDrawTriangles_SSE:
cmp eax, ecx ; fifo space avail >= packet size ?
jge .win_tri_begin_ND ; yup, start writing triangle data
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, ecx, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, ecx, 0, __LINE__; note: updates fifoPtr
%ENDIF
align 32
.win_tri_begin_ND:
@@ -2483,7 +2425,7 @@ _grDrawTriangles_SSE:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD parameters off stack
ret ; return, pop 3 DWORD parameters off stack
.fifo_aligned_ND:
@@ -2577,7 +2519,7 @@ _grDrawTriangles_SSE:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD parameters off stack
ret ; return, pop 3 DWORD parameters off stack
align 32
@@ -2606,11 +2548,7 @@ _grDrawTriangles_SSE:
cmp eax, ecx ; fifo space avail >= packet size ?
jge .win_tri_begin_D ; yup, start writing triangle data
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, ecx, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, ecx, 0, __LINE__; note: updates fifoPtr
%ENDIF
align 32
.win_tri_begin_D:
@@ -2700,7 +2638,7 @@ _grDrawTriangles_SSE:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD parameters off stack
ret ; return, pop 3 DWORD parameters off stack
.fifo_aligned_D:
@@ -2797,7 +2735,7 @@ _grDrawTriangles_SSE:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD parameters off stack
ret ; return, pop 3 DWORD parameters off stack
ALIGN 32
@@ -2863,11 +2801,7 @@ _grDrawTriangles_SSE:
cmp eax, ecx ; fifo space avail >= packet size ?
jge .clip_tri_begin ; yup, start writing triangle data
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, ecx, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, ecx, 0, __LINE__; note: updates fifoPtr
%ENDIF
align 32
.clip_tri_begin:
@@ -3289,7 +3223,8 @@ _grDrawTriangles_SSE:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 12 ; return, pop 3 DWORD parameters
ret ; return, pop 3 DWORD parameters
endp
_pktype equ 20
_type equ 24
@@ -3310,13 +3245,7 @@ _type equ 24
ALIGN 32
%IFDEF __WIN32__
global _grDrawVertexList_SSE_Window@20
_grDrawVertexList_SSE_Window@20:
%ELSE
global _grDrawVertexList_SSE_Window
_grDrawVertexList_SSE_Window:
%ENDIF
proc _grDrawVertexList_SSE_Window, 20
; 132 : {
SET_TLSBASE edx ; get thread local storage base pointer
@@ -3404,11 +3333,7 @@ _grDrawVertexList_SSE_Window:
cmp eax, ecx ; fifo space avail >= packet size ?
jge .win_strip_begin_ND ; yup, start writing strip data
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, ecx, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, ecx, 0, __LINE__; note: updates fifoPtr
%ENDIF
align 32
.win_strip_begin_ND:
@@ -3535,7 +3460,7 @@ _grDrawVertexList_SSE_Window:
pop esi ; restore caller's register variable
pop edi ; restire caller's register variable
ret 20 ; return, pop 5 DWORD parameters off stack
ret ; return, pop 5 DWORD parameters off stack
ALIGN 32
@@ -3647,7 +3572,7 @@ _grDrawVertexList_SSE_Window:
pop esi ; restore caller's register variable
pop edi ; restire caller's register variable
ret 20 ; return, pop 5 DWORD parameters off stack
ret ; return, pop 5 DWORD parameters off stack
ALIGN 32
@@ -3682,11 +3607,7 @@ _grDrawVertexList_SSE_Window:
cmp eax, ecx ; fifo space avail >= packet size ?
jge .win_strip_begin_D ; yup, start writing strip data
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, ecx, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, ecx, 0, __LINE__; note: updates fifoPtr
%ENDIF
align 32
.win_strip_begin_D:
@@ -3814,7 +3735,7 @@ _grDrawVertexList_SSE_Window:
pop esi ; restore caller's register variable
pop edi ; restire caller's register variable
ret 20 ; return, pop 5 DWORD parameters off stack
ret ; return, pop 5 DWORD parameters off stack
ALIGN 32
@@ -3930,20 +3851,15 @@ _grDrawVertexList_SSE_Window:
pop esi ; restore caller's register variable
pop edi ; restire caller's register variable
ret 20 ; return, pop 5 DWORD parameters off stack
ret ; return, pop 5 DWORD parameters off stack
endp
ALIGN 32
%IFDEF __WIN32__
global _grDrawVertexList_SSE_Clip@20
_grDrawVertexList_SSE_Clip@20:
%ELSE
global _grDrawVertexList_SSE_Clip
_grDrawVertexList_SSE_Clip:
%ENDIF
proc _grDrawVertexList_SSE_Clip, 20
; 132 : {
SET_TLSBASE edx ; get thread local storage base pointer
@@ -4023,11 +3939,7 @@ _grDrawVertexList_SSE_Clip:
cmp eax, ecx ; fifo space avail >= packet size ?
jge .clip_strip_begin ; yup, start writing strip data
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, ecx, 0, __LINE__; note: updates fifoPtr
%ELSE
invoke _grCommandTransportMakeRoom, ecx, 0, __LINE__; note: updates fifoPtr
%ENDIF
align 32
.clip_strip_begin:
@@ -4412,7 +4324,8 @@ _grDrawVertexList_SSE_Clip:
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret 20 ; return, pop 5 DWORD parameters off stack
ret ; return, pop 5 DWORD parameters off stack
endp
;;--------------------------------------------------------------------------
;; end SSE version
@@ -4465,13 +4378,7 @@ _pointers equ 36
ALIGN 32
%IFDEF __WIN32__
global _drawvertexlist@20
_drawvertexlist@20:
%ELSE
global _drawvertexlist
_drawvertexlist:
%ENDIF
proc _drawvertexlist, 20
; 132 : {
SET_TLSBASE eax ; get thread local storage base pointer
@@ -4543,11 +4450,7 @@ _drawvertexlist:
add eax, 4
cmp ecx, eax
jge .win_strip_begin
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, eax, 0, __LINE__
%ELSE
invoke _grCommandTransportMakeRoom, eax, 0, __LINE__
%ENDIF
align 4
.win_strip_begin:
@@ -4664,7 +4567,8 @@ _drawvertexlist:
pop ebx
pop edi
pop esi
ret 20 ; 00000014H
ret ; 00000014H
endp
%define gc esi ; points to graphics context
%define fifo ecx ; points to next entry in fifo
@@ -4672,13 +4576,7 @@ _drawvertexlist:
ALIGN 32
%IFDEF __WIN32__
global _vpdrawvertexlist@20
_vpdrawvertexlist@20:
%ELSE
global _vpdrawvertexlist
_vpdrawvertexlist:
%ENDIF
proc _vpdrawvertexlist, 20
SET_TLSBASE eax ; tls base pointer
push esi
@@ -4749,11 +4647,7 @@ _vpdrawvertexlist:
add eax, 4
cmp ecx, eax
jge .clip_strip_begin
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, eax, 0, __LINE__
%ELSE
invoke _grCommandTransportMakeRoom, eax, 0, __LINE__
%ENDIF
align 4
.clip_strip_begin:
@@ -5121,7 +5015,8 @@ _vpdrawvertexlist:
pop edi
pop esi
ret 20 ; 00000014H
ret ; 00000014H
endp
%define gc esi ; points to graphics context
%define fifo ecx ; points to next entry in fifo
@@ -5136,13 +5031,7 @@ _vpdrawvertexlist:
ALIGN 32
%IFDEF __WIN32__
global _vptrisetup_cull@12
_vptrisetup_cull@12:
%ELSE
global _vptrisetup_cull
_vptrisetup_cull:
%ENDIF
proc _vptrisetup_cull, 12
_va equ 20
_vb equ 24
_vc equ 28
@@ -5198,12 +5087,8 @@ _vc equ 28
cmp ecx, eax
jge .setup_pkt_hdr
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, eax, 0, __LINE__
%ELSE
invoke _grCommandTransportMakeRoom, eax, 0, __LINE__
%ENDIF
align 4
.setup_pkt_hdr:
@@ -5534,7 +5419,8 @@ _vc equ 28
pop ebx
ret 12 ; 0000000cH
ret ; 0000000cH
endp
%endif ; !GL_SSE
%endif ; !GL_MMX

View File

@@ -1,14 +1,95 @@
;
; compulsory header for h5/glide3/xdraw* assembly specializations (NASM)
;
; $Header$
; $Log$
;
%undef STDCALL
;
; compulsory header for h5/glide3/xdraw* assembly specializations (NASM)
;
; $Header$
; $Log$
; Revision 1.1.2.1 2003/06/07 09:53:25 dborca
; initial checkin for NASM sources
;
%ifdef __WIN32__
;---------------------------------------
; platform defines
;---------------------------------------
%define XOS_DJGPP 1
%define XOS_LINUX 2
%define XOS_WIN32 4
%define STDCALL 0
;---------------------------------------
; pick up the right OS
;---------------------------------------
%ifdef __DJGPP__
%define XOS XOS_DJGPP
%elifdef __linux__
%define XOS XOS_LINUX
%elifdef __WIN32__
%define XOS XOS_WIN32
%define STDCALL 1
%else
%error Unknown OS
%endif
;---------------------------------------
; general purpose macros
;---------------------------------------
%macro extrn 1-2 0
%if (XOS == XOS_WIN32) && STDCALL && (%2 > 0)
%define %1 %1@%2
%endif
extern %1
%endmacro
%macro globl 1-2 0
%if (XOS == XOS_WIN32) && STDCALL && (%2 > 0)
%define %1 %1@%2
%endif
global %1
%endmacro
%macro proc 1-2 0
%push proc
%if STDCALL && (%2 > 0)
%define %$ret RET %2
%else
%define %$ret RET
%endif
globl %1, %2
%1:
%endmacro
%macro endp 0
%ifnctx proc
%error Mismatched `endp'/`proc'
%else
%pop
%endif
%endmacro
%macro ret 0
%ifnctx proc
RET
%else
%$ret
%endif
%endmacro
%macro invoke 1-*
%rep %0 - 1
%rotate -1
push %1
%endrep
%rotate -1
call %1
%if (STDCALL == 0) && (%0 > 1)
add esp, 4 * (%0 - 1)
%endif
%endmacro
;---------------------------------------
; Windows
;---------------------------------------
%if XOS == XOS_WIN32
%define TEXT .text align=32
%define DATA .data align=32
@@ -28,13 +109,16 @@
%endif
%ifdef __DJGPP__
;---------------------------------------
; DJGPP
;---------------------------------------
%if XOS == XOS_DJGPP
%define TEXT .text
%define DATA .data
%define CONST .rodata
extern threadValueDJGPP
extrn threadValueDJGPP
%macro SET_TLSBASE 1
%endmacro
@@ -45,15 +129,19 @@ extern threadValueDJGPP
%macro GET_GC 2
mov gc, [threadValueDJGPP]
%endmacro
%endif
%ifdef __linux__
;---------------------------------------
; Linux
;---------------------------------------
%if XOS == XOS_LINUX
%define TEXT .text align=32
%define DATA .data align=32
%define CONST .rodata align=32
extern threadValueLinux
extrn threadValueLinux
%macro SET_TLSBASE 1
%endmacro
@@ -64,26 +152,5 @@ extern threadValueLinux
%macro GET_GC 2
mov gc, [threadValueLinux]
%endmacro
%endif
%macro ret 0-1
%ifdef STDCALL
ret %1
%else
ret
%endif
%endmacro
%macro invoke 1-*
%rep %0 - 1
%rotate -1
push %1
%endrep
%rotate -1
call %1
%ifndef STDCALL
%if %0 > 1
add esp, 4 * (%0 - 1)
%endif
%endif
%endmacro

View File

@@ -19,6 +19,9 @@
;; $Header$
;; $Revision$
;; $Log$
;; Revision 1.1.8.3 2003/06/07 09:53:25 dborca
;; initial checkin for NASM sources
;;
;; Revision 1.1.8.1 2003/04/06 18:23:10 koolsmoky
;; initial checkin of dos win32 glide
;;
@@ -70,11 +73,7 @@
%include "xos.inc"
%ifdef USE_PACKET_FIFO
%IFDEF __WIN32__
extern _grCommandTransportMakeRoom@12
%ELSE
extern _grCommandTransportMakeRoom
%ENDIF
extrn _grCommandTransportMakeRoom, 12
%endif
;;; Definitions of cvg regs and glide root structures.
@@ -115,22 +114,10 @@ segment TEXT
ALIGN 32
%IFDEF GL_AMD3D
%IFDEF __WIN32__
global _grTexDownload_3DNow_MMX@24
_grTexDownload_3DNow_MMX@24:
%ELSE
global _grTexDownload_3DNow_MMX
_grTexDownload_3DNow_MMX:
%ENDIF
proc _grTexDownload_3DNow_MMX, 24
%ENDIF
%IFDEF GL_MMX
%IFDEF __WIN32__
global _grTexDownload_MMX@24
_grTexDownload_MMX@24:
%ELSE
global _grTexDownload_MMX
_grTexDownload_MMX:
%ENDIF
proc _grTexDownload_MMX, 24
%ENDIF
push ebx ; save caller's register variable
@@ -202,11 +189,7 @@ _grTexDownload_MMX:
jge .mmxAlignFifo ; yes, write NULL packet to align fifo
%ifdef USE_PACKET_FIFO
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, 4, 0, __LINE__; make fifo room
%ELSE
invoke _grCommandTransportMakeRoom, 4, 0, __LINE__; make fifo room
%ENDIF
%endif
mov fifo, [gc + fifoPtr] ; fifoPtr modified by _grCommandTransportMakeRoom, reload
@@ -304,11 +287,7 @@ _grTexDownload_MMX:
jge .loopT ; yup, write next scan line
%ifdef USE_PACKET_FIFO
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, eax, 0, __LINE__; make fifo room (if fifoPtr QWORD aligned before
%ELSE
invoke _grCommandTransportMakeRoom, eax, 0, __LINE__; make fifo room (if fifoPtr QWORD aligned before
%ENDIF
%endif
mov fifo, [gc + fifoPtr] ; fifoPtr was modified by _grCommandTransportMakeRoom, reload
@@ -331,7 +310,8 @@ _grTexDownload_MMX:
pop esi ; restore caller's register variable
pop ebx ; restore caller's register variable
ret 24 ; pop 6 DWORD parameters and return
ret ; pop 6 DWORD parameters and return
endp
%ELSE ; !GL_SSE2
@@ -345,13 +325,7 @@ segment TEXT
ALIGN 32
%IFDEF __WIN32__
global _grTexDownload_SSE2_64@24
_grTexDownload_SSE2_64@24:
%ELSE
global _grTexDownload_SSE2_64
_grTexDownload_SSE2_64:
%ENDIF
proc _grTexDownload_SSE2_64, 24
push ebx ; save caller's register variable
mov curT, [esp + _maxT$ - 12] ; curT = maxT
@@ -424,11 +398,7 @@ _grTexDownload_SSE2_64:
jge .xmmAlignFifo ; yes, write NULL packet to align fifo
%ifdef USE_PACKET_FIFO
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, 4, 0, __LINE__; make fifo room
%ELSE
invoke _grCommandTransportMakeRoom, 4, 0, __LINE__; make fifo room
%ENDIF
%endif
mov fifo, [gc + fifoPtr] ; fifoPtr modified by _grCommandTransportMakeRoom, reload
@@ -526,11 +496,7 @@ _grTexDownload_SSE2_64:
jge .loopT ; yup, write next scan line
%ifdef USE_PACKET_FIFO
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, eax, 0, __LINE__; make fifo room (if fifoPtr QWORD aligned before
%ELSE
invoke _grCommandTransportMakeRoom, eax, 0, __LINE__; make fifo room (if fifoPtr QWORD aligned before
%ENDIF
%endif
mov fifo, [gc + fifoPtr] ; fifoPtr was modified by _grCommandTransportMakeRoom, reload
@@ -546,7 +512,8 @@ _grTexDownload_SSE2_64:
pop esi ; restore caller's register variable
pop ebx ; restore caller's register variable
ret 24 ; pop 6 DWORD parameters and return
ret ; pop 6 DWORD parameters and return
endp
@@ -554,13 +521,7 @@ segment TEXT
ALIGN 32
%IFDEF __WIN32__
global _grTexDownload_SSE2_128@24
_grTexDownload_SSE2_128@24:
%ELSE
global _grTexDownload_SSE2_128
_grTexDownload_SSE2_128:
%ENDIF
proc _grTexDownload_SSE2_128, 24
push ebx ; save caller's register variable
mov curT, [esp + _maxT$ - 12] ; curT = maxT
@@ -633,11 +594,7 @@ _grTexDownload_SSE2_128:
jge .xmmAlignFifo ; yes, write NULL packet to align fifo
%ifdef USE_PACKET_FIFO
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, 4, 0, __LINE__; make fifo room
%ELSE
invoke _grCommandTransportMakeRoom, 4, 0, __LINE__; make fifo room
%ENDIF
%endif
mov fifo, [gc + fifoPtr] ; fifoPtr modified by _grCommandTransportMakeRoom, reload
@@ -735,11 +692,7 @@ _grTexDownload_SSE2_128:
jge .loopT ; yup, write next scan line
%ifdef USE_PACKET_FIFO
%IFDEF __WIN32__
invoke _grCommandTransportMakeRoom@12, eax, 0, __LINE__; make fifo room (if fifoPtr QWORD aligned before
%ELSE
invoke _grCommandTransportMakeRoom, eax, 0, __LINE__; make fifo room (if fifoPtr QWORD aligned before
%ENDIF
%endif
mov fifo, [gc + fifoPtr] ; fifoPtr was modified by _grCommandTransportMakeRoom, reload
@@ -755,7 +708,8 @@ _grTexDownload_SSE2_128:
pop esi ; restore caller's register variable
pop ebx ; restore caller's register variable
ret 24 ; pop 6 DWORD parameters and return
ret ; pop 6 DWORD parameters and return
endp
%ENDIF ; GL_SSE2

View File

@@ -1,8 +1,11 @@
# DOS/DJGPP tests makefile v1.0 for Glide3
# DOS/DJGPP tests makefile for Glide3
#
# Copyright (c) 2002 - Borca Daniel
# Email : dborca@yahoo.com
# Web : http://www.geocities.com/dborca
#
# $Header$
# $Log$
#
@@ -28,7 +31,7 @@ TOP = ../../..
CPU ?= k6
CC = gcc
CFLAGS = -Wall -O2 -ffast-math -mcpu=k6
CFLAGS = -Wall -O2 -ffast-math -mcpu=$(CPU)
CFLAGS += -I$(TOP)/$(FX_GLIDE_HW)/glide3/src -I$(TOP)/$(FX_GLIDE_HW)/incsrc
CFLAGS += -I$(TOP)/swlibs/fxmisc
CFLAGS += -D__DOS__ -DH3

View File

@@ -5,7 +5,9 @@
# Web : http://www.geocities.com/dborca
#
# $Header$
# $Log$
# $Log$
# Revision 1.1.2.1 2003/06/07 09:53:25 dborca
# initial checkin for NASM sources
#
@@ -30,7 +32,7 @@ TOP = ../../..
CPU ?= k6
CC = mingw32-gcc
CFLAGS = -Wall -O2 -ffast-math -mcpu=k6
CFLAGS = -Wall -O2 -ffast-math -mcpu=$(CPU)
CFLAGS += -I$(TOP)/$(FX_GLIDE_HW)/glide3/src -I$(TOP)/$(FX_GLIDE_HW)/incsrc
CFLAGS += -I$(TOP)/swlibs/fxmisc
CFLAGS += -D__WIN32__ -DH3