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
133
134
135
136
137
138
139
140
141
142
143
144
145
|
/*
Implementation of general vectorized functions
added by T.Grill
*/
#include "m_pd.h"
#include "m_simd.h"
void zerovec_8(t_float *dst,int n)
{
for(n >>= 3; n--; dst += 8) {
dst[0] = dst[1] = dst[2] = dst[3] = dst[4] = dst[5] = dst[6] = dst[7] = 0;
}
}
void setvec_8(t_float *dst,t_float v,int n)
{
for(n >>= 3; n--; dst += 8) {
dst[0] = dst[1] = dst[2] = dst[3] = dst[4] = dst[5] = dst[6] = dst[7] = v;
}
}
void copyvec_8(t_float *dst,const t_float *src,int n)
{
for(n >>= 3; n--; src += 8,dst += 8) {
dst[0] = src[0],dst[1] = src[1],dst[2] = src[2],dst[3] = src[3];
dst[4] = src[4],dst[5] = src[5],dst[6] = src[6],dst[7] = src[7];
}
}
void addvec_8(t_float *dst,const t_float *src,int n)
{
for(n >>= 3; n--; src += 8,dst += 8) {
dst[0] += src[0],dst[1] += src[1],dst[2] += src[2],dst[3] += src[3];
dst[4] += src[4],dst[5] += src[5],dst[6] += src[6],dst[7] += src[7];
}
}
void copyvec(t_float *dst,const t_float *src,int n)
{
while(n--)
*dst++ = *src++;
}
void zerovec(t_float *dst, int n)
{
while(n--)
*dst++ = 0;
}
void addvec(t_float *dst,const t_float *src,int n)
{
while(n--)
*dst++ += *src++;
}
void testcopyvec_8(t_float *dst,const t_float *src,int n)
{
while(n--) {
*(dst++) = (PD_BIGORSMALL(*src) ? 0 : *src); src++;
}
}
void testcopyvec(t_float *dst,const t_float *src,int n)
{
testcopyvec_8(dst, src, n);
}
void testaddvec_8(t_float *dst,const t_float *src,int n)
{
while(n--) {
*(dst++) += (PD_BIGORSMALL(*src) ? 0 : *src); src++;
}
}
void testaddvec(t_float *dst,const t_float *src,int n)
{
testaddvec_8(dst, src, n);
}
int simd_check1(t_int n, t_float* ptr1)
{
return SIMD_CHECK1(n,ptr1);
}
int simd_check2(t_int n, t_float* ptr1, t_float* ptr2)
{
return SIMD_CHECK2(n,ptr1,ptr2);
}
int simd_check3(t_int n, t_float* ptr1, t_float* ptr2, t_float* ptr3)
{
return SIMD_CHECK3(n,ptr1,ptr2,ptr3);
}
#ifdef DONTUSESIMD
int simd_runtime_check()
{
return 0;
}
/* tb: wrapper for simd functions */
void zerovec_simd(t_float *dst,int n)
{
zerovec_8(dst,n);
}
void setvec_simd(t_float *dst,t_float v,int n)
{
setvec_8(dst,v,n);
}
void copyvec_simd(t_float *dst,const t_float *src,int n)
{
copyvec_8(dst,src,n);
}
void copyvec_simd_unalignedsrc(t_float *dst,const t_float *src,int n)
{
copyvec_8(dst,src,n);
}
void addvec_simd(t_float *dst,const t_float *src,int n)
{
addvec_8(dst,src,n);
}
void testcopyvec_simd(t_float *dst,const t_float *src,int n)
{
testcopyvec_8(dst,src,n);
}
void testaddvec_simd(t_float *dst,const t_float *src,int n)
{
testaddvec_8(dst,src,n);
}
#endif /* DONTUSESIMD */
|