From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x630.google.com (mail-ej1-x630.google.com [IPv6:2a00:1450:4864:20::630]) by sourceware.org (Postfix) with ESMTPS id E5B493858D34 for ; Wed, 8 May 2024 05:18:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E5B493858D34 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=vrull.eu Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=vrull.eu ARC-Filter: OpenARC Filter v1.0.0 sourceware.org E5B493858D34 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::630 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715145496; cv=none; b=mC9KkZi7XvByJ2FmIHadXqn/HHguy7bEFB4p8EsftQl1z0Dj3O7ZS7qEJvCBx6WGWuBca6VWnhkKc+ca6kIIScNvRq7MglzY9ShW/LtuItHK8fu14tdyXJ4op1BCvGl2FZOLIlm6+hIjzaPIH46HqpLl3En3hW/EmYh1RFHIAyE= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715145496; c=relaxed/simple; bh=MgFe1GcB2vE/ImJB4Zz5bHAX2XZSJVytnKMDT7/JwAw=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=SJiQXMXz+YYmAAry7OA0WqHF3BtGZjq1k66X96w4pHupbP+BHBgsikI8lp44brxiEn9dWdL2bW11J1YopQ1UYn48WLrcL8U0Guie1Cf0pUrxRT5t4K2dQ6Ja9uiMIyHz0U9+tgxX2N127e+FJIueTaAQ69MI7bdsKH9BPmfG42E= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-ej1-x630.google.com with SMTP id a640c23a62f3a-a59cf8140d0so731770866b.3 for ; Tue, 07 May 2024 22:18:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vrull.eu; s=google; t=1715145491; x=1715750291; darn=gcc.gnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5zaXwz3dAGPV6VbteUrXmUPwutpJ9xB4U+bqgZ1sXbE=; b=DR27nuJGIgTlu/ro/82/F5QAvCOovsmE19yxDfekCDI9DcBG0McGFPKODEMKwdiuac lxfI5fLLkK4OrCllSGieP88DZTs6WcbZmOPbkDlOtxGA0rr+Dfs+wuNDnv5usbWSmF6F TGXulPJSgW5z3qcbLh+g/5O7bwar609cMli8t/vJyWtj/4e7XCv6jxfu3OliP8HFpM8c 8ncUOYpqk/u/MOyGfoczDZnI5e3B9cYD9QXCtnOSr6pbf5Cjpg8WEDQ7XtTNsLXZFQc4 IQeEoB8QHhbcqzAI2FDsgb66e7YJLLqGgXWPwEIHxNuAATjO+bKX4uIJvHPFVHLpFiRz h7FA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715145491; x=1715750291; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5zaXwz3dAGPV6VbteUrXmUPwutpJ9xB4U+bqgZ1sXbE=; b=Z7NCr6kewVrwkvOU+p/OKIQeDQvk2wL2nde+MzFpOSN/TC1affk4PrRK9ltIKhrer0 5ZiJNah2mxw8hCjH4T9lwsg0UjS7CF8U5nfyyYktXPC1wlA6oOErkFjUTOi0oqhZ45Ux 8OZ/vgerDCVUNkYgyYiWiUnjlUuBXgfaJYZXMhT2O9NDr4XdSGbpkXP5qxeFWRG/DlJa Uh7PxssQNBGyLRMkS0t8JvmhYWCeIa4tpRIxes6hcU/Jdp0ZwIgNXTh+J6WM58vzq7Xy tis2ismOJ3WTsPJ46Uo2+1yyX5fpns6DUZkRTYTFV7aMJfbu5C5j8MR6oQjTjIofBEW2 gL+w== X-Gm-Message-State: AOJu0YxK9pMRMWl0FLb99pdWF+BUKvGsvtODfwDfOQ0FuXhgnFGgSNC8 rGi1wAd+vM3IinLzJmumVKj8R3LxYbM2oR3jOlN+Jv6r4ppOXDBpoH7Mc3NEyGdRzJdJQJeh5Sp SpDc= X-Google-Smtp-Source: AGHT+IHuqmCCJeAAfA/I+YDkn2YnjDzBn1/iFX+Yj8yDMRWTwVIewZba9LqxPNuyRcOy9F/1hRSebA== X-Received: by 2002:a50:ccda:0:b0:572:9c4c:2503 with SMTP id 4fb4d7f45d1cf-5731da69540mr1023875a12.38.1715145490925; Tue, 07 May 2024 22:18:10 -0700 (PDT) Received: from antares.fritz.box (62-178-148-172.cable.dynamic.surfer.at. [62.178.148.172]) by smtp.gmail.com with ESMTPSA id bo1-20020a0564020b2100b00572a8c07345sm7156555edb.54.2024.05.07.22.18.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 May 2024 22:18:10 -0700 (PDT) From: =?UTF-8?q?Christoph=20M=C3=BCllner?= To: gcc-patches@gcc.gnu.org, Kito Cheng , Jim Wilson , Palmer Dabbelt , Andrew Waterman , Philipp Tomsich , Jeff Law , Vineet Gupta Cc: =?UTF-8?q?Christoph=20M=C3=BCllner?= Subject: [PATCH 1/4] RISC-V: Add test cases for cpymem expansion Date: Wed, 8 May 2024 07:17:53 +0200 Message-ID: <20240508051756.3999080-2-christoph.muellner@vrull.eu> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240508051756.3999080-1-christoph.muellner@vrull.eu> References: <20240508051756.3999080-1-christoph.muellner@vrull.eu> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_MANYTO,KAM_SHORT,LIKELY_SPAM_BODY,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: We have two mechanisms in the RISC-V backend that expand cpymem pattern: a) by-pieces, b) riscv_expand_block_move() in riscv-string.cc. The by-pieces framework has higher priority and emits a sequence of up to 15 instructions (see use_by_pieces_infrastructure_p() for more details). As a rule-of-thumb, by-pieces emits alternating load/store sequences and the setmem expansion in the backend emits a sequence of loads followed by a sequence of stores. Let's add some test cases to document the current behaviour and to have tests to identify regressions. Signed-off-by: Christoph Müllner gcc/testsuite/ChangeLog: * gcc.target/riscv/cpymem-32-ooo.c: New test. * gcc.target/riscv/cpymem-32.c: New test. * gcc.target/riscv/cpymem-64-ooo.c: New test. * gcc.target/riscv/cpymem-64.c: New test. --- .../gcc.target/riscv/cpymem-32-ooo.c | 131 +++++++++++++++++ gcc/testsuite/gcc.target/riscv/cpymem-32.c | 138 ++++++++++++++++++ .../gcc.target/riscv/cpymem-64-ooo.c | 129 ++++++++++++++++ gcc/testsuite/gcc.target/riscv/cpymem-64.c | 138 ++++++++++++++++++ 4 files changed, 536 insertions(+) create mode 100644 gcc/testsuite/gcc.target/riscv/cpymem-32-ooo.c create mode 100644 gcc/testsuite/gcc.target/riscv/cpymem-32.c create mode 100644 gcc/testsuite/gcc.target/riscv/cpymem-64-ooo.c create mode 100644 gcc/testsuite/gcc.target/riscv/cpymem-64.c diff --git a/gcc/testsuite/gcc.target/riscv/cpymem-32-ooo.c b/gcc/testsuite/gcc.target/riscv/cpymem-32-ooo.c new file mode 100644 index 00000000000..33fb9891d82 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/cpymem-32-ooo.c @@ -0,0 +1,131 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target rv32 } */ +/* { dg-options "-march=rv32gc -mabi=ilp32d -mtune=generic-ooo" } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Os" "-Og" "-Oz" "-flto" } } */ +/* { dg-final { check-function-bodies "**" "" } } */ +/* { dg-allow-blank-lines-in-output 1 } */ + +#define COPY_N(N) \ +void copy_##N (void *to, void *from) \ +{ \ + __builtin_memcpy (to, from, N); \ +} + +#define COPY_ALIGNED_N(N) \ +void copy_aligned_##N (void *to, void *from) \ +{ \ + to = __builtin_assume_aligned(to, sizeof(long)); \ + from = __builtin_assume_aligned(from, sizeof(long)); \ + __builtin_memcpy (to, from, N); \ +} + +/* +**copy_7: +** ... +** lw\t[at][0-9],0\([at][0-9]\) +** sw\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],6\([at][0-9]\) +** sb\t[at][0-9],6\([at][0-9]\) +** ... +*/ +COPY_N(7) + +/* +**copy_aligned_7: +** ... +** lw\t[at][0-9],0\([at][0-9]\) +** sw\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],6\([at][0-9]\) +** sb\t[at][0-9],6\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(7) + +/* +**copy_8: +** ... +** lw\ta[0-9],0\(a[0-9]\) +** sw\ta[0-9],0\(a[0-9]\) +** ... +*/ +COPY_N(8) + +/* +**copy_aligned_8: +** ... +** lw\ta[0-9],0\(a[0-9]\) +** sw\ta[0-9],0\(a[0-9]\) +** ... +*/ +COPY_ALIGNED_N(8) + +/* +**copy_11: +** ... +** lbu\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],10\([at][0-9]\) +** ... +** sb\t[at][0-9],0\([at][0-9]\) +** ... +** sb\t[at][0-9],10\([at][0-9]\) +** ... +*/ +COPY_N(11) + +/* +**copy_aligned_11: +** ... +** lw\t[at][0-9],0\([at][0-9]\) +** ... +** sw\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],10\([at][0-9]\) +** sb\t[at][0-9],10\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(11) + +/* +**copy_15: +** ... +** (call|tail)\tmemcpy +** ... +*/ +COPY_N(15) + +/* +**copy_aligned_15: +** ... +** lw\t[at][0-9],0\([at][0-9]\) +** ... +** sw\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],14\([at][0-9]\) +** sb\t[at][0-9],14\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(15) + +/* +**copy_27: +** ... +** (call|tail)\tmemcpy +** ... +*/ +COPY_N(27) + +/* +**copy_aligned_27: +** ... +** lw\t[at][0-9],20\([at][0-9]\) +** ... +** sw\t[at][0-9],20\([at][0-9]\) +** ... +** lbu\t[at][0-9],26\([at][0-9]\) +** sb\t[at][0-9],26\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(27) diff --git a/gcc/testsuite/gcc.target/riscv/cpymem-32.c b/gcc/testsuite/gcc.target/riscv/cpymem-32.c new file mode 100644 index 00000000000..44ba14a1d51 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/cpymem-32.c @@ -0,0 +1,138 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target rv32 } */ +/* { dg-options "-march=rv32gc -mabi=ilp32d -mtune=rocket" } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Os" "-Og" "-Oz" "-flto" } } */ +/* { dg-final { check-function-bodies "**" "" } } */ +/* { dg-allow-blank-lines-in-output 1 } */ + +#define COPY_N(N) \ +void copy_##N (void *to, void *from) \ +{ \ + __builtin_memcpy (to, from, N); \ +} + +#define COPY_ALIGNED_N(N) \ +void copy_aligned_##N (void *to, void *from) \ +{ \ + to = __builtin_assume_aligned(to, sizeof(long)); \ + from = __builtin_assume_aligned(from, sizeof(long)); \ + __builtin_memcpy (to, from, N); \ +} + +/* +**copy_7: +** ... +** lbu\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],6\([at][0-9]\) +** ... +** sb\t[at][0-9],0\([at][0-9]\) +** ... +** sb\t[at][0-9],6\([at][0-9]\) +** ... +*/ +COPY_N(7) + +/* +**copy_aligned_7: +** ... +** lw\t[at][0-9],0\([at][0-9]\) +** sw\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],6\([at][0-9]\) +** sb\t[at][0-9],6\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(7) + +/* +**copy_8: +** ... +** lbu\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],7\([at][0-9]\) +** ... +** sb\t[at][0-9],0\([at][0-9]\) +** ... +** sb\t[at][0-9],7\([at][0-9]\) +** ... +*/ +COPY_N(8) + +/* +**copy_aligned_8: +** ... +** lw\ta[0-9],0\(a[0-9]\) +** sw\ta[0-9],0\(a[0-9]\) +** ... +*/ +COPY_ALIGNED_N(8) + +/* +**copy_11: +** ... +** lbu\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],10\([at][0-9]\) +** ... +** sb\t[at][0-9],0\([at][0-9]\) +** ... +** sb\t[at][0-9],10\([at][0-9]\) +** ... +*/ +COPY_N(11) + +/* +**copy_aligned_11: +** ... +** lw\t[at][0-9],0\([at][0-9]\) +** ... +** sw\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],10\([at][0-9]\) +** sb\t[at][0-9],10\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(11) + +/* +**copy_15: +** ... +** (call|tail)\tmemcpy +** ... +*/ +COPY_N(15) + +/* +**copy_aligned_15: +** ... +** lw\t[at][0-9],0\([at][0-9]\) +** ... +** sw\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],14\([at][0-9]\) +** sb\t[at][0-9],14\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(15) + +/* +**copy_27: +** ... +** (call|tail)\tmemcpy +** ... +*/ +COPY_N(27) + +/* +**copy_aligned_27: +** ... +** lw\t[at][0-9],20\([at][0-9]\) +** ... +** sw\t[at][0-9],20\([at][0-9]\) +** ... +** lbu\t[at][0-9],26\([at][0-9]\) +** sb\t[at][0-9],26\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(27) diff --git a/gcc/testsuite/gcc.target/riscv/cpymem-64-ooo.c b/gcc/testsuite/gcc.target/riscv/cpymem-64-ooo.c new file mode 100644 index 00000000000..8e40e52fa91 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/cpymem-64-ooo.c @@ -0,0 +1,129 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target rv64 } */ +/* { dg-options "-march=rv64gc -mabi=lp64d -mtune=generic-ooo" } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Os" "-Og" "-Oz" "-flto" } } */ +/* { dg-final { check-function-bodies "**" "" } } */ +/* { dg-allow-blank-lines-in-output 1 } */ + +#define COPY_N(N) \ +void copy_##N (void *to, void *from) \ +{ \ + __builtin_memcpy (to, from, N); \ +} + +#define COPY_ALIGNED_N(N) \ +void copy_aligned_##N (void *to, void *from) \ +{ \ + to = __builtin_assume_aligned(to, sizeof(long)); \ + from = __builtin_assume_aligned(from, sizeof(long)); \ + __builtin_memcpy (to, from, N); \ +} + +/* +**copy_7: +** ... +** lw\t[at][0-9],0\([at][0-9]\) +** sw\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],6\([at][0-9]\) +** sb\t[at][0-9],6\([at][0-9]\) +** ... +*/ +COPY_N(7) + +/* +**copy_aligned_7: +** ... +** lw\t[at][0-9],0\([at][0-9]\) +** sw\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],6\([at][0-9]\) +** sb\t[at][0-9],6\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(7) + +/* +**copy_8: +** ... +** ld\ta[0-9],0\(a[0-9]\) +** sd\ta[0-9],0\(a[0-9]\) +** ... +*/ +COPY_N(8) + +/* +**copy_aligned_8: +** ... +** ld\ta[0-9],0\(a[0-9]\) +** sd\ta[0-9],0\(a[0-9]\) +** ... +*/ +COPY_ALIGNED_N(8) + +/* +**copy_11: +** ... +** ld\t[at][0-9],0\([at][0-9]\) +** sd\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],10\([at][0-9]\) +** sb\t[at][0-9],10\([at][0-9]\) +** ... +*/ +COPY_N(11) + +/* +**copy_aligned_11: +** ... +** ld\t[at][0-9],0\([at][0-9]\) +** ... +** sd\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],10\([at][0-9]\) +** sb\t[at][0-9],10\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(11) + +/* +**copy_15: +** ... +** (call|tail)\tmemcpy +** ... +*/ +COPY_N(15) + +/* +**copy_aligned_15: +** ... +** ld\t[at][0-9],0\([at][0-9]\) +** ... +** sd\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],14\([at][0-9]\) +** sb\t[at][0-9],14\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(15) + +/* +**copy_27: +** ... +** (call|tail)\tmemcpy +** ... +*/ +COPY_N(27) + +/* +**copy_aligned_27: +** ... +** ld\t[at][0-9],16\([at][0-9]\) +** ... +** sd\t[at][0-9],16\([at][0-9]\) +** ... +** lbu\t[at][0-9],26\([at][0-9]\) +** sb\t[at][0-9],26\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(27) diff --git a/gcc/testsuite/gcc.target/riscv/cpymem-64.c b/gcc/testsuite/gcc.target/riscv/cpymem-64.c new file mode 100644 index 00000000000..bdfaca0d46a --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/cpymem-64.c @@ -0,0 +1,138 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target rv64 } */ +/* { dg-options "-march=rv64gc -mabi=lp64d -mtune=rocket" } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Os" "-Og" "-Oz" "-flto" } } */ +/* { dg-final { check-function-bodies "**" "" } } */ +/* { dg-allow-blank-lines-in-output 1 } */ + +#define COPY_N(N) \ +void copy_##N (void *to, void *from) \ +{ \ + __builtin_memcpy (to, from, N); \ +} + +#define COPY_ALIGNED_N(N) \ +void copy_aligned_##N (void *to, void *from) \ +{ \ + to = __builtin_assume_aligned(to, sizeof(long)); \ + from = __builtin_assume_aligned(from, sizeof(long)); \ + __builtin_memcpy (to, from, N); \ +} + +/* +**copy_7: +** ... +** lbu\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],6\([at][0-9]\) +** ... +** sb\t[at][0-9],0\([at][0-9]\) +** ... +** sb\t[at][0-9],6\([at][0-9]\) +** ... +*/ +COPY_N(7) + +/* +**copy_aligned_7: +** ... +** lw\t[at][0-9],0\([at][0-9]\) +** sw\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],6\([at][0-9]\) +** sb\t[at][0-9],6\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(7) + +/* +**copy_8: +** ... +** lbu\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],7\([at][0-9]\) +** ... +** sb\t[at][0-9],0\([at][0-9]\) +** ... +** sb\t[at][0-9],7\([at][0-9]\) +** ... +*/ +COPY_N(8) + +/* +**copy_aligned_8: +** ... +** ld\ta[0-9],0\(a[0-9]\) +** sd\ta[0-9],0\(a[0-9]\) +** ... +*/ +COPY_ALIGNED_N(8) + +/* +**copy_11: +** ... +** lbu\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],10\([at][0-9]\) +** ... +** sb\t[at][0-9],0\([at][0-9]\) +** ... +** sb\t[at][0-9],10\([at][0-9]\) +** ... +*/ +COPY_N(11) + +/* +**copy_aligned_11: +** ... +** ld\t[at][0-9],0\([at][0-9]\) +** ... +** sd\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],10\([at][0-9]\) +** sb\t[at][0-9],10\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(11) + +/* +**copy_15: +** ... +** (call|tail)\tmemcpy +** ... +*/ +COPY_N(15) + +/* +**copy_aligned_15: +** ... +** ld\t[at][0-9],0\([at][0-9]\) +** ... +** sd\t[at][0-9],0\([at][0-9]\) +** ... +** lbu\t[at][0-9],14\([at][0-9]\) +** sb\t[at][0-9],14\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(15) + +/* +**copy_27: +** ... +** (call|tail)\tmemcpy +** ... +*/ +COPY_N(27) + +/* +**copy_aligned_27: +** ... +** ld\t[at][0-9],16\([at][0-9]\) +** ... +** sd\t[at][0-9],16\([at][0-9]\) +** ... +** lbu\t[at][0-9],26\([at][0-9]\) +** sb\t[at][0-9],26\([at][0-9]\) +** ... +*/ +COPY_ALIGNED_N(27) -- 2.44.0