get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2224363,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/2224363/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260417104652.17857-7-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-7-xiaoou@iscas.ac.cn>",
    "list_archive_url": null,
    "date": "2026-04-17T10:46:43",
    "name": "[06/14] target/riscv: rvp: add exchange operations",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "7dd6c5a960959914ff74ccfe3dd2da8cf57fc801",
    "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-7-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/2224363/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2224363/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 4fxs7W6tjqz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 17 Apr 2026 20:48:55 +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 1wDgjL-000154-FW; Fri, 17 Apr 2026 06:47:23 -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 1wDgjJ-00013B-0o; Fri, 17 Apr 2026 06:47:21 -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 1wDgjF-0007yf-PG; Fri, 17 Apr 2026 06:47:20 -0400",
            "from Huawei.localdomain (unknown [36.110.52.2])\n by APP-01 (Coremail) with SMTP id qwCowAB3H2ulD+JpLDmSDQ--.804S8;\n Fri, 17 Apr 2026 18:47:13 +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 06/14] target/riscv: rvp: add exchange operations",
        "Date": "Fri, 17 Apr 2026 18:46:43 +0800",
        "Message-Id": "<20260417104652.17857-7-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--.804S8",
        "X-Coremail-Antispam": "1UD129KBjvJXoWfJF1rXF1xKF47Kw45ZrW7twb_yoWkAryDpF\n Wvkry2q3y3JFySgw4fKF1fAw15WwsxJry8GrZxKF1Sqa1fXF1kJrW5tw13urs7GF9rWry5\n Wa98A3y8AFyIq37anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2\n 9KBjDU0xBIdaVrnRJUUUPj14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0\n rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI\n kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2\n z4x0Y4vE2Ix0cI8IcVAFwI0_Xr0_Ar1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr\n 1UM28EF7xvwVC2z280aVAFwI0_GcCE3s1l84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s0D\n M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx\n v20xvE14v26r1Y6r17McIj6I8E87Iv67AKxVW8JVWxJwAm72CE4IkC6x0Yz7v_Jr0_Gr1l\n F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxkF7I0En4kS14v26r1q6r\n 43MxAIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_\n Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUtVW8ZwCIc40Y0x\n 0EwIxGrwCI42IY6xIIjxv20xvE14v26r1I6r4UMIIF0xvE2Ix0cI8IcVCY1x0267AKxVWx\n JVW8Jr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r4j6F4UMI\n IF0xvEx4A2jsIEc7CjxVAFwI0_Gr1j6F4UJbIYCTnIWIevJa73UjIFyTuYvjfU5TmhDUUU\n U",
        "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                   |  14 ++\n target/riscv/insn32.decode              |  14 ++\n target/riscv/insn_trans/trans_rvp.c.inc |  14 ++\n target/riscv/psimd_helper.c             | 294 ++++++++++++++++++++++++\n 4 files changed, 336 insertions(+)",
    "diff": "diff --git a/target/riscv/helper.h b/target/riscv/helper.h\nindex d97552eb58..fc66712570 100644\n--- a/target/riscv/helper.h\n+++ b/target/riscv/helper.h\n@@ -1483,3 +1483,17 @@ DEF_HELPER_3(ssha, i32, env, i32, i32)\n DEF_HELPER_3(sshar, i32, env, i32, i32)\n DEF_HELPER_3(sha, i64, env, i64, i64)\n DEF_HELPER_3(shar, i64, env, i64, i64)\n+\n+/* Packed SIMD - Exchange Operations */\n+DEF_HELPER_3(pas_hx, tl, env, tl, tl)\n+DEF_HELPER_3(psa_hx, tl, env, tl, tl)\n+DEF_HELPER_3(psas_hx, tl, env, tl, tl)\n+DEF_HELPER_3(pssa_hx, tl, env, tl, tl)\n+DEF_HELPER_3(paas_hx, tl, env, tl, tl)\n+DEF_HELPER_3(pasa_hx, tl, env, tl, tl)\n+DEF_HELPER_3(pas_wx, i64, env, i64, i64)\n+DEF_HELPER_3(psa_wx, i64, env, i64, i64)\n+DEF_HELPER_3(psas_wx, i64, env, i64, i64)\n+DEF_HELPER_3(pssa_wx, i64, env, i64, i64)\n+DEF_HELPER_3(paas_wx, i64, env, i64, i64)\n+DEF_HELPER_3(pasa_wx, i64, env, i64, i64)\ndiff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode\nindex 69514e2cb9..ba003ed513 100644\n--- a/target/riscv/insn32.decode\n+++ b/target/riscv/insn32.decode\n@@ -1263,3 +1263,17 @@ psshar_hs  1111100 ..... ..... 010 ..... 0011011 @r\n }\n sha        1110111 ..... ..... 010 ..... 0011011 @r\n shar       1111111 ..... ..... 010 ..... 0011011 @r\n+\n+# Packed SIMD - Exchange Operations\n+pas_hx     1000000 ..... ..... 110 ..... 0111011 @r\n+psa_hx     1000010 ..... ..... 110 ..... 0111011 @r\n+psas_hx    1001000 ..... ..... 110 ..... 0111011 @r\n+pssa_hx    1001010 ..... ..... 110 ..... 0111011 @r\n+paas_hx    1001100 ..... ..... 110 ..... 0111011 @r\n+pasa_hx    1001110 ..... ..... 110 ..... 0111011 @r\n+pas_wx     1000001 ..... ..... 110 ..... 0111011 @r\n+psa_wx     1000011 ..... ..... 110 ..... 0111011 @r\n+psas_wx    1001001 ..... ..... 110 ..... 0111011 @r\n+pssa_wx    1001011 ..... ..... 110 ..... 0111011 @r\n+paas_wx    1001101 ..... ..... 110 ..... 0111011 @r\n+pasa_wx    1001111 ..... ..... 110 ..... 0111011 @r\ndiff --git a/target/riscv/insn_trans/trans_rvp.c.inc b/target/riscv/insn_trans/trans_rvp.c.inc\nindex d0b645d083..b24a8ef7c2 100644\n--- a/target/riscv/insn_trans/trans_rvp.c.inc\n+++ b/target/riscv/insn_trans/trans_rvp.c.inc\n@@ -654,3 +654,17 @@ GEN_SIMD_TRANS_32(ssha)\n GEN_SIMD_TRANS_32(sshar)\n GEN_SIMD_TRANS_64(sha)\n GEN_SIMD_TRANS_64(shar)\n+\n+/* Packed SIMD - Exchange Operations */\n+GEN_SIMD_TRANS(pas_hx)\n+GEN_SIMD_TRANS(psa_hx)\n+GEN_SIMD_TRANS(psas_hx)\n+GEN_SIMD_TRANS(pssa_hx)\n+GEN_SIMD_TRANS(paas_hx)\n+GEN_SIMD_TRANS(pasa_hx)\n+GEN_SIMD_TRANS_64(pas_wx)\n+GEN_SIMD_TRANS_64(psa_wx)\n+GEN_SIMD_TRANS_64(psas_wx)\n+GEN_SIMD_TRANS_64(pssa_wx)\n+GEN_SIMD_TRANS_64(paas_wx)\n+GEN_SIMD_TRANS_64(pasa_wx)\ndiff --git a/target/riscv/psimd_helper.c b/target/riscv/psimd_helper.c\nindex ef556eb007..e48c9897ae 100644\n--- a/target/riscv/psimd_helper.c\n+++ b/target/riscv/psimd_helper.c\n@@ -2703,3 +2703,297 @@ uint64_t HELPER(shar)(CPURISCVState *env, uint64_t rs1, uint64_t rs2)\n         }\n     }\n }\n+\n+/* Exchange operations (AS/SA/AS/SA with X suffix) */\n+\n+/**\n+ * PAS.HX - Packed add-subtract with exchange\n+ * For each pair: {rd[2i] = rs1[2i] - rs2[2i+1], rd[2i+1] = rs1[2i+1] + rs2[2i]}\n+ */\n+target_ulong HELPER(pas_hx)(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 += 2) {\n+        int16_t s1_lo = (int16_t)EXTRACT16(rs1, i);\n+        int16_t s1_hi = (int16_t)EXTRACT16(rs1, i + 1);\n+        int16_t s2_lo = (int16_t)EXTRACT16(rs2, i);\n+        int16_t s2_hi = (int16_t)EXTRACT16(rs2, i + 1);\n+        int16_t res_lo = s1_lo - s2_hi;\n+        int16_t res_hi = s1_hi + s2_lo;\n+        rd = INSERT16(rd, res_lo, i);\n+        rd = INSERT16(rd, res_hi, i + 1);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PSA.HX - Packed subtract-add with exchange\n+ * For each pair: {rd[2i] = rs1[2i] + rs2[2i+1], rd[2i+1] = rs1[2i+1] - rs2[2i]}\n+ */\n+target_ulong HELPER(psa_hx)(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 += 2) {\n+        int16_t s1_lo = (int16_t)EXTRACT16(rs1, i);\n+        int16_t s1_hi = (int16_t)EXTRACT16(rs1, i + 1);\n+        int16_t s2_lo = (int16_t)EXTRACT16(rs2, i);\n+        int16_t s2_hi = (int16_t)EXTRACT16(rs2, i + 1);\n+        int16_t res_lo = s1_lo + s2_hi;\n+        int16_t res_hi = s1_hi - s2_lo;\n+        rd = INSERT16(rd, res_lo, i);\n+        rd = INSERT16(rd, res_hi, i + 1);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PSAS.HX - Packed saturating add-subtract with exchange\n+ */\n+target_ulong HELPER(psas_hx)(CPURISCVState *env,\n+                             target_ulong rs1, target_ulong rs2)\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 += 2) {\n+        int16_t s1_lo = (int16_t)EXTRACT16(rs1, i);\n+        int16_t s1_hi = (int16_t)EXTRACT16(rs1, i + 1);\n+        int16_t s2_lo = (int16_t)EXTRACT16(rs2, i);\n+        int16_t s2_hi = (int16_t)EXTRACT16(rs2, i + 1);\n+        int32_t diff = (int32_t)s1_lo - (int32_t)s2_hi;\n+        int32_t sum = (int32_t)s1_hi + (int32_t)s2_lo;\n+        int16_t res_lo = signed_saturate_h(diff, &sat);\n+        int16_t res_hi = signed_saturate_h(sum, &sat);\n+        rd = INSERT16(rd, res_lo, i);\n+        rd = INSERT16(rd, res_hi, i + 1);\n+    }\n+\n+    if (sat) {\n+        env->vxsat = 1;\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PSSA.HX - Packed saturating subtract-add with exchange\n+ */\n+target_ulong HELPER(pssa_hx)(CPURISCVState *env,\n+                             target_ulong rs1, target_ulong rs2)\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 += 2) {\n+        int16_t s1_lo = (int16_t)EXTRACT16(rs1, i);\n+        int16_t s1_hi = (int16_t)EXTRACT16(rs1, i + 1);\n+        int16_t s2_lo = (int16_t)EXTRACT16(rs2, i);\n+        int16_t s2_hi = (int16_t)EXTRACT16(rs2, i + 1);\n+        int32_t sum = (int32_t)s1_lo + (int32_t)s2_hi;\n+        int32_t diff = (int32_t)s1_hi - (int32_t)s2_lo;\n+        int16_t res_lo = signed_saturate_h(sum, &sat);\n+        int16_t res_hi = signed_saturate_h(diff, &sat);\n+        rd = INSERT16(rd, res_lo, i);\n+        rd = INSERT16(rd, res_hi, i + 1);\n+    }\n+\n+    if (sat) {\n+        env->vxsat = 1;\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PAAS.HX - Packed averaging add-subtract with exchange\n+ */\n+target_ulong HELPER(paas_hx)(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 += 2) {\n+        int16_t s1_lo = (int16_t)EXTRACT16(rs1, i);\n+        int16_t s1_hi = (int16_t)EXTRACT16(rs1, i + 1);\n+        int16_t s2_lo = (int16_t)EXTRACT16(rs2, i);\n+        int16_t s2_hi = (int16_t)EXTRACT16(rs2, i + 1);\n+        int16_t res_lo = (s1_lo - s2_hi) >> 1;\n+        int16_t res_hi = (s1_hi + s2_lo) >> 1;\n+        rd = INSERT16(rd, res_lo, i);\n+        rd = INSERT16(rd, res_hi, i + 1);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PASA.HX - Packed averaging subtract-add with exchange\n+ */\n+target_ulong HELPER(pasa_hx)(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 += 2) {\n+        int16_t s1_lo = (int16_t)EXTRACT16(rs1, i);\n+        int16_t s1_hi = (int16_t)EXTRACT16(rs1, i + 1);\n+        int16_t s2_lo = (int16_t)EXTRACT16(rs2, i);\n+        int16_t s2_hi = (int16_t)EXTRACT16(rs2, i + 1);\n+        int16_t res_lo = (s1_lo + s2_hi) >> 1;\n+        int16_t res_hi = (s1_hi - s2_lo) >> 1;\n+        rd = INSERT16(rd, res_lo, i);\n+        rd = INSERT16(rd, res_hi, i + 1);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PAS.WX - Word version of packed add-subtract with exchange (RV64 only)\n+ */\n+uint64_t HELPER(pas_wx)(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 += 2) {\n+        int32_t s1_lo = (int32_t)EXTRACT32(rs1, i);\n+        int32_t s1_hi = (int32_t)EXTRACT32(rs1, i + 1);\n+        int32_t s2_lo = (int32_t)EXTRACT32(rs2, i);\n+        int32_t s2_hi = (int32_t)EXTRACT32(rs2, i + 1);\n+        int32_t res_lo = s1_lo - s2_hi;\n+        int32_t res_hi = s1_hi + s2_lo;\n+        rd = INSERT32(rd, res_lo, i);\n+        rd = INSERT32(rd, res_hi, i + 1);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PSA.WX - Word version of packed subtract-add with exchange (RV64 only)\n+ */\n+uint64_t HELPER(psa_wx)(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 += 2) {\n+        int32_t s1_lo = (int32_t)EXTRACT32(rs1, i);\n+        int32_t s1_hi = (int32_t)EXTRACT32(rs1, i + 1);\n+        int32_t s2_lo = (int32_t)EXTRACT32(rs2, i);\n+        int32_t s2_hi = (int32_t)EXTRACT32(rs2, i + 1);\n+        int32_t res_lo = s1_lo + s2_hi;\n+        int32_t res_hi = s1_hi - s2_lo;\n+        rd = INSERT32(rd, res_lo, i);\n+        rd = INSERT32(rd, res_hi, i + 1);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PSAS.WX - Word version of packed saturating\n+ * add-subtract with exchange (RV64 only)\n+ */\n+uint64_t HELPER(psas_wx)(CPURISCVState *env, uint64_t rs1, uint64_t rs2)\n+{\n+    uint64_t rd = 0;\n+    int elems = 2;\n+    int sat = 0;\n+\n+    for (int i = 0; i < elems; i += 2) {\n+        int32_t s1_lo = (int32_t)EXTRACT32(rs1, i);\n+        int32_t s1_hi = (int32_t)EXTRACT32(rs1, i + 1);\n+        int32_t s2_lo = (int32_t)EXTRACT32(rs2, i);\n+        int32_t s2_hi = (int32_t)EXTRACT32(rs2, i + 1);\n+        int64_t diff = (int64_t)s1_lo - (int64_t)s2_hi;\n+        int64_t sum = (int64_t)s1_hi + (int64_t)s2_lo;\n+        int32_t res_lo = signed_saturate_w(diff, &sat);\n+        int32_t res_hi = signed_saturate_w(sum, &sat);\n+        rd = INSERT32(rd, res_lo, i);\n+        rd = INSERT32(rd, res_hi, i + 1);\n+    }\n+\n+    if (sat) {\n+        env->vxsat = 1;\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PSSA.WX - Word version of packed saturating\n+ * subtract-add with exchange (RV64 only)\n+ */\n+uint64_t HELPER(pssa_wx)(CPURISCVState *env, uint64_t rs1, uint64_t rs2)\n+{\n+    uint64_t rd = 0;\n+    int elems = 2;\n+    int sat = 0;\n+\n+    for (int i = 0; i < elems; i += 2) {\n+        int32_t s1_lo = (int32_t)EXTRACT32(rs1, i);\n+        int32_t s1_hi = (int32_t)EXTRACT32(rs1, i + 1);\n+        int32_t s2_lo = (int32_t)EXTRACT32(rs2, i);\n+        int32_t s2_hi = (int32_t)EXTRACT32(rs2, i + 1);\n+        int64_t sum = (int64_t)s1_lo + (int64_t)s2_hi;\n+        int64_t diff = (int64_t)s1_hi - (int64_t)s2_lo;\n+        int32_t res_lo = signed_saturate_w(sum, &sat);\n+        int32_t res_hi = signed_saturate_w(diff, &sat);\n+        rd = INSERT32(rd, res_lo, i);\n+        rd = INSERT32(rd, res_hi, i + 1);\n+    }\n+\n+    if (sat) {\n+        env->vxsat = 1;\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PAAS.WX - Word version of packed averaging\n+ * add-subtract with exchange (RV64 only)\n+ */\n+uint64_t HELPER(paas_wx)(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 += 2) {\n+        int64_t s1_lo = (int32_t)EXTRACT32(rs1, i);\n+        int64_t s1_hi = (int32_t)EXTRACT32(rs1, i + 1);\n+        int64_t s2_lo = (int32_t)EXTRACT32(rs2, i);\n+        int64_t s2_hi = (int32_t)EXTRACT32(rs2, i + 1);\n+        int32_t res_lo = (s1_lo - s2_hi) >> 1;\n+        int32_t res_hi = (s1_hi + s2_lo) >> 1;\n+        rd = INSERT32(rd, res_lo, i);\n+        rd = INSERT32(rd, res_hi, i + 1);\n+    }\n+    return rd;\n+}\n+\n+/**\n+ * PASA.WX - Word version of packed averaging\n+ * subtract-add with exchange (RV64 only)\n+ */\n+uint64_t HELPER(pasa_wx)(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 += 2) {\n+        int64_t s1_lo = (int32_t)EXTRACT32(rs1, i);\n+        int64_t s1_hi = (int32_t)EXTRACT32(rs1, i + 1);\n+        int64_t s2_lo = (int32_t)EXTRACT32(rs2, i);\n+        int64_t s2_hi = (int32_t)EXTRACT32(rs2, i + 1);\n+        int32_t res_lo = (s1_lo + s2_hi) >> 1;\n+        int32_t res_hi = (s1_hi - s2_lo) >> 1;\n+        rd = INSERT32(rd, res_lo, i);\n+        rd = INSERT32(rd, res_hi, i + 1);\n+    }\n+    return rd;\n+}\n",
    "prefixes": [
        "06/14"
    ]
}