-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathStageProc3dnow.hpp
132 lines (77 loc) · 2.72 KB
/
StageProc3dnow.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*****************************************************************************
StageProc3dnow.hpp
Author: Laurent de Soras, 2015
--- Legal stuff ---
This program is free software. It comes without any warranty, to
the extent permitted by applicable law. You can redistribute it
and/or modify it under the terms of the Do What The Fuck You Want
To Public License, Version 2, as published by Sam Hocevar. See
http://sam.zoy.org/wtfpl/COPYING for more details.
*Tab=3***********************************************************************/
#if defined (hiir_StageProc3dnow_CURRENT_CODEHEADER)
#error Recursive inclusion of StageProc3dnow code header.
#endif
#define hiir_StageProc3dnow_CURRENT_CODEHEADER
#if ! defined (hiir_StageProc3dnow_CODEHEADER_INCLUDED)
#define hiir_StageProc3dnow_CODEHEADER_INCLUDED
/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
#include "hiir/StageData3dnow.h"
#if defined (_MSC_VER)
#pragma inline_depth (255)
#endif
namespace hiir
{
/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
#if defined (_MSC_VER)
#pragma warning (push)
#pragma warning (4 : 4799)
#endif
template <int CUR>
void StageProc3dnow <CUR>::process_sample_pos ()
{
StageProc3dnow <CUR - 1>::process_sample_pos ();
enum { PREV_CELL = (CUR - 1) * sizeof (StageData3dnow) };
enum { CURR_CELL = CUR * sizeof (StageData3dnow) };
__asm
{
movq mm1, [edx + PREV_CELL + 1*8]
movq [edx + PREV_CELL + 1*8], mm0
pfsub mm0, [edx + CURR_CELL + 1*8]
pfmul mm0, [edx + CURR_CELL + 0*8]
pfadd mm0, mm1
}
}
template <>
hiir_FORCEINLINE void StageProc3dnow <0>::process_sample_pos ()
{
// Nothing, stops the recursion
}
template <int CUR>
void StageProc3dnow <CUR>::process_sample_neg ()
{
StageProc3dnow <CUR - 1>::process_sample_neg ();
enum { PREV_CELL = (CUR - 1) * sizeof (StageData3dnow) };
enum { CURR_CELL = CUR * sizeof (StageData3dnow) };
__asm
{
movq mm1, [edx + PREV_CELL + 1*8]
movq [edx + PREV_CELL + 1*8], mm0
pfadd mm0, [edx + CURR_CELL + 1*8]
pfmul mm0, [edx + CURR_CELL + 0*8]
pfsub mm0, mm1
}
}
template <>
hiir_FORCEINLINE void StageProc3dnow <0>::process_sample_neg ()
{
// Nothing, stops the recursion
}
#if defined (_MSC_VER)
#pragma warning (pop)
#endif
/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
} // namespace hiir
#endif // hiir_StageProc3dnow_CODEHEADER_INCLUDED
#undef hiir_StageProc3dnow_CURRENT_CODEHEADER
/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/