x86.ml 165 KB
Newer Older
mb0's avatar
Track.  
mb0 committed
1
granularity = 8
mb0's avatar
mb0 committed
2
export = decode
mb0's avatar
Track.  
mb0 committed
3
4
5
6
7
8
9
10
11
12
13
14
15

# Optional arguments
#
# Limit:
#   - Restricts the maximium size of the decode-stream
# Recursion-depth:
#   - Annotate the maximum number of recursion steps for
#     the given decoder. This way, we can compute an upper
#     bound for the maximum used storage for the emitted AST.
#     Additionally, the decoder may fail if during runtime
#     a recrusion depth violation occurs.
#
# limit = 120
mb0's avatar
mb0 committed
16
# recursion-depth = p64 = 4
mb0's avatar
Track.  
mb0 committed
17
18

val decode = do
Axel Simon's avatar
Axel Simon committed
19
20
21
22
23
24
   update @{tab=void};
   main
end

val main = do
   t <- query $tab;
mb0's avatar
Track.  
mb0 committed
25
26
27
28
29
30
31
32
33
34
35
   update
      @{mode64='1',
        repne='0',
        rep='0',
        rex='0',
        rexw='0',
        rexb='0',
        rexr='0',
        rexx='0',
        opndsz='0',
        addrsz='0',
mb0's avatar
mb0 committed
36
        lock='0',
Julian Kranz's avatar
Julian Kranz committed
37
        segment=SEG_NONE,
38
	default-operand-size=32,
Axel Simon's avatar
Axel Simon committed
39
40
41
42
43
        ptrty=32, #TODO: check
        ~tab};
   instr <- p64;
   update @{tab=t};
   return instr
mb0's avatar
Track.  
mb0 committed
44
45
end

Axel Simon's avatar
Axel Simon committed
46
47
val complement v = not v

Axel Simon's avatar
Axel Simon committed
48
49
# Segment prefix handling
type seg_override =
Julian Kranz's avatar
Julian Kranz committed
50
     SEG_NONE
Axel Simon's avatar
Axel Simon committed
51
52
   | SEG_OVERRIDE of register

Julian Kranz's avatar
Julian Kranz committed
53
54
55
val set-CS = update@{segment=SEG_OVERRIDE CS}
val set-DS = update@{segment=SEG_OVERRIDE DS}
val set-ES = update@{segment=SEG_OVERRIDE ES}
Axel Simon's avatar
Axel Simon committed
56
57
val set-FS = update@{segment=SEG_OVERRIDE FS}
val set-GS = update@{segment=SEG_OVERRIDE GS}
Julian Kranz's avatar
Julian Kranz committed
58
val set-SS = update@{segment=SEG_OVERRIDE SS}
Axel Simon's avatar
Axel Simon committed
59

mb0's avatar
mb0 committed
60
val set-lock = update@{lock='1'}
mb0's avatar
Track.  
mb0 committed
61
62
val set-addrsz = update@{addrsz='1'}

63
64
val opndsz-set-from-d = return void

mb0's avatar
Track.  
mb0 committed
65
66
## Decoding prefixes

mb0's avatar
mb0 committed
67
# The functions 'after' and 'continue' are used to try different decoders
Axel Simon's avatar
Axel Simon committed
68
69
70
# in sequence. The first function takes two arguments and runs the first
# one until it calls 'continue', at which point the second decoder is run.

mb0's avatar
mb0 committed
71
val after fst snd = do
72
73
74
  update@{tab=snd};
  r <- fst;
  # make the type checker happy
Axel Simon's avatar
Axel Simon committed
75
  update@{~tab};
76
  return r
Axel Simon's avatar
Axel Simon committed
77
78
79
end

val continue = do
80
81
  t <- query$tab;
  # make the type checker happy
Julian Kranz's avatar
Julian Kranz committed
82
  update@{~tab};
83
84
  # make the type checker happy
  r <- t;
Axel Simon's avatar
Axel Simon committed
85
  update@{~tab};
86
  return r
Axel Simon's avatar
Axel Simon committed
87
88
end

Julian Kranz's avatar
Julian Kranz committed
89
90
91
92
#val after fst snd = do
#   update@{tab=snd};
#   fst
#end
Julian Kranz's avatar
Julian Kranz committed
93
#
Julian Kranz's avatar
Julian Kranz committed
94
95
96
97
#val continue = do
#   t <- query$tab;
#   t
#end
98

Axel Simon's avatar
Axel Simon committed
99
100
101
102
val /66 [] = continue
val /f2 [] = continue
val /f3 [] = continue

Axel Simon's avatar
Axel Simon committed
103
104
105
106
val /rex-p ['0100 w:1 r:1 x:1 b:1'] =
   update @{rex='1', rexw=w, rexb=b, rexx=x, rexr=r}
val clear-rex = update @{rex='0',rexw='0',rexb='0',rexr='0',rexx='0'}

mb0's avatar
mb0 committed
107
108
109
110
111
112
113
114
val /legacy-p [0x2e] = do clear-rex; set-CS end
val /legacy-p [0x36] = do clear-rex; set-SS end
val /legacy-p [0x3e] = do clear-rex; set-DS end
val /legacy-p [0x26] = do clear-rex; set-ES end
val /legacy-p [0x64] = do clear-rex; set-FS end
val /legacy-p [0x65] = do clear-rex; set-GS end
val /legacy-p [0x67] = do clear-rex; set-addrsz end
val /legacy-p [0xf0] = do clear-rex; set-lock end
mb0's avatar
Track.  
mb0 committed
115

Julian Kranz's avatar
Julian Kranz committed
116
117
118
val /66-p [0x66] = clear-rex
val /f2-p [0xf2] = clear-rex
val /f3-p [0xf3] = clear-rex
Julian Kranz's avatar
Julian Kranz committed
119

mb0's avatar
mb0 committed
120
val p/vex/0f [0xc4 'r:1 x:1 b:1 00001' 'w:1 v:4 l:1 00'] = do
mb0's avatar
mb0 committed
121
122
123
124
125
126
127
128
   update
      @{rex='1',
        rexw=w,
        vexw=w,
        rexr=not r,
        rexb=not b,
        rexx=not x,
        vexl=l,
129
        vexv=complement v,
mb0's avatar
mb0 committed
130
131
132
        vexm='00001'}
