BFMMLA (widening)
BFloat16 matrix multiply-accumulate to single-precision
If FEAT_EBF16 is not implemented or FPCR.EBF is 0,
this instruction:
-
Multiplies the 2×4 matrix of BFloat16 values
held in each 128-bit segment of the first source vector by the
4×2 matrix of BFloat16 values in the corresponding
segment of the second source vector. The intermediate single-precision
results are calculated as a sum of two unfused sum-of-products using two pairs of
adjacent BFloat16 values from each of the source vectors, and rounded before
accumulation into the 2×2 matrix of single-precision results
in the corresponding segment of the destination vector.
This is equivalent to accumulating two 2-way unfused
dot products per destination element.
-
Uses the non-IEEE 754 Round-to-Odd rounding mode, which forces
bit 0 of an inexact result to 1, and rounds an overflow to an
appropriately signed Infinity.
-
Flushes denormalized inputs and results to zero, as if
FPCR.{FZ, FIZ} is {1, 1}.
-
Honors FPCR.AH when generating a default NaN result, otherwise disables alternative floating point
behaviors, as if FPCR.AH is 0.
If FEAT_EBF16 is implemented and FPCR.EBF is 1,
then this instruction:
-
Multiplies the 2×4 matrix of BFloat16 values
held in each 128-bit segment of the first source vector by the
4×2 matrix of BFloat16 values in the corresponding
segment of the second source vector. The intermediate single-precision results are
calculated as a sum of two fused sum-of-products using two pairs of adjacent BFloat16 values from
each of the source vectors, and rounded before accumulation into the 2×2
matrix of single-precision results in the destination vector.
This is equivalent to accumulating two 2-way fused dot
products per destination element.
-
Follows all other floating-point behaviors that
apply to single-precision arithmetic, as governed by
FPCR.RMode, FPCR.FZ, FPCR.AH, and FPCR.FIZ.
Irrespective of FEAT_EBF16 and FPCR.EBF, this instruction:
-
Does not modify the cumulative FPSR
exception bits (IDC, IXC, UFC, OFC, DZC, and IOC).
-
Disables trapped floating-point exceptions, as if the
FPCR trap enable bits
(IDE, IXE, UFE, OFE, DZE, and IOE) are all zero.
-
Generates only the default NaN, as if FPCR.DN
is 1.
This instruction is unpredicated and
vector length agnostic.
ID_AA64ZFR0_EL1.BF16 indicates whether this instruction is implemented.
This instruction is illegal when executed in Streaming SVE mode, unless FEAT_SME_FA64 is implemented and enabled.
SVE
(FEAT_SVE && FEAT_BF16)
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | Zm | 1 | 1 | 1 | 0 | 0 | 1 | Zn | Zda |
| | | opc | | | | | |
Decode for this encoding
if !IsFeatureImplemented(FEAT_SVE) || !IsFeatureImplemented(FEAT_BF16) then
EndOfDecode(Decode_UNDEF);
end;
let n : integer = UInt(Zn);
let m : integer = UInt(Zm);
let da : integer = UInt(Zda);
Assembler Symbols
| <Zda> |
Is the name of the third source and destination scalable vector register, encoded in the "Zda" field.
|
| <Zn> |
Is the name of the first source scalable vector register, encoded in the "Zn" field.
|
| <Zm> |
Is the name of the second source scalable vector register, encoded in the "Zm" field.
|
Operation
CheckNonStreamingSVEEnabled();
let VL : integer{} = CurrentVL();
let segments : integer = VL DIV 128;
let operand1 : bits(VL) = Z{}(n);
let operand2 : bits(VL) = Z{}(m);
let operand3 : bits(VL) = Z{}(da);
var result : bits(VL);
var op1, op2 : bits(128);
var res, addend : bits(128);
for s = 0 to segments-1 do
op1 = operand1[s*:(128)];
op2 = operand2[s*:(128)];
addend = operand3[s*:(128)];
res = BFMatMulAddH(addend, op1, op2, FPCR());
result[s*:(128)] = res;
end;
Z{VL}(da) = result;
Operational information
This instruction might be immediately preceded in program order by a MOVPRFX instruction. The MOVPRFX must conform to all of the following requirements, otherwise the behavior of the MOVPRFX and this instruction is CONSTRAINED UNPREDICTABLE:
-
The MOVPRFX must be unpredicated.
-
The MOVPRFX must specify the same destination register as this instruction.
-
The destination register must not refer to architectural register state referenced by any other source operand register of this instruction.
2025-12_rel
2025-12-10 16:41:45
Copyright © 2010-2025 Arm Limited or its affiliates. All rights reserved.
This document is Non-Confidential.