1*3cab2bb3Spatrick //===--- lib/builtins/ppc/fixtfti.c - Convert long double->int128 *-C -*---===// 2*3cab2bb3Spatrick // 3*3cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*3cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 5*3cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*3cab2bb3Spatrick // 7*3cab2bb3Spatrick //===----------------------------------------------------------------------===// 8*3cab2bb3Spatrick // 9*3cab2bb3Spatrick // This file implements converting the 128bit IBM/PowerPC long double (double- 10*3cab2bb3Spatrick // double) data type to a signed 128 bit integer. 11*3cab2bb3Spatrick // 12*3cab2bb3Spatrick //===----------------------------------------------------------------------===// 13*3cab2bb3Spatrick 14*3cab2bb3Spatrick #include "../int_math.h" 15*3cab2bb3Spatrick 16*3cab2bb3Spatrick // Convert long double into a signed 128-bit integer. __fixtfti(long double input)17*3cab2bb3Spatrick__int128_t __fixtfti(long double input) { 18*3cab2bb3Spatrick 19*3cab2bb3Spatrick // If we are trying to convert a NaN, return the NaN bit pattern. 20*3cab2bb3Spatrick if (crt_isnan(input)) { 21*3cab2bb3Spatrick return ((__uint128_t)0x7FF8000000000000ll) << 64 | 22*3cab2bb3Spatrick (__uint128_t)0x0000000000000000ll; 23*3cab2bb3Spatrick } 24*3cab2bb3Spatrick 25*3cab2bb3Spatrick // Note: overflow is an undefined behavior for this conversion. 26*3cab2bb3Spatrick // For this reason, overflow is not checked here. 27*3cab2bb3Spatrick 28*3cab2bb3Spatrick // If the long double is negative, use unsigned conversion from its absolute 29*3cab2bb3Spatrick // value. 30*3cab2bb3Spatrick if (input < 0.0) { 31*3cab2bb3Spatrick __uint128_t result = (__uint128_t)(-input); 32*3cab2bb3Spatrick return -((__int128_t)result); 33*3cab2bb3Spatrick } 34*3cab2bb3Spatrick 35*3cab2bb3Spatrick // Otherwise, use unsigned conversion from the input value. 36*3cab2bb3Spatrick __uint128_t result = (__uint128_t)input; 37*3cab2bb3Spatrick return result; 38*3cab2bb3Spatrick } 39