forked from pytorch/pytorch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
instruction.cpp
97 lines (88 loc) · 2.42 KB
/
instruction.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
86
87
88
89
90
91
92
93
94
95
96
97
#include <c10/util/irange.h>
#include <torch/csrc/jit/runtime/instruction.h>
#include <cstring>
#include <iostream>
namespace torch {
namespace jit {
std::ostream& operator<<(std::ostream& out, OpCode op) {
switch (op) {
#define OP_STRING(x, _) \
case x: \
return out << #x;
FORALL_OPCODES(OP_STRING)
#undef OP_STRING
}
return out;
}
char const* toString(OpCode op) {
switch (op) {
#define OP_STRING(x, _) \
case x: \
return #x;
FORALL_OPCODES(OP_STRING)
#undef OP_STRING
}
return nullptr;
}
const char* OpInfo(OpCode op) {
switch (op) {
#define OP_INFO(x, info) \
case x: \
return info;
// NOLINTNEXTLINE(bugprone-branch-clone)
FORALL_OPCODES(OP_INFO)
#undef OP_INFO
}
return nullptr;
}
static constexpr size_t instruction_size = 8;
static_assert(
sizeof(Instruction) == instruction_size,
"Instructions should be 8 bytes");
std::ostream& operator<<(std::ostream& out, Instruction inst) {
// TODO: use op info to print out the op in a more user-friendly way
int nargs = std::strlen(OpInfo(inst.op));
out << inst.op;
if (nargs > 0) {
out << " " << inst.X;
}
if (nargs > 1) {
out << " " << inst.N;
}
return out;
}
// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
static constexpr const char* strOpCode[] = {
#define STR_OP(x, _) #x,
FORALL_OPCODES(STR_OP)
#undef STR_OP
};
OpCode parseOpCode(const char* str) {
const int n = sizeof(strOpCode) / sizeof(strOpCode[0]);
for (const auto i : c10::irange(n)) {
if (strcmp(strOpCode[i], str) == 0)
return (OpCode)i;
}
return OP;
}
bool isOpSupportedInMobile(OpCode op) {
// clang-format off
// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
static constexpr OpCode supported_ops_in_mobile[] {
OP, OPN, LOAD, MOVE, STOREN, STORE, DROP, DROPR, LOADC, JF, JMP, LOOP,
RET, GET_ATTR, SET_ATTR, LIST_CONSTRUCT, TUPLE_CONSTRUCT, WARN,
INTERFACE_CALL, LIST_UNPACK, TUPLE_SLICE, DICT_CONSTRUCT,
NAMED_TUPLE_CONSTRUCT, CREATE_OBJECT, ISINSTANCE, CALL,
RAISE_EXCEPTION, UNCHECKED_CAST, __IS__, UN_INITIALIZED,
__ISNOT__, FORMAT, DEVICE, DICT_INDEX,
DTYPE, TUPLE_INDEX, DIM, __NOT__,
TO_LIST, NUM_TO_TENSOR, IS_CUDA};
// clang-format on
for (auto sop : supported_ops_in_mobile) {
if (op == sop)
return true;
}
return false;
}
} // namespace jit
} // namespace torch