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;