end

mb0's avatar
mb0 committed
133
val p/vex/0f [0xc5 'r:1 v:4 l:1 00'] = do
mb0's avatar
mb0 committed
134
135
136
137
138
139
   update
      @{rex='1',
        rexw='0',
        vexw='0',
        rexr=not r,
        vexl=l,
140
        vexv=complement v,
mb0's avatar
mb0 committed
141
142
143
        vexm='00001'} #TODO: sane default value for vexm,rexw,rexb,..
end

mb0's avatar
mb0 committed
144
val p/vex/66/0f [0xc4 'r:1 x:1 b:1 00001' 'w:1 v:4 l:1 01'] = do
mb0's avatar
mb0 committed
145
146
147
148
149
150
151
152
   update
      @{rex='1',
        rexw=w,
        vexw=w,
        rexr=not r,
        rexb=not b,
        rexx=not x,
        vexl=l,
153
        vexv=complement v,
Julian Kranz's avatar
Julian Kranz committed
154

mb0's avatar
mb0 committed
155
156
157
        vexm='00001'}
end

mb0's avatar
mb0 committed
158
val p/vex/66/0f [0xc5 'r:1 v:4 l:1 01'] = do
mb0's avatar
mb0 committed
159
160
161
162
163
164
   update
      @{rex='1',
        rexw='0',
        vexw='0',
        rexr=not r,
        vexl=l,
165
        vexv=complement v,
mb0's avatar
mb0 committed
166
167
168
        vexm='00001'} #TODO: sane default value for vexm,rexw,rexb,..
end

mb0's avatar
mb0 committed
169
val p/vex/f3/0f [0xc4 'r:1 x:1 b:1 00001' 'w:1 v:4 l:1 10'] = do
mb0's avatar
mb0 committed
170
171
172
173
174
175
176
177
   update
      @{rex='1',
        rexw=w,
        vexw=w,
        rexr=not r,
        rexb=not b,
        rexx=not x,
        vexl=l,
178
        vexv=complement v,
mb0's avatar
mb0 committed
179
180
181
        vexm='00001'}
end

mb0's avatar
mb0 committed
182
val p/vex/f3/0f [0xc5 'r:1 v:4 l:1 10'] = do
mb0's avatar
mb0 committed
183
184
185
186
187
188
   update
      @{rex='1',
        rexw='0',
        vexw='0',
        rexr=not r,
        vexl=l,
189
        vexv=complement v,
mb0's avatar
mb0 committed
190
191
192
        vexm='00001'} #TODO: sane default value for vexm,rexw,rexb,..
end

mb0's avatar
mb0 committed
193
val p/vex/f2/0f [0xc4 'r:1 x:1 b:1 00001' 'w:1 v:4 l:1 11'] = do
mb0's avatar
mb0 committed
194
195
196
197
198
199
200
201
   update
      @{rex='1',
        rexw=w,
        vexw=w,
        rexr=not r,
        rexb=not b,
        rexx=not x,
        vexl=l,
202
        vexv=complement v,
mb0's avatar
mb0 committed
203
204
205
        vexm='00001'}
end

mb0's avatar
mb0 committed
206
val p/vex/f2/0f [0xc5 'r:1 v:4 l:1 11'] = do
mb0's avatar
mb0 committed
207
208
209
210
211
212
   update
      @{rex='1',
        rexw='0',
        vexw='0',
        rexr=not r,
        vexl=l,
213
        vexv=complement v,
mb0's avatar
mb0 committed
214
215
216
        vexm='00001'} #TODO: sane default value for vexm,rexw,rexb,..
end

mb0's avatar
mb0 committed
217
val p/vex/0f/38 [0xc4 'r:1 x:1 b:1 00010' 'w:1 v:4 l:1 00'] = do
mb0's avatar
mb0 committed
218
219
220
221
222
223
224
225
   update
      @{rex='1',
        rexw=w,
        vexw=w,
        rexr=not r,
        rexb=not b,
        rexx=not x,
        vexl=l,
226
        vexv=complement v,
mb0's avatar
mb0 committed
227
228
229
        vexm='00010'}
end

mb0's avatar
mb0 committed
230
val p/vex/66/0f/38 [0xc4 'r:1 x:1 b:1 00010' 'w:1 v:4 l:1 01'] = do
mb0's avatar
mb0 committed
231
232
233
234
235
236
237
238
   update
      @{rex='1',
        rexw=w,
        vexw=w,
        rexr=not r,
        rexb=not b,
        rexx=not x,
        vexl=l,
239
        vexv=complement v,
mb0's avatar
mb0 committed
240
241
242
        vexm='00010'}
end

mb0's avatar
mb0 committed
243
val p/vex/f2/0f/38 [0xc4 'r:1 x:1 b:1 00010' 'w:1 v:4 l:1 11'] = do
mb0's avatar
mb0 committed
244
245
246
247
248
249
250
251
   update
      @{rex='1',
        rexw=w,
        vexw=w,
        rexr=not r,
        rexb=not b,
        rexx=not x,
        vexl=l,
252
        vexv=complement v,
mb0's avatar
mb0 committed
253
254
255
        vexm='00010'}
end

mb0's avatar
mb0 committed
256
val p/vex/f3/0f/38 [0xc4 'r:1 x:1 b:1 00010' 'w:1 v:4 l:1 10'] = do
mb0's avatar
mb0 committed
257
258
259
260
261
262
263
264
   update
      @{rex='1',
        rexw=w,
        vexw=w,
        rexr=not r,
        rexb=not b,
        rexx=not x,
        vexl=l,
265
        vexv=complement v,
mb0's avatar
mb0 committed
266
267
268
        vexm='00010'}
end

mb0's avatar
mb0 committed
269
val p/vex/0f/3a [0xc4 'r:1 x:1 b:1 00011' 'w:1 v:4 l:1 00'] = do
mb0's avatar
mb0 committed
270
271
272
273
274
275
276
277
   update
      @{rex='1',
        rexw=w,
        vexw=w,
        rexr=not r,
        rexb=not b,
        rexx=not x,
        vexl=l,
278
        vexv=complement v,
mb0's avatar
mb0 committed
279
280
281
        vexm='00011'}
