Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[AArch64][SVE2] Asm: support SVE2 Floating Point Convert Group
Summary: Patch adds support for the following intructions: SVE2 floating-point convert precision: * FCVTXNT, FCVTNT, FCVTLT The specification can be found here: https://developer.arm.com/docs/ddi0602/latest Reviewed By: chill Differential Revision: https://reviews.llvm.org/D62382 llvm-svn: 361801
- Loading branch information
Showing
8 changed files
with
317 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2 2>&1 < %s| FileCheck %s | ||
|
||
|
||
// --------------------------------------------------------------------------// | ||
// Invalid element width | ||
|
||
fcvtlt z0.b, p0/m, z0.b | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtlt z0.b, p0/m, z0.b | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtlt z0.h, p0/m, z0.h | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtlt z0.h, p0/m, z0.h | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtlt z0.s, p0/m, z0.s | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtlt z0.s, p0/m, z0.s | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtlt z0.d, p0/m, z0.d | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtlt z0.d, p0/m, z0.d | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtlt z0.h, p0/m, z0.b | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtlt z0.h, p0/m, z0.b | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtlt z0.q, p0/m, z0.d | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtlt z0.q, p0/m, z0.d | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
|
||
// --------------------------------------------------------------------------// | ||
// Invalid predicate operation | ||
|
||
fcvtlt z0.s, p0/z, z0.h | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction | ||
// CHECK-NEXT: fcvtlt z0.s, p0/z, z0.h | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
|
||
// --------------------------------------------------------------------------// | ||
// Predicate not in restricted predicate range | ||
|
||
fcvtlt z0.s, p8/m, z0.h | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: restricted predicate has range [0, 7]. | ||
// CHECK-NEXT: fcvtlt z0.s, p8/m, z0.h | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
|
||
// --------------------------------------------------------------------------// | ||
// Negative tests for instructions that are incompatible with movprfx | ||
|
||
movprfx z0.s, p0/m, z7.s | ||
fcvtlt z0.s, p7/m, z1.h | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov | ||
// CHECK-NEXT: fcvtlt z0.s, p7/m, z1.h | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
movprfx z0, z7 | ||
fcvtlt z0.s, p7/m, z1.h | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov | ||
// CHECK-NEXT: fcvtlt z0.s, p7/m, z1.h | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2 < %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=+sve2 < %s \ | ||
// RUN: | llvm-objdump -d -mattr=+sve2 - | FileCheck %s --check-prefix=CHECK-INST | ||
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2 < %s \ | ||
// RUN: | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN | ||
|
||
|
||
fcvtlt z0.s, p0/m, z1.h | ||
// CHECK-INST: fcvtlt z0.s, p0/m, z1.h | ||
// CHECK-ENCODING: [0x20,0xa0,0x89,0x64] | ||
// CHECK-ERROR: instruction requires: sve2 | ||
// CHECK-UNKNOWN: 20 a0 89 64 <unknown> | ||
|
||
fcvtlt z30.d, p7/m, z31.s | ||
// CHECK-INST: fcvtlt z30.d, p7/m, z31.s | ||
// CHECK-ENCODING: [0xfe,0xbf,0xcb,0x64] | ||
// CHECK-ERROR: instruction requires: sve2 | ||
// CHECK-UNKNOWN: fe bf cb 64 <unknown> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2 2>&1 < %s| FileCheck %s | ||
|
||
|
||
// --------------------------------------------------------------------------// | ||
// Invalid element width | ||
|
||
fcvtnt z0.b, p0/m, z0.b | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtnt z0.b, p0/m, z0.b | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtnt z0.h, p0/m, z0.h | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtnt z0.h, p0/m, z0.h | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtnt z0.s, p0/m, z0.s | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtnt z0.s, p0/m, z0.s | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtnt z0.d, p0/m, z0.d | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtnt z0.d, p0/m, z0.d | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtnt z0.b, p0/m, z0.h | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtnt z0.b, p0/m, z0.h | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtnt z0.d, p0/m, z0.q | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtnt z0.d, p0/m, z0.q | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
|
||
// --------------------------------------------------------------------------// | ||
// Invalid predicate operation | ||
|
||
fcvtnt z0.h, p0/z, z0.s | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction | ||
// CHECK-NEXT: fcvtnt z0.h, p0/z, z0.s | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
|
||
// --------------------------------------------------------------------------// | ||
// Predicate not in restricted predicate range | ||
|
||
fcvtnt z0.h, p8/m, z0.s | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: restricted predicate has range [0, 7]. | ||
// CHECK-NEXT: fcvtnt z0.h, p8/m, z0.s | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
|
||
// --------------------------------------------------------------------------// | ||
// Negative tests for instructions that are incompatible with movprfx | ||
|
||
movprfx z0.s, p0/m, z7.s | ||
fcvtnt z0.s, p7/m, z1.d | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov | ||
// CHECK-NEXT: fcvtnt z0.s, p7/m, z1.d | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
movprfx z0, z7 | ||
fcvtnt z0.s, p7/m, z1.d | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov | ||
// CHECK-NEXT: fcvtnt z0.s, p7/m, z1.d | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2 < %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=+sve2 < %s \ | ||
// RUN: | llvm-objdump -d -mattr=+sve2 - | FileCheck %s --check-prefix=CHECK-INST | ||
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2 < %s \ | ||
// RUN: | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN | ||
|
||
|
||
fcvtnt z0.h, p0/m, z1.s | ||
// CHECK-INST: fcvtnt z0.h, p0/m, z1.s | ||
// CHECK-ENCODING: [0x20,0xa0,0x88,0x64] | ||
// CHECK-ERROR: instruction requires: sve2 | ||
// CHECK-UNKNOWN: 20 a0 88 64 <unknown> | ||
|
||
fcvtnt z30.s, p7/m, z31.d | ||
// CHECK-INST: fcvtnt z30.s, p7/m, z31.d | ||
// CHECK-ENCODING: [0xfe,0xbf,0xca,0x64] | ||
// CHECK-ERROR: instruction requires: sve2 | ||
// CHECK-UNKNOWN: fe bf ca 64 <unknown> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2 2>&1 < %s| FileCheck %s | ||
|
||
|
||
// --------------------------------------------------------------------------// | ||
// Invalid element width | ||
|
||
fcvtxnt z0.b, p0/m, z0.b | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtxnt z0.b, p0/m, z0.b | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtxnt z0.h, p0/m, z0.h | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtxnt z0.h, p0/m, z0.h | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtxnt z0.s, p0/m, z0.s | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtxnt z0.s, p0/m, z0.s | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtxnt z0.d, p0/m, z0.d | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtxnt z0.d, p0/m, z0.d | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtxnt z0.h, p0/m, z0.s | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtxnt z0.h, p0/m, z0.s | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtxnt z0.b, p0/m, z0.h | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtxnt z0.b, p0/m, z0.h | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
fcvtxnt z0.d, p0/m, z0.q | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width | ||
// CHECK-NEXT: fcvtxnt z0.d, p0/m, z0.q | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
|
||
// --------------------------------------------------------------------------// | ||
// Invalid predicate operation | ||
|
||
fcvtxnt z0.s, p0/z, z0.d | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction | ||
// CHECK-NEXT: fcvtxnt z0.s, p0/z, z0.d | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
|
||
// --------------------------------------------------------------------------// | ||
// Predicate not in restricted predicate range | ||
|
||
fcvtxnt z0.s, p8/m, z0.d | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: restricted predicate has range [0, 7]. | ||
// CHECK-NEXT: fcvtxnt z0.s, p8/m, z0.d | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
|
||
// --------------------------------------------------------------------------// | ||
// Negative tests for instructions that are incompatible with movprfx | ||
|
||
movprfx z0.s, p0/m, z7.s | ||
fcvtxnt z0.s, p7/m, z1.d | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov | ||
// CHECK-NEXT: fcvtxnt z0.s, p7/m, z1.d | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: | ||
|
||
movprfx z0, z7 | ||
fcvtxnt z0.s, p7/m, z1.d | ||
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov | ||
// CHECK-NEXT: fcvtxnt z0.s, p7/m, z1.d | ||
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2 < %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=+sve2 < %s \ | ||
// RUN: | llvm-objdump -d -mattr=+sve2 - | FileCheck %s --check-prefix=CHECK-INST | ||
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2 < %s \ | ||
// RUN: | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN | ||
|
||
|
||
fcvtxnt z0.s, p0/m, z1.d | ||
// CHECK-INST: fcvtxnt z0.s, p0/m, z1.d | ||
// CHECK-ENCODING: [0x20,0xa0,0x0a,0x64] | ||
// CHECK-ERROR: instruction requires: sve2 | ||
// CHECK-UNKNOWN: 20 a0 0a 64 <unknown> | ||
|
||
fcvtxnt z30.s, p7/m, z31.d | ||
// CHECK-INST: fcvtxnt z30.s, p7/m, z31.d | ||
// CHECK-ENCODING: [0xfe,0xbf,0x0a,0x64] | ||
// CHECK-ERROR: instruction requires: sve2 | ||
// CHECK-UNKNOWN: fe bf 0a 64 <unknown> |