BFM Bitfield Move Bitfield Move 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> integer d = UInt(Rd); integer n = UInt(Rn); integer datasize = if sf == '1' then 64 else 32; boolean inzero; boolean extend; integer r; integer s; bits(datasize) wmask; bits(datasize) tmask; case opc of when '00' inzero = TRUE; extend = TRUE; // SBFM when '01' inzero = FALSE; extend = FALSE; // BFM when '10' inzero = TRUE; extend = FALSE; // UBFM when '11' UNDEFINED; if sf == '1' && N != '1' then UNDEFINED; if sf == '0' && (N != '0' || immr<5> != '0' || imms<5> != '0') then UNDEFINED; r = UInt(immr); s = UInt(imms); (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. <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. <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. Alias Conditions bits(datasize) dst = if inzero then Zeros(datasize) else X[d, datasize]; bits(datasize) src = X[n, datasize]; // perform bitfield move on low bits bits(datasize) bot = (dst AND NOT(wmask)) OR (ROR(src, r) AND wmask); // determine extension bits (sign, zero or dest register) bits(datasize) top = if extend then Replicate(src<s>, datasize) else dst; // combine extension bits and result bits X[d, datasize] = (top AND NOT(tmask)) OR (bot AND tmask);