diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td index 7b56f607a9de5..59859cb7442d5 100644 --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -4233,6 +4233,25 @@ let Predicates = [HasSVE2p2orSME2p2] in { defm FRINT32X_ZPmZ : sve_fp_2op_p_zd_frint<0b01, "frint32x">; defm FRINT64X_ZPmZ : sve_fp_2op_p_zd_frint<0b10, "frint64z">; defm FRINT64Z_ZPmZ : sve_fp_2op_p_zd_frint<0b11, "frint64x">; + // Zeroing + defm FRINT32Z_ZPzZ : sve_fp_z2op_p_zd_frint<0b00, "frint32z">; + defm FRINT32X_ZPzZ : sve_fp_z2op_p_zd_frint<0b01, "frint32x">; + defm FRINT64Z_ZPzZ : sve_fp_z2op_p_zd_frint<0b10, "frint64z">; + defm FRINT64X_ZPzZ : sve_fp_z2op_p_zd_frint<0b11, "frint64x">; + + // Floating-point round to integral fp value, zeroing predicate + defm FRINTN_ZPzZ : sve_fp_z2op_p_zd_hsd<0b00000, "frintn">; + defm FRINTP_ZPzZ : sve_fp_z2op_p_zd_hsd<0b00001, "frintp">; + defm FRINTM_ZPzZ : sve_fp_z2op_p_zd_hsd<0b00010, "frintm">; + defm FRINTZ_ZPzZ : sve_fp_z2op_p_zd_hsd<0b00011, "frintz">; + defm FRINTA_ZPzZ : sve_fp_z2op_p_zd_hsd<0b00100, "frinta">; + defm FRINTX_ZPzZ : sve_fp_z2op_p_zd_hsd<0b00110, "frintx">; + defm FRINTI_ZPzZ : sve_fp_z2op_p_zd_hsd<0b00111, "frinti">; + // Floating-point invert exponent, zeroing predicate + defm FRECPX_ZPzZ : sve_fp_z2op_p_zd_hsd<0b01100, "frecpx">; + // Floating-point square root, zeroing predicate + defm FSQRT_ZPZz : sve_fp_z2op_p_zd_hsd<0b01101, "fsqrt">; + } // End HasSME2p2orSVE2p2 //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td index b45119512f8cc..fc2e889d3a1a0 100644 --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -3143,6 +3143,44 @@ multiclass sve_fp_2op_u_zd opc, string asm, SDPatternOperator op> { def : SVE_1_Op_Pat(NAME # _D)>; } +//===----------------------------------------------------------------------===// +// SVE Floating Point Unary Operations - Zeroing Predicate Group +//===----------------------------------------------------------------------===// + +class sve_fp_z2op_p_zd opc,string asm, RegisterOperand i_zprtype, + RegisterOperand o_zprtype> +: I<(outs o_zprtype:$Zd), (ins PPR3bAny:$Pg, i_zprtype:$Zn), + asm, "\t$Zd, $Pg/z, $Zn", + "", + []>, Sched<[]> { + bits<3> Pg; + bits<5> Zd; + bits<5> Zn; + let Inst{31-24} = 0b01100100; + let Inst{23-22} = opc{6-5}; + let Inst{21-19} = 0b011; + let Inst{18-16} = opc{4-2}; + let Inst{15} = 0b1; + let Inst{14-13} = opc{1-0}; + let Inst{12-10} = Pg; + let Inst{9-5} = Zn; + let Inst{4-0} = Zd; + + let hasSideEffects = 0; + let mayRaiseFPException = 1; +} + +multiclass sve_fp_z2op_p_zd_hsd opc, string asm> { + def _H : sve_fp_z2op_p_zd<{ 0b01, opc }, asm, ZPR16, ZPR16>; + def _S : sve_fp_z2op_p_zd<{ 0b10, opc }, asm, ZPR32, ZPR32>; + def _D : sve_fp_z2op_p_zd<{ 0b11, opc }, asm, ZPR64, ZPR64>; +} + +multiclass sve_fp_z2op_p_zd_frint opc, string asm> { + def _S : sve_fp_z2op_p_zd<{ 0b0010, opc{1}, 0, opc{0} }, asm, ZPR32, ZPR32>; + def _D : sve_fp_z2op_p_zd<{ 0b0010, opc{1}, 1, opc{0} }, asm, ZPR64, ZPR64>; +} + //===----------------------------------------------------------------------===// // SVE Integer Arithmetic - Binary Predicated Group //===----------------------------------------------------------------------===// diff --git a/llvm/test/MC/AArch64/SVE/frecpx-diagnostics.s b/llvm/test/MC/AArch64/SVE/frecpx-diagnostics.s index a24f9c4a74c88..9b8d6889e5ff8 100644 --- a/llvm/test/MC/AArch64/SVE/frecpx-diagnostics.s +++ b/llvm/test/MC/AArch64/SVE/frecpx-diagnostics.s @@ -6,7 +6,7 @@ frecpx z0.b, p0/m, z0.b // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: frecpx z0.s, p0/z, z0.s -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction requires: sme2p2 or sve2p2 // CHECK-NEXT: frecpx z0.s, p0/z, z0.s // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: diff --git a/llvm/test/MC/AArch64/SVE/frinta-diagnostics.s b/llvm/test/MC/AArch64/SVE/frinta-diagnostics.s index 136e123cb7eb3..9ed088e9e9d1a 100644 --- a/llvm/test/MC/AArch64/SVE/frinta-diagnostics.s +++ b/llvm/test/MC/AArch64/SVE/frinta-diagnostics.s @@ -6,7 +6,7 @@ frinta z0.b, p0/m, z0.b // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: frinta z0.s, p0/z, z0.s -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction requires: sme2p2 or sve2p2 // CHECK-NEXT: frinta z0.s, p0/z, z0.s // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: diff --git a/llvm/test/MC/AArch64/SVE/frinti-diagnostics.s b/llvm/test/MC/AArch64/SVE/frinti-diagnostics.s index 8c619214c64d8..c8dda15a2cbd1 100644 --- a/llvm/test/MC/AArch64/SVE/frinti-diagnostics.s +++ b/llvm/test/MC/AArch64/SVE/frinti-diagnostics.s @@ -6,7 +6,7 @@ frinti z0.b, p0/m, z0.b // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: frinti z0.s, p0/z, z0.s -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction requires: sme2p2 or sve2p2 // CHECK-NEXT: frinti z0.s, p0/z, z0.s // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: diff --git a/llvm/test/MC/AArch64/SVE/frintm-diagnostics.s b/llvm/test/MC/AArch64/SVE/frintm-diagnostics.s index a8ba48d353d02..cc6e72523464a 100644 --- a/llvm/test/MC/AArch64/SVE/frintm-diagnostics.s +++ b/llvm/test/MC/AArch64/SVE/frintm-diagnostics.s @@ -6,7 +6,7 @@ frintm z0.b, p0/m, z0.b // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: frintm z0.s, p0/z, z0.s -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction requires: sme2p2 or sve2p2 // CHECK-NEXT: frintm z0.s, p0/z, z0.s // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: diff --git a/llvm/test/MC/AArch64/SVE/frintn-diagnostics.s b/llvm/test/MC/AArch64/SVE/frintn-diagnostics.s index f5fb070524364..09f64fc1ad6cf 100644 --- a/llvm/test/MC/AArch64/SVE/frintn-diagnostics.s +++ b/llvm/test/MC/AArch64/SVE/frintn-diagnostics.s @@ -6,7 +6,7 @@ frintn z0.b, p0/m, z0.b // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: frintn z0.s, p0/z, z0.s -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction requires: sme2p2 or sve2p2 // CHECK-NEXT: frintn z0.s, p0/z, z0.s // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: diff --git a/llvm/test/MC/AArch64/SVE/frintp-diagnostics.s b/llvm/test/MC/AArch64/SVE/frintp-diagnostics.s index 2766299d4c9b8..ce7b7eafd8392 100644 --- a/llvm/test/MC/AArch64/SVE/frintp-diagnostics.s +++ b/llvm/test/MC/AArch64/SVE/frintp-diagnostics.s @@ -6,7 +6,7 @@ frintp z0.b, p0/m, z0.b // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: frintp z0.s, p0/z, z0.s -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction requires: sme2p2 or sve2p2 // CHECK-NEXT: frintp z0.s, p0/z, z0.s // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: diff --git a/llvm/test/MC/AArch64/SVE/frintx-diagnostics.s b/llvm/test/MC/AArch64/SVE/frintx-diagnostics.s index 98620898cde93..edfa713ca00ac 100644 --- a/llvm/test/MC/AArch64/SVE/frintx-diagnostics.s +++ b/llvm/test/MC/AArch64/SVE/frintx-diagnostics.s @@ -6,7 +6,7 @@ frintx z0.b, p0/m, z0.b // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: frintx z0.s, p0/z, z0.s -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction requires: sme2p2 or sve2p2 // CHECK-NEXT: frintx z0.s, p0/z, z0.s // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: diff --git a/llvm/test/MC/AArch64/SVE/frintz-diagnostics.s b/llvm/test/MC/AArch64/SVE/frintz-diagnostics.s index 8bb6717ce3ac7..ec974446bed38 100644 --- a/llvm/test/MC/AArch64/SVE/frintz-diagnostics.s +++ b/llvm/test/MC/AArch64/SVE/frintz-diagnostics.s @@ -6,7 +6,7 @@ frintz z0.b, p0/m, z0.b // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: frintz z0.s, p0/z, z0.s -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction requires: sme2p2 or sve2p2 // CHECK-NEXT: frintz z0.s, p0/z, z0.s // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: diff --git a/llvm/test/MC/AArch64/SVE/fsqrt-diagnostics.s b/llvm/test/MC/AArch64/SVE/fsqrt-diagnostics.s index 8b1abedb752cd..4eb14ec343041 100644 --- a/llvm/test/MC/AArch64/SVE/fsqrt-diagnostics.s +++ b/llvm/test/MC/AArch64/SVE/fsqrt-diagnostics.s @@ -6,7 +6,7 @@ fsqrt z0.b, p0/m, z0.b // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: fsqrt z0.s, p0/z, z0.s -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction requires: sme2p2 or sve2p2 // CHECK-NEXT: fsqrt z0.s, p0/z, z0.s // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: diff --git a/llvm/test/MC/AArch64/SVE2p2/frecpx_z-diagnostics.s b/llvm/test/MC/AArch64/SVE2p2/frecpx_z-diagnostics.s new file mode 100644 index 0000000000000..b2aed8c7d5925 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frecpx_z-diagnostics.s @@ -0,0 +1,47 @@ +// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s + +// ------------------------------------------------------------------------- // +// Invalid element width + +frecpx z31.b, p7/z, z31.b +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frecpx z31.b, p7/z, z31.b +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frecpx z31.h, p7/z, z31.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frecpx z31.h, p7/z, z31.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frecpx z31.s, p7/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frecpx z31.s, p7/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frecpx z31.d, p7/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frecpx z31.d, p7/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// ------------------------------------------------------------------------- // +// Invalid predicate + +frecpx z31.h, p8/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix) +// CHECK-NEXT: frecpx z31.h, p8/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// --------------------------------------------------------------------------// +// Negative tests for instructions that are incompatible with movprfx + +movprfx z0.h, p0/z, z7.h +frecpx z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frecpx z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +movprfx z0, z7 +frecpx z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frecpx z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frecpx_z.s b/llvm/test/MC/AArch64/SVE2p2/frecpx_z.s new file mode 100644 index 0000000000000..c089c8d623bae --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frecpx_z.s @@ -0,0 +1,33 @@ +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-ERROR +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=-sme2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN +// Disassemble encoding and check the re-encoding (-show-encoding) matches. +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \ +// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST + +frecpx z0.h, p0/z, z0.h // 01100100-01011011-10000000-00000000 +// CHECK-INST: frecpx z0.h, p0/z, z0.h +// CHECK-ENCODING: [0x00,0x80,0x5b,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 645b8000 + +frecpx z23.s, p3/z, z13.s // 01100100-10011011-10001101-10110111 +// CHECK-INST: frecpx z23.s, p3/z, z13.s +// CHECK-ENCODING: [0xb7,0x8d,0x9b,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 649b8db7 + +frecpx z31.d, p7/z, z31.d // 01100100-11011011-10011111-11111111 +// CHECK-INST: frecpx z31.d, p7/z, z31.d +// CHECK-ENCODING: [0xff,0x9f,0xdb,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 64db9fff \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frint32x_z-diagnostics.s b/llvm/test/MC/AArch64/SVE2p2/frint32x_z-diagnostics.s new file mode 100644 index 0000000000000..a01eb73d50822 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frint32x_z-diagnostics.s @@ -0,0 +1,47 @@ +// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s + +// ------------------------------------------------------------------------- // +// Invalid element width + +frint32x z31.b, p7/z, z31.b +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint32x z31.b, p7/z, z31.b +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frint32x z31.h, p7/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint32x z31.h, p7/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frint32x z31.s, p7/z, z31.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint32x z31.s, p7/z, z31.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frint32x z31.d, p7/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint32x z31.d, p7/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// ------------------------------------------------------------------------- // +// Invalid predicate + +frint32x z31.s, p8/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix) +// CHECK-NEXT: frint32x z31.s, p8/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// --------------------------------------------------------------------------// +// Negative tests for instructions that are incompatible with movprfx + +movprfx z0.s, p0/z, z7.s +frint32x z0.s, p0/z, z3.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frint32x z0.s, p0/z, z3.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +movprfx z0, z7 +frint32x z0.d, p0/z, z3.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frint32x z0.d, p0/z, z3.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frint32x_z.s b/llvm/test/MC/AArch64/SVE2p2/frint32x_z.s new file mode 100644 index 0000000000000..abb0f78fb1e67 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frint32x_z.s @@ -0,0 +1,33 @@ +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-ERROR +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=-sme2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN +// Disassemble encoding and check the re-encoding (-show-encoding) matches. +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \ +// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST + +frint32x z0.d, p0/z, z0.d // 01100100-00011100-11100000-00000000 +// CHECK-INST: frint32x z0.d, p0/z, z0.d +// CHECK-ENCODING: [0x00,0xe0,0x1c,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 641ce000 + +frint32x z23.d, p3/z, z13.d // 01100100-00011100-11101101-10110111 +// CHECK-INST: frint32x z23.d, p3/z, z13.d +// CHECK-ENCODING: [0xb7,0xed,0x1c,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 641cedb7 + +frint32x z31.s, p7/z, z31.s // 01100100-00011100-10111111-11111111 +// CHECK-INST: frint32x z31.s, p7/z, z31.s +// CHECK-ENCODING: [0xff,0xbf,0x1c,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 641cbfff \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frint32z_z-diagnostics.s b/llvm/test/MC/AArch64/SVE2p2/frint32z_z-diagnostics.s new file mode 100644 index 0000000000000..29bcfeca145a4 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frint32z_z-diagnostics.s @@ -0,0 +1,47 @@ +// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s + +// ------------------------------------------------------------------------- // +// Invalid element width + +frint32z z31.b, p7/z, z31.b +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint32z z31.b, p7/z, z31.b +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frint32z z31.h, p7/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint32z z31.h, p7/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frint32z z31.s, p7/z, z31.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint32z z31.s, p7/z, z31.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frint32z z31.d, p7/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint32z z31.d, p7/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// ------------------------------------------------------------------------- // +// Invalid predicate + +frint32z z31.s, p8/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix) +// CHECK-NEXT: frint32z z31.s, p8/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// --------------------------------------------------------------------------// +// Negative tests for instructions that are incompatible with movprfx + +movprfx z0.s, p0/z, z7.s +frint32z z0.s, p0/z, z3.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frint32z z0.s, p0/z, z3.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +movprfx z0, z7 +frint32z z0.d, p0/z, z3.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frint32z z0.d, p0/z, z3.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frint32z_z.s b/llvm/test/MC/AArch64/SVE2p2/frint32z_z.s new file mode 100644 index 0000000000000..13140e4bdda97 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frint32z_z.s @@ -0,0 +1,33 @@ +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-ERROR +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=-sme2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN +// Disassemble encoding and check the re-encoding (-show-encoding) matches. +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \ +// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST + +frint32z z0.d, p0/z, z0.d // 01100100-00011100-11000000-00000000 +// CHECK-INST: frint32z z0.d, p0/z, z0.d +// CHECK-ENCODING: [0x00,0xc0,0x1c,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 641cc000 + +frint32z z23.s, p3/z, z13.s // 01100100-00011100-10001101-10110111 +// CHECK-INST: frint32z z23.s, p3/z, z13.s +// CHECK-ENCODING: [0xb7,0x8d,0x1c,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 641c8db7 + +frint32z z31.s, p7/z, z31.s // 01100100-00011100-10011111-11111111 +// CHECK-INST: frint32z z31.s, p7/z, z31.s +// CHECK-ENCODING: [0xff,0x9f,0x1c,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 641c9fff \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frint64x_z-diagnostics.s b/llvm/test/MC/AArch64/SVE2p2/frint64x_z-diagnostics.s new file mode 100644 index 0000000000000..82ffa84645be6 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frint64x_z-diagnostics.s @@ -0,0 +1,47 @@ +// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s + +// ------------------------------------------------------------------------- // +// Invalid element width + +frint64x z31.b, p7/z, z31.b +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint64x z31.b, p7/z, z31.b +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frint64x z31.h, p7/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint64x z31.h, p7/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frint64x z31.s, p7/z, z31.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint64x z31.s, p7/z, z31.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frint64x z31.d, p7/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint64x z31.d, p7/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// ------------------------------------------------------------------------- // +// Invalid predicate + +frint64x z31.s, p8/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix) +// CHECK-NEXT: frint64x z31.s, p8/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// --------------------------------------------------------------------------// +// Negative tests for instructions that are incompatible with movprfx + +movprfx z0.s, p0/z, z7.s +frint64x z0.s, p0/z, z3.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frint64x z0.s, p0/z, z3.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +movprfx z0, z7 +frint64x z0.d, p0/z, z3.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frint64x z0.d, p0/z, z3.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frint64x_z.s b/llvm/test/MC/AArch64/SVE2p2/frint64x_z.s new file mode 100644 index 0000000000000..1e834e972c2d0 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frint64x_z.s @@ -0,0 +1,33 @@ +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-ERROR +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=-sme2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN +// Disassemble encoding and check the re-encoding (-show-encoding) matches. +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \ +// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST + +frint64x z0.d, p0/z, z0.d // 01100100-00011101-11100000-00000000 +// CHECK-INST: frint64x z0.d, p0/z, z0.d +// CHECK-ENCODING: [0x00,0xe0,0x1d,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 641de000 + +frint64x z21.s, p5/z, z10.s // 01100100-00011101-10110101-01010101 +// CHECK-INST: frint64x z21.s, p5/z, z10.s +// CHECK-ENCODING: [0x55,0xb5,0x1d,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 641db555 + +frint64x z31.s, p7/z, z31.s // 01100100-00011101-10111111-11111111 +// CHECK-INST: frint64x z31.s, p7/z, z31.s +// CHECK-ENCODING: [0xff,0xbf,0x1d,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 641dbfff \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frint64z_z-diagnostics.s b/llvm/test/MC/AArch64/SVE2p2/frint64z_z-diagnostics.s new file mode 100644 index 0000000000000..b2176ab345abd --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frint64z_z-diagnostics.s @@ -0,0 +1,47 @@ +// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s + +// ------------------------------------------------------------------------- // +// Invalid element width + +frint64z z31.b, p7/z, z31.b +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint64z z31.b, p7/z, z31.b +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frint64z z31.h, p7/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint64z z31.h, p7/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frint64z z31.s, p7/z, z31.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint64z z31.s, p7/z, z31.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frint64z z31.d, p7/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frint64z z31.d, p7/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// ------------------------------------------------------------------------- // +// Invalid predicate + +frint64z z31.s, p8/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix) +// CHECK-NEXT: frint64z z31.s, p8/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// --------------------------------------------------------------------------// +// Negative tests for instructions that are incompatible with movprfx + +movprfx z0.s, p0/z, z7.s +frint64z z0.s, p0/z, z3.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frint64z z0.s, p0/z, z3.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +movprfx z0, z7 +frint64z z0.d, p0/z, z3.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frint64z z0.d, p0/z, z3.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frint64z_z.s b/llvm/test/MC/AArch64/SVE2p2/frint64z_z.s new file mode 100644 index 0000000000000..2cf724a7d6f8c --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frint64z_z.s @@ -0,0 +1,33 @@ +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-ERROR +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=-sme2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN +// Disassemble encoding and check the re-encoding (-show-encoding) matches. +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \ +// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST + +frint64z z0.d, p0/z, z0.d // 01100100-00011101-11000000-00000000 +// CHECK-INST: frint64z z0.d, p0/z, z0.d +// CHECK-ENCODING: [0x00,0xc0,0x1d,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 641dc000 + +frint64z z21.s, p5/z, z10.s // 01100100-00011101-10010101-01010101 +// CHECK-INST: frint64z z21.s, p5/z, z10.s +// CHECK-ENCODING: [0x55,0x95,0x1d,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 641d9555 + +frint64z z31.s, p7/z, z31.s // 01100100-00011101-10011111-11111111 +// CHECK-INST: frint64z z31.s, p7/z, z31.s +// CHECK-ENCODING: [0xff,0x9f,0x1d,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 641d9fff \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frinta_z-diagnostics.s b/llvm/test/MC/AArch64/SVE2p2/frinta_z-diagnostics.s new file mode 100644 index 0000000000000..c3aa1f73b5ad2 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frinta_z-diagnostics.s @@ -0,0 +1,47 @@ +// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s + +// ------------------------------------------------------------------------- // +// Invalid element width + +frinta z31.b, p7/z, z31.b +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frinta z31.b, p7/z, z31.b +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frinta z31.h, p7/z, z31.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frinta z31.h, p7/z, z31.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frinta z31.s, p7/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frinta z31.s, p7/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frinta z31.d, p7/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frinta z31.d, p7/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// ------------------------------------------------------------------------- // +// Invalid predicate + +frinta z31.h, p8/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix) +// CHECK-NEXT: frinta z31.h, p8/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// --------------------------------------------------------------------------// +// Negative tests for instructions that are incompatible with movprfx + +movprfx z0.h, p0/z, z7.h +frinta z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frinta z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +movprfx z0, z7 +frinta z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frinta z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frinta_z.s b/llvm/test/MC/AArch64/SVE2p2/frinta_z.s new file mode 100644 index 0000000000000..ef0a49e4f83bc --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frinta_z.s @@ -0,0 +1,34 @@ + +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-ERROR +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=-sme2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN +// Disassemble encoding and check the re-encoding (-show-encoding) matches. +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \ +// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST + +frinta z0.h, p0/z, z0.h // 01100100-01011001-10000000-00000000 +// CHECK-INST: frinta z0.h, p0/z, z0.h +// CHECK-ENCODING: [0x00,0x80,0x59,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 64598000 + +frinta z21.s, p5/z, z10.s // 01100100-10011001-10010101-01010101 +// CHECK-INST: frinta z21.s, p5/z, z10.s +// CHECK-ENCODING: [0x55,0x95,0x99,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 64999555 + +frinta z31.d, p7/z, z31.d // 01100100-11011001-10011111-11111111 +// CHECK-INST: frinta z31.d, p7/z, z31.d +// CHECK-ENCODING: [0xff,0x9f,0xd9,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 64d99fff \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frinti_z-diagnostics.s b/llvm/test/MC/AArch64/SVE2p2/frinti_z-diagnostics.s new file mode 100644 index 0000000000000..8334d2d2f8ad1 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frinti_z-diagnostics.s @@ -0,0 +1,47 @@ +// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s + +// ------------------------------------------------------------------------- // +// Invalid element width + +frinti z31.b, p7/z, z31.b +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frinti z31.b, p7/z, z31.b +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frinti z31.h, p7/z, z31.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frinti z31.h, p7/z, z31.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frinti z31.s, p7/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frinti z31.s, p7/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frinti z31.d, p7/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frinti z31.d, p7/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// ------------------------------------------------------------------------- // +// Invalid predicate + +frinti z31.h, p8/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix) +// CHECK-NEXT: frinti z31.h, p8/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// --------------------------------------------------------------------------// +// Negative tests for instructions that are incompatible with movprfx + +movprfx z0.h, p0/z, z7.h +frinti z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frinti z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +movprfx z0, z7 +frinti z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frinti z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frinti_z.s b/llvm/test/MC/AArch64/SVE2p2/frinti_z.s new file mode 100644 index 0000000000000..2cb15d4582ded --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frinti_z.s @@ -0,0 +1,33 @@ +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-ERROR +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=-sme2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN +// Disassemble encoding and check the re-encoding (-show-encoding) matches. +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \ +// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST + +frinti z0.h, p0/z, z0.h // 01100100-01011001-11100000-00000000 +// CHECK-INST: frinti z0.h, p0/z, z0.h +// CHECK-ENCODING: [0x00,0xe0,0x59,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 6459e000 + +frinti z21.s, p5/z, z10.s // 01100100-10011001-11110101-01010101 +// CHECK-INST: frinti z21.s, p5/z, z10.s +// CHECK-ENCODING: [0x55,0xf5,0x99,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 6499f555 + +frinti z31.d, p7/z, z31.d // 01100100-11011001-11111111-11111111 +// CHECK-INST: frinti z31.d, p7/z, z31.d +// CHECK-ENCODING: [0xff,0xff,0xd9,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 64d9ffff \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frintm_z-diagnostics.s b/llvm/test/MC/AArch64/SVE2p2/frintm_z-diagnostics.s new file mode 100644 index 0000000000000..fe72e6a7e2646 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frintm_z-diagnostics.s @@ -0,0 +1,47 @@ +// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s + +// ------------------------------------------------------------------------- // +// Invalid element width + +frintm z31.b, p7/z, z31.b +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintm z31.b, p7/z, z31.b +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintm z31.h, p7/z, z31.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintm z31.h, p7/z, z31.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintm z31.s, p7/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintm z31.s, p7/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintm z31.d, p7/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintm z31.d, p7/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// ------------------------------------------------------------------------- // +// Invalid predicate + +frintm z31.h, p8/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix) +// CHECK-NEXT: frintm z31.h, p8/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// --------------------------------------------------------------------------// +// Negative tests for instructions that are incompatible with movprfx + +movprfx z0.h, p0/z, z7.h +frintm z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frintm z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +movprfx z0, z7 +frintm z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frintm z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frintm_z.s b/llvm/test/MC/AArch64/SVE2p2/frintm_z.s new file mode 100644 index 0000000000000..60505bc114d0d --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frintm_z.s @@ -0,0 +1,33 @@ +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-ERROR +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=-sme2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN +// Disassemble encoding and check the re-encoding (-show-encoding) matches. +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \ +// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST + +frintm z0.h, p0/z, z0.h // 01100100-01011000-11000000-00000000 +// CHECK-INST: frintm z0.h, p0/z, z0.h +// CHECK-ENCODING: [0x00,0xc0,0x58,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 6458c000 + +frintm z23.s, p3/z, z13.s // 01100100-10011000-11001101-10110111 +// CHECK-INST: frintm z23.s, p3/z, z13.s +// CHECK-ENCODING: [0xb7,0xcd,0x98,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 6498cdb7 + +frintm z31.d, p7/z, z31.d // 01100100-11011000-11011111-11111111 +// CHECK-INST: frintm z31.d, p7/z, z31.d +// CHECK-ENCODING: [0xff,0xdf,0xd8,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 64d8dfff \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frintn_z-diagnostics.s b/llvm/test/MC/AArch64/SVE2p2/frintn_z-diagnostics.s new file mode 100644 index 0000000000000..07f54df87f2b2 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frintn_z-diagnostics.s @@ -0,0 +1,47 @@ +// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s + +// ------------------------------------------------------------------------- // +// Invalid element width + +frintn z31.b, p7/z, z31.b +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintn z31.b, p7/z, z31.b +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintn z31.h, p7/z, z31.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintn z31.h, p7/z, z31.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintn z31.s, p7/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintn z31.s, p7/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintn z31.d, p7/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintn z31.d, p7/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// ------------------------------------------------------------------------- // +// Invalid predicate + +frintn z31.h, p8/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix) +// CHECK-NEXT: frintn z31.h, p8/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// --------------------------------------------------------------------------// +// Negative tests for instructions that are incompatible with movprfx + +movprfx z0.h, p0/z, z7.h +frintn z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frintn z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +movprfx z0, z7 +frintn z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frintn z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frintn_z.s b/llvm/test/MC/AArch64/SVE2p2/frintn_z.s new file mode 100644 index 0000000000000..89461fc38c528 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frintn_z.s @@ -0,0 +1,33 @@ +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-ERROR +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=-sme2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN +// Disassemble encoding and check the re-encoding (-show-encoding) matches. +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \ +// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST + +frintn z0.h, p0/z, z0.h // 01100100-01011000-10000000-00000000 +// CHECK-INST: frintn z0.h, p0/z, z0.h +// CHECK-ENCODING: [0x00,0x80,0x58,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 64588000 + +frintn z23.s, p3/z, z13.s // 01100100-10011000-10001101-10110111 +// CHECK-INST: frintn z23.s, p3/z, z13.s +// CHECK-ENCODING: [0xb7,0x8d,0x98,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 64988db7 + +frintn z31.d, p7/z, z31.d // 01100100-11011000-10011111-11111111 +// CHECK-INST: frintn z31.d, p7/z, z31.d +// CHECK-ENCODING: [0xff,0x9f,0xd8,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 64d89fff \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frintp_z-diagnostics.s b/llvm/test/MC/AArch64/SVE2p2/frintp_z-diagnostics.s new file mode 100644 index 0000000000000..5a9535b3affd5 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frintp_z-diagnostics.s @@ -0,0 +1,47 @@ +// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s + +// ------------------------------------------------------------------------- // +// Invalid element width + +frintp z31.b, p7/z, z31.b +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintp z31.b, p7/z, z31.b +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintp z31.h, p7/z, z31.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintp z31.h, p7/z, z31.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintp z31.s, p7/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintp z31.s, p7/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintp z31.d, p7/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintp z31.d, p7/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// ------------------------------------------------------------------------- // +// Invalid predicate + +frintp z31.h, p8/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix) +// CHECK-NEXT: frintp z31.h, p8/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// --------------------------------------------------------------------------// +// Negative tests for instructions that are incompatible with movprfx + +movprfx z0.h, p0/z, z7.h +frintp z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frintp z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +movprfx z0, z7 +frintp z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frintp z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frintp_z.s b/llvm/test/MC/AArch64/SVE2p2/frintp_z.s new file mode 100644 index 0000000000000..b728e4322c2c3 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frintp_z.s @@ -0,0 +1,33 @@ +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-ERROR +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=-sme2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN +// Disassemble encoding and check the re-encoding (-show-encoding) matches. +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \ +// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST + +frintp z0.h, p0/z, z0.h // 01100100-01011000-10100000-00000000 +// CHECK-INST: frintp z0.h, p0/z, z0.h +// CHECK-ENCODING: [0x00,0xa0,0x58,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 6458a000 + +frintp z23.s, p3/z, z13.s // 01100100-10011000-10101101-10110111 +// CHECK-INST: frintp z23.s, p3/z, z13.s +// CHECK-ENCODING: [0xb7,0xad,0x98,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 6498adb7 + +frintp z31.d, p7/z, z31.d // 01100100-11011000-10111111-11111111 +// CHECK-INST: frintp z31.d, p7/z, z31.d +// CHECK-ENCODING: [0xff,0xbf,0xd8,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 64d8bfff \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frintx_z-diagnostics.s b/llvm/test/MC/AArch64/SVE2p2/frintx_z-diagnostics.s new file mode 100644 index 0000000000000..026ad7be54733 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frintx_z-diagnostics.s @@ -0,0 +1,47 @@ +// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s + +// ------------------------------------------------------------------------- // +// Invalid element width + +frintx z31.b, p7/z, z31.b +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintx z31.b, p7/z, z31.b +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintx z31.h, p7/z, z31.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintx z31.h, p7/z, z31.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintx z31.s, p7/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintx z31.s, p7/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintx z31.d, p7/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintx z31.d, p7/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// ------------------------------------------------------------------------- // +// Invalid predicate + +frintx z31.h, p8/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix) +// CHECK-NEXT: frintx z31.h, p8/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// --------------------------------------------------------------------------// +// Negative tests for instructions that are incompatible with movprfx + +movprfx z0.h, p0/z, z7.h +frintx z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frintx z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +movprfx z0, z7 +frintx z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frintx z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frintx_z.s b/llvm/test/MC/AArch64/SVE2p2/frintx_z.s new file mode 100644 index 0000000000000..1cf77342bc251 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frintx_z.s @@ -0,0 +1,33 @@ +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-ERROR +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=-sme2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN +// Disassemble encoding and check the re-encoding (-show-encoding) matches. +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \ +// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST + +frintx z0.h, p0/z, z0.h // 01100100-01011001-11000000-00000000 +// CHECK-INST: frintx z0.h, p0/z, z0.h +// CHECK-ENCODING: [0x00,0xc0,0x59,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 6459c000 + +frintx z23.s, p3/z, z13.s // 01100100-10011001-11001101-10110111 +// CHECK-INST: frintx z23.s, p3/z, z13.s +// CHECK-ENCODING: [0xb7,0xcd,0x99,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 6499cdb7 + +frintx z31.d, p7/z, z31.d // 01100100-11011001-11011111-11111111 +// CHECK-INST: frintx z31.d, p7/z, z31.d +// CHECK-ENCODING: [0xff,0xdf,0xd9,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 64d9dfff \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frintz_z-diagnostics.s b/llvm/test/MC/AArch64/SVE2p2/frintz_z-diagnostics.s new file mode 100644 index 0000000000000..cb8632184e6b1 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frintz_z-diagnostics.s @@ -0,0 +1,47 @@ +// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s + +// ------------------------------------------------------------------------- // +// Invalid element width + +frintz z31.b, p7/z, z31.b +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintz z31.b, p7/z, z31.b +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintz z31.h, p7/z, z31.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintz z31.h, p7/z, z31.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintz z31.s, p7/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintz z31.s, p7/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +frintz z31.d, p7/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: frintz z31.d, p7/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// ------------------------------------------------------------------------- // +// Invalid predicate + +frintz z31.h, p8/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix) +// CHECK-NEXT: frintz z31.h, p8/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// --------------------------------------------------------------------------// +// Negative tests for instructions that are incompatible with movprfx + +movprfx z0.h, p0/z, z7.h +frintz z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frintz z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +movprfx z0, z7 +frintz z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: frintz z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/frintz_z.s b/llvm/test/MC/AArch64/SVE2p2/frintz_z.s new file mode 100644 index 0000000000000..ef28d565db053 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/frintz_z.s @@ -0,0 +1,33 @@ +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-ERROR +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=-sme2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN +// Disassemble encoding and check the re-encoding (-show-encoding) matches. +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \ +// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST + +frintz z0.h, p0/z, z0.h // 01100100-01011000-11100000-00000000 +// CHECK-INST: frintz z0.h, p0/z, z0.h +// CHECK-ENCODING: [0x00,0xe0,0x58,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 6458e000 + +frintz z21.s, p5/z, z10.s // 01100100-10011000-11110101-01010101 +// CHECK-INST: frintz z21.s, p5/z, z10.s +// CHECK-ENCODING: [0x55,0xf5,0x98,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 6498f555 + +frintz z31.d, p7/z, z31.d // 01100100-11011000-11111111-11111111 +// CHECK-INST: frintz z31.d, p7/z, z31.d +// CHECK-ENCODING: [0xff,0xff,0xd8,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 64d8ffff \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/fsqrt_z-diagnostics.s b/llvm/test/MC/AArch64/SVE2p2/fsqrt_z-diagnostics.s new file mode 100644 index 0000000000000..8974b6b8adf06 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/fsqrt_z-diagnostics.s @@ -0,0 +1,47 @@ +// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s + +// ------------------------------------------------------------------------- // +// Invalid element width + +fsqrt z31.b, p7/z, z31.b +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: fsqrt z31.b, p7/z, z31.b +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +fsqrt z31.h, p7/z, z31.d +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: fsqrt z31.h, p7/z, z31.d +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +fsqrt z31.s, p7/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: fsqrt z31.s, p7/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +fsqrt z31.d, p7/z, z31.s +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width +// CHECK-NEXT: fsqrt z31.d, p7/z, z31.s +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// ------------------------------------------------------------------------- // +// Invalid predicate + +fsqrt z31.h, p8/z, z31.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix) +// CHECK-NEXT: fsqrt z31.h, p8/z, z31.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +// --------------------------------------------------------------------------// +// Negative tests for instructions that are incompatible with movprfx + +movprfx z0.h, p0/z, z7.h +fsqrt z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: fsqrt z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: + +movprfx z0, z7 +fsqrt z0.h, p0/z, z3.h +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov +// CHECK-NEXT: fsqrt z0.h, p0/z, z3.h +// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: \ No newline at end of file diff --git a/llvm/test/MC/AArch64/SVE2p2/fsqrt_z.s b/llvm/test/MC/AArch64/SVE2p2/fsqrt_z.s new file mode 100644 index 0000000000000..fe02dc8e16ce4 --- /dev/null +++ b/llvm/test/MC/AArch64/SVE2p2/fsqrt_z.s @@ -0,0 +1,33 @@ +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-ERROR +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST +// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \ +// RUN: | llvm-objdump -d --mattr=-sme2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN +// Disassemble encoding and check the re-encoding (-show-encoding) matches. +// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \ +// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \ +// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \ +// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST + +fsqrt z0.h, p0/z, z0.h // 01100100-01011011-10100000-00000000 +// CHECK-INST: fsqrt z0.h, p0/z, z0.h +// CHECK-ENCODING: [0x00,0xa0,0x5b,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 645ba000 + +fsqrt z21.s, p5/z, z10.s // 01100100-10011011-10110101-01010101 +// CHECK-INST: fsqrt z21.s, p5/z, z10.s +// CHECK-ENCODING: [0x55,0xb5,0x9b,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 649bb555 + +fsqrt z31.d, p7/z, z31.d // 01100100-11011011-10111111-11111111 +// CHECK-INST: fsqrt z31.d, p7/z, z31.d +// CHECK-ENCODING: [0xff,0xbf,0xdb,0x64] +// CHECK-ERROR: instruction requires: sme2p2 or sve2p2 +// CHECK-UNKNOWN: 64dbbfff \ No newline at end of file