11.1Sjoerg//===-- fixdfdi_test.c - Test __fixdfdi -----------------------------------===//
21.1Sjoerg//
31.1Sjoerg//                     The LLVM Compiler Infrastructure
41.1Sjoerg//
51.1Sjoerg// This file is dual licensed under the MIT and the University of Illinois Open
61.1Sjoerg// Source Licenses. See LICENSE.TXT for details.
71.1Sjoerg//
81.1Sjoerg//===----------------------------------------------------------------------===//
91.1Sjoerg//
101.1Sjoerg// This file tests __fixdfdi for the compiler_rt library.
111.1Sjoerg//
121.1Sjoerg//===----------------------------------------------------------------------===//
131.1Sjoerg
141.1Sjoerg#include "int_lib.h"
151.1Sjoerg#include <stdio.h>
161.1Sjoerg
171.1Sjoerg// Returns: convert a to a signed long long, rounding toward zero.
181.1Sjoerg
191.1Sjoerg// Assumption: double is a IEEE 64 bit floating point type
201.1Sjoerg//             su_int is a 32 bit integral type
211.1Sjoerg//             value in double is representable in di_int (no range checking performed)
221.1Sjoerg
231.1Sjoerg// seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm
241.1Sjoerg
251.1Sjoergdi_int __fixdfdi(double a);
261.1Sjoerg
271.1Sjoergint test__fixdfdi(double a, di_int expected)
281.1Sjoerg{
291.1Sjoerg    di_int x = __fixdfdi(a);
301.1Sjoerg    if (x != expected)
311.1Sjoerg        printf("error in __fixdfdi(%A) = %llX, expected %llX\n", a, x, expected);
321.1Sjoerg    return x != expected;
331.1Sjoerg}
341.1Sjoerg
351.1Sjoergchar assumption_1[sizeof(di_int) == 2*sizeof(si_int)] = {0};
361.1Sjoergchar assumption_2[sizeof(su_int)*CHAR_BIT == 32] = {0};
371.1Sjoergchar assumption_3[sizeof(double)*CHAR_BIT == 64] = {0};
381.1Sjoerg
391.1Sjoergint main()
401.1Sjoerg{
411.1Sjoerg    if (test__fixdfdi(0.0, 0))
421.1Sjoerg        return 1;
431.1Sjoerg
441.1Sjoerg    if (test__fixdfdi(0.5, 0))
451.1Sjoerg        return 1;
461.1Sjoerg    if (test__fixdfdi(0.99, 0))
471.1Sjoerg        return 1;
481.1Sjoerg    if (test__fixdfdi(1.0, 1))
491.1Sjoerg        return 1;
501.1Sjoerg    if (test__fixdfdi(1.5, 1))
511.1Sjoerg        return 1;
521.1Sjoerg    if (test__fixdfdi(1.99, 1))
531.1Sjoerg        return 1;
541.1Sjoerg    if (test__fixdfdi(2.0, 2))
551.1Sjoerg        return 1;
561.1Sjoerg    if (test__fixdfdi(2.01, 2))
571.1Sjoerg        return 1;
581.1Sjoerg    if (test__fixdfdi(-0.5, 0))
591.1Sjoerg        return 1;
601.1Sjoerg    if (test__fixdfdi(-0.99, 0))
611.1Sjoerg        return 1;
621.1Sjoerg    if (test__fixdfdi(-1.0, -1))
631.1Sjoerg        return 1;
641.1Sjoerg    if (test__fixdfdi(-1.5, -1))
651.1Sjoerg        return 1;
661.1Sjoerg    if (test__fixdfdi(-1.99, -1))
671.1Sjoerg        return 1;
681.1Sjoerg    if (test__fixdfdi(-2.0, -2))
691.1Sjoerg        return 1;
701.1Sjoerg    if (test__fixdfdi(-2.01, -2))
711.1Sjoerg        return 1;
721.1Sjoerg
731.1Sjoerg    if (test__fixdfdi(0x1.FFFFFEp+62, 0x7FFFFF8000000000LL))
741.1Sjoerg        return 1;
751.1Sjoerg    if (test__fixdfdi(0x1.FFFFFCp+62, 0x7FFFFF0000000000LL))
761.1Sjoerg        return 1;
771.1Sjoerg
781.1Sjoerg    if (test__fixdfdi(-0x1.FFFFFEp+62, 0x8000008000000000LL))
791.1Sjoerg        return 1;
801.1Sjoerg    if (test__fixdfdi(-0x1.FFFFFCp+62, 0x8000010000000000LL))
811.1Sjoerg        return 1;
821.1Sjoerg
831.1Sjoerg    if (test__fixdfdi(0x1.FFFFFFFFFFFFFp+62, 0x7FFFFFFFFFFFFC00LL))
841.1Sjoerg        return 1;
851.1Sjoerg    if (test__fixdfdi(0x1.FFFFFFFFFFFFEp+62, 0x7FFFFFFFFFFFF800LL))
861.1Sjoerg        return 1;
871.1Sjoerg
881.1Sjoerg    if (test__fixdfdi(-0x1.FFFFFFFFFFFFFp+62, 0x8000000000000400LL))
891.1Sjoerg        return 1;
901.1Sjoerg    if (test__fixdfdi(-0x1.FFFFFFFFFFFFEp+62, 0x8000000000000800LL))
911.1Sjoerg        return 1;
921.1Sjoerg
931.1Sjoerg   return 0;
941.1Sjoerg}
95