Skip to content

Commit 0723d24

Browse files
authored
[X86][MC] Remove duplicated code in X86DisassemblerDecoder.h by defining macro helpers (NFCI) (#72341)
1 parent ce6ef99 commit 0723d24

File tree

1 file changed

+71
-50
lines changed

1 file changed

+71
-50
lines changed

llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h

Lines changed: 71 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -20,56 +20,77 @@
2020

2121
namespace llvm {
2222
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)
7394

7495
// These enums represent Intel registers for use by the decoder.
7596
#define REGS_8BIT \

0 commit comments

Comments
 (0)