mini-llvm 0.1.0
Loading...
Searching...
No Matches
FCvtUF.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
21
22namespace mini_llvm::mir {
23
25public:
26 FCvtUF(int dstWidth, Precision srcPrecision, std::shared_ptr<Register> dst, std::shared_ptr<Register> src)
27 : dstWidth_(dstWidth),
28 srcPrecision_(srcPrecision),
29 dst_(RegisterClass::kGPR, std::move(dst)),
30 src_(RegisterClass::kFPR, std::move(src)) {}
31
32 int dstWidth() const {
33 return dstWidth_;
34 }
35
37 return srcPrecision_;
38 }
39
40 template <typename Self>
41 auto &dst(this Self &&self) {
42 return self.dst_;
43 }
44
45 template <typename Self>
46 auto &src(this Self &&self) {
47 return self.src_;
48 }
49
50 std::unordered_set<const RegisterOperand *> regOps() const override {
51 return {&dst(), &src()};
52 }
53
54 std::unordered_set<const RegisterOperand *> dsts() const override {
55 return {&dst()};
56 }
57
58 std::unordered_set<const RegisterOperand *> srcs() const override {
59 return {&src()};
60 }
61
62 std::unordered_set<const ImmediateOperand *> immOps() const override {
63 return {};
64 }
65
66 std::unordered_set<const MemoryOperand *> memOps() const override {
67 return {};
68 }
69
70 bool hasSideEffects() const override {
71 return true;
72 }
73
74 std::string format() const override {
75 return std::format("FCVTUF i{} {} {}, {}", dstWidth() * 8, specifier(srcPrecision()), *dst(), *src());
76 }
77
78 std::unique_ptr<Instruction> clone() const override {
79 return std::make_unique<FCvtUF>(dstWidth(), srcPrecision(), share(*dst()), share(*src()));
80 }
81
82 void accept(InstructionVisitor &visitor) override {
83 visitor.visitFCvtUF(*this);
84 }
85
86 void accept(InstructionVisitor &visitor) const override {
87 visitor.visitFCvtUF(*this);
88 }
89
90private:
91 int dstWidth_;
92 Precision srcPrecision_;
93 RegisterOperand dst_, src_;
94};
95
96} // namespace mini_llvm::mir
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
int dstWidth() const
Definition FCvtUF.h:32
Precision srcPrecision() const
Definition FCvtUF.h:36
void accept(InstructionVisitor &visitor) override
Definition FCvtUF.h:82
std::unique_ptr< Instruction > clone() const override
Definition FCvtUF.h:78
auto & dst(this Self &&self)
Definition FCvtUF.h:41
FCvtUF(int dstWidth, Precision srcPrecision, std::shared_ptr< Register > dst, std::shared_ptr< Register > src)
Definition FCvtUF.h:26
bool hasSideEffects() const override
Definition FCvtUF.h:70
std::unordered_set< const ImmediateOperand * > immOps() const override
Definition FCvtUF.h:62
std::unordered_set< const MemoryOperand * > memOps() const override
Definition FCvtUF.h:66
void accept(InstructionVisitor &visitor) const override
Definition FCvtUF.h:86
auto & src(this Self &&self)
Definition FCvtUF.h:46
std::unordered_set< const RegisterOperand * > regOps() const override
Definition FCvtUF.h:50
std::string format() const override
Definition FCvtUF.h:74
std::unordered_set< const RegisterOperand * > srcs() const override
Definition FCvtUF.h:58
std::unordered_set< const RegisterOperand * > dsts() const override
Definition FCvtUF.h:54
Definition InstructionVisitor.h:70
virtual void visitFCvtUF(FCvtSF &I)
Definition InstructionVisitor.h:102
Definition RegisterOperand.h:13
Definition BasicBlock.h:22
constexpr const char * specifier(Condition cond)
Definition Condition.h:15
RegisterClass
Definition RegisterClass.h:7
@ kFPR
Definition RegisterClass.h:9
@ kGPR
Definition RegisterClass.h:8
std::shared_ptr< T > share(T &value)
Definition Memory.h:25
Precision
Definition Precision.h:7