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
|
| `MIPSThreadStart ->
SYSCALL_THREAD_START
| `MIPSStopFetching ->
ImplementationDefinedStopFetching0
(* 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)
|