blob: 5b03c3dbecc912489e25a5e77abe92a7cdc31fd2 (
plain)
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
|
#include "core/slang-basic.h"
#include "slang-ir.h"
namespace Slang
{
struct IROpMapEntry
{
IROp op;
IROpInfo info;
};
// TODO: We should ideally be speeding up the name->inst
// mapping by using a dictionary, or even by pre-computing
// a hash table to be stored as a `static const` array.
//
// NOTE! That this array is now constructed in such a way that looking up
// an entry from an op is fast, by keeping blocks of main, and pseudo ops in same order
// as the ops themselves. Care must be taken to keep this constraint.
static const IROpMapEntry kIROps[] = {
// Main ops in order
#if 0 // FIDDLE TEMPLATE:
% require("source/slang/slang-ir.h.lua").instInfoEntries()
#else // FIDDLE OUTPUT:
#define FIDDLE_GENERATED_OUTPUT_ID 0
#include "slang-ir-insts-info.cpp.fiddle"
#endif // FIDDLE END
// Invalid op sentinel value comes after all the valid ones
{kIROp_Invalid, {"invalid", 0, 0}},
};
IROpInfo getIROpInfo(IROp opIn)
{
const int op = opIn & kIROpMask_OpMask;
if (op < kIROpCount)
{
// It's a main op
const auto& entry = kIROps[op];
SLANG_ASSERT(entry.op == op);
return entry.info;
}
// Don't know what this is
SLANG_ASSERT(!"Invalid op");
SLANG_ASSERT(kIROps[kIROpCount].op == kIROp_Invalid);
return kIROps[kIROpCount].info;
}
IROp findIROp(const UnownedStringSlice& name)
{
for (auto ee : kIROps)
{
if (name == ee.info.name)
return ee.op;
}
return IROp(kIROp_Invalid);
}
} // namespace Slang
|