BFM Bitfield move This instruction is usually accessed via one of its aliases, which are always preferred for disassembly. If <imms> is greater than or equal to <immr>, this copies a bitfield of (<imms>-<immr>+1) bits starting from bit position <immr> in the source register to the least significant bits of the destination register. If <imms> is less than <immr>, this copies a bitfield of (<imms>+1) bits from the least significant bits of the source register to bit position (regsize-<immr>) of the destination register, where regsize is the destination register size of 32 or 64 bits. In both cases, the other bits of the destination register remain unchanged. If PSTATE.DIT is 1: The execution time of this instruction is independent of: The values of the data supplied in any of its registers. The values of the NZCV flags. The response of this instruction to asynchronous exceptions does not vary based on: The values of the data supplied in any of its registers. The values of the NZCV flags. This instruction is used by the aliases BFC Rn == '11111' && UInt(imms) < UInt(immr) BFI Rn != '11111' && UInt(imms) < UInt(immr) BFXIL UInt(imms) >= UInt(immr) See below for details of when each alias is preferred. 0 1 1 0 0 1 1 0 0 0 BFM <Wd>, <Wn>, #<immr>, #<imms> 1 1 BFM <Xd>, <Xn>, #<immr>, #<imms> if sf == '1' && N != '1' then UNDEFINED; if sf == '0' && (N != '0' || immr<5> != '0' || imms<5> != '0') then UNDEFINED; constant integer d = UInt(Rd); constant integer n = UInt(Rn); constant integer datasize = 32 << UInt(sf); constant integer s = UInt(imms); constant integer r = UInt(immr); bits(datasize) wmask; bits(datasize) tmask; (wmask, tmask) = DecodeBitMasks(N, imms, immr, FALSE, datasize); <Wd> Is the 32-bit name of the general-purpose destination register, encoded in the "Rd" field. <Wn> Is the 32-bit name of the general-purpose source register, encoded in the "Rn" field. <immr> For the 32-bit variant: is the right rotate amount, in the range 0 to 31, encoded in the "immr" field. <immr> For the 64-bit variant: is the right rotate amount, in the range 0 to 63, encoded in the "immr" field. <imms> For the 32-bit variant: is the leftmost bit number to be moved from the source, in the range 0 to 31, encoded in the "imms" field. <imms> For the 64-bit variant: is the leftmost bit number to be moved from the source, in the range 0 to 63, encoded in the "imms" field. <Xd> Is the 64-bit name of the general-purpose destination register, encoded in the "Rd" field. <Xn> Is the 64-bit name of the general-purpose source register, encoded in the "Rn" field. Alias Conditions constant bits(datasize) dst = X[d, datasize]; constant bits(datasize) src = X[n, datasize]; // Perform bitfield move on low bits constant bits(datasize) bot = (dst AND NOT(wmask)) OR (ROR(src, r) AND wmask); // Combine extension bits and result bits X[d, datasize] = (dst AND NOT(tmask)) OR (bot AND tmask);