SMMLA
Signed integer matrix multiply-accumulate
The signed integer matrix multiply-accumulate instruction multiplies the 2×8 matrix of signed 8-bit integer values held in each 128-bit segment of the first source vector by the 8×2 matrix of signed 8-bit integer values in the corresponding segment of the second source vector. The resulting 2×2 widened 32-bit integer matrix product is then destructively added to the 32-bit integer matrix accumulator held in the corresponding segment of the addend and destination vector. This is equivalent to performing an 8-way dot product per destination element.
This instruction is unpredicated.
ID_AA64ZFR0_EL1.I8MM indicates whether this instruction is implemented.
This instruction is illegal when executed in Streaming SVE mode, unless FEAT_SME_FA64 is implemented and enabled.
Green
False
True
True
SM_0_only
0
1
0
0
0
1
0
1
0
0
0
1
0
0
1
1
0
SMMLA <Zda>.S, <Zn>.B, <Zm>.B
if !IsFeatureImplemented(FEAT_SVE) || !IsFeatureImplemented(FEAT_I8MM) then UNDEFINED;
constant integer n = UInt(Zn);
constant integer m = UInt(Zm);
constant integer da = UInt(Zda);
constant boolean op1_unsigned = FALSE;
constant boolean op2_unsigned = FALSE;
<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.
CheckNonStreamingSVEEnabled();
constant integer VL = CurrentVL;
constant integer segments = VL DIV 128;
constant bits(VL) operand1 = Z[n, VL];
constant bits(VL) operand2 = Z[m, VL];
constant bits(VL) operand3 = Z[da, VL];
bits(VL) result = Zeros(VL);
bits(128) op1, op2;
bits(128) res, addend;
for s = 0 to segments-1
op1 = Elem[operand1, s, 128];
op2 = Elem[operand2, s, 128];
addend = Elem[operand3, s, 128];
res = MatMulAdd(addend, op1, op2, op1_unsigned, op2_unsigned);
Elem[result, s, 128] = res;
Z[da, VL] = result;