From patchwork Tue Jun 10 23:01:53 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Myers X-Patchwork-Id: 358407 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 9618D1400B9 for ; Wed, 11 Jun 2014 09:02:08 +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=h8JN3JPBIuOIbCg2tXDL35+lnm0LP +ArtMC7q8IUBRXlnR2FVIZF6qTf6XaQS3AnFjbKDqkd4LXcH9vlvdIajCD0XUKU6 34qCi6VLO65sI3HgmV8QnAG3REZ8lMfSaUzl7CjNh74FycsJmNH6SoGSamTuR7fP h9YXcGlQVcUUho= 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=DLI4iZj9rMAMuIrWbv96kvGaHzA=; b=IIC 9h8nuw83Auda9MFAmIRlQxFVebEgWgbBWagdVk71aCtFVmskDVNPWA9bhdQs3TUE idJ73R+o4tNYnGdMp4e/zUyJM++GqzJXrAh1vGLVtEhu33+JGnRAbybJGi4HXGMN vj4LG3xka7CNbO3tu32WsR7kEXBlbtkazr2OamSg= Received: (qmail 20827 invoked by alias); 10 Jun 2014 23:02:03 -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 20813 invoked by uid 89); 10 Jun 2014 23:02:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL, BAYES_00 autolearn=ham version=3.3.2 X-HELO: relay1.mentorg.com Date: Tue, 10 Jun 2014 23:01:53 +0000 From: "Joseph S. Myers" To: Subject: Test cpow in all rounding modes Message-ID: MIME-Version: 1.0 This patch enables testing of cpow in all rounding modes using ALL_RM_TEST. There were two reasons this was previously deferred: * MPC has complicated rounding-mode-dependent rules for the signs of exact zero real or imaginary parts in the result of mpc_pow. Annex G does not impose any such requirements and I don't think glibc should try to implement any particular logic here. This patch adds support for gen-auto-libm-tests passing the IGNORE_ZERO_INF_SIGN flag to libm-test.inc. * Error accumulations in some tests in non-default rounding modes exceed the maximum error permitted in libm-test.inc. This patch marks the problem tests with xfail-rounding. (It might be possible to reduce the accumulations a bit by using round-to-nearest when cpow calls clog, but I don't think there's much point; the implementation approach for cpow is fundamentally deficient, as discussed in the existing bug for cpow inaccuracy which can reasonably be considered to cover these less-inaccurate cases as well. It's possible that the test "cpow 2 0 10 0" will also need xfail-rounding on some platforms.) Tested x86_64 and x86 and ulps updated accordingly. (auto-libm-test-out diffs omitted below.) 2014-06-10 Joseph Myers * math/gen-auto-libm-tests.c: Document use of ignore-zero-inf-sign. (input_flag_type): Add value flag_ignore_zero_inf_sign. (input_flags): Add ignore-zero-inf-sign. (output_for_one_input_case): Handle flag_ignore_zero_inf_sign. * math/gen-libm-test.pl (generate_testfile): Handle ignore-zero-inf-sign. * math/auto-libm-test-in: Mark some cpow tests with ignore-zero-inf-sign and some with xfail-rounding. * math/auto-libm-test-out: Regenerated. * math/libm-test.inc (cpow_test): Use ALL_RM_TEST. * sysdeps/i386/fpu/libm-test-ulps: Update. * sysdeps/x86_64/fpu/libm-test-ulps: Likewise. diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in index 6edad5a..bfbc085 100644 --- a/math/auto-libm-test-in +++ b/math/auto-libm-test-in @@ -652,14 +652,14 @@ cosh 0x2.c5d37700c6bb03a6c24b6c9b494ep+12 no-test-inline xfail-rounding:ldbl-128 cosh -0x2.c5d37700c6bb03a6c24b6c9b494cp+12 no-test-inline xfail-rounding:ldbl-128ibm cosh -0x2.c5d37700c6bb03a6c24b6c9b494ep+12 no-test-inline xfail-rounding:ldbl-128ibm -cpow 1 0 0 0 -cpow 2 0 10 0 +cpow 1 0 0 0 ignore-zero-inf-sign +cpow 2 0 10 0 ignore-zero-inf-sign # Bug 14473: cpow results inaccurate. cpow e 0 0 2pi xfail -cpow 2 3 4 0 +cpow 2 3 4 0 xfail-rounding -cpow 0.75 1.25 0.75 1.25 -cpow 0.75 1.25 1.0 1.0 +cpow 0.75 1.25 0.75 1.25 xfail-rounding +cpow 0.75 1.25 1.0 1.0 xfail-rounding cpow 0.75 1.25 1.0 0.0 cpow 0.75 1.25 0.0 1.0 diff --git a/math/gen-auto-libm-tests.c b/math/gen-auto-libm-tests.c index 132cca2..12c530a 100644 --- a/math/gen-auto-libm-tests.c +++ b/math/gen-auto-libm-tests.c @@ -84,15 +84,16 @@ permitted), errno is expected to be left unchanged. The flag "no-test-inline" indicates a test is disabled for inline - function testing; "xfail" indicates the test is disabled as - expected to produce incorrect results, "xfail-rounding" indicates - the test is disabled only in rounding modes other than - round-to-nearest. Otherwise, test flags are of the form - "spurious-" and "missing-", for any exception - ("overflow", "underflow", "inexact", "invalid", "divbyzero"), - "spurious-errno" and "missing-errno", to indicate when tests are - expected to deviate from the exception and errno settings - corresponding to the mathematical results. "xfail", + function testing; "ignore-zero-inf-sign" indicates the the signs of + zero and infinite results should be ignored; "xfail" indicates the + test is disabled as expected to produce incorrect results, + "xfail-rounding" indicates the test is disabled only in rounding + modes other than round-to-nearest. Otherwise, test flags are of + the form "spurious-" and "missing-", for any + exception ("overflow", "underflow", "inexact", "invalid", + "divbyzero"), "spurious-errno" and "missing-errno", to indicate + when tests are expected to deviate from the exception and errno + settings corresponding to the mathematical results. "xfail", "xfail-rounding", "spurious-" and "missing-" flags should be accompanied by a comment referring to an open bug in glibc Bugzilla. @@ -109,17 +110,17 @@ plus_infty or minus_infty for infinite expected results, or as integer constant expressions (not necessarily with the right type) or IGNORE for integer inputs and outputs. Flags are - "no-test-inline", "xfail", "", "-ok", - "errno-", "errno--ok", which may be unconditional or - conditional. "" indicates that a correct result means - the given exception should be raised. "errno-" indicates - that a correct result means errno should be set to the given value. - "-ok" means not to test for the given exception or errno value - (whether because it was marked as possibly missing or spurious, or - because the calculation of correct results indicated it was - optional). Conditions "before-rounding" and "after-rounding" - indicate tests where expectations for underflow exceptions depend - on how the architecture detects tininess. */ + "no-test-inline", "ignore-zero-info-sign", "xfail", "", + "-ok", "errno-", "errno--ok", which may be + unconditional or conditional. "" indicates that a + correct result means the given exception should be raised. + "errno-" indicates that a correct result means errno should + be set to the given value. "-ok" means not to test for the given + exception or errno value (whether because it was marked as possibly + missing or spurious, or because the calculation of correct results + indicated it was optional). Conditions "before-rounding" and + "after-rounding" indicate tests where expectations for underflow + exceptions depend on how the architecture detects tininess. */ #define _GNU_SOURCE @@ -315,6 +316,7 @@ typedef struct typedef enum { flag_no_test_inline, + flag_ignore_zero_inf_sign, flag_xfail, flag_xfail_rounding, /* The "spurious" and "missing" flags must be in the same order as @@ -342,6 +344,7 @@ typedef enum static const char *const input_flags[num_input_flag_types] = { "no-test-inline", + "ignore-zero-inf-sign", "xfail", "xfail-rounding", "spurious-divbyzero", @@ -1950,6 +1953,7 @@ output_for_one_input_case (FILE *fp, const char *filename, test_function *tf, switch (it->flags[i].type) { case flag_no_test_inline: + case flag_ignore_zero_inf_sign: case flag_xfail: if (fprintf (fp, " %s%s", input_flags[it->flags[i].type], diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl index 5f62872..b5d599f 100755 --- a/math/gen-libm-test.pl +++ b/math/gen-libm-test.pl @@ -442,6 +442,10 @@ sub generate_testfile { } } $flags_conv = ""; + if (defined ($flag_cond{"ignore-zero-inf-sign"})) { + $flags_conv .= or_cond_value ($flag_cond{"ignore-zero-inf-sign"}, + "IGNORE_ZERO_INF_SIGN", "0"); + } if (defined ($flag_cond{"no-test-inline"})) { $flags_conv .= or_cond_value ($flag_cond{"no-test-inline"}, "NO_TEST_INLINE", "0"); diff --git a/math/libm-test.inc b/math/libm-test.inc index fa8e238..05febc5 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -6288,9 +6288,7 @@ static const struct test_cc_c_data cpow_test_data[] = static void cpow_test (void) { - START (cpow, 0); - RUN_TEST_LOOP_cc_c (cpow, cpow_test_data, ); - END_COMPLEX; + ALL_RM_TEST (cpow, 0, cpow_test_data, RUN_TEST_LOOP_cc_c, END_COMPLEX); } diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps index d7424a6..d0dc821 100644 --- a/sysdeps/i386/fpu/libm-test-ulps +++ b/sysdeps/i386/fpu/libm-test-ulps @@ -916,6 +916,54 @@ ifloat: 1 ildouble: 4 ldouble: 4 +Function: Real part of "cpow_downward": +double: 5 +float: 8 +idouble: 5 +ifloat: 8 +ildouble: 7 +ldouble: 7 + +Function: Imaginary part of "cpow_downward": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 +ildouble: 2 +ldouble: 2 + +Function: Real part of "cpow_towardzero": +double: 5 +float: 8 +idouble: 5 +ifloat: 8 +ildouble: 7 +ldouble: 7 + +Function: Imaginary part of "cpow_towardzero": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 +ildouble: 1 +ldouble: 1 + +Function: Real part of "cpow_upward": +double: 4 +float: 1 +idouble: 4 +ifloat: 1 +ildouble: 2 +ldouble: 2 + +Function: Imaginary part of "cpow_upward": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 +ildouble: 2 +ldouble: 2 + Function: Real part of "csin": double: 1 float: 1 diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps index 92fef5a..dbe9c46 100644 --- a/sysdeps/x86_64/fpu/libm-test-ulps +++ b/sysdeps/x86_64/fpu/libm-test-ulps @@ -959,6 +959,54 @@ ifloat: 2 ildouble: 4 ldouble: 4 +Function: Real part of "cpow_downward": +double: 4 +float: 8 +idouble: 4 +ifloat: 8 +ildouble: 7 +ldouble: 7 + +Function: Imaginary part of "cpow_downward": +double: 2 +float: 2 +idouble: 2 +ifloat: 2 +ildouble: 2 +ldouble: 2 + +Function: Real part of "cpow_towardzero": +double: 4 +float: 8 +idouble: 4 +ifloat: 8 +ildouble: 7 +ldouble: 7 + +Function: Imaginary part of "cpow_towardzero": +double: 2 +float: 2 +idouble: 2 +ifloat: 2 +ildouble: 1 +ldouble: 1 + +Function: Real part of "cpow_upward": +double: 4 +float: 1 +idouble: 4 +ifloat: 1 +ildouble: 2 +ldouble: 2 + +Function: Imaginary part of "cpow_upward": +double: 1 +float: 2 +idouble: 1 +ifloat: 2 +ildouble: 2 +ldouble: 2 + Function: Real part of "csin": double: 1 float: 1