get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2224360,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/2224360/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260417104652.17857-5-xiaoou@iscas.ac.cn/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/1.2/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260417104652.17857-5-xiaoou@iscas.ac.cn>",
    "list_archive_url": null,
    "date": "2026-04-17T10:46:41",
    "name": "[04/14] target/riscv: rvp: add absolute value and difference, comparison and mask generation operations",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "9a4219d8ad6986b0ecc24c316868a936186df8d0",
    "submitter": {
        "id": 89843,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/89843/?format=api",
        "name": "Molly Chen",
        "email": "xiaoou@iscas.ac.cn"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260417104652.17857-5-xiaoou@iscas.ac.cn/mbox/",
    "series": [
        {
            "id": 500307,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/500307/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=500307",
            "date": "2026-04-17T10:46:37",
            "name": "target/riscv: add support for RISC-V P extension (v0.20 draft)",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/500307/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2224360/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2224360/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)",
        "Received": [
            "from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fxs6W1g7gz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 17 Apr 2026 20:48:03 +1000 (AEST)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wDgjJ-00013K-9m; Fri, 17 Apr 2026 06:47:21 -0400",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <xiaoou@iscas.ac.cn>)\n id 1wDgjG-00012J-OJ; Fri, 17 Apr 2026 06:47:18 -0400",
            "from smtp21.cstnet.cn ([159.226.251.21] helo=cstnet.cn)\n by eggs.gnu.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256)\n (Exim 4.90_1) (envelope-from <xiaoou@iscas.ac.cn>)\n id 1wDgjD-0007xe-ED; Fri, 17 Apr 2026 06:47:18 -0400",
            "from Huawei.localdomain (unknown [36.110.52.2])\n by APP-01 (Coremail) with SMTP id qwCowAB3H2ulD+JpLDmSDQ--.804S6;\n Fri, 17 Apr 2026 18:47:10 +0800 (CST)"
        ],
        "From": "Molly Chen <xiaoou@iscas.ac.cn>",
        "To": "palmer@dabbelt.com, alistair.francis@wdc.com, liwei1518@gmail.com,\n daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com,\n chao.liu.zevorn@gmail.com",
        "Cc": "xiaoou@iscas.ac.cn,\n\tqemu-riscv@nongnu.org,\n\tqemu-devel@nongnu.org",
        "Subject": "[PATCH 04/14] target/riscv: rvp: add absolute value and difference,\n comparison and mask generation operations",
        "Date": "Fri, 17 Apr 2026 18:46:41 +0800",
        "Message-Id": "<20260417104652.17857-5-xiaoou@iscas.ac.cn>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20260417104652.17857-1-xiaoou@iscas.ac.cn>",
        "References": "<20260417104652.17857-1-xiaoou@iscas.ac.cn>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-CM-TRANSID": "qwCowAB3H2ulD+JpLDmSDQ--.804S6",
        "X-Coremail-Antispam": "1UD129KBjvAXoWfuw4DJrWfKrWktw43GF43GFg_yoW8ur1kXo\n ZrKw15A34fGr1fW348uw4xZr18XrW2v3WDGr48uw45Z3s3WF1Sgr15J3WkA3WxtrWayrW3\n X39aqFn8J3ZxK3sxn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3\n AaLaJ3UjIYCTnIWjp_UUUOU7AC8VAFwI0_Wr0E3s1l1xkIjI8I6I8E6xAIw20EY4v20xva\n j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l82xGYIkIc2x26280x7IE14v26r126s0DM28Irc\n Ia0xkI8VCY1x0267AKxVW5JVCq3wA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK021l\n 84ACjcxK6xIIjxv20xvE14v26r4j6ryUM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26F4j6r\n 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq\n 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7\n IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAFwI0_Gr0_Cr1lOx8S6xCaFVCjc4AY6r1j6r4U\n M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCY1x0262kKe7AKxVWUtV\n W8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v2\n 6r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2\n Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_\n Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWxJw\n CI42IY6I8E87Iv6xkF7I0E14v26r4UJVWxJrUvcSsGvfC2KfnxnUUI43ZEXa7VUbnNVPUU\n UUU==",
        "X-Originating-IP": "[36.110.52.2]",
        "X-CM-SenderInfo": "50ld003x6l2u1dvotugofq/",
        "Received-SPF": "pass client-ip=159.226.251.21; envelope-from=xiaoou@iscas.ac.cn;\n helo=cstnet.cn",
        "X-Spam_score_int": "-21",
        "X-Spam_score": "-2.2",
        "X-Spam_bar": "--",
        "X-Spam_report": "(-2.2 / 5.0 requ) BAYES_00=-1.9, HK_RANDOM_ENVFROM=0.998,\n HK_RANDOM_FROM=0.998, RCVD_IN_DNSWL_MED=-2.3,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no",
        "X-Spam_action": "no action",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "qemu development <qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"
    },
    "content": "Signed-off-by: Molly Chen <xiaoou@iscas.ac.cn>\n---\n target/riscv/helper.h                   |  38 ++\n target/riscv/insn32.decode              |  44 ++\n target/riscv/insn_trans/trans_rvp.c.inc |  38 ++\n target/riscv/psimd_helper.c             | 634 ++++++++++++++++++++++++\n 4 files changed, 754 insertions(+)",
    "diff": "diff --git a/target/riscv/helper.h b/target/riscv/helper.h\nindex a72e02b44c..f6351ecd43 100644\n--- a/target/riscv/helper.h\n+++ b/target/riscv/helper.h\n@@ -1411,3 +1411,41 @@ DEF_HELPER_3(pasubu_w, i64, env, i64, i64)\n DEF_HELPER_3(asub, i32, env, i32, i32)\n DEF_HELPER_3(asubu, i32, env, i32, i32)\n \n+/* Packed SIMD - Absolute Value and Difference Operations */\n+DEF_HELPER_2(psabs_b, tl, env, tl)\n+DEF_HELPER_2(psabs_h, tl, env, tl)\n+DEF_HELPER_2(abs, tl, env, tl)\n+DEF_HELPER_2(absw, i64, env, i64)\n+DEF_HELPER_3(pabd_b, tl, env, tl, tl)\n+DEF_HELPER_3(pabdu_b, tl, env, tl, tl)\n+DEF_HELPER_3(pabd_h, tl, env, tl, tl)\n+DEF_HELPER_3(pabdu_h, tl, env, tl, tl)\n+DEF_HELPER_3(pabdsumu_b, tl, env, tl, tl)\n+DEF_HELPER_4(pabdsumau_b, tl, env, tl, tl, tl)\n+\n+/* Packed SIMD - Comparison and Mask Generation Operations */\n+DEF_HELPER_3(pmseq_b, tl, env, tl, tl)\n+DEF_HELPER_3(pmslt_b, tl, env, tl, tl)\n+DEF_HELPER_3(pmsltu_b, tl, env, tl, tl)\n+DEF_HELPER_3(pmin_b, tl, env, tl, tl)\n+DEF_HELPER_3(pminu_b, tl, env, tl, tl)\n+DEF_HELPER_3(pmax_b, tl, env, tl, tl)\n+DEF_HELPER_3(pmaxu_b, tl, env, tl, tl)\n+DEF_HELPER_3(pmseq_h, tl, env, tl, tl)\n+DEF_HELPER_3(pmslt_h, tl, env, tl, tl)\n+DEF_HELPER_3(pmsltu_h, tl, env, tl, tl)\n+DEF_HELPER_3(pmin_h, tl, env, tl, tl)\n+DEF_HELPER_3(pminu_h, tl, env, tl, tl)\n+DEF_HELPER_3(pmax_h, tl, env, tl, tl)\n+DEF_HELPER_3(pmaxu_h, tl, env, tl, tl)\n+DEF_HELPER_3(pmseq_w, i64, env, i64, i64)\n+DEF_HELPER_3(pmslt_w, i64, env, i64, i64)\n+DEF_HELPER_3(pmsltu_w, i64, env, i64, i64)\n+DEF_HELPER_3(pmin_w, i64, env, i64, i64)\n+DEF_HELPER_3(pminu_w, i64, env, i64, i64)\n+DEF_HELPER_3(pmax_w, i64, env, i64, i64)\n+DEF_HELPER_3(pmaxu_w, i64, env, i64, i64)\n+DEF_HELPER_3(mseq, i32, env, i32, i32)\n+DEF_HELPER_3(mslt, i32, env, i32, i32)\n+DEF_HELPER_3(msltu, i32, env, i32, i32)\n+\ndiff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode\nindex f609c38638..2034041639 100644\n--- a/target/riscv/insn32.decode\n+++ b/target/riscv/insn32.decode\n@@ -1175,3 +1175,47 @@ pasubu_h   1111100 ..... ..... 000 ..... 0111011 @r\n   pasubu_w 1111101 ..... ..... 000 ..... 0111011 @r\n }\n \n+# Packed SIMD - Absolute Value and Difference Operations\n+psabs_b    1110010 00111 ..... 010 ..... 0011011 @r2\n+psabs_h    1110000 00111 ..... 010 ..... 0011011 @r2\n+abs        01100 0000111 ..... 001 ..... 0010011 @r2\n+absw       01100 0000111 ..... 001 ..... 0011011 @r2\n+pabd_b     1100110 ..... ..... 000 ..... 0111011 @r\n+pabdu_b    1110110 ..... ..... 000 ..... 0111011 @r\n+pabd_h     1100100 ..... ..... 000 ..... 0111011 @r\n+pabdu_h    1110100 ..... ..... 000 ..... 0111011 @r\n+pabdsumu_b 1011010 ..... ..... 001 ..... 0111011 @r\n+pabdsumau_b 1011110 ..... ..... 001 ..... 0111011 @r\n+\n+# Packed SIMD - Comparison and Mask Generation Operations\n+pmseq_b    1100010 ..... ..... 110 ..... 0111011 @r\n+pmslt_b    1101010 ..... ..... 110 ..... 0111011 @r\n+pmsltu_b   1101110 ..... ..... 110 ..... 0111011 @r\n+pmin_b     1110010 ..... ..... 110 ..... 0111011 @r\n+pminu_b    1110110 ..... ..... 110 ..... 0111011 @r\n+pmax_b     1111010 ..... ..... 110 ..... 0111011 @r\n+pmaxu_b    1111110 ..... ..... 110 ..... 0111011 @r\n+pmseq_h    1100000 ..... ..... 110 ..... 0111011 @r\n+pmslt_h    1101000 ..... ..... 110 ..... 0111011 @r\n+pmsltu_h   1101100 ..... ..... 110 ..... 0111011 @r\n+pmin_h     1110000 ..... ..... 110 ..... 0111011 @r\n+pminu_h    1110100 ..... ..... 110 ..... 0111011 @r\n+pmax_h     1111000 ..... ..... 110 ..... 0111011 @r\n+pmaxu_h    1111100 ..... ..... 110 ..... 0111011 @r\n+{\n+  mseq     1100001 ..... ..... 110 ..... 0111011 @r\n+  pmseq_w  1100001 ..... ..... 110 ..... 0111011 @r\n+}\n+{\n+  mslt     1101001 ..... ..... 110 ..... 0111011 @r\n+  pmslt_w  1101001 ..... ..... 110 ..... 0111011 @r\n+}\n+{\n+  msltu    1101101 ..... ..... 110 ..... 0111011 @r\n+  pmsltu_w 1101101 ..... ..... 110 ..... 0111011 @r\n+}\n+pmin_w     1110001 ..... ..... 110 ..... 0111011 @r\n+pminu_w    1110101 ..... ..... 110 ..... 0111011 @r\n+pmax_w     1111001 ..... ..... 110 ..... 0111011 @r\n+pmaxu_w    1111101 ..... ..... 110 ..... 0111011 @r\n+\ndiff --git a/target/riscv/insn_trans/trans_rvp.c.inc b/target/riscv/insn_trans/trans_rvp.c.inc\nindex e3abb38d18..27d482863c 100644\n--- a/target/riscv/insn_trans/trans_rvp.c.inc\n+++ b/target/riscv/insn_trans/trans_rvp.c.inc\n@@ -582,3 +582,41 @@ GEN_SIMD_TRANS_64(pasubu_w)\n GEN_SIMD_TRANS_32(asub)\n GEN_SIMD_TRANS_32(asubu)\n \n+/* Packed SIMD - Absolute Value and Difference Operations */\n+GEN_SIMD_TRANS_R1(psabs_b)\n+GEN_SIMD_TRANS_R1(psabs_h)\n+GEN_SIMD_TRANS_R1(abs)\n+GEN_SIMD_TRANS_R1_64(absw)\n+GEN_SIMD_TRANS(pabd_b)\n+GEN_SIMD_TRANS(pabdu_b)\n+GEN_SIMD_TRANS(pabd_h)\n+GEN_SIMD_TRANS(pabdu_h)\n+GEN_SIMD_TRANS(pabdsumu_b)\n+GEN_SIMD_TRANS_ACC(pabdsumau_b)\n+\n+/* Packed SIMD - Comparison and Mask Generation Operations */\n+GEN_SIMD_TRANS(pmseq_b)\n+GEN_SIMD_TRANS(pmslt_b)\n+GEN_SIMD_TRANS(pmsltu_b)\n+GEN_SIMD_TRANS(pmin_b)\n+GEN_SIMD_TRANS(pminu_b)\n+GEN_SIMD_TRANS(pmax_b)\n+GEN_SIMD_TRANS(pmaxu_b)\n+GEN_SIMD_TRANS(pmseq_h)\n+GEN_SIMD_TRANS(pmslt_h)\n+GEN_SIMD_TRANS(pmsltu_h)\n+GEN_SIMD_TRANS(pmin_h)\n+GEN_SIMD_TRANS(pminu_h)\n+GEN_SIMD_TRANS(pmax_h)\n+GEN_SIMD_TRANS(pmaxu_h)\n+GEN_SIMD_TRANS_64(pmseq_w)\n+GEN_SIMD_TRANS_64(pmslt_w)\n+GEN_SIMD_TRANS_64(pmsltu_w)\n+GEN_SIMD_TRANS_64(pmin_w)\n+GEN_SIMD_TRANS_64(pminu_w)\n+GEN_SIMD_TRANS_64(pmax_w)\n+GEN_SIMD_TRANS_64(pmaxu_w)\n+GEN_SIMD_TRANS_32(mseq)\n+GEN_SIMD_TRANS_32(mslt)\n+GEN_SIMD_TRANS_32(msltu)\n+\ndiff --git a/target/riscv/psimd_helper.c b/target/riscv/psimd_helper.c\nindex 23c0402de2..38207c3a39 100644\n--- a/target/riscv/psimd_helper.c\n+++ b/target/riscv/psimd_helper.c\n@@ -1333,3 +1333,637 @@ uint32_t HELPER(asubu)(CPURISCVState *env, uint32_t rs1, uint32_t rs2)\n     uint64_t b = rs2;\n     return (uint32_t)((a - b) >> 1);\n }\n+\n+/* Absolute value operations */\n+\n+/**\n+ * PSABS.B - Packed 8-bit absolute value\n+ * For each byte: rd[i] = abs(rs1[i]), saturate if MIN\n+ */\n+target_ulong HELPER(psabs_b)(CPURISCVState *env, target_ulong rs1)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_B(rd);\n+    int sat = 0;\n+\n+    for (int i = 0; i < elems; i++) {\n+        int8_t e1 = (int8_t)EXTRACT8(rs1, i);\n+        int8_t res;\n+\n+        if (e1 == INT8_MIN) {\n+            res = INT8_MAX;\n+            sat = 1;\n+        } else if (e1 < 0) {\n+            res = -e1;\n+        } else {\n+            res = e1;\n+        }\n+\n+        rd = INSERT8(rd, res, i);\n+    }\n+\n+    if (sat) {\n+        env->vxsat = 1;\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PSABS.H - Packed 16-bit absolute value\n+ * For each halfword: rd[i] = abs(rs1[i]), saturate if MIN\n+ */\n+target_ulong HELPER(psabs_h)(CPURISCVState *env, target_ulong rs1)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_H(rd);\n+    int sat = 0;\n+\n+    for (int i = 0; i < elems; i++) {\n+        int16_t e1 = (int16_t)EXTRACT16(rs1, i);\n+        int16_t res;\n+\n+        if (e1 == INT16_MIN) {\n+            res = INT16_MAX;\n+            sat = 1;\n+        } else if (e1 < 0) {\n+            res = -e1;\n+        } else {\n+            res = e1;\n+        }\n+\n+        rd = INSERT16(rd, res, i);\n+    }\n+\n+    if (sat) {\n+        env->vxsat = 1;\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * ABS - 32/64-bit scalar absolute value\n+ */\n+target_ulong HELPER(abs)(CPURISCVState *env, target_ulong rs1)\n+{\n+    target_long a = (target_long)rs1;\n+    return (a < 0) ? (target_ulong)(-a) : rs1;\n+}\n+\n+/**\n+ * ABSW - Absolute value of low 32 bits (RV64)\n+ */\n+uint64_t HELPER(absw)(CPURISCVState *env, uint64_t rs1)\n+{\n+    int32_t a = (int32_t)EXTRACT32(rs1, 0);\n+    uint32_t res;\n+\n+    if (a == INT32_MIN) {\n+        res = 0x80000000;\n+    } else if (a < 0) {\n+        res = (uint32_t)(-a);\n+    } else {\n+        res = (uint32_t)a;\n+    }\n+\n+    return (uint64_t)res;\n+}\n+\n+\n+/* Absolute difference operations */\n+\n+/**\n+ * PABD.B - Packed 8-bit signed absolute difference\n+ * For each byte: rd[i] = |rs1[i] - rs2[i]|\n+ */\n+target_ulong HELPER(pabd_b)(CPURISCVState *env,\n+                            target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_B(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        int8_t e1 = (int8_t)EXTRACT8(rs1, i);\n+        int8_t e2 = (int8_t)EXTRACT8(rs2, i);\n+        int16_t diff = (int16_t)e1 - (int16_t)e2;\n+        uint8_t res = (diff >= 0) ? (uint8_t)diff : (uint8_t)(-diff);\n+        rd = INSERT8(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PABDU.B - Packed 8-bit unsigned absolute difference\n+ * For each byte: rd[i] = |rs1[i] - rs2[i]|\n+ */\n+target_ulong HELPER(pabdu_b)(CPURISCVState *env,\n+                             target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_B(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint8_t e1 = EXTRACT8(rs1, i);\n+        uint8_t e2 = EXTRACT8(rs2, i);\n+        uint8_t res = (e1 > e2) ? (e1 - e2) : (e2 - e1);\n+        rd = INSERT8(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PABD.H - Packed 16-bit signed absolute difference\n+ * For each halfword: rd[i] = |rs1[i] - rs2[i]|\n+ */\n+target_ulong HELPER(pabd_h)(CPURISCVState *env,\n+                            target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_H(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        int16_t e1 = (int16_t)EXTRACT16(rs1, i);\n+        int16_t e2 = (int16_t)EXTRACT16(rs2, i);\n+        int32_t diff = (int32_t)e1 - (int32_t)e2;\n+        uint16_t res = (diff >= 0) ? (uint16_t)diff : (uint16_t)(-diff);\n+        rd = INSERT16(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PABDU.H - Packed 16-bit unsigned absolute difference\n+ * For each halfword: rd[i] = |rs1[i] - rs2[i]|\n+ */\n+target_ulong HELPER(pabdu_h)(CPURISCVState *env,\n+                             target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_H(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint16_t e1 = EXTRACT16(rs1, i);\n+        uint16_t e2 = EXTRACT16(rs2, i);\n+        uint16_t res = (e1 > e2) ? (e1 - e2) : (e2 - e1);\n+        rd = INSERT16(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PABDSUMU.B - Sum of unsigned absolute differences\n+ * Returns sum(|rs1[i] - rs2[i]|) for all bytes\n+ */\n+target_ulong HELPER(pabdsumu_b)(CPURISCVState *env,\n+                                target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong sum = 0;\n+    int elems = ELEMS_B(rs1);\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint8_t e1 = EXTRACT8(rs1, i);\n+        uint8_t e2 = EXTRACT8(rs2, i);\n+        uint8_t diff = (e1 > e2) ? (e1 - e2) : (e2 - e1);\n+        sum += diff;\n+    }\n+\n+    return sum;\n+}\n+\n+/**\n+ * PABDSUMAU.B - Accumulated sum of unsigned absolute differences\n+ * rd = rd + sum(|rs1[i] - rs2[i]|)\n+ */\n+target_ulong HELPER(pabdsumau_b)(CPURISCVState *env, target_ulong rs1,\n+                                 target_ulong rs2, target_ulong rd)\n+{\n+    target_ulong sum = rd;\n+    int elems = ELEMS_B(rs1);\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint8_t e1 = EXTRACT8(rs1, i);\n+        uint8_t e2 = EXTRACT8(rs2, i);\n+        uint8_t diff = (e1 > e2) ? (e1 - e2) : (e2 - e1);\n+        sum += diff;\n+    }\n+\n+    return sum;\n+}\n+\n+/* Comparison operations (producing masks) */\n+\n+/**\n+ * PMSEQ.B - Packed 8-bit equal comparison\n+ * For each byte: rd[i] = 0xFF if rs1[i] == rs2[i], else 0x00\n+ */\n+target_ulong HELPER(pmseq_b)(CPURISCVState *env,\n+                             target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_B(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint8_t e1 = EXTRACT8(rs1, i);\n+        uint8_t e2 = EXTRACT8(rs2, i);\n+        uint8_t res = (e1 == e2) ? 0xFF : 0x00;\n+        rd = INSERT8(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMSLT.B - Packed 8-bit signed less-than comparison\n+ * For each byte: rd[i] = 0xFF if rs1[i] < rs2[i], else 0x00\n+ */\n+target_ulong HELPER(pmslt_b)(CPURISCVState *env,\n+                             target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_B(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        int8_t e1 = (int8_t)EXTRACT8(rs1, i);\n+        int8_t e2 = (int8_t)EXTRACT8(rs2, i);\n+        uint8_t res = (e1 < e2) ? 0xFF : 0x00;\n+        rd = INSERT8(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMSLTU.B - Packed 8-bit unsigned less-than comparison\n+ * For each byte: rd[i] = 0xFF if rs1[i] < rs2[i], else 0x00\n+ */\n+target_ulong HELPER(pmsltu_b)(CPURISCVState *env,\n+                              target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_B(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint8_t e1 = EXTRACT8(rs1, i);\n+        uint8_t e2 = EXTRACT8(rs2, i);\n+        uint8_t res = (e1 < e2) ? 0xFF : 0x00;\n+        rd = INSERT8(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMIN.B - Packed 8-bit signed minimum\n+ * For each byte: rd[i] = min(rs1[i], rs2[i])\n+ */\n+target_ulong HELPER(pmin_b)(CPURISCVState *env,\n+                            target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_B(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        int8_t e1 = (int8_t)EXTRACT8(rs1, i);\n+        int8_t e2 = (int8_t)EXTRACT8(rs2, i);\n+        int8_t res = (e1 < e2) ? e1 : e2;\n+        rd = INSERT8(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMINU.B - Packed 8-bit unsigned minimum\n+ * For each byte: rd[i] = min(rs1[i], rs2[i])\n+ */\n+target_ulong HELPER(pminu_b)(CPURISCVState *env,\n+                             target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_B(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint8_t e1 = EXTRACT8(rs1, i);\n+        uint8_t e2 = EXTRACT8(rs2, i);\n+        uint8_t res = (e1 < e2) ? e1 : e2;\n+        rd = INSERT8(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMAX.B - Packed 8-bit signed maximum\n+ * For each byte: rd[i] = max(rs1[i], rs2[i])\n+ */\n+target_ulong HELPER(pmax_b)(CPURISCVState *env,\n+                            target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_B(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        int8_t e1 = (int8_t)EXTRACT8(rs1, i);\n+        int8_t e2 = (int8_t)EXTRACT8(rs2, i);\n+        int8_t res = (e1 > e2) ? e1 : e2;\n+        rd = INSERT8(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMAXU.B - Packed 8-bit unsigned maximum\n+ * For each byte: rd[i] = max(rs1[i], rs2[i])\n+ */\n+target_ulong HELPER(pmaxu_b)(CPURISCVState *env,\n+                             target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_B(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint8_t e1 = EXTRACT8(rs1, i);\n+        uint8_t e2 = EXTRACT8(rs2, i);\n+        uint8_t res = (e1 > e2) ? e1 : e2;\n+        rd = INSERT8(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMSEQ.H - Packed 16-bit equal comparison\n+ * For each halfword: rd[i] = 0xFFFF if rs1[i] == rs2[i], else 0x0000\n+ */\n+target_ulong HELPER(pmseq_h)(CPURISCVState *env,\n+                             target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_H(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint16_t e1 = EXTRACT16(rs1, i);\n+        uint16_t e2 = EXTRACT16(rs2, i);\n+        uint16_t res = (e1 == e2) ? 0xFFFF : 0x0000;\n+        rd = INSERT16(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMSLT.H - Packed 16-bit signed less-than comparison\n+ * For each halfword: rd[i] = 0xFFFF if rs1[i] < rs2[i], else 0x0000\n+ */\n+target_ulong HELPER(pmslt_h)(CPURISCVState *env,\n+                             target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_H(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        int16_t e1 = (int16_t)EXTRACT16(rs1, i);\n+        int16_t e2 = (int16_t)EXTRACT16(rs2, i);\n+        uint16_t res = (e1 < e2) ? 0xFFFF : 0x0000;\n+        rd = INSERT16(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMSLTU.H - Packed 16-bit unsigned less-than comparison\n+ * For each halfword: rd[i] = 0xFFFF if rs1[i] < rs2[i], else 0x0000\n+ */\n+target_ulong HELPER(pmsltu_h)(CPURISCVState *env,\n+                              target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_H(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint16_t e1 = EXTRACT16(rs1, i);\n+        uint16_t e2 = EXTRACT16(rs2, i);\n+        uint16_t res = (e1 < e2) ? 0xFFFF : 0x0000;\n+        rd = INSERT16(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMIN.H - Packed 16-bit signed minimum\n+ * For each halfword: rd[i] = min(rs1[i], rs2[i])\n+ */\n+target_ulong HELPER(pmin_h)(CPURISCVState *env,\n+                            target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_H(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        int16_t e1 = (int16_t)EXTRACT16(rs1, i);\n+        int16_t e2 = (int16_t)EXTRACT16(rs2, i);\n+        int16_t res = (e1 < e2) ? e1 : e2;\n+        rd = INSERT16(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMINU.H - Packed 16-bit unsigned minimum\n+ * For each halfword: rd[i] = min(rs1[i], rs2[i])\n+ */\n+target_ulong HELPER(pminu_h)(CPURISCVState *env,\n+                             target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_H(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint16_t e1 = EXTRACT16(rs1, i);\n+        uint16_t e2 = EXTRACT16(rs2, i);\n+        uint16_t res = (e1 < e2) ? e1 : e2;\n+        rd = INSERT16(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMAX.H - Packed 16-bit signed maximum\n+ * For each halfword: rd[i] = max(rs1[i], rs2[i])\n+ */\n+target_ulong HELPER(pmax_h)(CPURISCVState *env,\n+                            target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_H(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        int16_t e1 = (int16_t)EXTRACT16(rs1, i);\n+        int16_t e2 = (int16_t)EXTRACT16(rs2, i);\n+        int16_t res = (e1 > e2) ? e1 : e2;\n+        rd = INSERT16(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMAXU.H - Packed 16-bit unsigned maximum\n+ * For each halfword: rd[i] = max(rs1[i], rs2[i])\n+ */\n+target_ulong HELPER(pmaxu_h)(CPURISCVState *env,\n+                             target_ulong rs1, target_ulong rs2)\n+{\n+    target_ulong rd = 0;\n+    int elems = ELEMS_H(rd);\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint16_t e1 = EXTRACT16(rs1, i);\n+        uint16_t e2 = EXTRACT16(rs2, i);\n+        uint16_t res = (e1 > e2) ? e1 : e2;\n+        rd = INSERT16(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMSEQ.W - Packed 32-bit equal comparison (RV64 only)\n+ * For each word: rd[i] = 0xFFFFFFFF if rs1[i] == rs2[i], else 0x00000000\n+ */\n+uint64_t HELPER(pmseq_w)(CPURISCVState *env, uint64_t rs1, uint64_t rs2)\n+{\n+    uint64_t rd = 0;\n+    int elems = 2;\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint32_t e1 = EXTRACT32(rs1, i);\n+        uint32_t e2 = EXTRACT32(rs2, i);\n+        uint32_t res = (e1 == e2) ? 0xFFFFFFFFU : 0x00000000U;\n+        rd = INSERT32(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMSLT.W - Packed 32-bit signed less-than comparison (RV64 only)\n+ * For each word: rd[i] = 0xFFFFFFFF if rs1[i] < rs2[i], else 0x00000000\n+ */\n+uint64_t HELPER(pmslt_w)(CPURISCVState *env, uint64_t rs1, uint64_t rs2)\n+{\n+    uint64_t rd = 0;\n+    int elems = 2;\n+\n+    for (int i = 0; i < elems; i++) {\n+        int32_t e1 = (int32_t)EXTRACT32(rs1, i);\n+        int32_t e2 = (int32_t)EXTRACT32(rs2, i);\n+        uint32_t res = (e1 < e2) ? 0xFFFFFFFFU : 0x00000000U;\n+        rd = INSERT32(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMSLTU.W - Packed 32-bit unsigned less-than comparison (RV64 only)\n+ * For each word: rd[i] = 0xFFFFFFFF if rs1[i] < rs2[i], else 0x00000000\n+ */\n+uint64_t HELPER(pmsltu_w)(CPURISCVState *env, uint64_t rs1, uint64_t rs2)\n+{\n+    uint64_t rd = 0;\n+    int elems = 2;\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint32_t e1 = EXTRACT32(rs1, i);\n+        uint32_t e2 = EXTRACT32(rs2, i);\n+        uint32_t res = (e1 < e2) ? 0xFFFFFFFFU : 0x00000000U;\n+        rd = INSERT32(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMIN.W - Packed 32-bit signed minimum (RV64 only)\n+ * For each word: rd[i] = min(rs1[i], rs2[i])\n+ */\n+uint64_t HELPER(pmin_w)(CPURISCVState *env, uint64_t rs1, uint64_t rs2)\n+{\n+    uint64_t rd = 0;\n+    int elems = 2;\n+\n+    for (int i = 0; i < elems; i++) {\n+        int32_t e1 = (int32_t)EXTRACT32(rs1, i);\n+        int32_t e2 = (int32_t)EXTRACT32(rs2, i);\n+        int32_t res = (e1 < e2) ? e1 : e2;\n+        rd = INSERT32(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMINU.W - Packed 32-bit unsigned minimum (RV64 only)\n+ * For each word: rd[i] = min(rs1[i], rs2[i])\n+ */\n+uint64_t HELPER(pminu_w)(CPURISCVState *env, uint64_t rs1, uint64_t rs2)\n+{\n+    uint64_t rd = 0;\n+    int elems = 2;\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint32_t e1 = EXTRACT32(rs1, i);\n+        uint32_t e2 = EXTRACT32(rs2, i);\n+        uint32_t res = (e1 < e2) ? e1 : e2;\n+        rd = INSERT32(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMAX.W - Packed 32-bit signed maximum (RV64 only)\n+ * For each word: rd[i] = max(rs1[i], rs2[i])\n+ */\n+uint64_t HELPER(pmax_w)(CPURISCVState *env, uint64_t rs1, uint64_t rs2)\n+{\n+    uint64_t rd = 0;\n+    int elems = 2;\n+\n+    for (int i = 0; i < elems; i++) {\n+        int32_t e1 = (int32_t)EXTRACT32(rs1, i);\n+        int32_t e2 = (int32_t)EXTRACT32(rs2, i);\n+        int32_t res = (e1 > e2) ? e1 : e2;\n+        rd = INSERT32(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PMAXU.W - Packed 32-bit unsigned maximum (RV64 only)\n+ * For each word: rd[i] = max(rs1[i], rs2[i])\n+ */\n+uint64_t HELPER(pmaxu_w)(CPURISCVState *env, uint64_t rs1, uint64_t rs2)\n+{\n+    uint64_t rd = 0;\n+    int elems = 2;\n+\n+    for (int i = 0; i < elems; i++) {\n+        uint32_t e1 = EXTRACT32(rs1, i);\n+        uint32_t e2 = EXTRACT32(rs2, i);\n+        uint32_t res = (e1 > e2) ? e1 : e2;\n+        rd = INSERT32(rd, res, i);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * MSEQ - 32-bit scalar set if equal (mask)\n+ */\n+uint32_t HELPER(mseq)(CPURISCVState *env, uint32_t rs1, uint32_t rs2)\n+{\n+    return (rs1 == rs2) ? 0xFFFFFFFFU : 0x00000000U;\n+}\n+\n+/**\n+ * MSLT - 32-bit scalar set if signed less than (mask)\n+ */\n+uint32_t HELPER(mslt)(CPURISCVState *env, uint32_t rs1, uint32_t rs2)\n+{\n+    return ((int32_t)rs1 < (int32_t)rs2) ? 0xFFFFFFFFU : 0x00000000U;\n+}\n+\n+/**\n+ * MSLTU - 32-bit scalar set if unsigned less than (mask)\n+ */\n+uint32_t HELPER(msltu)(CPURISCVState *env, uint32_t rs1, uint32_t rs2)\n+{\n+    return (rs1 < rs2) ? 0xFFFFFFFFU : 0x00000000U;\n+}\n+\n",
    "prefixes": [
        "04/14"
    ]
}