Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -4639,6 +4639,15 @@ let Predicates = [HasSVE2p3_or_SME2p3] in {
def SDOT_ZZZI_BtoH : sve_intx_dot_by_indexed_elem_x<0b0, "sdot">;
def UDOT_ZZZI_BtoH : sve_intx_dot_by_indexed_elem_x<0b1, "udot">;

// SVE2 fp convert, narrow and interleave to integer, rounding toward zero
defm FCVTZSN_Z2Z : sve2_fp_to_int_downcvt<"fcvtzsn", 0b0>;
defm FCVTZUN_Z2Z : sve2_fp_to_int_downcvt<"fcvtzun", 0b1>;

// SVE2 signed/unsigned integer convert to floating-point
defm SCVTF_ZZ : sve2_int_to_fp_upcvt<"scvtf", 0b00>;
defm SCVTFLT_ZZ : sve2_int_to_fp_upcvt<"scvtflt", 0b10>;
defm UCVTF_ZZ : sve2_int_to_fp_upcvt<"ucvtf", 0b01>;
defm UCVTFLT_ZZ : sve2_int_to_fp_upcvt<"ucvtflt", 0b11>;
} // End HasSME2p3orSVE2p3

//===----------------------------------------------------------------------===//
Expand Down
46 changes: 46 additions & 0 deletions llvm/lib/Target/AArch64/SVEInstrFormats.td
Original file line number Diff line number Diff line change
Expand Up @@ -11300,3 +11300,49 @@ class sve_int_mla_cpa<string asm>

let ElementSize = ZPR64.ElementSize;
}

//===----------------------------------------------------------------------===//
// FCVTZSN
//===----------------------------------------------------------------------===//
class sve2_fp_to_int_downcvt<string asm, ZPRRegOp ZdRC, RegisterOperand ZSrcOp, bits<2> size, bit U>
: I<(outs ZdRC:$Zd), (ins ZSrcOp:$Zn),
asm, "\t$Zd, $Zn", "", []>, Sched<[]> {
bits<5> Zd;
bits<4> Zn;
let Inst{31-24} = 0b01100101;
let Inst{23-22} = size;
let Inst{21-11} = 0b00110100110;
let Inst{10} = U;
let Inst{9-6} = Zn;
let Inst{5} = 0b0;
let Inst{4-0} = Zd;
}

multiclass sve2_fp_to_int_downcvt<string asm, bit U> {
def _HtoB : sve2_fp_to_int_downcvt<asm, ZPR8, ZZ_h_mul_r, 0b01, U>;
def _StoH : sve2_fp_to_int_downcvt<asm, ZPR16, ZZ_s_mul_r, 0b10, U>;
def _DtoS : sve2_fp_to_int_downcvt<asm, ZPR32, ZZ_d_mul_r, 0b11, U>;
}

//===----------------------------------------------------------------------===//
// SCVTF
//===----------------------------------------------------------------------===//
class sve2_int_to_fp_upcvt<string asm, ZPRRegOp ZdRC, ZPRRegOp ZnRC,
bits<2> size, bits<2> U>
: I<(outs ZdRC:$Zd), (ins ZnRC:$Zn),
asm, "\t$Zd, $Zn", "", []>, Sched<[]> {
bits<5> Zd;
bits<5> Zn;
let Inst{31-24} = 0b01100101;
let Inst{23-22} = size;
let Inst{21-12} = 0b0011000011;
let Inst{11-10} = U;
let Inst{9-5} = Zn;
let Inst{4-0} = Zd;
}

multiclass sve2_int_to_fp_upcvt<string asm, bits<2> U> {
def _BtoH : sve2_int_to_fp_upcvt<asm, ZPR16, ZPR8, 0b01, U>;
def _HtoS : sve2_int_to_fp_upcvt<asm, ZPR32, ZPR16, 0b10, U>;
def _StoD : sve2_int_to_fp_upcvt<asm, ZPR64, ZPR32, 0b11, U>;
}
55 changes: 55 additions & 0 deletions llvm/test/MC/AArch64/SVE2p3/fcvtz-diagnostics.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p3 2>&1 < %s| FileCheck %s

// --------------------------------------------------------------------------//
// Invalid operand for instruction

fcvtzsn z0.b, { z0.b, z1.b }
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: fcvtzsn z0.b, { z0.b, z1.b }
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

fcvtzsn z0.h, { z0.h, z1.h }
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: fcvtzsn z0.h, { z0.h, z1.h }
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

fcvtzsn z0.s, { z0.s, z1.s }
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: fcvtzsn z0.s, { z0.s, z1.s }
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Negative tests for instructions that are incompatible with movprfx

