source: GTP/trunk/App/Demos/Geom/Shark3D/src/drv_d3d9_mmx.h @ 2236

Revision 2236, 6.0 KB checked in by gumbau, 17 years ago (diff)
Line 
1///////////////////////////////////////////////////////////////////////////////
2//
3//      ##  ######
4//       ######  ###
5//  ## ###############        Shark 3D Engine (www.shark3d.com)
6//   ########## # # #
7//    ########                Copyright (c) 1996-2006 Spinor GmbH.
8//   ######### # # #          All rights reserved.
9//  ##   ##########
10//      ##
11//
12///////////////////////////////////////////////////////////////////////////////
13
14//@cpp
15#ifndef S3D_DRV_D3D9_MMX_H
16#define S3D_DRV_D3D9_MMX_H
17
18#include "general/general_env.h"
19#include "sys/core/sys_types.h"
20#include "sys/core/sys_assert.h"
21#include "sys/core/sys_lang.h"
22
23#include <d3dx9.h>
24#include <emmintrin.h>
25///////////////////////////////////////////////////////////////////////////////
26
27#ifdef S3D_DRV_D3D9_MMX_USEPROLOGUE
28
29#define S3D_DRV_D3D9_MMX_PROLOGUE \
30    push esi \
31    push edi \
32    push ecx
33
34#define S3D_DRV_D3D9_MMX_EPILOGUE \
35    pop ecx \
36    pop edi \
37    pop esi
38
39#else
40
41#define S3D_DRV_D3D9_MMX_PROLOGUE
42#define S3D_DRV_D3D9_MMX_EPILOGUE
43
44#endif //S3D_DRV_D3D9_MMX_USEPROLOGUE
45
46///////////////////////////////////////////////////////////////////////////////
47
48//@
49void s3d_DrvD3d9MemcpyMmx8(void *Dest, const void *Src, s3d_CSysIntps Len);
50
51//@
52void s3d_DrvD3d9MemcpyMmx16(void *Dest, const void *Src, s3d_CSysIntps Len);
53
54//@
55void s3d_DrvD3d9MemcpyMmx32(void *Dest, const void *Src, s3d_CSysIntps Len);
56
57//@
58void s3d_DrvD3d9MemcpyMmx64(void *Dest, const void *Src, s3d_CSysIntps Len);
59
60//@
61void s3d_DrvD3d9MemfillMmx64(void *Dest, int Val, s3d_CSysIntps Len);
62
63///////////////////////////////////////////////////////////////////////////////
64
65S3D_SYS_INLINE D3DX_ALIGN16
66void s3d_DrvD3d9MemcpyMmx8(void *Dest, const void *Src, s3d_CSysIntps Len)
67{
68    S3D_SYS_ASSERT((Len % 8) == 0);
69    __asm
70    {
71        S3D_DRV_D3D9_MMX_PROLOGUE
72
73        mov esi, Src
74        mov edi, Dest
75        mov ecx, Len
76        shr ecx, 3          // 8 bytes per iteration
77
78    loop1:
79        //prefetchnta 8[ESI] // Prefetch next loop, non-temporal
80
81        movq mm1,  0[ESI]   // Read in source data
82
83        movntq  0[EDI], mm1 // Non-temporal stores
84
85        add esi, 8
86        add edi, 8
87        dec ecx
88        jnz loop1
89
90        emms
91
92        S3D_DRV_D3D9_MMX_EPILOGUE
93    }
94}
95
96S3D_SYS_INLINE D3DX_ALIGN16
97void s3d_DrvD3d9MemcpyMmx16(void *Dest, const void *Src, s3d_CSysIntps Len)
98{
99    S3D_SYS_ASSERT((Len % 16) == 0);
100    __asm
101    {
102        S3D_DRV_D3D9_MMX_PROLOGUE
103
104        mov esi, Src
105        mov edi, Dest
106        mov ecx, Len
107        shr ecx, 4          // 16 bytes per iteration
108
109    loop1:
110        //prefetchnta 16[ESI] // Prefetch next loop, non-temporal
111
112        movq mm1,  0[ESI]   // Read in source data
113        movq mm2,  8[ESI]
114
115        movntq  0[EDI], mm1 // Non-temporal stores
116        movntq  8[EDI], mm2
117
118        add esi, 16
119        add edi, 16
120        dec ecx
121        jnz loop1
122
123        emms
124
125        S3D_DRV_D3D9_MMX_EPILOGUE
126    }
127}
128
129S3D_SYS_INLINE D3DX_ALIGN16
130void s3d_DrvD3d9MemcpyMmx32(void *Dest, const void *Src, s3d_CSysIntps Len)
131{
132    S3D_SYS_ASSERT((Len % 32) == 0);
133    __asm
134    {
135        S3D_DRV_D3D9_MMX_PROLOGUE
136
137        mov esi, Src
138        mov edi, Dest
139        mov ecx, Len
140        shr ecx, 5          // 32 bytes per iteration
141
142    loop1:
143        //prefetchnta 32[ESI] // Prefetch next loop, non-temporal
144
145        movq mm1,  0[ESI]   // Read in source data
146        movq mm2,  8[ESI]
147        movq mm3, 16[ESI]
148        movq mm4, 24[ESI]
149
150        movntq  0[EDI], mm1 // Non-temporal stores
151        movntq  8[EDI], mm2
152        movntq 16[EDI], mm3
153        movntq 24[EDI], mm4
154
155        add esi, 32
156        add edi, 32
157        dec ecx
158        jnz loop1
159
160        emms
161
162        S3D_DRV_D3D9_MMX_EPILOGUE
163    }
164}
165
166S3D_SYS_INLINE D3DX_ALIGN16
167void s3d_DrvD3d9MemcpyMmx64(void *Dest, const void *Src, s3d_CSysIntps Len)
168{
169    S3D_SYS_ASSERT((Len % 64) == 0);
170    __asm
171    {
172        S3D_DRV_D3D9_MMX_PROLOGUE
173
174        mov esi, Src
175        mov edi, Dest
176        mov ecx, Len
177        shr ecx, 6          // 64 bytes per iteration
178
179    loop1:
180        //prefetchnta 64[ESI] // Prefetch next loop, non-temporal
181
182        movq mm1,  0[ESI]   // Read in source data
183        movq mm2,  8[ESI]
184        movq mm3, 16[ESI]
185        movq mm4, 24[ESI]
186        movq mm5, 32[ESI]
187        movq mm6, 40[ESI]
188        movq mm7, 48[ESI]
189        movq mm0, 56[ESI]
190
191        movntq  0[EDI], mm1 // Non-temporal stores
192        movntq  8[EDI], mm2
193        movntq 16[EDI], mm3
194        movntq 24[EDI], mm4
195        movntq 32[EDI], mm5
196        movntq 40[EDI], mm6
197        movntq 48[EDI], mm7
198        movntq 56[EDI], mm0
199
200        add esi, 64
201        add edi, 64
202        dec ecx
203        jnz loop1
204
205        emms
206
207        S3D_DRV_D3D9_MMX_EPILOGUE
208    }
209}
210
211///////////////////////////////////////////////////////////////////////////////
212
213S3D_SYS_INLINE D3DX_ALIGN16
214void s3d_DrvD3d9MemfillMmx64(void *Dest, int Val, s3d_CSysIntps Len)
215{
216    S3D_SYS_ASSERT(((UINT_PTR)Dest & 0xF) == 0);
217    S3D_SYS_ASSERT((Len % 64) == 0);
218
219    __m64 Val64;
220    Val64.m64_i32[0] = Val;
221    Val64.m64_i32[1] = Val;
222    __asm
223    {
224        S3D_DRV_D3D9_MMX_PROLOGUE
225
226        mov edi, Dest
227        mov ecx, Len
228        shr ecx, 6          // 64 bytes per iteration
229
230        movq mm1, Val64   // Read in source data
231    loop1:
232        //prefetchnta 64[ESI] // Prefetch next loop, non-temporal
233
234
235        movntq  0[EDI], mm1 // Non-temporal stores
236        movntq  8[EDI], mm1
237        movntq 16[EDI], mm1
238        movntq 24[EDI], mm1
239        movntq 32[EDI], mm1
240        movntq 40[EDI], mm1
241        movntq 48[EDI], mm1
242        movntq 56[EDI], mm1
243
244        add edi, 64
245        dec ecx
246        jnz loop1
247
248        emms
249
250        S3D_DRV_D3D9_MMX_EPILOGUE
251    }
252}
253
254///////////////////////////////////////////////////////////////////////////////
255
256#endif
Note: See TracBrowser for help on using the repository browser.