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

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
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) {
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
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));
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 // Move lo into V0
regis 2013/03/08 21:09:03 We like periods at the end of comments. But this c
157 __ mflo(V0);
158 __ jr(RA);
159 }
160
161
162 ASSEMBLER_TEST_RUN(Divu, test) {
163 typedef int (*SimpleCode)();
164 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
165 }
166
167
168 ASSEMBLER_TEST_GENERATE(Div, assembler) {
169 __ addi(R1, ZR, Immediate(27));
170 __ addi(R2, ZR, Immediate(9));
171 __ div(R1, R2);
172 // Move lo into V0
regis 2013/03/08 21:09:03 ditto
173 __ mflo(V0);
174 __ jr(RA);
175 }
176
177
178 ASSEMBLER_TEST_RUN(Div, test) {
179 typedef int (*SimpleCode)();
180 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
181 }
182
183
184 ASSEMBLER_TEST_GENERATE(Divu_zero, assembler) {
185 __ addi(R1, ZR, Immediate(27));
186 __ addi(R2, ZR, Immediate(0));
187 __ divu(R1, R2);
188 // Move lo into V0
regis 2013/03/08 21:09:03 ditto
189 __ mflo(V0);
190 __ jr(RA);
191 }
192
193
194 ASSEMBLER_TEST_RUN(Divu_zero, test) {
195 typedef int (*SimpleCode)();
196 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
197 }
198
199
200 ASSEMBLER_TEST_GENERATE(Div_zero, assembler) {
201 __ addi(R1, ZR, Immediate(27));
202 __ addi(R2, ZR, Immediate(0));
203 __ div(R1, R2);
204 // Move lo into V0
regis 2013/03/08 21:09:03 ditto
205 __ mflo(V0);
206 __ jr(RA);
207 }
208
209
210 ASSEMBLER_TEST_RUN(Div_zero, test) {
211 typedef int (*SimpleCode)();
212 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
213 }
214
215
216 ASSEMBLER_TEST_GENERATE(Divu_corner, assembler) {
217 __ LoadImmediate(R1, 0x80000000);
218 __ LoadImmediate(R2, 0xffffffff);
219 __ divu(R1, R2);
220 __ mflo(V0);
221 __ jr(RA);
222 }
223
224
225 ASSEMBLER_TEST_RUN(Divu_corner, test) {
226 typedef int (*SimpleCode)();
227 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
228 }
229
230
231 ASSEMBLER_TEST_GENERATE(Div_corner, assembler) {
232 __ LoadImmediate(R1, 0x80000000);
233 __ LoadImmediate(R2, 0xffffffff);
234 __ div(R1, R2);
235 __ mflo(V0);
236 __ jr(RA);
237 }
238
239
240 ASSEMBLER_TEST_RUN(Div_corner, test) {
241 typedef int (*SimpleCode)();
242 EXPECT_EQ(static_cast<int32_t>(0x80000000),
243 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
244 }
245
246
18 ASSEMBLER_TEST_GENERATE(Simple, assembler) { 247 ASSEMBLER_TEST_GENERATE(Simple, assembler) {
19 __ jr(RA); 248 __ jr(RA);
20 __ delay_slot()->ori(V0, ZR, Immediate(42)); 249 __ delay_slot()->ori(V0, ZR, Immediate(42));
21 } 250 }
22 251
23 252
24 ASSEMBLER_TEST_RUN(Simple, test) { 253 ASSEMBLER_TEST_RUN(Simple, test) {
25 typedef int (*SimpleCode)(); 254 typedef int (*SimpleCode)();
26 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 255 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
27 } 256 }
28 257
258
regis 2013/03/08 21:09:03 No extra blank line needed here.
29 } // namespace dart 259 } // namespace dart
30 260
31 #endif // defined TARGET_ARCH_MIPS 261 #endif // defined TARGET_ARCH_MIPS
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698