From patchwork Wed Jun 4 17:35:42 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Myers X-Patchwork-Id: 356055 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id A99F714009E for ; Thu, 5 Jun 2014 03:35:57 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:date:from:to:subject:message-id:mime-version :content-type; q=dns; s=default; b=wJaGQ+jWC94TJ2y9oJmRjmTKfmHf1 hMo3M+QKThcVk7n1xTbUjZigHb98WlGQJBewKP7n8+hO3KnbDxsRyVD6YCHZ+AfP wmyZgFhRxmU4maL6lTOZVVRarjUnjeD9ZpCA+UT2Tor7zs3UuszQfuY/kBLa8YQJ WIn5s4WDp2TftE= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:date:from:to:subject:message-id:mime-version :content-type; s=default; bh=0zIKJQR2j1OxpohkiJrQkWY49Ik=; b=SPZ 1dGl1pZM7C/RPuG8QAz2cFvcVtnjhjDaB+e3O5w0XMFpVTE5jMD7EmS1K1HFIDJI pN01aWtTAJQDXNUuP51+KcWUuGn62JW1Y5CmB88JhtNWjsP7hYyNRcwscAn3m1J1 D5MjSPoeC98C6wilz/KqKGdKxXWXttUYobuWKjn8= Received: (qmail 29891 invoked by alias); 4 Jun 2014 17:35:50 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 29840 invoked by uid 89); 4 Jun 2014 17:35:49 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL, BAYES_00 autolearn=ham version=3.3.2 X-HELO: relay1.mentorg.com Date: Wed, 4 Jun 2014 17:35:42 +0000 From: "Joseph S. Myers" To: Subject: Fix __ieee754_logl (-LDBL_MAX) in FE_DOWNWARD mode (bug 17022) Message-ID: MIME-Version: 1.0 This patch fixes __ieee754_logl (-LDBL_MAX) on x86_64 and x86 not to subtract 1 from its argument and so cause spurious overflow in FE_DOWNWARD mode. (For any argument strictly less than -1, it doesn't matter whether or not 1 is subtracted before computing log1p, as long as the result doesn't overflow to -Inf.) Tested x86_64 and x86. (This particular case lacks test coverage, since the testsuite doesn't cover -lieee, but it will be covered by tests after the following patch to test pow in all rounding modes, which was the context in which this bug was found.) 2014-06-04 Joseph Myers [BZ #17022] * sysdeps/i386/fpu/e_logl.S (__ieee754_logl): Do not subtract 1 from arguments -2 or below. * sysdeps/i386/i686/fpu/e_logl.S (__ieee754_logl): Likewise. * sysdeps/x86_64/fpu/e_logl.S (__ieee754_logl): Likewise. diff --git a/sysdeps/i386/fpu/e_logl.S b/sysdeps/i386/fpu/e_logl.S index edae1d7..828e98a 100644 --- a/sysdeps/i386/fpu/e_logl.S +++ b/sysdeps/i386/fpu/e_logl.S @@ -40,8 +40,11 @@ ENTRY(__ieee754_logl) fld %st // x : x : log(2) sahf jc 3f // in case x is NaN or +-Inf + movzwl 4+8(%esp), %eax + cmpl $0xc000, %eax + jae 6f // x <= -2, avoid overflow from -LDBL_MAX - 1. 4: fsubl MO(one) // x-1 : x : log(2) - fld %st // x-1 : x-1 : x : log(2) +6: fld %st // x-1 : x-1 : x : log(2) fabs // |x-1| : x-1 : x : log(2) fcompl MO(limit) // x-1 : x : log(2) fnstsw // x-1 : x : log(2) diff --git a/sysdeps/i386/i686/fpu/e_logl.S b/sysdeps/i386/i686/fpu/e_logl.S index a0d1107..0ccc8fc 100644 --- a/sysdeps/i386/i686/fpu/e_logl.S +++ b/sysdeps/i386/i686/fpu/e_logl.S @@ -39,8 +39,11 @@ ENTRY(__ieee754_logl) LOAD_PIC_REG (dx) #endif fld %st // x : x : log(2) + movzwl 4+8(%esp), %eax + cmpl $0xc000, %eax + jae 5f // x <= -2, avoid overflow from -LDBL_MAX - 1. fsubl MO(one) // x-1 : x : log(2) - fld %st // x-1 : x-1 : x : log(2) +5: fld %st // x-1 : x-1 : x : log(2) fabs // |x-1| : x-1 : x : log(2) fld MO(limit) // 0.29 : |x-1| : x-1 : x : log(2) fcomip %st(1) // |x-1| : x-1 : x : log(2) diff --git a/sysdeps/x86_64/fpu/e_logl.S b/sysdeps/x86_64/fpu/e_logl.S index 315afc0..047b8db 100644 --- a/sysdeps/x86_64/fpu/e_logl.S +++ b/sysdeps/x86_64/fpu/e_logl.S @@ -38,8 +38,11 @@ ENTRY(__ieee754_logl) fld %st // x : x : log(2) testb $1, %ah jnz 3f // in case x is NaN or +-Inf + movzwl 8+8(%rsp), %eax + cmpl $0xc000, %eax + jae 6f // x <= -2, avoid overflow from -LDBL_MAX - 1. 4: fsubl MO(one) // x-1 : x : log(2) - fld %st // x-1 : x-1 : x : log(2) +6: fld %st // x-1 : x-1 : x : log(2) fabs // |x-1| : x-1 : x : log(2) fcompl MO(limit) // x-1 : x : log(2) fnstsw // x-1 : x : log(2)