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