Mercurial > repos > tabletprog
comparison modules/il.tp @ 310:2308336790d4
WIP compiler module for low-level dialect
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 01 Aug 2014 18:56:39 -0700 |
parents | 56b2100d9fff |
children | f987bb2a1911 |
comparison
equal
deleted
inserted
replaced
309:ed908b7fcec6 | 310:2308336790d4 |
---|---|
2 //commutative ops | 2 //commutative ops |
3 _add <- 0 | 3 _add <- 0 |
4 _and <- 1 | 4 _and <- 1 |
5 _or <- 2 | 5 _or <- 2 |
6 _xor <- 3 | 6 _xor <- 3 |
7 _mul <- 4 | |
7 //non-commutative ops | 8 //non-commutative ops |
8 _sub <- 4 | 9 _div <- 5 |
9 _cmp <- 5 | 10 _sub <- 6 |
10 _not <- 6 | 11 _cmp <- 7 |
11 _sl <- 7 | 12 _not <- 8 |
12 _asr <- 8 | 13 _sl <- 9 |
13 _lsr <- 9 | 14 _asr <- 10 |
14 _rol <- 10 | 15 _lsr <- 11 |
15 _ror <- 11 | 16 _rol <- 12 |
16 _mov <- 12 | 17 _ror <- 13 |
17 _call <- 13 | 18 _mov <- 14 |
18 _ret <- 14 | 19 _call <- 15 |
19 _skipif <- 15 | 20 _ret <- 16 |
20 _save <- 16 | 21 _skipif <- 17 |
22 _save <- 18 | |
23 _bool <- 19 | |
21 | 24 |
22 _names <- #[ | 25 _names <- #[ |
23 "add" | 26 "add" |
24 "and" | 27 "and" |
25 "or" | 28 "or" |
26 "xor" | 29 "xor" |
30 "mul" | |
31 "div" | |
27 "sub" | 32 "sub" |
28 "cmp" | 33 "cmp" |
29 "not" | 34 "not" |
30 "sl" | 35 "sl" |
31 "asr" | 36 "asr" |
35 "mov" | 40 "mov" |
36 "call" | 41 "call" |
37 "ret" | 42 "ret" |
38 "skipIf" | 43 "skipIf" |
39 "save" | 44 "save" |
45 "bool" | |
40 ] | 46 ] |
41 | 47 |
42 op3:a:b:out:size <- :_opcode :_ina :_inb :_out :_size { | 48 op3:a:b:out:size <- :_opcode :_ina :_inb :_out :_size { |
43 #{ | 49 #{ |
44 opcode <- { _opcode } | 50 opcode <- { _opcode } |
297 | 303 |
298 xor <- :ina inb out size { | 304 xor <- :ina inb out size { |
299 op3: _xor a: ina b: inb out: out size: size | 305 op3: _xor a: ina b: inb out: out size: size |
300 } | 306 } |
301 | 307 |
308 mul <- :ina inb out size { | |
309 op3: _mul a: ina b: inb out: out size: size | |
310 } | |
311 | |
312 div <- :ina inb out size { | |
313 op3: _div a: ina b: inb out: out size: size | |
314 } | |
315 | |
302 bnot <- :in out size { | 316 bnot <- :in out size { |
303 op2: _not in: in out: out size: size | 317 op2: _not in: in out: out size: size |
304 } | 318 } |
305 | 319 |
306 sl <- :shift in out size { | 320 sl <- :shift in out size { |
427 name . " " . (regs join: " ") . " {" . block . "}" | 441 name . " " . (regs join: " ") . " {" . block . "}" |
428 } | 442 } |
429 to2OpInst <- { | 443 to2OpInst <- { |
430 save: regs (to2Op: _scope) | 444 save: regs (to2Op: _scope) |
431 } | 445 } |
446 } | |
447 } | |
448 | |
449 //produces a non-zero value or zero based on condition code flags | |
450 bool <- :_cond _out { | |
451 #{ | |
452 opcode <- { _bool } | |
453 cond <- { _cond } | |
454 out <- { _code } | |
455 name <- { _names get: _save } | |
456 numops <- { 0 } | |
457 | |
432 } | 458 } |
433 } | 459 } |
434 | 460 |
435 allocRegs:withSource <- :instarr:regSrc { | 461 allocRegs:withSource <- :instarr:regSrc { |
436 _regMap <- dict linear | 462 _regMap <- dict linear |