From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qv1-xf34.google.com (mail-qv1-xf34.google.com [IPv6:2607:f8b0:4864:20::f34]) by sourceware.org (Postfix) with ESMTPS id 02A8E3858C2C; Sat, 23 Apr 2022 01:49:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 02A8E3858C2C Received: by mail-qv1-xf34.google.com with SMTP id kj29so2776870qvb.8; Fri, 22 Apr 2022 18:49:51 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=zixq/lde7fHViQHgG9E1/P40cV977dzXvEr/cMzfro4=; b=6k7rRFDbsWO5fPyq5Ft4Tu/w1kKO1ZnNuO87Q2lU+hRx18DPuz0xfPkb0otrqd9UXv 66gn9TQS9nKMFUJYtEx6kiHW9kbLqAgp5PlTHKG/qmR/fq79d2I0GSGxF4hVSxSMlYxZ ZPp9AK7N98LQJKHZDrKpCIHIFtWbU22ogl1QTWye0iySvfg3VCMt1IzutPmX/xowBZqn R1r7halbZzUusFVhwvSHyo0skvGKutVfeqWZ7QYo75V5uM3fJLAbIL5D3XPz++m7ACQG Q2UOd7uzjKHEfG7GgPtPjWOeaRYblxTVj1rby1eiypZQfymEDZ+FVMapRa1+7I39o6hS TzHQ== X-Gm-Message-State: AOAM531AQ/LREss9B5AUYle34ActLXLosLy/UmEozwhaDkPI9WiDOL0O YQ7HsY6Xz6w6pubWKm05+NhF5YeUkUTlh8cx8Cy/GWZRVoY= X-Google-Smtp-Source: ABdhPJzl5LSmbifZpuvvi3SyLYsC/ErrIu11lHcw2tMBCUwsRiXHcESefVNJKsEN48gJsilHWSlrRiqvi4vMBGzOGH8= X-Received: by 2002:a05:6214:5007:b0:44b:dfe6:60d1 with SMTP id jo7-20020a056214500700b0044bdfe660d1mr5896967qvb.30.1650678590025; Fri, 22 Apr 2022 18:49:50 -0700 (PDT) MIME-Version: 1.0 References: <20211204032420.3158-1-hjl.tools@gmail.com> In-Reply-To: From: Sunil Pandey Date: Fri, 22 Apr 2022 18:49:14 -0700 Message-ID: Subject: Re: [PATCH] x86-64: Use notl in EVEX strcmp [BZ #28646] To: Noah Goldstein , libc-stable@sourceware.org Cc: "H.J. Lu" , GNU C Library Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-7.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, HK_RANDOM_ENVFROM, HK_RANDOM_FROM, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-stable@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-stable mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 23 Apr 2022 01:49:56 -0000 On Fri, Dec 3, 2021 at 7:50 PM Noah Goldstein via Libc-alpha wrote: > > On Fri, Dec 3, 2021 at 9:24 PM H.J. Lu wrote: > > > > From: Noah Goldstein > > > > Must use notl %edi here as lower bits are for CHAR comparisons > > potentially out of range thus can be 0 without indicating mismatch. > > This fixes BZ #28646. > > > > Co-Authored-By: H.J. Lu > > --- > > string/test-strcmp.c | 28 ++++++++++++++++++++++++++ > > sysdeps/x86_64/multiarch/strcmp-evex.S | 14 +++++++------ > > 2 files changed, 36 insertions(+), 6 deletions(-) > > > > diff --git a/string/test-strcmp.c b/string/test-strcmp.c > > index 77ae73110f..42178a260b 100644 > > --- a/string/test-strcmp.c > > +++ b/string/test-strcmp.c > > @@ -23,6 +23,7 @@ > > # define TEST_NAME "strcmp" > > #endif > > #include "test-string.h" > > +#include > > > > #ifdef WIDE > > # include > > @@ -390,6 +391,32 @@ check2 (void) > > } > > } > > > > +static void > > +check3 (void) > > +{ > > + size_t size = 0xd000 + 0x4000; > > + CHAR *s1, *s2; > > + CHAR *buffer1 = mmap (NULL, size, PROT_READ | PROT_WRITE, > > + MAP_PRIVATE | MAP_ANON, -1, 0); > > + CHAR *buffer2 = mmap (NULL, size, PROT_READ | PROT_WRITE, > > + MAP_PRIVATE | MAP_ANON, -1, 0); > > + if (buffer1 == MAP_FAILED || buffer1 == MAP_FAILED) > > + error (EXIT_UNSUPPORTED, errno, "mmap failed"); > > + > > + s1 = (CHAR *) (buffer1 + 0x8f8 / sizeof (CHAR)); > > + s2 = (CHAR *) (buffer2 + 0xcff3 / sizeof (CHAR)); > > + > > + STRCPY(s1, L("/export/redhat/rpms/BUILD/java-1.8.0-openjdk-1.8.0.312.b07-2.fc35.x86_64/openjdk/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PathDocFileFactory.java")); > > + STRCPY(s2, L("/export/redhat/rpms/BUILD/java-1.8.0-openjdk-1.8.0.312.b07-2.fc35.x86_64/openjdk/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java")); > > + > > + int exp_result = SIMPLE_STRCMP (s1, s2); > > + FOR_EACH_IMPL (impl, 0) > > + check_result (impl, s1, s2, exp_result); > > + > > + munmap ((void *) buffer1, size); > > + munmap ((void *) buffer2, size); > > +} > > + > > int > > test_main (void) > > { > > @@ -398,6 +425,7 @@ test_main (void) > > test_init (); > > check(); > > check2 (); > > + check3 (); > > > > printf ("%23s", ""); > > FOR_EACH_IMPL (impl, 0) > > diff --git a/sysdeps/x86_64/multiarch/strcmp-evex.S b/sysdeps/x86_64/multiarch/strcmp-evex.S > > index 0bea318abd..b68e1f7a1e 100644 > > --- a/sysdeps/x86_64/multiarch/strcmp-evex.S > > +++ b/sysdeps/x86_64/multiarch/strcmp-evex.S > > @@ -646,12 +646,13 @@ L(loop_cross_page): > > in YMM3 and 32 bytes at VEC_SIZE(%rdx, %r10). */ > > VPCMP $0, VEC_SIZE(%rdx, %r10), %YMM3, %k3{%k4} > > kmovd %k3, %edi > > + /* Must use notl %edi here as lower bits are for CHAR > > + comparisons potentially out of range thus can be 0 without > > + indicating mismatch. */ > > + notl %edi > > # ifdef USE_AS_WCSCMP > > /* Don't use subl since it is the upper 8 bits of EDI below. */ > > - notl %edi > > andl $0xff, %edi > > -# else > > - incl %edi > > # endif > > > > # ifdef USE_AS_WCSCMP > > @@ -733,12 +734,13 @@ L(loop_cross_page_2_vec): > > in YMM1 and 32 bytes at (VEC_SIZE * 3)(%rdx, %r10). */ > > VPCMP $0, (VEC_SIZE * 3)(%rdx, %r10), %YMM1, %k3{%k4} > > kmovd %k3, %edi > > + /* Must use notl %edi here as lower bits are for CHAR > > + comparisons potentially out of range thus can be 0 without > > + indicating mismatch. */ > > + notl %edi > > # ifdef USE_AS_WCSCMP > > /* Don't use subl since it is the upper 8 bits of EDI below. */ > > - notl %edi > > andl $0xff, %edi > > -# else > > - incl %edi > > # endif > > > > # ifdef USE_AS_WCSCMP > > -- > > 2.33.1 > > > > LGTM I would like to backport this patch to release branches. Any comments or objections? --Sunil