Skip to content

Commit

Permalink
[llvm][AArch64][Assembly]: Add FDOT2/FDOT4 assembly and disassembly. (#…
Browse files Browse the repository at this point in the history
…70237)

This patch adds the feature flag FDOT2/FDOT4 and the
assembly/disassembly
for the following instructions of NEON and SVE2:
 * NEON:
   - FDOTlane
   - FDOT
 * SVE2:
   - FDOT_ZZZI_BtoH
   - FDOT_ZZZ_BtoH
   - FDOT_ZZZI_BtoS
   - FDOT_ZZZ_BtoS

That is according to this documentation:
https://developer.arm.com/documentation/ddi0602/2023-09
  • Loading branch information
hassnaaHamdi committed Nov 1, 2023
1 parent a8ead56 commit f16b7c6
Show file tree
Hide file tree
Showing 15 changed files with 476 additions and 26 deletions.
8 changes: 8 additions & 0 deletions llvm/include/llvm/TargetParser/AArch64TargetParser.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,10 @@ enum ArchExtKind : unsigned {
AEK_FAMINMAX = 60, // FEAT_FAMINMAX
AEK_FP8FMA = 61, // FEAT_FP8FMA
AEK_SSVE_FP8FMA = 62, // FEAT_SSVE_FP8FMA
AEK_FP8DOT2 = 63, // FEAT_FP8DOT2
AEK_SSVE_FP8DOT2 = 64, // FEAT_SSVE_FP8DOT2
AEK_FP8DOT4 = 65, // FEAT_FP8DOT4
AEK_SSVE_FP8DOT4 = 66, // FEAT_SSVE_FP8DOT4
AEK_NUM_EXTENSIONS
};
using ExtensionBitset = Bitset<AEK_NUM_EXTENSIONS>;
Expand Down Expand Up @@ -277,6 +281,10 @@ inline constexpr ExtensionInfo Extensions[] = {
{"faminmax", AArch64::AEK_FAMINMAX, "+faminmax", "-faminmax", FEAT_INIT, "", 0},
{"fp8fma", AArch64::AEK_FP8FMA, "+fp8fma", "-fp8fma", FEAT_INIT, "+fpmr", 0},
{"ssve-fp8fma", AArch64::AEK_SSVE_FP8FMA, "+ssve-fp8fma", "-ssve-fp8fma", FEAT_INIT, "+sme2", 0},
{"fp8dot2", AArch64::AEK_FP8DOT2, "+fp8dot2", "-fp8dot2", FEAT_INIT, "", 0},
{"ssve-fp8dot2", AArch64::AEK_SSVE_FP8DOT2, "+ssve-fp8dot2", "-ssve-fp8dot2", FEAT_INIT, "+sme2", 0},
{"fp8dot4", AArch64::AEK_FP8DOT4, "+fp8dot4", "-fp8dot4", FEAT_INIT, "", 0},
{"ssve-fp8dot4", AArch64::AEK_SSVE_FP8DOT4, "+ssve-fp8dot4", "-ssve-fp8dot4", FEAT_INIT, "+sme2", 0},
// Special cases
{"none", AArch64::AEK_NONE, {}, {}, FEAT_INIT, "", ExtensionInfo::MaxFMVPriority},
};
Expand Down
12 changes: 12 additions & 0 deletions llvm/lib/Target/AArch64/AArch64.td
Original file line number Diff line number Diff line change
Expand Up @@ -523,6 +523,18 @@ def FeatureFP8FMA : SubtargetFeature<"fp8fma", "HasFP8FMA", "true",
def FeatureSSVE_FP8FMA : SubtargetFeature<"ssve-fp8fma", "HasSSVE_FP8FMA", "true",
"Enable SVE2 fp8 multiply-add instructions (FEAT_SSVE_FP8FMA)", [FeatureSME2]>;

def FeatureFP8DOT2: SubtargetFeature<"fp8dot2", "HasFP8DOT2", "true",
"Enable fp8 2-way dot instructions (FEAT_FP8DOT2)">;

def FeatureSSVE_FP8DOT2 : SubtargetFeature<"ssve-fp8dot2", "HasSSVE_FP8DOT2", "true",
"Enable SVE2 fp8 2-way dot product instructions (FEAT_SSVE_FP8DOT2)", [FeatureSME2]>;

def FeatureFP8DOT4: SubtargetFeature<"fp8dot4", "HasFP8DOT4", "true",
"Enable fp8 4-way dot instructions (FEAT_FP8DOT4)">;

