Skip to content

Commit db282f0

Browse files
committed
Added low to string translation
1 parent a45c69f commit db282f0

1 file changed

Lines changed: 186 additions & 39 deletions

File tree

src/main/kotlin/deep/decaf/low/amd64/LowIRClasses.kt

Lines changed: 186 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,43 +6,94 @@ import java.util.*
66
fun getUUID(): String = UUID.randomUUID().toString().replace("-", "")
77

88
sealed class Offset
9-
data class NumberOffset(val offset: Int) : Offset()
10-
data class StringOffset(val name: String) : Offset()
9+
data class NumberOffset(val offset: Int) : Offset() {
10+
override fun toString(): String {
11+
return "$offset"
12+
}
13+
}
14+
15+
data class StringOffset(val name: String) : Offset() {
16+
override fun toString(): String {
17+
return name
18+
}
19+
}
1120

1221

1322
sealed class Location
14-
data class ImmediateVal(val num: Int) : Location()
15-
data class Register(val name: String, val offset: Offset?) : Location() {
23+
data class ImmediateVal(val num: Int) : Location() {
24+
override fun toString(): String {
25+
return "\$$num"
26+
}
27+
}
28+
29+
data class Register(val name: String) : Location() {
1630
companion object {
17-
fun basePointer() = Register("rbp", null)
18-
fun stackPointer() = Register("rsp", null)
19-
fun instructionPointer() = Register("rip", null)
20-
fun returnRegister() = Register("rax", null)
21-
fun r10() = Register("r10", null)
22-
fun r10b() = Register("r10b", null)
23-
fun r11() = Register("r11", null)
24-
fun rax() = Register("rax", null)
25-
fun rdx() = Register("rdx", null)
31+
fun basePointer() = Register("rbp")
32+
fun stackPointer() = Register("rsp")
33+
fun instructionPointer() = Register("rip")
34+
fun returnRegister() = Register("rax")
35+
fun r10() = Register("r10")
36+
fun r10b() = Register("r10b")
37+
fun r11() = Register("r11")
38+
fun rax() = Register("rax")
39+
fun rdx() = Register("rdx")
40+
}
41+
42+
override fun toString(): String {
43+
return "%$name"
2644
}
2745
}
2846

29-
data class Label(val label: String) : Location()
30-
data class MemLoc(val reg: Register, val offset: NumberOffset) : Location()
31-
data class ArrayAsm(val name: String, val offsetRegister: Register) : Location()
47+
data class Label(val label: String) : Location() {
48+
override fun toString(): String {
49+
return label
50+
}
51+
}
52+
53+
data class MemLoc(val reg: Register, val offset: NumberOffset) : Location() {
54+
override fun toString(): String {
55+
return "$offset($reg)"
56+
}
57+
}
58+
59+
data class ArrayAsm(val name: String, val offsetRegister: Register) : Location() {
60+
override fun toString(): String {
61+
return "$name(, $offsetRegister, 8)"
62+
}
63+
}
3264

3365
enum class AsmCMoveOp {
3466
CMOVE,
3567
CMOVNE,
3668
CMOVG,
3769
CMOVL,
3870
CMOVGE,
39-
CMOVLE
71+
CMOVLE;
72+
73+
override fun toString(): String {
74+
return when (this) {
75+
CMOVE -> "cmove"
76+
CMOVNE -> "cmovne"
77+
CMOVG -> "cmovg"
78+
CMOVL -> "cmovl"
79+
CMOVGE -> "cmovge"
80+
CMOVLE -> "cmovle"
81+
}
82+
}
4083
}
4184

4285
enum class AsmJumpOp {
4386
JMP,
4487
JE,
45-
JNE
88+
JNE;
89+
90+
override fun toString(): String {
91+
return when (this) {
92+
JMP -> "jmp"
93+
JE -> "je"
94+
JNE -> "jne"
95+
}
96+
}
4697
}
4798

4899
enum class SetType {
@@ -51,30 +102,126 @@ enum class SetType {
51102
SETG,
52103
SETL,
53104
SETGE,
54-
SETLE
105+
SETLE;
106+
107+
override fun toString(): String {
108+
return when (this) {
109+
SETE -> "sete"
110+
SETNE -> "setne"
111+
SETG -> "setg"
112+
SETL -> "setl"
113+
SETGE -> "setge"
114+
SETLE -> "setle"
115+
}
116+
}
55117
}
56118

57119
sealed class Statement
58-
data class AddStatement(val src: Location, val dest: Location) : Statement()
59-
data class SubStatement(val src: Location, val dest: Location) : Statement()
60-
data class IMulStatement(val src: Location, val dest: Location) : Statement()
61-
data class IDivStatement(val src: Location) : Statement()
62-
data class CmpStatement(val src: Location, val dest: Location) : Statement()
63-
data class AndStatement(val src: Location, val dest: Location): Statement()
64-
data class OrStatement(val src: Location, val dest: Location): Statement()
65-
data class NotStatement(val src: Location) : Statement()
66-
data class NegStatement(val src: Location) : Statement()
67-
data class JumpStatement(val type: AsmJumpOp, val target: String) : Statement()
68-
data class MoveStatement(val src: Location, val dest: Location) : Statement()
69-
data class CMoveStatement(val type: AsmCMoveOp, val src: Register, val dest: Register) : Statement()
70-
data class SetStatement(val type: SetType, val reg: Register) : Statement()
71-
object SignedExtendStatement : Statement()
72-
object ReturnStatement : Statement()
73-
data class CallStatement(val label: String) : Statement()
74-
data class PushStatement(val src: Location) : Statement()
75-
data class PopStatement(val src: Location?) : Statement()
76-
object LeaveStatement : Statement()
77-
data class EnterStatement(val size: ImmediateVal) : Statement()
120+
data class AddStatement(val src: Location, val dest: Location) : Statement() {
121+
override fun toString(): String {
122+
return "add $src, $dest"
123+
}
124+
}
125+
126+
data class SubStatement(val src: Location, val dest: Location) : Statement() {
127+
override fun toString(): String {
128+
return "sub $src, $dest"
129+
}
130+
}
131+
132+
data class IMulStatement(val src: Location, val dest: Location) : Statement() {
133+
override fun toString(): String {
134+
return "imul $src, $dest"
135+
}
136+
}
137+
138+
data class IDivStatement(val src: Location) : Statement() {
139+
override fun toString(): String {
140+
return "idivq $src"
141+
}
142+
}
143+
144+
data class CmpStatement(val src: Location, val dest: Location) : Statement() {
145+
override fun toString(): String {
146+
return "cmp $src, $dest"
147+
}
148+
}
149+
150+
data class AndStatement(val src: Location, val dest: Location) : Statement() {
151+
override fun toString(): String {
152+
return "and $src, $dest"
153+
}
154+
}
155+
156+
data class OrStatement(val src: Location, val dest: Location) : Statement() {
157+
override fun toString(): String {
158+
return "or $src, $dest"
159+
}
160+
}
161+
162+
data class NotStatement(val src: Location) : Statement() {
163+
override fun toString(): String {
164+
return "not $src"
165+
}
166+
}
167+
168+
data class NegStatement(val src: Location) : Statement() {
169+
override fun toString(): String {
170+
return "nge $src"
171+
}
172+
}
173+
174+
data class JumpStatement(val type: AsmJumpOp, val target: String) : Statement() {
175+
override fun toString(): String {
176+
return "$type $target"
177+
}
178+
}
179+
180+
data class MoveStatement(val src: Location, val dest: Location) : Statement() {
181+
override fun toString(): String {
182+
return "mov $src, $dest"
183+
}
184+
}
185+
186+
data class CMoveStatement(val type: AsmCMoveOp, val src: Register, val dest: Register) : Statement() {
187+
override fun toString(): String {
188+
return "$type $src $dest"
189+
}
190+
}
191+
192+
data class SetStatement(val type: SetType, val reg: Register) : Statement() {
193+
override fun toString(): String {
194+
return "$type $reg"
195+
}
196+
}
197+
198+
object SignedExtendStatement : Statement() {
199+
override fun toString() = "cqto"
200+
}
201+
202+
object ReturnStatement : Statement() {
203+
override fun toString() = "ret"
204+
}
205+
206+
data class CallStatement(val label: String) : Statement() {
207+
override fun toString() = "call $label"
208+
}
209+
210+
data class PushStatement(val src: Location) : Statement() {
211+
override fun toString() = "push $src"
212+
}
213+
214+
data class PopStatement(val src: Location?) : Statement() {
215+
override fun toString() = "pop ${src ?: ""}"
216+
}
217+
218+
object LeaveStatement : Statement() {
219+
override fun toString() = "leave"
220+
}
221+
222+
data class EnterStatement(val size: ImmediateVal) : Statement() {
223+
override fun toString() = "enter \$($size*8), $0"
224+
}
78225

79226
data class Block(val label: String?, val statements: List<Statement>)
80227

0 commit comments

Comments
 (0)