Subversion Repositories dashGPS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
#include "ref.h"
2
 
3
q31_t ref__QADD8(q31_t x, q31_t y)
4
{
5
   q31_t sum;
6
   q7_t r, s, t, u;
7
 
8
   r = (q7_t) x;
9
   s = (q7_t) y;
10
 
11
   r = ref_sat_n((q31_t) (r + s), 8);
12
   s = ref_sat_n(((q31_t) (((x << 16) >> 24) + ((y << 16) >> 24))), 8);
13
   t = ref_sat_n(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8);
14
   u = ref_sat_n(((q31_t) ((x >> 24) + (y >> 24))), 8);
15
 
16
   sum =
17
      (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) |
18
      (((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF);
19
 
20
   return sum;
21
 
22
}
23
 
24
q31_t ref__QSUB8(q31_t x, q31_t y)
25
{
26
   q31_t sum;
27
   q31_t r, s, t, u;
28
 
29
   r = (q7_t) x;
30
   s = (q7_t) y;
31
 
32
   r = ref_sat_n((r - s), 8);
33
   s = ref_sat_n(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8;
34
   t = ref_sat_n(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16;
35
   u = ref_sat_n(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24;
36
 
37
   sum = (u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r & 0x000000FF);
38
 
39
   return sum;
40
}
41
 
42
q31_t ref__QADD16(q31_t x, q31_t y)
43
{
44
   q31_t sum;
45
   q31_t r, s;
46
 
47
   r = (q15_t) x;
48
   s = (q15_t) y;
49
 
50
   r = ref_sat_q15(r + s);
51
   s = (q31_t)ref_sat_q15(((q31_t) ((x >> 16) + (y >> 16)))) << 16;
52
 
53
   sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
54
 
55
   return sum;
56
 
57
}
58
 
59
q31_t ref__SHADD16(q31_t x, q31_t y)
60
{
61
   q31_t sum;
62
   q31_t r, s;
63
 
64
   r = (q15_t) x;
65
   s = (q15_t) y;
66
 
67
   r = (r + s) >> 1;
68
   s = ((q31_t) (((x >> 16) + (y >> 16)) >> 1) << 16);
69
 
70
   sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
71
 
72
   return sum;
73
 
74
}
75
 
76
q31_t ref__QSUB16(q31_t x, q31_t y)
77
{
78
   q31_t sum;
79
   q31_t r, s;
80
 
81
   r = (q15_t) x;
82
   s = (q15_t) y;
83
 
84
   r = ref_sat_q15(r - s);
85
   s = (q31_t)ref_sat_q15(((q31_t) ((x >> 16) - (y >> 16)))) << 16;
86
 
87
   sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
88
 
89
   return sum;
90
}
91
 
92
q31_t ref__SHSUB16(q31_t x, q31_t y)
93
{
94
   q31_t diff;
95
   q31_t r, s;
96
 
97
   r = (q15_t) x;
98
   s = (q15_t) y;
99
 
100
   r = ((r >> 1) - (s >> 1));
101
   s = (((x >> 17) - (y >> 17)) << 16);
102
 
103
   diff = (s & 0xFFFF0000) | (r & 0x0000FFFF);
104
 
105
   return diff;
106
}
107
 
108
q31_t ref__QASX(q31_t x, q31_t y)
109
{
110
   q31_t sum = 0;
111
        q31_t xL, xH, yL, yH;
112
 
113
   // extract bottom halfword and sign extend
114
        xL = (q15_t)(x & 0xffff);
115
   // extract bottom halfword and sign extend
116
        yL = (q15_t)(y & 0xffff);
117
   // extract top halfword and sign extend
118
   xH = (q15_t)(x >> 16);
119
   // extract top halfword and sign extend
120
   yH = (q15_t)(y >> 16);
121
 
122
   sum = (((q31_t)ref_sat_q15(xH + yL )) << 16) |
123
         (((q31_t)ref_sat_q15(xL - yH )) & 0xffff);
124
 
125
   return sum;
126
}
127
 
128
q31_t ref__SHASX(q31_t x, q31_t y)
129
{
130
   q31_t sum;
131
   q31_t r, s;
132
 
133
   r = (q15_t) x;
134
   s = (q15_t) y;
135
 
136
    r = (r - (y >> 16)) / 2;
137
    s = (((x >> 16) + s) << 15);
138
 
139
   sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
140
 
141
   return sum;
142
}
143
 
144
q31_t ref__QSAX(q31_t x, q31_t y)
145
{
146
   q31_t sum = 0;
147
        q31_t xL, xH, yL, yH;
148
 
149
   // extract bottom halfword and sign extend
150
        xL = (q15_t)(x & 0xffff);
151
   // extract bottom halfword and sign extend
152
        yL = (q15_t)(y & 0xffff);
153
   // extract top halfword and sign extend
154
   xH = (q15_t)(x >> 16);
155
   // extract top halfword and sign extend
156
   yH = (q15_t)(y >> 16);
157
 
158
   sum = (((q31_t)ref_sat_q15(xH - yL )) << 16) |
159
         (((q31_t)ref_sat_q15(xL + yH )) & 0xffff);
160
 
161
   return sum;
162
}
163
 
164
q31_t ref__SHSAX(q31_t x, q31_t y)
165
{
166
   q31_t sum;
167
   q31_t r, s;
168
 
169
   r = (q15_t) x;
170
   s = (q15_t) y;
171
 
172
    r = (r + (y >> 16)) / 2;
173
    s = (((x >> 16) - s) << 15);
174
 
175
   sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
176
 
177
   return sum;
178
}
179
 
180
q31_t ref__SMUSDX(q31_t x, q31_t y)
181
{
182
   return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) - ((q15_t) (x >> 16) * (q15_t) y)));
183
}
184
 
185
q31_t ref__SMUADX(q31_t x, q31_t y)
186
{
187
   return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) + ((q15_t) (x >> 16) * (q15_t) y)));