def FeatureSSVE_FP8DOT4 : SubtargetFeature<"ssve-fp8dot4", "HasSSVE_FP8DOT4", "true",
"Enable SVE2 fp8 4-way dot product instructions (FEAT_SSVE_FP8DOT4)", [FeatureSME2]>;

def FeatureAppleA7SysReg : SubtargetFeature<"apple-a7-sysreg", "HasAppleA7SysReg", "true",
"Apple A7 (the CPU formerly known as Cyclone)">;

Expand Down
41 changes: 37 additions & 4 deletions llvm/lib/Target/AArch64/AArch64InstrFormats.td
Original file line number Diff line number Diff line change
Expand Up @@ -6108,6 +6108,21 @@ multiclass SIMDThreeVectorCvt<string asm> {
V128, v16i8, v4f32, null_frag>;
}

// TODO: Create a new Value Type v8f8 and v16f8
multiclass SIMDThreeSameVectorDOT2<string asm> {
def v4f16 : BaseSIMDThreeSameVectorDot<0b0, 0b0, 0b01, 0b1111, asm, ".4h", ".8b",
V64, v4f16, v8i8, null_frag>;
def v8f16 : BaseSIMDThreeSameVectorDot<0b1, 0b0, 0b01, 0b1111, asm, ".8h", ".16b",
V128, v8f16, v16i8, null_frag>;
}

multiclass SIMDThreeSameVectorDOT4<string asm> {
def v2f32 : BaseSIMDThreeSameVectorDot<0b0, 0b0, 0b00, 0b1111, asm, ".2s", ".8b",
V64, v2f32, v8i8, null_frag>;
def v4f32 : BaseSIMDThreeSameVectorDot<0b1, 0b0, 0b00, 0b1111, asm, ".4s", ".16b",
V128, v4f32, v16i8, null_frag>;
}

//----------------------------------------------------------------------------
// AdvSIMD two register vector instructions.
//----------------------------------------------------------------------------
Expand Down Expand Up @@ -8570,10 +8585,10 @@ class SIMDThreeSameVectorMatMul<bit B, bit U, string asm, SDPatternOperator OpNo
//----------------------------------------------------------------------------
// ARMv8.2-A Dot Product Instructions (Indexed)
class BaseSIMDThreeSameVectorIndexS<bit Q, bit U, bits<2> size, bits<4> opc, string asm,
string dst_kind, string lhs_kind, string rhs_kind,
RegisterOperand RegType,
ValueType AccumType, ValueType InputType,
SDPatternOperator OpNode> :
string dst_kind, string lhs_kind, string rhs_kind,
RegisterOperand RegType,
ValueType AccumType, ValueType InputType,
SDPatternOperator OpNode> :
BaseSIMDIndexedTied<Q, U, 0b0, size, opc, RegType, RegType, V128,
VectorIndexS, asm, "", dst_kind, lhs_kind, rhs_kind,
[(set (AccumType RegType:$dst),
Expand All @@ -8595,6 +8610,14 @@ multiclass SIMDThreeSameVectorDotIndex<bit U, bit Mixed, bits<2> size, string as
V128, v4i32, v16i8, OpNode>;
}

// TODO: The vectors v8i8 and v16i8 should be v8f8 and v16f8
multiclass SIMDThreeSameVectorFP8DOT4Index<string asm> {
def v8f8 : BaseSIMDThreeSameVectorIndexS<0b0, 0b0, 0b00, 0b0000, asm, ".2s", ".8b", ".4b",
V64, v2f32, v8i8, null_frag>;
def v16f8 : BaseSIMDThreeSameVectorIndexS<0b1, 0b0, 0b00, 0b0000, asm, ".4s", ".16b",".4b",
V128, v4f32, v16i8, null_frag>;
}

// ARMv8.2-A Fused Multiply Add-Long Instructions (Indexed)
let mayRaiseFPException = 1, Uses = [FPCR] in
class BaseSIMDThreeSameVectorIndexH<bit Q, bit U, bits<2> sz, bits<4> opc, string asm,
Expand Down Expand Up @@ -8624,6 +8647,16 @@ multiclass SIMDThreeSameVectorFMLIndex<bit U, bits<4> opc, string asm,
V128, V128_lo, v4f32, v8f16, OpNode>;
}

