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

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

Issue 12545024: Adds a few MIPS arithmetic instructions to the 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
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
Ivan Posva 2013/03/11 06:03:27 See comment below.
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),
Ivan Posva 2013/03/11 06:03:27 Shouldn't this execute a trap?
zra 2013/03/11 15:46:03 It should execute a trap, yes. Is there any way to
40 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
41 }
42
43
44 ASSEMBLER_TEST_GENERATE(Addiu, assembler) {
45 __ addiu(V0, ZR, Immediate(42));
46 __ jr(RA);
47 }
48
49
50 ASSEMBLER_TEST_RUN(Addiu, test) {
51 typedef int (*SimpleCode)();
52 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
53 }
54
55
56 ASSEMBLER_TEST_GENERATE(Addiu_overflow, assembler) {
57 __ LoadImmediate(V0, 0x7fffffff);
58 __ addiu(V0, V0, Immediate(1)); // V0 is set on overflow
Ivan Posva 2013/03/11 06:03:27 V0 is set to which value? Probably it would be cle
zra 2013/03/11 15:46:03 Done.
59 __ jr(RA);
60 }
61
62
63 ASSEMBLER_TEST_RUN(Addiu_overflow, test) {
64 typedef int (*SimpleCode)();
65 EXPECT_EQ(static_cast<int32_t>(0x80000000),
66 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
67 }
68
69
70 ASSEMBLER_TEST_GENERATE(Addu, assembler) {
71 __ addi(R2, ZR, Immediate(21));
72 __ addi(R3, ZR, Immediate(21));
73 __ addu(V0, R2, R3);
74 __ jr(RA);
75 }
76
77
78 ASSEMBLER_TEST_RUN(Addu, test) {
79 typedef int (*SimpleCode)();
80 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
81 }
82
83
84 ASSEMBLER_TEST_GENERATE(Addu_overflow, assembler) {
85 __ LoadImmediate(R2, 0x7fffffff);
86 __ addi(R3, R0, Immediate(1));
87 __ addu(V0, R2, R3);
88 __ jr(RA);
89 }
90
91
92 ASSEMBLER_TEST_RUN(Addu_overflow, test) {
93 typedef int (*SimpleCode)();
94 EXPECT_EQ(static_cast<int32_t>(0x80000000),
95 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
96 }
97
98
99 ASSEMBLER_TEST_GENERATE(And, assembler) {
100 __ addi(R2, ZR, Immediate(42));
101 __ addi(R3, ZR, Immediate(2));
102 __ and_(V0, R2, R3);
103 __ jr(RA);
104 }
105
106
107 ASSEMBLER_TEST_RUN(And, test) {
108 typedef int (*SimpleCode)();
109 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
110 }
111
112
113 ASSEMBLER_TEST_GENERATE(Andi, assembler) {
114 __ addi(R1, ZR, Immediate(42));
115 __ andi(V0, R1, Immediate(2));
116 __ jr(RA);
117 }
118
119
120 ASSEMBLER_TEST_RUN(Andi, test) {
121 typedef int (*SimpleCode)();
122 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
123 }
124
125
126 ASSEMBLER_TEST_GENERATE(Clo, assembler) {
127 __ addi(R1, ZR, Immediate(0xffff));
Ivan Posva 2013/03/11 06:03:27 It would be much clearer if you passed a -1 here.
zra 2013/03/11 15:46:03 Done.
128 __ clo(V0, R1);
129 __ jr(RA);
130 }
131
132
133 ASSEMBLER_TEST_RUN(Clo, test) {
134 typedef int (*SimpleCode)();
135 EXPECT_EQ(32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
136 }
137
138
139 ASSEMBLER_TEST_GENERATE(Clz, assembler) {
140 __ addi(R1, ZR, Immediate(0x7fff));
141 __ clz(V0, R1);
142 __ jr(RA);
143 }
144
145
146 ASSEMBLER_TEST_RUN(Clz, test) {
147 typedef int (*SimpleCode)();
148 EXPECT_EQ(17, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
149 }
150
151
152 ASSEMBLER_TEST_GENERATE(Divu, assembler) {
153 __ addi(R1, ZR, Immediate(27));
154 __ addi(R2, ZR, Immediate(9));
155 __ divu(R1, R2);
156 __ mflo(V0);
157 __ jr(RA);
158 }
159
160
161 ASSEMBLER_TEST_RUN(Divu, test) {
162 typedef int (*SimpleCode)();
163 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
164 }
165
166
167 ASSEMBLER_TEST_GENERATE(Div, assembler) {
168 __ addi(R1, ZR, Immediate(27));
169 __ addi(R2, ZR, Immediate(9));
170 __ div(R1, R2);
171 __ mflo(V0);
172 __ jr(RA);
173 }
174
175
176 ASSEMBLER_TEST_RUN(Div, test) {
177 typedef int (*SimpleCode)();
178 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
179 }
180
181
182 ASSEMBLER_TEST_GENERATE(Divu_zero, assembler) {
183 __ addi(R1, ZR, Immediate(27));
184 __ addi(R2, ZR, Immediate(0));
185 __ divu(R1, R2);
186 __ mflo(V0);
187 __ jr(RA);
188 }
189
190
191 ASSEMBLER_TEST_RUN(Divu_zero, test) {
192 typedef int (*SimpleCode)();
193 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
194 }
195
196
197 ASSEMBLER_TEST_GENERATE(Div_zero, assembler) {
198 __ addi(R1, ZR, Immediate(27));
199 __ addi(R2, ZR, Immediate(0));
200 __ div(R1, R2);
201 __ mflo(V0);
202 __ jr(RA);
203 }
204
205
206 ASSEMBLER_TEST_RUN(Div_zero, test) {
207 typedef int (*SimpleCode)();
208 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
209 }
210
211
212 ASSEMBLER_TEST_GENERATE(Divu_corner, assembler) {
213 __ LoadImmediate(R1, 0x80000000);
214 __ LoadImmediate(R2, 0xffffffff);
215 __ divu(R1, R2);
216 __ mflo(V0);
217 __ jr(RA);
218 }
219
220
221 ASSEMBLER_TEST_RUN(Divu_corner, test) {
222 typedef int (*SimpleCode)();
223 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
224 }
225
226
227 ASSEMBLER_TEST_GENERATE(Div_corner, assembler) {
228 __ LoadImmediate(R1, 0x80000000);
229 __ LoadImmediate(R2, 0xffffffff);
230 __ div(R1, R2);
231 __ mflo(V0);
232 __ jr(RA);
233 }
234
235
236 ASSEMBLER_TEST_RUN(Div_corner, test) {
237 typedef int (*SimpleCode)();
238 EXPECT_EQ(static_cast<int32_t>(0x80000000),
239 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
240 }
241
242
243 ASSEMBLER_TEST_GENERATE(Lui, assembler) {
244 __ lui(V0, Immediate(0x2a));
245 __ jr(RA);
246 }
247
248
249 ASSEMBLER_TEST_RUN(Lui, test) {
250 typedef int (*SimpleCode)();
251 EXPECT_EQ(42 << 16, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
252 }
253
254
18 ASSEMBLER_TEST_GENERATE(Simple, assembler) { 255 ASSEMBLER_TEST_GENERATE(Simple, assembler) {
19 __ jr(RA); 256 __ jr(RA);
20 __ delay_slot()->ori(V0, ZR, Immediate(42)); 257 __ delay_slot()->ori(V0, ZR, Immediate(42));
21 } 258 }
22 259
23 260
24 ASSEMBLER_TEST_RUN(Simple, test) { 261 ASSEMBLER_TEST_RUN(Simple, test) {
25 typedef int (*SimpleCode)(); 262 typedef int (*SimpleCode)();
26 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 263 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
27 } 264 }
28 265
29 } // namespace dart 266 } // namespace dart
30 267
31 #endif // defined TARGET_ARCH_MIPS 268 #endif // defined TARGET_ARCH_MIPS
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698