public abstract class AArch64ASIMDAssembler extends Object
In order to minimize confusion between ASIMD and similarly named General-Purpose/FP instructions, each ASIMD instruction has capitalized a suffix which describes, in the order described in Section C7.2, the type of each of the instruction's operands using in the following form:
| Modifier and Type | Class and Description |
|---|---|
static class |
AArch64ASIMDAssembler.ASIMDImmediateTable
Calculates and maintains a mapping of all possible ASIMD immediate values.
|
static class |
AArch64ASIMDAssembler.ASIMDInstruction |
static class |
AArch64ASIMDAssembler.ASIMDSize
Enumeration of all different SIMD operation sizes.
|
static class |
AArch64ASIMDAssembler.ElementSize
Enumeration of all different lane types of SIMD register.
|
static class |
AArch64ASIMDAssembler.ImmediateOp
Enumeration for all vector instructions which can have an immediate operand.
|
| Modifier | Constructor and Description |
|---|---|
protected |
AArch64ASIMDAssembler(AArch64Assembler asm) |
| Modifier and Type | Method and Description |
|---|---|
void |
absVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.1 Integer absolute value.
for i in 0..n-1 do dst[i] = int_abs(src[i]) |
void |
addpVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.5 Add pairwise vector.
|
void |
addSSS(AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.2 Integer add scalar.
dst[0] = int_add(src1[0], src2[0]) |
void |
addvSV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize elementSize,
Register dst,
Register src)
C7.2.6 Add across vector.
dst = src[0] + ....+ src[n]. |
void |
addVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.2 Integer add vector.
for i in 0..n-1 do dst[i] = int_add(src1[i], src2[i]) |
void |
aesd(Register dst,
Register src)
C7.2.7 AES single round decryption.
|
void |
aese(Register dst,
Register src)
C7.2.8 AES single round encryption.
|
void |
aesimc(Register dst,
Register src)
C7.2.9 AES inverse mix columns.
|
void |
aesmc(Register dst,
Register src)
C7.2.10 AES mix columns.
|
void |
andVVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register src1,
Register src2)
C7.2.11 Bitwise and vector.
for i in 0..n-1 do dst[i] = src1[i] & src2[i] |
void |
bicVI(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
long imm)
C7.2.20 Bitwise bit clear.
This instruction performs a bitwise and between the SIMD register and the complement of the provided immediate value. |
void |
bicVVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register src1,
Register src2)
C7.2.21 Bitwise bit clear (vector, register).
This instruction performs a bitwise and between the first source and the complement of the second source. |
void |
bifVVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register src1,
Register src2)
C7.2.22 Bitwise insert if false.
This instruction inserts each bit from the first source register into the destination register if the corresponding bit of the second source register is 0, otherwise leave the bit in the destination register unchanged. |
void |
bitVVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register src1,
Register src2)
C7.2.23 Bitwise insert if true.
This instruction inserts each bit from the first source register into the destination register if the corresponding bit of the second source register is 1, otherwise leave the bit in the destination register unchanged. |
void |
bslVVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register src1,
Register src2)
C7.2.24 Bitwise select.
This instruction sets each bit in the destination register to the corresponding bit from the first source register when the original destination bit was 1, otherwise from the second source register. |
void |
cmeqVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.27 Compare bitwise equal.
|
void |
cmeqZeroVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.28 Compare bitwise equal to zero.
|
void |
cmgeVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.29 Compare signed greater than or equal.
|
void |
cmgeZeroVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.30 Compare signed greater than or equal to zero.
|
void |
cmgtVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.31 Compare signed greater than.
|
void |
cmgtZeroVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.32 Compare signed greater than zero.
|
void |
cmhiVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.33 Compare unsigned higher.
|
void |
cmhsVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.34 Compare unsigned higher or same.
|
void |
cmleZeroVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.35 Compare signed less than or equal to zero.
|
void |
cmltZeroVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.36 Compare signed less than zero.
|
void |
cmtstVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.37 Compare bitwise test bits nonzero.
|
void |
cntVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register src)
C7.2.38 Population Count per byte.
dst[0...n] = countBitCountOfEachByte(src[0...n]), n = size/8. |
void |
dupSX(AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src,
int index)
C7.2.39 Duplicate vector element to scalar.
Note that, regardless of the source vector element's index, the value is always copied into the beginning of the destination register (offset 0). |
void |
dupVG(AArch64ASIMDAssembler.ASIMDSize dstSize,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.40 Duplicate general-purpose register to vector.
dst(simd) = src(gp){n} |
void |
dupVX(AArch64ASIMDAssembler.ASIMDSize dstSize,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src,
int index)
C7.2.39 Duplicate vector element to vector.
dst[0..n-1] = src[index]{n} |
protected void |
emitInt(int x) |
void |
eorVVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register src1,
Register src2)
C7.2.41 Bitwise exclusive or vector.
for i in 0..n-1 do dst[i] = src1[i] ^ src2[i] |
void |
extVVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register src1,
Register src2,
int src1LowIdx)
C7.2.43 Extract from pair of vectors.
|
void |
fabsVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.45 Floating-point absolute value.
for i in 0..n-1 do dst[i] = fp_abs(src[i]) |
void |
facgeVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.47 Floating-point absolute compare greater than or equal.
|
void |
facgtSSS(AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.48 Floating-point absolute compare greater than.
|
void |
facgtVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.48 Floating-point absolute compare greater than.
|
void |
faddVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.49 floating point add vector.
for i in 0..n-1 do dst[i] = fp_add(src1[i], src2[i]) |
void |
fcmeqVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.56 Floating-point compare equal.
|
void |
fcmeqZeroVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.57 Floating-point compare equal to zero.
|
void |
fcmgeVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.58 Floating-point compare greater than or equal.
|
void |
fcmgeZeroVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.59 Floating-point compare greater than or equal to zero.
|
void |
fcmgtVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.60 Floating-point compare greater than.
|
void |
fcmgtZeroVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.61 Floating-point compare greater than zero.
|
void |
fcmleZeroVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.64 Floating-point compare less than or equal to zero.
|
void |
fcmltZeroVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.65 Floating-point compare less than zero.
|
void |
fcvtlVV(AArch64ASIMDAssembler.ElementSize srcESize,
Register dst,
Register src)
C7.2.74 Floating-point convert to higher precision long.
|
void |
fcvtnVV(AArch64ASIMDAssembler.ElementSize srcESize,
Register dst,
Register src)
C7.2.79 Floating-point convert to lower precision narrow.
|
void |
fcvtzsVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.90 Floating-point convert to to signed integer, rounding toward zero.
|
void |
fdivVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.97 floating point divide vector.
for i in 0..n-1 do dst[i] = fp_div(src1[i], src2[i]) |
void |
fmaxVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.101 floating-point maximum.
for i in 0..n-1 do dst[i] = fp_max(src1[i], src2[i]) |
void |
fminVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.111 floating-point minimum.
for i in 0..n-1 do dst[i] = fp_min(src1[i], src2[i]) |
void |
fmlaVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.122 Floating-point fused multiply-add to accumulator.
for i in 0..n-1 do dst[i] += fp_multiply(src1[i], src2[i]) |
void |
fmlsVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.126 Floating-point fused multiply-subtract from accumulator.
for i in 0..n-1 do dst[i] -= fp_multiply(src1[i], src2[i]) |
void |
fmovVI(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
long imm64)
C7.2.132 Floating-point move immediate.
dst = imm64{1,2} |
void |
fmulVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.135 floating point multiply vector.
for i in 0..n-1 do dst[i] = fp_mul(src1[i], src2[i]) |
void |
fnegVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.139 Floating-point negate.
for i in 0..n-1 do dst[i] = -src[i] |
void |
fsqrtVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.171 Floating-point square root.
for i in 0..n-1 do dst[i] = fp_sqrt(src[i]) |
void |
fsubVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.173 floating point subtract vector.
for i in 0..n-1 do dst[i] = fp_sub(src1[i], src2[i]) |
void |
insXG(AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
int index,
Register src)
C7.2.176 Insert vector element from general-purpose register.
dst[index] = src
Note the rest of the dst register is unaltered. |
void |
ld1MultipleV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
AArch64Address addr)
C7.2.177 Load multiple single-element structures to one register.
This instruction loads multiple single-element structures from memory and writes the result to one register. |
void |
ld1MultipleVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst1,
Register dst2,
AArch64Address addr)
C7.2.177 Load multiple single-element structures to two registers.
This instruction loads multiple single-element structures from memory and writes the result to two registers. |
void |
ld1MultipleVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst1,
Register dst2,
Register dst3,
AArch64Address addr)
C7.2.177 Load multiple single-element structures to three registers.
This instruction loads multiple single-element structures from memory and writes the result to three registers. |
void |
ld1MultipleVVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst1,
Register dst2,
Register dst3,
Register dst4,
AArch64Address addr)
C7.2.177 Load multiple single-element structures to four registers.
This instruction loads multiple single-element structures from memory and writes the result to four registers. |
void |
ld1rV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
AArch64Address addr)
C7.2.179 Load one single-element structure and replicate to all lanes (of one register).
This instruction loads a single-element structure from memory and replicates the structure to all lanes of the register. |
void |
mlaVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.196 Multiply-add to accumulator.
for i in 0..n-1 do dst[i] += int_multiply(src1[i], src2[i]) |
void |
mlsVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.198 Multiply-subtract from accumulator.
for i in 0..n-1 do dst[i] -= int_multiply(src1[i], src2[i]) |
void |
moviVI(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
long imm)
C7.2.204 Move immediate.
dst = imm{1,2} |
void |
mulVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.206 Integer multiply vector.
for i in 0..n-1 do dst[i] = int_mul(src1[i], src2[i]) |
void |
mvniVI(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
long imm)
C7.2.208 Move inverted immediate.
dst = ~(imm{1,2}) |
void |
negVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.209 Negate.
for i in 0..n-1 do dst[i] = -src[i] |
void |
notVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register src)
C7.2.210 Bitwise not vector.
for i in 0..n-1 do dst[i] = ~src[i] |
void |
ornVVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register src1,
Register src2)
C7.2.211 Bitwise inclusive or not vector.
for i in 0..n-1 do dst[i] = src1[i] | ~src2[i] |
void |
orrVI(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
long imm)
C7.2.212 Bitwise inclusive or.
dst = dst | imm{1,2} |
void |
orrVVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register src1,
Register src2)
C7.2.213 Bitwise inclusive or vector.
for i in 0..n-1 do dst[i] = src1[i] | src2[i] |
void |
rev16VV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register src)
C7.2.219 Reverse elements in 16-bit halfwords.
This instruction reverses the order of 8-bit elements in each halfword. |
void |
rev32VV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize revGranularity,
Register dst,
Register src)
C7.2.220 Reverse elements in 32-bit words.
This instruction reverses the order of elements of size revGranularity in each 32-bit word. |
void |
rev64VV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize revGranularity,
Register dst,
Register src)
C7.2.221 Reverse elements in 64-bit words.
This instruction reverses the order of elements of size revGranularity in each 64-bit word. |
void |
saddlvSV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize elementSize,
Register dst,
Register src)
C7.2.231 Signed add across long vector.
dst = src[0] + ....+ src[n]. |
void |
scvtfVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src)
C7.2.234 Signed integer convert to floating-point.
|
void |
shlVVI(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src,
int shiftAmt)
C7.2.254 shift left (immediate).
for i in 0..n-1 do dst[i] = src[i] << imm |
void |
smaxVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.268 Signed maximum.
for i in 0..n-1 do dst[i] = int_max(src1[i], src2[i]) |
void |
sminVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.271 Signed minimum.
for i in 0..n-1 do dst[i] = int_min(src1[i], src2[i]) |
void |
smlalVVV(AArch64ASIMDAssembler.ElementSize srcESize,
Register dst,
Register src1,
Register src2)
C7.2.275 Signed Multiply-Add Long.
for i in 0..n-1 do dst[i] += int_multiply(src1[i], src2[i]) |
void |
smlslVVV(AArch64ASIMDAssembler.ElementSize srcESize,
Register dst,
Register src1,
Register src2)
C7.2.277 Signed Multiply-Subtract Long.
for i in 0..n-1 do dst[i] -= int_multiply(src1[i], src2[i]) |
void |
smovGX(AArch64ASIMDAssembler.ElementSize dstESize,
AArch64ASIMDAssembler.ElementSize srcESize,
Register dst,
Register src,
int index)
C7.2.279 Signed move vector element to general-purpose register.
dst (gp) = sign-extend(src[index]) (simd). |
void |
sshllVVI(AArch64ASIMDAssembler.ElementSize srcESize,
Register dst,
Register src,
int shiftAmt)
C7.2.316 Signed shift left long (immediate).
|
void |
sshlVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.315 signed shift left (register).
for i in 0..n-1 do |
void |
sshrVVI(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src,
int shiftAmt)
C7.2.317 signed shift right (immediate).
for i in 0..n-1 do dst[i] = src[i] >> imm |
void |
st1MultipleV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register src,
AArch64Address addr)
C7.2.321 Store multiple single-element structures from one register.
This instruction stores elements to memory from one register. |
void |
st1MultipleVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register src1,
Register src2,
AArch64Address addr)
C7.2.321 Store multiple single-element structures from two registers.
This instruction stores elements to memory from two registers. |
void |
st1MultipleVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register src1,
Register src2,
Register src3,
AArch64Address addr)
C7.2.321 Store multiple single-element structures from three registers.
This instruction stores elements to memory from three registers. |
void |
st1MultipleVVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register src1,
Register src2,
Register src3,
Register src4,
AArch64Address addr)
C7.2.321 Store multiple single-element structures from four registers.
This instruction stores elements to memory from four registers. |
void |
subSSS(AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.334 Integer subtract scalar.
dst[0] = int_sub(src1[0], src2[0]) |
void |
subVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.334 Integer subtract vector.
for i in 0..n-1 do dst[i] = int_sub(src1[i], src2[i]) |
void |
tblVVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register table,
Register index)
C7.2.339 Table vector lookup (single register table variant).
This instruction is used to perform permutations at a byte granularity. |
void |
tblVVVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register table1,
Register table2,
Register index)
C7.2.339 Table vector lookup (two register table variant).
This instruction is used to perform permutations at a byte granularity. |
void |
tbxVVV(AArch64ASIMDAssembler.ASIMDSize size,
Register dst,
Register table,
Register index)
C7.2.440 Table vector lookup extension (single register table variant).
This instruction is used to perform permutations at a byte granularity. |
void |
trn1VVV(AArch64ASIMDAssembler.ASIMDSize dstSize,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.341 Transpose vectors (primary).
|
void |
trn2VVV(AArch64ASIMDAssembler.ASIMDSize dstSize,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.342 Transpose vectors (secondary).
|
void |
uaddlvSV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize elementSize,
Register dst,
Register src)
C7.2.350 Unsigned add across long vector.
dst = src[0] + ....+ src[n]. |
void |
umaxvSV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize elementSize,
Register dst,
Register src)
C7.2.362 Unsigned maximum across vector.
dst = uint_max(src[0], ..., src[n]). |
void |
uminvSV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize elementSize,
Register dst,
Register src)
C7.2.365 Unsigned minimum across vector.
dst = uint_min(src[0], ..., src[n]). |
void |
umlalVVV(AArch64ASIMDAssembler.ElementSize srcESize,
Register dst,
Register src1,
Register src2)
C7.2.367 Unsigned Multiply-Add Long.
for i in 0..n-1 do dst[i] += uint_multiply(src1[i], src2[i]) |
void |
umlslVVV(AArch64ASIMDAssembler.ElementSize srcESize,
Register dst,
Register src1,
Register src2)
C7.2.369 Unsigned Multiply-Subtract Long.
for i in 0..n-1 do dst[i] -= uint_multiply(src1[i], src2[i]) |
void |
umovGX(AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src,
int index)
C7.2.371 Unsigned move vector element to general-purpose register.
dst (gp) = src[index] (simd). |
void |
ushll2VVI(AArch64ASIMDAssembler.ElementSize srcESize,
Register dst,
Register src,
int shiftAmt)
C7.2.391 Unsigned shift left long (immediate).
|
void |
ushllVVI(AArch64ASIMDAssembler.ElementSize srcESize,
Register dst,
Register src,
int shiftAmt)
C7.2.391 Unsigned shift left long (immediate).
|
void |
ushlVVV(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.390 unsigned shift left (register).
for i in 0..n-1 do |
void |
ushrSSI(AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src,
int shiftAmt)
C7.2.392 unsigned shift right (immediate) scalar.
for i in 0..n-1 do dst[i] = src[i] >>> imm |
void |
ushrVVI(AArch64ASIMDAssembler.ASIMDSize size,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src,
int shiftAmt)
C7.2.392 unsigned shift right (immediate) vector.
dst = src >>> imm |
void |
uzp1VVV(AArch64ASIMDAssembler.ASIMDSize dstSize,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.399 Unzip vectors (primary).
|
void |
uzp2VVV(AArch64ASIMDAssembler.ASIMDSize dstSize,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.400 Unzip vectors (secondary).
|
void |
xtn2VV(AArch64ASIMDAssembler.ElementSize dstESize,
Register dst,
Register src)
C7.2.402 Extract narrow.
|
void |
xtnVV(AArch64ASIMDAssembler.ElementSize dstESize,
Register dst,
Register src)
C7.2.402 Extract narrow.
|
void |
zip1VVV(AArch64ASIMDAssembler.ASIMDSize dstSize,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.403 Zip vectors (primary).
|
void |
zip2VVV(AArch64ASIMDAssembler.ASIMDSize dstSize,
AArch64ASIMDAssembler.ElementSize eSize,
Register dst,
Register src1,
Register src2)
C7.2.404 Zip vectors (secondary).
|
protected AArch64ASIMDAssembler(AArch64Assembler asm)
protected void emitInt(int x)
public void absVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
for i in 0..n-1 do dst[i] = int_abs(src[i])size - register size.eSize - element size.dst - SIMD register.src - SIMD register.public void addSSS(AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
dst[0] = int_add(src1[0], src2[0])
Note that only 64-bit (DoubleWord) operations are available.
eSize - element size. Must be of type ElementSize.DoubleWorddst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void addVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = int_add(src1[i], src2[i])size - register size.eSize - element size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void addpVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
From the manual: "This instruction creates a vector by concatenating the vector elements of the first source SIMD&FP register after the vector elements of the second source SIMD&FP register, reads each pair of adjacent vector elements from the concatenated vector, adds each pair of values together, places the result into a vector, and writes the vector to the destination SIMD&FP register."
size - register size.eSize - element size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void addvSV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize elementSize, Register dst, Register src)
dst = src[0] + ....+ src[n].size - register size.elementSize - width of each addition operand.dst - SIMD register.src - SIMD register.public void aesd(Register dst,
Register src)
dst - SIMD register.src - SIMD register.public void aese(Register dst,
Register src)
dst - SIMD register.src - SIMD register.public void aesimc(Register dst,
Register src)
dst - SIMD register.src - SIMD register.public void aesmc(Register dst,
Register src)
dst - SIMD register.src - SIMD register.public void andVVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = src1[i] & src2[i]size - register size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void bicVI(AArch64ASIMDAssembler.ASIMDSize size, Register dst, long imm)
dst = dst & ~(imm{1,2})size - register size.dst - SIMD register.imm - long value to move. If size is 128, then this value is copied twicepublic void bicVVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = src1[i] & ~src2[i]size - register size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void bifVVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = src2[i] == 0 ? src1[i] : dst[i] size - register size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void bitVVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = src2[i] == 1 ? src1[i] : dst[i] size - register size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void bslVVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = dst[i] == 1 ? src1[i] : src2[i]size - register size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void cmeqVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = src1[i] == src2[i] ? -1 : 0
size - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void cmeqZeroVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = src[i] == 0 ? -1 : 0
size - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src - SIMD register.public void cmgeVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = src1[i] >= src2[i] ? -1 : 0
size - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void cmgeZeroVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] >= src[i] == 0 ? -1 : 0
size - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src - SIMD register.public void cmgtVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = src1[i] > src2[i] ? -1 : 0
size - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void cmgtZeroVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = src[i] > 0 ? -1 : 0
size - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src - SIMD register.public void cmhiVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = unsigned(src1[i]) > unsigned(src2[i]) ? -1 : 0
size - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void cmhsVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = unsigned(src1[i]) >= unsigned(src2[i]) ? -1 : 0
size - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void cmleZeroVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = src[i] <= 0 ? -1 : 0
size - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src - SIMD register.public void cmltZeroVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = src[i] < 0 ? -1 : 0
size - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src - SIMD register.public void cmtstVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = (src1[i] & src2[i]) == 0 ? 0 : -1
size - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void cntVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register src)
dst[0...n] = countBitCountOfEachByte(src[0...n]), n = size/8.size - register size.dst - SIMD register. Should not be null.src - SIMD register. Should not be null.public void dupSX(AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src, int index)
dst[0] = src[index]eSize - size of value to duplicate.dst - SIMD registersrc - SIMD registerindex - offset of value to duplicatepublic void dupVX(AArch64ASIMDAssembler.ASIMDSize dstSize, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src, int index)
dst[0..n-1] = src[index]{n}dstSize - total size of all duplicates.eSize - size of value to duplicate.dst - SIMD register.src - SIMD register.index - offset of value to duplicatepublic void dupVG(AArch64ASIMDAssembler.ASIMDSize dstSize, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
dst(simd) = src(gp){n}dstSize - total size of all duplicates.eSize - size of value to duplicate.dst - SIMD register.src - general-purpose register.public void eorVVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = src1[i] ^ src2[i]size - register size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void extVVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register src1, Register src2, int src1LowIdx)
From the manual: "This instruction extracts the lowest vector elements from the second source SIMD&FP register and the highest vector elements from the first source SIMD&FP register, concatenates the results into a vector, and writes the vector to the destination SIMD&FP register vector. The index value specifies the lowest vector element to extract from the first source register, and consecutive elements are extracted from the first, then second, source registers until the destination vector is filled." For this operation, vector elements are always byte sized.
size - operation size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.src1LowIdx - The lowest index of the first source registers to extractpublic void fabsVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
for i in 0..n-1 do dst[i] = fp_abs(src[i])size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord. Note
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src - SIMD register.public void facgeVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = fp_abs(src1[i]) >= fp_abs(src2[i]) ? -1 : 0
size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord.
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void facgtVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = fp_abs(src1[i]) > fp_abs(src2[i]) ? -1 : 0
size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord.
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void facgtSSS(AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
dst = fp_abs(src1) > fp_abs(src2) > -1 : 0
eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void faddVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = fp_add(src1[i], src2[i])size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord. Note
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void fcmeqVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = src1[i] == src2[i] ? -1 : 0
size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord.
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void fcmeqZeroVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = src[i] == 0 ? -1 : 0
size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord.
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src - SIMD register.public void fcmgeVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = src1[i] >= src2[i] ? -1 : 0
size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord.
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void fcmgeZeroVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] >= src[i] == 0 ? -1 : 0
size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord.
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src - SIMD register.public void fcmgtVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] = src1[i] > src2[i] ? -1 : 0
size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord.
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void fcmgtZeroVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] > src[i] == 0 ? -1 : 0
size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord.
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src - SIMD register.public void fcmleZeroVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] <= src[i] == 0 ? -1 : 0
size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord.
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src - SIMD register.public void fcmltZeroVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
For elements which the comparison is true, all bits of the corresponding dst lane are set to
1. Otherwise, if the comparison is false, then the corresponding dst lane is cleared.
for i in 0..n-1 do dst[i] < src[i] == 0 ? -1 : 0
size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord.
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src - SIMD register.public void fcvtlVV(AArch64ASIMDAssembler.ElementSize srcESize, Register dst, Register src)
srcESize - source element size. Must be ElementSize.HalfWord or ElementSize.Word. The
destination element size will be double this width.dst - SIMD register.src - SIMD register.public void fcvtnVV(AArch64ASIMDAssembler.ElementSize srcESize, Register dst, Register src)
srcESize - source element size. Must be ElementSize.Word or ElementSize.DoubleWord. The
destination element size will be half this width.dst - SIMD register.src - SIMD register.public void fcvtzsVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
size - register size.eSize - source element size. Must be ElementSize.Word or ElementSize.DoubleWord.
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src - SIMD register.public void fdivVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = fp_div(src1[i], src2[i])size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord. Note
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void fmaxVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = fp_max(src1[i], src2[i])size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord. Note
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void fminVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = fp_min(src1[i], src2[i])size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord. Note
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void fmlaVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] += fp_multiply(src1[i], src2[i])size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord. Note
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void fmlsVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] -= fp_multiply(src1[i], src2[i])size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord. Note
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void fmovVI(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, long imm64)
dst = imm64{1,2}size - register size.dst - SIMD register.imm64 - 64-bit value to move. Is copied twice if register size is 128.public void fmulVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = fp_mul(src1[i], src2[i])size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord. Note
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void fnegVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
for i in 0..n-1 do dst[i] = -src[i]size - register size.eSize - source element size. Must be ElementSize.Word or ElementSize.DoubleWord.
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src - SIMD register.public void fsqrtVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
for i in 0..n-1 do dst[i] = fp_sqrt(src[i])size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord. Note
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src - SIMD register.public void fsubVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = fp_sub(src1[i], src2[i])size - register size.eSize - element size. Must be ElementSize.Word or ElementSize.DoubleWord. Note
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void insXG(AArch64ASIMDAssembler.ElementSize eSize, Register dst, int index, Register src)
dst[index] = src
Note the rest of the dst register is unaltered.eSize - size of value to duplicate.dst - SIMD register.index - offset of value to duplicatesrc - SIMD register.public void ld1MultipleV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, AArch64Address addr)
size - register size.eSize - element size.dst - destination of first structure's valueaddr - address of first structure.public void ld1MultipleVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst1, Register dst2, AArch64Address addr)
size - register size.eSize - element size.dst1 - destination of first structure's value.dst2 - destination of second structure's value. Must be register after dst1.addr - address of first structure.public void ld1MultipleVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst1, Register dst2, Register dst3, AArch64Address addr)
size - register size.eSize - element size.dst1 - destination of first structure's value.dst2 - destination of second structure's value. Must be register after dst1.dst3 - destination of third structure's value. Must be register after dst2.addr - address of first structure.public void ld1MultipleVVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst1, Register dst2, Register dst3, Register dst4, AArch64Address addr)
size - register size.eSize - element size.dst1 - destination of first structure's value.dst2 - destination of second structure's value. Must be register after dst1.dst3 - destination of third structure's value. Must be register after dst2.dst4 - destination of fourth structure's value. Must be register after dst3.addr - address of first structure.public void ld1rV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, AArch64Address addr)
size - register size.eSize - element size of value to replicate.dst - SIMD register.addr - address of structure.public void mlaVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] += int_multiply(src1[i], src2[i])size - register size.eSize - element size. Cannot be ElementSize.DoubleWord.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void mlsVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] -= int_multiply(src1[i], src2[i])size - register size.eSize - element size. Cannot be ElementSize.DoubleWord.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void moviVI(AArch64ASIMDAssembler.ASIMDSize size, Register dst, long imm)
dst = imm{1,2}size - register size.dst - SIMD register.imm - long value to move. If size is 128, then this value is copied twicepublic void mulVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = int_mul(src1[i], src2[i])size - register size.eSize - element size. Cannot be ElementSize.DoubleWord.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void mvniVI(AArch64ASIMDAssembler.ASIMDSize size, Register dst, long imm)
dst = ~(imm{1,2})size - register size.dst - SIMD register.imm - long value to move. If size is 128, then this value is copied twicepublic void negVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
for i in 0..n-1 do dst[i] = -src[i]size - register size.eSize - source element size. ElementSize.DoubleWord is only applicable when size is 128
(i.e. the operation is performed on more than one element).dst - SIMD register.src - SIMD register.public void notVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register src)
for i in 0..n-1 do dst[i] = ~src[i]size - register size.dst - SIMD register.src - SIMD register.public void ornVVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = src1[i] | ~src2[i]size - register size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void orrVI(AArch64ASIMDAssembler.ASIMDSize size, Register dst, long imm)
dst = dst | imm{1,2}size - register size.dst - SIMD register.imm - long value to move. If size is 128, then this value is copied twicepublic void orrVVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = src1[i] | src2[i]size - register size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void rev16VV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register src)
size - register size.dst - SIMD register.src - SIMD register.public void rev32VV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize revGranularity, Register dst, Register src)
size - register size.revGranularity - within each element at what granularity the bits should be reversed.
Can be of size Byte of HalfWorddst - SIMD register.src - SIMD register.public void rev64VV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize revGranularity, Register dst, Register src)
size - register size.revGranularity - within each element at what granularity the bits should be reversed.
DoubleWord is not allowed.dst - SIMD register.src - SIMD register.public void saddlvSV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize elementSize, Register dst, Register src)
dst = src[0] + ....+ src[n].Dst is twice the width of the vector elements, so overflow is not possible.
size - register size.elementSize - Unexpanded width of each addition operand.dst - SIMD register. Should not be null.src - SIMD register. Should not be null.public void scvtfVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src)
size - register size.eSize - source element size. Must be ElementSize.Word or ElementSize.DoubleWord.
ElementSize.DoubleWord is only applicable when size is 128 (i.e. the operation is
performed on more than one element).dst - SIMD register.src - SIMD register.public void shlVVI(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src, int shiftAmt)
for i in 0..n-1 do dst[i] = src[i] << immsize - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src - SIMD register.shiftAmt - shift amount.public void smaxVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = int_max(src1[i], src2[i])size - register size.eSize - element size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void sminVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = int_min(src1[i], src2[i])size - register size.eSize - element size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void smlalVVV(AArch64ASIMDAssembler.ElementSize srcESize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] += int_multiply(src1[i], src2[i])srcESize - source element size. Cannot be ElementSize.DoubleWord. The destination
element size will be double this width.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void smlslVVV(AArch64ASIMDAssembler.ElementSize srcESize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] -= int_multiply(src1[i], src2[i])srcESize - source element size. Cannot be ElementSize.DoubleWord. The destination
element size will be double this width.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void smovGX(AArch64ASIMDAssembler.ElementSize dstESize, AArch64ASIMDAssembler.ElementSize srcESize, Register dst, Register src, int index)
dst (gp) = sign-extend(src[index]) (simd).
Note that the target register size (dst) must be greater than the source element size.
dstESize - width of sign-extended.srcESize - width of element to move.dst - general-purpose register.src - SIMD register.index - offset of value to move.public void sshlVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do
if(byte(src2[i] > 0
dst[i] = (src1[i] << byte(src2[i]
else
dst[i] = (src1[i] >> byte(src2[i])size - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void sshllVVI(AArch64ASIMDAssembler.ElementSize srcESize, Register dst, Register src, int shiftAmt)
From the manual: "This instruction reads each vector element from the source SIMD&FP register, left shifts each vector element by the specified shift amount ... The destination vector elements are twice as long as the source vector elements. All the values in this instruction are signed integer values."
srcESize - source element size. Cannot be ElementSize.DoubleWord. The destination
element size will be double this width.dst - SIMD register.src - SIMD register.shiftAmt - shift left amount.public void sshrVVI(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src, int shiftAmt)
for i in 0..n-1 do dst[i] = src[i] >> immsize - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src - SIMD register.shiftAmt - shift right amount.public void st1MultipleV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register src, AArch64Address addr)
size - register size.eSize - element size.src - value to store in structure.addr - address of first structure.public void st1MultipleVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register src1, Register src2, AArch64Address addr)
size - register size.eSize - element size.src1 - value to store in first structure.src2 - value to store in second structure. Must be register after src1.addr - address of first structure.public void st1MultipleVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register src1, Register src2, Register src3, AArch64Address addr)
size - register size.eSize - element size.src1 - value to store in first structure.src2 - value to store in second structure. Must be register after src1.src3 - value to store in third structure. Must be register after src2.addr - address of first structure.public void st1MultipleVVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register src1, Register src2, Register src3, Register src4, AArch64Address addr)
size - register size.eSize - element size.src1 - value to store in first structure.src2 - value to store in second structure. Must be register after src1.src3 - value to store in third structure. Must be register after src2.src4 - value to store in fourth structure. Must be register after src3.addr - address of first structure.public void subSSS(AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
dst[0] = int_sub(src1[0], src2[0])
Note that only 64-bit (DoubleWord) operations are available.
eSize - element size. Must be of type ElementSize.DoubleWorddst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void subVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] = int_sub(src1[i], src2[i])size - register size.eSize - element size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void tblVVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register table, Register index)
tbl[0..n-1] = table[0..n-1]
for i in 0..n-1 {
idx = index[i]
if (index < n)
dst[i] = tbl[idx]
else
dst[i] = 0
}
size - register size.dst - SIMD register.table - SIMD register.index - SIMD register.public void tblVVVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register table1, Register table2, Register index)
tbl[0..n-1] = table1[0..n-1]
tbl[n..2n-1] = table2[0..n-1]
for i in 0..n-1 {
idx = index[i]
if (index < 2n)
dst[i] = tbl[idx]
else
dst[i] = 0
}
size - register size.dst - SIMD register.table1 - SIMD register.table2 - SIMD register.index - SIMD register.public void tbxVVV(AArch64ASIMDAssembler.ASIMDSize size, Register dst, Register table, Register index)
tbl[0..n-1] = table[0..n-1]
for i in 0..n-1 {
idx = index[i]
if (index < n)
dst[i] = tbl[idx]
}
size - register size.dst - SIMD register.table - SIMD register.index - SIMD register.public void trn1VVV(AArch64ASIMDAssembler.ASIMDSize dstSize, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
From the manual: "This instructions reads corresponding even-numbered vector elements from the two registers, starting at zero, [and] places each result into consecutive elements of a vector."
dstSize - register size of destination register. Note only half of this size will be
used within the source registers.eSize - element size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void trn2VVV(AArch64ASIMDAssembler.ASIMDSize dstSize, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
From the manual: "This instructions reads corresponding odd-numbered vector elements from the two registers, starting at zero, [and] places each result into consecutive elements of a vector."
dstSize - register size of destination register. Note only half of this size will be
used within the source registers.eSize - element size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void uaddlvSV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize elementSize, Register dst, Register src)
dst = src[0] + ....+ src[n].Dst is twice the width of the vector elements, so overflow is not possible.
size - register size.elementSize - Unexpanded width of each addition operand.dst - SIMD register. Should not be null.src - SIMD register. Should not be null.public void umaxvSV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize elementSize, Register dst, Register src)
dst = uint_max(src[0], ..., src[n]).size - register size.elementSize - width of each operand.dst - SIMD register.src - SIMD register.public void uminvSV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize elementSize, Register dst, Register src)
dst = uint_min(src[0], ..., src[n]).size - register size.elementSize - width of each operand.dst - SIMD register.src - SIMD register.public void umlalVVV(AArch64ASIMDAssembler.ElementSize srcESize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] += uint_multiply(src1[i], src2[i])srcESize - source element size. Cannot be ElementSize.DoubleWord. The destination
element size will be double this width.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void umlslVVV(AArch64ASIMDAssembler.ElementSize srcESize, Register dst, Register src1, Register src2)
for i in 0..n-1 do dst[i] -= uint_multiply(src1[i], src2[i])srcESize - source element size. Cannot be ElementSize.DoubleWord. The destination
element size will be double this width.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void umovGX(AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src, int index)
dst (gp) = src[index] (simd).eSize - width of element to move.dst - general-purpose register.src - SIMD register.index - offset of value to move.public void ushlVVV(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
for i in 0..n-1 do
if(byte(src2[i] > 0)
dst[i] = (src1[i] << byte(src2[i])
else
dst[i] = (src1[i] >>> byte(src2[i])size - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void ushllVVI(AArch64ASIMDAssembler.ElementSize srcESize, Register dst, Register src, int shiftAmt)
From the manual: "This instruction reads each vector element in the lower half of the source SIMD&FP register, shifts the unsigned integer value left by the specified number of bits ... The destination vector elements are twice as long as the source vector elements."
srcESize - source element size. Cannot be ElementSize.DoubleWord. The destination
element size will be double this width.dst - SIMD register.src - SIMD register.shiftAmt - shift left amount.public void ushll2VVI(AArch64ASIMDAssembler.ElementSize srcESize, Register dst, Register src, int shiftAmt)
From the manual: "This instruction reads each vector element in the upper half of the source SIMD&FP register, shifts the unsigned integer value left by the specified number of bits ... The destination vector elements are twice as long as the source vector elements."
srcESize - source element size. Cannot be ElementSize.DoubleWord. The destination
element size will be twice this width.dst - SIMD register.src - SIMD register.shiftAmt - shift left amount.public void ushrSSI(AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src, int shiftAmt)
for i in 0..n-1 do dst[i] = src[i] >>> immeSize - element size. Must be ElementSize.DoubleWord.dst - SIMD register.src - SIMD register.shiftAmt - shift right amount.public void ushrVVI(AArch64ASIMDAssembler.ASIMDSize size, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src, int shiftAmt)
dst = src >>> immsize - register size.eSize - element size. ElementSize.DoubleWord is only applicable when size is 128 (i.e.
the operation is performed on more than one element).dst - SIMD register.src - SIMD register.shiftAmt - shift right amount.public void uzp1VVV(AArch64ASIMDAssembler.ASIMDSize dstSize, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
From the manual: "This instructions reads corresponding even-numbered vector elements from the two source registers, starting at zero, places the result from the first source register into consecutive elements in the lower half of a vector, and the result from the second source register into consecutive elements in the upper half of a vector."
dstSize - register size of destination register. Note only half of this size will be
used within the source registers.eSize - element size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void uzp2VVV(AArch64ASIMDAssembler.ASIMDSize dstSize, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
From the manual: "This instructions reads corresponding odd-numbered vector elements from the two source registers, starting at zero, places the result from the first source register into consecutive elements in the lower half of a vector, and the result from the second source register into consecutive elements in the upper half of a vector."
dstSize - register size of destination register. Note only half of this size will be
used within the source registers.eSize - element size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void xtnVV(AArch64ASIMDAssembler.ElementSize dstESize, Register dst, Register src)
From the manual: "This instruction reads each vector element from the source SIMD&FP register, narrows each value to half the original width, and writes into the lower half of the destination register..."
dstESize - destination element size. Cannot be ElementSize.DoubleWord. The source
element size is twice this width.dst - SIMD register.src - SIMD register.public void xtn2VV(AArch64ASIMDAssembler.ElementSize dstESize, Register dst, Register src)
From the manual: "This instruction reads each vector element from the source SIMD&FP register, narrows each value to half the original width, and writes into the upper half of the destination register..."
dstESize - destination element size. Cannot be ElementSize.DoubleWord. The source
element size is twice this width.dst - SIMD register.src - SIMD register.public void zip1VVV(AArch64ASIMDAssembler.ASIMDSize dstSize, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
From the manual: "This instructions reads adjacent vector elements from the lower half of two source registers as pairs, interleaves the pairs ... and writes the vector to the destination register."
dstSize - register size of destination register. Note only half of this size will be
used within the source registers.eSize - element size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.public void zip2VVV(AArch64ASIMDAssembler.ASIMDSize dstSize, AArch64ASIMDAssembler.ElementSize eSize, Register dst, Register src1, Register src2)
From the manual: "This instructions reads adjacent vector elements from the upper half of two source registers as pairs, interleaves the pairs ... and writes the vector to the destination register."
dstSize - register size of destination register. Note only half of this size will be
used within the source registers.eSize - element size.dst - SIMD register.src1 - SIMD register.src2 - SIMD register.