//----------------------------------------------------------------------------
// FP8 Advanced SIMD vector x indexed element
// TODO: Replace value types v8i8 and v16i8 by v8f8 and v16f8
multiclass SIMDThreeSameVectorFP8DOT2Index<string asm> {
def v4f16 : BaseSIMDThreeSameVectorIndexH<0b0, 0b0, 0b01, 0b0000, asm, ".4h", ".8b", ".2b",
V64, V128_lo, v4f16, v8i8, null_frag>;
def v8f16 : BaseSIMDThreeSameVectorIndexH<0b1, 0b0, 0b01, 0b0000, asm, ".8h", ".16b", ".2b",
V128, V128_lo, v8f16, v8i16, null_frag>;
}

multiclass SIMDFPIndexed<bit U, bits<4> opc, string asm,
SDPatternOperator OpNode> {
let mayRaiseFPException = 1, Uses = [FPCR] in {
Expand Down
24 changes: 24 additions & 0 deletions llvm/lib/Target/AArch64/AArch64InstrInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,20 @@ def HasSSVE_FP8FMA : Predicate<"Subtarget->SSVE_FP8FMA() || "
AssemblerPredicateWithAll<(any_of FeatureSSVE_FP8FMA,
(all_of FeatureSVE2, FeatureFP8FMA)),
"ssve-fp8fma or (sve2 and fp8fma)">;
def HasFP8DOT2 : Predicate<"Subtarget->hasFP8DOT2()">,
AssemblerPredicateWithAll<(all_of FeatureFP8DOT2), "fp8dot2">;
def HasSSVE_FP8DOT2 : Predicate<"Subtarget->hasSSVE_FP8DOT2() || "
"(Subtarget->hasSVE2() && Subtarget->hasFP8DOT2())">,
AssemblerPredicateWithAll<(any_of FeatureSSVE_FP8DOT2,
(all_of FeatureSVE2, FeatureFP8DOT2)),
"ssve-fp8dot2 or (sve2 and fp8dot2)">;
def HasFP8DOT4 : Predicate<"Subtarget->hasFP8DOT4()">,
AssemblerPredicateWithAll<(all_of FeatureFP8DOT4), "fp8dot4">;
def HasSSVE_FP8DOT4 : Predicate<"Subtarget->hasSSVE_FP8DOT4() || "
"(Subtarget->hasSVE2() && Subtarget->hasFP8DOT4())">,
AssemblerPredicateWithAll<(any_of FeatureSSVE_FP8DOT4,
(all_of FeatureSVE2, FeatureFP8DOT4)),
"ssve-fp8dot4 or (sve2 and fp8dot4)">;

// A subset of SVE(2) instructions are legal in Streaming SVE execution mode,
// they should be enabled if either has been specified.
Expand Down Expand Up @@ -9309,6 +9323,16 @@ let Predicates = [HasFP8FMA] in {
defm FMLALLTT : SIMDThreeSameVectorMLAL<0b1, 0b01, "fmlalltt">;
} // End let Predicates = [HasFP8FMA]

let Predicates = [HasFP8DOT2] in {
defm FDOTlane : SIMDThreeSameVectorFP8DOT2Index<"fdot">;
defm FDOT : SIMDThreeSameVectorDOT2<"fdot">;
} // End let Predicates = [HasFP8DOT2]

let Predicates = [HasFP8DOT4] in {
defm FDOTlane : SIMDThreeSameVectorFP8DOT4Index<"fdot">;
defm FDOT : SIMDThreeSameVectorDOT4<"fdot">;
} // End let Predicates = [HasFP8DOT4]

include "AArch64InstrAtomics.td"
include "AArch64SVEInstrInfo.td"
include "AArch64SMEInstrInfo.td"
Expand Down
17 changes: 17 additions & 0 deletions llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -4064,3 +4064,20 @@ def FMLALLBT_ZZZ : sve2_fp8_mla<0b001, ZPR32, "fmlallbt">;
def FMLALLTB_ZZZ : sve2_fp8_mla<0b010, ZPR32, "fmlalltb">;
def FMLALLTT_ZZZ : sve2_fp8_mla<0b011, ZPR32, "fmlalltt">;
} // End HasSSVE_FP8FMA

let Predicates = [HasSSVE_FP8DOT2] in {
// FP8 Widening Dot-Product - Indexed Group
defm FDOT_ZZZI_BtoH : sve2_fp8_dot_indexed<"fdot">;
// FP8 Widening Dot-Product - Group
// TODO: Replace nxv16i8 by nxv16f8
defm FDOT_ZZZ_BtoH : sve_float_dot<0b0, 0b1, ZPR16, ZPR8, "fdot", nxv16i8, null_frag>;
}

// TODO: Replace nxv16i8 by nxv16f8
let Predicates = [HasSSVE_FP8DOT4] in {
// FP8 Widening Dot-Product - Indexed Group
defm FDOT_ZZZI_BtoS : sve_float_dot_indexed<0b1, 0b01, ZPR8, ZPR3b8, "fdot",
nxv16i8, null_frag>;
// FP8 Widening Dot-Product - Group
defm FDOT_ZZZ_BtoS : sve_float_dot<0b1, 0b1, ZPR32, ZPR8, "fdot", nxv16i8, null_frag>;
}
4 changes: 4 additions & 0 deletions llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3654,6 +3654,10 @@ static const struct Extension {
{"faminmax", {AArch64::FeatureFAMINMAX}},
{"fp8fma", {AArch64::FeatureFP8FMA}},
{"ssve-fp8fma", {AArch64::FeatureSSVE_FP8FMA}},
{"fp8dot2", {AArch64::FeatureFP8DOT2}},
{"ssve-fp8dot2", {AArch64::FeatureSSVE_FP8DOT2}},
{"fp8dot4", {AArch64::FeatureFP8DOT4}},
{"ssve-fp8dot4", {AArch64::FeatureSSVE_FP8DOT4}},
};

static void setRequiredFeatureString(FeatureBitset FBS, std::string &Str) {
Expand Down
10 changes: 10 additions & 0 deletions llvm/lib/Target/AArch64/SVEInstrFormats.td
Original file line number Diff line number Diff line change
Expand Up @@ -10193,3 +10193,13 @@ class sve2_fp8_mla_long_long_by_indexed_elem<bits<2> TT, string mnemonic>
let DestructiveInstType = DestructiveOther;
let ElementSize = ZPR32.ElementSize;
}

// FP8 Widening Dot-Product - Indexed Group
multiclass sve2_fp8_dot_indexed<string mnemonic>{
def NAME : sve_float_dot_indexed<0b0, ZPR16, ZPR8, ZPR3b8, VectorIndexH, mnemonic> {
bits<3> iop;
let Inst{20-19} = iop{2-1};
let Inst{11} = iop{0};
let Inst{10} = 0b1;
}
}
12 changes: 12 additions & 0 deletions llvm/test/MC/AArch64/FP8/directive-arch-negative.s
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,15 @@ fmlalb v0.8h, v0.16b, v0.16b
fmlalb z23.h, z13.b, z0.b[7]
// CHECK: error: instruction requires: ssve-fp8fma or (sve2 and fp8fma)
// CHECK: fmlalb z23.h, z13.b, z0.b[7]

.arch armv9-a+fp8dot2
.arch armv9-a+nofp8dot2
fdot v31.4h, v0.8b, v0.8b
// CHECK: error: instruction requires: fp8dot2
// CHECK: fdot v31.4h, v0.8b, v0.8b

.arch armv9-a+fp8dot4
.arch armv9-a+nofp8dot4
fdot v0.2s, v0.8b, v31.8b
// CHECK: error: instruction requires: fp8dot4
// CHECK: fdot v0.2s, v0.8b, v31.8b
10 changes: 10 additions & 0 deletions llvm/test/MC/AArch64/FP8/directive-arch.s
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,13 @@ fmlalb v0.8h, v0.16b, v0.16b
fmlalb z23.h, z13.b, z0.b[7]
// CHECK: fmlalb z23.h, z13.b, z0.b[7]
.arch armv9-a+nossve-fp8fma

.arch armv9-a+fp8dot2
fdot v31.4h, v0.8b, v0.8b
// CHECK: fdot v31.4h, v0.8b, v0.8b
.arch armv9-a+nofp8dot2

.arch armv9-a+fp8dot4
fdot v0.2s, v0.8b, v31.8b
// CHECK: fdot v0.2s, v0.8b, v31.8b
.arch armv9-a+nofp8dot4
59 changes: 59 additions & 0 deletions llvm/test/MC/AArch64/FP8/dot-diagnostic.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+fp8dot2,+fp8dot4 2>&1 < %s| FileCheck %s

// --------------------------------------------------------------------------//
// Element size extension incorrect

fdot v31.4h, v0.8h, v0.8b
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: fdot v31.4h, v0.8h, v0.8b
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

fdot v31.8h, v0.16b, v31.16h
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid vector kind qualifier
// CHECK-NEXT: fdot v31.8h, v0.16b, v31.16h
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

fdot v0.2s, v0.8s, v31.8b
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid vector kind qualifier
// CHECK-NEXT: fdot v0.2s, v0.8s, v31.8b
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

fdot v31.4s, v0, v31.16b
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: fdot v31.4s, v0, v31.16b
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

//--------------------------------------------------------------------------//
// Last Register range is between 0-15

fdot v31.4h, v31.8b, v16.2b[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: fdot v31.4h, v31.8b, v16.2b[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

fdot v0.8h, v0.16b, v16.2b[7]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: fdot v0.8h, v0.16b, v16.2b[7]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Out of range index
fdot v31.4h, v31.8b, v15.2b[-1]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 7].
// CHECK-NEXT: fdot v31.4h, v31.8b, v15.2b[-1]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

fdot v0.8h, v0.16b, v15.2b[8]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 7].
// CHECK-NEXT: fdot v0.8h, v0.16b, v15.2b[8]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

fdot v0.2s, v0.8b, v31.4b[-1]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3].
// CHECK-NEXT: fdot v0.2s, v0.8b, v31.4b[-1]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

