137a6a455466e5b197311771a777ab241e471ed8aEdward O'Callaghan/* ===-- muldc3.c - Implement __muldc3 -------------------------------------=== 237a6a455466e5b197311771a777ab241e471ed8aEdward O'Callaghan * 337a6a455466e5b197311771a777ab241e471ed8aEdward O'Callaghan * The LLVM Compiler Infrastructure 437a6a455466e5b197311771a777ab241e471ed8aEdward O'Callaghan * 59ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant * This file is dual licensed under the MIT and the University of Illinois Open 69ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant * Source Licenses. See LICENSE.TXT for details. 737a6a455466e5b197311771a777ab241e471ed8aEdward O'Callaghan * 837a6a455466e5b197311771a777ab241e471ed8aEdward O'Callaghan * ===----------------------------------------------------------------------=== 937a6a455466e5b197311771a777ab241e471ed8aEdward O'Callaghan * 1037a6a455466e5b197311771a777ab241e471ed8aEdward O'Callaghan * This file implements __muldc3 for the compiler_rt library. 1137a6a455466e5b197311771a777ab241e471ed8aEdward O'Callaghan * 1237a6a455466e5b197311771a777ab241e471ed8aEdward O'Callaghan * ===----------------------------------------------------------------------=== 1337a6a455466e5b197311771a777ab241e471ed8aEdward O'Callaghan */ 14b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 15b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#include "int_lib.h" 168603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar#include "int_math.h" 17b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 1837a6a455466e5b197311771a777ab241e471ed8aEdward O'Callaghan/* Returns: the product of a + ib and c + id */ 19b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 20b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbardouble _Complex 21b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar__muldc3(double __a, double __b, double __c, double __d) 22b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar{ 23b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar double __ac = __a * __c; 24b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar double __bd = __b * __d; 25b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar double __ad = __a * __d; 26b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar double __bc = __b * __c; 27b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar double _Complex z; 28b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar __real__ z = __ac - __bd; 29b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar __imag__ z = __ad + __bc; 308603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar if (crt_isnan(__real__ z) && crt_isnan(__imag__ z)) 31b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar { 32b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar int __recalc = 0; 338603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar if (crt_isinf(__a) || crt_isinf(__b)) 34b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar { 35c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __a = crt_copysign(crt_isinf(__a) ? 1 : 0, __a); 36c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __b = crt_copysign(crt_isinf(__b) ? 1 : 0, __b); 378603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar if (crt_isnan(__c)) 38c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __c = crt_copysign(0, __c); 398603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar if (crt_isnan(__d)) 40c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __d = crt_copysign(0, __d); 41b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar __recalc = 1; 42b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar } 438603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar if (crt_isinf(__c) || crt_isinf(__d)) 44b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar { 45c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __c = crt_copysign(crt_isinf(__c) ? 1 : 0, __c); 46c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __d = crt_copysign(crt_isinf(__d) ? 1 : 0, __d); 478603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar if (crt_isnan(__a)) 48c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __a = crt_copysign(0, __a); 498603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar if (crt_isnan(__b)) 50c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __b = crt_copysign(0, __b); 51b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar __recalc = 1; 52b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar } 538603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar if (!__recalc && (crt_isinf(__ac) || crt_isinf(__bd) || 548603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar crt_isinf(__ad) || crt_isinf(__bc))) 55b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar { 568603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar if (crt_isnan(__a)) 57c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __a = crt_copysign(0, __a); 588603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar if (crt_isnan(__b)) 59c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __b = crt_copysign(0, __b); 608603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar if (crt_isnan(__c)) 61c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __c = crt_copysign(0, __c); 628603024a01cfa82ab8dce397f40a2d6f246076e3Daniel Dunbar if (crt_isnan(__d)) 63c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __d = crt_copysign(0, __d); 64b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar __recalc = 1; 65b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar } 66b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (__recalc) 67b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar { 68c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __real__ z = CRT_INFINITY * (__a * __c - __b * __d); 69c25c6d10b18efa071f0016f31f6f3dd8a8fa6676Daniel Dunbar __imag__ z = CRT_INFINITY * (__a * __d + __b * __c); 70b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar } 71b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar } 72b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return z; 73b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar} 74