diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2013-10-09 22:31:15 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2013-10-09 22:31:15 +0000 |
commit | 215552adac04bc04778b3052c24d8c66b8455fef (patch) | |
tree | ecca99f169c43eb56f3f628b9248c8e0361b9a0e /libgo/runtime | |
parent | 4d5b5e9f2c37500cb85e18ce685be3bdd6ba549d (diff) | |
download | gcc-215552adac04bc04778b3052c24d8c66b8455fef.zip gcc-215552adac04bc04778b3052c24d8c66b8455fef.tar.gz gcc-215552adac04bc04778b3052c24d8c66b8455fef.tar.bz2 |
compiler, runtime: Fix complex division of NaN / 0.
From-SVN: r203331
Diffstat (limited to 'libgo/runtime')
-rw-r--r-- | libgo/runtime/go-cdiv.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/libgo/runtime/go-cdiv.c b/libgo/runtime/go-cdiv.c new file mode 100644 index 0000000..0a81e45 --- /dev/null +++ b/libgo/runtime/go-cdiv.c @@ -0,0 +1,46 @@ +/* go-cdiv.c -- complex division routines + + Copyright 2013 The Go Authors. All rights reserved. + Use of this source code is governed by a BSD-style + license that can be found in the LICENSE file. */ + +/* Calls to these functions are generated by the Go frontend for + division of complex64 or complex128. We use these because Go's + complex division expects slightly different results from the GCC + default. When dividing NaN+1.0i / 0+0i, Go expects NaN+NaNi but + GCC generates NaN+Infi. NaN+Infi seems wrong seems the rules of + C99 Annex G specify that if either side of a complex number is Inf, + the the whole number is Inf, but an operation involving NaN ought + to result in NaN, not Inf. */ + +__complex float +__go_complex64_div (__complex float a, __complex float b) +{ + if (__builtin_expect (b == 0+0i, 0)) + { + if (!__builtin_isinff (__real__ a) + && !__builtin_isinff (__imag__ a) + && (__builtin_isnanf (__real__ a) || __builtin_isnanf (__imag__ a))) + { + /* Pass "1" to nanf to match math/bits.go. */ + return __builtin_nanf("1") + __builtin_nanf("1")*1i; + } + } + return a / b; +} + +__complex double +__go_complex128_div (__complex double a, __complex double b) +{ + if (__builtin_expect (b == 0+0i, 0)) + { + if (!__builtin_isinf (__real__ a) + && !__builtin_isinf (__imag__ a) + && (__builtin_isnan (__real__ a) || __builtin_isnan (__imag__ a))) + { + /* Pass "1" to nan to match math/bits.go. */ + return __builtin_nan("1") + __builtin_nan("1")*1i; + } + } + return a / b; +} |