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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
#include "config.h"
#include <stdlib.h>
#include <string.h>
#define NO_MIPS_JIT_DEBUG
#include "mips-codegen.h"
#include "mono/metadata/class.h"
/* don't run the resulting program, it will destroy your computer,
* just objdump -d it to inspect we generated the correct assembler.
*/
int main (int argc, char *argv[]) {
guint32 *code, * p;
code = p = (guint32 *) malloc (sizeof (guint32) * 1024);
mips_add (p, 3, 4, 5);
mips_addi (p, 3, 4, 5);
mips_addu (p, 3, 4, 5);
mips_addiu (p, 3, 4, 5);
mips_sub (p, 3, 4, 5);
mips_subu (p, 3, 4, 5);
mips_dadd (p, 3, 4, 5);
mips_daddi (p, 3, 4, 5);
mips_daddu (p, 3, 4, 5);
mips_daddiu (p, 3, 4, 5);
mips_dsub (p, 3, 4, 5);
mips_dsubu (p, 3, 4, 5);
mips_mult (p, 6, 7);
mips_multu (p, 6, 7);
mips_div (p, 6, 7);
mips_divu (p, 6, 7);
mips_dmult (p, 6, 7);
mips_dmultu (p, 6, 7);
mips_ddiv (p, 6, 7);
mips_ddivu (p, 6, 7);
mips_sll (p, 3, 4, 5);
mips_sllv (p, 3, 4, 5);
mips_sra (p, 3, 4, 5);
mips_srav (p, 3, 4, 5);
mips_srl (p, 3, 4, 5);
mips_srlv (p, 3, 4, 5);
mips_dsll (p, 3, 4, 5);
mips_dsll32 (p, 3, 4, 5);
mips_dsllv (p, 3, 4, 5);
mips_dsra (p, 3, 4, 5);
mips_dsra32 (p, 3, 4, 5);
mips_dsrav (p, 3, 4, 5);
mips_dsrl (p, 3, 4, 5);
mips_dsrl32 (p, 3, 4, 5);
mips_dsrlv (p, 3, 4, 5);
mips_and (p, 8, 9, 10);
mips_andi (p, 8, 9, 10);
mips_nor (p, 8, 9, 10);
mips_or (p, 8, 9, 10);
mips_ori (p, 8, 9, 10);
mips_xor (p, 8, 9, 10);
mips_xori (p, 8, 9, 10);
mips_slt (p, 8, 9, 10);
mips_slti (p, 8, 9, 10);
mips_sltu (p, 8, 9, 10);
mips_sltiu (p, 8, 9, 10);
mips_beq (p, 8, 9, 0xff1f);
mips_beql (p, 8, 9, 0xff1f);
mips_bne (p, 8, 9, 0xff1f);
mips_bnel (p, 8, 9, 0xff1f);
mips_bgez (p, 11, 0xff1f);
mips_bgezal (p, 11, 0xff1f);
mips_bgezall (p, 11, 0xff1f);
mips_bgezl (p, 11, 0xff1f);
mips_bgtz (p, 11, 0xff1f);
mips_bgtzl (p, 11, 0xff1f);
mips_blez (p, 11, 0xff1f);
mips_blezl (p, 11, 0xff1f);
mips_bltz (p, 11, 0xff1f);
mips_bltzal (p, 11, 0xff1f);
mips_bltzall (p, 11, 0xff1f);
mips_bltzl (p, 11, 0xff1f);
mips_jump (p, 0xff1f);
mips_jumpl (p, 0xff1f);
mips_jalr (p, 12, mips_ra);
mips_jr (p, 12);
mips_lb (p, 13, 14, 128);
mips_lbu (p, 13, 14, 128);
mips_ld (p, 13, 14, 128);
mips_ldl (p, 13, 14, 128);
mips_ldr (p, 13, 14, 128);
mips_lh (p, 13, 14, 128);
mips_lhu (p, 13, 14, 128);
mips_ll (p, 13, 14, 128);
mips_lld (p, 13, 14, 128);
mips_lui (p, 13, 14, 128);
mips_lw (p, 13, 14, 128);
mips_lwl (p, 13, 14, 128);
mips_lwr (p, 13, 14, 128);
mips_lwu (p, 13, 14, 128);
mips_sb (p, 13, 14, 128);
mips_sc (p, 13, 14, 128);
mips_scd (p, 13, 14, 128);
mips_sd (p, 13, 14, 128);
mips_sdl (p, 13, 14, 128);
mips_sdr (p, 13, 14, 128);
mips_sh (p, 13, 14, 128);
mips_sw (p, 13, 14, 128);
mips_swl (p, 13, 14, 128);
mips_swr (p, 13, 14, 128);
mips_move (p, 15, 16);
mips_nop (p);
mips_break (p, 0);
mips_sync (p, 0);
mips_mfhi (p, 17);
mips_mflo (p, 17);
mips_mthi (p, 17);
mips_mtlo (p, 17);
mips_fabsd (p, 16, 18);
mips_fnegd (p, 16, 18);
mips_fsqrtd (p, 16, 18);
mips_faddd (p, 16, 18, 20);
mips_fdivd (p, 16, 18, 20);
mips_fmuld (p, 16, 18, 20);
mips_fsubd (p, 16, 18, 20);
mips_fcmpd (p, MIPS_FPU_EQ, 18, 20);
mips_fbfalse (p, 0xff1f);
mips_fbfalsel (p, 0xff1f);
mips_fbtrue (p, 0xff1f);
mips_fbtruel (p, 0xff1f);
mips_ceilwd (p, 20, 22);
mips_ceilld (p, 20, 22);
mips_floorwd (p, 20, 22);
mips_floorld (p, 20, 22);
mips_roundwd (p, 20, 22);
mips_roundld (p, 20, 22);
mips_truncwd (p, 20, 22);
mips_truncld (p, 20, 22);
mips_cvtdw (p, 20, 22);
mips_cvtds (p, 20, 22);
mips_cvtdl (p, 20, 22);
mips_cvtld (p, 20, 22);
mips_cvtsd (p, 20, 22);
mips_cvtwd (p, 20, 22);
mips_fmovd (p, 20, 22);
printf ("size: %d\n", p - code);
return 0;
}
|