ISA_v83A_AArch32_xml_00bet5 (old)htmldiff from-ISA_v83A_AArch32_xml_00bet5(new) ISA_v83A_AArch32_xml_00bet6

VCMLA

Vector Complex Multiply Accumulate.

None, one, or both of the two vector elements that are read from each of the numbers in the second source SIMD&FP register can be negated based on the rotation value:

This instruction operatesmultiplies oncorresponding complex numbers thatfrom arethe representedtwo insource SIMD&FPvector registers asand pairsadds ofthe elements,results withto the morecorresponding significantcomplex elementnumbers holdingin the imaginarydestination partvector register. The number of complex numbers that can be stored in the numbersource and the lessdestination significantvector elementregisters holdingis calculated as the realvector partregister ofsize divided by the length of each complex number. Each elementcomplex holdsnumber is represented in a floating-pointSIMD&FP value.register Itas performsa thepair followingof computationelements onwith the correspondingimaginary complexpart of the number being placed in the more significant element, pairsand fromthe real part of the twonumber sourcebeing registersplaced in the less significant element. Both real and imaginary parts of the destinationsource register:and the resulting complex number are represented as floating-point values.

The multiplication and addition operations are performed as a fused multiply-add, without any intermediate rounding.

Depending on settings in the CPACR, NSACR, and HCPTR registers, and the security state and mode in which the instruction is executed, an attempt to execute the instruction might be undefined, or trapped to Hyp mode. For more information see Enabling Advanced SIMD and floating-point support.

Depending on settings in the CPACR, NSACR, and HCPTR registers, and the Security state and PE mode in which the instruction is executed, an attempt to execute the instruction might be undefined, or trapped to Hyp mode. For more information see Enabling Advanced SIMD and floating-point support.

It has encodings from the following instruction sets: A32 ( A1 ) and T32 ( T1 ) .

A1
(ARMv8.3)

313029282726252423222120191817161514131211109876543210
1111110rotD1SVnVd1000NQM0Vm

64-bit SIMD vector (Q == 0)

VCMLA{<q>}.<dt> <Dd>, <Dn>, <Dm>, #<rotate>

128-bit SIMD vector (Q == 1)

VCMLA{<q>}.<dt> <Qd>, <Qn>, <Qm>, #<rotate>

if !HaveFCADDExtHaveFJCVTZSExt() then UNDEFINED; if Q == '1' && (Vd<0> == '1' || Vn<0> == '1' || Vm<0> == '1') then UNDEFINED; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); esize = 16 << UInt(S); if !HaveFP16Ext() && esize == 16 then UNDEFINED; elements = 64 DIV esize; regs = if Q=='0' then 1 else 2; if InITBlock() && esize == 16 then UNDEFINED; elements = 64 DIV esize; regs = if Q == '0' then 1 else 2;() then UNPREDICTABLE;

T1
(ARMv8.3)

15141312111098765432101514131211109876543210
1111110rotD1SVnVd1000NQM0Vm

64-bit SIMD vector (Q == 0)

VCMLA{<q>}.<dt> <Dd>, <Dn>, <Dm>, #<rotate>

128-bit SIMD vector (Q == 1)

VCMLA{<q>}.<dt> <Qd>, <Qn>, <Qm>, #<rotate>

ifif ! InITBlockHaveFJCVTZSExt() then UNPREDICTABLE; if !() then UNDEFINED; if Q == '1' && (Vd<0> == '1' || Vn<0> == '1' || Vm<0> == '1') then UNDEFINED; d =HaveFCADDExt() then UNDEFINED; if Q == '1' && (Vd<0> == '1' || Vn<0> == '1' || Vm<0> == '1') then UNDEFINED; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); esize = 16 << UInt(S); if !HaveFP16Ext() && esize == 16 then UNDEFINED; elements = 64 DIV esize; regs = if Q=='0' then 1 else 2; if InITBlock() && esize == 16 then UNDEFINED; elements = 64 DIV esize; regs = if Q == '0' then 1 else 2;() then UNPREDICTABLE;

Assembler Symbols

<q>

See Standard assembler syntax fields.

<dt> Is the data type for the elements of the vectors, encoded in S:
S<dt>
0F16
1F32
<Qd>

Is the 128-bit name of the SIMD&FP destination register, encoded in the "D:Vd" field as <Qd>*2.

<Qn>

Is the 128-bit name of the first SIMD&FP source register, encoded in the "N:Vn" field as <Qn>*2.

<Qm>

Is the 128-bit name of the second SIMD&FP source register, encoded in the "M:Vm" field as <Qm>*2.

<Dd>

Is the 64-bit name of the SIMD&FP destination register, encoded in the "D:Vd" field.

<Dn>

Is the 64-bit name of the first SIMD&FP source register, encoded in the "N:Vn" field.

<Dm>

Is the 64-bit name of the second SIMD&FP source register, encoded in the "M:Vm" field.

<rotate> Is the rotation to be applied to elements in the second SIMD&FP source register, encoded in rot:
rot<rotate>
000
0190
10180
11270

Operation

EncodingSpecificOperations(); CheckAdvSIMDEnabled(); for r = 0 to regs-1 operand1 = D[n+r]; [m+r]; operand2 = D[m+r]; [n+r]; operand3 = D[d+r]; for e = 0 to (elements DIV 2)-1 case rot of when '00' element1 = Elem[operand2,e*2,esize]; [operand1,e*2,esize]; element2 = Elem[operand1,e*2,esize]; [operand2,e*2,esize]; element3 = Elem[operand2,e*2+1,esize]; [operand1,e*2+1,esize]; element4 = Elem[operand1,e*2,esize]; [operand2,e*2,esize]; when '01' element1 = FPNeg(Elem[operand2,e*2+1,esize]); [operand1,e*2+1,esize]); element2 = Elem[operand1,e*2+1,esize]; [operand2,e*2+1,esize]; element3 = Elem[operand2,e*2,esize]; [operand1,e*2,esize]; element4 = Elem[operand1,e*2+1,esize]; [operand2,e*2+1,esize]; when '10' element1 = FPNeg(Elem[operand2,e*2,esize]); [operand1,e*2,esize]); element2 = Elem[operand1,e*2,esize]; [operand2,e*2,esize]; element3 = FPNeg(Elem[operand2,e*2+1,esize]); [operand1,e*2+1,esize]); element4 = Elem[operand1,e*2,esize]; [operand2,e*2,esize]; when '11' element1 = Elem[operand2,e*2+1,esize]; [operand1,e*2+1,esize]; element2 = Elem[operand1,e*2+1,esize]; [operand2,e*2+1,esize]; element3 = FPNeg(Elem[operand2,e*2,esize]); [operand1,e*2,esize]); element4 = Elem[operand1,e*2+1,esize]; [operand2,e*2+1,esize]; result1 = FPMulAdd(Elem[operand3,e*2,esize],element2,element1, StandardFPSCRValue()); result2 = FPMulAdd(Elem[operand3,e*2+1,esize],element4,element3, StandardFPSCRValue()); Elem[D[d+r],e*2,esize] = result1; Elem[D[d+r],e*2+1,esize] = result2;


Internal version only: isa v00_79v00_76, pseudocode v34.2v33.1 ; Build timestamp: 2017-12-19T152017-09-26T15:4210

Copyright © 2010-2017 ARM Limited or its affiliates. All rights reserved. This document is Non-Confidential.

ISA_v83A_AArch32_xml_00bet5 (old)htmldiff from-ISA_v83A_AArch32_xml_00bet5(new) ISA_v83A_AArch32_xml_00bet6