mini-llvm
0.1.0
Toggle main menu visibility
Loading...
Searching...
No Matches
CmpBr.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
11
#include "
mini-llvm/mir/BasicBlock.h
"
12
#include "
mini-llvm/mir/BasicBlockOperand.h
"
13
#include "
mini-llvm/mir/Condition.h
"
14
#include "
mini-llvm/mir/ImmediateOperand.h
"
15
#include "
mini-llvm/mir/Instruction.h
"
16
#include "
mini-llvm/mir/Instruction/Terminator.h
"
17
#include "
mini-llvm/mir/InstructionVisitor.h
"
18
#include "
mini-llvm/mir/MemoryOperand.h
"
19
#include "
mini-llvm/mir/Register.h
"
20
#include "
mini-llvm/mir/RegisterClass.h
"
21
#include "
mini-llvm/mir/RegisterOperand.h
"
22
#include "
mini-llvm/utils/Compiler.h
"
23
24
namespace
mini_llvm::mir
{
25
26
class
MINI_LLVM_EXPORT
CmpBr
:
public
Terminator
{
27
public
:
28
CmpBr
(
int
width
,
29
Condition
cond
,
30
std::shared_ptr<Register>
src1
,
31
std::shared_ptr<Register>
src2
,
32
BasicBlock
*
trueDest
,
33
BasicBlock
*
falseDest
)
34
: width_(
width
),
35
cond_(
cond
),
36
src1_(
RegisterClass
::
kGPR
, std::move(
src1
)),
37
src2_(
RegisterClass
::
kGPR
, std::move(
src2
)),
38
trueDest_(
trueDest
),
39
falseDest_(
falseDest
) {}
40
41
int
width
()
const
{
42
return
width_;
43
}
44
45
Condition
cond
()
const
{
46
return
cond_;
47
}
48
49
void
setCond
(
Condition
cond
) {
50
cond_ =
cond
;
51
}
52
53
template
<
typename
Self>
54
auto
&
src1
(
this
Self &&self) {
55
return
self.src1_;
56
}
57
58
template
<
typename
Self>
59
auto
&
src2
(
this
Self &&self) {
60
return
self.src2_;
61
}
62
63
template
<
typename
Self>
64
auto
&
trueDest
(
this
Self &&self) {
65
return
self.trueDest_;
66
}
67
68
template
<
typename
Self>
69
auto
&
falseDest
(
this
Self &&self) {
70
return
self.falseDest_;
71
}
72
73
std::unordered_set<const BasicBlockOperand *>
blockOps
()
const override
{
74
return
{&
trueDest
(), &
falseDest
()};
75
}
76
77
std::unordered_set<const RegisterOperand *>
regOps
()
const override
{
78
return
{&
src1
(), &
src2
()};
79
}
80
81
std::unordered_set<const RegisterOperand *>
dsts
()
const override
{
82
return
{};
83
}
84
85
std::unordered_set<const RegisterOperand *>
srcs
()
const override
{
86
return
{&
src1
(), &
src2
()};
87
}
88
89
std::unordered_set<const ImmediateOperand *>
immOps
()
const override
{
90
return
{};
91
}
92
93
std::unordered_set<const MemoryOperand *>
memOps
()
const override
{
94
return
{};
95
}
96
97
std::string
format
()
const override
{
98
return
std::format(
99
"CMPBR i{} {} {}, {}, {:o}, {:o}"
,
100
width
() * 8,
specifier
(
cond
()), *
src1
(), *
src2
(), *
trueDest
(), *
falseDest
());
101
}
102
103
std::unique_ptr<Instruction>
clone
()
const override
{
104
return
std::make_unique<CmpBr>(
105
width
(),
cond
(),
share
(*
src1
()),
share
(*
src2
()), &*
trueDest
(), &*
falseDest
());
106
}
107
108
void
accept
(
InstructionVisitor
&visitor)
override
{
109
visitor.
visitCmpBr
(*
this
);
110
}
111
112
void
accept
(
InstructionVisitor
&visitor)
const override
{
113
visitor.
visitCmpBr
(*
this
);
114
}
115
116
private
:
117
int
width_;
118
Condition
cond_;
119
RegisterOperand
src1_, src2_;
120
BasicBlockOperand
trueDest_, falseDest_;
121
};
122
123
}
// namespace mini_llvm::mir
BasicBlockOperand.h
Compiler.h
MINI_LLVM_EXPORT
#define MINI_LLVM_EXPORT
Definition
Compiler.h:17
Condition.h
ImmediateOperand.h
MemoryOperand.h
RegisterClass.h
RegisterOperand.h
Register.h
mini_llvm::mir::BasicBlockOperand
Definition
BasicBlockOperand.h:9
mini_llvm::mir::BasicBlock
Definition
BasicBlock.h:24
mini_llvm::mir::CmpBr::memOps
std::unordered_set< const MemoryOperand * > memOps() const override
Definition
CmpBr.h:93
mini_llvm::mir::CmpBr::CmpBr
CmpBr(int width, Condition cond, std::shared_ptr< Register > src1, std::shared_ptr< Register > src2, BasicBlock *trueDest, BasicBlock *falseDest)
Definition
CmpBr.h:28
mini_llvm::mir::CmpBr::immOps
std::unordered_set< const ImmediateOperand * > immOps() const override
Definition
CmpBr.h:89
mini_llvm::mir::CmpBr::regOps
std::unordered_set< const RegisterOperand * > regOps() const override
Definition
CmpBr.h:77
mini_llvm::mir::CmpBr::setCond
void setCond(Condition cond)
Definition
CmpBr.h:49
mini_llvm::mir::CmpBr::falseDest
auto & falseDest(this Self &&self)
Definition
CmpBr.h:69
mini_llvm::mir::CmpBr::blockOps
std::unordered_set< const BasicBlockOperand * > blockOps() const override
Definition
CmpBr.h:73
mini_llvm::mir::CmpBr::dsts
std::unordered_set< const RegisterOperand * > dsts() const override
Definition
CmpBr.h:81
mini_llvm::mir::CmpBr::format
std::string format() const override
Definition
CmpBr.h:97
mini_llvm::mir::CmpBr::accept
void accept(InstructionVisitor &visitor) const override
Definition
CmpBr.h:112
mini_llvm::mir::CmpBr::srcs
std::unordered_set< const RegisterOperand * > srcs() const override
Definition
CmpBr.h:85
mini_llvm::mir::CmpBr::src2
auto & src2(this Self &&self)
Definition
CmpBr.h:59
mini_llvm::mir::CmpBr::src1
auto & src1(this Self &&self)
Definition
CmpBr.h:54
mini_llvm::mir::CmpBr::clone
std::unique_ptr< Instruction > clone() const override
Definition
CmpBr.h:103
mini_llvm::mir::CmpBr::cond
Condition cond() const
Definition
CmpBr.h:45
mini_llvm::mir::CmpBr::trueDest
auto & trueDest(this Self &&self)
Definition
CmpBr.h:64
mini_llvm::mir::CmpBr::accept
void accept(InstructionVisitor &visitor) override
Definition
CmpBr.h:108
mini_llvm::mir::CmpBr::width
int width() const
Definition
CmpBr.h:41
mini_llvm::mir::InstructionVisitor
Definition
InstructionVisitor.h:70
mini_llvm::mir::InstructionVisitor::visitCmpBr
virtual void visitCmpBr(CmpBr &I)
Definition
InstructionVisitor.h:87
mini_llvm::mir::RegisterOperand
Definition
RegisterOperand.h:13
mini_llvm::mir::Terminator
Definition
Terminator.h:13
BasicBlock.h
InstructionVisitor.h
Terminator.h
Instruction.h
mini_llvm::mir
Definition
BasicBlock.h:22
mini_llvm::mir::specifier
constexpr const char * specifier(Condition cond)
Definition
Condition.h:15
mini_llvm::mir::RegisterClass
RegisterClass
Definition
RegisterClass.h:7
mini_llvm::mir::RegisterClass::kGPR
@ kGPR
Definition
RegisterClass.h:8
mini_llvm::mir::Condition
Condition
Definition
Condition.h:9
mini_llvm::share
std::shared_ptr< T > share(T &value)
Definition
Memory.h:25
include
mini-llvm
mir
Instruction
CmpBr.h
Generated by
1.17.0