Path: blob/main/contrib/arm-optimized-routines/string/test/memcpy.c
39500 views
/*1* memcpy test.2*3* Copyright (c) 2019-2023, Arm Limited.4* SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception5*/67#include <stdint.h>8#include <stdio.h>9#include <stdlib.h>10#include <string.h>11#include "mte.h"12#include "stringlib.h"13#include "stringtest.h"1415#define F(x, mte) {#x, x, mte},1617static const struct fun18{19const char *name;20void *(*fun) (void *, const void *, size_t);21int test_mte;22} funtab[] = {23// clang-format off24F(memcpy, 0)25#if __aarch64__26F(__memcpy_aarch64, 1)27F(__memcpy_aarch64_simd, 1)28# if __ARM_FEATURE_SVE29F(__memcpy_aarch64_sve, 1)30# endif31# if WANT_MOPS32F(__memcpy_aarch64_mops, 1)33# endif34#elif __arm__35F(__memcpy_arm, 0)36#endif37{0, 0, 0}38// clang-format on39};40#undef F4142#define A 3243#define LEN 25000044static unsigned char *dbuf;45static unsigned char *sbuf;46static unsigned char wbuf[LEN + 2 * A];4748static void *49alignup (void *p)50{51return (void *) (((uintptr_t) p + A - 1) & -A);52}5354static void55test (const struct fun *fun, int dalign, int salign, int len)56{57unsigned char *src = alignup (sbuf);58unsigned char *dst = alignup (dbuf);59unsigned char *want = wbuf;60unsigned char *s = src + salign;61unsigned char *d = dst + dalign;62unsigned char *w = want + dalign;63void *p;64int i;6566if (err_count >= ERR_LIMIT)67return;68if (len > LEN || dalign >= A || salign >= A)69abort ();70for (i = 0; i < len + A; i++)71{72src[i] = '?';73want[i] = dst[i] = '*';74}75for (i = 0; i < len; i++)76s[i] = w[i] = 'a' + i % 23;7778s = tag_buffer (s, len, fun->test_mte);79d = tag_buffer (d, len, fun->test_mte);80p = fun->fun (d, s, len);81untag_buffer (s, len, fun->test_mte);82untag_buffer (d, len, fun->test_mte);8384if (p != d)85ERR ("%s(%p,..) returned %p\n", fun->name, d, p);86for (i = 0; i < len + A; i++)87{88if (dst[i] != want[i])89{90ERR ("%s(align %d, align %d, %d) failed\n", fun->name, dalign, salign,91len);92quoteat ("got", dst, len + A, i);93quoteat ("want", want, len + A, i);94break;95}96}97}9899int100main ()101{102dbuf = mte_mmap (LEN + 2 * A);103sbuf = mte_mmap (LEN + 2 * A);104int r = 0;105for (int i = 0; funtab[i].name; i++)106{107err_count = 0;108for (int d = 0; d < A; d++)109for (int s = 0; s < A; s++)110{111int n;112for (n = 0; n < 100; n++)113test (funtab + i, d, s, n);114for (; n < LEN; n *= 2)115test (funtab + i, d, s, n);116}117char *pass = funtab[i].test_mte && mte_enabled () ? "MTE PASS" : "PASS";118printf ("%s %s\n", err_count ? "FAIL" : pass, funtab[i].name);119if (err_count)120r = -1;121}122return r;123}124125126