movprfx z0, z7
fcvtzsn z0.b, { z0.h, z1.h }
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
// CHECK-NEXT: fcvtzsn z0.b, { z0.h, z1.h }
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Invalid operand for instruction

fcvtzun z0.b, { z0.b, z1.b }
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: fcvtzun z0.b, { z0.b, z1.b }
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

fcvtzun z0.h, { z0.h, z1.h }
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: fcvtzun z0.h, { z0.h, z1.h }
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

fcvtzun z0.s, { z0.s, z1.s }
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: fcvtzun z0.s, { z0.s, z1.s }
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Negative tests for instructions that are incompatible with movprfx

movprfx z0, z7
fcvtzun z0.b, { z0.h, z1.h }
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
// CHECK-NEXT: fcvtzun z0.b, { z0.h, z1.h }
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
165 changes: 165 additions & 0 deletions llvm/test/MC/AArch64/SVE2p3/fcvtz.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p3 < %s \
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p3 < %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=+sve2p3 < %s \
// RUN: | llvm-objdump -d --mattr=+sve2p3 --no-print-imm-hex - | FileCheck %s --check-prefix=CHECK-INST
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve2p3 < %s \
// RUN: | llvm-objdump -d --mattr=-sve2p3 --no-print-imm-hex - | FileCheck %s --check-prefix=CHECK-UNKNOWN
// Disassemble encoding and check the re-encoding (-show-encoding) matches.
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p3 < %s \
// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
// RUN: | llvm-mc -triple=aarch64 -mattr=+sve2p3 -disassemble -show-encoding \
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST

// -------------------------------------------------------------
// Floating-point convert, narrow and interleave to signed integer, rounding toward zero

fcvtzsn z0.b, { z0.h, z1.h }
// CHECK-INST: fcvtzsn z0.b, { z0.h, z1.h }
// CHECK-ENCODING: encoding: [0x00,0x30,0x4d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 654d3000 <unknown>

fcvtzsn z31.b, { z0.h, z1.h }
// CHECK-INST: fcvtzsn z31.b, { z0.h, z1.h }
// CHECK-ENCODING: encoding: [0x1f,0x30,0x4d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 654d301f <unknown>

fcvtzsn z0.b, { z30.h, z31.h }
// CHECK-INST: fcvtzsn z0.b, { z30.h, z31.h }
// CHECK-ENCODING: encoding: [0xc0,0x33,0x4d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 654d33c0 <unknown>

fcvtzsn z31.b, { z30.h, z31.h }
// CHECK-INST: fcvtzsn z31.b, { z30.h, z31.h }
// CHECK-ENCODING: encoding: [0xdf,0x33,0x4d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 654d33df <unknown>

fcvtzsn z0.h, { z0.s, z1.s }
// CHECK-INST: fcvtzsn z0.h, { z0.s, z1.s }
// CHECK-ENCODING: encoding: [0x00,0x30,0x8d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 658d3000 <unknown>

fcvtzsn z31.h, { z0.s, z1.s }
// CHECK-INST: fcvtzsn z31.h, { z0.s, z1.s }
// CHECK-ENCODING: encoding: [0x1f,0x30,0x8d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 658d301f <unknown>

fcvtzsn z0.h, { z30.s, z31.s }
// CHECK-INST: fcvtzsn z0.h, { z30.s, z31.s }
// CHECK-ENCODING: encoding: [0xc0,0x33,0x8d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 658d33c0 <unknown>

fcvtzsn z31.h, { z30.s, z31.s }
// CHECK-INST: fcvtzsn z31.h, { z30.s, z31.s }
// CHECK-ENCODING: encoding: [0xdf,0x33,0x8d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 658d33df <unknown>

fcvtzsn z0.s, { z0.d, z1.d }
// CHECK-INST: fcvtzsn z0.s, { z0.d, z1.d }
// CHECK-ENCODING: encoding: [0x00,0x30,0xcd,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 65cd3000 <unknown>

fcvtzsn z31.s, { z0.d, z1.d }
// CHECK-INST: fcvtzsn z31.s, { z0.d, z1.d }
// CHECK-ENCODING: encoding: [0x1f,0x30,0xcd,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 65cd301f <unknown>

fcvtzsn z0.s, { z30.d, z31.d }
// CHECK-INST: fcvtzsn z0.s, { z30.d, z31.d }
// CHECK-ENCODING: encoding: [0xc0,0x33,0xcd,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 65cd33c0 <unknown>

fcvtzsn z31.s, { z30.d, z31.d }
// CHECK-INST: fcvtzsn z31.s, { z30.d, z31.d }
// CHECK-ENCODING: encoding: [0xdf,0x33,0xcd,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 65cd33df <unknown>

