get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2216753/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2216753,
    "url": "http://patchwork.ozlabs.org/api/patches/2216753/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/sparclinux/patch/20260327061704.3707577-11-hch@lst.de/",
    "project": {
        "id": 10,
        "url": "http://patchwork.ozlabs.org/api/projects/10/?format=api",
        "name": "Linux SPARC Development ",
        "link_name": "sparclinux",
        "list_id": "sparclinux.vger.kernel.org",
        "list_email": "sparclinux@vger.kernel.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260327061704.3707577-11-hch@lst.de>",
    "list_archive_url": null,
    "date": "2026-03-27T06:16:42",
    "name": "[10/28] xor: move generic implementations out of asm-generic/xor.h",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "d079104a0ade4702da061fc7ed19b6a9758a9b30",
    "submitter": {
        "id": 82,
        "url": "http://patchwork.ozlabs.org/api/people/82/?format=api",
        "name": "Christoph Hellwig",
        "email": "hch@lst.de"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/sparclinux/patch/20260327061704.3707577-11-hch@lst.de/mbox/",
    "series": [
        {
            "id": 497694,
            "url": "http://patchwork.ozlabs.org/api/series/497694/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/sparclinux/list/?series=497694",
            "date": "2026-03-27T06:16:33",
            "name": "[01/28] xor: assert that xor_blocks is not call from interrupt context",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/497694/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2216753/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2216753/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "\n <SRS0=vQH1=B3=vger.kernel.org=sparclinux+bounces-6585-patchwork-incoming=ozlabs.org@ozlabs.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "sparclinux@vger.kernel.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@legolas.ozlabs.org",
            "patchwork-incoming@ozlabs.org"
        ],
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=infradead.org header.i=@infradead.org header.a=rsa-sha256\n header.s=bombadil.20210309 header.b=TKToHgEa;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=ozlabs.org\n (client-ip=2404:9400:2221:ea00::3; helo=mail.ozlabs.org;\n envelope-from=srs0=vqh1=b3=vger.kernel.org=sparclinux+bounces-6585-patchwork-incoming=ozlabs.org@ozlabs.org;\n receiver=patchwork.ozlabs.org)",
            "gandalf.ozlabs.org;\n arc=pass smtp.remote-ip=172.105.105.114 arc.chain=subspace.kernel.org",
            "gandalf.ozlabs.org;\n dmarc=fail (p=none dis=none) header.from=lst.de",
            "gandalf.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=infradead.org header.i=@infradead.org header.a=rsa-sha256\n header.s=bombadil.20210309 header.b=TKToHgEa;\n\tdkim-atps=neutral",
            "gandalf.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.105.105.114; helo=tor.lore.kernel.org;\n envelope-from=sparclinux+bounces-6585-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org)",
            "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org\n header.b=\"TKToHgEa\"",
            "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=198.137.202.133",
            "smtp.subspace.kernel.org;\n dmarc=fail (p=none dis=none) header.from=lst.de",
            "smtp.subspace.kernel.org;\n spf=none smtp.mailfrom=bombadil.srs.infradead.org"
        ],
        "Received": [
            "from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fhrJM1Vbhz1y1x\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 27 Mar 2026 17:26:27 +1100 (AEDT)",
            "from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\n\tby gandalf.ozlabs.org (Postfix) with ESMTP id 4fhrJM0slwz4wCX\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 27 Mar 2026 17:26:27 +1100 (AEDT)",
            "by gandalf.ozlabs.org (Postfix)\n\tid 4fhrJM0kymz4wSl; Fri, 27 Mar 2026 17:26:27 +1100 (AEDT)",
            "from tor.lore.kernel.org (tor.lore.kernel.org [172.105.105.114])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby gandalf.ozlabs.org (Postfix) with ESMTPS id 4fhrJH2qWyz4wCX\n\tfor <patchwork-incoming@ozlabs.org>; Fri, 27 Mar 2026 17:26:23 +1100 (AEDT)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id 543F530EFBFA\n\tfor <patchwork-incoming@ozlabs.org>; Fri, 27 Mar 2026 06:21:29 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id A200637CD51;\n\tFri, 27 Mar 2026 06:20:23 +0000 (UTC)",
            "from bombadil.infradead.org (bombadil.infradead.org\n [198.137.202.133])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 652EB37FF5F;\n\tFri, 27 Mar 2026 06:20:17 +0000 (UTC)",
            "from\n 2a02-8389-2341-5b80-d601-7564-c2e0-491c.cable.dynamic.v6.surfer.at\n ([2a02:8389:2341:5b80:d601:7564:c2e0:491c] helo=localhost)\n\tby bombadil.infradead.org with esmtpsa (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1w60Y3-00000006lgL-1dRL;\n\tFri, 27 Mar 2026 06:19:59 +0000"
        ],
        "ARC-Seal": [
            "i=2; a=rsa-sha256; d=ozlabs.org; s=201707; t=1774592787; cv=pass;\n\tb=XaakpBxtVt3S/SJ0BrtRooHluuKfeeYFf375hy6OoGcrUtG5DUb4rLws3bB3iTs0/OkKo3saVY1//enAUHn8lD+JkDn0DxR68fnPKQd0PeyDVJM9ywPvE6jVE6F6TUUOWeC5wL4fS/t/u/Ig9wU5/S08M9s7EFugt/wcLQaKvUcT05a0gCXRQ2os/EahgwCPu4wixAs/D45udm5TwC02cC5w0MGyPAazpoPK11ZkcA4Pxq87LPqbPFySssukj6OaGyQXyRPTeZ+UVjtug4xiG9jqZ11hS/PL9OpTt79qqFSh6AvYv556H7YUsBQrr15Wii+et4T7fUev7Vnbb+3bfw==",
            "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1774592422; cv=none;\n b=J3HTRRrzGZtTqxV2SF/6TIO6YbfCADOrkcUDfZcwvQqYiarYW4dqFKqT3IRjV9tEweJf9rt9dj1rYmgB0+PXzEgCh0DKfgoORdgORKo0X1f6CVxlHaZVhmwjk3BzhcM+HfZ6sXw0nEFI8z1A0ZrCnxNOiCLinfkwRpHdACuPY3g="
        ],
        "ARC-Message-Signature": [
            "i=2; a=rsa-sha256; d=ozlabs.org; s=201707;\n\tt=1774592787; c=relaxed/relaxed;\n\tbh=AuswcUODFcjfkuCW6IvHw2LNaByAD11L1gbTzdzZTFM=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=uLFtS14uK5a2U2W672i9rQIYQS6M/QM0A8+TSR6K7F0oxzhqqDT7BLVWpNM4/3TuVj2+gYUxQbrJBIA7YlcIaWltOPG9pdZ/WgfvL4dgPRBqtuRNhUGq5TasgkMkfV96X4sOLpZJkjzYHI9MTNsXW8PNVsbtokyqpRRDvievjr73uzBsEObVxm5TqsrCIuJZVzmip2VTPg7uFoWL6dJqktYmvsG3mGHF+52ud5GJCY/5QB5/pE9WkS0qnVuwUpLAJiC9y/HQtTAGIord4zoyIqBKH25Nh9ouYpqoa8zd2B2IMEO5BkkSdkkqNpA7CFE+t9X/IBiyxoV9zpf+CKkmfQ==",
            "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1774592422; c=relaxed/simple;\n\tbh=7tm/I+ToBtGzhPxAelbzye3gAUwCUmdECLbEfmikNmA=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=PA+Mb2QuSEnfDpXe5AeFjWEJtZP8pmsdsXQXPkyi1XZcKHbjkYKjybKowQSp8/O/fOW0B8c1gXXBjL8xrLRAprk9LL3PpkOsdjvM4sqJjBX+E0jtrxXuv81dV4DeDELGGPac6o8WmFeSyPTBrUbAy+QOMu3Lne9tQg2L/A9Cxvg="
        ],
        "ARC-Authentication-Results": [
            "i=2; gandalf.ozlabs.org;\n dmarc=fail (p=none dis=none) header.from=lst.de; dkim=pass (2048-bit key;\n secure) header.d=infradead.org header.i=@infradead.org header.a=rsa-sha256\n header.s=bombadil.20210309 header.b=TKToHgEa; dkim-atps=neutral;\n spf=pass (client-ip=172.105.105.114; helo=tor.lore.kernel.org;\n envelope-from=sparclinux+bounces-6585-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org) smtp.mailfrom=vger.kernel.org",
            "i=1; smtp.subspace.kernel.org;\n dmarc=fail (p=none dis=none) header.from=lst.de;\n spf=none smtp.mailfrom=bombadil.srs.infradead.org;\n dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org\n header.b=TKToHgEa; arc=none smtp.client-ip=198.137.202.133"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding:\n\tMIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender\n\t:Reply-To:Content-Type:Content-ID:Content-Description;\n\tbh=AuswcUODFcjfkuCW6IvHw2LNaByAD11L1gbTzdzZTFM=; b=TKToHgEaJk1ZXAIER646HkN/4M\n\tSTC+XqfsXiZ9WKbYZxhRMdF1JS+8O2ihGMwVely3dAYzfQePGgfJyx1KVZ6YfVKTCq0Ixg30DUeLL\n\t9qmjw52U2sxBMMpr9tnR5aAAk1eBlZ4vAmqZ/vaZ5wo+8UJSyQp/kaH7RDj1gUuj4FkBLqaU3KdkO\n\tn9gZ8pU4jSX5ooMpQZjriSfWmD0oZyyebIxK7WdJM7q08tLOtjqrP00GwZu24LK0tZujZM8b73pmT\n\tB+6WF57l3IJ1vneU4+OEFrZYaMeKm3nfqeq/Ne9hPF/UuQftPF2JZ0VWkGWelqpHNY5dV7PGlBn7v\n\t7l1GM11Q==;",
        "From": "Christoph Hellwig <hch@lst.de>",
        "To": "Andrew Morton <akpm@linux-foundation.org>",
        "Cc": "Richard Henderson <richard.henderson@linaro.org>,\n\tMatt Turner <mattst88@gmail.com>,\n\tMagnus Lindholm <linmag7@gmail.com>,\n\tRussell King <linux@armlinux.org.uk>,\n\tCatalin Marinas <catalin.marinas@arm.com>,\n\tWill Deacon <will@kernel.org>,\n\tArd Biesheuvel <ardb@kernel.org>,\n\tHuacai Chen <chenhuacai@kernel.org>,\n\tWANG Xuerui <kernel@xen0n.name>,\n\tMadhavan Srinivasan <maddy@linux.ibm.com>,\n\tMichael Ellerman <mpe@ellerman.id.au>,\n\tNicholas Piggin <npiggin@gmail.com>,\n\t\"Christophe Leroy (CS GROUP)\" <chleroy@kernel.org>,\n\tPaul Walmsley <pjw@kernel.org>,\n\tPalmer Dabbelt <palmer@dabbelt.com>,\n\tAlbert Ou <aou@eecs.berkeley.edu>,\n\tAlexandre Ghiti <alex@ghiti.fr>,\n\tHeiko Carstens <hca@linux.ibm.com>,\n\tVasily Gorbik <gor@linux.ibm.com>,\n\tAlexander Gordeev <agordeev@linux.ibm.com>,\n\tChristian Borntraeger <borntraeger@linux.ibm.com>,\n\tSven Schnelle <svens@linux.ibm.com>,\n\t\"David S. Miller\" <davem@davemloft.net>,\n\tAndreas Larsson <andreas@gaisler.com>,\n\tRichard Weinberger <richard@nod.at>,\n\tAnton Ivanov <anton.ivanov@cambridgegreys.com>,\n\tJohannes Berg <johannes@sipsolutions.net>,\n\tThomas Gleixner <tglx@kernel.org>,\n\tIngo Molnar <mingo@redhat.com>,\n\tBorislav Petkov <bp@alien8.de>,\n\tDave Hansen <dave.hansen@linux.intel.com>,\n\tx86@kernel.org,\n\t\"H. Peter Anvin\" <hpa@zytor.com>,\n\tHerbert Xu <herbert@gondor.apana.org.au>,\n\tDan Williams <dan.j.williams@intel.com>,\n\tChris Mason <clm@fb.com>,\n\tDavid Sterba <dsterba@suse.com>,\n\tArnd Bergmann <arnd@arndb.de>,\n\tSong Liu <song@kernel.org>,\n\tYu Kuai <yukuai@fnnas.com>,\n\tLi Nan <linan122@huawei.com>,\n\t\"Theodore Ts'o\" <tytso@mit.edu>,\n\t\"Jason A. Donenfeld\" <Jason@zx2c4.com>,\n\tlinux-alpha@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org,\n\tlinux-arm-kernel@lists.infradead.org,\n\tloongarch@lists.linux.dev,\n\tlinuxppc-dev@lists.ozlabs.org,\n\tlinux-riscv@lists.infradead.org,\n\tlinux-s390@vger.kernel.org,\n\tsparclinux@vger.kernel.org,\n\tlinux-um@lists.infradead.org,\n\tlinux-crypto@vger.kernel.org,\n\tlinux-btrfs@vger.kernel.org,\n\tlinux-arch@vger.kernel.org,\n\tlinux-raid@vger.kernel.org",
        "Subject": "[PATCH 10/28] xor: move generic implementations out of\n asm-generic/xor.h",
        "Date": "Fri, 27 Mar 2026 07:16:42 +0100",
        "Message-ID": "<20260327061704.3707577-11-hch@lst.de>",
        "X-Mailer": "git-send-email 2.47.3",
        "In-Reply-To": "<20260327061704.3707577-1-hch@lst.de>",
        "References": "<20260327061704.3707577-1-hch@lst.de>",
        "Precedence": "bulk",
        "X-Mailing-List": "sparclinux@vger.kernel.org",
        "List-Id": "<sparclinux.vger.kernel.org>",
        "List-Subscribe": "<mailto:sparclinux+subscribe@vger.kernel.org>",
        "List-Unsubscribe": "<mailto:sparclinux+unsubscribe@vger.kernel.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-SRS-Rewrite": "SMTP reverse-path rewritten from <hch@infradead.org> by\n bombadil.infradead.org. See http://www.infradead.org/rpr.html",
        "X-Spam-Status": "No, score=-0.2 required=5.0 tests=ARC_SIGNED,ARC_VALID,\n\tDKIM_SIGNED,DKIM_VALID,DMARC_NONE,HEADER_FROM_DIFFERENT_DOMAINS,\n\tMAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=disabled\n\tversion=4.0.1",
        "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on gandalf.ozlabs.org"
    },
    "content": "Move the generic implementations from asm-generic/xor.h to\nper-implementaion .c files in lib/raid.  This will build them\nunconditionally even when an architecture forces a specific\nimplementation, but as we'll need at least one generic version\nfor the static_call optimization later on we'll pay that price.\n\nNote that this would cause the second xor_block_8regs instance created by\narch/arm/lib/xor-neon.c to be generated instead of discarded as dead\ncode, so add a NO_TEMPLATE symbol to disable it for this case.\n\nSigned-off-by: Christoph Hellwig <hch@lst.de>\n---\n arch/arm/lib/xor-neon.c            |   4 +-\n include/asm-generic/xor.h          | 727 +----------------------------\n lib/raid/xor/Makefile              |   4 +\n lib/raid/xor/xor-32regs-prefetch.c | 268 +++++++++++\n lib/raid/xor/xor-32regs.c          | 219 +++++++++\n lib/raid/xor/xor-8regs-prefetch.c  | 146 ++++++\n lib/raid/xor/xor-8regs.c           | 105 +++++\n 7 files changed, 748 insertions(+), 725 deletions(-)\n create mode 100644 lib/raid/xor/xor-32regs-prefetch.c\n create mode 100644 lib/raid/xor/xor-32regs.c\n create mode 100644 lib/raid/xor/xor-8regs-prefetch.c\n create mode 100644 lib/raid/xor/xor-8regs.c",
    "diff": "diff --git a/arch/arm/lib/xor-neon.c b/arch/arm/lib/xor-neon.c\nindex 282980b9bf2a..b5be50567991 100644\n--- a/arch/arm/lib/xor-neon.c\n+++ b/arch/arm/lib/xor-neon.c\n@@ -26,8 +26,8 @@ MODULE_LICENSE(\"GPL\");\n #pragma GCC optimize \"tree-vectorize\"\n #endif\n \n-#pragma GCC diagnostic ignored \"-Wunused-variable\"\n-#include <asm-generic/xor.h>\n+#define NO_TEMPLATE\n+#include \"../../../lib/raid/xor/xor-8regs.c\"\n \n struct xor_block_template const xor_block_neon_inner = {\n \t.name\t= \"__inner_neon__\",\ndiff --git a/include/asm-generic/xor.h b/include/asm-generic/xor.h\nindex 79c0096aa9d9..fc151fdc45ab 100644\n--- a/include/asm-generic/xor.h\n+++ b/include/asm-generic/xor.h\n@@ -5,726 +5,7 @@\n  * Generic optimized RAID-5 checksumming functions.\n  */\n \n-#include <linux/prefetch.h>\n-\n-static void\n-xor_8regs_2(unsigned long bytes, unsigned long * __restrict p1,\n-\t    const unsigned long * __restrict p2)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8;\n-\n-\tdo {\n-\t\tp1[0] ^= p2[0];\n-\t\tp1[1] ^= p2[1];\n-\t\tp1[2] ^= p2[2];\n-\t\tp1[3] ^= p2[3];\n-\t\tp1[4] ^= p2[4];\n-\t\tp1[5] ^= p2[5];\n-\t\tp1[6] ^= p2[6];\n-\t\tp1[7] ^= p2[7];\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t} while (--lines > 0);\n-}\n-\n-static void\n-xor_8regs_3(unsigned long bytes, unsigned long * __restrict p1,\n-\t    const unsigned long * __restrict p2,\n-\t    const unsigned long * __restrict p3)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8;\n-\n-\tdo {\n-\t\tp1[0] ^= p2[0] ^ p3[0];\n-\t\tp1[1] ^= p2[1] ^ p3[1];\n-\t\tp1[2] ^= p2[2] ^ p3[2];\n-\t\tp1[3] ^= p2[3] ^ p3[3];\n-\t\tp1[4] ^= p2[4] ^ p3[4];\n-\t\tp1[5] ^= p2[5] ^ p3[5];\n-\t\tp1[6] ^= p2[6] ^ p3[6];\n-\t\tp1[7] ^= p2[7] ^ p3[7];\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t\tp3 += 8;\n-\t} while (--lines > 0);\n-}\n-\n-static void\n-xor_8regs_4(unsigned long bytes, unsigned long * __restrict p1,\n-\t    const unsigned long * __restrict p2,\n-\t    const unsigned long * __restrict p3,\n-\t    const unsigned long * __restrict p4)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8;\n-\n-\tdo {\n-\t\tp1[0] ^= p2[0] ^ p3[0] ^ p4[0];\n-\t\tp1[1] ^= p2[1] ^ p3[1] ^ p4[1];\n-\t\tp1[2] ^= p2[2] ^ p3[2] ^ p4[2];\n-\t\tp1[3] ^= p2[3] ^ p3[3] ^ p4[3];\n-\t\tp1[4] ^= p2[4] ^ p3[4] ^ p4[4];\n-\t\tp1[5] ^= p2[5] ^ p3[5] ^ p4[5];\n-\t\tp1[6] ^= p2[6] ^ p3[6] ^ p4[6];\n-\t\tp1[7] ^= p2[7] ^ p3[7] ^ p4[7];\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t\tp3 += 8;\n-\t\tp4 += 8;\n-\t} while (--lines > 0);\n-}\n-\n-static void\n-xor_8regs_5(unsigned long bytes, unsigned long * __restrict p1,\n-\t    const unsigned long * __restrict p2,\n-\t    const unsigned long * __restrict p3,\n-\t    const unsigned long * __restrict p4,\n-\t    const unsigned long * __restrict p5)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8;\n-\n-\tdo {\n-\t\tp1[0] ^= p2[0] ^ p3[0] ^ p4[0] ^ p5[0];\n-\t\tp1[1] ^= p2[1] ^ p3[1] ^ p4[1] ^ p5[1];\n-\t\tp1[2] ^= p2[2] ^ p3[2] ^ p4[2] ^ p5[2];\n-\t\tp1[3] ^= p2[3] ^ p3[3] ^ p4[3] ^ p5[3];\n-\t\tp1[4] ^= p2[4] ^ p3[4] ^ p4[4] ^ p5[4];\n-\t\tp1[5] ^= p2[5] ^ p3[5] ^ p4[5] ^ p5[5];\n-\t\tp1[6] ^= p2[6] ^ p3[6] ^ p4[6] ^ p5[6];\n-\t\tp1[7] ^= p2[7] ^ p3[7] ^ p4[7] ^ p5[7];\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t\tp3 += 8;\n-\t\tp4 += 8;\n-\t\tp5 += 8;\n-\t} while (--lines > 0);\n-}\n-\n-static void\n-xor_32regs_2(unsigned long bytes, unsigned long * __restrict p1,\n-\t     const unsigned long * __restrict p2)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8;\n-\n-\tdo {\n-\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n-\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n-\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n-\t\td2 = p1[2];\n-\t\td3 = p1[3];\n-\t\td4 = p1[4];\n-\t\td5 = p1[5];\n-\t\td6 = p1[6];\n-\t\td7 = p1[7];\n-\t\td0 ^= p2[0];\n-\t\td1 ^= p2[1];\n-\t\td2 ^= p2[2];\n-\t\td3 ^= p2[3];\n-\t\td4 ^= p2[4];\n-\t\td5 ^= p2[5];\n-\t\td6 ^= p2[6];\n-\t\td7 ^= p2[7];\n-\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n-\t\tp1[1] = d1;\n-\t\tp1[2] = d2;\n-\t\tp1[3] = d3;\n-\t\tp1[4] = d4;\n-\t\tp1[5] = d5;\n-\t\tp1[6] = d6;\n-\t\tp1[7] = d7;\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t} while (--lines > 0);\n-}\n-\n-static void\n-xor_32regs_3(unsigned long bytes, unsigned long * __restrict p1,\n-\t     const unsigned long * __restrict p2,\n-\t     const unsigned long * __restrict p3)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8;\n-\n-\tdo {\n-\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n-\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n-\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n-\t\td2 = p1[2];\n-\t\td3 = p1[3];\n-\t\td4 = p1[4];\n-\t\td5 = p1[5];\n-\t\td6 = p1[6];\n-\t\td7 = p1[7];\n-\t\td0 ^= p2[0];\n-\t\td1 ^= p2[1];\n-\t\td2 ^= p2[2];\n-\t\td3 ^= p2[3];\n-\t\td4 ^= p2[4];\n-\t\td5 ^= p2[5];\n-\t\td6 ^= p2[6];\n-\t\td7 ^= p2[7];\n-\t\td0 ^= p3[0];\n-\t\td1 ^= p3[1];\n-\t\td2 ^= p3[2];\n-\t\td3 ^= p3[3];\n-\t\td4 ^= p3[4];\n-\t\td5 ^= p3[5];\n-\t\td6 ^= p3[6];\n-\t\td7 ^= p3[7];\n-\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n-\t\tp1[1] = d1;\n-\t\tp1[2] = d2;\n-\t\tp1[3] = d3;\n-\t\tp1[4] = d4;\n-\t\tp1[5] = d5;\n-\t\tp1[6] = d6;\n-\t\tp1[7] = d7;\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t\tp3 += 8;\n-\t} while (--lines > 0);\n-}\n-\n-static void\n-xor_32regs_4(unsigned long bytes, unsigned long * __restrict p1,\n-\t     const unsigned long * __restrict p2,\n-\t     const unsigned long * __restrict p3,\n-\t     const unsigned long * __restrict p4)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8;\n-\n-\tdo {\n-\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n-\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n-\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n-\t\td2 = p1[2];\n-\t\td3 = p1[3];\n-\t\td4 = p1[4];\n-\t\td5 = p1[5];\n-\t\td6 = p1[6];\n-\t\td7 = p1[7];\n-\t\td0 ^= p2[0];\n-\t\td1 ^= p2[1];\n-\t\td2 ^= p2[2];\n-\t\td3 ^= p2[3];\n-\t\td4 ^= p2[4];\n-\t\td5 ^= p2[5];\n-\t\td6 ^= p2[6];\n-\t\td7 ^= p2[7];\n-\t\td0 ^= p3[0];\n-\t\td1 ^= p3[1];\n-\t\td2 ^= p3[2];\n-\t\td3 ^= p3[3];\n-\t\td4 ^= p3[4];\n-\t\td5 ^= p3[5];\n-\t\td6 ^= p3[6];\n-\t\td7 ^= p3[7];\n-\t\td0 ^= p4[0];\n-\t\td1 ^= p4[1];\n-\t\td2 ^= p4[2];\n-\t\td3 ^= p4[3];\n-\t\td4 ^= p4[4];\n-\t\td5 ^= p4[5];\n-\t\td6 ^= p4[6];\n-\t\td7 ^= p4[7];\n-\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n-\t\tp1[1] = d1;\n-\t\tp1[2] = d2;\n-\t\tp1[3] = d3;\n-\t\tp1[4] = d4;\n-\t\tp1[5] = d5;\n-\t\tp1[6] = d6;\n-\t\tp1[7] = d7;\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t\tp3 += 8;\n-\t\tp4 += 8;\n-\t} while (--lines > 0);\n-}\n-\n-static void\n-xor_32regs_5(unsigned long bytes, unsigned long * __restrict p1,\n-\t     const unsigned long * __restrict p2,\n-\t     const unsigned long * __restrict p3,\n-\t     const unsigned long * __restrict p4,\n-\t     const unsigned long * __restrict p5)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8;\n-\n-\tdo {\n-\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n-\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n-\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n-\t\td2 = p1[2];\n-\t\td3 = p1[3];\n-\t\td4 = p1[4];\n-\t\td5 = p1[5];\n-\t\td6 = p1[6];\n-\t\td7 = p1[7];\n-\t\td0 ^= p2[0];\n-\t\td1 ^= p2[1];\n-\t\td2 ^= p2[2];\n-\t\td3 ^= p2[3];\n-\t\td4 ^= p2[4];\n-\t\td5 ^= p2[5];\n-\t\td6 ^= p2[6];\n-\t\td7 ^= p2[7];\n-\t\td0 ^= p3[0];\n-\t\td1 ^= p3[1];\n-\t\td2 ^= p3[2];\n-\t\td3 ^= p3[3];\n-\t\td4 ^= p3[4];\n-\t\td5 ^= p3[5];\n-\t\td6 ^= p3[6];\n-\t\td7 ^= p3[7];\n-\t\td0 ^= p4[0];\n-\t\td1 ^= p4[1];\n-\t\td2 ^= p4[2];\n-\t\td3 ^= p4[3];\n-\t\td4 ^= p4[4];\n-\t\td5 ^= p4[5];\n-\t\td6 ^= p4[6];\n-\t\td7 ^= p4[7];\n-\t\td0 ^= p5[0];\n-\t\td1 ^= p5[1];\n-\t\td2 ^= p5[2];\n-\t\td3 ^= p5[3];\n-\t\td4 ^= p5[4];\n-\t\td5 ^= p5[5];\n-\t\td6 ^= p5[6];\n-\t\td7 ^= p5[7];\n-\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n-\t\tp1[1] = d1;\n-\t\tp1[2] = d2;\n-\t\tp1[3] = d3;\n-\t\tp1[4] = d4;\n-\t\tp1[5] = d5;\n-\t\tp1[6] = d6;\n-\t\tp1[7] = d7;\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t\tp3 += 8;\n-\t\tp4 += 8;\n-\t\tp5 += 8;\n-\t} while (--lines > 0);\n-}\n-\n-static void\n-xor_8regs_p_2(unsigned long bytes, unsigned long * __restrict p1,\n-\t      const unsigned long * __restrict p2)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n-\tprefetchw(p1);\n-\tprefetch(p2);\n-\n-\tdo {\n-\t\tprefetchw(p1+8);\n-\t\tprefetch(p2+8);\n- once_more:\n-\t\tp1[0] ^= p2[0];\n-\t\tp1[1] ^= p2[1];\n-\t\tp1[2] ^= p2[2];\n-\t\tp1[3] ^= p2[3];\n-\t\tp1[4] ^= p2[4];\n-\t\tp1[5] ^= p2[5];\n-\t\tp1[6] ^= p2[6];\n-\t\tp1[7] ^= p2[7];\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t} while (--lines > 0);\n-\tif (lines == 0)\n-\t\tgoto once_more;\n-}\n-\n-static void\n-xor_8regs_p_3(unsigned long bytes, unsigned long * __restrict p1,\n-\t      const unsigned long * __restrict p2,\n-\t      const unsigned long * __restrict p3)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n-\tprefetchw(p1);\n-\tprefetch(p2);\n-\tprefetch(p3);\n-\n-\tdo {\n-\t\tprefetchw(p1+8);\n-\t\tprefetch(p2+8);\n-\t\tprefetch(p3+8);\n- once_more:\n-\t\tp1[0] ^= p2[0] ^ p3[0];\n-\t\tp1[1] ^= p2[1] ^ p3[1];\n-\t\tp1[2] ^= p2[2] ^ p3[2];\n-\t\tp1[3] ^= p2[3] ^ p3[3];\n-\t\tp1[4] ^= p2[4] ^ p3[4];\n-\t\tp1[5] ^= p2[5] ^ p3[5];\n-\t\tp1[6] ^= p2[6] ^ p3[6];\n-\t\tp1[7] ^= p2[7] ^ p3[7];\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t\tp3 += 8;\n-\t} while (--lines > 0);\n-\tif (lines == 0)\n-\t\tgoto once_more;\n-}\n-\n-static void\n-xor_8regs_p_4(unsigned long bytes, unsigned long * __restrict p1,\n-\t      const unsigned long * __restrict p2,\n-\t      const unsigned long * __restrict p3,\n-\t      const unsigned long * __restrict p4)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n-\n-\tprefetchw(p1);\n-\tprefetch(p2);\n-\tprefetch(p3);\n-\tprefetch(p4);\n-\n-\tdo {\n-\t\tprefetchw(p1+8);\n-\t\tprefetch(p2+8);\n-\t\tprefetch(p3+8);\n-\t\tprefetch(p4+8);\n- once_more:\n-\t\tp1[0] ^= p2[0] ^ p3[0] ^ p4[0];\n-\t\tp1[1] ^= p2[1] ^ p3[1] ^ p4[1];\n-\t\tp1[2] ^= p2[2] ^ p3[2] ^ p4[2];\n-\t\tp1[3] ^= p2[3] ^ p3[3] ^ p4[3];\n-\t\tp1[4] ^= p2[4] ^ p3[4] ^ p4[4];\n-\t\tp1[5] ^= p2[5] ^ p3[5] ^ p4[5];\n-\t\tp1[6] ^= p2[6] ^ p3[6] ^ p4[6];\n-\t\tp1[7] ^= p2[7] ^ p3[7] ^ p4[7];\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t\tp3 += 8;\n-\t\tp4 += 8;\n-\t} while (--lines > 0);\n-\tif (lines == 0)\n-\t\tgoto once_more;\n-}\n-\n-static void\n-xor_8regs_p_5(unsigned long bytes, unsigned long * __restrict p1,\n-\t      const unsigned long * __restrict p2,\n-\t      const unsigned long * __restrict p3,\n-\t      const unsigned long * __restrict p4,\n-\t      const unsigned long * __restrict p5)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n-\n-\tprefetchw(p1);\n-\tprefetch(p2);\n-\tprefetch(p3);\n-\tprefetch(p4);\n-\tprefetch(p5);\n-\n-\tdo {\n-\t\tprefetchw(p1+8);\n-\t\tprefetch(p2+8);\n-\t\tprefetch(p3+8);\n-\t\tprefetch(p4+8);\n-\t\tprefetch(p5+8);\n- once_more:\n-\t\tp1[0] ^= p2[0] ^ p3[0] ^ p4[0] ^ p5[0];\n-\t\tp1[1] ^= p2[1] ^ p3[1] ^ p4[1] ^ p5[1];\n-\t\tp1[2] ^= p2[2] ^ p3[2] ^ p4[2] ^ p5[2];\n-\t\tp1[3] ^= p2[3] ^ p3[3] ^ p4[3] ^ p5[3];\n-\t\tp1[4] ^= p2[4] ^ p3[4] ^ p4[4] ^ p5[4];\n-\t\tp1[5] ^= p2[5] ^ p3[5] ^ p4[5] ^ p5[5];\n-\t\tp1[6] ^= p2[6] ^ p3[6] ^ p4[6] ^ p5[6];\n-\t\tp1[7] ^= p2[7] ^ p3[7] ^ p4[7] ^ p5[7];\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t\tp3 += 8;\n-\t\tp4 += 8;\n-\t\tp5 += 8;\n-\t} while (--lines > 0);\n-\tif (lines == 0)\n-\t\tgoto once_more;\n-}\n-\n-static void\n-xor_32regs_p_2(unsigned long bytes, unsigned long * __restrict p1,\n-\t       const unsigned long * __restrict p2)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n-\n-\tprefetchw(p1);\n-\tprefetch(p2);\n-\n-\tdo {\n-\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n-\n-\t\tprefetchw(p1+8);\n-\t\tprefetch(p2+8);\n- once_more:\n-\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n-\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n-\t\td2 = p1[2];\n-\t\td3 = p1[3];\n-\t\td4 = p1[4];\n-\t\td5 = p1[5];\n-\t\td6 = p1[6];\n-\t\td7 = p1[7];\n-\t\td0 ^= p2[0];\n-\t\td1 ^= p2[1];\n-\t\td2 ^= p2[2];\n-\t\td3 ^= p2[3];\n-\t\td4 ^= p2[4];\n-\t\td5 ^= p2[5];\n-\t\td6 ^= p2[6];\n-\t\td7 ^= p2[7];\n-\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n-\t\tp1[1] = d1;\n-\t\tp1[2] = d2;\n-\t\tp1[3] = d3;\n-\t\tp1[4] = d4;\n-\t\tp1[5] = d5;\n-\t\tp1[6] = d6;\n-\t\tp1[7] = d7;\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t} while (--lines > 0);\n-\tif (lines == 0)\n-\t\tgoto once_more;\n-}\n-\n-static void\n-xor_32regs_p_3(unsigned long bytes, unsigned long * __restrict p1,\n-\t       const unsigned long * __restrict p2,\n-\t       const unsigned long * __restrict p3)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n-\n-\tprefetchw(p1);\n-\tprefetch(p2);\n-\tprefetch(p3);\n-\n-\tdo {\n-\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n-\n-\t\tprefetchw(p1+8);\n-\t\tprefetch(p2+8);\n-\t\tprefetch(p3+8);\n- once_more:\n-\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n-\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n-\t\td2 = p1[2];\n-\t\td3 = p1[3];\n-\t\td4 = p1[4];\n-\t\td5 = p1[5];\n-\t\td6 = p1[6];\n-\t\td7 = p1[7];\n-\t\td0 ^= p2[0];\n-\t\td1 ^= p2[1];\n-\t\td2 ^= p2[2];\n-\t\td3 ^= p2[3];\n-\t\td4 ^= p2[4];\n-\t\td5 ^= p2[5];\n-\t\td6 ^= p2[6];\n-\t\td7 ^= p2[7];\n-\t\td0 ^= p3[0];\n-\t\td1 ^= p3[1];\n-\t\td2 ^= p3[2];\n-\t\td3 ^= p3[3];\n-\t\td4 ^= p3[4];\n-\t\td5 ^= p3[5];\n-\t\td6 ^= p3[6];\n-\t\td7 ^= p3[7];\n-\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n-\t\tp1[1] = d1;\n-\t\tp1[2] = d2;\n-\t\tp1[3] = d3;\n-\t\tp1[4] = d4;\n-\t\tp1[5] = d5;\n-\t\tp1[6] = d6;\n-\t\tp1[7] = d7;\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t\tp3 += 8;\n-\t} while (--lines > 0);\n-\tif (lines == 0)\n-\t\tgoto once_more;\n-}\n-\n-static void\n-xor_32regs_p_4(unsigned long bytes, unsigned long * __restrict p1,\n-\t       const unsigned long * __restrict p2,\n-\t       const unsigned long * __restrict p3,\n-\t       const unsigned long * __restrict p4)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n-\n-\tprefetchw(p1);\n-\tprefetch(p2);\n-\tprefetch(p3);\n-\tprefetch(p4);\n-\n-\tdo {\n-\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n-\n-\t\tprefetchw(p1+8);\n-\t\tprefetch(p2+8);\n-\t\tprefetch(p3+8);\n-\t\tprefetch(p4+8);\n- once_more:\n-\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n-\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n-\t\td2 = p1[2];\n-\t\td3 = p1[3];\n-\t\td4 = p1[4];\n-\t\td5 = p1[5];\n-\t\td6 = p1[6];\n-\t\td7 = p1[7];\n-\t\td0 ^= p2[0];\n-\t\td1 ^= p2[1];\n-\t\td2 ^= p2[2];\n-\t\td3 ^= p2[3];\n-\t\td4 ^= p2[4];\n-\t\td5 ^= p2[5];\n-\t\td6 ^= p2[6];\n-\t\td7 ^= p2[7];\n-\t\td0 ^= p3[0];\n-\t\td1 ^= p3[1];\n-\t\td2 ^= p3[2];\n-\t\td3 ^= p3[3];\n-\t\td4 ^= p3[4];\n-\t\td5 ^= p3[5];\n-\t\td6 ^= p3[6];\n-\t\td7 ^= p3[7];\n-\t\td0 ^= p4[0];\n-\t\td1 ^= p4[1];\n-\t\td2 ^= p4[2];\n-\t\td3 ^= p4[3];\n-\t\td4 ^= p4[4];\n-\t\td5 ^= p4[5];\n-\t\td6 ^= p4[6];\n-\t\td7 ^= p4[7];\n-\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n-\t\tp1[1] = d1;\n-\t\tp1[2] = d2;\n-\t\tp1[3] = d3;\n-\t\tp1[4] = d4;\n-\t\tp1[5] = d5;\n-\t\tp1[6] = d6;\n-\t\tp1[7] = d7;\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t\tp3 += 8;\n-\t\tp4 += 8;\n-\t} while (--lines > 0);\n-\tif (lines == 0)\n-\t\tgoto once_more;\n-}\n-\n-static void\n-xor_32regs_p_5(unsigned long bytes, unsigned long * __restrict p1,\n-\t       const unsigned long * __restrict p2,\n-\t       const unsigned long * __restrict p3,\n-\t       const unsigned long * __restrict p4,\n-\t       const unsigned long * __restrict p5)\n-{\n-\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n-\n-\tprefetchw(p1);\n-\tprefetch(p2);\n-\tprefetch(p3);\n-\tprefetch(p4);\n-\tprefetch(p5);\n-\n-\tdo {\n-\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n-\n-\t\tprefetchw(p1+8);\n-\t\tprefetch(p2+8);\n-\t\tprefetch(p3+8);\n-\t\tprefetch(p4+8);\n-\t\tprefetch(p5+8);\n- once_more:\n-\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n-\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n-\t\td2 = p1[2];\n-\t\td3 = p1[3];\n-\t\td4 = p1[4];\n-\t\td5 = p1[5];\n-\t\td6 = p1[6];\n-\t\td7 = p1[7];\n-\t\td0 ^= p2[0];\n-\t\td1 ^= p2[1];\n-\t\td2 ^= p2[2];\n-\t\td3 ^= p2[3];\n-\t\td4 ^= p2[4];\n-\t\td5 ^= p2[5];\n-\t\td6 ^= p2[6];\n-\t\td7 ^= p2[7];\n-\t\td0 ^= p3[0];\n-\t\td1 ^= p3[1];\n-\t\td2 ^= p3[2];\n-\t\td3 ^= p3[3];\n-\t\td4 ^= p3[4];\n-\t\td5 ^= p3[5];\n-\t\td6 ^= p3[6];\n-\t\td7 ^= p3[7];\n-\t\td0 ^= p4[0];\n-\t\td1 ^= p4[1];\n-\t\td2 ^= p4[2];\n-\t\td3 ^= p4[3];\n-\t\td4 ^= p4[4];\n-\t\td5 ^= p4[5];\n-\t\td6 ^= p4[6];\n-\t\td7 ^= p4[7];\n-\t\td0 ^= p5[0];\n-\t\td1 ^= p5[1];\n-\t\td2 ^= p5[2];\n-\t\td3 ^= p5[3];\n-\t\td4 ^= p5[4];\n-\t\td5 ^= p5[5];\n-\t\td6 ^= p5[6];\n-\t\td7 ^= p5[7];\n-\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n-\t\tp1[1] = d1;\n-\t\tp1[2] = d2;\n-\t\tp1[3] = d3;\n-\t\tp1[4] = d4;\n-\t\tp1[5] = d5;\n-\t\tp1[6] = d6;\n-\t\tp1[7] = d7;\n-\t\tp1 += 8;\n-\t\tp2 += 8;\n-\t\tp3 += 8;\n-\t\tp4 += 8;\n-\t\tp5 += 8;\n-\t} while (--lines > 0);\n-\tif (lines == 0)\n-\t\tgoto once_more;\n-}\n-\n-static struct xor_block_template xor_block_8regs = {\n-\t.name = \"8regs\",\n-\t.do_2 = xor_8regs_2,\n-\t.do_3 = xor_8regs_3,\n-\t.do_4 = xor_8regs_4,\n-\t.do_5 = xor_8regs_5,\n-};\n-\n-static struct xor_block_template xor_block_32regs = {\n-\t.name = \"32regs\",\n-\t.do_2 = xor_32regs_2,\n-\t.do_3 = xor_32regs_3,\n-\t.do_4 = xor_32regs_4,\n-\t.do_5 = xor_32regs_5,\n-};\n-\n-static struct xor_block_template xor_block_8regs_p __maybe_unused = {\n-\t.name = \"8regs_prefetch\",\n-\t.do_2 = xor_8regs_p_2,\n-\t.do_3 = xor_8regs_p_3,\n-\t.do_4 = xor_8regs_p_4,\n-\t.do_5 = xor_8regs_p_5,\n-};\n-\n-static struct xor_block_template xor_block_32regs_p __maybe_unused = {\n-\t.name = \"32regs_prefetch\",\n-\t.do_2 = xor_32regs_p_2,\n-\t.do_3 = xor_32regs_p_3,\n-\t.do_4 = xor_32regs_p_4,\n-\t.do_5 = xor_32regs_p_5,\n-};\n+extern struct xor_block_template xor_block_8regs;\n+extern struct xor_block_template xor_block_32regs;\n+extern struct xor_block_template xor_block_8regs_p;\n+extern struct xor_block_template xor_block_32regs_p;\ndiff --git a/lib/raid/xor/Makefile b/lib/raid/xor/Makefile\nindex 7bca0ce8e90a..89a944c9f990 100644\n--- a/lib/raid/xor/Makefile\n+++ b/lib/raid/xor/Makefile\n@@ -3,3 +3,7 @@\n obj-$(CONFIG_XOR_BLOCKS)\t+= xor.o\n \n xor-y\t\t\t\t+= xor-core.o\n+xor-y\t\t\t\t+= xor-8regs.o\n+xor-y\t\t\t\t+= xor-32regs.o\n+xor-y\t\t\t\t+= xor-8regs-prefetch.o\n+xor-y\t\t\t\t+= xor-32regs-prefetch.o\ndiff --git a/lib/raid/xor/xor-32regs-prefetch.c b/lib/raid/xor/xor-32regs-prefetch.c\nnew file mode 100644\nindex 000000000000..8666c287f777\n--- /dev/null\n+++ b/lib/raid/xor/xor-32regs-prefetch.c\n@@ -0,0 +1,268 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+#include <linux/prefetch.h>\n+#include <linux/raid/xor_impl.h>\n+#include <asm-generic/xor.h>\n+\n+static void\n+xor_32regs_p_2(unsigned long bytes, unsigned long * __restrict p1,\n+\t       const unsigned long * __restrict p2)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n+\n+\tprefetchw(p1);\n+\tprefetch(p2);\n+\n+\tdo {\n+\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n+\n+\t\tprefetchw(p1+8);\n+\t\tprefetch(p2+8);\n+ once_more:\n+\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n+\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n+\t\td2 = p1[2];\n+\t\td3 = p1[3];\n+\t\td4 = p1[4];\n+\t\td5 = p1[5];\n+\t\td6 = p1[6];\n+\t\td7 = p1[7];\n+\t\td0 ^= p2[0];\n+\t\td1 ^= p2[1];\n+\t\td2 ^= p2[2];\n+\t\td3 ^= p2[3];\n+\t\td4 ^= p2[4];\n+\t\td5 ^= p2[5];\n+\t\td6 ^= p2[6];\n+\t\td7 ^= p2[7];\n+\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n+\t\tp1[1] = d1;\n+\t\tp1[2] = d2;\n+\t\tp1[3] = d3;\n+\t\tp1[4] = d4;\n+\t\tp1[5] = d5;\n+\t\tp1[6] = d6;\n+\t\tp1[7] = d7;\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t} while (--lines > 0);\n+\tif (lines == 0)\n+\t\tgoto once_more;\n+}\n+\n+static void\n+xor_32regs_p_3(unsigned long bytes, unsigned long * __restrict p1,\n+\t       const unsigned long * __restrict p2,\n+\t       const unsigned long * __restrict p3)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n+\n+\tprefetchw(p1);\n+\tprefetch(p2);\n+\tprefetch(p3);\n+\n+\tdo {\n+\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n+\n+\t\tprefetchw(p1+8);\n+\t\tprefetch(p2+8);\n+\t\tprefetch(p3+8);\n+ once_more:\n+\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n+\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n+\t\td2 = p1[2];\n+\t\td3 = p1[3];\n+\t\td4 = p1[4];\n+\t\td5 = p1[5];\n+\t\td6 = p1[6];\n+\t\td7 = p1[7];\n+\t\td0 ^= p2[0];\n+\t\td1 ^= p2[1];\n+\t\td2 ^= p2[2];\n+\t\td3 ^= p2[3];\n+\t\td4 ^= p2[4];\n+\t\td5 ^= p2[5];\n+\t\td6 ^= p2[6];\n+\t\td7 ^= p2[7];\n+\t\td0 ^= p3[0];\n+\t\td1 ^= p3[1];\n+\t\td2 ^= p3[2];\n+\t\td3 ^= p3[3];\n+\t\td4 ^= p3[4];\n+\t\td5 ^= p3[5];\n+\t\td6 ^= p3[6];\n+\t\td7 ^= p3[7];\n+\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n+\t\tp1[1] = d1;\n+\t\tp1[2] = d2;\n+\t\tp1[3] = d3;\n+\t\tp1[4] = d4;\n+\t\tp1[5] = d5;\n+\t\tp1[6] = d6;\n+\t\tp1[7] = d7;\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t\tp3 += 8;\n+\t} while (--lines > 0);\n+\tif (lines == 0)\n+\t\tgoto once_more;\n+}\n+\n+static void\n+xor_32regs_p_4(unsigned long bytes, unsigned long * __restrict p1,\n+\t       const unsigned long * __restrict p2,\n+\t       const unsigned long * __restrict p3,\n+\t       const unsigned long * __restrict p4)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n+\n+\tprefetchw(p1);\n+\tprefetch(p2);\n+\tprefetch(p3);\n+\tprefetch(p4);\n+\n+\tdo {\n+\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n+\n+\t\tprefetchw(p1+8);\n+\t\tprefetch(p2+8);\n+\t\tprefetch(p3+8);\n+\t\tprefetch(p4+8);\n+ once_more:\n+\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n+\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n+\t\td2 = p1[2];\n+\t\td3 = p1[3];\n+\t\td4 = p1[4];\n+\t\td5 = p1[5];\n+\t\td6 = p1[6];\n+\t\td7 = p1[7];\n+\t\td0 ^= p2[0];\n+\t\td1 ^= p2[1];\n+\t\td2 ^= p2[2];\n+\t\td3 ^= p2[3];\n+\t\td4 ^= p2[4];\n+\t\td5 ^= p2[5];\n+\t\td6 ^= p2[6];\n+\t\td7 ^= p2[7];\n+\t\td0 ^= p3[0];\n+\t\td1 ^= p3[1];\n+\t\td2 ^= p3[2];\n+\t\td3 ^= p3[3];\n+\t\td4 ^= p3[4];\n+\t\td5 ^= p3[5];\n+\t\td6 ^= p3[6];\n+\t\td7 ^= p3[7];\n+\t\td0 ^= p4[0];\n+\t\td1 ^= p4[1];\n+\t\td2 ^= p4[2];\n+\t\td3 ^= p4[3];\n+\t\td4 ^= p4[4];\n+\t\td5 ^= p4[5];\n+\t\td6 ^= p4[6];\n+\t\td7 ^= p4[7];\n+\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n+\t\tp1[1] = d1;\n+\t\tp1[2] = d2;\n+\t\tp1[3] = d3;\n+\t\tp1[4] = d4;\n+\t\tp1[5] = d5;\n+\t\tp1[6] = d6;\n+\t\tp1[7] = d7;\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t\tp3 += 8;\n+\t\tp4 += 8;\n+\t} while (--lines > 0);\n+\tif (lines == 0)\n+\t\tgoto once_more;\n+}\n+\n+static void\n+xor_32regs_p_5(unsigned long bytes, unsigned long * __restrict p1,\n+\t       const unsigned long * __restrict p2,\n+\t       const unsigned long * __restrict p3,\n+\t       const unsigned long * __restrict p4,\n+\t       const unsigned long * __restrict p5)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n+\n+\tprefetchw(p1);\n+\tprefetch(p2);\n+\tprefetch(p3);\n+\tprefetch(p4);\n+\tprefetch(p5);\n+\n+\tdo {\n+\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n+\n+\t\tprefetchw(p1+8);\n+\t\tprefetch(p2+8);\n+\t\tprefetch(p3+8);\n+\t\tprefetch(p4+8);\n+\t\tprefetch(p5+8);\n+ once_more:\n+\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n+\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n+\t\td2 = p1[2];\n+\t\td3 = p1[3];\n+\t\td4 = p1[4];\n+\t\td5 = p1[5];\n+\t\td6 = p1[6];\n+\t\td7 = p1[7];\n+\t\td0 ^= p2[0];\n+\t\td1 ^= p2[1];\n+\t\td2 ^= p2[2];\n+\t\td3 ^= p2[3];\n+\t\td4 ^= p2[4];\n+\t\td5 ^= p2[5];\n+\t\td6 ^= p2[6];\n+\t\td7 ^= p2[7];\n+\t\td0 ^= p3[0];\n+\t\td1 ^= p3[1];\n+\t\td2 ^= p3[2];\n+\t\td3 ^= p3[3];\n+\t\td4 ^= p3[4];\n+\t\td5 ^= p3[5];\n+\t\td6 ^= p3[6];\n+\t\td7 ^= p3[7];\n+\t\td0 ^= p4[0];\n+\t\td1 ^= p4[1];\n+\t\td2 ^= p4[2];\n+\t\td3 ^= p4[3];\n+\t\td4 ^= p4[4];\n+\t\td5 ^= p4[5];\n+\t\td6 ^= p4[6];\n+\t\td7 ^= p4[7];\n+\t\td0 ^= p5[0];\n+\t\td1 ^= p5[1];\n+\t\td2 ^= p5[2];\n+\t\td3 ^= p5[3];\n+\t\td4 ^= p5[4];\n+\t\td5 ^= p5[5];\n+\t\td6 ^= p5[6];\n+\t\td7 ^= p5[7];\n+\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n+\t\tp1[1] = d1;\n+\t\tp1[2] = d2;\n+\t\tp1[3] = d3;\n+\t\tp1[4] = d4;\n+\t\tp1[5] = d5;\n+\t\tp1[6] = d6;\n+\t\tp1[7] = d7;\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t\tp3 += 8;\n+\t\tp4 += 8;\n+\t\tp5 += 8;\n+\t} while (--lines > 0);\n+\tif (lines == 0)\n+\t\tgoto once_more;\n+}\n+\n+struct xor_block_template xor_block_32regs_p = {\n+\t.name = \"32regs_prefetch\",\n+\t.do_2 = xor_32regs_p_2,\n+\t.do_3 = xor_32regs_p_3,\n+\t.do_4 = xor_32regs_p_4,\n+\t.do_5 = xor_32regs_p_5,\n+};\ndiff --git a/lib/raid/xor/xor-32regs.c b/lib/raid/xor/xor-32regs.c\nnew file mode 100644\nindex 000000000000..58d4fac43eb4\n--- /dev/null\n+++ b/lib/raid/xor/xor-32regs.c\n@@ -0,0 +1,219 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+#include <linux/raid/xor_impl.h>\n+#include <asm-generic/xor.h>\n+\n+static void\n+xor_32regs_2(unsigned long bytes, unsigned long * __restrict p1,\n+\t     const unsigned long * __restrict p2)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8;\n+\n+\tdo {\n+\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n+\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n+\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n+\t\td2 = p1[2];\n+\t\td3 = p1[3];\n+\t\td4 = p1[4];\n+\t\td5 = p1[5];\n+\t\td6 = p1[6];\n+\t\td7 = p1[7];\n+\t\td0 ^= p2[0];\n+\t\td1 ^= p2[1];\n+\t\td2 ^= p2[2];\n+\t\td3 ^= p2[3];\n+\t\td4 ^= p2[4];\n+\t\td5 ^= p2[5];\n+\t\td6 ^= p2[6];\n+\t\td7 ^= p2[7];\n+\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n+\t\tp1[1] = d1;\n+\t\tp1[2] = d2;\n+\t\tp1[3] = d3;\n+\t\tp1[4] = d4;\n+\t\tp1[5] = d5;\n+\t\tp1[6] = d6;\n+\t\tp1[7] = d7;\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t} while (--lines > 0);\n+}\n+\n+static void\n+xor_32regs_3(unsigned long bytes, unsigned long * __restrict p1,\n+\t     const unsigned long * __restrict p2,\n+\t     const unsigned long * __restrict p3)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8;\n+\n+\tdo {\n+\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n+\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n+\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n+\t\td2 = p1[2];\n+\t\td3 = p1[3];\n+\t\td4 = p1[4];\n+\t\td5 = p1[5];\n+\t\td6 = p1[6];\n+\t\td7 = p1[7];\n+\t\td0 ^= p2[0];\n+\t\td1 ^= p2[1];\n+\t\td2 ^= p2[2];\n+\t\td3 ^= p2[3];\n+\t\td4 ^= p2[4];\n+\t\td5 ^= p2[5];\n+\t\td6 ^= p2[6];\n+\t\td7 ^= p2[7];\n+\t\td0 ^= p3[0];\n+\t\td1 ^= p3[1];\n+\t\td2 ^= p3[2];\n+\t\td3 ^= p3[3];\n+\t\td4 ^= p3[4];\n+\t\td5 ^= p3[5];\n+\t\td6 ^= p3[6];\n+\t\td7 ^= p3[7];\n+\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n+\t\tp1[1] = d1;\n+\t\tp1[2] = d2;\n+\t\tp1[3] = d3;\n+\t\tp1[4] = d4;\n+\t\tp1[5] = d5;\n+\t\tp1[6] = d6;\n+\t\tp1[7] = d7;\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t\tp3 += 8;\n+\t} while (--lines > 0);\n+}\n+\n+static void\n+xor_32regs_4(unsigned long bytes, unsigned long * __restrict p1,\n+\t     const unsigned long * __restrict p2,\n+\t     const unsigned long * __restrict p3,\n+\t     const unsigned long * __restrict p4)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8;\n+\n+\tdo {\n+\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n+\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n+\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n+\t\td2 = p1[2];\n+\t\td3 = p1[3];\n+\t\td4 = p1[4];\n+\t\td5 = p1[5];\n+\t\td6 = p1[6];\n+\t\td7 = p1[7];\n+\t\td0 ^= p2[0];\n+\t\td1 ^= p2[1];\n+\t\td2 ^= p2[2];\n+\t\td3 ^= p2[3];\n+\t\td4 ^= p2[4];\n+\t\td5 ^= p2[5];\n+\t\td6 ^= p2[6];\n+\t\td7 ^= p2[7];\n+\t\td0 ^= p3[0];\n+\t\td1 ^= p3[1];\n+\t\td2 ^= p3[2];\n+\t\td3 ^= p3[3];\n+\t\td4 ^= p3[4];\n+\t\td5 ^= p3[5];\n+\t\td6 ^= p3[6];\n+\t\td7 ^= p3[7];\n+\t\td0 ^= p4[0];\n+\t\td1 ^= p4[1];\n+\t\td2 ^= p4[2];\n+\t\td3 ^= p4[3];\n+\t\td4 ^= p4[4];\n+\t\td5 ^= p4[5];\n+\t\td6 ^= p4[6];\n+\t\td7 ^= p4[7];\n+\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n+\t\tp1[1] = d1;\n+\t\tp1[2] = d2;\n+\t\tp1[3] = d3;\n+\t\tp1[4] = d4;\n+\t\tp1[5] = d5;\n+\t\tp1[6] = d6;\n+\t\tp1[7] = d7;\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t\tp3 += 8;\n+\t\tp4 += 8;\n+\t} while (--lines > 0);\n+}\n+\n+static void\n+xor_32regs_5(unsigned long bytes, unsigned long * __restrict p1,\n+\t     const unsigned long * __restrict p2,\n+\t     const unsigned long * __restrict p3,\n+\t     const unsigned long * __restrict p4,\n+\t     const unsigned long * __restrict p5)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8;\n+\n+\tdo {\n+\t\tregister long d0, d1, d2, d3, d4, d5, d6, d7;\n+\t\td0 = p1[0];\t/* Pull the stuff into registers\t*/\n+\t\td1 = p1[1];\t/*  ... in bursts, if possible.\t\t*/\n+\t\td2 = p1[2];\n+\t\td3 = p1[3];\n+\t\td4 = p1[4];\n+\t\td5 = p1[5];\n+\t\td6 = p1[6];\n+\t\td7 = p1[7];\n+\t\td0 ^= p2[0];\n+\t\td1 ^= p2[1];\n+\t\td2 ^= p2[2];\n+\t\td3 ^= p2[3];\n+\t\td4 ^= p2[4];\n+\t\td5 ^= p2[5];\n+\t\td6 ^= p2[6];\n+\t\td7 ^= p2[7];\n+\t\td0 ^= p3[0];\n+\t\td1 ^= p3[1];\n+\t\td2 ^= p3[2];\n+\t\td3 ^= p3[3];\n+\t\td4 ^= p3[4];\n+\t\td5 ^= p3[5];\n+\t\td6 ^= p3[6];\n+\t\td7 ^= p3[7];\n+\t\td0 ^= p4[0];\n+\t\td1 ^= p4[1];\n+\t\td2 ^= p4[2];\n+\t\td3 ^= p4[3];\n+\t\td4 ^= p4[4];\n+\t\td5 ^= p4[5];\n+\t\td6 ^= p4[6];\n+\t\td7 ^= p4[7];\n+\t\td0 ^= p5[0];\n+\t\td1 ^= p5[1];\n+\t\td2 ^= p5[2];\n+\t\td3 ^= p5[3];\n+\t\td4 ^= p5[4];\n+\t\td5 ^= p5[5];\n+\t\td6 ^= p5[6];\n+\t\td7 ^= p5[7];\n+\t\tp1[0] = d0;\t/* Store the result (in bursts)\t\t*/\n+\t\tp1[1] = d1;\n+\t\tp1[2] = d2;\n+\t\tp1[3] = d3;\n+\t\tp1[4] = d4;\n+\t\tp1[5] = d5;\n+\t\tp1[6] = d6;\n+\t\tp1[7] = d7;\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t\tp3 += 8;\n+\t\tp4 += 8;\n+\t\tp5 += 8;\n+\t} while (--lines > 0);\n+}\n+\n+struct xor_block_template xor_block_32regs = {\n+\t.name = \"32regs\",\n+\t.do_2 = xor_32regs_2,\n+\t.do_3 = xor_32regs_3,\n+\t.do_4 = xor_32regs_4,\n+\t.do_5 = xor_32regs_5,\n+};\ndiff --git a/lib/raid/xor/xor-8regs-prefetch.c b/lib/raid/xor/xor-8regs-prefetch.c\nnew file mode 100644\nindex 000000000000..67061e35a0a6\n--- /dev/null\n+++ b/lib/raid/xor/xor-8regs-prefetch.c\n@@ -0,0 +1,146 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+#include <linux/prefetch.h>\n+#include <linux/raid/xor_impl.h>\n+#include <asm-generic/xor.h>\n+\n+static void\n+xor_8regs_p_2(unsigned long bytes, unsigned long * __restrict p1,\n+\t      const unsigned long * __restrict p2)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n+\tprefetchw(p1);\n+\tprefetch(p2);\n+\n+\tdo {\n+\t\tprefetchw(p1+8);\n+\t\tprefetch(p2+8);\n+ once_more:\n+\t\tp1[0] ^= p2[0];\n+\t\tp1[1] ^= p2[1];\n+\t\tp1[2] ^= p2[2];\n+\t\tp1[3] ^= p2[3];\n+\t\tp1[4] ^= p2[4];\n+\t\tp1[5] ^= p2[5];\n+\t\tp1[6] ^= p2[6];\n+\t\tp1[7] ^= p2[7];\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t} while (--lines > 0);\n+\tif (lines == 0)\n+\t\tgoto once_more;\n+}\n+\n+static void\n+xor_8regs_p_3(unsigned long bytes, unsigned long * __restrict p1,\n+\t      const unsigned long * __restrict p2,\n+\t      const unsigned long * __restrict p3)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n+\tprefetchw(p1);\n+\tprefetch(p2);\n+\tprefetch(p3);\n+\n+\tdo {\n+\t\tprefetchw(p1+8);\n+\t\tprefetch(p2+8);\n+\t\tprefetch(p3+8);\n+ once_more:\n+\t\tp1[0] ^= p2[0] ^ p3[0];\n+\t\tp1[1] ^= p2[1] ^ p3[1];\n+\t\tp1[2] ^= p2[2] ^ p3[2];\n+\t\tp1[3] ^= p2[3] ^ p3[3];\n+\t\tp1[4] ^= p2[4] ^ p3[4];\n+\t\tp1[5] ^= p2[5] ^ p3[5];\n+\t\tp1[6] ^= p2[6] ^ p3[6];\n+\t\tp1[7] ^= p2[7] ^ p3[7];\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t\tp3 += 8;\n+\t} while (--lines > 0);\n+\tif (lines == 0)\n+\t\tgoto once_more;\n+}\n+\n+static void\n+xor_8regs_p_4(unsigned long bytes, unsigned long * __restrict p1,\n+\t      const unsigned long * __restrict p2,\n+\t      const unsigned long * __restrict p3,\n+\t      const unsigned long * __restrict p4)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n+\n+\tprefetchw(p1);\n+\tprefetch(p2);\n+\tprefetch(p3);\n+\tprefetch(p4);\n+\n+\tdo {\n+\t\tprefetchw(p1+8);\n+\t\tprefetch(p2+8);\n+\t\tprefetch(p3+8);\n+\t\tprefetch(p4+8);\n+ once_more:\n+\t\tp1[0] ^= p2[0] ^ p3[0] ^ p4[0];\n+\t\tp1[1] ^= p2[1] ^ p3[1] ^ p4[1];\n+\t\tp1[2] ^= p2[2] ^ p3[2] ^ p4[2];\n+\t\tp1[3] ^= p2[3] ^ p3[3] ^ p4[3];\n+\t\tp1[4] ^= p2[4] ^ p3[4] ^ p4[4];\n+\t\tp1[5] ^= p2[5] ^ p3[5] ^ p4[5];\n+\t\tp1[6] ^= p2[6] ^ p3[6] ^ p4[6];\n+\t\tp1[7] ^= p2[7] ^ p3[7] ^ p4[7];\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t\tp3 += 8;\n+\t\tp4 += 8;\n+\t} while (--lines > 0);\n+\tif (lines == 0)\n+\t\tgoto once_more;\n+}\n+\n+static void\n+xor_8regs_p_5(unsigned long bytes, unsigned long * __restrict p1,\n+\t      const unsigned long * __restrict p2,\n+\t      const unsigned long * __restrict p3,\n+\t      const unsigned long * __restrict p4,\n+\t      const unsigned long * __restrict p5)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8 - 1;\n+\n+\tprefetchw(p1);\n+\tprefetch(p2);\n+\tprefetch(p3);\n+\tprefetch(p4);\n+\tprefetch(p5);\n+\n+\tdo {\n+\t\tprefetchw(p1+8);\n+\t\tprefetch(p2+8);\n+\t\tprefetch(p3+8);\n+\t\tprefetch(p4+8);\n+\t\tprefetch(p5+8);\n+ once_more:\n+\t\tp1[0] ^= p2[0] ^ p3[0] ^ p4[0] ^ p5[0];\n+\t\tp1[1] ^= p2[1] ^ p3[1] ^ p4[1] ^ p5[1];\n+\t\tp1[2] ^= p2[2] ^ p3[2] ^ p4[2] ^ p5[2];\n+\t\tp1[3] ^= p2[3] ^ p3[3] ^ p4[3] ^ p5[3];\n+\t\tp1[4] ^= p2[4] ^ p3[4] ^ p4[4] ^ p5[4];\n+\t\tp1[5] ^= p2[5] ^ p3[5] ^ p4[5] ^ p5[5];\n+\t\tp1[6] ^= p2[6] ^ p3[6] ^ p4[6] ^ p5[6];\n+\t\tp1[7] ^= p2[7] ^ p3[7] ^ p4[7] ^ p5[7];\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t\tp3 += 8;\n+\t\tp4 += 8;\n+\t\tp5 += 8;\n+\t} while (--lines > 0);\n+\tif (lines == 0)\n+\t\tgoto once_more;\n+}\n+\n+struct xor_block_template xor_block_8regs_p = {\n+\t.name = \"8regs_prefetch\",\n+\t.do_2 = xor_8regs_p_2,\n+\t.do_3 = xor_8regs_p_3,\n+\t.do_4 = xor_8regs_p_4,\n+\t.do_5 = xor_8regs_p_5,\n+};\ndiff --git a/lib/raid/xor/xor-8regs.c b/lib/raid/xor/xor-8regs.c\nnew file mode 100644\nindex 000000000000..769f796ab2cf\n--- /dev/null\n+++ b/lib/raid/xor/xor-8regs.c\n@@ -0,0 +1,105 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+#include <linux/raid/xor_impl.h>\n+#include <asm-generic/xor.h>\n+\n+static void\n+xor_8regs_2(unsigned long bytes, unsigned long * __restrict p1,\n+\t    const unsigned long * __restrict p2)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8;\n+\n+\tdo {\n+\t\tp1[0] ^= p2[0];\n+\t\tp1[1] ^= p2[1];\n+\t\tp1[2] ^= p2[2];\n+\t\tp1[3] ^= p2[3];\n+\t\tp1[4] ^= p2[4];\n+\t\tp1[5] ^= p2[5];\n+\t\tp1[6] ^= p2[6];\n+\t\tp1[7] ^= p2[7];\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t} while (--lines > 0);\n+}\n+\n+static void\n+xor_8regs_3(unsigned long bytes, unsigned long * __restrict p1,\n+\t    const unsigned long * __restrict p2,\n+\t    const unsigned long * __restrict p3)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8;\n+\n+\tdo {\n+\t\tp1[0] ^= p2[0] ^ p3[0];\n+\t\tp1[1] ^= p2[1] ^ p3[1];\n+\t\tp1[2] ^= p2[2] ^ p3[2];\n+\t\tp1[3] ^= p2[3] ^ p3[3];\n+\t\tp1[4] ^= p2[4] ^ p3[4];\n+\t\tp1[5] ^= p2[5] ^ p3[5];\n+\t\tp1[6] ^= p2[6] ^ p3[6];\n+\t\tp1[7] ^= p2[7] ^ p3[7];\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t\tp3 += 8;\n+\t} while (--lines > 0);\n+}\n+\n+static void\n+xor_8regs_4(unsigned long bytes, unsigned long * __restrict p1,\n+\t    const unsigned long * __restrict p2,\n+\t    const unsigned long * __restrict p3,\n+\t    const unsigned long * __restrict p4)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8;\n+\n+\tdo {\n+\t\tp1[0] ^= p2[0] ^ p3[0] ^ p4[0];\n+\t\tp1[1] ^= p2[1] ^ p3[1] ^ p4[1];\n+\t\tp1[2] ^= p2[2] ^ p3[2] ^ p4[2];\n+\t\tp1[3] ^= p2[3] ^ p3[3] ^ p4[3];\n+\t\tp1[4] ^= p2[4] ^ p3[4] ^ p4[4];\n+\t\tp1[5] ^= p2[5] ^ p3[5] ^ p4[5];\n+\t\tp1[6] ^= p2[6] ^ p3[6] ^ p4[6];\n+\t\tp1[7] ^= p2[7] ^ p3[7] ^ p4[7];\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t\tp3 += 8;\n+\t\tp4 += 8;\n+\t} while (--lines > 0);\n+}\n+\n+static void\n+xor_8regs_5(unsigned long bytes, unsigned long * __restrict p1,\n+\t    const unsigned long * __restrict p2,\n+\t    const unsigned long * __restrict p3,\n+\t    const unsigned long * __restrict p4,\n+\t    const unsigned long * __restrict p5)\n+{\n+\tlong lines = bytes / (sizeof (long)) / 8;\n+\n+\tdo {\n+\t\tp1[0] ^= p2[0] ^ p3[0] ^ p4[0] ^ p5[0];\n+\t\tp1[1] ^= p2[1] ^ p3[1] ^ p4[1] ^ p5[1];\n+\t\tp1[2] ^= p2[2] ^ p3[2] ^ p4[2] ^ p5[2];\n+\t\tp1[3] ^= p2[3] ^ p3[3] ^ p4[3] ^ p5[3];\n+\t\tp1[4] ^= p2[4] ^ p3[4] ^ p4[4] ^ p5[4];\n+\t\tp1[5] ^= p2[5] ^ p3[5] ^ p4[5] ^ p5[5];\n+\t\tp1[6] ^= p2[6] ^ p3[6] ^ p4[6] ^ p5[6];\n+\t\tp1[7] ^= p2[7] ^ p3[7] ^ p4[7] ^ p5[7];\n+\t\tp1 += 8;\n+\t\tp2 += 8;\n+\t\tp3 += 8;\n+\t\tp4 += 8;\n+\t\tp5 += 8;\n+\t} while (--lines > 0);\n+}\n+\n+#ifndef NO_TEMPLATE\n+struct xor_block_template xor_block_8regs = {\n+\t.name = \"8regs\",\n+\t.do_2 = xor_8regs_2,\n+\t.do_3 = xor_8regs_3,\n+\t.do_4 = xor_8regs_4,\n+\t.do_5 = xor_8regs_5,\n+};\n+#endif /* NO_TEMPLATE */\n",
    "prefixes": [
        "10/28"
    ]
}