From patchwork Mon May 12 20:18:33 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Myers X-Patchwork-Id: 876 Return-Path: X-Original-To: siddhesh@wilcox.dreamhost.com Delivered-To: siddhesh@wilcox.dreamhost.com Received: from homiemail-mx23.g.dreamhost.com (mx2.sub5.homie.mail.dreamhost.com [208.113.200.128]) by wilcox.dreamhost.com (Postfix) with ESMTP id 5E2F336007A for ; Mon, 12 May 2014 13:18:45 -0700 (PDT) Received: by homiemail-mx23.g.dreamhost.com (Postfix, from userid 14307373) id EA23463BD7D4C; Mon, 12 May 2014 13:18:44 -0700 (PDT) X-Original-To: glibc@patchwork.siddhesh.in Delivered-To: x14307373@homiemail-mx23.g.dreamhost.com 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 homiemail-mx23.g.dreamhost.com (Postfix) with ESMTPS id B4B7A63BD7D26 for ; Mon, 12 May 2014 13:18:44 -0700 (PDT) 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=GqbeLaGUbIhcNM4Wp50WnuY6bRBuU Ux9gE74t6E9//8qZDQ2WjFKRNL6j42FnKM8GReH9Qb1cW1NXVW+1g+l+rA3hQd4b iG6WouJKD1TuVoMUQXkZOy4M+LsjDnV5fU4+k9Sa9lR51mYK5WlpZPGc6E4xkul3 d60iRCAkPQb1lM= 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=2lIdQKxChzYvOoYXXfisP5hu+Gg=; b=BK8 J/YqjZ7Rq8/Pc764f/Pjq4u+c/GV9xXvUt+sziR+J0wPaYNqDCgFQE117BnRT6we yFyxhopdvWFiNX/OHt72ybyz8vylUvAPhwyapQ9F+U2iD4FIURdXl09aRMZkESq2 deQIYXfnHY8nx4Amui6GQdYnca3WFO50C+jAi0xQ= Received: (qmail 27649 invoked by alias); 12 May 2014 20:18:42 -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 27637 invoked by uid 89); 12 May 2014 20:18:40 -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: Mon, 12 May 2014 20:18:33 +0000 From: "Joseph S. Myers" To: Subject: Fix log1pl (LDBL_MAX) in FE_UPWARD mode (bug 16564) Message-ID: MIME-Version: 1.0 X-DH-Original-To: glibc@patchwork.siddhesh.in Bug 16564 is spurious overflow of log1pl (LDBL_MAX) in FE_UPWARD mode, resulting from log1pl adding 1 to its argument (for arguments not close to 0), which overflows in that mode. This patch fixes this by avoiding adding 1 to large arguments (precisely what counts as large depends on the floating-point format). Tested x86_64 and x86, and spot-checked log1pl tests on mips64 and powerpc64. (auto-libm-test-out diffs omitted below.) 2014-05-12 Joseph Myers [BZ #16564] * sysdeps/i386/fpu/s_log1pl.S (__log1pl): Do not add 1 to positive arguments with exponent 65 or above. * sysdeps/ieee754/ldbl-128/s_log1pl.c (__log1pl): Do not add 1 to arguments 0x1p113L or above. * sysdeps/ieee754/ldbl-128ibm/s_log1pl.c (__log1pl): Do not add 1 to arguments 0x1p107L or above. * sysdeps/x86_64/fpu/s_log1pl.S (__log1pl): Do not add 1 to positive arguments with exponent 65 or above. * math/auto-libm-test-in: Add more tests of log1p. * math/auto-libm-test-out: Regenerated. diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in index 420f657..85f3c4f 100644 --- a/math/auto-libm-test-in +++ b/math/auto-libm-test-in @@ -1417,6 +1417,14 @@ log1p min missing-underflow log1p min_subnorm missing-underflow log1p -min missing-underflow log1p -min_subnorm missing-underflow +log1p 0x1p10 +log1p 0x1p20 +log1p 0x1p30 +log1p 0x1p50 +log1p 0x1p60 +log1p 0x1p100 +log1p 0x1p1000 +log1p max log2 1 log2 e diff --git a/sysdeps/i386/fpu/s_log1pl.S b/sysdeps/i386/fpu/s_log1pl.S index 93c07b6..d2d5d3b 100644 --- a/sysdeps/i386/fpu/s_log1pl.S +++ b/sysdeps/i386/fpu/s_log1pl.S @@ -53,12 +53,17 @@ ENTRY(__log1pl) sahf jnc 2f + movzwl 4+8(%esp), %eax + xorb $0x80, %ah + cmpl $0xc040, %eax + jae 5f + #ifdef PIC faddl one@GOTOFF(%edx) #else faddl one #endif - fyl2x +5: fyl2x ret 2: fyl2xp1 diff --git a/sysdeps/ieee754/ldbl-128/s_log1pl.c b/sysdeps/ieee754/ldbl-128/s_log1pl.c index d8d89f0..4a30af6 100644 --- a/sysdeps/ieee754/ldbl-128/s_log1pl.c +++ b/sysdeps/ieee754/ldbl-128/s_log1pl.c @@ -144,7 +144,10 @@ __log1pl (long double xm1) return xm1; } - x = xm1 + 1.0L; + if (xm1 >= 0x1p113L) + x = xm1; + else + x = xm1 + 1.0L; /* log1p(-1) = -inf */ if (x <= 0.0L) diff --git a/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c b/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c index a346383..e4bb6e8 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c @@ -140,7 +140,10 @@ __log1pl (long double xm1) if (((hx & 0x7fffffff) | lx) == 0) return xm1; - x = xm1 + 1.0L; + if (xm1 >= 0x1p107L) + x = xm1; + else + x = xm1 + 1.0L; /* log1p(-1) = -inf */ if (x <= 0.0L) diff --git a/sysdeps/x86_64/fpu/s_log1pl.S b/sysdeps/x86_64/fpu/s_log1pl.S index b4dbcdf..af3024a 100644 --- a/sysdeps/x86_64/fpu/s_log1pl.S +++ b/sysdeps/x86_64/fpu/s_log1pl.S @@ -52,8 +52,13 @@ ENTRY(__log1pl) andb $1,%ah jz 2f + movzwl 8+8(%rsp), %eax + xorb $0x80, %ah + cmpl $0xc040, %eax + jae 5f + faddl MO(one) - fyl2x +5: fyl2x ret 2: fyl2xp1