MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / DecodeBitMasks

Function DecodeBitMasks

arch/arm64/disassembler/pcode.c:54–92  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

52}
53
54DecodeBitMasks_ReturnType DecodeBitMasks(
55 uint8_t /*bit*/ immN, uint8_t /*bit(6)*/ imms, uint8_t /*bit(6)*/ immr)
56{
57 int ones_nbits = 0;
58 if (immN == 1)
59 ones_nbits = 6;
60 else if ((imms & 0x3E) == 0x3C)
61 ones_nbits = 1;
62 else if ((imms & 0x3C) == 0x38)
63 ones_nbits = 2;
64 else if ((imms & 0x38) == 0x30)
65 ones_nbits = 3;
66 else if ((imms & 0x30) == 0x20)
67 ones_nbits = 4;
68 else if ((imms & 0x20) == 0)
69 ones_nbits = 5;
70 // TODO else: return undefined
71
72 /* set 1's in element */
73 int ones_n = (imms & ((1 << ones_nbits) - 1)) + 1;
74 uint64_t result = ((uint64_t)1 << ones_n) - 1;
75
76 /* rotate element */
77 int elem_width = 1 << ones_nbits;
78 result = rotate_right(result, elem_width, immr);
79
80 /* replicate element */
81 while (elem_width < 64)
82 {
83 result = (result << elem_width) | result;
84 elem_width *= 2;
85 }
86
87 DecodeBitMasks_ReturnType dbmrt;
88 // TODO: do this right
89 dbmrt.wmask = result;
90 dbmrt.tmask = result;
91 return dbmrt;
92}
93
94/* idea to abandon pseudocode and compute+compare actual bitmask
95 is from NetBSD sys/arch/aarch64/aarch64/disasm.c */

Callers 12

MoveWidePreferredFunction · 0.85
ANDS_log_immFunction · 0.85
AND_log_immFunction · 0.85
BFMFunction · 0.85
EOR_log_immFunction · 0.85
ORR_log_immFunction · 0.85
SBFMFunction · 0.85
UBFMFunction · 0.85
and_z_ziFunction · 0.85
dupm_z_iFunction · 0.85
eor_z_ziFunction · 0.85
orr_z_ziFunction · 0.85

Calls 1

rotate_rightFunction · 0.85

Tested by

no test coverage detected