mini-llvm 0.1.0
Loading...
Searching...
No Matches
Load.h
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2
3#pragma once
4
5#include <memory>
6#include <string>
7#include <unordered_set>
8#include <utility>
9
20
21namespace mini_llvm::mir {
22
24public:
26 std::shared_ptr<Register> dst,
29 : width_(width),
30 dst_(RegisterClass::kGPR, std::move(dst)),
31 src_(std::move(src)),
32 extMode_(extMode) {}
33
34 int width() const {
35 return width_;
36 }
37
38 template <typename Self>
39 auto &dst(this Self &&self) {
40 return self.dst_;
41 }
42
43 template <typename Self>
44 auto &src(this Self &&self) {
45 return self.src_;
46 }
47
49 return extMode_;
50 }
51
52 std::unordered_set<const RegisterOperand *> regOps() const override {
53 return {&dst(), &src().baseReg()};
54 }
55
56 std::unordered_set<const RegisterOperand *> dsts() const override {
57 return {&dst()};
58 }
59
60 std::unordered_set<const RegisterOperand *> srcs() const override {
61 return {&src().baseReg()};
62 }
63
64 std::unordered_set<const ImmediateOperand *> immOps() const override {
65 return {&src().offset()};
66 }
67
68 std::unordered_set<const MemoryOperand *> memOps() const override {
69 return {&src()};
70 }
71
72 bool hasSideEffects() const override {
73 return true;
74 }
75
76 std::string format() const override;
77
78 std::unique_ptr<Instruction> clone() const override {
79 return std::make_unique<Load>(width(), share(*dst()), src().clone(), extMode());
80 }
81
82 void accept(InstructionVisitor &visitor) override {
83 visitor.visitLoad(*this);
84 }
85
86 void accept(InstructionVisitor &visitor) const override {
87 visitor.visitLoad(*this);
88 }
89
90private:
91 int width_;
92 RegisterOperand dst_;
93 MemoryOperand src_;
94 ExtensionMode extMode_;
95};
96
97} // namespace mini_llvm::mir
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
Definition InstructionVisitor.h:70
virtual void visitLoad(Load &I)
Definition InstructionVisitor.h:115
Load(int width, std::shared_ptr< Register > dst, MemoryOperand src, ExtensionMode extMode=ExtensionMode::kNo)
Definition Load.h:25
int width() const
Definition Load.h:34
void accept(InstructionVisitor &visitor) const override
Definition Load.h:86
std::unordered_set< const RegisterOperand * > dsts() const override
Definition Load.h:56
auto & dst(this Self &&self)
Definition Load.h:39
std::unordered_set< const RegisterOperand * > regOps() const override
Definition Load.h:52
std::unique_ptr< Instruction > clone() const override
Definition Load.h:78
std::unordered_set< const ImmediateOperand * > immOps() const override
Definition Load.h:64
std::unordered_set< const RegisterOperand * > srcs() const override
Definition Load.h:60
std::string format() const override
auto & src(this Self &&self)
Definition Load.h:44
void accept(InstructionVisitor &visitor) override
Definition Load.h:82
std::unordered_set< const MemoryOperand * > memOps() const override
Definition Load.h:68
bool hasSideEffects() const override
Definition Load.h:72
ExtensionMode extMode() const
Definition Load.h:48
Definition MemoryOperand.h:20
Definition RegisterOperand.h:13
Definition BasicBlock.h:22
RegisterClass
Definition RegisterClass.h:7
@ kGPR
Definition RegisterClass.h:8
ExtensionMode
Definition ExtensionMode.h:7
@ kNo
Definition ExtensionMode.h:8
std::shared_ptr< T > share(T &value)
Definition Memory.h:25