end

mb0's avatar
mb0 committed
282
val p/vex/66/0f/3a [0xc4 'r:1 x:1 b:1 00011' 'w:1 v:4 l:1 01'] = do
mb0's avatar
mb0 committed
283
284
285
286
287
288
289
290
   update
      @{rex='1',
        rexw=w,
        vexw=w,
        rexr=not r,
        rexb=not b,
        rexx=not x,
        vexl=l,
291
        vexv=complement v,
mb0's avatar
mb0 committed
292
293
294
        vexm='00011'}
end

mb0's avatar
mb0 committed
295
val p/vex/f2/0f/3a [0xc4 'r:1 x:1 b:1 00011' 'w:1 v:4 l:1 11'] = do
mb0's avatar
mb0 committed
296
297
   update
      @{rex='1',
Julian Kranz's avatar
Julian Kranz committed
298
	rexw=w,
mb0's avatar
mb0 committed
299
300
301
302
303
        vexw=w,
        rexr=not r,
        rexb=not b,
        rexx=not x,
        vexl=l,
304
        vexv=complement v,
mb0's avatar
mb0 committed
305
306
307
        vexm='00011'}
end

mb0's avatar
mb0 committed
308
val p/vex/f3/0f/3a [0xc4 'r:1 x:1 b:1 00011' 'w:1 v:4 l:1 10'] = do
mb0's avatar
mb0 committed
309
310
311
312
313
314
315
316
   update
      @{rex='1',
        rexw=w,
        vexw=w,
        rexr=not r,
        rexb=not b,
        rexx=not x,
        vexl=l,
317
        vexv=complement v,
mb0's avatar
mb0 committed
318
319
320
        vexm='00011'}
end

Julian Kranz's avatar
Julian Kranz committed
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
val set-opndsz = update@{opndsz='1'}
val set-repne = update@{repne='1'}
val set-rep = update@{rep='1'}

val with-66 act = do
  update@{opndsz='1'};
  insn <- act;
  update@{opndsz='0'};
  return insn
end

val with-f2 act = do
  update@{repne='1'};
  insn <- act;
  update@{repne='0'};
  return insn
end

val with-f3 act = do
  update@{rep='1'};
  insn <- act;
  update@{rep='0'};
  return insn
end

Julian Kranz's avatar
Julian Kranz committed
346
347
348
val p64 [/66-p] = p/66
val p64 [/f2-p] = p/f2
val p64 [/f3-p] = p/f3
mb0's avatar
Track.  
mb0 committed
349
val p64 [/legacy-p] = p64
Julian Kranz's avatar
Julian Kranz committed
350
351
val p64 [/rex-p]
 | mode64? = p64
Julian Kranz's avatar
Julian Kranz committed
352
353
 | mode32? & rexw? = unop DEC rex/reg32
 | mode32? & // rexw? = unop INC rex/reg32
mb0's avatar
mb0 committed
354
#val p64 [p/vex/0f] = /vex/0f
Julian Kranz's avatar
Julian Kranz committed
355
356
357
358
359
val p64 [p/vex/f2/0f]
 | vndd? = /vex/f2/0f/vexv
 | otherwise = /vex/f2/0f
val p64 [p/vex/f3/0f]
 | vndd? = /vex/f3/0f/vexv
Julian Kranz's avatar
Julian Kranz committed
360
 | otherwise = /vex/f3/0f
Julian Kranz's avatar
Julian Kranz committed
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
val p64 [p/vex/66/0f]
 | vndd? = /vex/66/0f/vexv
 | otherwise = /vex/66/0f
val p64 [p/vex/66/0f/38]
 | vndd? = /vex/66/0f/38/vexv
 | otherwise = /vex/66/0f/38
val p64 [p/vex/66/0f/3a]
 | vndd? = /vex/66/0f/3a/vexv
 | otherwise = /vex/66/0f/3a
#val p64 [p/vex/66/f2/0f]
# | vndd? = /vex/66/f2/0f/vexv
# | otherwise = /vex/66/f2/0f
#val p64 [p/vex/66/f3/0f]
# | vndd? = /vex/66/f3/0f/vexv
# | otherwise = /vex/66/f3/0f
mb0's avatar
mb0 committed
376
val p64 [] = /
mb0's avatar
Track.  
mb0 committed
377

Julian Kranz's avatar
Julian Kranz committed
378
379
380
val p/66 [/66-p] = p/66/f2
val p/66 [/f2-p] = p/66/f3
val p/66 [/f3-p] = p/66
mb0's avatar
mb0 committed
381
val p/66 [/legacy-p] = p/66
Julian Kranz's avatar
Julian Kranz committed
382
383
val p/66 [/rex-p]
 | mode64? = p/66
Julian Kranz's avatar
Julian Kranz committed
384
385
 | mode32? & rexw? = unop DEC rex/reg16
 | mode32? & // rexw? = unop INC rex/reg16
Julian Kranz's avatar
Julian Kranz committed
386
val p/66 [] = after /66 (with-66 /)
mb0's avatar
Track.  
mb0 committed
387

Julian Kranz's avatar
Julian Kranz committed
388
389
390
val p/f2 [/66-p] = p/66/f2
val p/f2 [/f2-p] = p/f2
val p/f2 [/f3-p] = p/f2/f3
mb0's avatar
mb0 committed
391
val p/f2 [/legacy-p] = p/f2
Julian Kranz's avatar
Julian Kranz committed
392
393
val p/f2 [/rex-p]
 | mode64? = p/f2
Julian Kranz's avatar
Julian Kranz committed
394
395
 | mode32? & rexw? = unop DEC rex/reg32
 | mode32? & // rexw? = unop INC rex/reg32
Julian Kranz's avatar
Julian Kranz committed
396
val p/f2 [] = after /f2 (with-f2 /)
mb0's avatar
Track.  
mb0 committed
397

Julian Kranz's avatar
Julian Kranz committed
398
399
400
val p/f3 [/66-p] = p/66/f3
val p/f3 [/f2-p] = p/f3/f2
val p/f3 [/f3-p] = p/f3
mb0's avatar
mb0 committed
401
val p/f3 [/legacy-p] = p/f3
Julian Kranz's avatar
Julian Kranz committed
402
403
val p/f3 [/rex-p]
 | mode64? = p/f3
