sub
Vector Subtract (Integer)
SUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>
Subtracts elements of Vm from Vn.
Details
Subtracts corresponding integer elements of Vm from Vn and writes the results to the destination vector. Operates element-wise on 8-bit, 16-bit, 32-bit, or 64-bit elements as determined by the size and Q fields. Condition flags (N, Z, C, V) are not affected; wrapping subtraction is performed on underflow.
Pseudocode Operation
for i = 0 to elements_in_vector - 1
Vd[i] ← Vn[i] - Vm[i]
Example
SUB v0.4s.T, v1.4s.T, v2.4s.T
Encoding
Binary Layout
0
Q
1
01110
size
1
Rm
10000
1
Rn
Rd
Operands
-
Vd
Destination SIMD/FP vector register -
Vn
First source SIMD/FP vector register -
Vm
Second source SIMD/FP vector register
Reference (Arm A64 ISA)
Instruction Forms
| Encoding | Instruction | ISA | Bit pattern | ||
|---|---|---|---|---|---|
| 0x4B200000 | SUB <Wd|WSP>, <Wn|WSP>, <Wm>{, <extend> {#<amount>}} | A64 | 0 | 1 | 0 | 01011 | 00 | 1 | Rm | option | imm3 | Rn | Rd | ||
| 0xCB200000 | SUB <Xd|SP>, <Xn|SP>, <R><m>{, <extend> {#<amount>}} | A64 | 1 | 1 | 0 | 01011 | 00 | 1 | Rm | option | imm3 | Rn | Rd | ||
| 0x51000000 | SUB <Wd|WSP>, <Wn|WSP>, #<imm>{, <shift>} | A64 | 0 | 1 | 0 | 100010 | sh | imm12 | Rn | Rd | ||
| 0xD1000000 | SUB <Xd|SP>, <Xn|SP>, #<imm>{, <shift>} | A64 | 1 | 1 | 0 | 100010 | sh | imm12 | Rn | Rd | ||
| 0x4B000000 | SUB <Wd>, <Wn>, <Wm>{, <shift> #<amount>} | A64 | 0 | 1 | 0 | 01011 | shift | 0 | Rm | imm6 | Rn | Rd | ||
| 0xCB000000 | SUB <Xd>, <Xn>, <Xm>{, <shift> #<amount>} | A64 | 1 | 1 | 0 | 01011 | shift | 0 | Rm | imm6 | Rn | Rd | ||
| 0x7EE08400 | SUB D<d>, D<n>, D<m> | A64 | 01 | 1 | 11110 | 11 | 1 | Rm | 10000 | 1 | Rn | Rd | ||
| 0x2E208400 | SUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T> | A64 | 0 | Q | 1 | 01110 | size | 1 | Rm | 10000 | 1 | Rn | Rd | ||
| 0x04010000 | SUB <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T> | A64 | 00000100 | size | 000 | 00 | 1 | 000 | Pg | Zm | Zdn | ||
| 0x2521C000 | SUB <Zdn>.<T>, <Zdn>.<T>, #<imm>{, <shift>} | A64 | 00100101 | size | 100 | 00 | 1 | 11 | sh | imm8 | Zdn | ||
| 0x04200400 | SUB <Zd>.<T>, <Zn>.<T>, <Zm>.<T> | A64 | 00000100 | size | 1 | Zm | 000 | 00 | 1 | Zn | Zd | ||
| 0xC1A01C18 | SUB ZA.<T>[<Wv>, <offs>{, VGx2}], { <Zm1>.<T>-<Zm2>.<T> } | A64 | 110000011 | sz | 1000000 | Rv | 111 | Zm | 01 | 1 | off3 | ||
| 0xC1A11C18 | SUB ZA.<T>[<Wv>, <offs>{, VGx4}], { <Zm1>.<T>-<Zm4>.<T> } | A64 | 110000011 | sz | 1000010 | Rv | 111 | Zm | 001 | 1 | off3 | ||
| 0xC1201818 | SUB ZA.<T>[<Wv>, <offs>{, VGx2}], { <Zn1>.<T>-<Zn2>.<T> }, <Zm>.<T> | A64 | 110000010 | sz | 10 | Zm | 0 | Rv | 110 | Zn | 1 | 1 | off3 |
Description
Subtract (vector). This instruction subtracts each vector element in the second source SIMD&FP register from the corresponding vector element in the first source SIMD&FP register, places the result into a vector, and writes the vector to the destination SIMD&FP register.
Depending on the settings in the CPACR_EL1, CPTR_EL2, and CPTR_EL3 registers, and the current Security state and Exception level, an attempt to execute the instruction might be trapped.
Operation
CheckFPAdvSIMDEnabled64();
bits(datasize) operand1 = V[n, datasize];
bits(datasize) operand2 = V[m, datasize];
bits(datasize) result;
bits(esize) element1;
bits(esize) element2;
for e = 0 to elements-1
element1 = Elem[operand1, e, esize];
element2 = Elem[operand2, e, esize];
if sub_op then
Elem[result, e, esize] = element1 - element2;
else
Elem[result, e, esize] = element1 + element2;
V[d, datasize] = result;