1 | */* Round __float128 to integer away from zero.* |

2 | * Copyright (C) 1997-2017 Free Software Foundation, Inc.* |

3 | * This file is part of the GNU C Library.* |

4 | * Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997 and* |

5 | * Jakub Jelinek <jj@ultra.linux.cz>, 1999.* |

6 | |

7 | * The GNU C Library is free software; you can redistribute it and/or* |

8 | * modify it under the terms of the GNU Lesser General Public* |

9 | * License as published by the Free Software Foundation; either* |

10 | * version 2.1 of the License, or (at your option) any later version.* |

11 | |

12 | * The GNU C Library is distributed in the hope that it will be useful,* |

13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of* |

14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU* |

15 | * Lesser General Public License for more details.* |

16 | |

17 | * You should have received a copy of the GNU Lesser General Public* |

18 | * License along with the GNU C Library; if not, write to the Free* |

19 | * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA* |

20 | * 02111-1307 USA. */* |

21 | |

22 | __#include "quadmath-imp.h"__ |

23 | |

24 | **__float128** |

25 | roundq (**__float128** x) |

26 | { |

27 | int32_t j0; |

28 | uint64_t i1, i0; |

29 | |

30 | GET_FLT128_WORDS64 (i0, i1, x); |

31 | j0 = ((i0 >> `48`) & `0x7fff`) - `0x3fff`; |

32 | **if** (j0 < `48`) |

33 | { |

34 | **if** (j0 < `0`) |

35 | { |

36 | i0 &= `0x8000000000000000ULL`; |

37 | **if** (j0 == -`1`) |

38 | i0 |= `0x3fff000000000000LL`; |

39 | i1 = `0`; |

40 | } |

41 | **else** |

42 | { |

43 | uint64_t i = `0x0000ffffffffffffLL` >> j0; |

44 | **if** (((i0 & i) | i1) == `0`) |

45 | */* X is integral. */* |

46 | **return** x; |

47 | i0 += `0x0000800000000000LL` >> j0; |

48 | i0 &= ~i; |

49 | i1 = `0`; |

50 | } |

51 | } |

52 | **else** **if** (j0 > `111`) |

53 | { |

54 | **if** (j0 == `0x4000`) |

55 | */* Inf or NaN. */* |

56 | **return** x + x; |

57 | **else** |

58 | **return** x; |

59 | } |

60 | **else** |

61 | { |

62 | uint64_t i = -`1ULL` >> (j0 - `48`); |

63 | **if** ((i1 & i) == `0`) |

64 | */* X is integral. */* |

65 | **return** x; |

66 | |

67 | uint64_t j = i1 + (`1LL` << (`111` - j0)); |

68 | **if** (j < i1) |

69 | i0 += `1`; |

70 | i1 = j; |

71 | i1 &= ~i; |

72 | } |

73 | |

74 | SET_FLT128_WORDS64 (x, i0, i1); |

75 | **return** x; |

76 | } |

77 | |