Julian Kranz's avatar
Julian Kranz committed
404
405
 | mode32? & rexw? = unop DEC rex/reg32
 | mode32? & // rexw? = unop INC rex/reg32
Julian Kranz's avatar
Julian Kranz committed
406
val p/f3 [] = after /f3 (with-f3 /)
mb0's avatar
Track.  
mb0 committed
407

Julian Kranz's avatar
Julian Kranz committed
408
409
410
val p/f2/f3 [/66-p] = p/66/f2/f3
val p/f2/f3 [/f2-p] = p/f3/f2
val p/f2/f3 [/f3-p] = p/f2/f3
mb0's avatar
mb0 committed
411
val p/f2/f3 [/legacy-p] = p/f2/f3
Julian Kranz's avatar
Julian Kranz committed
412
413
val p/f2/f3 [/rex-p]
 | mode64? = p/f2/f3
Julian Kranz's avatar
Julian Kranz committed
414
415
 | mode32? & rexw? = unop DEC rex/reg32
 | mode32? & // rexw? = unop INC rex/reg32
Julian Kranz's avatar
Julian Kranz committed
416
417
val p/f2/f3 [] = after (with-f2 /f3) (
                 after (with-f3 /f2) (with-f2 (with-f3 /)))
mb0's avatar
Track.  
mb0 committed
418

Julian Kranz's avatar
Julian Kranz committed
419
420
421
val p/f3/f2 [/66-p] = p/66/f2/f3
val p/f3/f2 [/f2-p] = p/f3/f2
val p/f3/f2 [/f3-p] = p/f2/f3
mb0's avatar
mb0 committed
422
val p/f3/f2 [/legacy-p] = p/f3/f2
Julian Kranz's avatar
Julian Kranz committed
423
424
val p/f3/f2 [/rex-p]
 | mode64? = p/f3/f2
Julian Kranz's avatar
Julian Kranz committed
425
426
 | mode32? & rexw? = unop DEC rex/reg32
 | mode32? & // rexw? = unop INC rex/reg32
Julian Kranz's avatar
Julian Kranz committed
427
428
val p/f3/f2 [] = after (with-f3 /f2) (
                 after (with-f2 /f3) (with-f2 (with-f3 /)))
mb0's avatar
Track.  
mb0 committed
429

Julian Kranz's avatar
Julian Kranz committed
430
431
432
val p/66/f2 [/66-p] = p/66/f2
val p/66/f2 [/f2-p] = p/66/f2
val p/66/f2 [/f3-p] = p/66/f2/f3
mb0's avatar
mb0 committed
433
val p/66/f2 [/legacy-p] = p/66/f2
Julian Kranz's avatar
Julian Kranz committed
434
435
val p/66/f2 [/rex-p]
 | mode64? = p/66/f2
Julian Kranz's avatar
Julian Kranz committed
436
437
 | mode32? & rexw? = unop DEC rex/reg16
 | mode32? & // rexw? = unop INC rex/reg16
Julian Kranz's avatar
Julian Kranz committed
438
439
val p/66/f2 [] = after (with-66 /f2) (
                 after (with-f2 /66) (with-66 (with-f2 /)))
mb0's avatar
Track.  
mb0 committed
440

Julian Kranz's avatar
Julian Kranz committed
441
442
443
val p/66/f3 [/66-p] = p/66/f3
val p/66/f3 [/f2-p] = p/66/f3/f2
val p/66/f3 [/f3-p] = p/66/f3
mb0's avatar
mb0 committed
444
val p/66/f3 [/legacy-p] = p/66/f3
Julian Kranz's avatar
Julian Kranz committed
445
446
val p/66/f3 [/rex-p]
 | mode64? = p/66/f3
Julian Kranz's avatar
Julian Kranz committed
447
448
 | mode32? & rexw? = unop DEC rex/reg16
 | mode32? & // rexw? = unop INC rex/reg16
Julian Kranz's avatar
Julian Kranz committed
449
450
451
val p/66/f3 [] = after (with-66 /f3) (
                 after (with-f3 /66) (
                        with-66 (with-f3 /)))
mb0's avatar
mb0 committed
452

Julian Kranz's avatar
Julian Kranz committed
453
454
455
val p/66/f2/f3 [/66-p] = do clear-rex; p/66/f2/f3 end
val p/66/f2/f3 [/f2-p] = do clear-rex; p/66/f3/f2 end
val p/66/f2/f3 [/f3-p] = do clear-rex; p/66/f2/f3 end
mb0's avatar
mb0 committed
456
val p/66/f2/f3 [/legacy-p] = p/66/f2/f3
Julian Kranz's avatar
Julian Kranz committed
457
458
val p/66/f2/f3 [/rex-p]
 | mode64? = p/66/f2/f3
Julian Kranz's avatar
Julian Kranz committed
459
460
 | mode32? & rexw? = unop DEC rex/reg16
 | mode32? & // rexw? = unop INC rex/reg16
Julian Kranz's avatar
Julian Kranz committed
461
462
463
464
465
466
467
468
val p/66/f2/f3 [] = after (with-66 (with-f2 /f3)) (
                    after (with-66 (with-f3 /f2)) (
                    after (with-f2 (with-f3 /66)) (
                           with-66 (with-f2 (with-f3 /)))))

val p/66/f3/f2 [/66-p] = do clear-rex; p/66/f3/f2 end
val p/66/f3/f2 [/f2-p] = do clear-rex; p/66/f3/f2 end
val p/66/f3/f2 [/f3-p] = do clear-rex; p/66/f2/f3 end
mb0's avatar
mb0 committed
469
val p/66/f3/f2 [/legacy-p] = p/66/f3/f2
Julian Kranz's avatar
Julian Kranz committed
470
471
val p/66/f3/f2 [/rex-p]
 | mode64? = p/66/f3/f2
Julian Kranz's avatar
Julian Kranz committed
472
473
 | mode32? & rexw? = unop DEC rex/reg16
 | mode32? & // rexw? = unop INC rex/reg16
Julian Kranz's avatar
Julian Kranz committed
474
475
476
477
val p/66/f3/f2 [] = after (with-66 (with-f3 /f2)) (
                    after (with-66 (with-f2 /f3)) (
		    after (with-f2 (with-f3 /66)) (
		           with-66 (with-f2 (with-f3 /)))))