fdot v0.4s, v31.16b, v0.4b[4]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3].
// CHECK-NEXT: fdot v0.4s, v31.16b, v0.4b[4]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
63 changes: 63 additions & 0 deletions llvm/test/MC/AArch64/FP8/dot.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+fp8dot2,+fp8dot4 < %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=+fp8dot2,+fp8dot4 < %s \
// RUN: | llvm-objdump -d --mattr=+fp8dot2,+fp8dot4 - | FileCheck %s --check-prefix=CHECK-INST
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+fp8dot2,+fp8dot4 < %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=+fp8dot2,+fp8dot4 < %s \
// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
// RUN: | llvm-mc -triple=aarch64 -mattr=+fp8dot2,+fp8dot4 -disassemble -show-encoding \
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST

/// VECTOR
fdot v31.4h, v0.8b, v0.8b
// CHECK-INST: fdot v31.4h, v0.8b, v0.8b
// CHECK-ENCODING: [0x1f,0xfc,0x40,0x0e]
// CHECK-ERROR: instruction requires: fp8dot2
// CHECK-UNKNOWN: 0e40fc1f <unknown>

fdot v31.8h, v0.16b, v31.16b
// CHECK-INST: fdot v31.8h, v0.16b, v31.16b
// CHECK-ENCODING: [0x1f,0xfc,0x5f,0x4e]
// CHECK-ERROR: instruction requires: fp8dot2
// CHECK-UNKNOWN: 4e5ffc1f <unknown>

