SUMOP4A

Signed by unsigned integer quarter-tile sum of outer products, accumulating

This instruction generates four independent quarter-tile signed by unsigned integer sums of outer products from the sub-matrices in the half-vectors of the one or two first and second source vectors and accumulates the results to the corresponding elements of a 32-bit or 64-bit element ZA tile.

In case of the 8-bit integer variant, each of the quarter-tile sums of outer products is generated by multiplying the SVLS÷2 × 4 sub-matrix of 8-bit signed values held in the half-vectors of the first source vectors by the 4 × SVLS÷2 sub-matrix of 8-bit unsigned values held in the half-vectors of the second source vectors. Each 32-bit container of the half-vectors in the first source vectors holds 4 elements of each row of a SVLS÷2 × 4 sub-matrix. Similarly, each 32-bit container of the half-vectors in the second source vector holds 4 elements of each column of a 4 × SVLS÷2 sub-matrix.

In case of the 16-bit integer variant, each of the quarter-tile sums of outer products is generated by multiplying the SVLD÷2 × 4 sub-matrix of 16-bit signed values held in the half-vectors of the first source vectors by the 4 × SVLD÷2 sub-matrix of 16-bit unsigned values held in the half-vectors of the second source vectors. Each 64-bit container of the half-vectors in the first source vectors holds 4 elements of each row of a SVLD÷2 × 4 sub-matrix. Similarly, each 64-bit container of the half-vectors in the second source vector holds 4 elements of each column of a 4 × SVLD÷2 sub-matrix.

The resulting quarter-tile SVLS÷2 × SVLS÷2 widened 32-bit integer sums of outer products in case of the 8-bit integer variant or SVLD÷2 × SVLD÷2 widened 64-bit integer sums of outer products in case of the 16-bit integer variant are then destructively added to the 32-bit or 64-bit integer destination tile respectively.

This is equivalent to performing a 4-way dot product and accumulate to each of the destination tile elements.

This instruction is unpredicated.

It has encodings from 8 classes: 32-bit, single and multiple vectors , 32-bit, single vectors , 32-bit, multiple and single vectors , 32-bit, multiple vectors , 64-bit, single and multiple vectors , 64-bit, single vectors , 64-bit, multiple and single vectors and 64-bit, multiple vectors

32-bit, single and multiple vectors
(FEAT_SME_MOP4)

313029282726252423222120191817161514131211109876543210
100000000011Zm01000000Zn0000ZAda
u0u1MNS

Encoding

SUMOP4A <ZAda>.S, <Zn>.B, { <Zm1>.B-<Zm2>.B }

Decode for this encoding

if !IsFeatureImplemented(FEAT_SME_MOP4) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 32; let n : integer = UInt('0'::Zn::'0'); let m : integer = UInt('1'::Zm::'0'); let nreg : integer{} = 1; let mreg : integer = 2; let da : integer = UInt(ZAda); let sub_op : boolean = FALSE; let op1_unsigned : boolean = FALSE; let op2_unsigned : boolean = TRUE;

32-bit, single vectors
(FEAT_SME_MOP4)

313029282726252423222120191817161514131211109876543210
100000000010Zm01000000Zn0000ZAda
u0u1MNS

Encoding

SUMOP4A <ZAda>.S, <Zn>.B, <Zm>.B

Decode for this encoding

if !IsFeatureImplemented(FEAT_SME_MOP4) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 32; let n : integer = UInt('0'::Zn::'0'); let m : integer = UInt('1'::Zm::'0'); let nreg : integer{} = 1; let mreg : integer = 1; let da : integer = UInt(ZAda); let sub_op : boolean = FALSE; let op1_unsigned : boolean = FALSE; let op2_unsigned : boolean = TRUE;

32-bit, multiple and single vectors
(FEAT_SME_MOP4)

313029282726252423222120191817161514131211109876543210
100000000010Zm01000001Zn0000ZAda
u0u1MNS

Encoding

SUMOP4A <ZAda>.S, { <Zn1>.B-<Zn2>.B }, <Zm>.B

Decode for this encoding

if !IsFeatureImplemented(FEAT_SME_MOP4) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 32; let n : integer = UInt('0'::Zn::'0'); let m : integer = UInt('1'::Zm::'0'); let nreg : integer{} = 2; let mreg : integer = 1; let da : integer = UInt(ZAda); let sub_op : boolean = FALSE; let op1_unsigned : boolean = FALSE; let op2_unsigned : boolean = TRUE;

32-bit, multiple vectors
(FEAT_SME_MOP4)

313029282726252423222120191817161514131211109876543210
100000000011Zm01000001Zn0000ZAda
u0u1MNS

Encoding

SUMOP4A <ZAda>.S, { <Zn1>.B-<Zn2>.B }, { <Zm1>.B-<Zm2>.B }

Decode for this encoding

if !IsFeatureImplemented(FEAT_SME_MOP4) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 32; let n : integer = UInt('0'::Zn::'0'); let m : integer = UInt('1'::Zm::'0'); let nreg : integer{} = 2; let mreg : integer = 2; let da : integer = UInt(ZAda); let sub_op : boolean = FALSE; let op1_unsigned : boolean = FALSE; let op2_unsigned : boolean = TRUE;

64-bit, single and multiple vectors
(FEAT_SME_MOP4 && FEAT_SME_I16I64)

313029282726252423222120191817161514131211109876543210
101000001111Zm00000000Zn001ZAda
u0u1MNS

Encoding

SUMOP4A <ZAda>.D, <Zn>.H, { <Zm1>.H-<Zm2>.H }

Decode for this encoding

if !IsFeatureImplemented(FEAT_SME_MOP4) || !IsFeatureImplemented(FEAT_SME_I16I64) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 64; let n : integer = UInt('0'::Zn::'0'); let m : integer = UInt('1'::Zm::'0'); let nreg : integer{} = 1; let mreg : integer = 2; let da : integer = UInt(ZAda); let sub_op : boolean = FALSE; let op1_unsigned : boolean = FALSE; let op2_unsigned : boolean = TRUE;

64-bit, single vectors
(FEAT_SME_MOP4 && FEAT_SME_I16I64)

313029282726252423222120191817161514131211109876543210
101000001110Zm00000000Zn001ZAda
u0u1MNS

Encoding

SUMOP4A <ZAda>.D, <Zn>.H, <Zm>.H

Decode for this encoding

if !IsFeatureImplemented(FEAT_SME_MOP4) || !IsFeatureImplemented(FEAT_SME_I16I64) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 64; let n : integer = UInt('0'::Zn::'0'); let m : integer = UInt('1'::Zm::'0'); let nreg : integer{} = 1; let mreg : integer = 1; let da : integer = UInt(ZAda); let sub_op : boolean = FALSE; let op1_unsigned : boolean = FALSE; let op2_unsigned : boolean = TRUE;

64-bit, multiple and single vectors
(FEAT_SME_MOP4 && FEAT_SME_I16I64)

313029282726252423222120191817161514131211109876543210
101000001110Zm00000001Zn001ZAda
u0u1MNS

Encoding

SUMOP4A <ZAda>.D, { <Zn1>.H-<Zn2>.H }, <Zm>.H

Decode for this encoding

if !IsFeatureImplemented(FEAT_SME_MOP4) || !IsFeatureImplemented(FEAT_SME_I16I64) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 64; let n : integer = UInt('0'::Zn::'0'); let m : integer = UInt('1'::Zm::'0'); let nreg : integer{} = 2; let mreg : integer = 1; let da : integer = UInt(ZAda); let sub_op : boolean = FALSE; let op1_unsigned : boolean = FALSE; let op2_unsigned : boolean = TRUE;

64-bit, multiple vectors
(FEAT_SME_MOP4 && FEAT_SME_I16I64)

313029282726252423222120191817161514131211109876543210
101000001111Zm00000001Zn001ZAda
u0u1MNS

Encoding

SUMOP4A <ZAda>.D, { <Zn1>.H-<Zn2>.H }, { <Zm1>.H-<Zm2>.H }

Decode for this encoding

if !IsFeatureImplemented(FEAT_SME_MOP4) || !IsFeatureImplemented(FEAT_SME_I16I64) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 64; let n : integer = UInt('0'::Zn::'0'); let m : integer = UInt('1'::Zm::'0'); let nreg : integer{} = 2; let mreg : integer = 2; let da : integer = UInt(ZAda); let sub_op : boolean = FALSE; let op1_unsigned : boolean = FALSE; let op2_unsigned : boolean = TRUE;

Assembler Symbols

<ZAda>

For the "32-bit, multiple and single vectors", "32-bit, multiple vectors", "32-bit, single and multiple vectors", and "32-bit, single vectors" variants: is the name of the ZA tile ZA0-ZA3, encoded in the "ZAda" field.

For the "64-bit, multiple and single vectors", "64-bit, multiple vectors", "64-bit, single and multiple vectors", and "64-bit, single vectors" variants: is the name of the ZA tile ZA0-ZA7, encoded in the "ZAda" field.

<Zn>

Is the name of the first source scalable vector register, registers in the range Z0-Z15, encoded as "Zn" times 2.

<Zm1>

Is the name of the first scalable vector register of the second source multi-vector group, in the range Z16-Z31, encoded as "Zm" times 2 plus 16.

<Zm2>

Is the name of the second scalable vector register of the second source multi-vector group, in the range Z16-Z31, encoded as "Zm" times 2 plus 17.

<Zm>

Is the name of the second source scalable vector register, registers in the range Z16-Z31, encoded as "Zm" times 2 plus 16.

<Zn1>

Is the name of the first scalable vector register of the first source multi-vector group, in the range Z0-Z15, encoded as "Zn" times 2.

<Zn2>

Is the name of the second scalable vector register of the first source multi-vector group, in the range Z0-Z15, encoded as "Zn" times 2 plus 1.

Operational information

This instruction is a data-independent-time instruction as described in About PSTATE.DIT.


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.