From 5431fe06df8b7a3fb0091e27ba93f18e81cd6f4e Mon Sep 17 00:00:00 2001 From: Sander de Smalen Date: Tue, 17 Jul 2018 12:36:08 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337272 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AArch64/AArch64SVEInstrInfo.td | 5 +++ test/MC/AArch64/SVE/fmaxnm-diagnostics.s | 28 +++++++++++++ test/MC/AArch64/SVE/fmaxnm.s | 48 +++++++++++++++++++++++ test/MC/AArch64/SVE/fmin-diagnostics.s | 28 +++++++++++++ test/MC/AArch64/SVE/fmin.s | 48 +++++++++++++++++++++++ test/MC/AArch64/SVE/fminnm-diagnostics.s | 28 +++++++++++++ test/MC/AArch64/SVE/fminnm.s | 48 +++++++++++++++++++++++ test/MC/AArch64/SVE/fsub-diagnostics.s | 28 +++++++++++++ test/MC/AArch64/SVE/fsub.s | 48 +++++++++++++++++++++++ test/MC/AArch64/SVE/fsubr-diagnostics.s | 28 +++++++++++++ test/MC/AArch64/SVE/fsubr.s | 48 +++++++++++++++++++++++ 11 files changed, 385 insertions(+) diff --git a/lib/Target/AArch64/AArch64SVEInstrInfo.td b/lib/Target/AArch64/AArch64SVEInstrInfo.td index 521253baf63..b9de1f61fe7 100644 --- a/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -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">; diff --git a/test/MC/AArch64/SVE/fmaxnm-diagnostics.s b/test/MC/AArch64/SVE/fmaxnm-diagnostics.s index 467585ac7c5..3fe1e6ea9b5 100644 --- a/test/MC/AArch64/SVE/fmaxnm-diagnostics.s +++ b/test/MC/AArch64/SVE/fmaxnm-diagnostics.s @@ -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 diff --git a/test/MC/AArch64/SVE/fmaxnm.s b/test/MC/AArch64/SVE/fmaxnm.s index cc5143c3d78..3016f63154a 100644 --- a/test/MC/AArch64/SVE/fmaxnm.s +++ b/test/MC/AArch64/SVE/fmaxnm.s @@ -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 + +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 + +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 + +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 + +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 + +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 + +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 + +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 + 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] diff --git a/test/MC/AArch64/SVE/fmin-diagnostics.s b/test/MC/AArch64/SVE/fmin-diagnostics.s index 7bf848a847d..0d8dc64e92f 100644 --- a/test/MC/AArch64/SVE/fmin-diagnostics.s +++ b/test/MC/AArch64/SVE/fmin-diagnostics.s @@ -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 diff --git a/test/MC/AArch64/SVE/fmin.s b/test/MC/AArch64/SVE/fmin.s index 18c6cfbd6cd..2db4d5ca842 100644 --- a/test/MC/AArch64/SVE/fmin.s +++ b/test/MC/AArch64/SVE/fmin.s @@ -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 + +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 + +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 + +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 + +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 + +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 + +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 + +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 + 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] diff --git a/test/MC/AArch64/SVE/fminnm-diagnostics.s b/test/MC/AArch64/SVE/fminnm-diagnostics.s index 1cd7b593d2d..d717e91b84b 100644 --- a/test/MC/AArch64/SVE/fminnm-diagnostics.s +++ b/test/MC/AArch64/SVE/fminnm-diagnostics.s @@ -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 diff --git a/test/MC/AArch64/SVE/fminnm.s b/test/MC/AArch64/SVE/fminnm.s index a8d74722aa1..492d5898518 100644 --- a/test/MC/AArch64/SVE/fminnm.s +++ b/test/MC/AArch64/SVE/fminnm.s @@ -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 + +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 + +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 + +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 + +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 + +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 + +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 + +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 + 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] diff --git a/test/MC/AArch64/SVE/fsub-diagnostics.s b/test/MC/AArch64/SVE/fsub-diagnostics.s index cb44c2adc79..a67d6782905 100644 --- a/test/MC/AArch64/SVE/fsub-diagnostics.s +++ b/test/MC/AArch64/SVE/fsub-diagnostics.s @@ -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 diff --git a/test/MC/AArch64/SVE/fsub.s b/test/MC/AArch64/SVE/fsub.s index e9e060f0259..7172c31aa6b 100644 --- a/test/MC/AArch64/SVE/fsub.s +++ b/test/MC/AArch64/SVE/fsub.s @@ -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 + +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 + +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 + +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 + +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 + +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 + +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 + +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 + 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] diff --git a/test/MC/AArch64/SVE/fsubr-diagnostics.s b/test/MC/AArch64/SVE/fsubr-diagnostics.s index c8ea652ebfd..0e751f42e3f 100644 --- a/test/MC/AArch64/SVE/fsubr-diagnostics.s +++ b/test/MC/AArch64/SVE/fsubr-diagnostics.s @@ -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 diff --git a/test/MC/AArch64/SVE/fsubr.s b/test/MC/AArch64/SVE/fsubr.s index 27ca0195a4e..990a0b1ac52 100644 --- a/test/MC/AArch64/SVE/fsubr.s +++ b/test/MC/AArch64/SVE/fsubr.s @@ -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 + +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 + +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 + +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 + +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 + +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 + +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 + +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 + 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] -- 2.50.1