Skip to content

Commit 2a9dd8a

Browse files
authored
[AArch64] Add assembly/disassembly for zeroing SVE FCVT{X} and BFCVT (#113916)
This patch adds assembly/disassembly support for the following SVE2.2 instructions - FCVT (zeroing) - FCVTX (zeroing) - BFCVT (zeroing) In accordance with: https://developer.arm.com/documentation/ddi0602/2024-09/SVE-Instructions
1 parent 2ab98df commit 2a9dd8a

File tree

10 files changed

+308
-2
lines changed

10 files changed

+308
-2
lines changed

llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4225,15 +4225,22 @@ defm TBLQ_ZZZ : sve2p1_tblq<"tblq", int_aarch64_sve_tblq>;
42254225
// SME2.2 or SVE2.2 instructions
42264226
//===----------------------------------------------------------------------===//
42274227
let Predicates = [HasSVE2p2orSME2p2] in {
4228+
// SVE Floating-point convert precision, zeroing predicate
4229+
defm FCVT_ZPzZ : sve_fp_z2op_p_zd_b_0<"fcvt">;
4230+
42284231
// SVE2p2 floating-point convert precision down (placing odd), zeroing predicate
42294232
defm FCVTNT_ZPzZ : sve_fp_fcvtntz<"fcvtnt">;
42304233
def FCVTXNT_ZPzZ_DtoS : sve_fp_fcvt2z<0b0010, "fcvtxnt", ZPR32, ZPR64>;
4234+
// Placing even
4235+
def FCVTX_ZPzZ_DtoS : sve_fp_z2op_p_zd<0b0001010, "fcvtx", ZPR64, ZPR32>;
42314236

42324237
// SVE2p2 floating-point convert precision up, zeroing predicate
42334238
defm FCVTLT_ZPzZ : sve_fp_fcvtltz<"fcvtlt">;
42344239

42354240
// SVE2p2 floating-point convert single-to-bf (placing odd), zeroing predicate
42364241
def BFCVTNT_ZPzZ : sve_fp_fcvt2z<0b1010, "bfcvtnt", ZPR16, ZPR32>;
4242+
// Placing corresponding
4243+
def BFCVT_ZPzZ_StoH : sve_fp_z2op_p_zd<0b1001010, "bfcvt", ZPR32, ZPR16>;
42374244

42384245
// Floating-point convert to integer, zeroing predicate
42394246
defm FCVTZS_ZPzZ : sve_fp_z2op_p_zd_d<0b0, "fcvtzs">;

llvm/lib/Target/AArch64/SVEInstrFormats.td

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3207,6 +3207,15 @@ multiclass sve_fp_z2op_p_zd_d_flogb<string asm> {
32073207
def _D : sve_fp_z2op_p_zd<0b0011011, asm, ZPR64, ZPR64>;
32083208
}
32093209

3210+
multiclass sve_fp_z2op_p_zd_b_0<string asm> {
3211+
def _StoH : sve_fp_z2op_p_zd<0b1001000, asm, ZPR32, ZPR16>;
3212+
def _HtoS : sve_fp_z2op_p_zd<0b1001001, asm, ZPR16, ZPR32>;
3213+
def _DtoH : sve_fp_z2op_p_zd<0b1101000, asm, ZPR64, ZPR16>;
3214+
def _HtoD : sve_fp_z2op_p_zd<0b1101001, asm, ZPR16, ZPR64>;
3215+
def _DtoS : sve_fp_z2op_p_zd<0b1101010, asm, ZPR64, ZPR32>;
3216+
def _StoD : sve_fp_z2op_p_zd<0b1101011, asm, ZPR32, ZPR64>;
3217+
}
3218+
32103219
//===----------------------------------------------------------------------===//
32113220
// SVE Integer Arithmetic - Binary Predicated Group
32123221
//===----------------------------------------------------------------------===//

llvm/test/MC/AArch64/SVE/bfcvt-diagnostics.s

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ bfcvt z0.h, p0/m, z1.h
1111
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
1212

1313
bfcvt z0.h, p0/z, z1.s
14-
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
14+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction requires: sme2p2 or sve2p2
1515
// CHECK-NEXT: bfcvt z0.h, p0/z, z1.s
1616
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
1717

llvm/test/MC/AArch64/SVE2/fcvtx-diagnostics.s

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ fcvtx z0.d, p0/m, z0.d
2929
// Invalid predicate operation
3030

3131
fcvtx z0.s, p0/z, z0.d
32-
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
32+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction requires: sme2p2 or sve2p2
3333
// CHECK-NEXT: fcvtx z0.s, p0/z, z0.d
3434
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
3535

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s
2+
3+
// --------------------------------------------------------------------------//
4+
// Invalid operand
5+
6+
bfcvt z0.b, p0/z, z0.b
7+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
8+
// CHECK-NEXT: bfcvt z0.b, p0/z, z0.b
9+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
10+
11+
// --------------------------------------------------------------------------//
12+
// Invalid element width
13+
14+
bfcvt z0.h, p0/z, z0.h
15+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
16+
// CHECK-NEXT: bfcvt z0.h, p0/z, z0.h
17+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
18+
19+
bfcvt z0.h, p0/z, z0.d
20+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
21+
// CHECK-NEXT: bfcvt z0.h, p0/z, z0.d
22+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
23+
24+
bfcvt z0.s, p0/z, z0.s
25+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
26+
// CHECK-NEXT: bfcvt z0.s, p0/z, z0.s
27+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
28+
29+
bfcvt z0.s, p0/z, z0.d
30+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
31+
// CHECK-NEXT: bfcvt z0.s, p0/z, z0.d
32+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
33+
34+
bfcvt z0.d, p0/z, z0.d
35+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
36+
// CHECK-NEXT: bfcvt z0.d, p0/z, z0.d
37+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
38+
39+
// --------------------------------------------------------------------------//
40+
// Predicate not in restricted predicate range
41+
42+
bfcvt z0.h, p8/z, z0.s
43+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix)
44+
// CHECK-NEXT: bfcvt z0.h, p8/z, z0.s
45+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
46+
47+
// --------------------------------------------------------------------------//
48+
// Negative tests for instructions that are incompatible with movprfx
49+
50+
movprfx z0.s, p0/m, z7.s
51+
bfcvt z0.h, p7/z, z1.s
52+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
53+
// CHECK-NEXT: bfcvt z0.h, p7/z, z1.s
54+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
55+
56+
movprfx z0, z7
57+
bfcvt z0.h, p7/z, z1.s
58+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
59+
// CHECK-NEXT: bfcvt z0.h, p7/z, z1.s
60+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

llvm/test/MC/AArch64/SVE2p2/bfcvt_z.s

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \
2+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
3+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \
4+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
5+
// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
6+
// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
7+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \
8+
// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST
9+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \
10+
// RUN: | llvm-objdump -d --mattr=-sve2p2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN
11+
// Disassemble encoding and check the re-encoding (-show-encoding) matches.
12+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \
13+
// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
14+
// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \
15+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
16+
17+
bfcvt z0.h, p0/z, z0.s // 01100100-10011010-11000000-00000000
18+
// CHECK-INST: bfcvt z0.h, p0/z, z0.s
19+
// CHECK-ENCODING: [0x00,0xc0,0x9a,0x64]
20+
// CHECK-ERROR: instruction requires: sme2p2 or sve2p2
21+
// CHECK-UNKNOWN: 649ac000 <unknown>
22+
23+
bfcvt z21.h, p5/z, z10.s // 01100100-10011010-11010101-01010101
24+
// CHECK-INST: bfcvt z21.h, p5/z, z10.s
25+
// CHECK-ENCODING: [0x55,0xd5,0x9a,0x64]
26+
// CHECK-ERROR: instruction requires: sme2p2 or sve2p2
27+
// CHECK-UNKNOWN: 649ad555 <unknown>
28+
29+
bfcvt z31.h, p7/z, z31.s // 01100100-10011010-11011111-11111111
30+
// CHECK-INST: bfcvt z31.h, p7/z, z31.s
31+
// CHECK-ENCODING: [0xff,0xdf,0x9a,0x64]
32+
// CHECK-ERROR: instruction requires: sme2p2 or sve2p2
33+
// CHECK-UNKNOWN: 649adfff <unknown>
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s
2+
3+
// --------------------------------------------------------------------------//
4+
// Invalid operand
5+
6+
fcvt z0.b, p0/z, z0.h
7+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
8+
// CHECK-NEXT: fcvt z0.b, p0/z, z0.h
9+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
10+
11+
// --------------------------------------------------------------------------//
12+
// Invalid element width
13+
14+
fcvt z0.h, p0/z, z0.h
15+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
16+
// CHECK-NEXT: fcvt z0.h, p0/z, z0.h
17+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
18+
19+
fcvt z0.s, p0/z, z0.s
20+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
21+
// CHECK-NEXT: fcvt z0.s, p0/z, z0.s
22+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
23+
24+
fcvt z0.d, p0/z, z0.d
25+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
26+
// CHECK-NEXT: fcvt z0.d, p0/z, z0.d
27+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
28+
29+
// --------------------------------------------------------------------------//
30+
// Predicate not in restricted predicate range
31+
32+
fcvt z0.s, p8/z, z0.d
33+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix)
34+
// CHECK-NEXT: fcvt z0.s, p8/z, z0.d
35+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
36+
37+
// --------------------------------------------------------------------------//
38+
// Negative tests for instructions that are incompatible with movprfx
39+
40+
movprfx z0.s, p0/m, z7.s
41+
fcvt z0.s, p7/z, z1.d
42+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
43+
// CHECK-NEXT: fcvt z0.s, p7/z, z1.d
44+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
45+
46+
movprfx z0, z7
47+
fcvt z0.s, p7/z, z1.d
48+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
49+
// CHECK-NEXT: fcvt z0.s, p7/z, z1.d
50+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

