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);