@@ -6,43 +6,94 @@ import java.util.*
66fun getUUID (): String = UUID .randomUUID().toString().replace(" -" , " " )
77
88sealed 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
1322sealed 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
3365enum 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
4285enum 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
4899enum 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
57119sealed 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
79226data class Block (val label : String? , val statements : List <Statement >)
80227
0 commit comments