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