[llvm] r337272 - [AArch64][SVE] Asm: Support for predicated FP operations (FP immediate)

Sander de Smalen via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 17 05:36:09 PDT 2018


Author: s.desmalen
Date: Tue Jul 17 05:36:08 2018
New Revision: 337272

URL: http://llvm.org/viewvc/llvm-project?rev=337272&view=rev
Log:
[AArch64][SVE] Asm: Support for predicated FP operations (FP immediate)

This patch completes support for the following floating point
instructions that take FP immediates:
  FADD*  (addition)
  FSUB   (subtract)
  FSUBR  (subtract reverse form)
  FMUL*  (multiplication)
  FMAX*  (maximum)
  FMAXNM (maximum number)
  FMIN   (maximum)
  FMINNM (maximum number)

All operations are predicated and take a FP immediate operand,
e.g.

  fadd z0.h, p0/m, z0.h, #0.5
  fmin z0.s, p0/m, z0.s, #1.0
        ^___________^ (tied)

* Instructions added in a previous patch.

Modified:
    llvm/trunk/lib/Target/AArch64/AArch64SVEInstrInfo.td
    llvm/trunk/test/MC/AArch64/SVE/fmaxnm-diagnostics.s
    llvm/trunk/test/MC/AArch64/SVE/fmaxnm.s
    llvm/trunk/test/MC/AArch64/SVE/fmin-diagnostics.s
    llvm/trunk/test/MC/AArch64/SVE/fmin.s
    llvm/trunk/test/MC/AArch64/SVE/fminnm-diagnostics.s
    llvm/trunk/test/MC/AArch64/SVE/fminnm.s
    llvm/trunk/test/MC/AArch64/SVE/fsub-diagnostics.s
    llvm/trunk/test/MC/AArch64/SVE/fsub.s
    llvm/trunk/test/MC/AArch64/SVE/fsubr-diagnostics.s
    llvm/trunk/test/MC/AArch64/SVE/fsubr.s

