FMAX (vectors)

Floating-point maximum (predicated)

Determine the maximum of active floating-point elements of the second source vector and corresponding floating-point elements of the first source vector and destructively place the results in the corresponding elements of the first source vector.

When FPCR.AH is 0, the behavior is as follows:

  • Negative zero compares less than positive zero.
  • 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 Default NaN.
  • When FPCR.AH is 1, the behavior is as follows:

  • If both elements are zeros, regardless of the sign of either zero, the result is the second element.
  • If either element is a NaN, regardless of the value of FPCR.DN, the result is the second element.
  • Inactive elements in the destination vector register remain unmodified.

    Encoding: SVE

    Variants: FEAT_SVE || FEAT_SME (FEAT_SVE || FEAT_SME)

    313029282726252423222120191817161514131211109876543210
    01100101!= 00000110100
    sizeopcPgZmZdn

    FMAX <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>

    Decoding algorithm

    if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then
        EndOfDecode(Decode_UNDEF);
    constant integer esize = 8 << UInt(size);
    
    constant integer g = UInt(Pg);
    constant integer dn = UInt(Zdn);
    constant integer m = UInt(Zm);

    Operation

    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] = FPMax(element1, element2, FPCR);
        else
            Elem[result, e, esize] = element1;
    
    Z[dn, VL] = result;

    Explanations

    <Zdn>: Is the name of the first source and destination scalable vector register, encoded in the "Zdn" field.
    <T>: <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.

    Operational Notes

    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: