Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[builtins] Divide shouldn't underflow if rounded result would be normal.
We were treating certain edge cases that are actually normal as denormal results, and flushing them to zero; we shouldn't do that. Not sure this is the cleanest way to implement this edge case, but I wanted to avoid adding any code on the common path. Differential Revision: https://reviews.llvm.org/D59070 llvm-svn: 356529
- Loading branch information
1 parent
4d03bbb
commit d674d96
Showing
6 changed files
with
133 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
// RUN: %clang_builtins %s %librt -o %t && %run %t | ||
//===--------------- divdf3_test.c - Test __divdf3 ------------------------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file tests __divdf3 for the compiler_rt library. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "int_lib.h" | ||
#include <stdio.h> | ||
|
||
#include "fp_test.h" | ||
|
||
// Returns: a / b | ||
COMPILER_RT_ABI double __divdf3(double a, double b); | ||
|
||
int test__divdf3(double a, double b, uint64_t expected) | ||
{ | ||
double x = __divdf3(a, b); | ||
int ret = compareResultD(x, expected); | ||
|
||
if (ret){ | ||
printf("error in test__divdf3(%.20e, %.20e) = %.20e, " | ||
"expected %.20e\n", a, b, x, | ||
fromRep64(expected)); | ||
} | ||
return ret; | ||
} | ||
|
||
int main() | ||
{ | ||
// 1/3 | ||
if (test__divdf3(1., 3., 0x3fd5555555555555ULL)) | ||
return 1; | ||
// smallest normal result | ||
if (test__divdf3(4.450147717014403e-308, 2., 0x10000000000000ULL)) | ||
return 1; | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
// RUN: %clang_builtins %s %librt -o %t && %run %t | ||
//===--------------- divsf3_test.c - Test __divsf3 ------------------------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file tests __divsf3 for the compiler_rt library. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "int_lib.h" | ||
#include <stdio.h> | ||
|
||
#include "fp_test.h" | ||
|
||
// Returns: a / b | ||
COMPILER_RT_ABI float __divsf3(float a, float b); | ||
|
||
int test__divsf3(float a, float b, uint32_t expected) | ||
{ | ||
float x = __divsf3(a, b); | ||
int ret = compareResultF(x, expected); | ||
|
||
if (ret){ | ||
printf("error in test__divsf3(%.20e, %.20e) = %.20e, " | ||
"expected %.20e\n", a, b, x, | ||
fromRep32(expected)); | ||
} | ||
return ret; | ||
} | ||
|
||
int main() | ||
{ | ||
// 1/3 | ||
if (test__divsf3(1.f, 3.f, 0x3EAAAAABU)) | ||
return 1; | ||
// smallest normal result | ||
if (test__divsf3(2.3509887e-38, 2., 0x00800000U)) | ||
return 1; | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters