sudot

SUDOT <Zda>.S, <Zn>.B, <Zm>.B[<imm>]

Signed-Unsigned Integer Dot Product.

Pseudocode Operation

No pseudocode available.

Encoding

Binary Layout
01000100
31:24
1
23
0
22
1
21
i2
20:19
Zm
18:16
00011
15:11
1
10
Zn
9:5
Zda
4:0
 
Format I8MM
Opcode 0x44A01C00
Extension I8MM

Related

Other forms of sudot

  • sudot Signed-Unsigned Dot Product (NEON)

More in I8MM

Reference

Instruction Forms

Encoding Instruction ISA Bit pattern
0x0F00F000 SUDOT <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.4B[<index>] A64 0 | Q | 0 | 01111 | 0 | 0 | L | M | Rm | 1111 | H | 0 | Rn | Rd
0x44A01C00 SUDOT <Zda>.S, <Zn>.B, <Zm>.B[<imm>] A64 01000100 | 1 | 0 | 1 | i2 | Zm | 00011 | 1 | Zn | Zda
0xC1501038 SUDOT ZA.S[<Wv>, <offs>{, VGx2}], { <Zn1>.B-<Zn2>.B }, <Zm>.B[<index>] A64 110000010101 | Zm | 0 | Rv | 1 | i2 | Zn | 1 | 1 | 1 | off3
0xC1509038 SUDOT ZA.S[<Wv>, <offs>{, VGx4}], { <Zn1>.B-<Zn4>.B }, <Zm>.B[<index>] A64 110000010101 | Zm | 1 | Rv | 1 | i2 | Zn | 0 | 1 | 1 | 1 | off3
0xC1201418 SUDOT ZA.S[<Wv>, <offs>{, VGx2}], { <Zn1>.B-<Zn2>.B }, <Zm>.B A64 11 | 0000010010 | Zm | 0 | Rv | 101 | Zn | 1 | 1 | off3
0xC1301418 SUDOT ZA.S[<Wv>, <offs>{, VGx4}], { <Zn1>.B-<Zn4>.B }, <Zm>.B A64 11 | 0000010011 | Zm | 0 | Rv | 101 | Zn | 1 | 1 | off3

Description

The signed by unsigned integer indexed dot product instruction computes the dot product of a group of four signed 8-bit integer values held in each 32-bit element of the first source vector multiplied by a group of four unsigned 8-bit integer values in an indexed 32-bit element of the second source vector, and then destructively adds the widened dot product to the corresponding 32-bit element of the destination vector. The groups within the second source vector are specified using an immediate index which selects the same group position within each 128-bit vector segment. The index range is from 0 to 3. This instruction is unpredicated. ID_AA64ZFR0_EL1.I8MM indicates whether this instruction is implemented.

Operation

CheckSVEEnabled();
constant integer VL = CurrentVL;
constant integer PL = VL DIV 8;
constant integer elements = VL DIV esize;
constant integer eltspersegment = 128 DIV esize;
bits(VL) operand1 = Z[n, VL];
bits(VL) operand2 = Z[m, VL];
bits(VL) operand3 = Z[da, VL];
bits(VL) result;

for e = 0 to elements-1
    integer segmentbase = e - (e MOD eltspersegment);
    integer s = segmentbase + index;
    bits(esize) res = Elem[operand3, e, esize];
    for i = 0 to 3
        integer element1 = SInt(Elem[operand1, 4 * e + i, esize DIV 4]);
        integer element2 = UInt(Elem[operand2, 4 * s + i, esize DIV 4]);
        res = res + element1 * element2;
    Elem[result, e, esize] = res;

Z[da, VL] = result;