Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: runtime/vm/assembler_mips_test.cc

Issue 12519007: Adds MIPS instructions to simulator, assembler, disassembler (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/assembler_mips.h ('k') | runtime/vm/disassembler_mips.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/globals.h" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_MIPS) 6 #if defined(TARGET_ARCH_MIPS)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/os.h" 9 #include "vm/os.h"
10 #include "vm/unit_test.h" 10 #include "vm/unit_test.h"
11 #include "vm/virtual_memory.h" 11 #include "vm/virtual_memory.h"
12 12
13 namespace dart { 13 namespace dart {
14 14
15 #define __ assembler-> 15 #define __ assembler->
16 16
17 17
18 ASSEMBLER_TEST_GENERATE(Addi, assembler) {
19 __ addi(V0, ZR, Immediate(42));
20 __ jr(RA);
21 }
22
23
24 ASSEMBLER_TEST_RUN(Addi, test) {
25 typedef int (*SimpleCode)();
26 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
27 }
28
29
30 ASSEMBLER_TEST_GENERATE(Addi_overflow, assembler) {
31 __ LoadImmediate(V0, 0x7fffffff);
32 __ addi(V0, V0, Immediate(1)); // V0 not set on overflow
33 __ jr(RA);
34 }
35
36
37 ASSEMBLER_TEST_RUN(Addi_overflow, test) {
38 typedef int (*SimpleCode)();
39 EXPECT_EQ(static_cast<int32_t>(0x7fffffff),
40 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
41 }
42
43
44 ASSEMBLER_TEST_GENERATE(Addiu, assembler) { 18 ASSEMBLER_TEST_GENERATE(Addiu, assembler) {
45 __ addiu(V0, ZR, Immediate(42)); 19 __ addiu(V0, ZR, Immediate(42));
46 __ jr(RA); 20 __ jr(RA);
47 } 21 }
48 22
49 23
50 ASSEMBLER_TEST_RUN(Addiu, test) { 24 ASSEMBLER_TEST_RUN(Addiu, test) {
51 typedef int (*SimpleCode)(); 25 typedef int (*SimpleCode)();
52 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 26 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
53 } 27 }
54 28
55 29
56 ASSEMBLER_TEST_GENERATE(Addiu_overflow, assembler) { 30 ASSEMBLER_TEST_GENERATE(Addiu_overflow, assembler) {
57 __ LoadImmediate(V0, 0x7fffffff); 31 __ LoadImmediate(V0, 0x7fffffff);
58 __ addiu(V0, V0, Immediate(1)); // V0 is set on overflow 32 __ addiu(V0, V0, Immediate(1)); // V0 is modified on overflow.
59 __ jr(RA); 33 __ jr(RA);
60 } 34 }
61 35
62 36
63 ASSEMBLER_TEST_RUN(Addiu_overflow, test) { 37 ASSEMBLER_TEST_RUN(Addiu_overflow, test) {
64 typedef int (*SimpleCode)(); 38 typedef int (*SimpleCode)();
65 EXPECT_EQ(static_cast<int32_t>(0x80000000), 39 EXPECT_EQ(static_cast<int32_t>(0x80000000),
66 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 40 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
67 } 41 }
68 42
69 43
70 ASSEMBLER_TEST_GENERATE(Addu, assembler) { 44 ASSEMBLER_TEST_GENERATE(Addu, assembler) {
71 __ addi(R2, ZR, Immediate(21)); 45 __ addiu(R2, ZR, Immediate(21));
72 __ addi(R3, ZR, Immediate(21)); 46 __ addiu(R3, ZR, Immediate(21));
73 __ addu(V0, R2, R3); 47 __ addu(V0, R2, R3);
74 __ jr(RA); 48 __ jr(RA);
75 } 49 }
76 50
77 51
78 ASSEMBLER_TEST_RUN(Addu, test) { 52 ASSEMBLER_TEST_RUN(Addu, test) {
79 typedef int (*SimpleCode)(); 53 typedef int (*SimpleCode)();
80 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 54 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
81 } 55 }
82 56
83 57
84 ASSEMBLER_TEST_GENERATE(Addu_overflow, assembler) { 58 ASSEMBLER_TEST_GENERATE(Addu_overflow, assembler) {
85 __ LoadImmediate(R2, 0x7fffffff); 59 __ LoadImmediate(R2, 0x7fffffff);
86 __ addi(R3, R0, Immediate(1)); 60 __ addiu(R3, R0, Immediate(1));
87 __ addu(V0, R2, R3); 61 __ addu(V0, R2, R3);
88 __ jr(RA); 62 __ jr(RA);
89 } 63 }
90 64
91 65
92 ASSEMBLER_TEST_RUN(Addu_overflow, test) { 66 ASSEMBLER_TEST_RUN(Addu_overflow, test) {
93 typedef int (*SimpleCode)(); 67 typedef int (*SimpleCode)();
94 EXPECT_EQ(static_cast<int32_t>(0x80000000), 68 EXPECT_EQ(static_cast<int32_t>(0x80000000),
95 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 69 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
96 } 70 }
97 71
98 72
99 ASSEMBLER_TEST_GENERATE(And, assembler) { 73 ASSEMBLER_TEST_GENERATE(And, assembler) {
100 __ addi(R2, ZR, Immediate(42)); 74 __ addiu(R2, ZR, Immediate(42));
101 __ addi(R3, ZR, Immediate(2)); 75 __ addiu(R3, ZR, Immediate(2));
102 __ and_(V0, R2, R3); 76 __ and_(V0, R2, R3);
103 __ jr(RA); 77 __ jr(RA);
104 } 78 }
105 79
106 80
107 ASSEMBLER_TEST_RUN(And, test) { 81 ASSEMBLER_TEST_RUN(And, test) {
108 typedef int (*SimpleCode)(); 82 typedef int (*SimpleCode)();
109 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 83 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
110 } 84 }
111 85
112 86
113 ASSEMBLER_TEST_GENERATE(Andi, assembler) { 87 ASSEMBLER_TEST_GENERATE(Andi, assembler) {
114 __ addi(R1, ZR, Immediate(42)); 88 __ addiu(R1, ZR, Immediate(42));
115 __ andi(V0, R1, Immediate(2)); 89 __ andi(V0, R1, Immediate(2));
116 __ jr(RA); 90 __ jr(RA);
117 } 91 }
118 92
119 93
120 ASSEMBLER_TEST_RUN(Andi, test) { 94 ASSEMBLER_TEST_RUN(Andi, test) {
121 typedef int (*SimpleCode)(); 95 typedef int (*SimpleCode)();
122 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 96 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
123 } 97 }
124 98
125 99
126 ASSEMBLER_TEST_GENERATE(Clo, assembler) { 100 ASSEMBLER_TEST_GENERATE(Clo, assembler) {
127 __ addi(R1, ZR, Immediate(0xffff)); 101 __ addiu(R1, ZR, Immediate(-1));
128 __ clo(V0, R1); 102 __ clo(V0, R1);
129 __ jr(RA); 103 __ jr(RA);
130 } 104 }
131 105
132 106
133 ASSEMBLER_TEST_RUN(Clo, test) { 107 ASSEMBLER_TEST_RUN(Clo, test) {
134 typedef int (*SimpleCode)(); 108 typedef int (*SimpleCode)();
135 EXPECT_EQ(32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 109 EXPECT_EQ(32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
136 } 110 }
137 111
138 112
139 ASSEMBLER_TEST_GENERATE(Clz, assembler) { 113 ASSEMBLER_TEST_GENERATE(Clz, assembler) {
140 __ addi(R1, ZR, Immediate(0x7fff)); 114 __ addiu(R1, ZR, Immediate(0x7fff));
141 __ clz(V0, R1); 115 __ clz(V0, R1);
142 __ jr(RA); 116 __ jr(RA);
143 } 117 }
144 118
145 119
146 ASSEMBLER_TEST_RUN(Clz, test) { 120 ASSEMBLER_TEST_RUN(Clz, test) {
147 typedef int (*SimpleCode)(); 121 typedef int (*SimpleCode)();
148 EXPECT_EQ(17, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 122 EXPECT_EQ(17, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
149 } 123 }
150 124
151 125
152 ASSEMBLER_TEST_GENERATE(Divu, assembler) { 126 ASSEMBLER_TEST_GENERATE(Divu, assembler) {
153 __ addi(R1, ZR, Immediate(27)); 127 __ addiu(R1, ZR, Immediate(27));
154 __ addi(R2, ZR, Immediate(9)); 128 __ addiu(R2, ZR, Immediate(9));
155 __ divu(R1, R2); 129 __ divu(R1, R2);
156 __ mflo(V0); 130 __ mflo(V0);
157 __ jr(RA); 131 __ jr(RA);
158 } 132 }
159 133
160 134
161 ASSEMBLER_TEST_RUN(Divu, test) { 135 ASSEMBLER_TEST_RUN(Divu, test) {
162 typedef int (*SimpleCode)(); 136 typedef int (*SimpleCode)();
163 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 137 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
164 } 138 }
165 139
166 140
167 ASSEMBLER_TEST_GENERATE(Div, assembler) { 141 ASSEMBLER_TEST_GENERATE(Div, assembler) {
168 __ addi(R1, ZR, Immediate(27)); 142 __ addiu(R1, ZR, Immediate(27));
169 __ addi(R2, ZR, Immediate(9)); 143 __ addiu(R2, ZR, Immediate(9));
170 __ div(R1, R2); 144 __ div(R1, R2);
171 __ mflo(V0); 145 __ mflo(V0);
172 __ jr(RA); 146 __ jr(RA);
173 } 147 }
174 148
175 149
176 ASSEMBLER_TEST_RUN(Div, test) { 150 ASSEMBLER_TEST_RUN(Div, test) {
177 typedef int (*SimpleCode)(); 151 typedef int (*SimpleCode)();
178 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 152 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
179 } 153 }
180 154
181 155
182 ASSEMBLER_TEST_GENERATE(Divu_zero, assembler) { 156 ASSEMBLER_TEST_GENERATE(Divu_zero, assembler) {
183 __ addi(R1, ZR, Immediate(27)); 157 __ addiu(R1, ZR, Immediate(27));
184 __ addi(R2, ZR, Immediate(0)); 158 __ addiu(R2, ZR, Immediate(0));
185 __ divu(R1, R2); 159 __ divu(R1, R2);
186 __ mflo(V0); 160 __ mflo(V0);
187 __ jr(RA); 161 __ jr(RA);
188 } 162 }
189 163
190 164
191 ASSEMBLER_TEST_RUN(Divu_zero, test) { 165 ASSEMBLER_TEST_RUN(Divu_zero, test) {
192 typedef int (*SimpleCode)(); 166 typedef int (*SimpleCode)();
193 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 167 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
194 } 168 }
195 169
196 170
197 ASSEMBLER_TEST_GENERATE(Div_zero, assembler) { 171 ASSEMBLER_TEST_GENERATE(Div_zero, assembler) {
198 __ addi(R1, ZR, Immediate(27)); 172 __ addiu(R1, ZR, Immediate(27));
199 __ addi(R2, ZR, Immediate(0)); 173 __ addiu(R2, ZR, Immediate(0));
200 __ div(R1, R2); 174 __ div(R1, R2);
201 __ mflo(V0); 175 __ mflo(V0);
202 __ jr(RA); 176 __ jr(RA);
203 } 177 }
204 178
205 179
206 ASSEMBLER_TEST_RUN(Div_zero, test) { 180 ASSEMBLER_TEST_RUN(Div_zero, test) {
207 typedef int (*SimpleCode)(); 181 typedef int (*SimpleCode)();
208 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 182 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
209 } 183 }
(...skipping 23 matching lines...) Expand all
233 } 207 }
234 208
235 209
236 ASSEMBLER_TEST_RUN(Div_corner, test) { 210 ASSEMBLER_TEST_RUN(Div_corner, test) {
237 typedef int (*SimpleCode)(); 211 typedef int (*SimpleCode)();
238 EXPECT_EQ(static_cast<int32_t>(0x80000000), 212 EXPECT_EQ(static_cast<int32_t>(0x80000000),
239 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 213 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
240 } 214 }
241 215
242 216
217 ASSEMBLER_TEST_GENERATE(Lb, assembler) {
218 __ addiu(SP, SP, Immediate(-kWordSize * 30));
219 __ LoadImmediate(R1, 0xff);
220 __ sb(R1, Address(SP));
221 __ lb(V0, Address(SP));
222 __ addiu(SP, SP, Immediate(kWordSize * 30));
223 __ jr(RA);
224 }
225
226
227 ASSEMBLER_TEST_RUN(Lb, test) {
228 typedef int (*SimpleCode)();
229 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
230 }
231
232
233 ASSEMBLER_TEST_GENERATE(Lb_offset, assembler) {
234 __ addiu(SP, SP, Immediate(-kWordSize * 30));
235 __ LoadImmediate(R1, 0xff);
236 __ sb(R1, Address(SP, 1));
237 __ lb(V0, Address(SP, 1));
238 __ addiu(SP, SP, Immediate(kWordSize * 30));
239 __ jr(RA);
240 }
241
242
243 ASSEMBLER_TEST_RUN(Lb_offset, test) {
244 typedef int (*SimpleCode)();
245 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
246 }
247
248
249 ASSEMBLER_TEST_GENERATE(Lbu, assembler) {
250 __ addiu(SP, SP, Immediate(-kWordSize * 30));
251 __ LoadImmediate(R1, 0xff);
252 __ sb(R1, Address(SP));
253 __ lbu(V0, Address(SP));
254 __ addiu(SP, SP, Immediate(kWordSize * 30));
255 __ jr(RA);
256 }
257
258
259 ASSEMBLER_TEST_RUN(Lbu, test) {
260 typedef int (*SimpleCode)();
261 EXPECT_EQ(255, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
262 }
263
264
265 ASSEMBLER_TEST_GENERATE(Lh, assembler) {
266 __ addiu(SP, SP, Immediate(-kWordSize * 30));
267 __ LoadImmediate(R1, 0xffff);
268 __ sh(R1, Address(SP));
269 __ lh(V0, Address(SP));
270 __ addiu(SP, SP, Immediate(kWordSize * 30));
271 __ jr(RA);
272 }
273
274
275 ASSEMBLER_TEST_RUN(Lh, test) {
276 typedef int (*SimpleCode)();
277 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
278 }
279
280
281 ASSEMBLER_TEST_GENERATE(Lhu, assembler) {
282 __ addiu(SP, SP, Immediate(-kWordSize * 30));
283 __ LoadImmediate(R1, 0xffff);
284 __ sh(R1, Address(SP));
285 __ lhu(V0, Address(SP));
286 __ addiu(SP, SP, Immediate(kWordSize * 30));
287 __ jr(RA);
288 }
289
290
291 ASSEMBLER_TEST_RUN(Lhu, test) {
292 typedef int (*SimpleCode)();
293 EXPECT_EQ(65535, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
294 }
295
296
297 ASSEMBLER_TEST_GENERATE(Lw, assembler) {
298 __ addiu(SP, SP, Immediate(-kWordSize * 30));
299 __ LoadImmediate(R1, -1);
300 __ sw(R1, Address(SP));
301 __ lw(V0, Address(SP));
302 __ addiu(SP, SP, Immediate(kWordSize * 30));
303 __ jr(RA);
304 }
305
306
307 ASSEMBLER_TEST_RUN(Lw, test) {
308 typedef int (*SimpleCode)();
309 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
310 }
311
312
243 ASSEMBLER_TEST_GENERATE(Lui, assembler) { 313 ASSEMBLER_TEST_GENERATE(Lui, assembler) {
244 __ lui(V0, Immediate(0x2a)); 314 __ lui(V0, Immediate(42));
245 __ jr(RA); 315 __ jr(RA);
246 } 316 }
247 317
248 318
249 ASSEMBLER_TEST_RUN(Lui, test) { 319 ASSEMBLER_TEST_RUN(Lui, test) {
250 typedef int (*SimpleCode)(); 320 typedef int (*SimpleCode)();
251 EXPECT_EQ(42 << 16, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 321 EXPECT_EQ(42 << 16, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
252 } 322 }
253 323
254 324
255 ASSEMBLER_TEST_GENERATE(Simple, assembler) { 325 ASSEMBLER_TEST_GENERATE(Simple, assembler) {
256 __ jr(RA); 326 __ jr(RA);
257 __ delay_slot()->ori(V0, ZR, Immediate(42)); 327 __ delay_slot()->ori(V0, ZR, Immediate(42));
258 } 328 }
259 329
260 330
261 ASSEMBLER_TEST_RUN(Simple, test) { 331 ASSEMBLER_TEST_RUN(Simple, test) {
262 typedef int (*SimpleCode)(); 332 typedef int (*SimpleCode)();
263 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 333 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
264 } 334 }
265 335
266 } // namespace dart 336 } // namespace dart
267 337
268 #endif // defined TARGET_ARCH_MIPS 338 #endif // defined TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « runtime/vm/assembler_mips.h ('k') | runtime/vm/disassembler_mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698