llvm/test/MC/AArch64/SVE2p2/fcvt_z.s

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \
2+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
3+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \
4+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
5+
// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
6+
// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
7+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \
8+
// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST
9+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \
10+
// RUN: | llvm-objdump -d --mattr=-sve2p2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN
11+
// Disassemble encoding and check the re-encoding (-show-encoding) matches.
12+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \
13+
// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
14+
// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \
15+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
16+
17+
// convert to half
18+
19+
fcvt z0.h, p0/z, z0.s // 01100100-10011010-10000000-00000000
20+
// CHECK-INST: fcvt z0.h, p0/z, z0.s
21+
// CHECK-ENCODING: [0x00,0x80,0x9a,0x64]
22+
// CHECK-ERROR: instruction requires: sme2p2 or sve2p2
23+
// CHECK-UNKNOWN: 649a8000 <unknown>
24+
25+
fcvt z23.h, p3/z, z13.d // 01100100-11011010-10001101-10110111
26+
// CHECK-INST: fcvt z23.h, p3/z, z13.d
27+
// CHECK-ENCODING: [0xb7,0x8d,0xda,0x64]
28+
// CHECK-ERROR: instruction requires: sme2p2 or sve2p2
29+
// CHECK-UNKNOWN: 64da8db7 <unknown>
30+
31+
// convert to single
32+
33+
fcvt z0.s, p0/z, z0.h // 01100100-10011010-10100000-00000000
34+
// CHECK-INST: fcvt z0.s, p0/z, z0.h
35+
// CHECK-ENCODING: [0x00,0xa0,0x9a,0x64]
36+
// CHECK-ERROR: instruction requires: sme2p2 or sve2p2
37+
// CHECK-UNKNOWN: 649aa000 <unknown>
38+
39+
fcvt z31.s, p7/z, z31.d // 01100100-11011010-11011111-11111111
40+
// CHECK-INST: fcvt z31.s, p7/z, z31.d
41+
// CHECK-ENCODING: [0xff,0xdf,0xda,0x64]
42+
// CHECK-ERROR: instruction requires: sme2p2 or sve2p2
43+
// CHECK-UNKNOWN: 64dadfff <unknown>
44+
45+
// convert to double
46+
47+
fcvt z21.d, p5/z, z10.h // 01100100-11011010-10110101-01010101
48+
// CHECK-INST: fcvt z21.d, p5/z, z10.h
49+
// CHECK-ENCODING: [0x55,0xb5,0xda,0x64]
50+
// CHECK-ERROR: instruction requires: sme2p2 or sve2p2
51+
// CHECK-UNKNOWN: 64dab555 <unknown>
52+
53+
fcvt z31.d, p7/z, z31.s // 01100100-11011010-11111111-11111111
54+
// CHECK-INST: fcvt z31.d, p7/z, z31.s
55+
// CHECK-ENCODING: [0xff,0xff,0xda,0x64]
56+
// CHECK-ERROR: instruction requires: sme2p2 or sve2p2
57+
// CHECK-UNKNOWN: 64daffff <unknown
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 2>&1 < %s| FileCheck %s
2+
3+
// --------------------------------------------------------------------------//
4+
// Invalid element width
5+
6+
fcvtx z0.b, p0/z, z0.b
7+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
8+
// CHECK-NEXT: fcvtx z0.b, p0/z, z0.b
9+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
10+
11+
fcvtx z0.h, p0/z, z0.h
12+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
13+
// CHECK-NEXT: fcvtx z0.h, p0/z, z0.h
14+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
15+
16+
fcvtx z0.s, p0/z, z0.s
17+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
18+
// CHECK-NEXT: fcvtx z0.s, p0/z, z0.s
19+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
20+
21+
fcvtx z0.d, p0/z, z0.d
22+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
23+
// CHECK-NEXT: fcvtx z0.d, p0/z, z0.d
24+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
25+
26+
fcvtx z0.h, p0/z, z0.s
27+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
28+
// CHECK-NEXT: fcvtx z0.h, p0/z, z0.s
29+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
30+
31+
fcvtx z0.b, p0/z, z0.h
32+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
33+
// CHECK-NEXT: fcvtx z0.b, p0/z, z0.h
34+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
35+
36+
// --------------------------------------------------------------------------//
37+
// Predicate not in restricted predicate range
38+
39+
fcvtx z0.s, p8/z, z0.d
40+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix)
41+
// CHECK-NEXT: fcvtx z0.s, p8/z, z0.d
42+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
43+
44+
// --------------------------------------------------------------------------//
45+
// Negative tests for instructions that are incompatible with movprfx
46+
47+
movprfx z0.s, p0/m, z7.s
48+
fcvtx z0.s, p7/z, z1.d
49+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
50+
// CHECK-NEXT: fcvtx z0.s, p7/z, z1.d
51+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
52+
53+
movprfx z0, z7
54+
fcvtx z0.s, p7/z, z1.d
55+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
56+
// CHECK-NEXT: fcvtx z0.s, p7/z, z1.d
57+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

