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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
| `MIPSThreadStart ->
("SYSCALL_THREAD_START", [], [])
| `MIPSStopFetching ->
("ImplementationDefinedStopFetching",
[],
[])
(* Note different argument order, which reflects difference
between instruction encoding and asm format *)
| `MIPSRType (op, rd, rs, rt) ->
(translate_rtype_op op,
[
translate_reg "rs" rs;
translate_reg "rt" rt;
translate_reg "rd" rd;
],
[])
(* Note different argument order similar to above *)
| `MIPSIType (op, rt, rs, imm) ->
(translate_itype_op op,
[
translate_reg "rs" rs;
translate_reg "rt" rt;
translate_imm16 "imm" imm;
],
[])
| `MIPSShiftI (op, rd, rt, sa) ->
(translate_shifti_op op,
[
translate_reg "rt" rt;
translate_reg "rd" rd;
translate_imm5 "sa" sa;
],
[])
| `MIPSShiftV (op, rd, rt, rs) ->
(translate_shiftv_op op,
[
translate_reg "rs" rs;
translate_reg "rt" rt;
translate_reg "rd" rd;
],
[])
| `MIPSMulDiv (op, rs, rt) ->
(translate_muldiv_op op,
[
translate_reg "rs" rs;
translate_reg "rt" rt;
],
[])
| `MIPSMFHiLo (op, rs) ->
(translate_mfhilo_op op,
[
translate_reg "rs" rs;
],
[])
| `MIPSLUI (rt, imm) ->
("LUI",
[
translate_reg "rt" rt;
translate_imm16 "imm" imm;
],
[])
| `MIPSLoad (width, signed, linked, base, rt, offset) ->
("Load",
[
translate_wordsize "width" width;
translate_bool "signed" signed;
translate_bool "linked" linked;
translate_reg "base" base;
translate_reg "rt" rt;
translate_imm16 "offset" offset;
],
[])
| `MIPSStore (width, conditional, base, rt, offset) ->
("Store",
[
translate_wordsize "width" width;
translate_bool "conditional" conditional;
translate_reg "base" base;
translate_reg "rt" rt;
translate_imm16 "offset" offset;
],
[])
| `MIPSLSLR (store, double, left, base, rt, offset) ->
(translate_lslr_op store double left,
[
translate_reg "base" base;
translate_reg "rt" rt;
translate_imm16 "offset" offset;
],
[])
| `MIPSSYNC -> ("SYNC", [], [])
| `MIPSBEQ (rs, rt, offset, ne, likely) ->
("BEQ",
[translate_reg "rs" rs;
translate_reg "rt" rt;
translate_imm16 "offset" offset;
translate_bool "ne" ne;
translate_bool "likely" likely;
], [])
| `MIPSBCMPZ (rs, offset, cmp, link, likely) ->
("BCMPZ",
[translate_reg "rs" rs;
translate_imm16 "offset" offset;
translate_cmp "cmp" cmp;
translate_bool "link" link;
translate_bool "likely" likely;
], [])
| `MIPSJ (offset) ->
("J", [translate_imm26 "offset" offset;], [])
| `MIPSJAL (offset) ->
("JAL", [translate_imm26 "offset" offset;], [])
| `MIPSJR(rd) ->
("JR", [translate_reg "rd" rd;], [])
| `MIPSJALR(rd, rs) ->
("JALR", [translate_reg "rd" rd; translate_reg "rs" rs;], [])
|