mb0's avatar
mb0 committed
478

mb0's avatar
Foo.    
mb0 committed
479
type register =
mb0's avatar
Track.  
mb0 committed
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
   AL
 | AH
 | AX
 | EAX
 | RAX
 | BL
 | BH
 | BX
 | EBX
 | RBX
 | CL
 | CH
 | CX
 | ECX
 | RCX
 | DL
 | DH
 | DX
 | EDX
 | RDX
 | R8B
 | R8L
 | R8D
Julian Kranz's avatar
Julian Kranz committed
503
 | R8
mb0's avatar
Track.  
mb0 committed
504
505
506
 | R9B
 | R9L
 | R9D
Julian Kranz's avatar
Julian Kranz committed
507
 | R9
mb0's avatar
Track.  
mb0 committed
508
509
510
 | R10B
 | R10L
 | R10D
Julian Kranz's avatar
Julian Kranz committed
511
 | R10
mb0's avatar
Track.  
mb0 committed
512
513
514
 | R11B
 | R11L
 | R11D
Julian Kranz's avatar
Julian Kranz committed
515
 | R11
mb0's avatar
Track.  
mb0 committed
516
517
518
 | R12B
 | R12L
 | R12D
Julian Kranz's avatar
Julian Kranz committed
519
 | R12
mb0's avatar
Track.  
mb0 committed
520
521
522
 | R13B
 | R13L
 | R13D
Julian Kranz's avatar
Julian Kranz committed
523
 | R13
mb0's avatar
Track.  
mb0 committed
524
525
526
 | R14B
 | R14L
 | R14D
Julian Kranz's avatar
Julian Kranz committed
527
 | R14
mb0's avatar
Track.  
mb0 committed
528
529
530
 | R15B
 | R15L
 | R15D
Julian Kranz's avatar
Julian Kranz committed
531
 | R15
mb0's avatar
Track.  
mb0 committed
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
 | SP
 | ESP
 | RSP
 | BP
 | EBP
 | RBP
 | SI
 | ESI
 | RSI
 | DI
 | EDI
 | RDI
 | XMM0
 | XMM1
 | XMM2
 | XMM3
 | XMM4
 | XMM5
 | XMM6
 | XMM7
 | XMM8
 | XMM9
 | XMM10
 | XMM11
 | XMM12
 | XMM13
 | XMM14
 | XMM15
 | YMM0
 | YMM1
 | YMM2
 | YMM3
 | YMM4
 | YMM5
 | YMM6
 | YMM7
 | YMM8
 | YMM9
 | YMM10
 | YMM11
 | YMM12
 | YMM13
 | YMM14
 | YMM15
 | MM0
 | MM1
 | MM2
 | MM3
 | MM4
 | MM5
 | MM6
 | MM7
 | ES
 | SS
 | DS
 | FS
 | GS
 | CS
mb0's avatar
mb0 committed
590
591
592
593
594
595
596
597
 | ST0
 | ST1
 | ST2
 | ST3
 | ST4
 | ST5
 | ST6
 | ST7
mb0's avatar
mb0 committed
598
 | RIP
mb0's avatar
Track.  
mb0 committed
599

mb0's avatar
Foo.    
mb0 committed
600
type opnd =
mb0's avatar
Track.  
mb0 committed
601
602
603
604
605
   IMM8 of 8
 | IMM16 of 16
 | IMM32 of 32
 | IMM64 of 64
 | REG of register
Julian Kranz's avatar
Julian Kranz committed
606
 | MEM of {sz:int,psz:int,segment:seg_override,opnd:opnd}
mb0's avatar
sem.    
mb0 committed
607
608
 | SUM of {a:opnd,b:opnd}
 | SCALE of {imm:2,opnd:opnd}
mb0's avatar
Track.  
mb0 committed
609

mb0's avatar
Foo.    
mb0 committed
610
type flowopnd =
mb0's avatar
Track.  
mb0 committed
611
612
613
614
   REL8 of 8
 | REL16 of 16
 | REL32 of 32
 | REL64 of 64
Julian Kranz's avatar
Julian Kranz committed
615
616
 | PTR16/16 of 32
 | PTR16/32 of 48
mb0's avatar
Track.  
mb0 committed
617
618
619
 | NEARABS of opnd
 | FARABS of opnd

Julian Kranz's avatar
Julian Kranz committed
620
621
622
623
624
625
type flow1 = {opnd-sz:int,addr-sz:int,rep:1,repne:1,lock:1,opnd1:flowopnd}
type arity0 = {opnd-sz:int,addr-sz:int,rep:1,repne:1,lock:1}
type arity1 = {opnd-sz:int,addr-sz:int,rep:1,repne:1,lock:1,opnd1:opnd}
type arity2 = {opnd-sz:int,addr-sz:int,rep:1,repne:1,lock:1,opnd1:opnd,opnd2:opnd}
type arity3 = {opnd-sz:int,addr-sz:int,rep:1,repne:1,lock:1,opnd1:opnd,opnd2:opnd,opnd3:opnd}
type arity4 = {opnd-sz:int,addr-sz:int,rep:1,repne:1,lock:1,opnd1:opnd,opnd2:opnd,opnd3:opnd,opnd4:opnd}
mb0's avatar
Track.  
mb0 committed
626

mb0's avatar
Foo.    
mb0 committed
627
type varity =
Julian Kranz's avatar
Julian Kranz committed
628
   VA0 of arity0
mb0's avatar
mb0 committed
629
630
631
632
633
 | VA1 of arity1
 | VA2 of arity2
 | VA3 of arity3
 | VA4 of arity4

mb0's avatar
Foo.    
mb0 committed
634
type insn =
Julian Kranz's avatar
Julian Kranz committed
635
   AAA of arity0
mb0's avatar
Merge.    
mb0 committed
636
637
 | AAD of arity1
 | AAM of arity1
Julian Kranz's avatar
Julian Kranz committed
638
 | AAS of arity0
mb0's avatar
Merge.    
mb0 committed
639
 | ADC of arity2
mb0's avatar
mb0 committed
640
 | ADD of arity2
mb0's avatar
Merge.    
mb0 committed
641
 | ADDPD of arity2
