FAMAX
Floating-point absolute maximum (predicated)
Determine the maximum absolute value from active floating-point elements of the second source vector and the corresponding floating-point elements of the first source vector and destructively place the results in the corresponding elements of the first source vector.
The behavior is as follows:
When FPCR.DN is 0, if either element is a NaN, the result is a quiet NaN.
When FPCR.DN is 1, if either element is a NaN, the result is the Default NaN.
Denormalized inputs and results are never flushed to zero, as if FPCR.{FZ16, FZ, FIZ} are all 0.
Denormalized inputs never generate an Input Denormal floating-point exception.
Inactive elements in the destination vector register remain unmodified.
Green
True
True
True
0
1
1
0
0
1
0
1
0
0
1
1
1
0
1
0
0
FAMAX <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>
if ((!IsFeatureImplemented(FEAT_SVE2) && !IsFeatureImplemented(FEAT_SME2)) ||
!IsFeatureImplemented(FEAT_FAMINMAX)) then UNDEFINED;
if size == '00' then UNDEFINED;
constant integer esize = 8 << UInt(size);
constant integer g = UInt(Pg);
constant integer dn = UInt(Zdn);
constant integer m = UInt(Zm);
<Zdn>
Is the name of the first source and destination scalable vector register, encoded in the "Zdn" field.
<T>
Is the size specifier,
size
<T>
00
RESERVED
01
H
10
S
11
D
<Pg>
Is the name of the governing scalable predicate register P0-P7, encoded in the "Pg" field.
<Zm>
Is the name of the second source scalable vector register, encoded in the "Zm" field.
CheckSVEEnabled();
constant integer VL = CurrentVL;
constant integer PL = VL DIV 8;
constant integer elements = VL DIV esize;
constant bits(PL) mask = P[g, PL];
constant bits(VL) operand1 = Z[dn, VL];
constant bits(VL) operand2 = if AnyActiveElement(mask, esize) then Z[m, VL] else Zeros(VL);
bits(VL) result;
for e = 0 to elements-1
constant bits(esize) element1 = Elem[operand1, e, esize];
if ActivePredicateElement(mask, e, esize) then
constant bits(esize) element2 = Elem[operand2, e, esize];
Elem[result, e, esize] = FPAbsMax(element1, element2, FPCR);
else
Elem[result, e, esize] = element1;
Z[dn, VL] = result;