1
2
3
4
5 package ppc64asm
6
7 import (
8 "bytes"
9 "fmt"
10 )
11
12 type Inst struct {
13 Op Op
14 Enc uint32
15 Len int
16 SuffixEnc uint32
17 Args Args
18 }
19
20 func (i Inst) String() string {
21 var buf bytes.Buffer
22 buf.WriteString(i.Op.String())
23 for j, arg := range i.Args {
24 if arg == nil {
25 break
26 }
27 if j == 0 {
28 buf.WriteString(" ")
29 } else {
30 buf.WriteString(", ")
31 }
32 buf.WriteString(arg.String())
33 }
34 return buf.String()
35 }
36
37
38 type Op uint16
39
40 func (o Op) String() string {
41 if int(o) >= len(opstr) || opstr[o] == "" {
42 return fmt.Sprintf("Op(%d)", int(o))
43 }
44 return opstr[o]
45 }
46
47
48 type Arg interface {
49 IsArg()
50 String() string
51 }
52
53
54
55
56 type Args [6]Arg
57
58
59
60 type Reg uint16
61
62 const (
63 _ Reg = iota
64 R0
65 R1
66 R2
67 R3
68 R4
69 R5
70 R6
71 R7
72 R8
73 R9
74 R10
75 R11
76 R12
77 R13
78 R14
79 R15
80 R16
81 R17
82 R18
83 R19
84 R20
85 R21
86 R22
87 R23
88 R24
89 R25
90 R26
91 R27
92 R28
93 R29
94 R30
95 R31
96 F0
97 F1
98 F2
99 F3
100 F4
101 F5
102 F6
103 F7
104 F8
105 F9
106 F10
107 F11
108 F12
109 F13
110 F14
111 F15
112 F16
113 F17
114 F18
115 F19
116 F20
117 F21
118 F22
119 F23
120 F24
121 F25
122 F26
123 F27
124 F28
125 F29
126 F30
127 F31
128 V0
129 V1
130 V2
131 V3
132 V4
133 V5
134 V6
135 V7
136 V8
137 V9
138 V10
139 V11
140 V12
141 V13
142 V14
143 V15
144 V16
145 V17
146 V18
147 V19
148 V20
149 V21
150 V22
151 V23
152 V24
153 V25
154 V26
155 V27
156 V28
157 V29
158 V30
159 V31
160 VS0
161 VS1
162 VS2
163 VS3
164 VS4
165 VS5
166 VS6
167 VS7
168 VS8
169 VS9
170 VS10
171 VS11
172 VS12
173 VS13
174 VS14
175 VS15
176 VS16
177 VS17
178 VS18
179 VS19
180 VS20
181 VS21
182 VS22
183 VS23
184 VS24
185 VS25
186 VS26
187 VS27
188 VS28
189 VS29
190 VS30
191 VS31
192 VS32
193 VS33
194 VS34
195 VS35
196 VS36
197 VS37
198 VS38
199 VS39
200 VS40
201 VS41
202 VS42
203 VS43
204 VS44
205 VS45
206 VS46
207 VS47
208 VS48
209 VS49
210 VS50
211 VS51
212 VS52
213 VS53
214 VS54
215 VS55
216 VS56
217 VS57
218 VS58
219 VS59
220 VS60
221 VS61
222 VS62
223 VS63
224 A0
225 A1
226 A2
227 A3
228 A4
229 A5
230 A6
231 A7
232 )
233
234 func (Reg) IsArg() {}
235 func (r Reg) String() string {
236 switch {
237 case R0 <= r && r <= R31:
238 return fmt.Sprintf("r%d", int(r-R0))
239 case F0 <= r && r <= F31:
240 return fmt.Sprintf("f%d", int(r-F0))
241 case V0 <= r && r <= V31:
242 return fmt.Sprintf("v%d", int(r-V0))
243 case VS0 <= r && r <= VS63:
244 return fmt.Sprintf("vs%d", int(r-VS0))
245 case A0 <= r && r <= A7:
246 return fmt.Sprintf("a%d", int(r-A0))
247 default:
248 return fmt.Sprintf("Reg(%d)", int(r))
249 }
250 }
251
252
253 type CondReg int8
254
255 const (
256 _ CondReg = iota
257
258 Cond0LT
259 Cond0GT
260 Cond0EQ
261 Cond0SO
262 Cond1LT
263 Cond1GT
264 Cond1EQ
265 Cond1SO
266 Cond2LT
267 Cond2GT
268 Cond2EQ
269 Cond2SO
270 Cond3LT
271 Cond3GT
272 Cond3EQ
273 Cond3SO
274 Cond4LT
275 Cond4GT
276 Cond4EQ
277 Cond4SO
278 Cond5LT
279 Cond5GT
280 Cond5EQ
281 Cond5SO
282 Cond6LT
283 Cond6GT
284 Cond6EQ
285 Cond6SO
286 Cond7LT
287 Cond7GT
288 Cond7EQ
289 Cond7SO
290
291 CR0
292 CR1
293 CR2
294 CR3
295 CR4
296 CR5
297 CR6
298 CR7
299 )
300
301 func (CondReg) IsArg() {}
302 func (c CondReg) String() string {
303 switch {
304 default:
305 return fmt.Sprintf("CondReg(%d)", int(c))
306 case c >= CR0:
307 return fmt.Sprintf("CR%d", int(c-CR0))
308 case c >= Cond0LT && c < CR0:
309 return fmt.Sprintf("Cond%d%s", int((c-Cond0LT)/4), [4]string{"LT", "GT", "EQ", "SO"}[(c-Cond0LT)%4])
310 }
311 }
312
313
314 type SpReg uint16
315
316 const (
317 SpRegZero SpReg = 0
318 )
319
320 func (SpReg) IsArg() {}
321 func (s SpReg) String() string {
322 return fmt.Sprintf("SpReg(%d)", int(s))
323 }
324
325
326 type PCRel int32
327
328 func (PCRel) IsArg() {}
329 func (r PCRel) String() string {
330 return fmt.Sprintf("PC%+#x", int32(r))
331 }
332
333
334 type Label uint32
335
336 func (Label) IsArg() {}
337 func (l Label) String() string {
338 return fmt.Sprintf("%#x", uint32(l))
339 }
340
341
342 type Imm int64
343
344 func (Imm) IsArg() {}
345 func (i Imm) String() string {
346 return fmt.Sprintf("%d", int32(i))
347 }
348
349
350 type Offset int64
351
352 func (Offset) IsArg() {}
353 func (o Offset) String() string {
354 return fmt.Sprintf("%+d", int32(o))
355 }
356
View as plain text