Julian Kranz's avatar
Merge    
Julian Kranz committed
642
643
644
645
646
647
648
649
650
651
652
 | ADDPS of arity2
 | ADDSD of arity2
 | ADDSS of arity2
 | ADDSUBPD of arity2
 | ADDSUBPS of arity2
 | AESDEC of arity2
 | AESDECLAST of arity2
 | AESENC of arity2
 | AESENCLAST of arity2
 | AESIMC of arity2
 | AESKEYGENASSIST of arity3
mb0's avatar
mb0 committed
653
 | AND of arity2
Julian Kranz's avatar
Julian Kranz committed
654
655
 | ANDNPD of arity2
 | ANDNPS of arity2
Julian Kranz's avatar
Julian Kranz committed
656
657
 | ANDPD of arity2
 | ANDPS of arity2
Julian Kranz's avatar
Julian Kranz committed
658
659
660
 | ARPL of arity2
 | BLENDPD of arity3
 | BLENDPS of arity3
Julian Kranz's avatar
Julian Kranz committed
661
 | BLENDVPD of arity3
Julian Kranz's avatar
Julian Kranz committed
662
 | BLENDVPS of arity3
Julian Kranz's avatar
Julian Kranz committed
663
 | BOUND of arity2
mb0's avatar
mb0 committed
664
665
 | BSF of arity2
 | BSR of arity2
mb0's avatar
mb0 committed
666
 | BSWAP of arity1
mb0's avatar
mb0 committed
667
 | BT of arity2
Julian Kranz's avatar
Julian Kranz committed
668
669
670
 | BTC of arity2
 | BTR of arity2
 | BTS of arity2
mb0's avatar
mb0 committed
671
 | CALL of flow1
Julian Kranz's avatar
Julian Kranz committed
672
673
674
675
676
 | CBW of arity0
 | CDQ of arity0
 | CDQE of arity0
 | CLC of arity0
 | CLD of arity0
Julian Kranz's avatar
Julian Kranz committed
677
 | CLFLUSH of arity1
Julian Kranz's avatar
Julian Kranz committed
678
679
680
 | CLI of arity0
 | CLTS of arity0
 | CMC of arity0
mb0's avatar
mb0 committed
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
 | CMOVA of arity2
 | CMOVAE of arity2
 | CMOVB of arity2
 | CMOVBE of arity2
 | CMOVC of arity2
 | CMOVE of arity2
 | CMOVG of arity2
 | CMOVGE of arity2
 | CMOVL of arity2
 | CMOVLE of arity2
 | CMOVNA of arity2
 | CMOVNAE of arity2
 | CMOVNB of arity2
 | CMOVNBE of arity2
 | CMOVNC of arity2
 | CMOVNE of arity2
 | CMOVNG of arity2
 | CMOVNGE of arity2
 | CMOVNL of arity2
 | CMOVNLE of arity2
 | CMOVNO of arity2
 | CMOVNP of arity2
 | CMOVNS of arity2
 | CMOVNZ of arity2
 | CMOVO of arity2
 | CMOVP of arity2
 | CMOVPE of arity2
 | CMOVPO of arity2
 | CMOVS of arity2
 | CMOVZ of arity2
 | CMP of arity2
Julian Kranz's avatar
Julian Kranz committed
712
713
 | CMPPD of arity3
 | CMPPS of arity3
Julian Kranz's avatar
Julian Kranz committed
714
 | CMPS of arity2
Julian Kranz's avatar
Julian Kranz committed
715
 | CMPSD of arity3
Julian Kranz's avatar
Julian Kranz committed
716
 | CMPSS of arity3
mb0's avatar
mb0 committed
717
 | CMPXCHG of arity2
Julian Kranz's avatar
Julian Kranz committed
718
 | CMPXCHG16B of arity1
Julian Kranz's avatar
Julian Kranz committed
719
 | CMPXCHG8B of arity1
Julian Kranz's avatar
Julian Kranz committed
720
721
 | COMISD of arity2
 | COMISS of arity2
Julian Kranz's avatar
Julian Kranz committed
722
723
 | CPUID of arity0
 | CQO of arity0
Julian Kranz's avatar
Julian Kranz committed
724
 | CRC32 of arity2
Julian Kranz's avatar
Julian Kranz committed
725
726
727
 | CVTDQ2PD of arity2
 | CVTDQ2PS of arity2
 | CVTPD2DQ of arity2
mb0's avatar
mb0 committed
728
 | CVTPD2PI of arity2
Julian Kranz's avatar
Julian Kranz committed
729
730
731
732
733
734
735
736
 | CVTPD2PS of arity2
 | CVTPI2PD of arity2
 | CVTPI2PS of arity2
 | CVTPS2DQ of arity2
 | CVTPS2PD of arity2
 | CVTPS2PI of arity2
 | CVTSD2SI of arity2
 | CVTSD2SS of arity2
mb0's avatar
mb0 committed
737
 | CVTSI2SD of arity2
Julian Kranz's avatar
Julian Kranz committed
738
739
740
741
742
743
744
745
746
 | CVTSI2SS of arity2
 | CVTSS2SD of arity2
 | CVTSS2SI of arity2
 | CVTTPD2DQ of arity2
 | CVTTPD2PI of arity2
 | CVTTPS2DQ of arity2
 | CVTTPS2PI of arity2
 | CVTTSD2SI of arity2
 | CVTTSS2SI of arity2
Julian Kranz's avatar
Julian Kranz committed
747
748
749
750
 | CWD of arity0
 | CWDE of arity0
 | DAA of arity0
 | DAS of arity0
mb0's avatar
mb0 committed
751
752
 | DEC of arity1
 | DIV of arity1
Julian Kranz's avatar
Julian Kranz committed
753
754
755
756
757
758
 | DIVPD of arity2
 | DIVPS of arity2
 | DIVSD of arity2
 | DIVSS of arity2
 | DPPD of arity3
 | DPPS of arity3
Julian Kranz's avatar
Julian Kranz committed
759
 | EMMS of arity0
Julian Kranz's avatar
Julian Kranz committed
760
761
 | ENTER of arity2
 | EXTRACTPS of arity3
Julian Kranz's avatar
Julian Kranz committed
762
763
 | F2XM1 of arity0
 | FABS of arity0
