1 1.1 mrg /* More subroutines needed by GCC output code on some machines. */ 2 1.1 mrg /* Compile this one with gcc. */ 3 1.12 mrg /* Copyright (C) 1989-2022 Free Software Foundation, Inc. 4 1.1 mrg 5 1.1 mrg This file is part of GCC. 6 1.1 mrg 7 1.1 mrg GCC is free software; you can redistribute it and/or modify it under 8 1.1 mrg the terms of the GNU General Public License as published by the Free 9 1.1 mrg Software Foundation; either version 3, or (at your option) any later 10 1.1 mrg version. 11 1.1 mrg 12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 1.1 mrg for more details. 16 1.1 mrg 17 1.1 mrg Under Section 7 of GPL version 3, you are granted additional 18 1.1 mrg permissions described in the GCC Runtime Library Exception, version 19 1.1 mrg 3.1, as published by the Free Software Foundation. 20 1.1 mrg 21 1.1 mrg You should have received a copy of the GNU General Public License and 22 1.1 mrg a copy of the GCC Runtime Library Exception along with this program; 23 1.1 mrg see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24 1.1 mrg <http://www.gnu.org/licenses/>. */ 25 1.1 mrg 26 1.1 mrg #include "tconfig.h" 27 1.1 mrg #include "tsystem.h" 28 1.1 mrg #include "coretypes.h" 29 1.1 mrg #include "tm.h" 30 1.1 mrg #include "libgcc_tm.h" 31 1.1 mrg 32 1.1 mrg #ifdef HAVE_GAS_HIDDEN 33 1.1 mrg #define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden"))) 34 1.1 mrg #else 35 1.1 mrg #define ATTRIBUTE_HIDDEN 36 1.1 mrg #endif 37 1.1 mrg 38 1.1 mrg /* Work out the largest "word" size that we can deal with on this target. */ 39 1.1 mrg #if MIN_UNITS_PER_WORD > 4 40 1.1 mrg # define LIBGCC2_MAX_UNITS_PER_WORD 8 41 1.1 mrg #elif (MIN_UNITS_PER_WORD > 2 \ 42 1.1 mrg || (MIN_UNITS_PER_WORD > 1 && __SIZEOF_LONG_LONG__ > 4)) 43 1.1 mrg # define LIBGCC2_MAX_UNITS_PER_WORD 4 44 1.1 mrg #else 45 1.1 mrg # define LIBGCC2_MAX_UNITS_PER_WORD MIN_UNITS_PER_WORD 46 1.1 mrg #endif 47 1.1 mrg 48 1.1 mrg /* Work out what word size we are using for this compilation. 49 1.1 mrg The value can be set on the command line. */ 50 1.1 mrg #ifndef LIBGCC2_UNITS_PER_WORD 51 1.1 mrg #define LIBGCC2_UNITS_PER_WORD LIBGCC2_MAX_UNITS_PER_WORD 52 1.1 mrg #endif 53 1.1 mrg 54 1.1 mrg #if LIBGCC2_UNITS_PER_WORD <= LIBGCC2_MAX_UNITS_PER_WORD 55 1.1 mrg 56 1.1 mrg #include "libgcc2.h" 57 1.1 mrg 58 1.1 mrg #ifdef DECLARE_LIBRARY_RENAMES 60 1.1 mrg DECLARE_LIBRARY_RENAMES 61 1.1 mrg #endif 62 1.1 mrg 63 1.1 mrg #if defined (L_negdi2) 64 1.1 mrg DWtype 65 1.1 mrg __negdi2 (DWtype u) 66 1.1 mrg { 67 1.1 mrg const DWunion uu = {.ll = u}; 68 1.1 mrg const DWunion w = { {.low = -uu.s.low, 69 1.1 mrg .high = -uu.s.high - ((UWtype) -uu.s.low > 0) } }; 70 1.1 mrg 71 1.1 mrg return w.ll; 72 1.1 mrg } 73 1.1 mrg #endif 74 1.1 mrg 75 1.1 mrg #ifdef L_addvsi3 76 1.1 mrg Wtype 77 1.1 mrg __addvSI3 (Wtype a, Wtype b) 78 1.12 mrg { 79 1.1 mrg Wtype w; 80 1.12 mrg 81 1.1 mrg if (__builtin_add_overflow (a, b, &w)) 82 1.1 mrg abort (); 83 1.1 mrg 84 1.1 mrg return w; 85 1.1 mrg } 86 1.1 mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC 87 1.1 mrg SItype 88 1.1 mrg __addvsi3 (SItype a, SItype b) 89 1.12 mrg { 90 1.1 mrg SItype w; 91 1.12 mrg 92 1.1 mrg if (__builtin_add_overflow (a, b, &w)) 93 1.1 mrg abort (); 94 1.1 mrg 95 1.1 mrg return w; 96 1.1 mrg } 97 1.1 mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */ 98 1.1 mrg #endif 99 1.1 mrg 100 1.1 mrg #ifdef L_addvdi3 102 1.1 mrg DWtype 103 1.12 mrg __addvDI3 (DWtype a, DWtype b) 104 1.1 mrg { 105 1.12 mrg DWtype w; 106 1.1 mrg 107 1.1 mrg if (__builtin_add_overflow (a, b, &w)) 108 1.1 mrg abort (); 109 1.1 mrg 110 1.1 mrg return w; 111 1.1 mrg } 112 1.1 mrg #endif 113 1.1 mrg 114 1.1 mrg #ifdef L_subvsi3 116 1.12 mrg Wtype 117 1.1 mrg __subvSI3 (Wtype a, Wtype b) 118 1.12 mrg { 119 1.1 mrg Wtype w; 120 1.1 mrg 121 1.1 mrg if (__builtin_sub_overflow (a, b, &w)) 122 1.1 mrg abort (); 123 1.1 mrg 124 1.1 mrg return w; 125 1.1 mrg } 126 1.1 mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC 127 1.12 mrg SItype 128 1.1 mrg __subvsi3 (SItype a, SItype b) 129 1.12 mrg { 130 1.1 mrg SItype w; 131 1.1 mrg 132 1.1 mrg if (__builtin_sub_overflow (a, b, &w)) 133 1.1 mrg abort (); 134 1.1 mrg 135 1.1 mrg return w; 136 1.1 mrg } 137 1.1 mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */ 138 1.1 mrg #endif 139 1.1 mrg 140 1.1 mrg #ifdef L_subvdi3 142 1.1 mrg DWtype 143 1.12 mrg __subvDI3 (DWtype a, DWtype b) 144 1.1 mrg { 145 1.1 mrg DWtype w; 146 1.1 mrg 147 1.1 mrg if (__builtin_sub_overflow (a, b, &w)) 148 1.1 mrg abort (); 149 1.1 mrg 150 1.1 mrg return w; 151 1.1 mrg } 152 1.1 mrg #endif 153 1.1 mrg 154 1.12 mrg #ifdef L_mulvsi3 156 1.12 mrg Wtype 157 1.1 mrg __mulvSI3 (Wtype a, Wtype b) 158 1.1 mrg { 159 1.1 mrg Wtype w; 160 1.1 mrg 161 1.1 mrg if (__builtin_mul_overflow (a, b, &w)) 162 1.1 mrg abort (); 163 1.1 mrg 164 1.1 mrg return w; 165 1.12 mrg } 166 1.1 mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC 167 1.12 mrg SItype 168 1.1 mrg __mulvsi3 (SItype a, SItype b) 169 1.1 mrg { 170 1.1 mrg SItype w; 171 1.1 mrg 172 1.1 mrg if (__builtin_mul_overflow (a, b, &w)) 173 1.1 mrg abort (); 174 1.1 mrg 175 1.1 mrg return w; 176 1.1 mrg } 177 1.1 mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */ 178 1.1 mrg #endif 179 1.12 mrg 180 1.1 mrg #ifdef L_negvsi2 182 1.1 mrg Wtype 183 1.1 mrg __negvSI2 (Wtype a) 184 1.12 mrg { 185 1.1 mrg Wtype w; 186 1.1 mrg 187 1.1 mrg if (__builtin_sub_overflow (0, a, &w)) 188 1.1 mrg abort (); 189 1.1 mrg 190 1.12 mrg return w; 191 1.1 mrg } 192 1.12 mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC 193 1.1 mrg SItype 194 1.1 mrg __negvsi2 (SItype a) 195 1.12 mrg { 196 1.1 mrg SItype w; 197 1.1 mrg 198 1.1 mrg if (__builtin_sub_overflow (0, a, &w)) 199 1.1 mrg abort (); 200 1.1 mrg 201 1.1 mrg return w; 202 1.1 mrg } 203 1.1 mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */ 204 1.12 mrg #endif 205 1.1 mrg 206 1.12 mrg #ifdef L_negvdi2 208 1.1 mrg DWtype 209 1.1 mrg __negvDI2 (DWtype a) 210 1.1 mrg { 211 1.1 mrg DWtype w; 212 1.1 mrg 213 1.1 mrg if (__builtin_sub_overflow (0, a, &w)) 214 1.1 mrg abort (); 215 1.1 mrg 216 1.1 mrg return w; 217 1.12 mrg } 218 1.12 mrg #endif 219 1.1 mrg 220 1.12 mrg #ifdef L_absvsi2 222 1.1 mrg Wtype 223 1.12 mrg __absvSI2 (Wtype a) 224 1.1 mrg { 225 1.1 mrg const Wtype v = 0 - (a < 0); 226 1.1 mrg Wtype w; 227 1.1 mrg 228 1.1 mrg if (__builtin_add_overflow (a, v, &w)) 229 1.12 mrg abort (); 230 1.12 mrg 231 1.1 mrg return v ^ w; 232 1.12 mrg } 233 1.1 mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC 234 1.1 mrg SItype 235 1.12 mrg __absvsi2 (SItype a) 236 1.1 mrg { 237 1.1 mrg const SItype v = 0 - (a < 0); 238 1.1 mrg SItype w; 239 1.1 mrg 240 1.1 mrg if (__builtin_add_overflow (a, v, &w)) 241 1.1 mrg abort (); 242 1.1 mrg 243 1.1 mrg return v ^ w; 244 1.12 mrg } 245 1.12 mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */ 246 1.1 mrg #endif 247 1.12 mrg 248 1.1 mrg #ifdef L_absvdi2 250 1.12 mrg DWtype 251 1.1 mrg __absvDI2 (DWtype a) 252 1.1 mrg { 253 1.1 mrg const DWtype v = 0 - (a < 0); 254 1.1 mrg DWtype w; 255 1.1 mrg 256 1.1 mrg if (__builtin_add_overflow (a, v, &w)) 257 1.1 mrg abort (); 258 1.1 mrg 259 1.1 mrg return v ^ w; 260 1.1 mrg } 261 1.1 mrg #endif 262 1.1 mrg 263 1.1 mrg #ifdef L_mulvdi3 265 1.1 mrg DWtype 266 1.1 mrg __mulvDI3 (DWtype u, DWtype v) 267 1.1 mrg { 268 1.1 mrg /* The unchecked multiplication needs 3 Wtype x Wtype multiplications, 269 1.1 mrg but the checked multiplication needs only two. */ 270 1.1 mrg const DWunion uu = {.ll = u}; 271 1.1 mrg const DWunion vv = {.ll = v}; 272 1.1 mrg 273 1.1 mrg if (__builtin_expect (uu.s.high == uu.s.low >> (W_TYPE_SIZE - 1), 1)) 274 1.1 mrg { 275 1.1 mrg /* u fits in a single Wtype. */ 276 1.1 mrg if (__builtin_expect (vv.s.high == vv.s.low >> (W_TYPE_SIZE - 1), 1)) 277 1.1 mrg { 278 1.1 mrg /* v fits in a single Wtype as well. */ 279 1.1 mrg /* A single multiplication. No overflow risk. */ 280 1.1 mrg return (DWtype) uu.s.low * (DWtype) vv.s.low; 281 1.1 mrg } 282 1.1 mrg else 283 1.1 mrg { 284 1.1 mrg /* Two multiplications. */ 285 1.1 mrg DWunion w0 = {.ll = (UDWtype) (UWtype) uu.s.low 286 1.1 mrg * (UDWtype) (UWtype) vv.s.low}; 287 1.1 mrg DWunion w1 = {.ll = (UDWtype) (UWtype) uu.s.low 288 1.1 mrg * (UDWtype) (UWtype) vv.s.high}; 289 1.1 mrg 290 1.1 mrg if (vv.s.high < 0) 291 1.1 mrg w1.s.high -= uu.s.low; 292 1.1 mrg if (uu.s.low < 0) 293 1.1 mrg w1.ll -= vv.ll; 294 1.1 mrg w1.ll += (UWtype) w0.s.high; 295 1.1 mrg if (__builtin_expect (w1.s.high == w1.s.low >> (W_TYPE_SIZE - 1), 1)) 296 1.1 mrg { 297 1.1 mrg w0.s.high = w1.s.low; 298 1.1 mrg return w0.ll; 299 1.1 mrg } 300 1.1 mrg } 301 1.1 mrg } 302 1.1 mrg else 303 1.1 mrg { 304 1.1 mrg if (__builtin_expect (vv.s.high == vv.s.low >> (W_TYPE_SIZE - 1), 1)) 305 1.1 mrg { 306 1.1 mrg /* v fits into a single Wtype. */ 307 1.1 mrg /* Two multiplications. */ 308 1.1 mrg DWunion w0 = {.ll = (UDWtype) (UWtype) uu.s.low 309 1.1 mrg * (UDWtype) (UWtype) vv.s.low}; 310 1.1 mrg DWunion w1 = {.ll = (UDWtype) (UWtype) uu.s.high 311 1.1 mrg * (UDWtype) (UWtype) vv.s.low}; 312 1.1 mrg 313 1.1 mrg if (uu.s.high < 0) 314 1.1 mrg w1.s.high -= vv.s.low; 315 1.1 mrg if (vv.s.low < 0) 316 1.1 mrg w1.ll -= uu.ll; 317 1.1 mrg w1.ll += (UWtype) w0.s.high; 318 1.1 mrg if (__builtin_expect (w1.s.high == w1.s.low >> (W_TYPE_SIZE - 1), 1)) 319 1.1 mrg { 320 1.1 mrg w0.s.high = w1.s.low; 321 1.1 mrg return w0.ll; 322 1.1 mrg } 323 1.1 mrg } 324 1.1 mrg else 325 1.1 mrg { 326 1.1 mrg /* A few sign checks and a single multiplication. */ 327 1.1 mrg if (uu.s.high >= 0) 328 1.1 mrg { 329 1.1 mrg if (vv.s.high >= 0) 330 1.1 mrg { 331 1.1 mrg if (uu.s.high == 0 && vv.s.high == 0) 332 1.1 mrg { 333 1.1 mrg const DWtype w = (UDWtype) (UWtype) uu.s.low 334 1.1 mrg * (UDWtype) (UWtype) vv.s.low; 335 1.1 mrg if (__builtin_expect (w >= 0, 1)) 336 1.1 mrg return w; 337 1.1 mrg } 338 1.1 mrg } 339 1.1 mrg else 340 1.1 mrg { 341 1.1 mrg if (uu.s.high == 0 && vv.s.high == (Wtype) -1) 342 1.1 mrg { 343 1.1 mrg DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low 344 1.1 mrg * (UDWtype) (UWtype) vv.s.low}; 345 1.1 mrg 346 1.1 mrg ww.s.high -= uu.s.low; 347 1.1 mrg if (__builtin_expect (ww.s.high < 0, 1)) 348 1.1 mrg return ww.ll; 349 1.1 mrg } 350 1.1 mrg } 351 1.1 mrg } 352 1.1 mrg else 353 1.1 mrg { 354 1.1 mrg if (vv.s.high >= 0) 355 1.1 mrg { 356 1.1 mrg if (uu.s.high == (Wtype) -1 && vv.s.high == 0) 357 1.1 mrg { 358 1.6 mrg DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low 359 1.6 mrg * (UDWtype) (UWtype) vv.s.low}; 360 1.1 mrg 361 1.1 mrg ww.s.high -= vv.s.low; 362 1.1 mrg if (__builtin_expect (ww.s.high < 0, 1)) 363 1.1 mrg return ww.ll; 364 1.1 mrg } 365 1.1 mrg } 366 1.1 mrg else 367 1.1 mrg { 368 1.1 mrg if ((uu.s.high & vv.s.high) == (Wtype) -1 369 1.1 mrg && (uu.s.low | vv.s.low) != 0) 370 1.1 mrg { 371 1.1 mrg DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low 372 1.1 mrg * (UDWtype) (UWtype) vv.s.low}; 373 1.1 mrg 374 1.1 mrg ww.s.high -= uu.s.low; 375 1.1 mrg ww.s.high -= vv.s.low; 376 1.1 mrg if (__builtin_expect (ww.s.high >= 0, 1)) 377 1.1 mrg return ww.ll; 378 1.1 mrg } 379 1.1 mrg } 380 1.1 mrg } 381 1.1 mrg } 382 1.1 mrg } 383 1.1 mrg 384 1.1 mrg /* Overflow. */ 385 1.1 mrg abort (); 386 1.1 mrg } 387 1.1 mrg #endif 388 1.1 mrg 389 1.1 mrg 391 1.1 mrg /* Unless shift functions are defined with full ANSI prototypes, 392 1.1 mrg parameter b will be promoted to int if shift_count_type is smaller than an int. */ 393 1.1 mrg #ifdef L_lshrdi3 394 1.1 mrg DWtype 395 1.1 mrg __lshrdi3 (DWtype u, shift_count_type b) 396 1.1 mrg { 397 1.1 mrg if (b == 0) 398 1.1 mrg return u; 399 1.1 mrg 400 1.1 mrg const DWunion uu = {.ll = u}; 401 1.1 mrg const shift_count_type bm = W_TYPE_SIZE - b; 402 1.1 mrg DWunion w; 403 1.1 mrg 404 1.1 mrg if (bm <= 0) 405 1.1 mrg { 406 1.1 mrg w.s.high = 0; 407 1.1 mrg w.s.low = (UWtype) uu.s.high >> -bm; 408 1.1 mrg } 409 1.1 mrg else 410 1.1 mrg { 411 1.1 mrg const UWtype carries = (UWtype) uu.s.high << bm; 412 1.1 mrg 413 1.1 mrg w.s.high = (UWtype) uu.s.high >> b; 414 1.1 mrg w.s.low = ((UWtype) uu.s.low >> b) | carries; 415 1.1 mrg } 416 1.1 mrg 417 1.1 mrg return w.ll; 418 1.1 mrg } 419 1.1 mrg #endif 420 1.1 mrg 421 1.1 mrg #ifdef L_ashldi3 422 1.1 mrg DWtype 423 1.1 mrg __ashldi3 (DWtype u, shift_count_type b) 424 1.1 mrg { 425 1.1 mrg if (b == 0) 426 1.1 mrg return u; 427 1.1 mrg 428 1.1 mrg const DWunion uu = {.ll = u}; 429 1.1 mrg const shift_count_type bm = W_TYPE_SIZE - b; 430 1.1 mrg DWunion w; 431 1.1 mrg 432 1.1 mrg if (bm <= 0) 433 1.1 mrg { 434 1.1 mrg w.s.low = 0; 435 1.1 mrg w.s.high = (UWtype) uu.s.low << -bm; 436 1.1 mrg } 437 1.1 mrg else 438 1.1 mrg { 439 1.1 mrg const UWtype carries = (UWtype) uu.s.low >> bm; 440 1.1 mrg 441 1.1 mrg w.s.low = (UWtype) uu.s.low << b; 442 1.1 mrg w.s.high = ((UWtype) uu.s.high << b) | carries; 443 1.1 mrg } 444 1.1 mrg 445 1.1 mrg return w.ll; 446 1.1 mrg } 447 1.1 mrg #endif 448 1.1 mrg 449 1.1 mrg #ifdef L_ashrdi3 450 1.1 mrg DWtype 451 1.1 mrg __ashrdi3 (DWtype u, shift_count_type b) 452 1.1 mrg { 453 1.1 mrg if (b == 0) 454 1.1 mrg return u; 455 1.1 mrg 456 1.1 mrg const DWunion uu = {.ll = u}; 457 1.1 mrg const shift_count_type bm = W_TYPE_SIZE - b; 458 1.1 mrg DWunion w; 459 1.1 mrg 460 1.1 mrg if (bm <= 0) 461 1.1 mrg { 462 1.1 mrg /* w.s.high = 1..1 or 0..0 */ 463 1.1 mrg w.s.high = uu.s.high >> (W_TYPE_SIZE - 1); 464 1.1 mrg w.s.low = uu.s.high >> -bm; 465 1.1 mrg } 466 1.1 mrg else 467 1.1 mrg { 468 1.1 mrg const UWtype carries = (UWtype) uu.s.high << bm; 469 1.1 mrg 470 1.1 mrg w.s.high = uu.s.high >> b; 471 1.12 mrg w.s.low = ((UWtype) uu.s.low >> b) | carries; 472 1.12 mrg } 473 1.12 mrg 474 1.12 mrg return w.ll; 475 1.1 mrg } 476 1.1 mrg #endif 477 1.1 mrg 478 1.1 mrg #ifdef L_bswapsi2 480 1.1 mrg SItype 481 1.1 mrg __bswapsi2 (SItype u) 482 1.1 mrg { 483 1.1 mrg return ((((u) & 0xff000000u) >> 24) 484 1.1 mrg | (((u) & 0x00ff0000u) >> 8) 485 1.1 mrg | (((u) & 0x0000ff00u) << 8) 486 1.1 mrg | (((u) & 0x000000ffu) << 24)); 487 1.1 mrg } 488 1.1 mrg #endif 489 1.1 mrg #ifdef L_bswapdi2 490 1.1 mrg DItype 491 1.1 mrg __bswapdi2 (DItype u) 492 1.1 mrg { 493 1.1 mrg return ((((u) & 0xff00000000000000ull) >> 56) 494 1.1 mrg | (((u) & 0x00ff000000000000ull) >> 40) 495 1.1 mrg | (((u) & 0x0000ff0000000000ull) >> 24) 496 1.1 mrg | (((u) & 0x000000ff00000000ull) >> 8) 497 1.1 mrg | (((u) & 0x00000000ff000000ull) << 8) 498 1.1 mrg | (((u) & 0x0000000000ff0000ull) << 24) 499 1.1 mrg | (((u) & 0x000000000000ff00ull) << 40) 500 1.1 mrg | (((u) & 0x00000000000000ffull) << 56)); 501 1.1 mrg } 502 1.1 mrg #endif 503 1.1 mrg #ifdef L_ffssi2 504 1.1 mrg #undef int 505 1.1 mrg int 506 1.1 mrg __ffsSI2 (UWtype u) 507 1.1 mrg { 508 1.1 mrg UWtype count; 509 1.1 mrg 510 1.1 mrg if (u == 0) 511 1.1 mrg return 0; 512 1.1 mrg 513 1.1 mrg count_trailing_zeros (count, u); 514 1.1 mrg return count + 1; 515 1.1 mrg } 516 1.1 mrg #endif 517 1.1 mrg 518 1.1 mrg #ifdef L_ffsdi2 520 1.1 mrg #undef int 521 1.1 mrg int 522 1.1 mrg __ffsDI2 (DWtype u) 523 1.1 mrg { 524 1.1 mrg const DWunion uu = {.ll = u}; 525 1.1 mrg UWtype word, count, add; 526 1.1 mrg 527 1.1 mrg if (uu.s.low != 0) 528 1.1 mrg word = uu.s.low, add = 0; 529 1.1 mrg else if (uu.s.high != 0) 530 1.1 mrg word = uu.s.high, add = W_TYPE_SIZE; 531 1.1 mrg else 532 1.1 mrg return 0; 533 1.1 mrg 534 1.1 mrg count_trailing_zeros (count, word); 535 1.1 mrg return count + add + 1; 536 1.1 mrg } 537 1.1 mrg #endif 538 1.1 mrg 539 1.1 mrg #ifdef L_muldi3 541 1.1 mrg DWtype 542 1.1 mrg __muldi3 (DWtype u, DWtype v) 543 1.1 mrg { 544 1.1 mrg const DWunion uu = {.ll = u}; 545 1.1 mrg const DWunion vv = {.ll = v}; 546 1.1 mrg DWunion w = {.ll = __umulsidi3 (uu.s.low, vv.s.low)}; 547 1.1 mrg 548 1.1 mrg w.s.high += ((UWtype) uu.s.low * (UWtype) vv.s.high 549 1.1 mrg + (UWtype) uu.s.high * (UWtype) vv.s.low); 550 1.1 mrg 551 1.1 mrg return w.ll; 552 1.1 mrg } 553 1.1 mrg #endif 554 1.1 mrg 555 1.1 mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \ 557 1.1 mrg defined (L_umoddi3) || defined (L_moddi3)) 558 1.1 mrg #if defined (sdiv_qrnnd) 559 1.1 mrg #define L_udiv_w_sdiv 560 1.1 mrg #endif 561 1.1 mrg #endif 562 1.1 mrg 563 1.1 mrg #ifdef L_udiv_w_sdiv 564 1.1 mrg #if defined (sdiv_qrnnd) 565 1.1 mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \ 566 1.1 mrg defined (L_umoddi3) || defined (L_moddi3)) 567 1.1 mrg static inline __attribute__ ((__always_inline__)) 568 1.1 mrg #endif 569 1.1 mrg UWtype 570 1.1 mrg __udiv_w_sdiv (UWtype *rp, UWtype a1, UWtype a0, UWtype d) 571 1.1 mrg { 572 1.1 mrg UWtype q, r; 573 1.1 mrg UWtype c0, c1, b1; 574 1.1 mrg 575 1.1 mrg if ((Wtype) d >= 0) 576 1.1 mrg { 577 1.1 mrg if (a1 < d - a1 - (a0 >> (W_TYPE_SIZE - 1))) 578 1.1 mrg { 579 1.1 mrg /* Dividend, divisor, and quotient are nonnegative. */ 580 1.1 mrg sdiv_qrnnd (q, r, a1, a0, d); 581 1.1 mrg } 582 1.1 mrg else 583 1.1 mrg { 584 1.1 mrg /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d. */ 585 1.1 mrg sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (W_TYPE_SIZE - 1)); 586 1.1 mrg /* Divide (c1*2^32 + c0) by d. */ 587 1.1 mrg sdiv_qrnnd (q, r, c1, c0, d); 588 1.1 mrg /* Add 2^31 to quotient. */ 589 1.1 mrg q += (UWtype) 1 << (W_TYPE_SIZE - 1); 590 1.1 mrg } 591 1.1 mrg } 592 1.1 mrg else 593 1.1 mrg { 594 1.1 mrg b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */ 595 1.1 mrg c1 = a1 >> 1; /* A/2 */ 596 1.1 mrg c0 = (a1 << (W_TYPE_SIZE - 1)) + (a0 >> 1); 597 1.1 mrg 598 1.1 mrg if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */ 599 1.1 mrg { 600 1.1 mrg sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */ 601 1.1 mrg 602 1.1 mrg r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */ 603 1.1 mrg if ((d & 1) != 0) 604 1.1 mrg { 605 1.1 mrg if (r >= q) 606 1.1 mrg r = r - q; 607 1.1 mrg else if (q - r <= d) 608 1.1 mrg { 609 1.1 mrg r = r - q + d; 610 1.1 mrg q--; 611 1.1 mrg } 612 1.1 mrg else 613 1.1 mrg { 614 1.1 mrg r = r - q + 2*d; 615 1.1 mrg q -= 2; 616 1.1 mrg } 617 1.1 mrg } 618 1.1 mrg } 619 1.1 mrg else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */ 620 1.1 mrg { 621 1.1 mrg c1 = (b1 - 1) - c1; 622 1.1 mrg c0 = ~c0; /* logical NOT */ 623 1.1 mrg 624 1.1 mrg sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */ 625 1.1 mrg 626 1.1 mrg q = ~q; /* (A/2)/b1 */ 627 1.1 mrg r = (b1 - 1) - r; 628 1.1 mrg 629 1.1 mrg r = 2*r + (a0 & 1); /* A/(2*b1) */ 630 1.1 mrg 631 1.1 mrg if ((d & 1) != 0) 632 1.1 mrg { 633 1.1 mrg if (r >= q) 634 1.1 mrg r = r - q; 635 1.1 mrg else if (q - r <= d) 636 1.1 mrg { 637 1.1 mrg r = r - q + d; 638 1.1 mrg q--; 639 1.1 mrg } 640 1.1 mrg else 641 1.1 mrg { 642 1.1 mrg r = r - q + 2*d; 643 1.1 mrg q -= 2; 644 1.1 mrg } 645 1.1 mrg } 646 1.1 mrg } 647 1.1 mrg else /* Implies c1 = b1 */ 648 1.1 mrg { /* Hence a1 = d - 1 = 2*b1 - 1 */ 649 1.1 mrg if (a0 >= -d) 650 1.1 mrg { 651 1.1 mrg q = -1; 652 1.1 mrg r = a0 + d; 653 1.1 mrg } 654 1.1 mrg else 655 1.1 mrg { 656 1.1 mrg q = -2; 657 1.1 mrg r = a0 + 2*d; 658 1.1 mrg } 659 1.1 mrg } 660 1.1 mrg } 661 1.1 mrg 662 1.1 mrg *rp = r; 663 1.1 mrg return q; 664 1.8 mrg } 665 1.8 mrg #else 666 1.1 mrg /* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */ 667 1.1 mrg UWtype 668 1.1 mrg __udiv_w_sdiv (UWtype *rp __attribute__ ((__unused__)), 669 1.1 mrg UWtype a1 __attribute__ ((__unused__)), 670 1.1 mrg UWtype a0 __attribute__ ((__unused__)), 671 1.1 mrg UWtype d __attribute__ ((__unused__))) 672 1.1 mrg { 673 1.1 mrg return 0; 674 1.1 mrg } 675 1.1 mrg #endif 676 1.1 mrg #endif 677 1.1 mrg 678 1.1 mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \ 680 1.1 mrg defined (L_umoddi3) || defined (L_moddi3) || \ 681 1.1 mrg defined (L_divmoddi4)) 682 1.1 mrg #define L_udivmoddi4 683 1.1 mrg #endif 684 1.1 mrg 685 1.1 mrg #ifdef L_clz 686 1.1 mrg const UQItype __clz_tab[256] = 687 1.1 mrg { 688 1.1 mrg 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 689 1.1 mrg 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 690 1.1 mrg 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 691 1.1 mrg 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 692 1.1 mrg 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 693 1.1 mrg 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 694 1.1 mrg 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 695 1.1 mrg 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 696 1.1 mrg }; 697 1.1 mrg #endif 698 1.1 mrg 699 1.1 mrg #ifdef L_clzsi2 701 1.1 mrg #undef int 702 1.1 mrg int 703 1.1 mrg __clzSI2 (UWtype x) 704 1.1 mrg { 705 1.1 mrg Wtype ret; 706 1.1 mrg 707 1.1 mrg count_leading_zeros (ret, x); 708 1.1 mrg 709 1.1 mrg return ret; 710 1.1 mrg } 711 1.1 mrg #endif 712 1.1 mrg 713 1.1 mrg #ifdef L_clzdi2 715 1.1 mrg #undef int 716 1.1 mrg int 717 1.1 mrg __clzDI2 (UDWtype x) 718 1.1 mrg { 719 1.1 mrg const DWunion uu = {.ll = x}; 720 1.1 mrg UWtype word; 721 1.1 mrg Wtype ret, add; 722 1.1 mrg 723 1.1 mrg if (uu.s.high) 724 1.1 mrg word = uu.s.high, add = 0; 725 1.1 mrg else 726 1.1 mrg word = uu.s.low, add = W_TYPE_SIZE; 727 1.1 mrg 728 1.1 mrg count_leading_zeros (ret, word); 729 1.1 mrg return ret + add; 730 1.1 mrg } 731 1.1 mrg #endif 732 1.1 mrg 733 1.1 mrg #ifdef L_ctzsi2 735 1.1 mrg #undef int 736 1.1 mrg int 737 1.1 mrg __ctzSI2 (UWtype x) 738 1.1 mrg { 739 1.1 mrg Wtype ret; 740 1.1 mrg 741 1.1 mrg count_trailing_zeros (ret, x); 742 1.1 mrg 743 1.1 mrg return ret; 744 1.1 mrg } 745 1.1 mrg #endif 746 1.1 mrg 747 1.1 mrg #ifdef L_ctzdi2 749 1.1 mrg #undef int 750 1.1 mrg int 751 1.1 mrg __ctzDI2 (UDWtype x) 752 1.1 mrg { 753 1.1 mrg const DWunion uu = {.ll = x}; 754 1.1 mrg UWtype word; 755 1.1 mrg Wtype ret, add; 756 1.1 mrg 757 1.1 mrg if (uu.s.low) 758 1.1 mrg word = uu.s.low, add = 0; 759 1.1 mrg else 760 1.1 mrg word = uu.s.high, add = W_TYPE_SIZE; 761 1.1 mrg 762 1.1 mrg count_trailing_zeros (ret, word); 763 1.1 mrg return ret + add; 764 1.1 mrg } 765 1.1 mrg #endif 766 1.1 mrg 767 1.1 mrg #ifdef L_clrsbsi2 769 1.1 mrg #undef int 770 1.1 mrg int 771 1.1 mrg __clrsbSI2 (Wtype x) 772 1.1 mrg { 773 1.1 mrg Wtype ret; 774 1.1 mrg 775 1.1 mrg if (x < 0) 776 1.1 mrg x = ~x; 777 1.1 mrg if (x == 0) 778 1.1 mrg return W_TYPE_SIZE - 1; 779 1.1 mrg count_leading_zeros (ret, x); 780 1.1 mrg return ret - 1; 781 1.1 mrg } 782 1.1 mrg #endif 783 1.1 mrg 784 1.1 mrg #ifdef L_clrsbdi2 786 1.1 mrg #undef int 787 1.1 mrg int 788 1.1 mrg __clrsbDI2 (DWtype x) 789 1.1 mrg { 790 1.1 mrg const DWunion uu = {.ll = x}; 791 1.1 mrg UWtype word; 792 1.1 mrg Wtype ret, add; 793 1.1 mrg 794 1.1 mrg if (uu.s.high == 0) 795 1.1 mrg word = uu.s.low, add = W_TYPE_SIZE; 796 1.1 mrg else if (uu.s.high == -1) 797 1.1 mrg word = ~uu.s.low, add = W_TYPE_SIZE; 798 1.1 mrg else if (uu.s.high >= 0) 799 1.1 mrg word = uu.s.high, add = 0; 800 1.1 mrg else 801 1.1 mrg word = ~uu.s.high, add = 0; 802 1.1 mrg 803 1.1 mrg if (word == 0) 804 1.3 mrg ret = W_TYPE_SIZE; 805 1.5 mrg else 806 1.5 mrg count_leading_zeros (ret, word); 807 1.5 mrg 808 1.5 mrg return ret + add - 1; 809 1.3 mrg } 810 1.5 mrg #endif 811 1.3 mrg 812 1.5 mrg #ifdef L_popcount_tab 814 1.5 mrg const UQItype __popcount_tab[256] = 815 1.3 mrg { 816 1.3 mrg 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, 817 1.3 mrg 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 818 1.3 mrg 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 819 1.1 mrg 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 820 1.1 mrg 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 821 1.1 mrg 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 822 1.1 mrg 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 823 1.1 mrg 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8 824 1.3 mrg }; 825 1.3 mrg #endif 826 1.3 mrg 827 1.5 mrg #if defined(L_popcountsi2) || defined(L_popcountdi2) 829 1.3 mrg #define POPCOUNTCST2(x) (((UWtype) x << __CHAR_BIT__) | x) 830 1.3 mrg #define POPCOUNTCST4(x) (((UWtype) x << (2 * __CHAR_BIT__)) | x) 831 1.5 mrg #define POPCOUNTCST8(x) (((UWtype) x << (4 * __CHAR_BIT__)) | x) 832 1.3 mrg #if W_TYPE_SIZE == __CHAR_BIT__ 833 1.1 mrg #define POPCOUNTCST(x) x 834 1.1 mrg #elif W_TYPE_SIZE == 2 * __CHAR_BIT__ 835 1.1 mrg #define POPCOUNTCST(x) POPCOUNTCST2 (x) 836 1.1 mrg #elif W_TYPE_SIZE == 4 * __CHAR_BIT__ 837 1.1 mrg #define POPCOUNTCST(x) POPCOUNTCST4 (POPCOUNTCST2 (x)) 838 1.1 mrg #elif W_TYPE_SIZE == 8 * __CHAR_BIT__ 839 1.3 mrg #define POPCOUNTCST(x) POPCOUNTCST8 (POPCOUNTCST4 (POPCOUNTCST2 (x))) 840 1.1 mrg #endif 841 1.1 mrg #endif 842 1.1 mrg 843 1.1 mrg #ifdef L_popcountsi2 845 1.1 mrg #undef int 846 1.1 mrg int 847 1.1 mrg __popcountSI2 (UWtype x) 848 1.3 mrg { 849 1.3 mrg /* Force table lookup on targets like AVR and RL78 which only 850 1.3 mrg pretend they have LIBGCC2_UNITS_PER_WORD 4, but actually 851 1.5 mrg have 1, and other small word targets. */ 852 1.3 mrg #if __SIZEOF_INT__ > 2 && defined (POPCOUNTCST) && __CHAR_BIT__ == 8 853 1.3 mrg x = x - ((x >> 1) & POPCOUNTCST (0x55)); 854 1.3 mrg x = (x & POPCOUNTCST (0x33)) + ((x >> 2) & POPCOUNTCST (0x33)); 855 1.3 mrg x = (x + (x >> 4)) & POPCOUNTCST (0x0F); 856 1.3 mrg return (x * POPCOUNTCST (0x01)) >> (W_TYPE_SIZE - __CHAR_BIT__); 857 1.3 mrg #else 858 1.3 mrg int i, ret = 0; 859 1.3 mrg 860 1.3 mrg for (i = 0; i < W_TYPE_SIZE; i += 8) 861 1.5 mrg ret += __popcount_tab[(x >> i) & 0xff]; 862 1.3 mrg 863 1.1 mrg return ret; 864 1.1 mrg #endif 865 1.1 mrg } 866 1.1 mrg #endif 867 1.1 mrg 868 1.1 mrg #ifdef L_popcountdi2 870 1.1 mrg #undef int 871 1.1 mrg int 872 1.1 mrg __popcountDI2 (UDWtype x) 873 1.1 mrg { 874 1.1 mrg /* Force table lookup on targets like AVR and RL78 which only 875 1.1 mrg pretend they have LIBGCC2_UNITS_PER_WORD 4, but actually 876 1.1 mrg have 1, and other small word targets. */ 877 1.1 mrg #if __SIZEOF_INT__ > 2 && defined (POPCOUNTCST) && __CHAR_BIT__ == 8 878 1.1 mrg const DWunion uu = {.ll = x}; 879 1.1 mrg UWtype x1 = uu.s.low, x2 = uu.s.high; 880 1.1 mrg x1 = x1 - ((x1 >> 1) & POPCOUNTCST (0x55)); 881 1.1 mrg x2 = x2 - ((x2 >> 1) & POPCOUNTCST (0x55)); 882 1.1 mrg x1 = (x1 & POPCOUNTCST (0x33)) + ((x1 >> 2) & POPCOUNTCST (0x33)); 883 1.1 mrg x2 = (x2 & POPCOUNTCST (0x33)) + ((x2 >> 2) & POPCOUNTCST (0x33)); 884 1.1 mrg x1 = (x1 + (x1 >> 4)) & POPCOUNTCST (0x0F); 885 1.1 mrg x2 = (x2 + (x2 >> 4)) & POPCOUNTCST (0x0F); 886 1.1 mrg x1 += x2; 887 1.1 mrg return (x1 * POPCOUNTCST (0x01)) >> (W_TYPE_SIZE - __CHAR_BIT__); 888 1.1 mrg #else 889 1.1 mrg int i, ret = 0; 890 1.1 mrg 891 1.1 mrg for (i = 0; i < 2*W_TYPE_SIZE; i += 8) 892 1.1 mrg ret += __popcount_tab[(x >> i) & 0xff]; 893 1.1 mrg 894 1.1 mrg return ret; 895 1.1 mrg #endif 896 1.1 mrg } 897 1.1 mrg #endif 898 1.1 mrg 899 1.1 mrg #ifdef L_paritysi2 901 1.1 mrg #undef int 902 1.1 mrg int 903 1.1 mrg __paritySI2 (UWtype x) 904 1.1 mrg { 905 1.1 mrg #if W_TYPE_SIZE > 64 906 1.1 mrg # error "fill out the table" 907 1.1 mrg #endif 908 1.1 mrg #if W_TYPE_SIZE > 32 909 1.1 mrg x ^= x >> 32; 910 1.1 mrg #endif 911 1.1 mrg #if W_TYPE_SIZE > 16 912 1.1 mrg x ^= x >> 16; 913 1.1 mrg #endif 914 1.1 mrg x ^= x >> 8; 915 1.1 mrg x ^= x >> 4; 916 1.1 mrg x &= 0xf; 917 1.1 mrg return (0x6996 >> x) & 1; 918 1.1 mrg } 919 1.3 mrg #endif 920 1.3 mrg 921 1.3 mrg #ifdef L_paritydi2 923 1.8 mrg #undef int 924 1.3 mrg int 925 1.3 mrg __parityDI2 (UDWtype x) 926 1.3 mrg { 927 1.3 mrg const DWunion uu = {.ll = x}; 928 1.3 mrg UWtype nx = uu.s.low ^ uu.s.high; 929 1.3 mrg 930 1.3 mrg #if W_TYPE_SIZE > 64 931 1.3 mrg # error "fill out the table" 932 1.3 mrg #endif 933 1.3 mrg #if W_TYPE_SIZE > 32 934 1.3 mrg nx ^= nx >> 32; 935 1.3 mrg #endif 936 1.12 mrg #if W_TYPE_SIZE > 16 937 1.3 mrg nx ^= nx >> 16; 938 1.3 mrg #endif 939 1.3 mrg nx ^= nx >> 8; 940 1.3 mrg nx ^= nx >> 4; 941 1.3 mrg nx &= 0xf; 942 1.3 mrg return (0x6996 >> nx) & 1; 943 1.3 mrg } 944 1.3 mrg #endif 945 1.3 mrg 946 1.3 mrg #ifdef L_udivmoddi4 947 1.3 mrg #ifdef TARGET_HAS_NO_HW_DIVIDE 948 1.12 mrg 949 1.3 mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \ 950 1.3 mrg defined (L_umoddi3) || defined (L_moddi3) || \ 951 1.3 mrg defined (L_divmoddi4)) 952 1.3 mrg static inline __attribute__ ((__always_inline__)) 953 1.3 mrg #endif 954 1.3 mrg UDWtype 955 1.3 mrg __udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp) 956 1.3 mrg { 957 1.3 mrg UDWtype q = 0, r = n, y = d; 958 1.3 mrg UWtype lz1, lz2, i, k; 959 1.3 mrg 960 1.3 mrg /* Implements align divisor shift dividend method. This algorithm 961 1.3 mrg aligns the divisor under the dividend and then perform number of 962 1.3 mrg test-subtract iterations which shift the dividend left. Number of 963 1.3 mrg iterations is k + 1 where k is the number of bit positions the 964 1.3 mrg divisor must be shifted left to align it under the dividend. 965 1.3 mrg quotient bits can be saved in the rightmost positions of the dividend 966 1.3 mrg as it shifts left on each test-subtract iteration. */ 967 1.3 mrg 968 1.3 mrg if (y <= r) 969 1.3 mrg { 970 1.3 mrg lz1 = __builtin_clzll (d); 971 1.3 mrg lz2 = __builtin_clzll (n); 972 1.3 mrg 973 1.3 mrg k = lz1 - lz2; 974 1.3 mrg y = (y << k); 975 1.3 mrg 976 1.3 mrg /* Dividend can exceed 2 ^ (width - 1) - 1 but still be less than the 977 1.3 mrg aligned divisor. Normal iteration can drops the high order bit 978 1.3 mrg of the dividend. Therefore, first test-subtract iteration is a 979 1.3 mrg special case, saving its quotient bit in a separate location and 980 1.3 mrg not shifting the dividend. */ 981 1.3 mrg if (r >= y) 982 1.3 mrg { 983 1.3 mrg r = r - y; 984 1.3 mrg q = (1ULL << k); 985 1.3 mrg } 986 1.3 mrg 987 1.3 mrg if (k > 0) 988 1.1 mrg { 989 1.1 mrg y = y >> 1; 990 1.8 mrg 991 1.8 mrg /* k additional iterations where k regular test subtract shift 992 1.1 mrg dividend iterations are done. */ 993 1.1 mrg i = k; 994 1.1 mrg do 995 1.1 mrg { 996 1.1 mrg if (r >= y) 997 1.1 mrg r = ((r - y) << 1) + 1; 998 1.1 mrg else 999 1.1 mrg r = (r << 1); 1000 1.1 mrg i = i - 1; 1001 1.1 mrg } while (i != 0); 1002 1.1 mrg 1003 1.1 mrg /* First quotient bit is combined with the quotient bits resulting 1004 1.1 mrg from the k regular iterations. */ 1005 1.1 mrg q = q + r; 1006 1.1 mrg r = r >> k; 1007 1.1 mrg q = q - (r << k); 1008 1.1 mrg } 1009 1.1 mrg } 1010 1.1 mrg 1011 1.1 mrg if (rp) 1012 1.1 mrg *rp = r; 1013 1.1 mrg return q; 1014 1.1 mrg } 1015 1.1 mrg #else 1016 1.1 mrg 1017 1.1 mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \ 1018 1.1 mrg defined (L_umoddi3) || defined (L_moddi3) || \ 1019 1.1 mrg defined (L_divmoddi4)) 1020 1.1 mrg static inline __attribute__ ((__always_inline__)) 1021 1.1 mrg #endif 1022 1.1 mrg UDWtype 1023 1.1 mrg __udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp) 1024 1.1 mrg { 1025 1.1 mrg const DWunion nn = {.ll = n}; 1026 1.1 mrg const DWunion dd = {.ll = d}; 1027 1.1 mrg DWunion rr; 1028 1.1 mrg UWtype d0, d1, n0, n1, n2; 1029 1.1 mrg UWtype q0, q1; 1030 1.1 mrg UWtype b, bm; 1031 1.1 mrg 1032 1.1 mrg d0 = dd.s.low; 1033 1.1 mrg d1 = dd.s.high; 1034 1.1 mrg n0 = nn.s.low; 1035 1.1 mrg n1 = nn.s.high; 1036 1.1 mrg 1037 1.1 mrg #if !UDIV_NEEDS_NORMALIZATION 1038 1.1 mrg if (d1 == 0) 1039 1.1 mrg { 1040 1.1 mrg if (d0 > n1) 1041 1.1 mrg { 1042 1.1 mrg /* 0q = nn / 0D */ 1043 1.1 mrg 1044 1.1 mrg udiv_qrnnd (q0, n0, n1, n0, d0); 1045 1.1 mrg q1 = 0; 1046 1.1 mrg 1047 1.1 mrg /* Remainder in n0. */ 1048 1.1 mrg } 1049 1.1 mrg else 1050 1.1 mrg { 1051 1.1 mrg /* qq = NN / 0d */ 1052 1.1 mrg 1053 1.1 mrg if (d0 == 0) 1054 1.1 mrg d0 = 1 / d0; /* Divide intentionally by zero. */ 1055 1.1 mrg 1056 1.1 mrg udiv_qrnnd (q1, n1, 0, n1, d0); 1057 1.1 mrg udiv_qrnnd (q0, n0, n1, n0, d0); 1058 1.1 mrg 1059 1.1 mrg /* Remainder in n0. */ 1060 1.1 mrg } 1061 1.1 mrg 1062 1.1 mrg if (rp != 0) 1063 1.1 mrg { 1064 1.1 mrg rr.s.low = n0; 1065 1.1 mrg rr.s.high = 0; 1066 1.1 mrg *rp = rr.ll; 1067 1.1 mrg } 1068 1.1 mrg } 1069 1.1 mrg 1070 1.1 mrg #else /* UDIV_NEEDS_NORMALIZATION */ 1071 1.1 mrg 1072 1.1 mrg if (d1 == 0) 1073 1.1 mrg { 1074 1.1 mrg if (d0 > n1) 1075 1.1 mrg { 1076 1.1 mrg /* 0q = nn / 0D */ 1077 1.1 mrg 1078 1.1 mrg count_leading_zeros (bm, d0); 1079 1.1 mrg 1080 1.1 mrg if (bm != 0) 1081 1.1 mrg { 1082 1.1 mrg /* Normalize, i.e. make the most significant bit of the 1083 1.1 mrg denominator set. */ 1084 1.1 mrg 1085 1.1 mrg d0 = d0 << bm; 1086 1.1 mrg n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm)); 1087 1.1 mrg n0 = n0 << bm; 1088 1.1 mrg } 1089 1.1 mrg 1090 1.1 mrg udiv_qrnnd (q0, n0, n1, n0, d0); 1091 1.1 mrg q1 = 0; 1092 1.1 mrg 1093 1.1 mrg /* Remainder in n0 >> bm. */ 1094 1.1 mrg } 1095 1.1 mrg else 1096 1.1 mrg { 1097 1.1 mrg /* qq = NN / 0d */ 1098 1.1 mrg 1099 1.1 mrg if (d0 == 0) 1100 1.1 mrg d0 = 1 / d0; /* Divide intentionally by zero. */ 1101 1.1 mrg 1102 1.1 mrg count_leading_zeros (bm, d0); 1103 1.1 mrg 1104 1.1 mrg if (bm == 0) 1105 1.1 mrg { 1106 1.1 mrg /* From (n1 >= d0) /\ (the most significant bit of d0 is set), 1107 1.1 mrg conclude (the most significant bit of n1 is set) /\ (the 1108 1.1 mrg leading quotient digit q1 = 1). 1109 1.1 mrg 1110 1.1 mrg This special case is necessary, not an optimization. 1111 1.1 mrg (Shifts counts of W_TYPE_SIZE are undefined.) */ 1112 1.1 mrg 1113 1.1 mrg n1 -= d0; 1114 1.1 mrg q1 = 1; 1115 1.1 mrg } 1116 1.1 mrg else 1117 1.1 mrg { 1118 1.1 mrg /* Normalize. */ 1119 1.1 mrg 1120 1.1 mrg b = W_TYPE_SIZE - bm; 1121 1.1 mrg 1122 1.1 mrg d0 = d0 << bm; 1123 1.1 mrg n2 = n1 >> b; 1124 1.1 mrg n1 = (n1 << bm) | (n0 >> b); 1125 1.1 mrg n0 = n0 << bm; 1126 1.1 mrg 1127 1.1 mrg udiv_qrnnd (q1, n1, n2, n1, d0); 1128 1.1 mrg } 1129 1.1 mrg 1130 1.1 mrg /* n1 != d0... */ 1131 1.1 mrg 1132 1.1 mrg udiv_qrnnd (q0, n0, n1, n0, d0); 1133 1.1 mrg 1134 1.1 mrg /* Remainder in n0 >> bm. */ 1135 1.1 mrg } 1136 1.1 mrg 1137 1.1 mrg if (rp != 0) 1138 1.1 mrg { 1139 1.1 mrg rr.s.low = n0 >> bm; 1140 1.1 mrg rr.s.high = 0; 1141 1.1 mrg *rp = rr.ll; 1142 1.1 mrg } 1143 1.1 mrg } 1144 1.1 mrg #endif /* UDIV_NEEDS_NORMALIZATION */ 1145 1.1 mrg 1146 1.1 mrg else 1147 1.1 mrg { 1148 1.1 mrg if (d1 > n1) 1149 1.1 mrg { 1150 1.1 mrg /* 00 = nn / DD */ 1151 1.1 mrg 1152 1.1 mrg q0 = 0; 1153 1.1 mrg q1 = 0; 1154 1.1 mrg 1155 1.1 mrg /* Remainder in n1n0. */ 1156 1.1 mrg if (rp != 0) 1157 1.1 mrg { 1158 1.1 mrg rr.s.low = n0; 1159 1.1 mrg rr.s.high = n1; 1160 1.1 mrg *rp = rr.ll; 1161 1.1 mrg } 1162 1.1 mrg } 1163 1.1 mrg else 1164 1.1 mrg { 1165 1.1 mrg /* 0q = NN / dd */ 1166 1.1 mrg 1167 1.1 mrg count_leading_zeros (bm, d1); 1168 1.1 mrg if (bm == 0) 1169 1.1 mrg { 1170 1.1 mrg /* From (n1 >= d1) /\ (the most significant bit of d1 is set), 1171 1.1 mrg conclude (the most significant bit of n1 is set) /\ (the 1172 1.1 mrg quotient digit q0 = 0 or 1). 1173 1.1 mrg 1174 1.1 mrg This special case is necessary, not an optimization. */ 1175 1.1 mrg 1176 1.1 mrg /* The condition on the next line takes advantage of that 1177 1.1 mrg n1 >= d1 (true due to program flow). */ 1178 1.1 mrg if (n1 > d1 || n0 >= d0) 1179 1.1 mrg { 1180 1.1 mrg q0 = 1; 1181 1.1 mrg sub_ddmmss (n1, n0, n1, n0, d1, d0); 1182 1.1 mrg } 1183 1.1 mrg else 1184 1.1 mrg q0 = 0; 1185 1.1 mrg 1186 1.1 mrg q1 = 0; 1187 1.1 mrg 1188 1.1 mrg if (rp != 0) 1189 1.1 mrg { 1190 1.1 mrg rr.s.low = n0; 1191 1.1 mrg rr.s.high = n1; 1192 1.1 mrg *rp = rr.ll; 1193 1.1 mrg } 1194 1.1 mrg } 1195 1.1 mrg else 1196 1.1 mrg { 1197 1.1 mrg UWtype m1, m0; 1198 1.1 mrg /* Normalize. */ 1199 1.1 mrg 1200 1.1 mrg b = W_TYPE_SIZE - bm; 1201 1.1 mrg 1202 1.1 mrg d1 = (d1 << bm) | (d0 >> b); 1203 1.1 mrg d0 = d0 << bm; 1204 1.1 mrg n2 = n1 >> b; 1205 1.1 mrg n1 = (n1 << bm) | (n0 >> b); 1206 1.1 mrg n0 = n0 << bm; 1207 1.3 mrg 1208 1.1 mrg udiv_qrnnd (q0, n1, n2, n1, d1); 1209 1.1 mrg umul_ppmm (m1, m0, q0, d0); 1210 1.1 mrg 1211 1.1 mrg if (m1 > n1 || (m1 == n1 && m0 > n0)) 1212 1.1 mrg { 1213 1.1 mrg q0--; 1214 1.1 mrg sub_ddmmss (m1, m0, m1, m0, d1, d0); 1215 1.1 mrg } 1216 1.1 mrg 1217 1.1 mrg q1 = 0; 1218 1.1 mrg 1219 1.1 mrg /* Remainder in (n1n0 - m1m0) >> bm. */ 1220 1.1 mrg if (rp != 0) 1221 1.1 mrg { 1222 1.1 mrg sub_ddmmss (n1, n0, n1, n0, m1, m0); 1223 1.1 mrg rr.s.low = (n1 << b) | (n0 >> bm); 1224 1.1 mrg rr.s.high = n1 >> bm; 1225 1.1 mrg *rp = rr.ll; 1226 1.1 mrg } 1227 1.1 mrg } 1228 1.1 mrg } 1229 1.1 mrg } 1230 1.1 mrg 1231 1.1 mrg const DWunion ww = {{.low = q0, .high = q1}}; 1232 1.1 mrg return ww.ll; 1233 1.1 mrg } 1234 1.1 mrg #endif 1235 1.1 mrg #endif 1236 1.1 mrg 1237 1.1 mrg #ifdef L_divdi3 1238 1.1 mrg DWtype 1239 1.1 mrg __divdi3 (DWtype u, DWtype v) 1240 1.1 mrg { 1241 1.1 mrg Wtype c = 0; 1242 1.1 mrg DWunion uu = {.ll = u}; 1243 1.1 mrg DWunion vv = {.ll = v}; 1244 1.1 mrg DWtype w; 1245 1.1 mrg 1246 1.1 mrg if (uu.s.high < 0) 1247 1.1 mrg c = ~c, 1248 1.1 mrg uu.ll = -uu.ll; 1249 1.1 mrg if (vv.s.high < 0) 1250 1.1 mrg c = ~c, 1251 1.1 mrg vv.ll = -vv.ll; 1252 1.1 mrg 1253 1.1 mrg w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) 0); 1254 1.1 mrg if (c) 1255 1.1 mrg w = -w; 1256 1.8 mrg 1257 1.8 mrg return w; 1258 1.8 mrg } 1259 1.8 mrg #endif 1260 1.8 mrg 1261 1.8 mrg #ifdef L_moddi3 1262 1.8 mrg DWtype 1263 1.8 mrg __moddi3 (DWtype u, DWtype v) 1264 1.8 mrg { 1265 1.8 mrg Wtype c = 0; 1266 1.8 mrg DWunion uu = {.ll = u}; 1267 1.8 mrg DWunion vv = {.ll = v}; 1268 1.8 mrg DWtype w; 1269 1.8 mrg 1270 1.8 mrg if (uu.s.high < 0) 1271 1.8 mrg c = ~c, 1272 1.8 mrg uu.ll = -uu.ll; 1273 1.8 mrg if (vv.s.high < 0) 1274 1.8 mrg vv.ll = -vv.ll; 1275 1.8 mrg 1276 1.8 mrg (void) __udivmoddi4 (uu.ll, vv.ll, (UDWtype*)&w); 1277 1.8 mrg if (c) 1278 1.8 mrg w = -w; 1279 1.8 mrg 1280 1.8 mrg return w; 1281 1.8 mrg } 1282 1.8 mrg #endif 1283 1.8 mrg 1284 1.1 mrg #ifdef L_divmoddi4 1285 1.1 mrg DWtype 1286 1.1 mrg __divmoddi4 (DWtype u, DWtype v, DWtype *rp) 1287 1.1 mrg { 1288 1.1 mrg Wtype c1 = 0, c2 = 0; 1289 1.1 mrg DWunion uu = {.ll = u}; 1290 1.1 mrg DWunion vv = {.ll = v}; 1291 1.1 mrg DWtype w; 1292 1.1 mrg DWtype r; 1293 1.1 mrg 1294 1.1 mrg if (uu.s.high < 0) 1295 1.1 mrg c1 = ~c1, c2 = ~c2, 1296 1.1 mrg uu.ll = -uu.ll; 1297 1.1 mrg if (vv.s.high < 0) 1298 1.1 mrg c1 = ~c1, 1299 1.1 mrg vv.ll = -vv.ll; 1300 1.1 mrg 1301 1.1 mrg w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype*)&r); 1302 1.1 mrg if (c1) 1303 1.1 mrg w = -w; 1304 1.1 mrg if (c2) 1305 1.1 mrg r = -r; 1306 1.1 mrg 1307 1.1 mrg *rp = r; 1308 1.12 mrg return w; 1309 1.1 mrg } 1310 1.1 mrg #endif 1311 1.1 mrg 1312 1.1 mrg #ifdef L_umoddi3 1313 1.1 mrg UDWtype 1314 1.12 mrg __umoddi3 (UDWtype u, UDWtype v) 1315 1.1 mrg { 1316 1.12 mrg UDWtype w; 1317 1.1 mrg 1318 1.1 mrg (void) __udivmoddi4 (u, v, &w); 1319 1.1 mrg 1320 1.1 mrg return w; 1321 1.1 mrg } 1322 1.1 mrg #endif 1323 1.1 mrg 1324 1.1 mrg #ifdef L_udivdi3 1325 1.1 mrg UDWtype 1326 1.1 mrg __udivdi3 (UDWtype n, UDWtype d) 1327 1.1 mrg { 1328 1.1 mrg return __udivmoddi4 (n, d, (UDWtype *) 0); 1329 1.1 mrg } 1330 1.1 mrg #endif 1331 1.1 mrg 1332 1.1 mrg #ifdef L_cmpdi2 1334 1.1 mrg cmp_return_type 1335 1.1 mrg __cmpdi2 (DWtype a, DWtype b) 1336 1.1 mrg { 1337 1.1 mrg return (a > b) - (a < b) + 1; 1338 1.1 mrg } 1339 1.1 mrg #endif 1340 1.1 mrg 1341 1.1 mrg #ifdef L_ucmpdi2 1342 1.1 mrg cmp_return_type 1343 1.1 mrg __ucmpdi2 (UDWtype a, UDWtype b) 1344 1.1 mrg { 1345 1.1 mrg return (a > b) - (a < b) + 1; 1346 1.1 mrg } 1347 1.1 mrg #endif 1348 1.1 mrg 1349 1.1 mrg #if defined(L_fixunstfdi) && LIBGCC2_HAS_TF_MODE 1351 1.1 mrg UDWtype 1352 1.1 mrg __fixunstfDI (TFtype a) 1353 1.1 mrg { 1354 1.1 mrg if (a < 0) 1355 1.1 mrg return 0; 1356 1.1 mrg 1357 1.1 mrg /* Compute high word of result, as a flonum. */ 1358 1.1 mrg const TFtype b = (a / Wtype_MAXp1_F); 1359 1.1 mrg /* Convert that to fixed (but not to DWtype!), 1360 1.1 mrg and shift it into the high word. */ 1361 1.1 mrg UDWtype v = (UWtype) b; 1362 1.1 mrg v <<= W_TYPE_SIZE; 1363 1.1 mrg /* Remove high part from the TFtype, leaving the low part as flonum. */ 1364 1.1 mrg a -= (TFtype)v; 1365 1.1 mrg /* Convert that to fixed (but not to DWtype!) and add it in. 1366 1.1 mrg Sometimes A comes out negative. This is significant, since 1367 1.1 mrg A has more bits than a long int does. */ 1368 1.1 mrg if (a < 0) 1369 1.1 mrg v -= (UWtype) (- a); 1370 1.1 mrg else 1371 1.1 mrg v += (UWtype) a; 1372 1.1 mrg return v; 1373 1.1 mrg } 1374 1.1 mrg #endif 1375 1.1 mrg 1376 1.1 mrg #if defined(L_fixtfdi) && LIBGCC2_HAS_TF_MODE 1377 1.1 mrg DWtype 1378 1.1 mrg __fixtfdi (TFtype a) 1379 1.1 mrg { 1380 1.1 mrg if (a < 0) 1381 1.1 mrg return - __fixunstfDI (-a); 1382 1.1 mrg return __fixunstfDI (a); 1383 1.1 mrg } 1384 1.1 mrg #endif 1385 1.1 mrg 1386 1.1 mrg #if defined(L_fixunsxfdi) && LIBGCC2_HAS_XF_MODE 1387 1.1 mrg UDWtype 1388 1.1 mrg __fixunsxfDI (XFtype a) 1389 1.1 mrg { 1390 1.1 mrg if (a < 0) 1391 1.1 mrg return 0; 1392 1.1 mrg 1393 1.1 mrg /* Compute high word of result, as a flonum. */ 1394 1.1 mrg const XFtype b = (a / Wtype_MAXp1_F); 1395 1.1 mrg /* Convert that to fixed (but not to DWtype!), 1396 1.1 mrg and shift it into the high word. */ 1397 1.1 mrg UDWtype v = (UWtype) b; 1398 1.1 mrg v <<= W_TYPE_SIZE; 1399 1.1 mrg /* Remove high part from the XFtype, leaving the low part as flonum. */ 1400 1.1 mrg a -= (XFtype)v; 1401 1.1 mrg /* Convert that to fixed (but not to DWtype!) and add it in. 1402 1.1 mrg Sometimes A comes out negative. This is significant, since 1403 1.1 mrg A has more bits than a long int does. */ 1404 1.1 mrg if (a < 0) 1405 1.1 mrg v -= (UWtype) (- a); 1406 1.1 mrg else 1407 1.1 mrg v += (UWtype) a; 1408 1.1 mrg return v; 1409 1.1 mrg } 1410 1.1 mrg #endif 1411 1.1 mrg 1412 1.1 mrg #if defined(L_fixxfdi) && LIBGCC2_HAS_XF_MODE 1413 1.1 mrg DWtype 1414 1.1 mrg __fixxfdi (XFtype a) 1415 1.1 mrg { 1416 1.1 mrg if (a < 0) 1417 1.1 mrg return - __fixunsxfDI (-a); 1418 1.1 mrg return __fixunsxfDI (a); 1419 1.1 mrg } 1420 1.1 mrg #endif 1421 1.1 mrg 1422 1.1 mrg #if defined(L_fixunsdfdi) && LIBGCC2_HAS_DF_MODE 1423 1.1 mrg UDWtype 1424 1.1 mrg __fixunsdfDI (DFtype a) 1425 1.1 mrg { 1426 1.1 mrg /* Get high part of result. The division here will just moves the radix 1427 1.1 mrg point and will not cause any rounding. Then the conversion to integral 1428 1.1 mrg type chops result as desired. */ 1429 1.1 mrg const UWtype hi = a / Wtype_MAXp1_F; 1430 1.1 mrg 1431 1.1 mrg /* Get low part of result. Convert `hi' to floating type and scale it back, 1432 1.1 mrg then subtract this from the number being converted. This leaves the low 1433 1.1 mrg part. Convert that to integral type. */ 1434 1.1 mrg const UWtype lo = a - (DFtype) hi * Wtype_MAXp1_F; 1435 1.1 mrg 1436 1.1 mrg /* Assemble result from the two parts. */ 1437 1.1 mrg return ((UDWtype) hi << W_TYPE_SIZE) | lo; 1438 1.1 mrg } 1439 1.1 mrg #endif 1440 1.1 mrg 1441 1.1 mrg #if defined(L_fixdfdi) && LIBGCC2_HAS_DF_MODE 1442 1.1 mrg DWtype 1443 1.1 mrg __fixdfdi (DFtype a) 1444 1.1 mrg { 1445 1.1 mrg if (a < 0) 1446 1.1 mrg return - __fixunsdfDI (-a); 1447 1.1 mrg return __fixunsdfDI (a); 1448 1.1 mrg } 1449 1.1 mrg #endif 1450 1.1 mrg 1451 1.1 mrg #if defined(L_fixunssfdi) && LIBGCC2_HAS_SF_MODE 1452 1.1 mrg UDWtype 1453 1.1 mrg __fixunssfDI (SFtype a) 1454 1.1 mrg { 1455 1.1 mrg #if LIBGCC2_HAS_DF_MODE 1456 1.1 mrg /* Convert the SFtype to a DFtype, because that is surely not going 1457 1.1 mrg to lose any bits. Some day someone else can write a faster version 1458 1.1 mrg that avoids converting to DFtype, and verify it really works right. */ 1459 1.1 mrg const DFtype dfa = a; 1460 1.1 mrg 1461 1.1 mrg /* Get high part of result. The division here will just moves the radix 1462 1.1 mrg point and will not cause any rounding. Then the conversion to integral 1463 1.1 mrg type chops result as desired. */ 1464 1.1 mrg const UWtype hi = dfa / Wtype_MAXp1_F; 1465 1.1 mrg 1466 1.1 mrg /* Get low part of result. Convert `hi' to floating type and scale it back, 1467 1.1 mrg then subtract this from the number being converted. This leaves the low 1468 1.1 mrg part. Convert that to integral type. */ 1469 1.1 mrg const UWtype lo = dfa - (DFtype) hi * Wtype_MAXp1_F; 1470 1.1 mrg 1471 1.1 mrg /* Assemble result from the two parts. */ 1472 1.1 mrg return ((UDWtype) hi << W_TYPE_SIZE) | lo; 1473 1.1 mrg #elif FLT_MANT_DIG < W_TYPE_SIZE 1474 1.1 mrg if (a < 1) 1475 1.1 mrg return 0; 1476 1.1 mrg if (a < Wtype_MAXp1_F) 1477 1.1 mrg return (UWtype)a; 1478 1.1 mrg if (a < Wtype_MAXp1_F * Wtype_MAXp1_F) 1479 1.1 mrg { 1480 1.1 mrg /* Since we know that there are fewer significant bits in the SFmode 1481 1.1 mrg quantity than in a word, we know that we can convert out all the 1482 1.1 mrg significant bits in one step, and thus avoid losing bits. */ 1483 1.1 mrg 1484 1.1 mrg /* ??? This following loop essentially performs frexpf. If we could 1485 1.1 mrg use the real libm function, or poke at the actual bits of the fp 1486 1.1 mrg format, it would be significantly faster. */ 1487 1.1 mrg 1488 1.1 mrg UWtype shift = 0, counter; 1489 1.1 mrg SFtype msb; 1490 1.1 mrg 1491 1.1 mrg a /= Wtype_MAXp1_F; 1492 1.1 mrg for (counter = W_TYPE_SIZE / 2; counter != 0; counter >>= 1) 1493 1.1 mrg { 1494 1.1 mrg SFtype counterf = (UWtype)1 << counter; 1495 1.1 mrg if (a >= counterf) 1496 1.1 mrg { 1497 1.1 mrg shift |= counter; 1498 1.1 mrg a /= counterf; 1499 1.3 mrg } 1500 1.1 mrg } 1501 1.1 mrg 1502 1.1 mrg /* Rescale into the range of one word, extract the bits of that 1503 1.1 mrg one word, and shift the result into position. */ 1504 1.1 mrg a *= Wtype_MAXp1_F; 1505 1.1 mrg counter = a; 1506 1.1 mrg return (DWtype)counter << shift; 1507 1.1 mrg } 1508 1.1 mrg return -1; 1509 1.1 mrg #else 1510 1.1 mrg # error 1511 1.1 mrg #endif 1512 1.1 mrg } 1513 1.3 mrg #endif 1514 1.1 mrg 1515 1.1 mrg #if defined(L_fixsfdi) && LIBGCC2_HAS_SF_MODE 1516 1.1 mrg DWtype 1517 1.1 mrg __fixsfdi (SFtype a) 1518 1.1 mrg { 1519 1.1 mrg if (a < 0) 1520 1.1 mrg return - __fixunssfDI (-a); 1521 1.1 mrg return __fixunssfDI (a); 1522 1.1 mrg } 1523 1.1 mrg #endif 1524 1.1 mrg 1525 1.1 mrg #if defined(L_floatdixf) && LIBGCC2_HAS_XF_MODE 1526 1.1 mrg XFtype 1527 1.3 mrg __floatdixf (DWtype u) 1528 1.1 mrg { 1529 1.1 mrg #if W_TYPE_SIZE > __LIBGCC_XF_MANT_DIG__ 1530 1.1 mrg # error 1531 1.1 mrg #endif 1532 1.1 mrg XFtype d = (Wtype) (u >> W_TYPE_SIZE); 1533 1.1 mrg d *= Wtype_MAXp1_F; 1534 1.1 mrg d += (UWtype)u; 1535 1.1 mrg return d; 1536 1.1 mrg } 1537 1.1 mrg #endif 1538 1.1 mrg 1539 1.1 mrg #if defined(L_floatundixf) && LIBGCC2_HAS_XF_MODE 1540 1.1 mrg XFtype 1541 1.3 mrg __floatundixf (UDWtype u) 1542 1.1 mrg { 1543 1.1 mrg #if W_TYPE_SIZE > __LIBGCC_XF_MANT_DIG__ 1544 1.1 mrg # error 1545 1.1 mrg #endif 1546 1.1 mrg XFtype d = (UWtype) (u >> W_TYPE_SIZE); 1547 1.1 mrg d *= Wtype_MAXp1_F; 1548 1.1 mrg d += (UWtype)u; 1549 1.1 mrg return d; 1550 1.1 mrg } 1551 1.1 mrg #endif 1552 1.1 mrg 1553 1.1 mrg #if defined(L_floatditf) && LIBGCC2_HAS_TF_MODE 1554 1.1 mrg TFtype 1555 1.1 mrg __floatditf (DWtype u) 1556 1.1 mrg { 1557 1.1 mrg #if W_TYPE_SIZE > __LIBGCC_TF_MANT_DIG__ 1558 1.1 mrg # error 1559 1.1 mrg #endif 1560 1.1 mrg TFtype d = (Wtype) (u >> W_TYPE_SIZE); 1561 1.3 mrg d *= Wtype_MAXp1_F; 1562 1.1 mrg d += (UWtype)u; 1563 1.1 mrg return d; 1564 1.1 mrg } 1565 1.3 mrg #endif 1566 1.1 mrg 1567 1.1 mrg #if defined(L_floatunditf) && LIBGCC2_HAS_TF_MODE 1568 1.1 mrg TFtype 1569 1.1 mrg __floatunditf (UDWtype u) 1570 1.1 mrg { 1571 1.1 mrg #if W_TYPE_SIZE > __LIBGCC_TF_MANT_DIG__ 1572 1.1 mrg # error 1573 1.1 mrg #endif 1574 1.1 mrg TFtype d = (UWtype) (u >> W_TYPE_SIZE); 1575 1.1 mrg d *= Wtype_MAXp1_F; 1576 1.1 mrg d += (UWtype)u; 1577 1.3 mrg return d; 1578 1.3 mrg } 1579 1.3 mrg #endif 1580 1.1 mrg 1581 1.3 mrg #if (defined(L_floatdisf) && LIBGCC2_HAS_SF_MODE) \ 1582 1.3 mrg || (defined(L_floatdidf) && LIBGCC2_HAS_DF_MODE) 1583 1.1 mrg #define DI_SIZE (W_TYPE_SIZE * 2) 1584 1.3 mrg #define F_MODE_OK(SIZE) \ 1585 1.3 mrg (SIZE < DI_SIZE \ 1586 1.1 mrg && SIZE > (DI_SIZE - SIZE + FSSIZE) \ 1587 1.3 mrg && !AVOID_FP_TYPE_CONVERSION(SIZE)) 1588 1.3 mrg #if defined(L_floatdisf) 1589 1.1 mrg #define FUNC __floatdisf 1590 1.1 mrg #define FSTYPE SFtype 1591 1.1 mrg #define FSSIZE __LIBGCC_SF_MANT_DIG__ 1592 1.1 mrg #else 1593 1.1 mrg #define FUNC __floatdidf 1594 1.1 mrg #define FSTYPE DFtype 1595 1.1 mrg #define FSSIZE __LIBGCC_DF_MANT_DIG__ 1596 1.1 mrg #endif 1597 1.1 mrg 1598 1.1 mrg FSTYPE 1599 1.1 mrg FUNC (DWtype u) 1600 1.1 mrg { 1601 1.1 mrg #if FSSIZE >= W_TYPE_SIZE 1602 1.1 mrg /* When the word size is small, we never get any rounding error. */ 1603 1.1 mrg FSTYPE f = (Wtype) (u >> W_TYPE_SIZE); 1604 1.1 mrg f *= Wtype_MAXp1_F; 1605 1.1 mrg f += (UWtype)u; 1606 1.1 mrg return f; 1607 1.1 mrg #elif (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__)) \ 1608 1.1 mrg || (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__)) \ 1609 1.1 mrg || (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__)) 1610 1.1 mrg 1611 1.1 mrg #if (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__)) 1612 1.1 mrg # define FSIZE __LIBGCC_DF_MANT_DIG__ 1613 1.1 mrg # define FTYPE DFtype 1614 1.1 mrg #elif (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__)) 1615 1.1 mrg # define FSIZE __LIBGCC_XF_MANT_DIG__ 1616 1.1 mrg # define FTYPE XFtype 1617 1.1 mrg #elif (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__)) 1618 1.1 mrg # define FSIZE __LIBGCC_TF_MANT_DIG__ 1619 1.1 mrg # define FTYPE TFtype 1620 1.1 mrg #else 1621 1.1 mrg # error 1622 1.1 mrg #endif 1623 1.1 mrg 1624 1.1 mrg #define REP_BIT ((UDWtype) 1 << (DI_SIZE - FSIZE)) 1625 1.1 mrg 1626 1.1 mrg /* Protect against double-rounding error. 1627 1.1 mrg Represent any low-order bits, that might be truncated by a bit that 1628 1.1 mrg won't be lost. The bit can go in anywhere below the rounding position 1629 1.1 mrg of the FSTYPE. A fixed mask and bit position handles all usual 1630 1.1 mrg configurations. */ 1631 1.1 mrg if (! (- ((DWtype) 1 << FSIZE) < u 1632 1.1 mrg && u < ((DWtype) 1 << FSIZE))) 1633 1.3 mrg { 1634 1.1 mrg if ((UDWtype) u & (REP_BIT - 1)) 1635 1.1 mrg { 1636 1.8 mrg u &= ~ (REP_BIT - 1); 1637 1.8 mrg u |= REP_BIT; 1638 1.8 mrg } 1639 1.8 mrg } 1640 1.8 mrg 1641 1.1 mrg /* Do the calculation in a wider type so that we don't lose any of 1642 1.1 mrg the precision of the high word while multiplying it. */ 1643 1.1 mrg FTYPE f = (Wtype) (u >> W_TYPE_SIZE); 1644 1.1 mrg f *= Wtype_MAXp1_F; 1645 1.10 mrg f += (UWtype)u; 1646 1.1 mrg return (FSTYPE) f; 1647 1.1 mrg #else 1648 1.1 mrg #if FSSIZE >= W_TYPE_SIZE - 2 1649 1.1 mrg # error 1650 1.1 mrg #endif 1651 1.1 mrg /* Finally, the word size is larger than the number of bits in the 1652 1.1 mrg required FSTYPE, and we've got no suitable wider type. The only 1653 1.1 mrg way to avoid double rounding is to special case the 1654 1.1 mrg extraction. */ 1655 1.1 mrg 1656 1.1 mrg /* If there are no high bits set, fall back to one conversion. */ 1657 1.1 mrg if ((Wtype)u == u) 1658 1.1 mrg return (FSTYPE)(Wtype)u; 1659 1.1 mrg 1660 1.1 mrg /* Otherwise, find the power of two. */ 1661 1.1 mrg Wtype hi = u >> W_TYPE_SIZE; 1662 1.1 mrg if (hi < 0) 1663 1.1 mrg hi = -(UWtype) hi; 1664 1.1 mrg 1665 1.1 mrg UWtype count, shift; 1666 1.1 mrg #if !defined (COUNT_LEADING_ZEROS_0) || COUNT_LEADING_ZEROS_0 != W_TYPE_SIZE 1667 1.1 mrg if (hi == 0) 1668 1.1 mrg count = W_TYPE_SIZE; 1669 1.1 mrg else 1670 1.1 mrg #endif 1671 1.1 mrg count_leading_zeros (count, hi); 1672 1.1 mrg 1673 1.1 mrg /* No leading bits means u == minimum. */ 1674 1.1 mrg if (count == 0) 1675 1.1 mrg return Wtype_MAXp1_F * (FSTYPE) (hi | ((UWtype) u != 0)); 1676 1.1 mrg 1677 1.1 mrg shift = 1 + W_TYPE_SIZE - count; 1678 1.1 mrg 1679 1.1 mrg /* Shift down the most significant bits. */ 1680 1.1 mrg hi = u >> shift; 1681 1.1 mrg 1682 1.3 mrg /* If we lost any nonzero bits, set the lsb to ensure correct rounding. */ 1683 1.1 mrg if ((UWtype)u << (W_TYPE_SIZE - shift)) 1684 1.1 mrg hi |= 1; 1685 1.1 mrg 1686 1.3 mrg /* Convert the one word of data, and rescale. */ 1687 1.1 mrg FSTYPE f = hi, e; 1688 1.1 mrg if (shift == W_TYPE_SIZE) 1689 1.1 mrg e = Wtype_MAXp1_F; 1690 1.1 mrg /* The following two cases could be merged if we knew that the target 1691 1.1 mrg supported a native unsigned->float conversion. More often, we only 1692 1.1 mrg have a signed conversion, and have to add extra fixup code. */ 1693 1.1 mrg else if (shift == W_TYPE_SIZE - 1) 1694 1.1 mrg e = Wtype_MAXp1_F / 2; 1695 1.1 mrg else 1696 1.1 mrg e = (Wtype)1 << shift; 1697 1.1 mrg return f * e; 1698 1.3 mrg #endif 1699 1.3 mrg } 1700 1.3 mrg #endif 1701 1.1 mrg 1702 1.3 mrg #if (defined(L_floatundisf) && LIBGCC2_HAS_SF_MODE) \ 1703 1.3 mrg || (defined(L_floatundidf) && LIBGCC2_HAS_DF_MODE) 1704 1.1 mrg #define DI_SIZE (W_TYPE_SIZE * 2) 1705 1.3 mrg #define F_MODE_OK(SIZE) \ 1706 1.3 mrg (SIZE < DI_SIZE \ 1707 1.1 mrg && SIZE > (DI_SIZE - SIZE + FSSIZE) \ 1708 1.3 mrg && !AVOID_FP_TYPE_CONVERSION(SIZE)) 1709 1.3 mrg #if defined(L_floatundisf) 1710 1.1 mrg #define FUNC __floatundisf 1711 1.1 mrg #define FSTYPE SFtype 1712 1.1 mrg #define FSSIZE __LIBGCC_SF_MANT_DIG__ 1713 1.1 mrg #else 1714 1.1 mrg #define FUNC __floatundidf 1715 1.1 mrg #define FSTYPE DFtype 1716 1.1 mrg #define FSSIZE __LIBGCC_DF_MANT_DIG__ 1717 1.1 mrg #endif 1718 1.1 mrg 1719 1.1 mrg FSTYPE 1720 1.1 mrg FUNC (UDWtype u) 1721 1.1 mrg { 1722 1.1 mrg #if FSSIZE >= W_TYPE_SIZE 1723 1.1 mrg /* When the word size is small, we never get any rounding error. */ 1724 1.1 mrg FSTYPE f = (UWtype) (u >> W_TYPE_SIZE); 1725 1.1 mrg f *= Wtype_MAXp1_F; 1726 1.1 mrg f += (UWtype)u; 1727 1.1 mrg return f; 1728 1.1 mrg #elif (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__)) \ 1729 1.1 mrg || (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__)) \ 1730 1.1 mrg || (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__)) 1731 1.1 mrg 1732 1.1 mrg #if (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__)) 1733 1.1 mrg # define FSIZE __LIBGCC_DF_MANT_DIG__ 1734 1.1 mrg # define FTYPE DFtype 1735 1.1 mrg #elif (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__)) 1736 1.1 mrg # define FSIZE __LIBGCC_XF_MANT_DIG__ 1737 1.1 mrg # define FTYPE XFtype 1738 1.1 mrg #elif (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__)) 1739 1.1 mrg # define FSIZE __LIBGCC_TF_MANT_DIG__ 1740 1.1 mrg # define FTYPE TFtype 1741 1.1 mrg #else 1742 1.1 mrg # error 1743 1.1 mrg #endif 1744 1.1 mrg 1745 1.1 mrg #define REP_BIT ((UDWtype) 1 << (DI_SIZE - FSIZE)) 1746 1.1 mrg 1747 1.1 mrg /* Protect against double-rounding error. 1748 1.1 mrg Represent any low-order bits, that might be truncated by a bit that 1749 1.1 mrg won't be lost. The bit can go in anywhere below the rounding position 1750 1.1 mrg of the FSTYPE. A fixed mask and bit position handles all usual 1751 1.1 mrg configurations. */ 1752 1.1 mrg if (u >= ((UDWtype) 1 << FSIZE)) 1753 1.1 mrg { 1754 1.1 mrg if ((UDWtype) u & (REP_BIT - 1)) 1755 1.1 mrg { 1756 1.1 mrg u &= ~ (REP_BIT - 1); 1757 1.1 mrg u |= REP_BIT; 1758 1.1 mrg } 1759 1.1 mrg } 1760 1.1 mrg 1761 1.1 mrg /* Do the calculation in a wider type so that we don't lose any of 1762 1.1 mrg the precision of the high word while multiplying it. */ 1763 1.1 mrg FTYPE f = (UWtype) (u >> W_TYPE_SIZE); 1764 1.1 mrg f *= Wtype_MAXp1_F; 1765 1.1 mrg f += (UWtype)u; 1766 1.1 mrg return (FSTYPE) f; 1767 1.1 mrg #else 1768 1.1 mrg #if FSSIZE == W_TYPE_SIZE - 1 1769 1.1 mrg # error 1770 1.1 mrg #endif 1771 1.1 mrg /* Finally, the word size is larger than the number of bits in the 1772 1.1 mrg required FSTYPE, and we've got no suitable wider type. The only 1773 1.1 mrg way to avoid double rounding is to special case the 1774 1.1 mrg extraction. */ 1775 1.1 mrg 1776 1.1 mrg /* If there are no high bits set, fall back to one conversion. */ 1777 1.1 mrg if ((UWtype)u == u) 1778 1.1 mrg return (FSTYPE)(UWtype)u; 1779 1.1 mrg 1780 1.1 mrg /* Otherwise, find the power of two. */ 1781 1.1 mrg UWtype hi = u >> W_TYPE_SIZE; 1782 1.1 mrg 1783 1.1 mrg UWtype count, shift; 1784 1.1 mrg count_leading_zeros (count, hi); 1785 1.1 mrg 1786 1.1 mrg shift = W_TYPE_SIZE - count; 1787 1.1 mrg 1788 1.1 mrg /* Shift down the most significant bits. */ 1789 1.1 mrg hi = u >> shift; 1790 1.1 mrg 1791 1.1 mrg /* If we lost any nonzero bits, set the lsb to ensure correct rounding. */ 1792 1.1 mrg if ((UWtype)u << (W_TYPE_SIZE - shift)) 1793 1.1 mrg hi |= 1; 1794 1.1 mrg 1795 1.1 mrg /* Convert the one word of data, and rescale. */ 1796 1.1 mrg FSTYPE f = hi, e; 1797 1.1 mrg if (shift == W_TYPE_SIZE) 1798 1.1 mrg e = Wtype_MAXp1_F; 1799 1.1 mrg /* The following two cases could be merged if we knew that the target 1800 1.1 mrg supported a native unsigned->float conversion. More often, we only 1801 1.1 mrg have a signed conversion, and have to add extra fixup code. */ 1802 1.1 mrg else if (shift == W_TYPE_SIZE - 1) 1803 1.1 mrg e = Wtype_MAXp1_F / 2; 1804 1.1 mrg else 1805 1.1 mrg e = (Wtype)1 << shift; 1806 1.1 mrg return f * e; 1807 1.1 mrg #endif 1808 1.1 mrg } 1809 1.1 mrg #endif 1810 1.1 mrg 1811 1.1 mrg #if defined(L_fixunsxfsi) && LIBGCC2_HAS_XF_MODE 1812 1.1 mrg UWtype 1813 1.1 mrg __fixunsxfSI (XFtype a) 1814 1.1 mrg { 1815 1.1 mrg if (a >= - (DFtype) Wtype_MIN) 1816 1.1 mrg return (Wtype) (a + Wtype_MIN) - Wtype_MIN; 1817 1.1 mrg return (Wtype) a; 1818 1.1 mrg } 1819 1.1 mrg #endif 1820 1.1 mrg 1821 1.1 mrg #if defined(L_fixunsdfsi) && LIBGCC2_HAS_DF_MODE 1822 1.1 mrg UWtype 1823 1.1 mrg __fixunsdfSI (DFtype a) 1824 1.1 mrg { 1825 1.1 mrg if (a >= - (DFtype) Wtype_MIN) 1826 1.1 mrg return (Wtype) (a + Wtype_MIN) - Wtype_MIN; 1827 1.1 mrg return (Wtype) a; 1828 1.1 mrg } 1829 1.1 mrg #endif 1830 1.1 mrg 1831 1.1 mrg #if defined(L_fixunssfsi) && LIBGCC2_HAS_SF_MODE 1832 1.1 mrg UWtype 1833 1.1 mrg __fixunssfSI (SFtype a) 1834 1.1 mrg { 1835 1.1 mrg if (a >= - (SFtype) Wtype_MIN) 1836 1.1 mrg return (Wtype) (a + Wtype_MIN) - Wtype_MIN; 1837 1.12 mrg return (Wtype) a; 1838 1.1 mrg } 1839 1.1 mrg #endif 1840 1.1 mrg 1841 1.1 mrg /* Integer power helper used from __builtin_powi for non-constant 1843 1.1 mrg exponents. */ 1844 1.1 mrg 1845 1.1 mrg #if (defined(L_powisf2) && LIBGCC2_HAS_SF_MODE) \ 1846 1.1 mrg || (defined(L_powidf2) && LIBGCC2_HAS_DF_MODE) \ 1847 1.1 mrg || (defined(L_powixf2) && LIBGCC2_HAS_XF_MODE) \ 1848 1.1 mrg || (defined(L_powitf2) && LIBGCC2_HAS_TF_MODE) 1849 1.1 mrg # if defined(L_powisf2) 1850 1.8 mrg # define TYPE SFtype 1851 1.8 mrg # define NAME __powisf2 1852 1.1 mrg # elif defined(L_powidf2) 1853 1.1 mrg # define TYPE DFtype 1854 1.1 mrg # define NAME __powidf2 1855 1.1 mrg # elif defined(L_powixf2) 1856 1.1 mrg # define TYPE XFtype 1857 1.1 mrg # define NAME __powixf2 1858 1.1 mrg # elif defined(L_powitf2) 1859 1.1 mrg # define TYPE TFtype 1860 1.8 mrg # define NAME __powitf2 1861 1.8 mrg # endif 1862 1.8 mrg 1863 1.12 mrg #undef int 1864 1.8 mrg #undef unsigned 1865 1.8 mrg TYPE 1866 1.8 mrg NAME (TYPE x, int m) 1867 1.8 mrg { 1868 1.1 mrg unsigned int n = m < 0 ? -(unsigned int) m : (unsigned int) m; 1869 1.1 mrg TYPE y = n % 2 ? x : 1; 1870 1.12 mrg while (n >>= 1) 1871 1.1 mrg { 1872 1.3 mrg x = x * x; 1873 1.4 mrg if (n % 2) 1874 1.12 mrg y = y * x; 1875 1.12 mrg } 1876 1.12 mrg return m < 0 ? 1/y : y; 1877 1.12 mrg } 1878 1.12 mrg 1879 1.1 mrg #endif 1880 1.1 mrg 1881 1.1 mrg #if((defined(L_mulhc3) || defined(L_divhc3)) && LIBGCC2_HAS_HF_MODE) \ 1883 1.3 mrg || ((defined(L_mulsc3) || defined(L_divsc3)) && LIBGCC2_HAS_SF_MODE) \ 1884 1.4 mrg || ((defined(L_muldc3) || defined(L_divdc3)) && LIBGCC2_HAS_DF_MODE) \ 1885 1.12 mrg || ((defined(L_mulxc3) || defined(L_divxc3)) && LIBGCC2_HAS_XF_MODE) \ 1886 1.12 mrg || ((defined(L_multc3) || defined(L_divtc3)) && LIBGCC2_HAS_TF_MODE) 1887 1.12 mrg 1888 1.12 mrg #undef float 1889 1.12 mrg #undef double 1890 1.1 mrg #undef long 1891 1.1 mrg 1892 1.1 mrg #if defined(L_mulhc3) || defined(L_divhc3) 1893 1.1 mrg # define MTYPE HFtype 1894 1.3 mrg # define CTYPE HCtype 1895 1.4 mrg # define AMTYPE SFtype 1896 1.12 mrg # define MODE hc 1897 1.12 mrg # define CEXT __LIBGCC_HF_FUNC_EXT__ 1898 1.12 mrg # define NOTRUNC (!__LIBGCC_HF_EXCESS_PRECISION__) 1899 1.12 mrg #elif defined(L_mulsc3) || defined(L_divsc3) 1900 1.12 mrg # define MTYPE SFtype 1901 1.1 mrg # define CTYPE SCtype 1902 1.1 mrg # define AMTYPE DFtype 1903 1.1 mrg # define MODE sc 1904 1.1 mrg # define CEXT __LIBGCC_SF_FUNC_EXT__ 1905 1.3 mrg # define NOTRUNC (!__LIBGCC_SF_EXCESS_PRECISION__) 1906 1.4 mrg # define RBIG (__LIBGCC_SF_MAX__ / 2) 1907 1.12 mrg # define RMIN (__LIBGCC_SF_MIN__) 1908 1.12 mrg # define RMIN2 (__LIBGCC_SF_EPSILON__) 1909 1.12 mrg # define RMINSCAL (1 / __LIBGCC_SF_EPSILON__) 1910 1.12 mrg # define RMAX2 (RBIG * RMIN2) 1911 1.12 mrg #elif defined(L_muldc3) || defined(L_divdc3) 1912 1.12 mrg # define MTYPE DFtype 1913 1.12 mrg # define CTYPE DCtype 1914 1.12 mrg # define MODE dc 1915 1.12 mrg # define CEXT __LIBGCC_DF_FUNC_EXT__ 1916 1.12 mrg # define NOTRUNC (!__LIBGCC_DF_EXCESS_PRECISION__) 1917 1.12 mrg # define RBIG (__LIBGCC_DF_MAX__ / 2) 1918 1.12 mrg # define RMIN (__LIBGCC_DF_MIN__) 1919 1.1 mrg # define RMIN2 (__LIBGCC_DF_EPSILON__) 1920 1.1 mrg # define RMINSCAL (1 / __LIBGCC_DF_EPSILON__) 1921 1.1 mrg # define RMAX2 (RBIG * RMIN2) 1922 1.1 mrg #elif defined(L_mulxc3) || defined(L_divxc3) 1923 1.1 mrg # define MTYPE XFtype 1924 1.1 mrg # define CTYPE XCtype 1925 1.1 mrg # define MODE xc 1926 1.1 mrg # define CEXT __LIBGCC_XF_FUNC_EXT__ 1927 1.1 mrg # define NOTRUNC (!__LIBGCC_XF_EXCESS_PRECISION__) 1928 1.1 mrg # define RBIG (__LIBGCC_XF_MAX__ / 2) 1929 1.10 mrg # define RMIN (__LIBGCC_XF_MIN__) 1930 1.10 mrg # define RMIN2 (__LIBGCC_XF_EPSILON__) 1931 1.10 mrg # define RMINSCAL (1 / __LIBGCC_XF_EPSILON__) 1932 1.1 mrg # define RMAX2 (RBIG * RMIN2) 1933 1.1 mrg #elif defined(L_multc3) || defined(L_divtc3) 1934 1.1 mrg # define MTYPE TFtype 1935 1.1 mrg # define CTYPE TCtype 1936 1.1 mrg # define MODE tc 1937 1.1 mrg # define CEXT __LIBGCC_TF_FUNC_EXT__ 1938 1.1 mrg # define NOTRUNC (!__LIBGCC_TF_EXCESS_PRECISION__) 1939 1.1 mrg # if __LIBGCC_TF_MANT_DIG__ == 106 1940 1.1 mrg # define RBIG (__LIBGCC_DF_MAX__ / 2) 1941 1.1 mrg # define RMIN (__LIBGCC_DF_MIN__) 1942 1.1 mrg # define RMIN2 (__LIBGCC_DF_EPSILON__) 1943 1.1 mrg # define RMINSCAL (1 / __LIBGCC_DF_EPSILON__) 1944 1.1 mrg # else 1945 1.1 mrg # define RBIG (__LIBGCC_TF_MAX__ / 2) 1946 1.1 mrg # define RMIN (__LIBGCC_TF_MIN__) 1947 1.1 mrg # define RMIN2 (__LIBGCC_TF_EPSILON__) 1948 1.1 mrg # define RMINSCAL (1 / __LIBGCC_TF_EPSILON__) 1949 1.1 mrg # endif 1950 1.8 mrg # define RMAX2 (RBIG * RMIN2) 1951 1.1 mrg #else 1952 1.1 mrg # error 1953 1.1 mrg #endif 1954 1.1 mrg 1955 1.1 mrg #define CONCAT3(A,B,C) _CONCAT3(A,B,C) 1956 1.1 mrg #define _CONCAT3(A,B,C) A##B##C 1957 1.1 mrg 1958 1.1 mrg #define CONCAT2(A,B) _CONCAT2(A,B) 1959 1.1 mrg #define _CONCAT2(A,B) A##B 1960 1.1 mrg 1961 1.1 mrg #define isnan(x) __builtin_isnan (x) 1962 1.1 mrg #define isfinite(x) __builtin_isfinite (x) 1963 1.1 mrg #define isinf(x) __builtin_isinf (x) 1964 1.1 mrg 1965 1.1 mrg #define INFINITY CONCAT2(__builtin_huge_val, CEXT) () 1966 1.1 mrg #define I 1i 1967 1.1 mrg 1968 1.1 mrg /* Helpers to make the following code slightly less gross. */ 1969 1.1 mrg #define COPYSIGN CONCAT2(__builtin_copysign, CEXT) 1970 1.1 mrg #define FABS CONCAT2(__builtin_fabs, CEXT) 1971 1.1 mrg 1972 1.1 mrg /* Verify that MTYPE matches up with CEXT. */ 1973 1.1 mrg extern void *compile_type_assert[sizeof(INFINITY) == sizeof(MTYPE) ? 1 : -1]; 1974 1.1 mrg 1975 1.1 mrg /* Ensure that we've lost any extra precision. */ 1976 1.1 mrg #if NOTRUNC 1977 1.1 mrg # define TRUNC(x) 1978 1.1 mrg #else 1979 1.1 mrg # define TRUNC(x) __asm__ ("" : "=m"(x) : "m"(x)) 1980 1.1 mrg #endif 1981 1.1 mrg 1982 1.1 mrg #if defined(L_mulhc3) || defined(L_mulsc3) || defined(L_muldc3) \ 1983 1.1 mrg || defined(L_mulxc3) || defined(L_multc3) 1984 1.1 mrg 1985 1.1 mrg CTYPE 1986 1.1 mrg CONCAT3(__mul,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d) 1987 1.1 mrg { 1988 1.1 mrg MTYPE ac, bd, ad, bc, x, y; 1989 1.1 mrg CTYPE res; 1990 1.1 mrg 1991 1.1 mrg ac = a * c; 1992 1.1 mrg bd = b * d; 1993 1.1 mrg ad = a * d; 1994 1.1 mrg bc = b * c; 1995 1.1 mrg 1996 1.1 mrg TRUNC (ac); 1997 1.1 mrg TRUNC (bd); 1998 1.1 mrg TRUNC (ad); 1999 1.1 mrg TRUNC (bc); 2000 1.1 mrg 2001 1.1 mrg x = ac - bd; 2002 1.1 mrg y = ad + bc; 2003 1.1 mrg 2004 1.1 mrg if (isnan (x) && isnan (y)) 2005 1.1 mrg { 2006 1.1 mrg /* Recover infinities that computed as NaN + iNaN. */ 2007 1.1 mrg _Bool recalc = 0; 2008 1.1 mrg if (isinf (a) || isinf (b)) 2009 1.1 mrg { 2010 1.1 mrg /* z is infinite. "Box" the infinity and change NaNs in 2011 1.1 mrg the other factor to 0. */ 2012 1.1 mrg a = COPYSIGN (isinf (a) ? 1 : 0, a); 2013 1.1 mrg b = COPYSIGN (isinf (b) ? 1 : 0, b); 2014 1.1 mrg if (isnan (c)) c = COPYSIGN (0, c); 2015 1.1 mrg if (isnan (d)) d = COPYSIGN (0, d); 2016 1.1 mrg recalc = 1; 2017 1.1 mrg } 2018 1.1 mrg if (isinf (c) || isinf (d)) 2019 1.1 mrg { 2020 1.8 mrg /* w is infinite. "Box" the infinity and change NaNs in 2021 1.1 mrg the other factor to 0. */ 2022 1.1 mrg c = COPYSIGN (isinf (c) ? 1 : 0, c); 2023 1.1 mrg d = COPYSIGN (isinf (d) ? 1 : 0, d); 2024 1.1 mrg if (isnan (a)) a = COPYSIGN (0, a); 2025 1.1 mrg if (isnan (b)) b = COPYSIGN (0, b); 2026 1.12 mrg recalc = 1; 2027 1.12 mrg } 2028 1.12 mrg if (!recalc 2029 1.12 mrg && (isinf (ac) || isinf (bd) 2030 1.12 mrg || isinf (ad) || isinf (bc))) 2031 1.12 mrg { 2032 1.12 mrg /* Recover infinities from overflow by changing NaNs to 0. */ 2033 1.12 mrg if (isnan (a)) a = COPYSIGN (0, a); 2034 1.12 mrg if (isnan (b)) b = COPYSIGN (0, b); 2035 1.12 mrg if (isnan (c)) c = COPYSIGN (0, c); 2036 1.12 mrg if (isnan (d)) d = COPYSIGN (0, d); 2037 1.12 mrg recalc = 1; 2038 1.12 mrg } 2039 1.12 mrg if (recalc) 2040 1.12 mrg { 2041 1.12 mrg x = INFINITY * (a * c - b * d); 2042 1.12 mrg y = INFINITY * (a * d + b * c); 2043 1.12 mrg } 2044 1.12 mrg } 2045 1.12 mrg 2046 1.12 mrg __real__ res = x; 2047 1.12 mrg __imag__ res = y; 2048 1.12 mrg return res; 2049 1.12 mrg } 2050 1.1 mrg #endif /* complex multiply */ 2051 1.1 mrg 2052 1.1 mrg #if defined(L_divhc3) || defined(L_divsc3) || defined(L_divdc3) \ 2053 1.12 mrg || defined(L_divxc3) || defined(L_divtc3) 2054 1.12 mrg 2055 1.12 mrg CTYPE 2056 1.12 mrg CONCAT3(__div,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d) 2057 1.12 mrg { 2058 1.12 mrg #if defined(L_divhc3) \ 2059 1.12 mrg || (defined(L_divsc3) && defined(__LIBGCC_HAVE_HWDBL__) ) 2060 1.1 mrg 2061 1.1 mrg /* Half precision is handled with float precision. 2062 1.12 mrg float is handled with double precision when double precision 2063 1.12 mrg hardware is available. 2064 1.12 mrg Due to the additional precision, the simple complex divide 2065 1.12 mrg method (without Smith's method) is sufficient to get accurate 2066 1.12 mrg answers and runs slightly faster than Smith's method. */ 2067 1.12 mrg 2068 1.12 mrg AMTYPE aa, bb, cc, dd; 2069 1.12 mrg AMTYPE denom; 2070 1.12 mrg MTYPE x, y; 2071 1.12 mrg CTYPE res; 2072 1.12 mrg aa = a; 2073 1.12 mrg bb = b; 2074 1.12 mrg cc = c; 2075 1.12 mrg dd = d; 2076 1.12 mrg 2077 1.12 mrg denom = (cc * cc) + (dd * dd); 2078 1.12 mrg x = ((aa * cc) + (bb * dd)) / denom; 2079 1.12 mrg y = ((bb * cc) - (aa * dd)) / denom; 2080 1.12 mrg 2081 1.12 mrg #else 2082 1.12 mrg MTYPE denom, ratio, x, y; 2083 1.12 mrg CTYPE res; 2084 1.12 mrg 2085 1.12 mrg /* double, extended, long double have significant potential 2086 1.12 mrg underflow/overflow errors that can be greatly reduced with 2087 1.12 mrg a limited number of tests and adjustments. float is handled 2088 1.12 mrg the same way when no HW double is available. 2089 1.12 mrg */ 2090 1.12 mrg 2091 1.12 mrg /* Scale by max(c,d) to reduce chances of denominator overflowing. */ 2092 1.1 mrg if (FABS (c) < FABS (d)) 2093 1.1 mrg { 2094 1.12 mrg /* Prevent underflow when denominator is near max representable. */ 2095 1.12 mrg if (FABS (d) >= RBIG) 2096 1.12 mrg { 2097 1.12 mrg a = a / 2; 2098 1.12 mrg b = b / 2; 2099 1.12 mrg c = c / 2; 2100 1.12 mrg d = d / 2; 2101 1.12 mrg } 2102 1.12 mrg /* Avoid overflow/underflow issues when c and d are small. 2103 1.12 mrg Scaling up helps avoid some underflows. 2104 1.12 mrg No new overflow possible since c&d < RMIN2. */ 2105 1.1 mrg if (FABS (d) < RMIN2) 2106 1.1 mrg { 2107 1.1 mrg a = a * RMINSCAL; 2108 1.12 mrg b = b * RMINSCAL; 2109 1.12 mrg c = c * RMINSCAL; 2110 1.12 mrg d = d * RMINSCAL; 2111 1.12 mrg } 2112 1.12 mrg else 2113 1.12 mrg { 2114 1.12 mrg if (((FABS (a) < RMIN) && (FABS (b) < RMAX2) && (FABS (d) < RMAX2)) 2115 1.12 mrg || ((FABS (b) < RMIN) && (FABS (a) < RMAX2) 2116 1.12 mrg && (FABS (d) < RMAX2))) 2117 1.12 mrg { 2118 1.12 mrg a = a * RMINSCAL; 2119 1.12 mrg b = b * RMINSCAL; 2120 1.12 mrg c = c * RMINSCAL; 2121 1.12 mrg d = d * RMINSCAL; 2122 1.12 mrg } 2123 1.12 mrg } 2124 1.12 mrg ratio = c / d; 2125 1.12 mrg denom = (c * ratio) + d; 2126 1.12 mrg /* Choose alternate order of computation if ratio is subnormal. */ 2127 1.12 mrg if (FABS (ratio) > RMIN) 2128 1.12 mrg { 2129 1.12 mrg x = ((a * ratio) + b) / denom; 2130 1.12 mrg y = ((b * ratio) - a) / denom; 2131 1.12 mrg } 2132 1.12 mrg else 2133 1.12 mrg { 2134 1.12 mrg x = ((c * (a / d)) + b) / denom; 2135 1.12 mrg y = ((c * (b / d)) - a) / denom; 2136 1.12 mrg } 2137 1.12 mrg } 2138 1.1 mrg else 2139 1.1 mrg { 2140 1.12 mrg /* Prevent underflow when denominator is near max representable. */ 2141 1.12 mrg if (FABS (c) >= RBIG) 2142 1.12 mrg { 2143 1.12 mrg a = a / 2; 2144 1.12 mrg b = b / 2; 2145 1.12 mrg c = c / 2; 2146 1.12 mrg d = d / 2; 2147 1.12 mrg } 2148 1.12 mrg /* Avoid overflow/underflow issues when both c and d are small. 2149 1.12 mrg Scaling up helps avoid some underflows. 2150 1.12 mrg No new overflow possible since both c&d are less than RMIN2. */ 2151 1.1 mrg if (FABS (c) < RMIN2) 2152 1.12 mrg { 2153 1.1 mrg a = a * RMINSCAL; 2154 1.12 mrg b = b * RMINSCAL; 2155 1.12 mrg c = c * RMINSCAL; 2156 1.1 mrg d = d * RMINSCAL; 2157 1.1 mrg } 2158 1.1 mrg else 2159 1.1 mrg { 2160 1.1 mrg if (((FABS (a) < RMIN) && (FABS (b) < RMAX2) && (FABS (c) < RMAX2)) 2161 1.1 mrg || ((FABS (b) < RMIN) && (FABS (a) < RMAX2) 2162 1.1 mrg && (FABS (c) < RMAX2))) 2163 1.1 mrg { 2164 1.1 mrg a = a * RMINSCAL; 2165 1.1 mrg b = b * RMINSCAL; 2166 1.1 mrg c = c * RMINSCAL; 2167 1.1 mrg d = d * RMINSCAL; 2168 1.1 mrg } 2169 1.1 mrg } 2170 1.1 mrg ratio = d / c; 2171 1.1 mrg denom = (d * ratio) + c; 2172 1.1 mrg /* Choose alternate order of computation if ratio is subnormal. */ 2173 1.1 mrg if (FABS (ratio) > RMIN) 2174 1.1 mrg { 2175 1.1 mrg x = ((b * ratio) + a) / denom; 2176 1.1 mrg y = (b - (a * ratio)) / denom; 2177 1.1 mrg } 2178 1.1 mrg else 2179 1.1 mrg { 2180 1.1 mrg x = (a + (d * (b / c))) / denom; 2181 1.1 mrg y = (b - (d * (a / c))) / denom; 2182 1.1 mrg } 2183 1.1 mrg } 2184 1.1 mrg #endif 2185 1.1 mrg 2186 1.1 mrg /* Recover infinities and zeros that computed as NaN+iNaN; the only 2187 1.1 mrg cases are nonzero/zero, infinite/finite, and finite/infinite. */ 2188 1.1 mrg if (isnan (x) && isnan (y)) 2189 1.1 mrg { 2190 1.1 mrg if (c == 0.0 && d == 0.0 && (!isnan (a) || !isnan (b))) 2191 1.1 mrg { 2192 1.1 mrg x = COPYSIGN (INFINITY, c) * a; 2193 1.1 mrg y = COPYSIGN (INFINITY, c) * b; 2194 1.1 mrg } 2195 1.1 mrg else if ((isinf (a) || isinf (b)) && isfinite (c) && isfinite (d)) 2196 1.1 mrg { 2197 1.1 mrg a = COPYSIGN (isinf (a) ? 1 : 0, a); 2198 1.1 mrg b = COPYSIGN (isinf (b) ? 1 : 0, b); 2199 1.1 mrg x = INFINITY * (a * c + b * d); 2200 1.1 mrg y = INFINITY * (b * c - a * d); 2201 1.1 mrg } 2202 1.1 mrg else if ((isinf (c) || isinf (d)) && isfinite (a) && isfinite (b)) 2203 1.1 mrg { 2204 1.1 mrg c = COPYSIGN (isinf (c) ? 1 : 0, c); 2205 1.1 mrg d = COPYSIGN (isinf (d) ? 1 : 0, d); 2206 1.1 mrg x = 0.0 * (a * c + b * d); 2207 1.1 mrg y = 0.0 * (b * c - a * d); 2208 1.1 mrg } 2209 1.1 mrg } 2210 1.1 mrg 2211 1.1 mrg __real__ res = x; 2212 1.1 mrg __imag__ res = y; 2213 1.1 mrg return res; 2214 1.1 mrg } 2215 1.1 mrg #endif /* complex divide */ 2216 1.1 mrg 2217 1.1 mrg #endif /* all complex float routines */ 2218 1.1 mrg 2219 1.1 mrg /* From here on down, the routines use normal data types. */ 2221 1.1 mrg 2222 1.1 mrg #define SItype bogus_type 2223 1.1 mrg #define USItype bogus_type 2224 1.1 mrg #define DItype bogus_type 2225 1.1 mrg #define UDItype bogus_type 2226 1.1 mrg #define SFtype bogus_type 2227 1.1 mrg #define DFtype bogus_type 2228 1.1 mrg #undef Wtype 2229 1.1 mrg #undef UWtype 2230 1.1 mrg #undef HWtype 2231 1.1 mrg #undef UHWtype 2232 1.1 mrg #undef DWtype 2233 1.1 mrg #undef UDWtype 2234 1.1 mrg 2235 1.1 mrg #undef char 2236 1.1 mrg #undef short 2237 1.1 mrg #undef int 2238 1.1 mrg #undef long 2239 1.1 mrg #undef unsigned 2240 1.1 mrg #undef float 2241 1.1 mrg #undef double 2242 1.1 mrg 2243 1.1 mrg #ifdef L__gcc_bcmp 2245 1.1 mrg 2246 1.1 mrg /* Like bcmp except the sign is meaningful. 2247 1.1 mrg Result is negative if S1 is less than S2, 2248 1.1 mrg positive if S1 is greater, 0 if S1 and S2 are equal. */ 2249 1.1 mrg 2250 1.1 mrg int 2251 1.1 mrg __gcc_bcmp (const unsigned char *s1, const unsigned char *s2, size_t size) 2252 1.1 mrg { 2253 1.1 mrg while (size > 0) 2254 1.1 mrg { 2255 1.1 mrg const unsigned char c1 = *s1++, c2 = *s2++; 2256 1.1 mrg if (c1 != c2) 2257 1.1 mrg return c1 - c2; 2258 1.10 mrg size--; 2259 1.10 mrg } 2260 1.1 mrg return 0; 2261 1.1 mrg } 2262 1.10 mrg 2263 1.10 mrg #endif 2264 1.10 mrg 2265 1.10 mrg /* __eprintf used to be used by GCC's private version of <assert.h>. 2267 1.1 mrg We no longer provide that header, but this routine remains in libgcc.a 2268 1.1 mrg for binary backward compatibility. Note that it is not included in 2269 1.1 mrg the shared version of libgcc. */ 2270 1.1 mrg #ifdef L_eprintf 2271 1.1 mrg #ifndef inhibit_libc 2272 1.1 mrg 2273 1.1 mrg #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */ 2274 1.1 mrg #include <stdio.h> 2275 1.1 mrg 2276 1.1 mrg void 2277 1.1 mrg __eprintf (const char *string, const char *expression, 2278 1.1 mrg unsigned int line, const char *filename) 2279 1.1 mrg { 2280 1.1 mrg fprintf (stderr, string, expression, line, filename); 2281 1.1 mrg fflush (stderr); 2282 1.1 mrg abort (); 2283 1.1 mrg } 2284 1.1 mrg 2285 1.1 mrg #endif 2286 1.1 mrg #endif 2287 1.1 mrg 2288 1.1 mrg 2289 1.1 mrg #ifdef L_clear_cache 2291 1.1 mrg /* Clear part of an instruction cache. */ 2292 1.1 mrg 2293 1.1 mrg void 2294 1.1 mrg __clear_cache (void *beg __attribute__((__unused__)), 2295 1.1 mrg void *end __attribute__((__unused__))) 2296 1.1 mrg { 2297 1.1 mrg #ifdef CLEAR_INSN_CACHE 2298 1.1 mrg /* Cast the void* pointers to char* as some implementations 2299 1.1 mrg of the macro assume the pointers can be subtracted from 2300 1.1 mrg one another. */ 2301 1.1 mrg CLEAR_INSN_CACHE ((char *) beg, (char *) end); 2302 1.1 mrg #endif /* CLEAR_INSN_CACHE */ 2303 1.1 mrg } 2304 1.1 mrg 2305 1.1 mrg #endif /* L_clear_cache */ 2306 1.1 mrg 2307 1.1 mrg #ifdef L_trampoline 2309 1.1 mrg 2310 1.1 mrg /* Jump to a trampoline, loading the static chain address. */ 2311 1.1 mrg 2312 1.1 mrg #if defined(WINNT) && ! defined(__CYGWIN__) 2313 1.1 mrg #include <windows.h> 2314 1.1 mrg int getpagesize (void); 2315 1.1 mrg int mprotect (char *,int, int); 2316 1.1 mrg 2317 1.1 mrg int 2318 1.1 mrg getpagesize (void) 2319 1.1 mrg { 2320 1.1 mrg #ifdef _ALPHA_ 2321 1.1 mrg return 8192; 2322 1.1 mrg #else 2323 1.1 mrg return 4096; 2324 1.1 mrg #endif 2325 1.1 mrg } 2326 1.1 mrg 2327 1.1 mrg int 2328 1.1 mrg mprotect (char *addr, int len, int prot) 2329 1.1 mrg { 2330 1.1 mrg DWORD np, op; 2331 1.1 mrg 2332 1.1 mrg if (prot == 7) 2333 1.1 mrg np = 0x40; 2334 1.1 mrg else if (prot == 5) 2335 1.1 mrg np = 0x20; 2336 1.1 mrg else if (prot == 4) 2337 1.3 mrg np = 0x10; 2338 1.3 mrg else if (prot == 3) 2339 1.1 mrg np = 0x04; 2340 1.1 mrg else if (prot == 1) 2341 1.1 mrg np = 0x02; 2342 1.1 mrg else if (prot == 0) 2343 1.1 mrg np = 0x01; 2344 1.1 mrg else 2345 1.1 mrg return -1; 2346 1.3 mrg 2347 1.3 mrg if (VirtualProtect (addr, len, np, &op)) 2348 1.3 mrg return 0; 2349 1.3 mrg else 2350 1.3 mrg return -1; 2351 1.3 mrg } 2352 1.1 mrg 2353 1.3 mrg #endif /* WINNT && ! __CYGWIN__ */ 2354 1.1 mrg 2355 1.1 mrg #ifdef TRANSFER_FROM_TRAMPOLINE 2356 1.1 mrg TRANSFER_FROM_TRAMPOLINE 2357 1.1 mrg #endif 2358 1.1 mrg #endif /* L_trampoline */ 2359 1.1 mrg 2360 1.1 mrg #ifndef __CYGWIN__ 2362 1.1 mrg #ifdef L__main 2363 1.1 mrg 2364 1.1 mrg #include "gbl-ctors.h" 2365 1.1 mrg 2366 1.1 mrg /* Some systems use __main in a way incompatible with its use in gcc, in these 2367 1.1 mrg cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to 2368 1.1 mrg give the same symbol without quotes for an alternative entry point. You 2369 1.1 mrg must define both, or neither. */ 2370 1.1 mrg #ifndef NAME__MAIN 2371 1.1 mrg #define NAME__MAIN "__main" 2372 1.1 mrg #define SYMBOL__MAIN __main 2373 1.3 mrg #endif 2374 1.1 mrg 2375 1.1 mrg #if defined (__LIBGCC_INIT_SECTION_ASM_OP__) \ 2376 1.1 mrg || defined (__LIBGCC_INIT_ARRAY_SECTION_ASM_OP__) 2377 1.1 mrg #undef HAS_INIT_SECTION 2378 1.1 mrg #define HAS_INIT_SECTION 2379 1.1 mrg #endif 2380 1.1 mrg 2381 1.1 mrg #if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF) 2382 1.1 mrg 2383 1.1 mrg /* Some ELF crosses use crtstuff.c to provide __CTOR_LIST__, but use this 2384 1.1 mrg code to run constructors. In that case, we need to handle EH here, too. 2385 1.1 mrg But MINGW32 is special because it handles CRTSTUFF and EH on its own. */ 2386 1.1 mrg 2387 1.1 mrg #ifdef __MINGW32__ 2388 1.1 mrg #undef __LIBGCC_EH_FRAME_SECTION_NAME__ 2389 1.1 mrg #endif 2390 1.1 mrg 2391 1.1 mrg #ifdef __LIBGCC_EH_FRAME_SECTION_NAME__ 2392 1.3 mrg #include "unwind-dw2-fde.h" 2393 1.1 mrg extern unsigned char __EH_FRAME_BEGIN__[]; 2394 1.1 mrg #endif 2395 1.1 mrg 2396 1.1 mrg /* Run all the global destructors on exit from the program. */ 2397 1.1 mrg 2398 1.1 mrg void 2399 1.1 mrg __do_global_dtors (void) 2400 1.1 mrg { 2401 1.1 mrg #ifdef DO_GLOBAL_DTORS_BODY 2402 1.1 mrg DO_GLOBAL_DTORS_BODY; 2403 1.1 mrg #else 2404 1.1 mrg static func_ptr *p = __DTOR_LIST__ + 1; 2405 1.1 mrg while (*p) 2406 1.1 mrg { 2407 1.1 mrg p++; 2408 1.1 mrg (*(p-1)) (); 2409 1.1 mrg } 2410 1.1 mrg #endif 2411 1.1 mrg #if defined (__LIBGCC_EH_FRAME_SECTION_NAME__) && !defined (HAS_INIT_SECTION) 2412 1.1 mrg { 2413 1.1 mrg static int completed = 0; 2414 1.1 mrg if (! completed) 2415 1.1 mrg { 2416 1.1 mrg completed = 1; 2417 1.1 mrg __deregister_frame_info (__EH_FRAME_BEGIN__); 2418 1.1 mrg } 2419 1.1 mrg } 2420 1.1 mrg #endif 2421 1.1 mrg } 2422 1.1 mrg #endif 2423 1.1 mrg 2424 1.1 mrg #ifndef HAS_INIT_SECTION 2425 1.1 mrg /* Run all the global constructors on entry to the program. */ 2426 1.1 mrg 2427 1.1 mrg void 2428 1.1 mrg __do_global_ctors (void) 2429 1.1 mrg { 2430 1.1 mrg #ifdef __LIBGCC_EH_FRAME_SECTION_NAME__ 2431 1.1 mrg { 2432 1.1 mrg static struct object object; 2433 1.1 mrg __register_frame_info (__EH_FRAME_BEGIN__, &object); 2434 1.1 mrg } 2435 1.1 mrg #endif 2436 1.1 mrg DO_GLOBAL_CTORS_BODY; 2437 1.1 mrg atexit (__do_global_dtors); 2438 1.1 mrg } 2439 1.1 mrg #endif /* no HAS_INIT_SECTION */ 2440 1.1 mrg 2441 1.1 mrg #if !defined (HAS_INIT_SECTION) || defined (INVOKE__main) 2442 1.1 mrg /* Subroutine called automatically by `main'. 2443 1.1 mrg Compiling a global function named `main' 2444 1.1 mrg produces an automatic call to this function at the beginning. 2445 1.1 mrg 2446 1.8 mrg For many systems, this routine calls __do_global_ctors. 2447 1.1 mrg For systems which support a .init section we use the .init section 2448 1.1 mrg to run __do_global_ctors, so we need not do anything here. */ 2449 1.1 mrg 2450 1.1 mrg extern void SYMBOL__MAIN (void); 2451 1.1 mrg void 2452 1.1 mrg SYMBOL__MAIN (void) 2453 1.1 mrg { 2454 1.8 mrg /* Support recursive calls to `main': run initializers just once. */ 2455 1.1 mrg static int initialized; 2456 1.1 mrg if (! initialized) 2457 { 2458 initialized = 1; 2459 __do_global_ctors (); 2460 } 2461 } 2462 #endif /* no HAS_INIT_SECTION or INVOKE__main */ 2463 2464 #endif /* L__main */ 2465 #endif /* __CYGWIN__ */ 2466 2467 #ifdef L_ctors 2469 2470 #include "gbl-ctors.h" 2471 2472 /* Provide default definitions for the lists of constructors and 2473 destructors, so that we don't get linker errors. These symbols are 2474 intentionally bss symbols, so that gld and/or collect will provide 2475 the right values. */ 2476 2477 /* We declare the lists here with two elements each, 2478 so that they are valid empty lists if no other definition is loaded. 2479 2480 If we are using the old "set" extensions to have the gnu linker 2481 collect ctors and dtors, then we __CTOR_LIST__ and __DTOR_LIST__ 2482 must be in the bss/common section. 2483 2484 Long term no port should use those extensions. But many still do. */ 2485 #if !defined(__LIBGCC_INIT_SECTION_ASM_OP__) 2486 #if defined (TARGET_ASM_CONSTRUCTOR) || defined (USE_COLLECT2) 2487 func_ptr __CTOR_LIST__[2] = {0, 0}; 2488 func_ptr __DTOR_LIST__[2] = {0, 0}; 2489 #else 2490 func_ptr __CTOR_LIST__[2]; 2491 func_ptr __DTOR_LIST__[2]; 2492 #endif 2493 #endif /* no __LIBGCC_INIT_SECTION_ASM_OP__ */ 2494 #endif /* L_ctors */ 2495 #endif /* LIBGCC2_UNITS_PER_WORD <= MIN_UNITS_PER_WORD */ 2496