[ARM] Accept two-register form of vnmul
authorJirui Wu <jirui.wu@arm.com>
Fri, 13 Jan 2023 15:07:12 +0000 (15:07 +0000)
committerOliver Stannard <oliver.stannard@linaro.org>
Fri, 13 Jan 2023 15:16:41 +0000 (15:16 +0000)
The previous vnmul only accepts three registers. It should accept either
two or three registers as vmul does.

Differential Revision: https://reviews.llvm.org/D141405

llvm/lib/Target/ARM/ARMInstrVFP.td
llvm/test/MC/ARM/fullfp16.s
llvm/test/MC/ARM/simple-fp-encoding.s
llvm/test/MC/Disassembler/ARM/fp-encoding.txt
llvm/test/MC/Disassembler/ARM/fullfp16-arm.txt
llvm/test/MC/Disassembler/ARM/fullfp16-thumb.txt

index 8be35c8..c1fecf3 100644 (file)
@@ -496,12 +496,14 @@ def VMULH  : AHbI<0b11100, 0b10, 0, 0,
                   [(set (f16 HPR:$Sd), (fmul (f16 HPR:$Sn), (f16 HPR:$Sm)))]>,
              Sched<[WriteFPMUL32, ReadFPMUL, ReadFPMUL]>;
 
+let TwoOperandAliasConstraint = "$Dn = $Dd" in
 def VNMULD : ADbI<0b11100, 0b10, 1, 0,
                   (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
                   IIC_fpMUL64, "vnmul", ".f64\t$Dd, $Dn, $Dm",
                   [(set DPR:$Dd, (fneg (fmul DPR:$Dn, (f64 DPR:$Dm))))]>,
              Sched<[WriteFPMUL64, ReadFPMUL, ReadFPMUL]>;
 
+let TwoOperandAliasConstraint = "$Sn = $Sd" in
 def VNMULS : ASbI<0b11100, 0b10, 1, 0,
                   (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
                   IIC_fpMUL32, "vnmul", ".f32\t$Sd, $Sn, $Sm",
@@ -512,6 +514,7 @@ def VNMULS : ASbI<0b11100, 0b10, 1, 0,
   let D = VFPNeonA8Domain;
 }
 
+let TwoOperandAliasConstraint = "$Sn = $Sd" in
 def VNMULH : AHbI<0b11100, 0b10, 1, 0,
                   (outs HPR:$Sd), (ins HPR:$Sn, HPR:$Sm),
                   IIC_fpMUL16, "vnmul", ".f16\t$Sd, $Sn, $Sm",
index d9149ee..fcb5d83 100644 (file)
 @ ARM:   vnmul.f16 s0, s1, s0        @ encoding: [0xc0,0x09,0x20,0xee]
 @ THUMB: vnmul.f16 s0, s1, s0        @ encoding: [0x20,0xee,0xc0,0x09]
 
+         vnmul.f16     s0, s1
+@ ARM:   vnmul.f16 s0, s0, s1       @ encoding: [0x60,0x09,0x20,0xee]
+@ THUMB: vnmul.f16 s0, s0, s1       @ encoding: [0x20,0xee,0x60,0x09]
+
          vmla.f16        s1, s2, s0
 @ ARM:   vmla.f16 s1, s2, s0         @ encoding: [0x00,0x09,0x41,0xee]
 @ THUMB: vmla.f16 s1, s2, s0         @ encoding: [0x41,0xee,0x00,0x09]
index 74babf9..22bc304 100644 (file)
 
         vnmul.f64       d16, d17, d16
         vnmul.f32       s0, s1, s0
+        vnmul.f64       d0, d1
+        vnmul.f32       s0, s1
 
 @ CHECK: vnmul.f64 d16, d17, d16     @ encoding: [0xe0,0x0b,0x61,0xee]
 @ CHECK: vnmul.f32 s0, s1, s0        @ encoding: [0xc0,0x0a,0x20,0xee]
+@ CHECK: vnmul.f64 d0, d0, d1        @ encoding: [0x41,0x0b,0x20,0xee]
+@ CHECK: vnmul.f32 s0, s0, s1        @ encoding: [0x60,0x0a,0x20,0xee]
 
         vcmp.f64       d17, d16
         vcmp.f32       s1, s0
index 196bf44..beccce8 100644 (file)
 0xe0 0x0b 0x61 0xee
 # CHECK: vnmul.f64       d16, d17, d16
 
+0x41 0x0b 0x20 0xee
+# CHECK: vnmul.f64       d0, d0, d1
+
 0xc0 0x0a 0x20 0xee
 # CHECK: vnmul.f32       s0, s1, s0
 
+0x60 0x0a 0x20 0xee
+# CHECK: vnmul.f32       s0, s0, s1
+
 0xe0 0x1b 0xf4 0xee
 # CHECK: vcmpe.f64       d17, d16
 
index 8a7ce68..c40a374 100644 (file)
@@ -15,6 +15,9 @@
 # CHECK:        vnmul.f16       s0, s1, s0
 [0xc0,0x09,0x20,0xee]
 
+# CHECK:        vnmul.f16       s0, s0, s1 
+[0x60,0x09,0x20,0xee]
+
 # CHECK:        vmla.f16        s1, s2, s0
 [0x00,0x09,0x41,0xee]
 
index 4511720..c7d4406 100644 (file)
@@ -15,6 +15,9 @@
 # CHECK:        vnmul.f16       s0, s1, s0
 [0x20,0xee,0xc0,0x09]
 
+# CHECK:        vnmul.f16       s0, s0, s1 
+[0x20,0xee,0x60,0x09]
+
 # CHECK:        vmla.f16        s1, s2, s0
 [0x41,0xee,0x00,0x09]