fdot v0.2s, v0.8b, v31.8b
// CHECK-INST: fdot v0.2s, v0.8b, v31.8b
// CHECK-ENCODING: [0x00,0xfc,0x1f,0x0e]
// CHECK-ERROR: instruction requires: fp8dot4
// CHECK-UNKNOWN: 0e1ffc00 <unknown>

fdot v31.4s, v0.16b, v31.16b
// CHECK-INST: fdot v31.4s, v0.16b, v31.16b
// CHECK-ENCODING: [0x1f,0xfc,0x1f,0x4e]
// CHECK-ERROR: instruction requires: fp8dot4
// CHECK-UNKNOWN: 4e1ffc1f <unknown>

//INDEXED
fdot v31.4h, v31.8b, v15.2b[0]
// CHECK-INST: fdot v31.4h, v31.8b, v15.2b[0]
// CHECK-ENCODING: [0xff,0x03,0x4f,0x0f]
// CHECK-ERROR: instruction requires: fp8dot2
// CHECK-UNKNOWN: 0f4f03ff <unknown>

fdot v0.8h, v0.16b, v15.2b[7]
// CHECK-INST: fdot v0.8h, v0.16b, v15.2b[7]
// CHECK-ENCODING: [0x00,0x08,0x7f,0x4f]
// CHECK-ERROR: instruction requires: fp8dot2
// CHECK-UNKNOWN: 4f7f0800 <unknown>

fdot v0.2s, v0.8b, v31.4b[0]
// CHECK-INST: fdot v0.2s, v0.8b, v31.4b[0]
// CHECK-ENCODING: [0x00,0x00,0x1f,0x0f]
// CHECK-ERROR: instruction requires: fp8dot4
// CHECK-UNKNOWN: 0f1f0000 <unknown>

fdot v0.4s, v31.16b, v0.4b[3]
// CHECK-INST: fdot v0.4s, v31.16b, v0.4b[3]
// CHECK-ENCODING: [0xe0,0x0b,0x20,0x4f]
// CHECK-ERROR: instruction requires: fp8dot4
// CHECK-UNKNOWN: 4f200be0 <unknown>

0 comments on commit f16b7c6

Please sign in to comment.