Skip to content

Commit 6d820cc

Browse files
jpidancetathre0z
authored andcommitted
Convert ZydisDecoder field decoder_mode to a bitmap.
Make decoder_mode a bitmap instead of an array of booleans for space efficiency.
1 parent 80ccb8e commit 6d820cc

File tree

2 files changed

+32
-33
lines changed

2 files changed

+32
-33
lines changed

include/Zydis/Decoder.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,9 @@ typedef struct ZydisDecoder_
176176
*/
177177
ZydisStackWidth stack_width;
178178
/**
179-
* The decoder mode array.
179+
* The decoder mode bitmap.
180180
*/
181-
ZyanBool decoder_mode[ZYDIS_DECODER_MODE_MAX_VALUE + 1];
181+
ZyanU32 decoder_mode;
182182
} ZydisDecoder;
183183

184184
/* ---------------------------------------------------------------------------------------------- */

src/Decoder.c

+30-31
Original file line numberDiff line numberDiff line change
@@ -2103,7 +2103,7 @@ static void ZydisSetAttributes(ZydisDecoderState* state, ZydisDecodedInstruction
21032103
break;
21042104
}
21052105
}
2106-
if (state->decoder->decoder_mode[ZYDIS_DECODER_MODE_MPX] &&
2106+
if ((state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_MPX)) &&
21072107
instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_BND)
21082108
{
21092109
instruction->attributes |= ZYDIS_ATTRIB_HAS_BND;
@@ -2167,7 +2167,7 @@ static void ZydisSetAttributes(ZydisDecoderState* state, ZydisDecodedInstruction
21672167
if (def->accepts_NOTRACK)
21682168
{
21692169
instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_NOTRACK;
2170-
if (state->decoder->decoder_mode[ZYDIS_DECODER_MODE_CET] &&
2170+
if ((state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_CET)) &&
21712171
(state->prefixes.offset_notrack >= 0))
21722172
{
21732173
instruction->attributes |= ZYDIS_ATTRIB_HAS_NOTRACK;
@@ -4777,31 +4777,31 @@ static ZyanStatus ZydisDecodeInstruction(ZydisDecoderState* state,
47774777
break;
47784778
#endif
47794779
case ZYDIS_NODETYPE_FILTER_MODE_AMD:
4780-
index = state->decoder->decoder_mode[ZYDIS_DECODER_MODE_AMD_BRANCHES] ? 1 : 0;
4780+
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_AMD_BRANCHES));
47814781
break;
47824782
case ZYDIS_NODETYPE_FILTER_MODE_KNC:
4783-
index = state->decoder->decoder_mode[ZYDIS_DECODER_MODE_KNC] ? 1 : 0;
4783+
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_KNC));
47844784
break;
47854785
case ZYDIS_NODETYPE_FILTER_MODE_MPX:
4786-
index = state->decoder->decoder_mode[ZYDIS_DECODER_MODE_MPX] ? 1 : 0;
4786+
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_MPX));
47874787
break;
47884788
case ZYDIS_NODETYPE_FILTER_MODE_CET:
4789-
index = state->decoder->decoder_mode[ZYDIS_DECODER_MODE_CET] ? 1 : 0;
4789+
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_CET));
47904790
break;
47914791
case ZYDIS_NODETYPE_FILTER_MODE_LZCNT:
4792-
index = state->decoder->decoder_mode[ZYDIS_DECODER_MODE_LZCNT] ? 1 : 0;
4792+
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_LZCNT));
47934793
break;
47944794
case ZYDIS_NODETYPE_FILTER_MODE_TZCNT:
4795-
index = state->decoder->decoder_mode[ZYDIS_DECODER_MODE_TZCNT] ? 1 : 0;
4795+
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_TZCNT));
47964796
break;
47974797
case ZYDIS_NODETYPE_FILTER_MODE_WBNOINVD:
4798-
index = state->decoder->decoder_mode[ZYDIS_DECODER_MODE_WBNOINVD] ? 1 : 0;
4798+
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_WBNOINVD));
47994799
break;
48004800
case ZYDIS_NODETYPE_FILTER_MODE_CLDEMOTE:
4801-
index = state->decoder->decoder_mode[ZYDIS_DECODER_MODE_CLDEMOTE] ? 1 : 0;
4801+
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_CLDEMOTE));
48024802
break;
48034803
case ZYDIS_NODETYPE_FILTER_MODE_IPREFETCH:
4804-
index = state->decoder->decoder_mode[ZYDIS_DECODER_MODE_IPREFETCH] ? 1 : 0;
4804+
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_IPREFETCH));
48054805
break;
48064806
default:
48074807
if (node_type & ZYDIS_NODETYPE_DEFINITION_MASK)
@@ -4854,7 +4854,7 @@ static ZyanStatus ZydisDecodeInstruction(ZydisDecoderState* state,
48544854
(instruction->meta.category == ZYDIS_CATEGORY_RET)));
48554855
instruction->meta.exception_class = definition->exception_class;
48564856

4857-
if (!state->decoder->decoder_mode[ZYDIS_DECODER_MODE_MINIMAL])
4857+
if (!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_MINIMAL)))
48584858
{
48594859
ZydisSetAttributes(state, instruction, definition);
48604860
switch (instruction->encoding)
@@ -4899,23 +4899,15 @@ static ZyanStatus ZydisDecodeInstruction(ZydisDecoderState* state,
48994899
ZyanStatus ZydisDecoderInit(ZydisDecoder* decoder, ZydisMachineMode machine_mode,
49004900
ZydisStackWidth stack_width)
49014901
{
4902-
static const ZyanBool decoder_modes[ZYDIS_DECODER_MODE_MAX_VALUE + 1] =
4903-
{
4902+
static const ZyanU32 decoder_modes =
49044903
#ifdef ZYDIS_MINIMAL_MODE
4905-
ZYAN_TRUE , // ZYDIS_DECODER_MODE_MINIMAL
4906-
#else
4907-
ZYAN_FALSE, // ZYDIS_DECODER_MODE_MINIMAL
4904+
(1 << ZYDIS_DECODER_MODE_MINIMAL) |
49084905
#endif
4909-
ZYAN_FALSE, // ZYDIS_DECODER_MODE_AMD_BRANCHES
4910-
ZYAN_FALSE, // ZYDIS_DECODER_MODE_KNC
4911-
ZYAN_TRUE , // ZYDIS_DECODER_MODE_MPX
4912-
ZYAN_TRUE , // ZYDIS_DECODER_MODE_CET
4913-
ZYAN_TRUE , // ZYDIS_DECODER_MODE_LZCNT
4914-
ZYAN_TRUE , // ZYDIS_DECODER_MODE_TZCNT
4915-
ZYAN_FALSE, // ZYDIS_DECODER_MODE_WBNOINVD
4916-
ZYAN_TRUE, // ZYDIS_DECODER_MODE_CLDEMOTE
4917-
ZYAN_FALSE // ZYDIS_DECODER_MODE_IPREFETCH
4918-
};
4906+
(1 << ZYDIS_DECODER_MODE_MPX) |
4907+
(1 << ZYDIS_DECODER_MODE_CET) |
4908+
(1 << ZYDIS_DECODER_MODE_LZCNT) |
4909+
(1 << ZYDIS_DECODER_MODE_TZCNT) |
4910+
(1 << ZYDIS_DECODER_MODE_CLDEMOTE);
49194911

49204912
if (!decoder)
49214913
{
@@ -4945,7 +4937,7 @@ ZyanStatus ZydisDecoderInit(ZydisDecoder* decoder, ZydisMachineMode machine_mode
49454937

49464938
decoder->machine_mode = machine_mode;
49474939
decoder->stack_width = stack_width;
4948-
ZYAN_MEMCPY(&decoder->decoder_mode, &decoder_modes, sizeof(decoder_modes));
4940+
decoder->decoder_mode = decoder_modes;
49494941

49504942
return ZYAN_STATUS_SUCCESS;
49514943
}
@@ -4964,7 +4956,14 @@ ZyanStatus ZydisDecoderEnableMode(ZydisDecoder* decoder, ZydisDecoderMode mode,
49644956
}
49654957
#endif
49664958

4967-
decoder->decoder_mode[mode] = enabled;
4959+
if (enabled)
4960+
{
4961+
decoder->decoder_mode |= (1 << mode);
4962+
}
4963+
else
4964+
{
4965+
decoder->decoder_mode &= ~(1 << mode);
4966+
}
49684967

49694968
return ZYAN_STATUS_SUCCESS;
49704969
}
@@ -4981,7 +4980,7 @@ ZyanStatus ZydisDecoderDecodeFull(const ZydisDecoder* decoder,
49814980
{
49824981
return ZYDIS_STATUS_NO_MORE_DATA;
49834982
}
4984-
if (decoder->decoder_mode[ZYDIS_DECODER_MODE_MINIMAL])
4983+
if (decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_MINIMAL))
49854984
{
49864985
return ZYAN_STATUS_MISSING_DEPENDENCY; // TODO: Introduce better status code
49874986
}
@@ -5059,7 +5058,7 @@ ZyanStatus ZydisDecoderDecodeOperands(const ZydisDecoder* decoder,
50595058
return ZYAN_STATUS_INVALID_ARGUMENT;
50605059
}
50615060

5062-
if (decoder->decoder_mode[ZYDIS_DECODER_MODE_MINIMAL])
5061+
if (decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_MINIMAL))
50635062
{
50645063
return ZYAN_STATUS_MISSING_DEPENDENCY; // TODO: Introduce better status code
50655064
}

0 commit comments

Comments
 (0)