]> granicus.if.org Git - llvm/commitdiff
[AArch64][SVE] Asm: Support for predicated FP operations (FP immediate)
authorSander de Smalen <sander.desmalen@arm.com>
Tue, 17 Jul 2018 12:36:08 +0000 (12:36 +0000)
committerSander de Smalen <sander.desmalen@arm.com>
Tue, 17 Jul 2018 12:36:08 +0000 (12:36 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337272 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 521253baf635b65a45b3ac01b2de5b5f701f3d51..b9de1f61fe7c5086d2d6b98bb8ea0022f22b6e81 100644 (file)
@@ -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">;
index 467585ac7c5ae85cc9a1ccaee83f2264af97b688..3fe1e6ea9b5be077e6802a06a4f731bf521c174a 100644 (file)
@@ -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
index cc5143c3d781df86c71dd3a2c766a299ce82bf44..3016f63154a2edc4792eb10187c9fc53955dfa35 100644 (file)
@@ -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]
index 7bf848a847dff9ab0d891f9e9041a3d6c181f6b3..0d8dc64e92f7b52d3e7b7cef2638a17b2de0ca79 100644 (file)
@@ -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
index 18c6cfbd6cd974f4b256edb3b245e3653a36c906..2db4d5ca842a0431f6d3c83c3b66596640917cae 100644 (file)
@@ -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]
index 1cd7b593d2d93dfcccfd65815cb87dc447804049..d717e91b84b344f059573c3eeeeab460635d4251 100644 (file)
@@ -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
index a8d74722aa1b7f410531bbe46d31348bb3b8a35e..492d5898518c0c1a0e74267fc5aa71743027935a 100644 (file)
@@ -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]
index cb44c2adc794d568b7f5c330d71fd55987ca5e2a..a67d6782905da40f842a50009d7c0d9aefabfe32 100644 (file)
@@ -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
index e9e060f0259a26bcd0a67a207deb9c4e6039f2b1..7172c31aa6b296a8f0a7dbb194dd259ada4ba014 100644 (file)
@@ -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]
index c8ea652ebfde76268235f1ce2f3985d4fba61325..0e751f42e3fd71c209072715853f51cb31184651 100644 (file)
@@ -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
index 27ca0195a4e4a8d02cef5995e2176056ddc4905b..990a0b1ac52004c942bd1bdff4fd695adf2c1259 100644 (file)
@@ -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]