188
}
189
 
190
q31_t ref__QADD(q31_t x, q31_t y)
191
{
192
   return ref_sat_q31((q63_t) x + y);
193
}
194
 
195
q31_t ref__QSUB(q31_t x, q31_t y)
196
{
197
   return ref_sat_q31((q63_t) x - y);
198
}
199
 
200
q31_t ref__SMLAD(q31_t x, q31_t y, q31_t sum)
201
{
202
   return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y));
203
}
204
 
205
q31_t ref__SMLADX(q31_t x, q31_t y, q31_t sum)
206
{
207
   return (sum + ((q15_t) (x >> 16) * (q15_t) (y)) + ((q15_t) x * (q15_t) (y >> 16)));
208
}
209
 
210
q31_t ref__SMLSDX(q31_t x, q31_t y, q31_t sum)
211
{
212
   return (sum - ((q15_t) (x >> 16) * (q15_t) (y)) + ((q15_t) x * (q15_t) (y >> 16)));
213
}
214
 
215
q63_t ref__SMLALD(q31_t x, q31_t y, q63_t sum)
216
{
217
   return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y));
218
}
219
 
220
q63_t ref__SMLALDX(q31_t x, q31_t y, q63_t sum)
221
{
222
   return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16));
223
}
224
 
225
q31_t ref__SMUAD(q31_t x, q31_t y)
226
{
227
   return (((x >> 16) * (y >> 16)) + (((x << 16) >> 16) * ((y << 16) >> 16)));
228
}
229
 
230
q31_t ref__SMUSD(q31_t x, q31_t y)
231
{
232
   return (-((x >> 16) * (y >> 16)) + (((x << 16) >> 16) * ((y << 16) >> 16)));
233
}
234
 
235
q31_t ref__SXTB16(q31_t x)
236
{
237
   return ((((x << 24) >> 24) & 0x0000FFFF) | (((x << 8) >> 8) & 0xFFFF0000));
238
}