1// RUN: %clang_builtins %s %librt -o %t && %run %t 2// REQUIRES: int128 3//===-- fixunssfti_test.c - Test __fixunssfti -----------------------------===// 4// 5// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 6// See https://llvm.org/LICENSE.txt for license information. 7// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 8// 9//===----------------------------------------------------------------------===// 10// 11// This file tests __fixunssfti for the compiler_rt library. 12// 13//===----------------------------------------------------------------------===// 14 15#include "int_lib.h" 16#include <stdio.h> 17 18#ifdef CRT_HAS_128BIT 19 20// Returns: convert a to a unsigned long long, rounding toward zero. 21// Negative values all become zero. 22 23// Assumption: float is a IEEE 32 bit floating point type 24// tu_int is a 64 bit integral type 25// value in float is representable in tu_int or is negative 26// (no range checking performed) 27 28// seee eeee emmm mmmm mmmm mmmm mmmm mmmm 29 30COMPILER_RT_ABI tu_int __fixunssfti(float a); 31 32int test__fixunssfti(float a, tu_int expected) 33{ 34 tu_int x = __fixunssfti(a); 35 if (x != expected) 36 { 37 utwords xt; 38 xt.all = x; 39 utwords expectedt; 40 expectedt.all = expected; 41 printf("error in __fixunssfti(%A) = 0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n", 42 a, xt.s.high, xt.s.low, expectedt.s.high, expectedt.s.low); 43 } 44 return x != expected; 45} 46 47char assumption_1[sizeof(tu_int) == 2*sizeof(di_int)] = {0}; 48char assumption_2[sizeof(su_int)*CHAR_BIT == 32] = {0}; 49char assumption_3[sizeof(float)*CHAR_BIT == 32] = {0}; 50 51#endif 52 53int main() 54{ 55#ifdef CRT_HAS_128BIT 56 if (test__fixunssfti(0.0F, 0)) 57 return 1; 58 59 if (test__fixunssfti(0.5F, 0)) 60 return 1; 61 if (test__fixunssfti(0.99F, 0)) 62 return 1; 63 if (test__fixunssfti(1.0F, 1)) 64 return 1; 65 if (test__fixunssfti(1.5F, 1)) 66 return 1; 67 if (test__fixunssfti(1.99F, 1)) 68 return 1; 69 if (test__fixunssfti(2.0F, 2)) 70 return 1; 71 if (test__fixunssfti(2.01F, 2)) 72 return 1; 73 if (test__fixunssfti(-0.5F, 0)) 74 return 1; 75 if (test__fixunssfti(-0.99F, 0)) 76 return 1; 77#if !TARGET_LIBGCC 78 if (test__fixunssfti(-1.0F, 0)) // libgcc ignores "returns 0 for negative input" spec 79 return 1; 80 if (test__fixunssfti(-1.5F, 0)) 81 return 1; 82 if (test__fixunssfti(-1.99F, 0)) 83 return 1; 84 if (test__fixunssfti(-2.0F, 0)) 85 return 1; 86 if (test__fixunssfti(-2.01F, 0)) 87 return 1; 88#endif 89 90 if (test__fixunssfti(0x1.FFFFFEp+63F, 0xFFFFFF0000000000ULL)) 91 return 1; 92 if (test__fixunssfti(0x1.000000p+63F, 0x8000000000000000ULL)) 93 return 1; 94 if (test__fixunssfti(0x1.FFFFFEp+62F, 0x7FFFFF8000000000LL)) 95 return 1; 96 if (test__fixunssfti(0x1.FFFFFCp+62F, 0x7FFFFF0000000000LL)) 97 return 1; 98 99 if (test__fixunssfti(0x1.FFFFFEp+127F, make_ti(0xFFFFFF0000000000ULL, 0))) 100 return 1; 101 if (test__fixunssfti(0x1.000000p+127F, make_ti(0x8000000000000000ULL, 0))) 102 return 1; 103 if (test__fixunssfti(0x1.FFFFFEp+126F, make_ti(0x7FFFFF8000000000LL, 0))) 104 return 1; 105 if (test__fixunssfti(0x1.FFFFFCp+126F, make_ti(0x7FFFFF0000000000LL, 0))) 106 return 1; 107 108#if !TARGET_LIBGCC 109 if (test__fixunssfti(-0x1.FFFFFEp+62F, 0x0000000000000000LL)) 110 return 1; 111 if (test__fixunssfti(-0x1.FFFFFCp+62F, 0x0000000000000000LL)) 112 return 1; 113 if (test__fixunssfti(-0x1.FFFFFEp+126F, 0x0000000000000000LL)) 114 return 1; 115 if (test__fixunssfti(-0x1.FFFFFCp+126F, 0x0000000000000000LL)) 116 return 1; 117#endif 118 119#endif 120 return 0; 121} 122