llvm/test/MC/AArch64/SVE2p2/fcvtx_z.s

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \
2+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
3+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2 < %s \
4+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
5+
// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
6+
// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
7+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \
8+
// RUN: | llvm-objdump -d --mattr=+sve2p2 - | FileCheck %s --check-prefix=CHECK-INST
9+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p2 < %s \
10+
// RUN: | llvm-objdump -d --mattr=-sve2p2 - | FileCheck %s --check-prefix=CHECK-UNKNOWN
11+
// Disassemble encoding and check the re-encoding (-show-encoding) matches.
12+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p2 < %s \
13+
// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
14+
// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p2 -disassemble -show-encoding \
15+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
16+
17+
fcvtx z0.s, p0/z, z0.d // 01100100-00011010-11000000-00000000
18+
// CHECK-INST: fcvtx z0.s, p0/z, z0.d
19+
// CHECK-ENCODING: [0x00,0xc0,0x1a,0x64]
20+
// CHECK-ERROR: instruction requires: sme2p2 or sve2p2
21+
// CHECK-UNKNOWN: 641ac000 <unknown>
22+
23+
fcvtx z23.s, p3/z, z13.d // 01100100-00011010-11001101-10110111
24+
// CHECK-INST: fcvtx z23.s, p3/z, z13.d
25+
// CHECK-ENCODING: [0xb7,0xcd,0x1a,0x64]
26+
// CHECK-ERROR: instruction requires: sme2p2 or sve2p2
27+
// CHECK-UNKNOWN: 641acdb7 <unknown>
28+
29+
fcvtx z31.s, p7/z, z31.d // 01100100-00011010-11011111-11111111
30+
// CHECK-INST: fcvtx z31.s, p7/z, z31.d
31+
// CHECK-ENCODING: [0xff,0xdf,0x1a,0x64]
32+
// CHECK-ERROR: instruction requires: sme2p2 or sve2p2
33+
// CHECK-UNKNOWN: 641adfff <unknown>

0 commit comments

Comments
 (0)