|
20 | 20 |
|
21 | 21 | namespace llvm {
|
22 | 22 | namespace X86Disassembler {
|
23 |
| - |
24 |
| -// Accessor functions for various fields of an Intel instruction |
25 |
| -#define modFromModRM(modRM) (((modRM) & 0xc0) >> 6) |
26 |
| -#define regFromModRM(modRM) (((modRM) & 0x38) >> 3) |
27 |
| -#define rmFromModRM(modRM) ((modRM) & 0x7) |
28 |
| -#define scaleFromSIB(sib) (((sib) & 0xc0) >> 6) |
29 |
| -#define indexFromSIB(sib) (((sib) & 0x38) >> 3) |
30 |
| -#define baseFromSIB(sib) ((sib) & 0x7) |
31 |
| -#define wFromREX(rex) (((rex) & 0x8) >> 3) |
32 |
| -#define rFromREX(rex) (((rex) & 0x4) >> 2) |
33 |
| -#define xFromREX(rex) (((rex) & 0x2) >> 1) |
34 |
| -#define bFromREX(rex) ((rex) & 0x1) |
35 |
| - |
36 |
| -#define rFromEVEX2of4(evex) (((~(evex)) & 0x80) >> 7) |
37 |
| -#define xFromEVEX2of4(evex) (((~(evex)) & 0x40) >> 6) |
38 |
| -#define bFromEVEX2of4(evex) (((~(evex)) & 0x20) >> 5) |
39 |
| -#define r2FromEVEX2of4(evex) (((~(evex)) & 0x10) >> 4) |
40 |
| -#define mmmFromEVEX2of4(evex) ((evex) & 0x7) |
41 |
| -#define wFromEVEX3of4(evex) (((evex) & 0x80) >> 7) |
42 |
| -#define vvvvFromEVEX3of4(evex) (((~(evex)) & 0x78) >> 3) |
43 |
| -#define ppFromEVEX3of4(evex) ((evex) & 0x3) |
44 |
| -#define zFromEVEX4of4(evex) (((evex) & 0x80) >> 7) |
45 |
| -#define l2FromEVEX4of4(evex) (((evex) & 0x40) >> 6) |
46 |
| -#define lFromEVEX4of4(evex) (((evex) & 0x20) >> 5) |
47 |
| -#define bFromEVEX4of4(evex) (((evex) & 0x10) >> 4) |
48 |
| -#define v2FromEVEX4of4(evex) (((~evex) & 0x8) >> 3) |
49 |
| -#define aaaFromEVEX4of4(evex) ((evex) & 0x7) |
50 |
| - |
51 |
| -#define rFromVEX2of3(vex) (((~(vex)) & 0x80) >> 7) |
52 |
| -#define xFromVEX2of3(vex) (((~(vex)) & 0x40) >> 6) |
53 |
| -#define bFromVEX2of3(vex) (((~(vex)) & 0x20) >> 5) |
54 |
| -#define mmmmmFromVEX2of3(vex) ((vex) & 0x1f) |
55 |
| -#define wFromVEX3of3(vex) (((vex) & 0x80) >> 7) |
56 |
| -#define vvvvFromVEX3of3(vex) (((~(vex)) & 0x78) >> 3) |
57 |
| -#define lFromVEX3of3(vex) (((vex) & 0x4) >> 2) |
58 |
| -#define ppFromVEX3of3(vex) ((vex) & 0x3) |
59 |
| - |
60 |
| -#define rFromVEX2of2(vex) (((~(vex)) & 0x80) >> 7) |
61 |
| -#define vvvvFromVEX2of2(vex) (((~(vex)) & 0x78) >> 3) |
62 |
| -#define lFromVEX2of2(vex) (((vex) & 0x4) >> 2) |
63 |
| -#define ppFromVEX2of2(vex) ((vex) & 0x3) |
64 |
| - |
65 |
| -#define rFromXOP2of3(xop) (((~(xop)) & 0x80) >> 7) |
66 |
| -#define xFromXOP2of3(xop) (((~(xop)) & 0x40) >> 6) |
67 |
| -#define bFromXOP2of3(xop) (((~(xop)) & 0x20) >> 5) |
68 |
| -#define mmmmmFromXOP2of3(xop) ((xop) & 0x1f) |
69 |
| -#define wFromXOP3of3(xop) (((xop) & 0x80) >> 7) |
70 |
| -#define vvvvFromXOP3of3(vex) (((~(vex)) & 0x78) >> 3) |
71 |
| -#define lFromXOP3of3(xop) (((xop) & 0x4) >> 2) |
72 |
| -#define ppFromXOP3of3(xop) ((xop) & 0x3) |
| 23 | +// Helper macros |
| 24 | +#define bitFromOffset0(val) ((val) & 0x1) |
| 25 | +#define bitFromOffset1(val) (((val) >> 1) & 0x1) |
| 26 | +#define bitFromOffset2(val) (((val) >> 2) & 0x1) |
| 27 | +#define bitFromOffset3(val) (((val) >> 3) & 0x1) |
| 28 | +#define bitFromOffset4(val) (((val) >> 4) & 0x1) |
| 29 | +#define bitFromOffset5(val) (((val) >> 5) & 0x1) |
| 30 | +#define bitFromOffset6(val) (((val) >> 6) & 0x1) |
| 31 | +#define bitFromOffset7(val) (((val) >> 7) & 0x1) |
| 32 | +#define twoBitsFromOffset0(val) ((val) & 0x3) |
| 33 | +#define twoBitsFromOffset6(val) (((val) >> 6) & 0x3) |
| 34 | +#define threeBitsFromOffset0(val) ((val) & 0x7) |
| 35 | +#define threeBitsFromOffset3(val) (((val) >> 3) & 0x7) |
| 36 | +#define fiveBitsFromOffset0(val) ((val) & 0x1f) |
| 37 | +#define invertedBitFromOffset3(val) (((~(val)) >> 3) & 0x1) |
| 38 | +#define invertedBitFromOffset4(val) (((~(val)) >> 4) & 0x1) |
| 39 | +#define invertedBitFromOffset5(val) (((~(val)) >> 5) & 0x1) |
| 40 | +#define invertedBitFromOffset6(val) (((~(val)) >> 6) & 0x1) |
| 41 | +#define invertedBitFromOffset7(val) (((~(val)) >> 7) & 0x1) |
| 42 | +#define invertedFourBitsFromOffset3(val) (((~(val)) >> 3) & 0xf) |
| 43 | +// MOD/RM |
| 44 | +#define modFromModRM(modRM) twoBitsFromOffset6(modRM) |
| 45 | +#define regFromModRM(modRM) threeBitsFromOffset3(modRM) |
| 46 | +#define rmFromModRM(modRM) threeBitsFromOffset0(modRM) |
| 47 | +// SIB |
| 48 | +#define scaleFromSIB(sib) twoBitsFromOffset6(sib) |
| 49 | +#define indexFromSIB(sib) threeBitsFromOffset3(sib) |
| 50 | +#define baseFromSIB(sib) threeBitsFromOffset0(sib) |
| 51 | +// REX |
| 52 | +#define wFromREX(rex) bitFromOffset3(rex) |
| 53 | +#define rFromREX(rex) bitFromOffset2(rex) |
| 54 | +#define xFromREX(rex) bitFromOffset1(rex) |
| 55 | +#define bFromREX(rex) bitFromOffset0(rex) |
| 56 | +// XOP |
| 57 | +#define rFromXOP2of3(xop) invertedBitFromOffset7(xop) |
| 58 | +#define xFromXOP2of3(xop) invertedBitFromOffset6(xop) |
| 59 | +#define bFromXOP2of3(xop) invertedBitFromOffset5(xop) |
| 60 | +#define mmmmmFromXOP2of3(xop) fiveBitsFromOffset0(xop) |
| 61 | +#define wFromXOP3of3(xop) bitFromOffset7(xop) |
| 62 | +#define vvvvFromXOP3of3(xop) invertedFourBitsFromOffset3(xop) |
| 63 | +#define lFromXOP3of3(xop) bitFromOffset2(xop) |
| 64 | +#define ppFromXOP3of3(xop) twoBitsFromOffset0(xop) |
| 65 | +// VEX2 |
| 66 | +#define rFromVEX2of2(vex) invertedBitFromOffset7(vex) |
| 67 | +#define vvvvFromVEX2of2(vex) invertedFourBitsFromOffset3(vex) |
| 68 | +#define lFromVEX2of2(vex) bitFromOffset2(vex) |
| 69 | +#define ppFromVEX2of2(vex) twoBitsFromOffset0(vex) |
| 70 | +// VEX3 |
| 71 | +#define rFromVEX2of3(vex) invertedBitFromOffset7(vex) |
| 72 | +#define xFromVEX2of3(vex) invertedBitFromOffset6(vex) |
| 73 | +#define bFromVEX2of3(vex) invertedBitFromOffset5(vex) |
| 74 | +#define mmmmmFromVEX2of3(vex) fiveBitsFromOffset0(vex) |
| 75 | +#define wFromVEX3of3(vex) bitFromOffset7(vex) |
| 76 | +#define vvvvFromVEX3of3(vex) invertedFourBitsFromOffset3(vex) |
| 77 | +#define lFromVEX3of3(vex) bitFromOffset2(vex) |
| 78 | +#define ppFromVEX3of3(vex) twoBitsFromOffset0(vex) |
| 79 | +// EVEX |
| 80 | +#define rFromEVEX2of4(evex) invertedBitFromOffset7(evex) |
| 81 | +#define xFromEVEX2of4(evex) invertedBitFromOffset6(evex) |
| 82 | +#define bFromEVEX2of4(evex) invertedBitFromOffset5(evex) |
| 83 | +#define r2FromEVEX2of4(evex) invertedBitFromOffset4(evex) |
| 84 | +#define mmmFromEVEX2of4(evex) threeBitsFromOffset0(evex) |
| 85 | +#define wFromEVEX3of4(evex) bitFromOffset7(evex) |
| 86 | +#define vvvvFromEVEX3of4(evex) invertedFourBitsFromOffset3(evex) |
| 87 | +#define ppFromEVEX3of4(evex) twoBitsFromOffset0(evex) |
| 88 | +#define zFromEVEX4of4(evex) bitFromOffset7(evex) |
| 89 | +#define l2FromEVEX4of4(evex) bitFromOffset6(evex) |
| 90 | +#define lFromEVEX4of4(evex) bitFromOffset5(evex) |
| 91 | +#define bFromEVEX4of4(evex) bitFromOffset4(evex) |
| 92 | +#define v2FromEVEX4of4(evex) invertedBitFromOffset3(evex) |
| 93 | +#define aaaFromEVEX4of4(evex) threeBitsFromOffset0(evex) |
73 | 94 |
|
74 | 95 | // These enums represent Intel registers for use by the decoder.
|
75 | 96 | #define REGS_8BIT \
|
|
0 commit comments