RISC-V: Fixed the wrong expansion for pseudo vmsge[u].vx instructions.
authorNelson Chu <nelson@rivosinc.com>
Fri, 1 Sep 2023 07:21:35 +0000 (15:21 +0800)
committerNelson Chu <nelson@rivosinc.com>
Fri, 1 Sep 2023 07:37:59 +0000 (15:37 +0800)
The original report was from Kiva Oyama <libkernelpanic@gmail.com>,
https://sourceware.org/pipermail/binutils/2023-August/129255.html

The vmsge[u].vx pseudo should be expanded to masked vmslt[u].vx only when
vd != v0.  Otherwise, it should be expanded to unmasked one.

gas/
* config/tc-riscv.c (vector_macro): Fixed the wrong expansion for
pseudo vmsge[u].vx instructions.
* testsuite/gas/riscv/vector-insns-vmsgtvx.d: Updated.

gas/config/tc-riscv.c
gas/testsuite/gas/riscv/vector-insns-vmsgtvx.d

index 959cbbc32a5e6d357045fd9df9e46c10a4209d53..e49b34fd5245c51b587d4c306f0501594135be2b 100644 (file)
@@ -1966,13 +1966,13 @@ vector_macro (struct riscv_cl_insn *ip)
          /* Masked.  Have vtemp to avoid overlap constraints.  */
          if (vd == vm)
            {
-             macro_build (NULL, "vmslt.vx", "Vd,Vt,s", vtemp, vs2, vs1);
+             macro_build (NULL, "vmslt.vx", "Vd,Vt,sVm", vtemp, vs2, vs1, -1);
              macro_build (NULL, "vmandnot.mm", "Vd,Vt,Vs", vd, vm, vtemp);
            }
          else
            {
              /* Preserve the value of vd if not updating by vm.  */
-             macro_build (NULL, "vmslt.vx", "Vd,Vt,s", vtemp, vs2, vs1);
+             macro_build (NULL, "vmslt.vx", "Vd,Vt,sVm", vtemp, vs2, vs1, -1);
              macro_build (NULL, "vmandnot.mm", "Vd,Vt,Vs", vtemp, vm, vtemp);
              macro_build (NULL, "vmandnot.mm", "Vd,Vt,Vs", vd, vd, vm);
              macro_build (NULL, "vmor.mm", "Vd,Vt,Vs", vd, vtemp, vd);
@@ -2001,13 +2001,13 @@ vector_macro (struct riscv_cl_insn *ip)
          /* Masked.  Have vtemp to avoid overlap constraints.  */
          if (vd == vm)
            {
-             macro_build (NULL, "vmsltu.vx", "Vd,Vt,s", vtemp, vs2, vs1);
+             macro_build (NULL, "vmsltu.vx", "Vd,Vt,sVm", vtemp, vs2, vs1, -1);
              macro_build (NULL, "vmandnot.mm", "Vd,Vt,Vs", vd, vm, vtemp);
            }
          else
            {
              /* Preserve the value of vd if not updating by vm.  */
-             macro_build (NULL, "vmsltu.vx", "Vd,Vt,s", vtemp, vs2, vs1);
+             macro_build (NULL, "vmsltu.vx", "Vd,Vt,sVm", vtemp, vs2, vs1, -1);
              macro_build (NULL, "vmandnot.mm", "Vd,Vt,Vs", vtemp, vm, vtemp);
              macro_build (NULL, "vmandnot.mm", "Vd,Vt,Vs", vd, vd, vm);
              macro_build (NULL, "vmor.mm", "Vd,Vt,Vs", vd, vtemp, vd);
index dcc951a3cbf71ae9d4255ebb3b7716adde0bfda2..aa633e357c91ca95b1c6a2ea8c17a38863b50a5c 100644 (file)
@@ -11,9 +11,9 @@ Disassembly of section .text:
 [      ]+[0-9a-f]+:[   ]+76422257[     ]+vmnot.m[      ]+v4,v4
 [      ]+[0-9a-f]+:[   ]+6cc64457[     ]+vmslt.vx[     ]+v8,v12,a2,v0.t
 [      ]+[0-9a-f]+:[   ]+6e802457[     ]+vmxor.mm[     ]+v8,v8,v0
-[      ]+[0-9a-f]+:[   ]+6c85c657[     ]+vmslt.vx[     ]+v12,v8,a1,v0.t
+[      ]+[0-9a-f]+:[   ]+6e85c657[     ]+vmslt.vx[     ]+v12,v8,a1
 [      ]+[0-9a-f]+:[   ]+62062057[     ]+vmandn.mm[    ]+v0,v0,v12
-[      ]+[0-9a-f]+:[   ]+6c85c657[     ]+vmslt.vx[     ]+v12,v8,a1,v0.t
+[      ]+[0-9a-f]+:[   ]+6e85c657[     ]+vmslt.vx[     ]+v12,v8,a1
 [      ]+[0-9a-f]+:[   ]+62062657[     ]+vmandn.mm[    ]+v12,v0,v12
 [      ]+[0-9a-f]+:[   ]+62402257[     ]+vmandn.mm[    ]+v4,v4,v0
 [      ]+[0-9a-f]+:[   ]+6ac22257[     ]+vmor.mm[      ]+v4,v12,v4
@@ -21,9 +21,9 @@ Disassembly of section .text:
 [      ]+[0-9a-f]+:[   ]+76422257[     ]+vmnot.m[      ]+v4,v4
 [      ]+[0-9a-f]+:[   ]+68c64457[     ]+vmsltu.vx[    ]+v8,v12,a2,v0.t
 [      ]+[0-9a-f]+:[   ]+6e802457[     ]+vmxor.mm[     ]+v8,v8,v0
-[      ]+[0-9a-f]+:[   ]+6885c657[     ]+vmsltu.vx[    ]+v12,v8,a1,v0.t
+[      ]+[0-9a-f]+:[   ]+6a85c657[     ]+vmsltu.vx[    ]+v12,v8,a1
 [      ]+[0-9a-f]+:[   ]+62062057[     ]+vmandn.mm[    ]+v0,v0,v12
-[      ]+[0-9a-f]+:[   ]+6885c657[     ]+vmsltu.vx[    ]+v12,v8,a1,v0.t
+[      ]+[0-9a-f]+:[   ]+6a85c657[     ]+vmsltu.vx[    ]+v12,v8,a1
 [      ]+[0-9a-f]+:[   ]+62062657[     ]+vmandn.mm[    ]+v12,v0,v12
 [      ]+[0-9a-f]+:[   ]+62402257[     ]+vmandn.mm[    ]+v4,v4,v0
 [      ]+[0-9a-f]+:[   ]+6ac22257[     ]+vmor.mm[      ]+v4,v12,v4