-
Notifications
You must be signed in to change notification settings - Fork 0
/
emitAssem.ml
75 lines (63 loc) · 3.52 KB
/
emitAssem.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
open Assem
open Printf
let g outchan = function
| Nop -> ()
| Add (x,y,z) -> fprintf outchan "\tadd %s, %s, %s\n" x y z
| Addi (x,y,z) -> fprintf outchan "\taddi %s, %s, %d\n" x y z
| Sub (x,y,z) -> fprintf outchan "\tsub %s, %s, %s\n" x y z
| Mul (x,y,z) -> fprintf outchan "\tmul %s, %s, %s\n" x y z
| Div10(x,y) -> fprintf outchan "\tdiv10 %s, %s\n" x y
| Slt (x,y,z) -> fprintf outchan "\tslt %s, %s, %s\n" x y z
| And (x,y,z) -> fprintf outchan "\tand %s, %s, %s\n" x y z
| Andi (x,y,z) -> fprintf outchan "\tandi %s, %s, %d\n" x y z
| Or (x,y,z) -> fprintf outchan "\tor %s, %s, %s\n" x y z
| Ori (x,y,z) -> fprintf outchan "\tori %s, %s, %d\n" x y z
| Nor (x,y,z) -> fprintf outchan "\tnor %s, %s, %s\n" x y z
| Xor (x,y,z) -> fprintf outchan "\txor %s, %s, %s\n" x y z
| Xori (x,y,z) -> fprintf outchan "\txori %s, %s, %d\n" x y z
| Srai (x,y,z) -> fprintf outchan "\tsrai %s, %s, %d\n" x y z
| Srli (x,y,z) -> fprintf outchan "\tsrli %s, %s, %d\n" x y z
| Slli (x,y,z) -> fprintf outchan "\tslli %s, %s, %d\n" x y z
| Sra (x,y,z) -> fprintf outchan "\tsra %s, %s, %s\n" x y z
| Srl (x,y,z) -> fprintf outchan "\tsrl %s, %s, %s\n" x y z
| Sll (x,y,z) -> fprintf outchan "\tsll %s, %s, %s\n" x y z
| Itof (x,y) -> fprintf outchan "\titof %s, %s\n" x y
| Fadd (x,y,z) -> fprintf outchan "\tfadd %s, %s, %s\n" x y z
| Fsub (x,y,z) -> fprintf outchan "\tfsub %s, %s, %s\n" x y z
| Fmul (x,y,z) -> fprintf outchan "\tfmul %s, %s, %s\n" x y z
| Fdiv (x,y,z) -> fprintf outchan "\tfdiv %s, %s, %s\n" x y z
| Sqrt (x,y) -> fprintf outchan "\tsqrt %s, %s\n" x y
| Sltf (x,y,z) -> fprintf outchan "\tsltf %s, %s, %s\n" x y z
| Fneg (x,y) -> fprintf outchan "\tfneg %s, %s\n" x y
| Fabs (x,y) -> fprintf outchan "\tfabs %s, %s\n" x y
| Floor(x,y) -> fprintf outchan "\tfloor %s, %s\n" x y
| Ftoi (x,y) -> fprintf outchan "\tftoi %s, %s\n" x y
| Lw (x,y,z) -> fprintf outchan "\tlw %s, %d(%s)\n" x y z
| Sw (x,y,z) -> fprintf outchan "\tsw %s, %d(%s)\n" x y z
| Addlw(x,y,z) -> fprintf outchan "\taddlw %s, %s, %s\n" x y z
| Mov (x,y) -> fprintf outchan "\tmov %s, %s\n" x y
| Lf (x,y,z) -> fprintf outchan "\tlf %s, %d(%s)\n" x y z
| Sf (x,y,z) -> fprintf outchan "\tsf %s, %d(%s)\n" x y z
| Addlf(x,y,z) -> fprintf outchan "\taddlf %s, %s, %s\n" x y z
| Movf (x,y) -> fprintf outchan "\tmovf %s, %s\n" x y
| Beq (x,y,z) -> fprintf outchan "\tbeq %s, %s, %s\n" x y z
| Bne (x,y,z) -> fprintf outchan "\tbne %s, %s, %s\n" x y z
| Ble (x,y,z) -> fprintf outchan "\tble %s, %s, %s\n" x y z
| Bge (x,y,z) -> fprintf outchan "\tbge %s, %s, %s\n" x y z
| J (x) -> fprintf outchan "\tj %s\n" x
| Jr (x) -> fprintf outchan "\tjr %s\n" x
| Jal (x) -> fprintf outchan "\tjal %s\n" x
| Jalr (x,y) -> fprintf outchan "\tjalr %s, %s\n" x y
| Bltf (x,y,z) -> fprintf outchan "\tbltf %s, %s, %s\n" x y z
| Beqf (x,y,z) -> fprintf outchan "\tbeqf %s, %s, %s\n" x y z
| Label (x) -> fprintf outchan "%s:\n" x
| Comment (x) -> fprintf outchan "# %s\n" x
| In (x) -> fprintf outchan "\tin %s\n" x
| Inf (x) -> fprintf outchan "\tinf %s\n" x
| Outb (x) -> fprintf outchan "\toutb %s\n" x
| OriLabel (x,y,z) -> fprintf outchan "\tori %s, %s, %s\n" x y z
| Library(s) -> fprintf outchan "%s\n" s
| _ -> assert false
let f outchan prog =
Printf.eprintf "[emitAssem]\n";
List.iter (fun e -> g outchan e) prog