1b815c7f3Sopenharmony_ci/*
2b815c7f3Sopenharmony_ci * Copyright (c) 2011 Apple Inc. All rights reserved.
3b815c7f3Sopenharmony_ci *
4b815c7f3Sopenharmony_ci * @APPLE_APACHE_LICENSE_HEADER_START@
5b815c7f3Sopenharmony_ci *
6b815c7f3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License") ;
7b815c7f3Sopenharmony_ci * you may not use this file except in compliance with the License.
8b815c7f3Sopenharmony_ci * You may obtain a copy of the License at
9b815c7f3Sopenharmony_ci *
10b815c7f3Sopenharmony_ci *	 http://www.apache.org/licenses/LICENSE-2.0
11b815c7f3Sopenharmony_ci *
12b815c7f3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
13b815c7f3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
14b815c7f3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15b815c7f3Sopenharmony_ci * See the License for the specific language governing permissions and
16b815c7f3Sopenharmony_ci * limitations under the License.
17b815c7f3Sopenharmony_ci *
18b815c7f3Sopenharmony_ci * @APPLE_APACHE_LICENSE_HEADER_END@
19b815c7f3Sopenharmony_ci */
20b815c7f3Sopenharmony_ci
21b815c7f3Sopenharmony_ci/*
22b815c7f3Sopenharmony_ci	File:		dp_dec.c
23b815c7f3Sopenharmony_ci
24b815c7f3Sopenharmony_ci	Contains:	Dynamic Predictor decode routines
25b815c7f3Sopenharmony_ci
26b815c7f3Sopenharmony_ci	Copyright:	(c) 2001-2011 Apple, Inc.
27b815c7f3Sopenharmony_ci*/
28b815c7f3Sopenharmony_ci
29b815c7f3Sopenharmony_ci
30b815c7f3Sopenharmony_ci#include <string.h>
31b815c7f3Sopenharmony_ci
32b815c7f3Sopenharmony_ci#include "dplib.h"
33b815c7f3Sopenharmony_ci#include "shift.h"
34b815c7f3Sopenharmony_ci
35b815c7f3Sopenharmony_ci#if __GNUC__
36b815c7f3Sopenharmony_ci#define ALWAYS_INLINE		__attribute__ ((always_inline))
37b815c7f3Sopenharmony_ci#elif defined _MSC_VER
38b815c7f3Sopenharmony_ci#define ALWAYS_INLINE		__forceinline
39b815c7f3Sopenharmony_ci#else
40b815c7f3Sopenharmony_ci#define ALWAYS_INLINE
41b815c7f3Sopenharmony_ci#endif
42b815c7f3Sopenharmony_ci
43b815c7f3Sopenharmony_ci#define LOOP_ALIGN
44b815c7f3Sopenharmony_ci
45b815c7f3Sopenharmony_cistatic inline int32_t ALWAYS_INLINE
46b815c7f3Sopenharmony_cisign_of_int (int32_t i)
47b815c7f3Sopenharmony_ci{
48b815c7f3Sopenharmony_ci	int32_t negishift ;
49b815c7f3Sopenharmony_ci
50b815c7f3Sopenharmony_ci	negishift = ((uint32_t) - i) >> 31 ;
51b815c7f3Sopenharmony_ci	return negishift | (i >> 31) ;
52b815c7f3Sopenharmony_ci}
53b815c7f3Sopenharmony_ci
54b815c7f3Sopenharmony_civoid
55b815c7f3Sopenharmony_ciunpc_block (const int32_t * pc1, int32_t * out, int32_t num, int16_t * coefs, int32_t numactive, uint32_t chanbits, uint32_t denshift)
56b815c7f3Sopenharmony_ci{
57b815c7f3Sopenharmony_ci	register int16_t	a0, a1, a2, a3 ;
58b815c7f3Sopenharmony_ci	register int32_t	b0, b1, b2, b3 ;
59b815c7f3Sopenharmony_ci	int32_t					j, k, lim ;
60b815c7f3Sopenharmony_ci	int32_t				sum1, sg, sgn, top, dd ;
61b815c7f3Sopenharmony_ci	int32_t *			pout ;
62b815c7f3Sopenharmony_ci	int32_t				del, del0 ;
63b815c7f3Sopenharmony_ci	uint32_t			chanshift = 32 - chanbits ;
64b815c7f3Sopenharmony_ci	int32_t				denhalf = 1 << (denshift - 1) ;
65b815c7f3Sopenharmony_ci
66b815c7f3Sopenharmony_ci	out [0] = pc1 [0] ;
67b815c7f3Sopenharmony_ci	if (numactive == 0)
68b815c7f3Sopenharmony_ci	{
69b815c7f3Sopenharmony_ci		// just copy if numactive == 0 (but don't bother if in/out pointers the same)
70b815c7f3Sopenharmony_ci		if ((num > 1) && (pc1 != out))
71b815c7f3Sopenharmony_ci			memcpy (&out [1], &pc1 [1], (num - 1) * sizeof (int32_t)) ;
72b815c7f3Sopenharmony_ci		return ;
73b815c7f3Sopenharmony_ci	}
74b815c7f3Sopenharmony_ci	if (numactive == 31)
75b815c7f3Sopenharmony_ci	{
76b815c7f3Sopenharmony_ci		// short-circuit if numactive == 31
77b815c7f3Sopenharmony_ci		int32_t		prev ;
78b815c7f3Sopenharmony_ci
79b815c7f3Sopenharmony_ci		/*	this code is written such that the in/out buffers can be the same
80b815c7f3Sopenharmony_ci			to conserve buffer space on embedded devices like the iPod
81b815c7f3Sopenharmony_ci
82b815c7f3Sopenharmony_ci			(original code)
83b815c7f3Sopenharmony_ci			for (j = 1 ; j < num ; j++)
84b815c7f3Sopenharmony_ci				del = pc1 [j] + out [j-1] ;
85b815c7f3Sopenharmony_ci				out [j] = (del << chanshift) >> chanshift ;
86b815c7f3Sopenharmony_ci		*/
87b815c7f3Sopenharmony_ci		prev = out [0] ;
88b815c7f3Sopenharmony_ci		for (j = 1 ; j < num ; j++)
89b815c7f3Sopenharmony_ci		{
90b815c7f3Sopenharmony_ci			del = pc1 [j] + prev ;
91b815c7f3Sopenharmony_ci			prev = (del << chanshift) >> chanshift ;
92b815c7f3Sopenharmony_ci			out [j] = prev ;
93b815c7f3Sopenharmony_ci		}
94b815c7f3Sopenharmony_ci		return ;
95b815c7f3Sopenharmony_ci	}
96b815c7f3Sopenharmony_ci
97b815c7f3Sopenharmony_ci	for (j = 1 ; j <= numactive ; j++)
98b815c7f3Sopenharmony_ci	{
99b815c7f3Sopenharmony_ci		del = pc1 [j] + out [j-1] ;
100b815c7f3Sopenharmony_ci		out [j] = arith_shift_left (del, chanshift) >> chanshift ;
101b815c7f3Sopenharmony_ci	}
102b815c7f3Sopenharmony_ci
103b815c7f3Sopenharmony_ci	lim = numactive + 1 ;
104b815c7f3Sopenharmony_ci
105b815c7f3Sopenharmony_ci	if (numactive == 4)
106b815c7f3Sopenharmony_ci	{
107b815c7f3Sopenharmony_ci		// optimization for numactive == 4
108b815c7f3Sopenharmony_ci		register int16_t	ia0, ia1, ia2, ia3 ;
109b815c7f3Sopenharmony_ci		register int32_t	ib0, ib1, ib2, ib3 ;
110b815c7f3Sopenharmony_ci
111b815c7f3Sopenharmony_ci		ia0 = coefs [0] ;
112b815c7f3Sopenharmony_ci		ia1 = coefs [1] ;
113b815c7f3Sopenharmony_ci		ia2 = coefs [2] ;
114b815c7f3Sopenharmony_ci		ia3 = coefs [3] ;
115b815c7f3Sopenharmony_ci
116b815c7f3Sopenharmony_ci		for (j = lim ; j < num ; j++)
117b815c7f3Sopenharmony_ci		{
118b815c7f3Sopenharmony_ci			LOOP_ALIGN
119b815c7f3Sopenharmony_ci
120b815c7f3Sopenharmony_ci			top = out [j - lim] ;
121b815c7f3Sopenharmony_ci			pout = out + j - 1 ;
122b815c7f3Sopenharmony_ci
123b815c7f3Sopenharmony_ci			ib0 = top - pout [0] ;
124b815c7f3Sopenharmony_ci			ib1 = top - pout [-1] ;
125b815c7f3Sopenharmony_ci			ib2 = top - pout [-2] ;
126b815c7f3Sopenharmony_ci			ib3 = top - pout [-3] ;
127b815c7f3Sopenharmony_ci
128b815c7f3Sopenharmony_ci			sum1 = (denhalf - ia0 * ib0 - ia1 * ib1 - ia2 * ib2 - ia3 * ib3) >> denshift ;
129b815c7f3Sopenharmony_ci
130b815c7f3Sopenharmony_ci			del = pc1 [j] ;
131b815c7f3Sopenharmony_ci			del0 = del ;
132b815c7f3Sopenharmony_ci			sg = sign_of_int (del) ;
133b815c7f3Sopenharmony_ci			del += top + sum1 ;
134b815c7f3Sopenharmony_ci
135b815c7f3Sopenharmony_ci			out [j] = arith_shift_left (del, chanshift) >> chanshift ;
136b815c7f3Sopenharmony_ci
137b815c7f3Sopenharmony_ci			if (sg > 0)
138b815c7f3Sopenharmony_ci			{
139b815c7f3Sopenharmony_ci				sgn = sign_of_int (ib3) ;
140b815c7f3Sopenharmony_ci				ia3 -= sgn ;
141b815c7f3Sopenharmony_ci				del0 -= (4 - 3) * ((sgn * ib3) >> denshift) ;
142b815c7f3Sopenharmony_ci				if (del0 <= 0)
143b815c7f3Sopenharmony_ci					continue ;
144b815c7f3Sopenharmony_ci
145b815c7f3Sopenharmony_ci				sgn = sign_of_int (ib2) ;
146b815c7f3Sopenharmony_ci				ia2 -= sgn ;
147b815c7f3Sopenharmony_ci				del0 -= (4 - 2) * ((sgn * ib2) >> denshift) ;
148b815c7f3Sopenharmony_ci				if (del0 <= 0)
149b815c7f3Sopenharmony_ci					continue ;
150b815c7f3Sopenharmony_ci
151b815c7f3Sopenharmony_ci				sgn = sign_of_int (ib1) ;
152b815c7f3Sopenharmony_ci				ia1 -= sgn ;
153b815c7f3Sopenharmony_ci				del0 -= (4 - 1) * ((sgn * ib1) >> denshift) ;
154b815c7f3Sopenharmony_ci				if (del0 <= 0)
155b815c7f3Sopenharmony_ci					continue ;
156b815c7f3Sopenharmony_ci
157b815c7f3Sopenharmony_ci				ia0 -= sign_of_int (ib0) ;
158b815c7f3Sopenharmony_ci			}
159b815c7f3Sopenharmony_ci			else if (sg < 0)
160b815c7f3Sopenharmony_ci			{
161b815c7f3Sopenharmony_ci				// note: to avoid unnecessary negations, we flip the value of "sgn"
162b815c7f3Sopenharmony_ci				sgn = -sign_of_int (ib3) ;
163b815c7f3Sopenharmony_ci				ia3 -= sgn ;
164b815c7f3Sopenharmony_ci				del0 -= (4 - 3) * ((sgn * ib3) >> denshift) ;
165b815c7f3Sopenharmony_ci				if (del0 >= 0)
166b815c7f3Sopenharmony_ci					continue ;
167b815c7f3Sopenharmony_ci
168b815c7f3Sopenharmony_ci				sgn = -sign_of_int (ib2) ;
169b815c7f3Sopenharmony_ci				ia2 -= sgn ;
170b815c7f3Sopenharmony_ci				del0 -= (4 - 2) * ((sgn * ib2) >> denshift) ;
171b815c7f3Sopenharmony_ci				if (del0 >= 0)
172b815c7f3Sopenharmony_ci					continue ;
173b815c7f3Sopenharmony_ci
174b815c7f3Sopenharmony_ci				sgn = -sign_of_int (ib1) ;
175b815c7f3Sopenharmony_ci				ia1 -= sgn ;
176b815c7f3Sopenharmony_ci				del0 -= (4 - 1) * ((sgn * ib1) >> denshift) ;
177b815c7f3Sopenharmony_ci				if (del0 >= 0)
178b815c7f3Sopenharmony_ci					continue ;
179b815c7f3Sopenharmony_ci
180b815c7f3Sopenharmony_ci				ia0 += sign_of_int (ib0) ;
181b815c7f3Sopenharmony_ci			}
182b815c7f3Sopenharmony_ci		}
183b815c7f3Sopenharmony_ci
184b815c7f3Sopenharmony_ci		coefs [0] = ia0 ;
185b815c7f3Sopenharmony_ci		coefs [1] = ia1 ;
186b815c7f3Sopenharmony_ci		coefs [2] = ia2 ;
187b815c7f3Sopenharmony_ci		coefs [3] = ia3 ;
188b815c7f3Sopenharmony_ci	}
189b815c7f3Sopenharmony_ci	else if (numactive == 8)
190b815c7f3Sopenharmony_ci	{
191b815c7f3Sopenharmony_ci		register int16_t	a4, a5, a6, a7 ;
192b815c7f3Sopenharmony_ci		register int32_t	b4, b5, b6, b7 ;
193b815c7f3Sopenharmony_ci
194b815c7f3Sopenharmony_ci		// optimization for numactive == 8
195b815c7f3Sopenharmony_ci		a0 = coefs [0] ;
196b815c7f3Sopenharmony_ci		a1 = coefs [1] ;
197b815c7f3Sopenharmony_ci		a2 = coefs [2] ;
198b815c7f3Sopenharmony_ci		a3 = coefs [3] ;
199b815c7f3Sopenharmony_ci		a4 = coefs [4] ;
200b815c7f3Sopenharmony_ci		a5 = coefs [5] ;
201b815c7f3Sopenharmony_ci		a6 = coefs [6] ;
202b815c7f3Sopenharmony_ci		a7 = coefs [7] ;
203b815c7f3Sopenharmony_ci
204b815c7f3Sopenharmony_ci		for (j = lim ; j < num ; j++)
205b815c7f3Sopenharmony_ci		{
206b815c7f3Sopenharmony_ci			LOOP_ALIGN
207b815c7f3Sopenharmony_ci
208b815c7f3Sopenharmony_ci			top = out [j - lim] ;
209b815c7f3Sopenharmony_ci			pout = out + j - 1 ;
210b815c7f3Sopenharmony_ci
211b815c7f3Sopenharmony_ci			b0 = top - (*pout--) ;
212b815c7f3Sopenharmony_ci			b1 = top - (*pout--) ;
213b815c7f3Sopenharmony_ci			b2 = top - (*pout--) ;
214b815c7f3Sopenharmony_ci			b3 = top - (*pout--) ;
215b815c7f3Sopenharmony_ci			b4 = top - (*pout--) ;
216b815c7f3Sopenharmony_ci			b5 = top - (*pout--) ;
217b815c7f3Sopenharmony_ci			b6 = top - (*pout--) ;
218b815c7f3Sopenharmony_ci			b7 = top - (*pout) ;
219b815c7f3Sopenharmony_ci			pout += 8 ;
220b815c7f3Sopenharmony_ci
221b815c7f3Sopenharmony_ci			sum1 = (denhalf - a0 * b0 - a1 * b1 - a2 * b2 - a3 * b3
222b815c7f3Sopenharmony_ci					- a4 * b4 - a5 * b5 - a6 * b6 - a7 * b7) >> denshift ;
223b815c7f3Sopenharmony_ci
224b815c7f3Sopenharmony_ci			del = pc1 [j] ;
225b815c7f3Sopenharmony_ci			del0 = del ;
226b815c7f3Sopenharmony_ci			sg = sign_of_int (del) ;
227b815c7f3Sopenharmony_ci			del += top + sum1 ;
228b815c7f3Sopenharmony_ci
229b815c7f3Sopenharmony_ci			out [j] = arith_shift_left (del, chanshift) >> chanshift ;
230b815c7f3Sopenharmony_ci
231b815c7f3Sopenharmony_ci			if (sg > 0)
232b815c7f3Sopenharmony_ci			{
233b815c7f3Sopenharmony_ci				sgn = sign_of_int (b7) ;
234b815c7f3Sopenharmony_ci				a7 -= sgn ;
235b815c7f3Sopenharmony_ci				del0 -= 1 * ((sgn * b7) >> denshift) ;
236b815c7f3Sopenharmony_ci				if (del0 <= 0)
237b815c7f3Sopenharmony_ci					continue ;
238b815c7f3Sopenharmony_ci
239b815c7f3Sopenharmony_ci				sgn = sign_of_int (b6) ;
240b815c7f3Sopenharmony_ci				a6 -= sgn ;
241b815c7f3Sopenharmony_ci				del0 -= 2 * ((sgn * b6) >> denshift) ;
242b815c7f3Sopenharmony_ci				if (del0 <= 0)
243b815c7f3Sopenharmony_ci					continue ;
244b815c7f3Sopenharmony_ci
245b815c7f3Sopenharmony_ci				sgn = sign_of_int (b5) ;
246b815c7f3Sopenharmony_ci				a5 -= sgn ;
247b815c7f3Sopenharmony_ci				del0 -= 3 * ((sgn * b5) >> denshift) ;
248b815c7f3Sopenharmony_ci				if (del0 <= 0)
249b815c7f3Sopenharmony_ci					continue ;
250b815c7f3Sopenharmony_ci
251b815c7f3Sopenharmony_ci				sgn = sign_of_int (b4) ;
252b815c7f3Sopenharmony_ci				a4 -= sgn ;
253b815c7f3Sopenharmony_ci				del0 -= 4 * ((sgn * b4) >> denshift) ;
254b815c7f3Sopenharmony_ci				if (del0 <= 0)
255b815c7f3Sopenharmony_ci					continue ;
256b815c7f3Sopenharmony_ci
257b815c7f3Sopenharmony_ci				sgn = sign_of_int (b3) ;
258b815c7f3Sopenharmony_ci				a3 -= sgn ;
259b815c7f3Sopenharmony_ci				del0 -= 5 * ((sgn * b3) >> denshift) ;
260b815c7f3Sopenharmony_ci				if (del0 <= 0)
261b815c7f3Sopenharmony_ci					continue ;
262b815c7f3Sopenharmony_ci
263b815c7f3Sopenharmony_ci				sgn = sign_of_int (b2) ;
264b815c7f3Sopenharmony_ci				a2 -= sgn ;
265b815c7f3Sopenharmony_ci				del0 -= 6 * ((sgn * b2) >> denshift) ;
266b815c7f3Sopenharmony_ci				if (del0 <= 0)
267b815c7f3Sopenharmony_ci					continue ;
268b815c7f3Sopenharmony_ci
269b815c7f3Sopenharmony_ci				sgn = sign_of_int (b1) ;
270b815c7f3Sopenharmony_ci				a1 -= sgn ;
271b815c7f3Sopenharmony_ci				del0 -= 7 * ((sgn * b1) >> denshift) ;
272b815c7f3Sopenharmony_ci				if (del0 <= 0)
273b815c7f3Sopenharmony_ci					continue ;
274b815c7f3Sopenharmony_ci
275b815c7f3Sopenharmony_ci				a0 -= sign_of_int (b0) ;
276b815c7f3Sopenharmony_ci			}
277b815c7f3Sopenharmony_ci			else if (sg < 0)
278b815c7f3Sopenharmony_ci			{
279b815c7f3Sopenharmony_ci				// note: to avoid unnecessary negations, we flip the value of "sgn"
280b815c7f3Sopenharmony_ci				sgn = -sign_of_int (b7) ;
281b815c7f3Sopenharmony_ci				a7 -= sgn ;
282b815c7f3Sopenharmony_ci				del0 -= 1 * ((sgn * b7) >> denshift) ;
283b815c7f3Sopenharmony_ci				if (del0 >= 0)
284b815c7f3Sopenharmony_ci					continue ;
285b815c7f3Sopenharmony_ci
286b815c7f3Sopenharmony_ci				sgn = -sign_of_int (b6) ;
287b815c7f3Sopenharmony_ci				a6 -= sgn ;
288b815c7f3Sopenharmony_ci				del0 -= 2 * ((sgn * b6) >> denshift) ;
289b815c7f3Sopenharmony_ci				if (del0 >= 0)
290b815c7f3Sopenharmony_ci					continue ;
291b815c7f3Sopenharmony_ci
292b815c7f3Sopenharmony_ci				sgn = -sign_of_int (b5) ;
293b815c7f3Sopenharmony_ci				a5 -= sgn ;
294b815c7f3Sopenharmony_ci				del0 -= 3 * ((sgn * b5) >> denshift) ;
295b815c7f3Sopenharmony_ci				if (del0 >= 0)
296b815c7f3Sopenharmony_ci					continue ;
297b815c7f3Sopenharmony_ci
298b815c7f3Sopenharmony_ci				sgn = -sign_of_int (b4) ;
299b815c7f3Sopenharmony_ci				a4 -= sgn ;
300b815c7f3Sopenharmony_ci				del0 -= 4 * ((sgn * b4) >> denshift) ;
301b815c7f3Sopenharmony_ci				if (del0 >= 0)
302b815c7f3Sopenharmony_ci					continue ;
303b815c7f3Sopenharmony_ci
304b815c7f3Sopenharmony_ci				sgn = -sign_of_int (b3) ;
305b815c7f3Sopenharmony_ci				a3 -= sgn ;
306b815c7f3Sopenharmony_ci				del0 -= 5 * ((sgn * b3) >> denshift) ;
307b815c7f3Sopenharmony_ci				if (del0 >= 0)
308b815c7f3Sopenharmony_ci					continue ;
309b815c7f3Sopenharmony_ci
310b815c7f3Sopenharmony_ci				sgn = -sign_of_int (b2) ;
311b815c7f3Sopenharmony_ci				a2 -= sgn ;
312b815c7f3Sopenharmony_ci				del0 -= 6 * ((sgn * b2) >> denshift) ;
313b815c7f3Sopenharmony_ci				if (del0 >= 0)
314b815c7f3Sopenharmony_ci					continue ;
315b815c7f3Sopenharmony_ci
316b815c7f3Sopenharmony_ci				sgn = -sign_of_int (b1) ;
317b815c7f3Sopenharmony_ci				a1 -= sgn ;
318b815c7f3Sopenharmony_ci				del0 -= 7 * ((sgn * b1) >> denshift) ;
319b815c7f3Sopenharmony_ci				if (del0 >= 0)
320b815c7f3Sopenharmony_ci					continue ;
321b815c7f3Sopenharmony_ci
322b815c7f3Sopenharmony_ci				a0 += sign_of_int (b0) ;
323b815c7f3Sopenharmony_ci			}
324b815c7f3Sopenharmony_ci		}
325b815c7f3Sopenharmony_ci
326b815c7f3Sopenharmony_ci		coefs [0] = a0 ;
327b815c7f3Sopenharmony_ci		coefs [1] = a1 ;
328b815c7f3Sopenharmony_ci		coefs [2] = a2 ;
329b815c7f3Sopenharmony_ci		coefs [3] = a3 ;
330b815c7f3Sopenharmony_ci		coefs [4] = a4 ;
331b815c7f3Sopenharmony_ci		coefs [5] = a5 ;
332b815c7f3Sopenharmony_ci		coefs [6] = a6 ;
333b815c7f3Sopenharmony_ci		coefs [7] = a7 ;
334b815c7f3Sopenharmony_ci	}
335b815c7f3Sopenharmony_ci	else
336b815c7f3Sopenharmony_ci	{
337b815c7f3Sopenharmony_ci		// general case
338b815c7f3Sopenharmony_ci		for (j = lim ; j < num ; j++)
339b815c7f3Sopenharmony_ci		{
340b815c7f3Sopenharmony_ci			LOOP_ALIGN
341b815c7f3Sopenharmony_ci
342b815c7f3Sopenharmony_ci			sum1 = 0 ;
343b815c7f3Sopenharmony_ci			pout = out + j - 1 ;
344b815c7f3Sopenharmony_ci			top = out [j-lim] ;
345b815c7f3Sopenharmony_ci
346b815c7f3Sopenharmony_ci			for (k = 0 ; k < numactive ; k++)
347b815c7f3Sopenharmony_ci				sum1 += coefs [k] * (pout [-k] - top) ;
348b815c7f3Sopenharmony_ci
349b815c7f3Sopenharmony_ci			del = pc1 [j] ;
350b815c7f3Sopenharmony_ci			del0 = del ;
351b815c7f3Sopenharmony_ci			sg = sign_of_int (del) ;
352b815c7f3Sopenharmony_ci			del += top + ((sum1 + denhalf) >> denshift) ;
353b815c7f3Sopenharmony_ci			out [j] = (del << chanshift) >> chanshift ;
354b815c7f3Sopenharmony_ci
355b815c7f3Sopenharmony_ci			if (sg > 0)
356b815c7f3Sopenharmony_ci			{
357b815c7f3Sopenharmony_ci				for (k = (numactive - 1) ; k >= 0 ; k--)
358b815c7f3Sopenharmony_ci				{
359b815c7f3Sopenharmony_ci					dd = top - pout [-k] ;
360b815c7f3Sopenharmony_ci					sgn = sign_of_int (dd) ;
361b815c7f3Sopenharmony_ci					coefs [k] -= sgn ;
362b815c7f3Sopenharmony_ci					del0 -= (numactive - k) * ((sgn * dd) >> denshift) ;
363b815c7f3Sopenharmony_ci					if (del0 <= 0)
364b815c7f3Sopenharmony_ci						break ;
365b815c7f3Sopenharmony_ci				}
366b815c7f3Sopenharmony_ci			}
367b815c7f3Sopenharmony_ci			else if (sg < 0)
368b815c7f3Sopenharmony_ci			{
369b815c7f3Sopenharmony_ci				for (k = (numactive - 1) ; k >= 0 ; k--)
370b815c7f3Sopenharmony_ci				{
371b815c7f3Sopenharmony_ci					dd = top - pout [-k] ;
372b815c7f3Sopenharmony_ci					sgn = sign_of_int (dd) ;
373b815c7f3Sopenharmony_ci					coefs [k] += sgn ;
374b815c7f3Sopenharmony_ci					del0 -= (numactive - k) * ((-sgn * dd) >> denshift) ;
375b815c7f3Sopenharmony_ci					if (del0 >= 0)
376b815c7f3Sopenharmony_ci						break ;
377b815c7f3Sopenharmony_ci				}
378b815c7f3Sopenharmony_ci			}
379b815c7f3Sopenharmony_ci		}
380b815c7f3Sopenharmony_ci	}
381b815c7f3Sopenharmony_ci}
382