SCVTF (predicated)

Signed integer convert to floating-point (predicated)

Convert to floating-point from the signed integer in each active element of the source vector, and place the results in the corresponding elements of the destination vector. Inactive elements in the destination vector register remain unmodified or are set to zero, depending on whether merging or zeroing predication is selected.

If the input and result types have a different size the smaller type is held unpacked in the least significant bits of elements of the larger size. When the input is the smaller type the upper bits of each source element are ignored. When the result is the smaller type the results are zero-extended to fill each destination element.

Encoding: 16-bit to half-precision, merging

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

313029282726252423222120191817161514131211109876543210
0110010101010010101
opcopc2int_UPgZnZd

SCVTF <Zd>.H, <Pg>/M, <Zn>.H

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 16;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 16;
constant integer d_esize = 16;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = TRUE;

Encoding: 16-bit to half-precision, zeroing

Variants: FEAT_SVE2p2 || FEAT_SME2p2 (FEAT_SVE2p2 || FEAT_SME2p2)

313029282726252423222120191817161514131211109876543210
0110010001011100110
opco2o3int_UPgZnZd

SCVTF <Zd>.H, <Pg>/Z, <Zn>.H

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE2p2) && !IsFeatureImplemented(FEAT_SME2p2) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 16;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 16;
constant integer d_esize = 16;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = FALSE;

Encoding: 32-bit to half-precision, merging

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

313029282726252423222120191817161514131211109876543210
0110010101010100101
opcopc2int_UPgZnZd

SCVTF <Zd>.H, <Pg>/M, <Zn>.S

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 32;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 32;
constant integer d_esize = 16;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = TRUE;

Encoding: 32-bit to half-precision, zeroing

Variants: FEAT_SVE2p2 || FEAT_SME2p2 (FEAT_SVE2p2 || FEAT_SME2p2)

313029282726252423222120191817161514131211109876543210
0110010001011101100
opco2o3int_UPgZnZd

SCVTF <Zd>.H, <Pg>/Z, <Zn>.S

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE2p2) && !IsFeatureImplemented(FEAT_SME2p2) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 32;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 32;
constant integer d_esize = 16;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = FALSE;

Encoding: 32-bit to single-precision, merging

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

313029282726252423222120191817161514131211109876543210
0110010110010100101
opcopc2int_UPgZnZd

SCVTF <Zd>.S, <Pg>/M, <Zn>.S

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 32;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 32;
constant integer d_esize = 32;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = TRUE;

Encoding: 32-bit to single-precision, zeroing

Variants: FEAT_SVE2p2 || FEAT_SME2p2 (FEAT_SVE2p2 || FEAT_SME2p2)

313029282726252423222120191817161514131211109876543210
0110010010011101100
opco2o3int_UPgZnZd

SCVTF <Zd>.S, <Pg>/Z, <Zn>.S

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE2p2) && !IsFeatureImplemented(FEAT_SME2p2) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 32;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 32;
constant integer d_esize = 32;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = FALSE;

Encoding: 32-bit to double-precision, merging

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

313029282726252423222120191817161514131211109876543210
0110010111010000101
opcopc2int_UPgZnZd

SCVTF <Zd>.D, <Pg>/M, <Zn>.S

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 64;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 32;
constant integer d_esize = 64;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = TRUE;

Encoding: 32-bit to double-precision, zeroing

Variants: FEAT_SVE2p2 || FEAT_SME2p2 (FEAT_SVE2p2 || FEAT_SME2p2)

313029282726252423222120191817161514131211109876543210
0110010011011100100
opco2o3int_UPgZnZd

SCVTF <Zd>.D, <Pg>/Z, <Zn>.S

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE2p2) && !IsFeatureImplemented(FEAT_SME2p2) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 64;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 32;
constant integer d_esize = 64;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = FALSE;

Encoding: 64-bit to half-precision, merging

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

313029282726252423222120191817161514131211109876543210
0110010101010110101
opcopc2int_UPgZnZd

SCVTF <Zd>.H, <Pg>/M, <Zn>.D

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 64;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 64;
constant integer d_esize = 16;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = TRUE;

Encoding: 64-bit to half-precision, zeroing

Variants: FEAT_SVE2p2 || FEAT_SME2p2 (FEAT_SVE2p2 || FEAT_SME2p2)

313029282726252423222120191817161514131211109876543210
0110010001011101110
opco2o3int_UPgZnZd

SCVTF <Zd>.H, <Pg>/Z, <Zn>.D

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE2p2) && !IsFeatureImplemented(FEAT_SME2p2) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 64;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 64;
constant integer d_esize = 16;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = FALSE;

Encoding: 64-bit to single-precision, merging

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

313029282726252423222120191817161514131211109876543210
0110010111010100101
opcopc2int_UPgZnZd

SCVTF <Zd>.S, <Pg>/M, <Zn>.D

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 64;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 64;
constant integer d_esize = 32;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = TRUE;

Encoding: 64-bit to single-precision, zeroing

Variants: FEAT_SVE2p2 || FEAT_SME2p2 (FEAT_SVE2p2 || FEAT_SME2p2)

313029282726252423222120191817161514131211109876543210
0110010011011101100
opco2o3int_UPgZnZd

SCVTF <Zd>.S, <Pg>/Z, <Zn>.D

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE2p2) && !IsFeatureImplemented(FEAT_SME2p2) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 64;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 64;
constant integer d_esize = 32;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = FALSE;

Encoding: 64-bit to double-precision, merging

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

313029282726252423222120191817161514131211109876543210
0110010111010110101
opcopc2int_UPgZnZd

SCVTF <Zd>.D, <Pg>/M, <Zn>.D

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 64;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 64;
constant integer d_esize = 64;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = TRUE;

Encoding: 64-bit to double-precision, zeroing

Variants: FEAT_SVE2p2 || FEAT_SME2p2 (FEAT_SVE2p2 || FEAT_SME2p2)

313029282726252423222120191817161514131211109876543210
0110010011011101110
opco2o3int_UPgZnZd

SCVTF <Zd>.D, <Pg>/Z, <Zn>.D

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE2p2) && !IsFeatureImplemented(FEAT_SME2p2) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 64;
constant integer g = UInt(Pg);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer s_esize = 64;
constant integer d_esize = 64;
constant boolean unsigned = FALSE;
constant FPRounding rounding = FPRoundingMode(FPCR);
constant boolean merging = FALSE;

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) operand = if AnyActiveElement(mask, esize) then Z[n, VL] else Zeros(VL);
bits(VL) result = if merging then Z[d, VL] else Zeros(VL);

for e = 0 to elements-1
    if ActivePredicateElement(mask, e, esize) then
        constant bits(esize) element = Elem[operand, e, esize];
        constant bits(d_esize) fpval = FixedToFP(element, 0, unsigned, FPCR, rounding,
                                                 d_esize);
        Elem[result, e, esize] = ZeroExtend(fpval, esize);

Z[d, VL] = result;

Explanations

<Zd>: Is the name of the destination scalable vector register, encoded in the "Zd" field.
<Pg>: Is the name of the governing scalable predicate register P0-P7, encoded in the "Pg" field.
<Zn>: Is the name of the source scalable vector register, encoded in the "Zn" field.

Operational Notes

The merging variant of 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 the merging variant of this instruction is CONSTRAINED UNPREDICTABLE: