-
Notifications
You must be signed in to change notification settings - Fork 50
/
opsize.cpp
85 lines (73 loc) · 1.49 KB
/
opsize.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "Translator.h"
int OpsizeToBits(OPSIZE opsize)
{
return OpsizeEntryTable[opsize].Bits;
}
int OpsizeToInt(OPSIZE opsize)
{
return OpsizeEntryTable[opsize].Bytes;
}
OPSIZE OpsizeFromBits(int bits)
{
return OpsizeFromInt(bits / 8);
}
OPSIZE OpsizeFromInt(int opsize)
{
switch(opsize)
{
case 1:
return SIZE_BYTE;
case 2:
return SIZE_WORD;
case 4:
return SIZE_DWORD;
case 6:
return SIZE_FWORD;
case 8:
return SIZE_QWORD;
case 10:
return SIZE_TBYTE;
case 16:
return SIZE_XMMWORD;
case 32:
return SIZE_YMMWORD;
case 64:
return SIZE_ZMMWORD;
}
return SIZE_UNSET;
}
int OpsizeToEosz(OPSIZE Value)
{
// OPSIZE to XED's effective operand size
switch(Value)
{
case SIZE_BYTE:
return 0;
case SIZE_WORD:
return 1;
case SIZE_DWORD:
return 2;
case SIZE_QWORD:
return 3;
}
return 0;
}
OPSIZE OpsizeFromString(const char* Value)
{
for(int i = 0; i < ARRAYSIZE(OpsizeEntryTable); i++)
{
if(!_stricmp(OpsizeEntryTable[i].Name, Value))
return OpsizeEntryTable[i].Size;
}
return SIZE_UNSET;
}
const char* OpsizeToString(OPSIZE Size)
{
return OpsizeEntryTable[Size].Name;
}
OPSIZE OpsizeFromValue(LONGLONG Value)
{
int sign = xed_shortest_width_signed(Value, 0xFF);
int unsign = xed_shortest_width_unsigned(Value, 0xFF);
return OpsizeFromInt(min(sign, unsign));
}