Julian Kranz's avatar
Julian Kranz committed
764
 | FADD of arity2
Julian Kranz's avatar
Julian Kranz committed
765
 | FADDP of arity2
Julian Kranz's avatar
Julian Kranz committed
766
767
 | FBLD of arity1
 | FBSTP of arity1
Julian Kranz's avatar
Julian Kranz committed
768
769
 | FCHS of arity0
 | FCLEX of arity0
mb0's avatar
mb0 committed
770
771
772
773
774
775
776
777
 | FCMOVB of arity2
 | FCMOVBE of arity2
 | FCMOVE of arity2
 | FCMOVNB of arity2
 | FCMOVNBE of arity2
 | FCMOVNE of arity2
 | FCMOVNU of arity2
 | FCMOVU of arity2
Julian Kranz's avatar
Julian Kranz committed
778
 | FCOM of arity1
mb0's avatar
mb0 committed
779
780
 | FCOMI of arity2
 | FCOMIP of arity2
Julian Kranz's avatar
Julian Kranz committed
781
 | FCOMP of arity1
Julian Kranz's avatar
Julian Kranz committed
782
783
784
 | FCOMPP of arity0
 | FCOS of arity0
 | FDECSTP of arity0
Julian Kranz's avatar
Julian Kranz committed
785
786
787
788
789
 | FDIV of arity2
 | FDIVP of arity2
 | FDIVR of arity2
 | FDIVRP of arity2
 | FFREE of arity1
Julian Kranz's avatar
Julian Kranz committed
790
 | FIADD of arity1
Julian Kranz's avatar
Julian Kranz committed
791
792
 | FICOM of arity1
 | FICOMP of arity1
Julian Kranz's avatar
Julian Kranz committed
793
794
 | FIDIV of arity2
 | FIDIVR of arity1
Julian Kranz's avatar
Julian Kranz committed
795
 | FILD of arity1
Julian Kranz's avatar
Julian Kranz committed
796
 | FIMUL of arity1
Julian Kranz's avatar
Julian Kranz committed
797
798
 | FINCSTP of arity0
 | FINIT of arity0
Julian Kranz's avatar
Julian Kranz committed
799
800
801
 | FIST of arity1
 | FISTP of arity1
 | FISTTP of arity1
Julian Kranz's avatar
Julian Kranz committed
802
803
 | FISUB of arity1
 | FISUBR of arity1
mb0's avatar
mb0 committed
804
 | FLD of arity1
Julian Kranz's avatar
Julian Kranz committed
805
 | FLD1 of arity0
Julian Kranz's avatar
Julian Kranz committed
806
807
 | FLDCW of arity1
 | FLDENV of arity1
Julian Kranz's avatar
Julian Kranz committed
808
809
810
811
812
813
 | FLDL2E of arity0
 | FLDL2T of arity0
 | FLDLG2 of arity0
 | FLDLN2 of arity0
 | FLDPI of arity0
 | FLDZ of arity0
Julian Kranz's avatar
Julian Kranz committed
814
815
 | FMUL of arity2
 | FMULP of arity2
Julian Kranz's avatar
Julian Kranz committed
816
817
818
 | FNCLEX of arity0
 | FNINIT of arity0
 | FNOP of arity0
Julian Kranz's avatar
Julian Kranz committed
819
820
821
822
 | FNSAVE of arity1
 | FNSTCW of arity1
 | FNSTENV of arity1
 | FNSTSW of arity1
Julian Kranz's avatar
Julian Kranz committed
823
824
825
826
827
 | FPATAN of arity0
 | FPREM of arity0
 | FPREM1 of arity0
 | FPTAN of arity0
 | FRNDINT of arity0
Julian Kranz's avatar
Julian Kranz committed
828
829
 | FRSTOR of arity1
 | FSAVE of arity1
Julian Kranz's avatar
Julian Kranz committed
830
831
832
833
 | FSCALE of arity0
 | FSIN of arity0
 | FSINCOS of arity0
 | FSQRT of arity0
mb0's avatar
mb0 committed
834
 | FST of arity1
Julian Kranz's avatar
Julian Kranz committed
835
 | FSTCW of arity1
Julian Kranz's avatar
Julian Kranz committed
836
 | FSTENV of arity1
Julian Kranz's avatar
Julian Kranz committed
837
 | FSTP of arity1
Julian Kranz's avatar
Julian Kranz committed
838
839
840
841
842
 | FSTSW of arity1
 | FSUB of arity2
 | FSUBP of arity2
 | FSUBR of arity2
 | FSUBRP of arity2
Julian Kranz's avatar
Julian Kranz committed
843
 | FTST of arity0
Julian Kranz's avatar
Julian Kranz committed
844
 | FUCOM of arity1
Julian Kranz's avatar
Julian Kranz committed
845
846
 | FUCOMI of arity1
 | FUCOMIP of arity1
Julian Kranz's avatar
Julian Kranz committed
847
 | FUCOMP of arity1
Julian Kranz's avatar
Julian Kranz committed
848
849
 | FUCOMPP of arity0
 | FXAM of arity0
Julian Kranz's avatar
Julian Kranz committed
850
 | FXCH of arity1
Julian Kranz's avatar
Julian Kranz committed
851
 | FXRSTOR of arity1
Julian Kranz's avatar
Julian Kranz committed
852
 | FXRSTOR64 of arity1
Julian Kranz's avatar
Julian Kranz committed
853
 | FXSAVE of arity1
Julian Kranz's avatar
Julian Kranz committed
854
 | FXSAVE64 of arity1
Julian Kranz's avatar
Julian Kranz committed
855
856
857
 | FXTRACT of arity0
 | FYL2X of arity0
 | FYL2XP1 of arity0
Julian Kranz's avatar
Julian Kranz committed
858
859
 | HADDPD of arity2
 | HADDPS of arity2
Julian Kranz's avatar
Julian Kranz committed
860
 | HLT of arity0
Julian Kranz's avatar
Julian Kranz committed
861
 | HSUBPD of arity2
Julian Kranz's avatar
Julian Kranz committed
862
 | HSUBPS of arity2
mb0's avatar
mb0 committed
863
 | IDIV of arity1
