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