-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathInplaceOp.cpp
More file actions
78 lines (75 loc) · 2.27 KB
/
InplaceOp.cpp
File metadata and controls
78 lines (75 loc) · 2.27 KB
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
#include "InplaceOp.hpp"
#include "runtime/PyObject.hpp"
#include "runtime/Value.hpp"
#include "vm/VM.hpp"
using namespace py;
PyResult<Value> InplaceOp::execute(VirtualMachine &vm, Interpreter &interpreter) const
{
auto &lhs = vm.reg(m_lhs);
const auto &rhs = vm.reg(m_rhs);
auto result = [this, &lhs, &rhs, &interpreter] {
switch (m_operation) {
case Operation::PLUS: {
[[maybe_unused]] RAIIStoreNonCallInstructionData non_call_instruction_data;
return add(lhs, rhs, interpreter);
} break;
case Operation::MINUS: {
[[maybe_unused]] RAIIStoreNonCallInstructionData non_call_instruction_data;
return subtract(lhs, rhs, interpreter);
} break;
case Operation::MODULO: {
[[maybe_unused]] RAIIStoreNonCallInstructionData non_call_instruction_data;
return modulo(lhs, rhs, interpreter);
} break;
case Operation::MULTIPLY: {
[[maybe_unused]] RAIIStoreNonCallInstructionData non_call_instruction_data;
return multiply(lhs, rhs, interpreter);
} break;
case Operation::EXP: {
[[maybe_unused]] RAIIStoreNonCallInstructionData non_call_instruction_data;
return exp(lhs, rhs, interpreter);
} break;
case Operation::SLASH: {
[[maybe_unused]] RAIIStoreNonCallInstructionData non_call_instruction_data;
return true_divide(lhs, rhs, interpreter);
} break;
case Operation::FLOORDIV: {
TODO();
} break;
case Operation::MATMUL: {
TODO();
} break;
case Operation::LEFTSHIFT: {
[[maybe_unused]] RAIIStoreNonCallInstructionData non_call_instruction_data;
return lshift(lhs, rhs, interpreter);
} break;
case Operation::RIGHTSHIFT: {
TODO();
} break;
case Operation::AND: {
[[maybe_unused]] RAIIStoreNonCallInstructionData non_call_instruction_data;
return and_(lhs, rhs, interpreter);
} break;
case Operation::OR: {
[[maybe_unused]] RAIIStoreNonCallInstructionData non_call_instruction_data;
return or_(lhs, rhs, interpreter);
} break;
case Operation::XOR: {
[[maybe_unused]] RAIIStoreNonCallInstructionData non_call_instruction_data;
return xor_(lhs, rhs, interpreter);
} break;
}
ASSERT_NOT_REACHED();
}();
if (result.is_ok()) { lhs = result.unwrap(); }
return result;
}
std::vector<uint8_t> InplaceOp::serialize() const
{
return {
INPLACE_OP,
m_lhs,
m_rhs,
static_cast<uint8_t>(m_operation),
};
}