From patchwork Wed Jan 10 12:47:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 124077 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp5234631qgn; Wed, 10 Jan 2018 04:48:52 -0800 (PST) X-Google-Smtp-Source: ACJfBovxSVWpPPWiO6J6IkTdp3TAENxOAAa3EJ3+HHZsMAAzuCq10QpjytPTm0KmufS4efpRInU5 X-Received: by 10.98.15.203 with SMTP id 72mr16946766pfp.104.1515588532644; Wed, 10 Jan 2018 04:48:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1515588532; cv=none; d=google.com; s=arc-20160816; b=hxaU5HP1lWIWvUhgmC878Rg0g4qT50uc9c+K8oiNafpDzHp9shXRrbQQrnlfv3DTJO GU9QlHNXSY+k2EwfKCc0Yi7YeL6mUbOKtuFppIc8kHxbogzLdHt+6RLTwYYAtW7NGMiu v8h+iYL0CMNYQOVupETvpK2mdWzXQCfNMXpqnqH2VkK/hDMCqe1nYjf0rdRKDMCVpQGD ti2eUTxvwbJP5yoiLHimOPjGCIkD5xMupiO/zdqHEFR6LxCAdRV3gjdv44m4mwELDmNi f8ObeZG/Z1j5n/L0D1xiK72Dp3dUUdE5Yp6OIZ55HfSJvVhpBkkVWKUfEymlRCTxJUx3 TJoQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=eZ8dCF6rUA/Tb1B1ylwpffxbACcE+rU3uMRyHIAzZo4=; b=I8ZOhJteH7egqkkU/Tn4CPanOFr0JMpjKukic7U1Gq8QIMdjKexoxEpVjI426P7tVJ 6wHedfARrcm7/p4hJ8vuH2S99o2IuRF/IK6RhBAF3V1e+Vmn+DD3W2vXkKOD3U8tS3mD xC0BeApf3bjza1myoVIW6aU0GXXOKL4fXU3qAO9XRl7a7SY4Ya9KiVqdntLumZ4KTzH6 zAQ9b/pRCqRLGcT3VRirpL+sWzxPynh8aI2lC2vGYSbHGj8TAWmI20/WF11AGFdetlDl FYCvGlvE+ZzSfIGgpjDEgjmC0ZP5gk8urmKJ2nsOsvHcDT/lfDTGsg+9sdvX8lsJrWT+ +UDA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=gsoJjVOL; spf=pass (google.com: domain of libc-alpha-return-88999-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88999-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id u79si11700689pfa.354.2018.01.10.04.48.52 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 Jan 2018 04:48:52 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88999-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=gsoJjVOL; spf=pass (google.com: domain of libc-alpha-return-88999-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88999-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=piwEVEfO6FBCrYr6Kufzl30btr5EYS0 6Va9lEknBx4Oq28piYiDmFP9FQGtL05NahHhdFi2ZEytQqw1xA7vK6V7sxXYZSs9 laPSzxsDS/HBX6LmbJ7AHoklPo3ZjotKGEYqCqZ2mT/AIgGmQ6Zn0rx/vFEw5Prm Bzr79W1OjaoU= 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:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=wtaVHSxIiKUGJkxP5PdyT82ozpo=; b=gsoJj VOLaUvHdLcG4AEgOrz+kqu5vwufXML+WdAADZQ/VV8e0/T1WjHEMtV3nQ57xMalP ncWNRpTsEBZsOV7htmlGKOL8HrcD2vCRZSIgslq5jmG2yMonr580rVWtclTES+zX +xQWSr58hs/1G028k6Ut5Vfs1kb5pB0KaQ8U+o= Received: (qmail 129300 invoked by alias); 10 Jan 2018 12:48: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 120626 invoked by uid 89); 10 Jan 2018 12:48:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f193.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=eZ8dCF6rUA/Tb1B1ylwpffxbACcE+rU3uMRyHIAzZo4=; b=KqbzbUnbuM0OExonQfIEErK/61oH/el13ZXdUToD6gbu0qbxiPgdaVaqaHCgCqp6QG 6R5gxC3rY4D+6BmhmjJl0ElJcnXvbheu+FJrM+uA7PND7d780rMGCle8SyuUnQxegD11 M+ocSVcIP9b1uiTRhbklXdUnH+xl0dPvfKIsBRsUCD3ZopNNbKPJR9vjKzLww3OxKcP6 PeGKpietMAvw62JJ07aakRM71syCDdJp35DWVtzWtN97Sek9Lwz8gwkYJamEa4+IvrjF fyKxT54LNe0l7pOklnGSaAmCTwxJB8vitXKh61yeqZS6RH54Sj6/zDk3yyABb21/IdEb dWHg== X-Gm-Message-State: AKwxytejbAR3LkAtXzweZYQ2SKBJDcL3mym0wrgDHVVXbrzvFnZGL8Zz JFz8Gf/6nwnSHaHw9a52B7RSxNcyvag= X-Received: by 10.237.51.35 with SMTP id u32mr24942662qtd.110.1515588493906; Wed, 10 Jan 2018 04:48:13 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH v3 03/18] Add string-maskoff.h generic header Date: Wed, 10 Jan 2018 10:47:47 -0200 Message-Id: <1515588482-15744-4-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1515588482-15744-1-git-send-email-adhemerval.zanella@linaro.org> References: <1515588482-15744-1-git-send-email-adhemerval.zanella@linaro.org> Macros to operate on unaligned access for string operations: - create_mask: create a mask based on pointer alignment to sets up non-zero bytes before the beginning of the word so a following operation (such as find zero) might ignore these bytes. - highbit_mask: create a mask with high bit of each byte being 1, and the low 7 bits being all the opposite of the input. These macros are meant to be used on optimized vectorized string implementations. Richard Henderson Adhemerval Zanella * sysdeps/generic/string-maskoff.h: New file. --- sysdeps/generic/string-maskoff.h | 64 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 sysdeps/generic/string-maskoff.h -- 2.7.4 diff --git a/sysdeps/generic/string-maskoff.h b/sysdeps/generic/string-maskoff.h new file mode 100644 index 0000000..6231798 --- /dev/null +++ b/sysdeps/generic/string-maskoff.h @@ -0,0 +1,64 @@ +/* Mask off bits. Generic C version. + Copyright (C) 2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef STRING_MASKOFF_H +#define STRING_MASKOFF_H 1 + +#include +#include +#include + +/* Provide a mask based on the pointer alignment that sets up non-zero + bytes before the beginning of the word. It is used to mask off + undesirable bits from an aligned read from an unaligned pointer. + For instance, on a 64 bits machine with a pointer alignment of + 3 the function returns 0x0000000000ffffff for LE and 0xffffff0000000000 + (meaning to mask off the initial 3 bytes). */ +static inline op_t +create_mask (uintptr_t i) +{ + i = i % sizeof (op_t); + if (__BYTE_ORDER == __LITTLE_ENDIAN) + return ~(((op_t)-1) << (i * CHAR_BIT)); + else + return ~(((op_t)-1) >> (i * CHAR_BIT)); +} + +/* Setup an word with each byte being c_in. For instance, on a 64 bits + machine with input as 0xce the functions returns 0xcececececececece. */ +static inline op_t +repeat_bytes (unsigned char c_in) +{ + return ((op_t)-1 / 0xff) * c_in; +} + +/* Create a mask with high bit of each byte being 1, and the low 7 bits + being all the opposite of the input mask. It is used to mask off + undesirable bits from an aligned read from an unaligned pointer, + and also taking care to avoid match possible bytes meant to be + matched. For instance, on a 64 bits machine with a pointer alignment + of 3 the function returns 0x7f7f7f0000000000 (input meant to + be 0xffffff0000000000) for BE and 0x00000000007f7f7f for LE (input + meant to be 0x0000000000ffffff). */ +static inline op_t +highbit_mask (op_t m) +{ + return m & ~repeat_bytes (0x80); +} + +#endif /* STRING_MASKOFF_H */