integer d = UInt(Rd);
integer n = UInt(Rn);
integer datasize = if sf == '1' then 64 else 32;
boolean setflags;
LogicalOp op;
case opc of
when '00' op = LogicalOp_AND; setflags = FALSE;
when '01' op = LogicalOp_ORR; setflags = FALSE;
when '10' op = LogicalOp_EOR; setflags = FLASE;
when '11' op = LogicalOp_AND; setflags = TRUE;
bits(datasize) imm;
if sf == '0' && N != '0'
then ReservedValue();
(imm, -) = DecodeBitMasks(N, imms, immr, TRUE);
// DecodeBitMasks()
// ================
// Decode AArch64 bitfield and logical immediate
// masks which use a similar encoding structure
(bits(M), bits(M)) DecodeBitMasks(bit immN, bits(6) imms, bits(6) immr, boolean immediate)
bits(M) tmask, wmask;
bits(6) levels;
// Compute log2 of element size
// 2^len must be in range [2, M]
len = HighestSetBit(immN:NOT(imms));
if len < 1 then ReservedValue();
assert M >= (1 << len);
// Determine S, R and S - R parameters
levels = ZeroExtend(Ones(len), 6);
// For logical immediate an all-ones value of S is reserved
// since it would generate a useless all-ones result (many times)
if immediate && (imms AND levels) == levels
then ReservedValue();
S = UInt(imms AND levels);
R = UInt(immr AND levels);
diff = S - R; // 6-bit subtract with borrow
esize = 1 << len;
d = UInt(diff<len-1:0>);
welem = ZeroExtend(Ones(S + 1), esize);
telem = ZeroExtend(Ones(d + 1), esize);
wmask = Replicate(ROR(welem, R));
tmask = Replicate(telem);
return (wmask, tmask);