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