### 16.6.3. Advanced SIMD integer multiply instructions

Table 16.19 shows the operation of the Advanced SIMD integer multiply instructions.

Table 16.19. Advanced SIMD integer multiply instructions

Instruction

Register format

CyclesSource 1Source 2Source 3Source 4Result 1Result 2

`VMUL`

`VQDMLH`

`VQRDMLH`

`Dd,Dn,Dm`

(`.8` normal)

(`.16` normal)

1`Dn:N2``Dm:N2``Dm:N2`-`Dd:N6`-

`Qd,Qn,Qm`

(`.8` normal)

(`.16` normal)

1

2

`QnLo:N2`

`QnHi:N2`

`QmLo:N2`

`QmHi:N2`

-

-

-

-

`QdLo:N6`

`QdHi:N6`

-

-

`Dd,Dn,Dm`

(`.32` normal)

1

2

`Dn:N2`

-

`Dm:N1`

-

-

-

-

-

-

`Dd:N6`

-

-

`Qd,Qn,Qm`

(`.32` normal)

1

2

3

4

`QnLo:N2`

-

`QnHi:N2`

-

`QmLo:N1`

-

`QmHi:N1`

-

-

-

-

-

-

-

-

-

-

`QdLo:N6`

-

`QdHi:N6`

-

-

-

-

`VMUL`

`VQDMUL`

`Qd,Dn,Dm`

(`.16.8` long)

(`.32.16` long)

1`Dn:N2``Dm:N2`--`QdLo:N6``QdHi:N6`

`Qd,Dn,Dm`

(`.64.32` long)

1

2

`Dn:N2`

-

`Dm:N1`

-

-

-

-

-

-

`QdLo:N6`

-

`QdHi:N6`

`VMLA`[a]

`VMLS`[a]

`Dd,Dn,Dm`

(`.8` normal)

(`.16` normal)

1

`Dn:N2`

`Dm:N2`

`Dd:N3`

-

`Dd:N6`

-

`Qd,Qn,Qm`

(`.8` normal)

(`.16` normal)

1

2

`QnLo:N2`

`QnHi:N2`

`QmLo:N2`

`QmHi:N2`

`QdLo:N3`

`QdHi:N3`

-

-

`QdLo:N6`

`QdHi:N6`

-

-

`Dd,Dn,Dm`

(`.32` normal)

1

2

`Dn:N2`

-

`Dm:N1`

-

`Dd:N3`

-

-

-

`Dd:N6`

-

-

`Qd,Qn,Qm`

(`.32` normal)

1

2

3

4

`QnLo:N2`

-

`QnHi:N2`

-

`QmLo:N1`

-

`QmHi:N1`

-

`QdLo:N3`

-

`QdHi:N3`

-

-

-

-

-

-

`QdLo:N6`

-

`QdHi:N6`

-

-

-

-

`VMLA`[a]

`VMLS`[a]

`VQDMLA`[a]

`VQDMLS`[a]

`Qd,Dn,Dm`

(`.16.8` long)

(`.32.16` long)

1

`Dn:N2`

`Dm:N2`

`QdLo:N3`

`QdHi:N3`

`QdLo:N6`

`QdHi:N6`

`Qd,Dn,Dm`

(`.64.32` long)

1

2

`Dn:N2`

-

`Dm:N1`

-

`QdLo:N3`

-

`QdHi:N3`

-

-

`QdLo:N6`

-

`QdHi:N6`

`VMUL`

`VQDMLH`

`VQRDMLH`

`Dd,Dn,Dm[x]`

(`.16` scalar)

1

`Dn:N2`

`Dm:N1`

-

-

`Dd:N6`

-

`Qd,Qn,Dm[x]`

(`.16` scalar)

1

2

`QnLo:N2`

`QnHi:N2`

`Dm:N1`

-

-

`QdLo:N6`

`QdHi:N6`

-

`Dd,Dn,Dm[x]`

(`.32` scalar)

1

2

`Dn:N2`

-

`Dm:N1`

-

-

-

-

-

-

`Dd:N6`

-

-

`Qd,Qn,Dm[x]`

(`.32` scalar)

1

2

3

4

`QnLo:N2`

-

`Qnhi:N2`

-

`Dm:N1`

-

-

-

-

-

-

-

-

-

-

-

-

`QdLo:N6`

-

`QdHi:N6`

-

-

-

-

`VMUL`

`VQDMUL`

`Qd,Dn,Dm[x]`

(`.32``.16` long scalar)

1

`Dn:N2`

`Dm:N1`

-

-

`QdLo:N6`

`QdHi:N6`

`Qd,Dn,Dm[x]`

(`.64.32` long scalar)

1

2

`Dn:N2`

-

`Dm:N1`

-

-

-

-

-

-

`QdLo:N6`

-

`QdHi:N6`

`VMLA`[a]

`VMLS`[a]

`Dd,Dn,Dm[x]`

(`.16` scalar)

1

`Dn:N2`

`Dm:N1`

`Dd:N3`

-

`Dd:N6`

-

`Qd,Qn,Dm[x]`

(`.16` scalar)

1

2

`QnLo:N2`

`QnHi:N2`

`Dm:N1`

-

`QdLo:N3`

`QdHi:N3`

-

-

`QdLo:N6`

`QdHi:N6`

-

-

`Dd,Dn,Dm[x]`

(`.32` scalar)

1

2

`Dn:N2`

-

`Dm:N1`

-

`Dd:N3`

-

-

-

-

`Dd:N6`

-

-

`Qd,Qn,Dm[x]`

(`.32` scalar)

1

2

3

4

`QnLo:N2`

-

`QnHi:N2`

-

`Dm:N1`

-

-

-

`QdLo:N3`

-

`QdHi:N3`

-

-

-

-

-

-

`QdLo:N6`

-

`QdHi:N6`

-

-

-

-

`VMLA`[a]

`VMLS`[a]

`VQDMLA`[a]

`VQDMLS`[a]

`Qd,Dn,Dm[x]`

(`.32.16` long scalar)

1

`Dn:N2`

`Dm:N1`

`QdLo:N3`

`QdHi:N3`

`QdLo:N6`

`QdHi:N6`

`Qd,Dn,Dm[x]`

(`.64.32` long scalar)

1

2

`Dn:N2`

-

`Dm:N1`

-

`QdLo:N3`

-

`QdHi:N3`

-

-

`QdLo:N6`

-

`QdHi:N6`

[a] If a multiply-accumulate follows a multiply or another multiply-accumulate, and depends on the result of that first instruction, then if the dependency between both instructions are of the same type and size, the processor uses a special multiplier accumulator forwarding. This special forwarding means the multiply instructions can issue back-to-back because the result of the first instruction in N5 is forwarded to the accumulator of the second instruction in N4. If the size and type of the instructions do not match, then Dd or Qd is required in N3. This applies to combinations of the multiply-accumulate instructions VMLA, VMLS, VQDMLA, and VQDMLS, and the multiply instructions VMUL and VQDMUL.