Skip to content

Commit 9e18844

Browse files
committed
Merging the instrsxarch fp, rf, and wf parameters into a single flags parameter
1 parent 6975ff3 commit 9e18844

File tree

5 files changed

+669
-657
lines changed

5 files changed

+669
-657
lines changed

src/jit/codegeninterface.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,13 @@ class CodeGenInterface
9898
bool m_genAlignLoops;
9999

100100
private:
101+
#if defined(_TARGET_XARCH_)
102+
static const insFlags instInfo[INS_count];
103+
#elif defined(_TARGET_ARM_) || defined(_TARGET_ARM64_)
101104
static const BYTE instInfo[INS_count];
105+
#else
106+
#error Unsupported target architecture
107+
#endif
102108

103109
#define INST_FP 0x01 // is it a FP instruction?
104110
public:

src/jit/emitxarch.cpp

Lines changed: 50 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,18 +1196,15 @@ inline ssize_t emitter::emitGetInsCIdisp(instrDesc* id)
11961196
* The following table is used by the instIsFP()/instUse/DefFlags() helpers.
11971197
*/
11981198

1199-
#define INST_DEF_FL 0x20 // does the instruction set flags?
1200-
#define INST_USE_FL 0x40 // does the instruction use flags?
1201-
12021199
// clang-format off
1203-
const BYTE CodeGenInterface::instInfo[] =
1204-
{
1205-
#define INST0(id, nm, fp, um, rf, wf, mr ) (INST_USE_FL*rf|INST_DEF_FL*wf|INST_FP*fp),
1206-
#define INST1(id, nm, fp, um, rf, wf, mr ) (INST_USE_FL*rf|INST_DEF_FL*wf|INST_FP*fp),
1207-
#define INST2(id, nm, fp, um, rf, wf, mr, mi ) (INST_USE_FL*rf|INST_DEF_FL*wf|INST_FP*fp),
1208-
#define INST3(id, nm, fp, um, rf, wf, mr, mi, rm ) (INST_USE_FL*rf|INST_DEF_FL*wf|INST_FP*fp),
1209-
#define INST4(id, nm, fp, um, rf, wf, mr, mi, rm, a4 ) (INST_USE_FL*rf|INST_DEF_FL*wf|INST_FP*fp),
1210-
#define INST5(id, nm, fp, um, rf, wf, mr, mi, rm, a4, rr ) (INST_USE_FL*rf|INST_DEF_FL*wf|INST_FP*fp),
1200+
const insFlags CodeGenInterface::instInfo[] =
1201+
{
1202+
#define INST0(id, nm, um, mr, flags) static_cast<insFlags>(flags),
1203+
#define INST1(id, nm, um, mr, flags) static_cast<insFlags>(flags),
1204+
#define INST2(id, nm, um, mr, mi, flags) static_cast<insFlags>(flags),
1205+
#define INST3(id, nm, um, mr, mi, rm, flags) static_cast<insFlags>(flags),
1206+
#define INST4(id, nm, um, mr, mi, rm, a4, flags) static_cast<insFlags>(flags),
1207+
#define INST5(id, nm, um, mr, mi, rm, a4, rr, flags) static_cast<insFlags>(flags),
12111208
#include "instrs.h"
12121209
#undef INST0
12131210
#undef INST1
@@ -1226,12 +1223,12 @@ const BYTE CodeGenInterface::instInfo[] =
12261223
// clang-format off
12271224
const BYTE emitter::emitInsModeFmtTab[] =
12281225
{
1229-
#define INST0(id, nm, fp, um, rf, wf, mr ) um,
1230-
#define INST1(id, nm, fp, um, rf, wf, mr ) um,
1231-
#define INST2(id, nm, fp, um, rf, wf, mr, mi ) um,
1232-
#define INST3(id, nm, fp, um, rf, wf, mr, mi, rm ) um,
1233-
#define INST4(id, nm, fp, um, rf, wf, mr, mi, rm, a4 ) um,
1234-
#define INST5(id, nm, fp, um, rf, wf, mr, mi, rm, a4, rr) um,
1226+
#define INST0(id, nm, um, mr, flags) um,
1227+
#define INST1(id, nm, um, mr, flags) um,
1228+
#define INST2(id, nm, um, mr, mi, flags) um,
1229+
#define INST3(id, nm, um, mr, mi, rm, flags) um,
1230+
#define INST4(id, nm, um, mr, mi, rm, a4, flags) um,
1231+
#define INST5(id, nm, um, mr, mi, rm, a4, rr, flags) um,
12351232
#include "instrs.h"
12361233
#undef INST0
12371234
#undef INST1
@@ -1317,12 +1314,12 @@ inline size_t insCode(instruction ins)
13171314
const static
13181315
size_t insCodes[] =
13191316
{
1320-
#define INST0(id, nm, fp, um, rf, wf, mr ) mr,
1321-
#define INST1(id, nm, fp, um, rf, wf, mr ) mr,
1322-
#define INST2(id, nm, fp, um, rf, wf, mr, mi ) mr,
1323-
#define INST3(id, nm, fp, um, rf, wf, mr, mi, rm ) mr,
1324-
#define INST4(id, nm, fp, um, rf, wf, mr, mi, rm, a4 ) mr,
1325-
#define INST5(id, nm, fp, um, rf, wf, mr, mi, rm, a4, rr) mr,
1317+
#define INST0(id, nm, um, mr, flags) mr,
1318+
#define INST1(id, nm, um, mr, flags) mr,
1319+
#define INST2(id, nm, um, mr, mi, flags) mr,
1320+
#define INST3(id, nm, um, mr, mi, rm, flags) mr,
1321+
#define INST4(id, nm, um, mr, mi, rm, a4, flags) mr,
1322+
#define INST5(id, nm, um, mr, mi, rm, a4, rr, flags) mr,
13261323
#include "instrs.h"
13271324
#undef INST0
13281325
#undef INST1
@@ -1350,12 +1347,12 @@ inline size_t insCodeACC(instruction ins)
13501347
const static
13511348
size_t insCodesACC[] =
13521349
{
1353-
#define INST0(id, nm, fp, um, rf, wf, mr )
1354-
#define INST1(id, nm, fp, um, rf, wf, mr )
1355-
#define INST2(id, nm, fp, um, rf, wf, mr, mi )
1356-
#define INST3(id, nm, fp, um, rf, wf, mr, mi, rm )
1357-
#define INST4(id, nm, fp, um, rf, wf, mr, mi, rm, a4 ) a4,
1358-
#define INST5(id, nm, fp, um, rf, wf, mr, mi, rm, a4, rr) a4,
1350+
#define INST0(id, nm, um, mr, flags)
1351+
#define INST1(id, nm, um, mr, flags)
1352+
#define INST2(id, nm, um, mr, mi, flags)
1353+
#define INST3(id, nm, um, mr, mi, rm, flags)
1354+
#define INST4(id, nm, um, mr, mi, rm, a4, flags) a4,
1355+
#define INST5(id, nm, um, mr, mi, rm, a4, rr, flags) a4,
13591356
#include "instrs.h"
13601357
#undef INST0
13611358
#undef INST1
@@ -1383,12 +1380,12 @@ inline size_t insCodeRR(instruction ins)
13831380
const static
13841381
size_t insCodesRR[] =
13851382
{
1386-
#define INST0(id, nm, fp, um, rf, wf, mr )
1387-
#define INST1(id, nm, fp, um, rf, wf, mr )
1388-
#define INST2(id, nm, fp, um, rf, wf, mr, mi )
1389-
#define INST3(id, nm, fp, um, rf, wf, mr, mi, rm )
1390-
#define INST4(id, nm, fp, um, rf, wf, mr, mi, rm, a4 )
1391-
#define INST5(id, nm, fp, um, rf, wf, mr, mi, rm, a4, rr) rr,
1383+
#define INST0(id, nm, um, mr, flags)
1384+
#define INST1(id, nm, um, mr, flags)
1385+
#define INST2(id, nm, um, mr, mi, flags)
1386+
#define INST3(id, nm, um, mr, mi, rm, flags)
1387+
#define INST4(id, nm, um, mr, mi, rm, a4, flags)
1388+
#define INST5(id, nm, um, mr, mi, rm, a4, rr, flags) rr,
13921389
#include "instrs.h"
13931390
#undef INST0
13941391
#undef INST1
@@ -1409,12 +1406,12 @@ inline size_t insCodeRR(instruction ins)
14091406
const static
14101407
size_t insCodesRM[] =
14111408
{
1412-
#define INST0(id, nm, fp, um, rf, wf, mr )
1413-
#define INST1(id, nm, fp, um, rf, wf, mr )
1414-
#define INST2(id, nm, fp, um, rf, wf, mr, mi )
1415-
#define INST3(id, nm, fp, um, rf, wf, mr, mi, rm ) rm,
1416-
#define INST4(id, nm, fp, um, rf, wf, mr, mi, rm, a4 ) rm,
1417-
#define INST5(id, nm, fp, um, rf, wf, mr, mi, rm, a4, rr) rm,
1409+
#define INST0(id, nm, um, mr, flags)
1410+
#define INST1(id, nm, um, mr, flags)
1411+
#define INST2(id, nm, um, mr, mi, flags)
1412+
#define INST3(id, nm, um, mr, mi, rm, flags) rm,
1413+
#define INST4(id, nm, um, mr, mi, rm, a4, flags) rm,
1414+
#define INST5(id, nm, um, mr, mi, rm, a4, rr, flags) rm,
14181415
#include "instrs.h"
14191416
#undef INST0
14201417
#undef INST1
@@ -1449,12 +1446,12 @@ inline size_t insCodeRM(instruction ins)
14491446
const static
14501447
size_t insCodesMI[] =
14511448
{
1452-
#define INST0(id, nm, fp, um, rf, wf, mr )
1453-
#define INST1(id, nm, fp, um, rf, wf, mr )
1454-
#define INST2(id, nm, fp, um, rf, wf, mr, mi ) mi,
1455-
#define INST3(id, nm, fp, um, rf, wf, mr, mi, rm ) mi,
1456-
#define INST4(id, nm, fp, um, rf, wf, mr, mi, rm, a4 ) mi,
1457-
#define INST5(id, nm, fp, um, rf, wf, mr, mi, rm, a4, rr) mi,
1449+
#define INST0(id, nm, um, mr, flags)
1450+
#define INST1(id, nm, um, mr, flags)
1451+
#define INST2(id, nm, um, mr, mi, flags) mi,
1452+
#define INST3(id, nm, um, mr, mi, rm, flags) mi,
1453+
#define INST4(id, nm, um, mr, mi, rm, a4, flags) mi,
1454+
#define INST5(id, nm, um, mr, mi, rm, a4, rr, flags) mi,
14581455
#include "instrs.h"
14591456
#undef INST0
14601457
#undef INST1
@@ -1489,12 +1486,12 @@ inline size_t insCodeMI(instruction ins)
14891486
const static
14901487
size_t insCodesMR[] =
14911488
{
1492-
#define INST0(id, nm, fp, um, rf, wf, mr )
1493-
#define INST1(id, nm, fp, um, rf, wf, mr ) mr,
1494-
#define INST2(id, nm, fp, um, rf, wf, mr, mi ) mr,
1495-
#define INST3(id, nm, fp, um, rf, wf, mr, mi, rm ) mr,
1496-
#define INST4(id, nm, fp, um, rf, wf, mr, mi, rm, a4 ) mr,
1497-
#define INST5(id, nm, fp, um, rf, wf, mr, mi, rm, a4, rr) mr,
1489+
#define INST0(id, nm, um, mr, flags)
1490+
#define INST1(id, nm, um, mr, flags) mr,
1491+
#define INST2(id, nm, um, mr, mi, flags) mr,
1492+
#define INST3(id, nm, um, mr, mi, rm, flags) mr,
1493+
#define INST4(id, nm, um, mr, mi, rm, a4, flags) mr,
1494+
#define INST5(id, nm, um, mr, mi, rm, a4, rr, flags) mr,
14981495
#include "instrs.h"
14991496
#undef INST0
15001497
#undef INST1

src/jit/instr.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ const char* CodeGen::genInsName(instruction ins)
3737
const char * const insNames[] =
3838
{
3939
#if defined(_TARGET_XARCH_)
40-
#define INST0(id, nm, fp, um, rf, wf, mr ) nm,
41-
#define INST1(id, nm, fp, um, rf, wf, mr ) nm,
42-
#define INST2(id, nm, fp, um, rf, wf, mr, mi ) nm,
43-
#define INST3(id, nm, fp, um, rf, wf, mr, mi, rm ) nm,
44-
#define INST4(id, nm, fp, um, rf, wf, mr, mi, rm, a4 ) nm,
45-
#define INST5(id, nm, fp, um, rf, wf, mr, mi, rm, a4, rr ) nm,
40+
#define INST0(id, nm, um, mr, flags) nm,
41+
#define INST1(id, nm, um, mr, flags) nm,
42+
#define INST2(id, nm, um, mr, mi, flags) nm,
43+
#define INST3(id, nm, um, mr, mi, rm, flags) nm,
44+
#define INST4(id, nm, um, mr, mi, rm, a4, flags) nm,
45+
#define INST5(id, nm, um, mr, mi, rm, a4, rr, flags) nm,
4646
#include "instrs.h"
4747

4848
#elif defined(_TARGET_ARM_)
@@ -215,7 +215,11 @@ bool CodeGenInterface::instIsFP(instruction ins)
215215
{
216216
assert((unsigned)ins < _countof(instInfo));
217217

218+
#ifdef _TARGET_XARCH_
219+
return (instInfo[ins] & INS_FLAGS_x87Instr) != 0;
220+
#else
218221
return (instInfo[ins] & INST_FP) != 0;
222+
#endif
219223
}
220224

221225
#ifdef _TARGET_XARCH_

src/jit/instr.h

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
enum instruction : unsigned
1616
{
1717
#if defined(_TARGET_XARCH_)
18-
#define INST0(id, nm, fp, um, rf, wf, mr ) INS_##id,
19-
#define INST1(id, nm, fp, um, rf, wf, mr ) INS_##id,
20-
#define INST2(id, nm, fp, um, rf, wf, mr, mi ) INS_##id,
21-
#define INST3(id, nm, fp, um, rf, wf, mr, mi, rm ) INS_##id,
22-
#define INST4(id, nm, fp, um, rf, wf, mr, mi, rm, a4 ) INS_##id,
23-
#define INST5(id, nm, fp, um, rf, wf, mr, mi, rm, a4, rr) INS_##id,
18+
#define INST0(id, nm, um, mr, flags) INS_##id,
19+
#define INST1(id, nm, um, mr, flags) INS_##id,
20+
#define INST2(id, nm, um, mr, mi, flags) INS_##id,
21+
#define INST3(id, nm, um, mr, mi, rm, flags) INS_##id,
22+
#define INST4(id, nm, um, mr, mi, rm, a4, flags) INS_##id,
23+
#define INST5(id, nm, um, mr, mi, rm, a4, rr, flags) INS_##id,
2424
#include "instrs.h"
2525

2626
#elif defined(_TARGET_ARM_)
@@ -86,13 +86,28 @@ enum GCtype : unsigned
8686
GCT_BYREF
8787
};
8888

89-
// TODO-Cleanup: Move 'insFlags' under _TARGET_ARM_
89+
#if defined(_TARGET_XARCH_)
90+
enum insFlags: uint8_t
91+
{
92+
INS_FLAGS_None = 0x00,
93+
INS_FLAGS_ReadsFlags = 0x01,
94+
INS_FLAGS_WritesFlags = 0x02,
95+
INS_FLAGS_x87Instr = 0x04,
96+
97+
// TODO-Cleanup: Remove this flag and its usage from _TARGET_XARCH_
98+
INS_FLAGS_DONT_CARE = 0x00,
99+
};
100+
#elif defined(_TARGET_ARM_) || defined(_TARGET_ARM64_)
101+
// TODO-Cleanup: Move 'insFlags' under _TARGET_ARM_
90102
enum insFlags: unsigned
91103
{
92-
INS_FLAGS_NOT_SET,
93-
INS_FLAGS_SET,
94-
INS_FLAGS_DONT_CARE
104+
INS_FLAGS_NOT_SET = 0x00,
105+
INS_FLAGS_SET = 0x01,
106+
INS_FLAGS_DONT_CARE = 0x02,
95107
};
108+
#else
109+
#error Unsupported target architecture
110+
#endif
96111

97112
#if defined(_TARGET_ARM_)
98113
enum insOpts: unsigned

0 commit comments

Comments
 (0)