CPY (immediate, merging)
Copy signed integer immediate to vector elements (merging)
Copy a signed integer immediate to each active element in the destination vector. Inactive elements in the destination vector register remain unmodified.
The immediate operand is a signed value in the range -128 to +127, and for element widths of 16 bits or higher it may also be a signed multiple of 256 in the range -32768 to +32512 (excluding 0).
The immediate is encoded in 8 bits with an optional left shift by 8. The preferred disassembly when the shift option is specified is "#<simm8>, LSL #8". However an assembler and disassembler may also allow use of the shifted 16-bit value unless the immediate is 0 and the shift amount is 8, which must be unambiguously described as "#0, LSL #8".
Green
True
True
True
True
This instruction is used by the aliases
FMOV (zero, predicated)
Never
MOV (immediate, predicated, merging)
Unconditionally
0
0
0
0
0
1
0
1
0
1
0
1
CPY <Zd>.<T>, <Pg>/M, #<imm>{, <shift>}
if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then UNDEFINED;
if size:sh == '001' then UNDEFINED;
constant integer esize = 8 << UInt(size);
constant integer g = UInt(Pg);
constant integer d = UInt(Zd);
constant boolean merging = TRUE;
integer imm = SInt(imm8);
if sh == '1' then imm = imm << 8;
<Zd>
Is the name of the destination scalable vector register, encoded in the "Zd" field.
<T>
Is the size specifier,
size
<T>
00
B
01
H
10
S
11
D
<Pg>
Is the name of the governing scalable predicate register, encoded in the "Pg" field.
<imm>
Is a signed immediate in the range -128 to 127, encoded in the "imm8" field.
<shift>
Is the optional left shift to apply to the immediate, defaulting to LSL #0 and
sh
<shift>
0
LSL #0
1
LSL #8
CheckSVEEnabled();
constant integer VL = CurrentVL;
constant integer PL = VL DIV 8;
constant integer elements = VL DIV esize;
constant bits(PL) mask = P[g, PL];
constant bits(VL) dest = if merging then Z[d, VL] else Zeros(VL);
bits(VL) result;
for e = 0 to elements-1
if ActivePredicateElement(mask, e, esize) then
Elem[result, e, esize] = imm<esize-1:0>;
else
Elem[result, e, esize] = Elem[dest, e, esize];
Z[d, VL] = result;