Modified: llvm/trunk/lib/Target/AArch64/AArch64SVEInstrInfo.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64SVEInstrInfo.td?rev=337272&r1=337271&r2=337272&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AArch64SVEInstrInfo.td (original)
+++ llvm/trunk/lib/Target/AArch64/AArch64SVEInstrInfo.td Tue Jul 17 05:36:08 2018
@@ -82,8 +82,13 @@ let Predicates = [HasSVE] in {
   defm UABD_ZPmZ : sve_int_bin_pred_arit_1<0b101, "uabd">;
 
   defm FADD_ZPmI    : sve_fp_2op_i_p_zds<0b000, "fadd", sve_fpimm_half_one>;
+  defm FSUB_ZPmI    : sve_fp_2op_i_p_zds<0b001, "fsub", sve_fpimm_half_one>;
   defm FMUL_ZPmI    : sve_fp_2op_i_p_zds<0b010, "fmul", sve_fpimm_half_two>;
+  defm FSUBR_ZPmI   : sve_fp_2op_i_p_zds<0b011, "fsubr", sve_fpimm_half_one>;
+  defm FMAXNM_ZPmI  : sve_fp_2op_i_p_zds<0b100, "fmaxnm", sve_fpimm_zero_one>;
+  defm FMINNM_ZPmI  : sve_fp_2op_i_p_zds<0b101, "fminnm", sve_fpimm_zero_one>;
   defm FMAX_ZPmI    : sve_fp_2op_i_p_zds<0b110, "fmax", sve_fpimm_zero_one>;
+  defm FMIN_ZPmI    : sve_fp_2op_i_p_zds<0b111, "fmin", sve_fpimm_zero_one>;
 
   defm FADD_ZPmZ   : sve_fp_2op_p_zds<0b0000, "fadd">;
   defm FSUB_ZPmZ   : sve_fp_2op_p_zds<0b0001, "fsub">;

Modified: llvm/trunk/test/MC/AArch64/SVE/fmaxnm-diagnostics.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/SVE/fmaxnm-diagnostics.s?rev=337272&r1=337271&r2=337272&view=diff
==============================================================================
--- llvm/trunk/test/MC/AArch64/SVE/fmaxnm-diagnostics.s (original)
+++ llvm/trunk/test/MC/AArch64/SVE/fmaxnm-diagnostics.s Tue Jul 17 05:36:08 2018
@@ -1,5 +1,33 @@
 // RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve  2>&1 < %s| FileCheck %s
 
+// ------------------------------------------------------------------------- //
+// Invalid immediates (must be 0.0 or 1.0)
+
+fmaxnm z0.h, p0/m, z0.h, #0.5
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fmaxnm z0.h, p0/m, z0.h, #0.5
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fmaxnm z0.h, p0/m, z0.h, #-0.0
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fmaxnm z0.h, p0/m, z0.h, #-0.0
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fmaxnm z0.h, p0/m, z0.h, #0.0000000000000000000000001
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fmaxnm z0.h, p0/m, z0.h, #0.0000000000000000000000001
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fmaxnm z0.h, p0/m, z0.h, #1.0000000000000000000000001
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fmaxnm z0.h, p0/m, z0.h, #1.0000000000000000000000001
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fmaxnm z0.h, p0/m, z0.h, #0.9999999999999999999999999
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fmaxnm z0.h, p0/m, z0.h, #0.9999999999999999999999999
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
 
 // ------------------------------------------------------------------------- //
 // Tied operands must match

Modified: llvm/trunk/test/MC/AArch64/SVE/fmaxnm.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/SVE/fmaxnm.s?rev=337272&r1=337271&r2=337272&view=diff
==============================================================================
--- llvm/trunk/test/MC/AArch64/SVE/fmaxnm.s (original)
+++ llvm/trunk/test/MC/AArch64/SVE/fmaxnm.s Tue Jul 17 05:36:08 2018
@@ -7,6 +7,54 @@
 // RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve < %s \
 // RUN:        | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
 
+fmaxnm  z0.h, p0/m, z0.h, #0.000000000000000
+// CHECK-INST: fmaxnm	z0.h, p0/m, z0.h, #0.0
+// CHECK-ENCODING: [0x00,0x80,0x5c,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 5c 65 <unknown>
+
+fmaxnm  z0.h, p0/m, z0.h, #0.0
+// CHECK-INST: fmaxnm	z0.h, p0/m, z0.h, #0.0
+// CHECK-ENCODING: [0x00,0x80,0x5c,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 5c 65 <unknown>
+
+fmaxnm  z0.s, p0/m, z0.s, #0.0
+// CHECK-INST: fmaxnm	z0.s, p0/m, z0.s, #0.0
+// CHECK-ENCODING: [0x00,0x80,0x9c,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 9c 65 <unknown>
+
+fmaxnm  z0.d, p0/m, z0.d, #0.0
+// CHECK-INST: fmaxnm	z0.d, p0/m, z0.d, #0.0
+// CHECK-ENCODING: [0x00,0x80,0xdc,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 dc 65 <unknown>
+
+fmaxnm  z31.h, p7/m, z31.h, #1.000000000000000
+// CHECK-INST: fmaxnm	z31.h, p7/m, z31.h, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x5c,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 5c 65 <unknown>
+
+fmaxnm  z31.h, p7/m, z31.h, #1.0
+// CHECK-INST: fmaxnm	z31.h, p7/m, z31.h, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x5c,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 5c 65 <unknown>
+
+fmaxnm  z31.s, p7/m, z31.s, #1.0
+// CHECK-INST: fmaxnm	z31.s, p7/m, z31.s, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x9c,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 9c 65 <unknown>
+
+fmaxnm  z31.d, p7/m, z31.d, #1.0
+// CHECK-INST: fmaxnm	z31.d, p7/m, z31.d, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0xdc,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c dc 65 <unknown>
+
 fmaxnm  z0.h, p7/m, z0.h, z31.h
 // CHECK-INST: fmaxnm	z0.h, p7/m, z0.h, z31.h
 // CHECK-ENCODING: [0xe0,0x9f,0x44,0x65]

Modified: llvm/trunk/test/MC/AArch64/SVE/fmin-diagnostics.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/SVE/fmin-diagnostics.s?rev=337272&r1=337271&r2=337272&view=diff
==============================================================================
--- llvm/trunk/test/MC/AArch64/SVE/fmin-diagnostics.s (original)
+++ llvm/trunk/test/MC/AArch64/SVE/fmin-diagnostics.s Tue Jul 17 05:36:08 2018
@@ -1,5 +1,33 @@
 // RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve  2>&1 < %s| FileCheck %s
 
+// ------------------------------------------------------------------------- //
+// Invalid immediates (must be 0.0 or 1.0)
+
+fmin z0.h, p0/m, z0.h, #0.5
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fmin z0.h, p0/m, z0.h, #0.5
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fmin z0.h, p0/m, z0.h, #-0.0
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fmin z0.h, p0/m, z0.h, #-0.0
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fmin z0.h, p0/m, z0.h, #0.0000000000000000000000001
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fmin z0.h, p0/m, z0.h, #0.0000000000000000000000001
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fmin z0.h, p0/m, z0.h, #1.0000000000000000000000001
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fmin z0.h, p0/m, z0.h, #1.0000000000000000000000001
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fmin z0.h, p0/m, z0.h, #0.9999999999999999999999999
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fmin z0.h, p0/m, z0.h, #0.9999999999999999999999999
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
 
 // ------------------------------------------------------------------------- //
 // Tied operands must match

Modified: llvm/trunk/test/MC/AArch64/SVE/fmin.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/SVE/fmin.s?rev=337272&r1=337271&r2=337272&view=diff
==============================================================================
--- llvm/trunk/test/MC/AArch64/SVE/fmin.s (original)
+++ llvm/trunk/test/MC/AArch64/SVE/fmin.s Tue Jul 17 05:36:08 2018
@@ -7,6 +7,54 @@
 // RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve < %s \
 // RUN:        | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
 
+fmin    z0.h, p0/m, z0.h, #0.000000000000000
+// CHECK-INST: fmin	z0.h, p0/m, z0.h, #0.0
+// CHECK-ENCODING: [0x00,0x80,0x5f,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 5f 65 <unknown>
+
+fmin    z0.h, p0/m, z0.h, #0.0
+// CHECK-INST: fmin	z0.h, p0/m, z0.h, #0.0
+// CHECK-ENCODING: [0x00,0x80,0x5f,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 5f 65 <unknown>
+
+fmin    z0.s, p0/m, z0.s, #0.0
+// CHECK-INST: fmin	z0.s, p0/m, z0.s, #0.0
+// CHECK-ENCODING: [0x00,0x80,0x9f,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 9f 65 <unknown>
+
+fmin    z0.d, p0/m, z0.d, #0.0
+// CHECK-INST: fmin	z0.d, p0/m, z0.d, #0.0
+// CHECK-ENCODING: [0x00,0x80,0xdf,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 df 65 <unknown>
+
+fmin    z31.h, p7/m, z31.h, #1.000000000000000
+// CHECK-INST: fmin	z31.h, p7/m, z31.h, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x5f,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 5f 65 <unknown>
+
+fmin    z31.h, p7/m, z31.h, #1.0
+// CHECK-INST: fmin	z31.h, p7/m, z31.h, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x5f,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 5f 65 <unknown>
+
+fmin    z31.s, p7/m, z31.s, #1.0
+// CHECK-INST: fmin	z31.s, p7/m, z31.s, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x9f,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 9f 65 <unknown>
+
+fmin    z31.d, p7/m, z31.d, #1.0
+// CHECK-INST: fmin	z31.d, p7/m, z31.d, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0xdf,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c df 65 <unknown>
+
 fmin    z0.h, p7/m, z0.h, z31.h
 // CHECK-INST: fmin	z0.h, p7/m, z0.h, z31.h
 // CHECK-ENCODING: [0xe0,0x9f,0x47,0x65]

Modified: llvm/trunk/test/MC/AArch64/SVE/fminnm-diagnostics.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/SVE/fminnm-diagnostics.s?rev=337272&r1=337271&r2=337272&view=diff
==============================================================================
--- llvm/trunk/test/MC/AArch64/SVE/fminnm-diagnostics.s (original)
+++ llvm/trunk/test/MC/AArch64/SVE/fminnm-diagnostics.s Tue Jul 17 05:36:08 2018
@@ -1,5 +1,33 @@
 // RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve  2>&1 < %s| FileCheck %s
 
+// ------------------------------------------------------------------------- //
+// Invalid immediates (must be 0.0 or 1.0)
+
+fminnm z0.h, p0/m, z0.h, #0.5
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fminnm z0.h, p0/m, z0.h, #0.5
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fminnm z0.h, p0/m, z0.h, #-0.0
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fminnm z0.h, p0/m, z0.h, #-0.0
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fminnm z0.h, p0/m, z0.h, #0.0000000000000000000000001
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fminnm z0.h, p0/m, z0.h, #0.0000000000000000000000001
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fminnm z0.h, p0/m, z0.h, #1.0000000000000000000000001
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fminnm z0.h, p0/m, z0.h, #1.0000000000000000000000001
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fminnm z0.h, p0/m, z0.h, #0.9999999999999999999999999
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.0 or 1.0.
+// CHECK-NEXT: fminnm z0.h, p0/m, z0.h, #0.9999999999999999999999999
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
 
 // ------------------------------------------------------------------------- //
 // Tied operands must match

Modified: llvm/trunk/test/MC/AArch64/SVE/fminnm.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/SVE/fminnm.s?rev=337272&r1=337271&r2=337272&view=diff
==============================================================================
--- llvm/trunk/test/MC/AArch64/SVE/fminnm.s (original)
+++ llvm/trunk/test/MC/AArch64/SVE/fminnm.s Tue Jul 17 05:36:08 2018
@@ -7,6 +7,54 @@
 // RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve < %s \
 // RUN:        | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
 
+fminnm  z0.h, p0/m, z0.h, #0.000000000000000
+// CHECK-INST: fminnm	z0.h, p0/m, z0.h, #0.0
+// CHECK-ENCODING: [0x00,0x80,0x5d,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 5d 65 <unknown>
+
+fminnm  z0.h, p0/m, z0.h, #0.0
+// CHECK-INST: fminnm	z0.h, p0/m, z0.h, #0.0
+// CHECK-ENCODING: [0x00,0x80,0x5d,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 5d 65 <unknown>
+
+fminnm  z0.s, p0/m, z0.s, #0.0
+// CHECK-INST: fminnm	z0.s, p0/m, z0.s, #0.0
+// CHECK-ENCODING: [0x00,0x80,0x9d,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 9d 65 <unknown>
+
+fminnm  z0.d, p0/m, z0.d, #0.0
+// CHECK-INST: fminnm	z0.d, p0/m, z0.d, #0.0
+// CHECK-ENCODING: [0x00,0x80,0xdd,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 dd 65 <unknown>
+
+fminnm  z31.h, p7/m, z31.h, #1.000000000000000
+// CHECK-INST: fminnm	z31.h, p7/m, z31.h, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x5d,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 5d 65 <unknown>
+
+fminnm  z31.h, p7/m, z31.h, #1.0
+// CHECK-INST: fminnm	z31.h, p7/m, z31.h, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x5d,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 5d 65 <unknown>
+
+fminnm  z31.s, p7/m, z31.s, #1.0
+// CHECK-INST: fminnm	z31.s, p7/m, z31.s, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x9d,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 9d 65 <unknown>
+
+fminnm  z31.d, p7/m, z31.d, #1.0
+// CHECK-INST: fminnm	z31.d, p7/m, z31.d, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0xdd,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c dd 65 <unknown>
+
 fminnm  z0.h, p7/m, z0.h, z31.h
 // CHECK-INST: fminnm	z0.h, p7/m, z0.h, z31.h
 // CHECK-ENCODING: [0xe0,0x9f,0x45,0x65]

Modified: llvm/trunk/test/MC/AArch64/SVE/fsub-diagnostics.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/SVE/fsub-diagnostics.s?rev=337272&r1=337271&r2=337272&view=diff
==============================================================================
--- llvm/trunk/test/MC/AArch64/SVE/fsub-diagnostics.s (original)
+++ llvm/trunk/test/MC/AArch64/SVE/fsub-diagnostics.s Tue Jul 17 05:36:08 2018
@@ -1,5 +1,33 @@
 // RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve  2>&1 < %s| FileCheck %s
 
+// ------------------------------------------------------------------------- //
+// Invalid immediates (must be 0.5 or 1.0)
+
+fsub z0.h, p0/m, z0.h, #0.0
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.5 or 1.0.
+// CHECK-NEXT: fsub z0.h, p0/m, z0.h, #0.0
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fsub z0.h, p0/m, z0.h, #0.4999999999999999999999999
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.5 or 1.0.
+// CHECK-NEXT: fsub z0.h, p0/m, z0.h, #0.4999999999999999999999999
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fsub z0.h, p0/m, z0.h, #0.5000000000000000000000001
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.5 or 1.0.
+// CHECK-NEXT: fsub z0.h, p0/m, z0.h, #0.5000000000000000000000001
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fsub z0.h, p0/m, z0.h, #1.0000000000000000000000001
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.5 or 1.0.
+// CHECK-NEXT: fsub z0.h, p0/m, z0.h, #1.0000000000000000000000001
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fsub z0.h, p0/m, z0.h, #0.9999999999999999999999999
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.5 or 1.0.
+// CHECK-NEXT: fsub z0.h, p0/m, z0.h, #0.9999999999999999999999999
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
 
 // ------------------------------------------------------------------------- //
 // Tied operands must match

Modified: llvm/trunk/test/MC/AArch64/SVE/fsub.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/SVE/fsub.s?rev=337272&r1=337271&r2=337272&view=diff
==============================================================================
--- llvm/trunk/test/MC/AArch64/SVE/fsub.s (original)
+++ llvm/trunk/test/MC/AArch64/SVE/fsub.s Tue Jul 17 05:36:08 2018
@@ -7,6 +7,54 @@
 // RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve < %s \
 // RUN:        | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
 
+fsub    z0.h, p0/m, z0.h, #0.500000000000000
+// CHECK-INST: fsub	z0.h, p0/m, z0.h, #0.5
+// CHECK-ENCODING: [0x00,0x80,0x59,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 59 65 <unknown>
+
+fsub    z0.h, p0/m, z0.h, #0.5
+// CHECK-INST: fsub	z0.h, p0/m, z0.h, #0.5
+// CHECK-ENCODING: [0x00,0x80,0x59,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 59 65 <unknown>
+
+fsub    z0.s, p0/m, z0.s, #0.5
+// CHECK-INST: fsub	z0.s, p0/m, z0.s, #0.5
+// CHECK-ENCODING: [0x00,0x80,0x99,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 99 65 <unknown>
+
+fsub    z0.d, p0/m, z0.d, #0.5
+// CHECK-INST: fsub	z0.d, p0/m, z0.d, #0.5
+// CHECK-ENCODING: [0x00,0x80,0xd9,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 d9 65 <unknown>
+
+fsub    z31.h, p7/m, z31.h, #1.000000000000000
+// CHECK-INST: fsub	z31.h, p7/m, z31.h, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x59,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 59 65 <unknown>
+
+fsub    z31.h, p7/m, z31.h, #1.0
+// CHECK-INST: fsub	z31.h, p7/m, z31.h, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x59,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 59 65 <unknown>
+
+fsub    z31.s, p7/m, z31.s, #1.0
+// CHECK-INST: fsub	z31.s, p7/m, z31.s, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x99,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 99 65 <unknown>
+
+fsub    z31.d, p7/m, z31.d, #1.0
+// CHECK-INST: fsub	z31.d, p7/m, z31.d, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0xd9,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c d9 65 <unknown>
+
 fsub    z0.h, p7/m, z0.h, z31.h
 // CHECK-INST: fsub	z0.h, p7/m, z0.h, z31.h
 // CHECK-ENCODING: [0xe0,0x9f,0x41,0x65]

Modified: llvm/trunk/test/MC/AArch64/SVE/fsubr-diagnostics.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/SVE/fsubr-diagnostics.s?rev=337272&r1=337271&r2=337272&view=diff
==============================================================================
--- llvm/trunk/test/MC/AArch64/SVE/fsubr-diagnostics.s (original)
+++ llvm/trunk/test/MC/AArch64/SVE/fsubr-diagnostics.s Tue Jul 17 05:36:08 2018
@@ -1,5 +1,33 @@
 // RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve  2>&1 < %s| FileCheck %s
 
+// ------------------------------------------------------------------------- //
+// Invalid immediates (must be 0.5 or 1.0)
+
+fsubr z0.h, p0/m, z0.h, #0.0
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.5 or 1.0.
+// CHECK-NEXT: fsubr z0.h, p0/m, z0.h, #0.0
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fsubr z0.h, p0/m, z0.h, #0.4999999999999999999999999
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.5 or 1.0.
+// CHECK-NEXT: fsubr z0.h, p0/m, z0.h, #0.4999999999999999999999999
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fsubr z0.h, p0/m, z0.h, #0.5000000000000000000000001
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.5 or 1.0.
+// CHECK-NEXT: fsubr z0.h, p0/m, z0.h, #0.5000000000000000000000001
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fsubr z0.h, p0/m, z0.h, #1.0000000000000000000000001
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.5 or 1.0.
+// CHECK-NEXT: fsubr z0.h, p0/m, z0.h, #1.0000000000000000000000001
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+fsubr z0.h, p0/m, z0.h, #0.9999999999999999999999999
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid floating point constant, expected 0.5 or 1.0.
+// CHECK-NEXT: fsubr z0.h, p0/m, z0.h, #0.9999999999999999999999999
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
 
 // ------------------------------------------------------------------------- //
 // Tied operands must match

Modified: llvm/trunk/test/MC/AArch64/SVE/fsubr.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/SVE/fsubr.s?rev=337272&r1=337271&r2=337272&view=diff
==============================================================================
--- llvm/trunk/test/MC/AArch64/SVE/fsubr.s (original)
+++ llvm/trunk/test/MC/AArch64/SVE/fsubr.s Tue Jul 17 05:36:08 2018
@@ -7,6 +7,54 @@
 // RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve < %s \
 // RUN:        | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
 
+fsubr   z0.h, p0/m, z0.h, #0.500000000000000
+// CHECK-INST: fsubr	z0.h, p0/m, z0.h, #0.5
+// CHECK-ENCODING: [0x00,0x80,0x5b,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 5b 65 <unknown>
+
+fsubr   z0.h, p0/m, z0.h, #0.5
+// CHECK-INST: fsubr	z0.h, p0/m, z0.h, #0.5
+// CHECK-ENCODING: [0x00,0x80,0x5b,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 5b 65 <unknown>
+
+fsubr   z0.s, p0/m, z0.s, #0.5
+// CHECK-INST: fsubr	z0.s, p0/m, z0.s, #0.5
+// CHECK-ENCODING: [0x00,0x80,0x9b,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 9b 65 <unknown>
+
+fsubr   z0.d, p0/m, z0.d, #0.5
+// CHECK-INST: fsubr	z0.d, p0/m, z0.d, #0.5
+// CHECK-ENCODING: [0x00,0x80,0xdb,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 00 80 db 65 <unknown>
+
+fsubr   z31.h, p7/m, z31.h, #1.000000000000000
+// CHECK-INST: fsubr	z31.h, p7/m, z31.h, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x5b,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 5b 65 <unknown>
+
+fsubr   z31.h, p7/m, z31.h, #1.0
+// CHECK-INST: fsubr	z31.h, p7/m, z31.h, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x5b,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 5b 65 <unknown>
+
+fsubr   z31.s, p7/m, z31.s, #1.0
+// CHECK-INST: fsubr	z31.s, p7/m, z31.s, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0x9b,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c 9b 65 <unknown>
+
+fsubr   z31.d, p7/m, z31.d, #1.0
+// CHECK-INST: fsubr	z31.d, p7/m, z31.d, #1.0
+// CHECK-ENCODING: [0x3f,0x9c,0xdb,0x65]
+// CHECK-ERROR: instruction requires: sve
+// CHECK-UNKNOWN: 3f 9c db 65 <unknown>
+
 fsubr   z0.h, p7/m, z0.h, z31.h
 // CHECK-INST: fsubr	z0.h, p7/m, z0.h, z31.h
 // CHECK-ENCODING: [0xe0,0x9f,0x43,0x65]




More information about the llvm-commits mailing list