get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 112392,
    "url": "http://patches.dpdk.org/api/patches/112392/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20220606131054.2097526-8-zhoumin@loongson.cn/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20220606131054.2097526-8-zhoumin@loongson.cn>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20220606131054.2097526-8-zhoumin@loongson.cn",
    "date": "2022-06-06T13:10:37",
    "name": "[v3,07/24] eal/loongarch: add dummy vector memcpy for LoongArch",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "3b1d791e4b55ffc713046999521d8f9816790cb2",
    "submitter": {
        "id": 2394,
        "url": "http://patches.dpdk.org/api/people/2394/?format=api",
        "name": "zhoumin",
        "email": "zhoumin@loongson.cn"
    },
    "delegate": {
        "id": 24651,
        "url": "http://patches.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20220606131054.2097526-8-zhoumin@loongson.cn/mbox/",
    "series": [
        {
            "id": 23356,
            "url": "http://patches.dpdk.org/api/series/23356/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=23356",
            "date": "2022-06-06T13:10:37",
            "name": "Support LoongArch architecture",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/23356/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/112392/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/112392/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 4E1DCA0544;\n\tMon,  6 Jun 2022 15:11:11 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id E46D84021E;\n\tMon,  6 Jun 2022 15:11:10 +0200 (CEST)",
            "from loongson.cn (mail.loongson.cn [114.242.206.163])\n by mails.dpdk.org (Postfix) with ESMTP id F185540150\n for <dev@dpdk.org>; Mon,  6 Jun 2022 15:11:08 +0200 (CEST)",
            "from localhost.localdomain (unknown [10.2.5.185])\n by mail.loongson.cn (Coremail) with SMTP id AQAAf9BxieTe_J1imxwXAA--.64917S9;\n Mon, 06 Jun 2022 21:11:00 +0800 (CST)"
        ],
        "From": "Min Zhou <zhoumin@loongson.cn>",
        "To": "thomas@monjalon.net, david.marchand@redhat.com,\n bruce.richardson@intel.com,\n anatoly.burakov@intel.com, qiming.yang@intel.com, Yuying.Zhang@intel.com,\n jgrajcia@cisco.com, konstantin.v.ananyev@yandex.ru",
        "Cc": "dev@dpdk.org,\n\tmaobibo@loongson.cn",
        "Subject": "[v3 07/24] eal/loongarch: add dummy vector memcpy for LoongArch",
        "Date": "Mon,  6 Jun 2022 21:10:37 +0800",
        "Message-Id": "<20220606131054.2097526-8-zhoumin@loongson.cn>",
        "X-Mailer": "git-send-email 2.31.1",
        "In-Reply-To": "<20220606131054.2097526-1-zhoumin@loongson.cn>",
        "References": "<20220606131054.2097526-1-zhoumin@loongson.cn>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-CM-TRANSID": "AQAAf9BxieTe_J1imxwXAA--.64917S9",
        "X-Coremail-Antispam": "1UD129KBjvJXoWxKFy7Gr47Cr48ZF43Gr15Arb_yoW3Jr4xpa\n s8Cr4rXr1kGa1fXFn3Xw1UJ3W3t3Z7Zr1UKr4UZF1fAFs7A340grZrKrWrAFs5ua4xArW7\n Xr48uan8WayUu3DanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2\n 9KBjDU0xBIdaVrnUUvcSsGvfC2KfnxnUUI43ZEXa7xR_UUUUUUUUU==",
        "X-CM-SenderInfo": "52kr3ztlq6z05rqj20fqof0/",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "The hardware instructions based vector implementation for memcpy\nwill come later. At present, this dummy implementation can also\nwork.\n\nSigned-off-by: Min Zhou <zhoumin@loongson.cn>\n---\n lib/eal/loongarch/include/rte_memcpy.h | 193 +++++++++++++++++++++++++\n lib/eal/loongarch/include/rte_vect.h   |  46 ++++++\n 2 files changed, 239 insertions(+)\n create mode 100644 lib/eal/loongarch/include/rte_memcpy.h\n create mode 100644 lib/eal/loongarch/include/rte_vect.h",
    "diff": "diff --git a/lib/eal/loongarch/include/rte_memcpy.h b/lib/eal/loongarch/include/rte_memcpy.h\nnew file mode 100644\nindex 0000000000..98dc3dfc3b\n--- /dev/null\n+++ b/lib/eal/loongarch/include/rte_memcpy.h\n@@ -0,0 +1,193 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2022 Loongson Technology Corporation Limited\n+ */\n+\n+#ifndef _RTE_MEMCPY_LOONGARCH_H_\n+#define _RTE_MEMCPY_LOONGARCH_H_\n+\n+#include <stdint.h>\n+#include <string.h>\n+#include <rte_vect.h>\n+#ifdef __cplusplus\n+extern \"C\" {\n+#endif\n+\n+#include \"generic/rte_memcpy.h\"\n+\n+static inline void\n+rte_mov16(uint8_t *dst, const uint8_t *src)\n+{\n+\t*(xmm_t *)dst = *(const xmm_t *)src;\n+}\n+\n+static inline void\n+rte_mov32(uint8_t *dst, const uint8_t *src)\n+{\n+\trte_mov16((uint8_t *)dst + 0 * 16, (const uint8_t *)src + 0 * 16);\n+\trte_mov16((uint8_t *)dst + 1 * 16, (const uint8_t *)src + 1 * 16);\n+}\n+\n+static inline void\n+rte_mov48(uint8_t *dst, const uint8_t *src)\n+{\n+\trte_mov16((uint8_t *)dst + 0 * 16, (const uint8_t *)src + 0 * 16);\n+\trte_mov16((uint8_t *)dst + 1 * 16, (const uint8_t *)src + 1 * 16);\n+\trte_mov16((uint8_t *)dst + 1 * 32, (const uint8_t *)src + 1 * 32);\n+}\n+\n+static inline void\n+rte_mov64(uint8_t *dst, const uint8_t *src)\n+{\n+\trte_mov16((uint8_t *)dst + 0 * 16, (const uint8_t *)src + 0 * 16);\n+\trte_mov16((uint8_t *)dst + 1 * 16, (const uint8_t *)src + 1 * 16);\n+\trte_mov16((uint8_t *)dst + 2 * 16, (const uint8_t *)src + 2 * 16);\n+\trte_mov16((uint8_t *)dst + 3 * 16, (const uint8_t *)src + 3 * 16);\n+}\n+\n+static inline void\n+rte_mov128(uint8_t *dst, const uint8_t *src)\n+{\n+\trte_mov16((uint8_t *)dst + 0 * 16, (const uint8_t *)src + 0 * 16);\n+\trte_mov16((uint8_t *)dst + 1 * 16, (const uint8_t *)src + 1 * 16);\n+\trte_mov16((uint8_t *)dst + 2 * 16, (const uint8_t *)src + 2 * 16);\n+\trte_mov16((uint8_t *)dst + 3 * 16, (const uint8_t *)src + 3 * 16);\n+\trte_mov16((uint8_t *)dst + 4 * 16, (const uint8_t *)src + 4 * 16);\n+\trte_mov16((uint8_t *)dst + 5 * 16, (const uint8_t *)src + 5 * 16);\n+\trte_mov16((uint8_t *)dst + 6 * 16, (const uint8_t *)src + 6 * 16);\n+\trte_mov16((uint8_t *)dst + 7 * 16, (const uint8_t *)src + 7 * 16);\n+}\n+\n+static inline void\n+rte_mov256(uint8_t *dst, const uint8_t *src)\n+{\n+\trte_mov128(dst, src);\n+\trte_mov128(dst + 128, src + 128);\n+}\n+\n+#define rte_memcpy(dst, src, n)      \\\n+\trte_memcpy_func((dst), (src), (n))\n+\n+static inline void *\n+rte_memcpy_func(void *dst, const void *src, size_t n)\n+{\n+\tvoid *ret = dst;\n+\n+\t/* We can't copy < 16 bytes using XMM registers so do it manually. */\n+\tif (n < 16) {\n+\t\tif (n & 0x01) {\n+\t\t\t*(uint8_t *)dst = *(const uint8_t *)src;\n+\t\t\tdst = (uint8_t *)dst + 1;\n+\t\t\tsrc = (const uint8_t *)src + 1;\n+\t\t}\n+\t\tif (n & 0x02) {\n+\t\t\t*(uint16_t *)dst = *(const uint16_t *)src;\n+\t\t\tdst = (uint16_t *)dst + 1;\n+\t\t\tsrc = (const uint16_t *)src + 1;\n+\t\t}\n+\t\tif (n & 0x04) {\n+\t\t\t*(uint32_t *)dst = *(const uint32_t *)src;\n+\t\t\tdst = (uint32_t *)dst + 1;\n+\t\t\tsrc = (const uint32_t *)src + 1;\n+\t\t}\n+\t\tif (n & 0x08)\n+\t\t\t*(uint64_t *)dst = *(const uint64_t *)src;\n+\t\treturn ret;\n+\t}\n+\n+\t/* Special fast cases for <= 128 bytes */\n+\tif (n <= 32) {\n+\t\trte_mov16((uint8_t *)dst, (const uint8_t *)src);\n+\t\trte_mov16((uint8_t *)dst - 16 + n,\n+\t\t\t(const uint8_t *)src - 16 + n);\n+\t\treturn ret;\n+\t}\n+\n+\tif (n <= 64) {\n+\t\trte_mov32((uint8_t *)dst, (const uint8_t *)src);\n+\t\trte_mov32((uint8_t *)dst - 32 + n,\n+\t\t\t(const uint8_t *)src - 32 + n);\n+\t\treturn ret;\n+\t}\n+\n+\tif (n <= 128) {\n+\t\trte_mov64((uint8_t *)dst, (const uint8_t *)src);\n+\t\trte_mov64((uint8_t *)dst - 64 + n,\n+\t\t\t(const uint8_t *)src - 64 + n);\n+\t\treturn ret;\n+\t}\n+\n+\t/*\n+\t * For large copies > 128 bytes. This combination of 256, 64 and 16 byte\n+\t * copies was found to be faster than doing 128 and 32 byte copies as\n+\t * well.\n+\t */\n+\tfor ( ; n >= 256; n -= 256) {\n+\t\trte_mov256((uint8_t *)dst, (const uint8_t *)src);\n+\t\tdst = (uint8_t *)dst + 256;\n+\t\tsrc = (const uint8_t *)src + 256;\n+\t}\n+\n+\t/*\n+\t * We split the remaining bytes (which will be less than 256) into\n+\t * 64byte (2^6) chunks.\n+\t * Using incrementing integers in the case labels of a switch statement\n+\t * encourages the compiler to use a jump table. To get incrementing\n+\t * integers, we shift the 2 relevant bits to the LSB position to first\n+\t * get decrementing integers, and then subtract.\n+\t */\n+\tswitch (3 - (n >> 6)) {\n+\tcase 0x00:\n+\t\trte_mov64((uint8_t *)dst, (const uint8_t *)src);\n+\t\tn -= 64;\n+\t\tdst = (uint8_t *)dst + 64;\n+\t\tsrc = (const uint8_t *)src + 64;      /* fallthrough */\n+\tcase 0x01:\n+\t\trte_mov64((uint8_t *)dst, (const uint8_t *)src);\n+\t\tn -= 64;\n+\t\tdst = (uint8_t *)dst + 64;\n+\t\tsrc = (const uint8_t *)src + 64;      /* fallthrough */\n+\tcase 0x02:\n+\t\trte_mov64((uint8_t *)dst, (const uint8_t *)src);\n+\t\tn -= 64;\n+\t\tdst = (uint8_t *)dst + 64;\n+\t\tsrc = (const uint8_t *)src + 64;      /* fallthrough */\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\t/*\n+\t * We split the remaining bytes (which will be less than 64) into\n+\t * 16byte (2^4) chunks, using the same switch structure as above.\n+\t */\n+\tswitch (3 - (n >> 4)) {\n+\tcase 0x00:\n+\t\trte_mov16((uint8_t *)dst, (const uint8_t *)src);\n+\t\tn -= 16;\n+\t\tdst = (uint8_t *)dst + 16;\n+\t\tsrc = (const uint8_t *)src + 16;      /* fallthrough */\n+\tcase 0x01:\n+\t\trte_mov16((uint8_t *)dst, (const uint8_t *)src);\n+\t\tn -= 16;\n+\t\tdst = (uint8_t *)dst + 16;\n+\t\tsrc = (const uint8_t *)src + 16;      /* fallthrough */\n+\tcase 0x02:\n+\t\trte_mov16((uint8_t *)dst, (const uint8_t *)src);\n+\t\tn -= 16;\n+\t\tdst = (uint8_t *)dst + 16;\n+\t\tsrc = (const uint8_t *)src + 16;      /* fallthrough */\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\t/* Copy any remaining bytes, without going beyond end of buffers */\n+\tif (n != 0)\n+\t\trte_mov16((uint8_t *)dst - 16 + n,\n+\t\t\t(const uint8_t *)src - 16 + n);\n+\treturn ret;\n+}\n+\n+#ifdef __cplusplus\n+}\n+#endif\n+\n+#endif /* _RTE_MEMCPY_LOONGARCH_H_ */\ndiff --git a/lib/eal/loongarch/include/rte_vect.h b/lib/eal/loongarch/include/rte_vect.h\nnew file mode 100644\nindex 0000000000..3e96fdd958\n--- /dev/null\n+++ b/lib/eal/loongarch/include/rte_vect.h\n@@ -0,0 +1,46 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2022 Loongson Technology Corporation Limited\n+ */\n+\n+#ifndef _RTE_VECT_LOONGARCH_H_\n+#define _RTE_VECT_LOONGARCH_H_\n+\n+#include <stdint.h>\n+#include \"rte_common.h\"\n+#include \"generic/rte_vect.h\"\n+\n+#ifdef __cplusplus\n+extern \"C\" {\n+#endif\n+\n+#define RTE_VECT_DEFAULT_SIMD_BITWIDTH RTE_VECT_SIMD_256\n+\n+typedef union xmm {\n+\tint8_t   i8[16];\n+\tint16_t  i16[8];\n+\tint32_t  i32[4];\n+\tint64_t  i64[2];\n+\tuint8_t  u8[16];\n+\tuint16_t u16[8];\n+\tuint32_t u32[4];\n+\tuint64_t u64[2];\n+\tdouble   pd[2];\n+} __rte_aligned(16) xmm_t;\n+\n+#define XMM_SIZE        (sizeof(xmm_t))\n+#define XMM_MASK        (XMM_SIZE - 1)\n+\n+typedef union rte_xmm {\n+\txmm_t x;\n+\tuint8_t  u8[XMM_SIZE / sizeof(uint8_t)];\n+\tuint16_t u16[XMM_SIZE / sizeof(uint16_t)];\n+\tuint32_t u32[XMM_SIZE / sizeof(uint32_t)];\n+\tuint64_t u64[XMM_SIZE / sizeof(uint64_t)];\n+\tdouble   pd[XMM_SIZE / sizeof(double)];\n+} __rte_aligned(16) rte_xmm_t;\n+\n+#ifdef __cplusplus\n+}\n+#endif\n+\n+#endif\n",
    "prefixes": [
        "v3",
        "07/24"
    ]
}