Julian Kranz's avatar
Julian Kranz committed
864
865
 | IMUL of varity
 | IN of arity2
mb0's avatar
mb0 committed
866
 | INC of arity1
Julian Kranz's avatar
Julian Kranz committed
867
868
 | INSB of arity0
 | INSD of arity0
Julian Kranz's avatar
Julian Kranz committed
869
 | INSERTPS of arity3
Julian Kranz's avatar
Julian Kranz committed
870
 | INSW of arity0
Julian Kranz's avatar
Julian Kranz committed
871
 | INT of arity1
Julian Kranz's avatar
Julian Kranz committed
872
873
874
 | INT0 of arity0
 | INT3 of arity0
 | INVD of arity0
Julian Kranz's avatar
Julian Kranz committed
875
 | INVLPG of arity1
Julian Kranz's avatar
Julian Kranz committed
876
 | INVPCID of arity2
Julian Kranz's avatar
Julian Kranz committed
877
878
879
 | IRET of arity0
 | IRETD of arity0
 | IRETQ of arity0
mb0's avatar
mb0 committed
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
 | JA of flow1
 | JAE of flow1
 | JB of flow1
 | JBE of flow1
 | JC of flow1
 | JCXZ of flow1
 | JE of flow1
 | JECXZ of flow1
 | JG of flow1
 | JGE of flow1
 | JL of flow1
 | JLE of flow1
 | JMP of flow1
 | JNA of flow1
 | JNAE of flow1
 | JNB of flow1
 | JNBE of flow1
 | JNC of flow1
 | JNE of flow1
 | JNG of flow1
 | JNGE of flow1
 | JNL of flow1
 | JNLE of flow1
 | JNO of flow1
 | JNP of flow1
 | JNS of flow1
 | JNZ of flow1
 | JO of flow1
 | JP of flow1
 | JPE of flow1
 | JPO of flow1
 | JRCXZ of flow1
 | JS of flow1
 | JZ of flow1
Julian Kranz's avatar
Julian Kranz committed
914
 | LAHF of arity0
Julian Kranz's avatar
Julian Kranz committed
915
 | LAR of arity2
mb0's avatar
mb0 committed
916
 | LDDQU of arity2
Julian Kranz's avatar
Julian Kranz committed
917
918
 | LDMXCSR of arity1
 | LDS of arity2
mb0's avatar
mb0 committed
919
 | LEA of arity2
Julian Kranz's avatar
Julian Kranz committed
920
 | LEAVE of arity0
Julian Kranz's avatar
Julian Kranz committed
921
 | LES of arity2
Julian Kranz's avatar
Julian Kranz committed
922
 | LFENCE of arity0
Julian Kranz's avatar
Julian Kranz committed
923
 | LFS of arity2
Julian Kranz's avatar
Julian Kranz committed
924
 | LGDT of arity1
Julian Kranz's avatar
Julian Kranz committed
925
 | LGS of arity2
Julian Kranz's avatar
Julian Kranz committed
926
 | LIDT of arity1
Julian Kranz's avatar
Julian Kranz committed
927
928
 | LLDT of arity1
 | LMSW of arity1
Julian Kranz's avatar
Julian Kranz committed
929
 | LODS of arity1
Julian Kranz's avatar
Julian Kranz committed
930
931
932
933
 | LOOP of flow1
 | LOOPE of flow1
 | LOOPNE of flow1
 | LSL of arity2
Julian Kranz's avatar
Julian Kranz committed
934
 | LSS of arity2
Julian Kranz's avatar
Julian Kranz committed
935
 | LTR of arity1
Julian Kranz's avatar
Julian Kranz committed
936
 | MASKMOVDQU of arity3
Julian Kranz's avatar
Julian Kranz committed
937
 | MASKMOVQ of arity3
mb0's avatar
mb0 committed
938
939
940
941
 | MAXPD of arity2
 | MAXPS of arity2
 | MAXSD of arity2
 | MAXSS of arity2
Julian Kranz's avatar
Julian Kranz committed
942
 | MFENCE of arity0
mb0's avatar
mb0 committed
943
944
945
946
 | MINPD of arity2
 | MINPS of arity2
 | MINSD of arity2
 | MINSS of arity2
Julian Kranz's avatar
Julian Kranz committed
947
 | MONITOR of arity0
mb0's avatar
mb0 committed
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
 | MOV of arity2
 | MOVAPD of arity2
 | MOVAPS of arity2
 | MOVBE of arity2
 | MOVD of arity2
 | MOVDDUP of arity2
 | MOVDQ2Q of arity2
 | MOVDQA of arity2
 | MOVDQU of arity2
 | MOVHLPS of arity2
 | MOVHPD of arity2
 | MOVHPS of arity2
 | MOVLHPS of arity2
 | MOVLPD of arity2
 | MOVLPS of arity2
 | MOVMSKPD of arity2
 | MOVMSKPS of arity2
 | MOVNTDQ of arity2
 | MOVNTDQA of arity2
 | MOVNTI of arity2
 | MOVNTPD of arity2
 | MOVNTPS of arity2
 | MOVNTQ of arity2
 | MOVQ of arity2
 | MOVQ2DQ of arity2
Julian Kranz's avatar
Julian Kranz committed
973
974
 | MOVS of arity2
 | MOVSD of arity2
mb0's avatar
mb0 committed
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
 | MOVSHDUP of arity2
 | MOVSLDUP of arity2
 | MOVSS of arity2
 | MOVSW of arity2
 | MOVSX of arity2
 | MOVSXD of arity2
 | MOVUPD of arity2
 | MOVUPS of arity2
 | MOVZX of arity2
 | MPSADBW of arity3
 | MUL of arity1
 | MULPD of arity2
 | MULPS of arity2
 | MULSD of arity2
 | MULSS of arity2
Julian Kranz's avatar
Julian Kranz committed
990
 | MWAIT of arity0
mb0's avatar
mb0 committed
991
992
993
994
995
996
997
 | NEG of arity1
 | NOP of varity
 | NOT of arity1
 | OR of arity2
 | ORPD of arity2
 | ORPS of arity2
 | OUT of arity2
Julian Kranz's avatar
Julian Kranz committed
998
999
1000
 | OUTS of arity0
 | OUTSB of arity0
 | OUTSD of arity0