// -------------------------------------------------------------
// Floating-point convert, narrow and interleave to unsigned integer, rounding toward zero

fcvtzun z0.b, { z0.h, z1.h }
// CHECK-INST: fcvtzun z0.b, { z0.h, z1.h }
// CHECK-ENCODING: encoding: [0x00,0x34,0x4d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 654d3400 <unknown>

fcvtzun z31.b, { z0.h, z1.h }
// CHECK-INST: fcvtzun z31.b, { z0.h, z1.h }
// CHECK-ENCODING: encoding: [0x1f,0x34,0x4d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 654d341f <unknown>

fcvtzun z0.b, { z30.h, z31.h }
// CHECK-INST: fcvtzun z0.b, { z30.h, z31.h }
// CHECK-ENCODING: encoding: [0xc0,0x37,0x4d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 654d37c0 <unknown>

fcvtzun z31.b, { z30.h, z31.h }
// CHECK-INST: fcvtzun z31.b, { z30.h, z31.h }
// CHECK-ENCODING: encoding: [0xdf,0x37,0x4d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 654d37df <unknown>

fcvtzun z0.h, { z0.s, z1.s }
// CHECK-INST: fcvtzun z0.h, { z0.s, z1.s }
// CHECK-ENCODING: encoding: [0x00,0x34,0x8d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 658d3400 <unknown>

fcvtzun z31.h, { z0.s, z1.s }
// CHECK-INST: fcvtzun z31.h, { z0.s, z1.s }
// CHECK-ENCODING: encoding: [0x1f,0x34,0x8d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 658d341f <unknown>

fcvtzun z0.h, { z30.s, z31.s }
// CHECK-INST: fcvtzun z0.h, { z30.s, z31.s }
// CHECK-ENCODING: encoding: [0xc0,0x37,0x8d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 658d37c0 <unknown>

fcvtzun z31.h, { z30.s, z31.s }
// CHECK-INST: fcvtzun z31.h, { z30.s, z31.s }
// CHECK-ENCODING: encoding: [0xdf,0x37,0x8d,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 658d37df <unknown>

fcvtzun z0.s, { z0.d, z1.d }
// CHECK-INST: fcvtzun z0.s, { z0.d, z1.d }
// CHECK-ENCODING: encoding: [0x00,0x34,0xcd,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 65cd3400 <unknown>

fcvtzun z31.s, { z0.d, z1.d }
// CHECK-INST: fcvtzun z31.s, { z0.d, z1.d }
// CHECK-ENCODING: encoding: [0x1f,0x34,0xcd,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 65cd341f <unknown>

fcvtzun z0.s, { z30.d, z31.d }
// CHECK-INST: fcvtzun z0.s, { z30.d, z31.d }
// CHECK-ENCODING: encoding: [0xc0,0x37,0xcd,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 65cd37c0 <unknown>

fcvtzun z31.s, { z30.d, z31.d }
// CHECK-INST: fcvtzun z31.s, { z30.d, z31.d }
// CHECK-ENCODING: encoding: [0xdf,0x37,0xcd,0x65]
// CHECK-ERROR: instruction requires: sme2p3 or sve2p3
// CHECK-UNKNOWN: 65cd37df <unknown>
65 changes: 65 additions & 0 deletions llvm/test/MC/AArch64/SVE2p3/scvtf-diagnostics.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p3 2>&1 < %s| FileCheck %s

// --------------------------------------------------------------------------//
// Invalid element width

scvtf z0.b, z0.b
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
// CHECK-NEXT: scvtf z0.b, z0.b
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

scvtf z0.h, z0.h
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
// CHECK-NEXT: scvtf z0.h, z0.h
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

scvtf z0.s, z0.s
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
// CHECK-NEXT: scvtf z0.s, z0.s
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

scvtf z0.d, z0.d
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
// CHECK-NEXT: scvtf z0.d, z0.d
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Negative tests for instructions that are incompatible with movprfx

movprfx z0, z7
scvtf z0.h, z0.b
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
// CHECK-NEXT: scvtf z0.h, z0.b
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Invalid element width

scvtflt z0.b, z0.b
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
// CHECK-NEXT: scvtflt z0.b, z0.b
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

scvtflt z0.h, z0.h
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
// CHECK-NEXT: scvtflt z0.h, z0.h
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

scvtflt z0.s, z0.s
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
// CHECK-NEXT: scvtflt z0.s, z0.s
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

scvtflt z0.d, z0.d
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
// CHECK-NEXT: scvtflt z0.d, z0.d
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Negative tests for instructions that are incompatible with movprfx

movprfx z0, z7
scvtflt z0.h, z0.b
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
// CHECK-NEXT: scvtflt z0.h, z0.b
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
Loading
Loading