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

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

Issue 14672037: Implements FPU compare and branching for MIPS simulator, assembler, disassembler. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 7 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/constants_mips.h » ('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"
(...skipping 1185 matching lines...) Expand 10 before | Expand all | Expand 10 after
1196 1196
1197 1197
1198 ASSEMBLER_TEST_RUN(Addd, test) { 1198 ASSEMBLER_TEST_RUN(Addd, test) {
1199 typedef double (*SimpleCode)(); 1199 typedef double (*SimpleCode)();
1200 EXPECT(test != NULL); 1200 EXPECT(test != NULL);
1201 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); 1201 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry());
1202 EXPECT_FLOAT_EQ(3.0, res, 0.001); 1202 EXPECT_FLOAT_EQ(3.0, res, 0.001);
1203 } 1203 }
1204 1204
1205 1205
1206 ASSEMBLER_TEST_GENERATE(Adds, assembler) {
1207 __ LoadImmediate(F0, 1.0f);
1208 __ LoadImmediate(F2, 2.0f);
1209 __ adds(F4, F0, F2);
1210 __ mfc1(V0, F4);
1211 __ Ret();
1212 }
1213
1214
1215 ASSEMBLER_TEST_RUN(Adds, test) {
1216 typedef double (*SimpleCode)();
1217 EXPECT(test != NULL);
1218 double res = EXECUTE_TEST_CODE_FLOAT(SimpleCode, test->entry());
1219 EXPECT_FLOAT_EQ(3.0, res, 0.001);
1220 }
1221
1222
1223 ASSEMBLER_TEST_GENERATE(Movd, assembler) { 1206 ASSEMBLER_TEST_GENERATE(Movd, assembler) {
1224 __ LoadImmediate(F0, 1.0); 1207 __ LoadImmediate(F0, 1.0);
1225 __ movd(F2, F0); 1208 __ movd(F2, F0);
1226 __ mfc1(V0, F2); 1209 __ mfc1(V0, F2);
1227 __ mfc1(V1, F3); 1210 __ mfc1(V1, F3);
1228 __ Ret(); 1211 __ Ret();
1229 } 1212 }
1230 1213
1231 1214
1232 ASSEMBLER_TEST_RUN(Movd, test) { 1215 ASSEMBLER_TEST_RUN(Movd, test) {
1233 typedef double (*SimpleCode)(); 1216 typedef double (*SimpleCode)();
1234 EXPECT(test != NULL); 1217 EXPECT(test != NULL);
1235 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); 1218 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry());
1236 EXPECT_FLOAT_EQ(1.0, res, 0.001); 1219 EXPECT_FLOAT_EQ(1.0, res, 0.001);
1237 } 1220 }
1238 1221
1239 1222
1240 ASSEMBLER_TEST_GENERATE(Movs, assembler) {
1241 __ LoadImmediate(F0, 1.0f);
1242 __ movd(F2, F0);
1243 __ mfc1(V0, F2);
1244 __ Ret();
1245 }
1246
1247
1248 ASSEMBLER_TEST_RUN(Movs, test) {
1249 typedef double (*SimpleCode)();
1250 EXPECT(test != NULL);
1251 double res = EXECUTE_TEST_CODE_FLOAT(SimpleCode, test->entry());
1252 EXPECT_FLOAT_EQ(1.0, res, 0.001);
1253 }
1254
1255
1256 ASSEMBLER_TEST_GENERATE(Sdc1Ldc1, assembler) { 1223 ASSEMBLER_TEST_GENERATE(Sdc1Ldc1, assembler) {
1257 __ AddImmediate(SP, -8 * kWordSize); 1224 __ AddImmediate(SP, -8 * kWordSize);
1258 __ LoadImmediate(T1, ~(8 - 1)); 1225 __ LoadImmediate(T1, ~(8 - 1));
1259 __ and_(T0, SP, T1); // Need 8 byte alignment. 1226 __ and_(T0, SP, T1); // Need 8 byte alignment.
1260 __ LoadImmediate(F0, 1.0); 1227 __ LoadImmediate(F0, 1.0);
1261 __ sdc1(F0, Address(T0)); 1228 __ sdc1(F0, Address(T0));
1262 __ ldc1(F2, Address(T0)); 1229 __ ldc1(F2, Address(T0));
1263 __ mfc1(V0, F2); 1230 __ mfc1(V0, F2);
1264 __ mfc1(V1, F3); 1231 __ mfc1(V1, F3);
1265 __ Ret(); 1232 __ Ret();
1266 } 1233 }
1267 1234
1268 1235
1269 ASSEMBLER_TEST_RUN(Sdc1Ldc1, test) { 1236 ASSEMBLER_TEST_RUN(Sdc1Ldc1, test) {
1270 typedef double (*SimpleCode)(); 1237 typedef double (*SimpleCode)();
1271 EXPECT(test != NULL); 1238 EXPECT(test != NULL);
1272 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); 1239 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry());
1273 EXPECT_FLOAT_EQ(1.0, res, 0.001); 1240 EXPECT_FLOAT_EQ(1.0, res, 0.001);
1274 } 1241 }
1275 1242
1276 1243
1277 ASSEMBLER_TEST_GENERATE(Swc1Lwc1, assembler) { 1244 ASSEMBLER_TEST_GENERATE(Addd_NaN, assembler) {
1278 __ AddImmediate(SP, -1 * kWordSize); 1245 __ LoadImmediate(F0, 1.0);
1279 __ LoadImmediate(F0, 1.0f); 1246 // Double non-signaling NaN is 0x7FF8000000000000.
1280 __ swc1(F0, Address(SP)); 1247 __ LoadImmediate(T0, 0x7FF80000);
1281 __ lwc1(F1, Address(SP)); 1248 __ mtc1(ZR, F2); // Load upper bits of NaN.
1282 __ mfc1(V0, F1); 1249 __ mtc1(T0, F3); // Load lower bits of NaN.
1283 __ AddImmediate(SP, 1 * kWordSize); 1250 __ addd(F4, F0, F2);
1284 __ Ret(); 1251 __ mfc1(V0, F4);
1285 } 1252 __ mfc1(V1, F5);
1286 1253 __ Ret();
1287 ASSEMBLER_TEST_RUN(Swc1Lwc1, test) { 1254 }
1255
1256
1257 ASSEMBLER_TEST_RUN(Addd_NaN, test) {
1288 typedef double (*SimpleCode)(); 1258 typedef double (*SimpleCode)();
1289 EXPECT(test != NULL); 1259 EXPECT(test != NULL);
1290 double res = EXECUTE_TEST_CODE_FLOAT(SimpleCode, test->entry()); 1260 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry());
1291 EXPECT_FLOAT_EQ(1.0, res, 0.001); 1261 EXPECT_EQ(isnan(res), true);
1292 } 1262 }
1293 1263
1294 1264
1295 ASSEMBLER_TEST_GENERATE(Adds_NaN, assembler) { 1265 ASSEMBLER_TEST_GENERATE(Addd_Inf, assembler) {
1296 __ LoadImmediate(F0, 1.0f); 1266 __ LoadImmediate(F0, 1.0f);
1297 __ LoadImmediate(T0, 0x7f800001); // NaN 1267 __ LoadImmediate(T0, 0x7FF00000); // +inf
1298 __ mtc1(T0, F2); 1268 __ mtc1(ZR, F2);
1299 __ adds(F4, F0, F2); 1269 __ mtc1(T0, F3);
1270 __ addd(F4, F0, F2);
1300 __ mfc1(V0, F4); 1271 __ mfc1(V0, F4);
1301 __ Ret(); 1272 __ mfc1(V1, F5);
1302 } 1273 __ Ret();
1303 1274 }
1304 1275
1305 ASSEMBLER_TEST_RUN(Adds_NaN, test) { 1276
1277 ASSEMBLER_TEST_RUN(Addd_Inf, test) {
1306 typedef double (*SimpleCode)(); 1278 typedef double (*SimpleCode)();
1307 EXPECT(test != NULL); 1279 EXPECT(test != NULL);
1308 float res = EXECUTE_TEST_CODE_FLOAT(SimpleCode, test->entry()); 1280 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry());
1309 EXPECT_EQ(isnan(res), true);
1310 }
1311
1312
1313 ASSEMBLER_TEST_GENERATE(Adds_Inf, assembler) {
1314 __ LoadImmediate(F0, 1.0f);
1315 __ LoadImmediate(T0, 0x7f800000); // +inf
1316 __ mtc1(T0, F2);
1317 __ adds(F4, F0, F2);
1318 __ mfc1(V0, F4);
1319 __ Ret();
1320 }
1321
1322
1323 ASSEMBLER_TEST_RUN(Adds_Inf, test) {
1324 typedef double (*SimpleCode)();
1325 EXPECT(test != NULL);
1326 float res = EXECUTE_TEST_CODE_FLOAT(SimpleCode, test->entry());
1327 EXPECT_EQ(isfinite(res), false); 1281 EXPECT_EQ(isfinite(res), false);
1328 } 1282 }
1329 1283
1330 1284
1285 ASSEMBLER_TEST_GENERATE(Cop1CUN, assembler) {
1286 Label is_true;
1287
1288 __ LoadImmediate(F0, 42.0);
1289 __ LoadImmediate(T0, 0x7FF80000);
1290 __ mtc1(ZR, F2);
1291 __ mtc1(T0, F3);
1292 __ LoadImmediate(V0, 42);
1293 __ cund(F0, F2);
1294 __ bc1t(&is_true);
1295 __ mov(V0, ZR);
1296 __ Bind(&is_true);
1297 __ Ret();
1298 }
1299
1300
1301 ASSEMBLER_TEST_RUN(Cop1CUN, test) {
1302 typedef int (*SimpleCode)();
1303 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1304 }
1305
1306
1307 ASSEMBLER_TEST_GENERATE(Cop1CUN_not_taken, assembler) {
1308 Label is_true;
1309
1310 __ LoadImmediate(F0, 42.0);
1311 __ LoadImmediate(F2, 42.0);
1312 __ LoadImmediate(V0, 42);
1313 __ cund(F0, F2);
1314 __ bc1t(&is_true);
1315 __ mov(V0, ZR);
1316 __ Bind(&is_true);
1317 __ Ret();
1318 }
1319
1320
1321 ASSEMBLER_TEST_RUN(Cop1CUN_not_taken, test) {
1322 typedef int (*SimpleCode)();
1323 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1324 }
1325
1326
1327 ASSEMBLER_TEST_GENERATE(Cop1CEq, assembler) {
1328 Label is_true;
1329
1330 __ LoadImmediate(F0, 42.5);
1331 __ LoadImmediate(F2, 42.5);
1332 __ LoadImmediate(V0, 42);
1333 __ ceqd(F0, F2);
1334 __ bc1t(&is_true);
1335 __ mov(V0, ZR);
1336 __ Bind(&is_true);
1337 __ Ret();
1338 }
1339
1340
1341 ASSEMBLER_TEST_RUN(Cop1CEq, test) {
1342 typedef int (*SimpleCode)();
1343 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1344 }
1345
1346
1347 ASSEMBLER_TEST_GENERATE(Cop1CEq_not_taken, assembler) {
1348 Label is_true;
1349
1350 __ LoadImmediate(F0, 42.0);
1351 __ LoadImmediate(F2, 42.5);
1352 __ LoadImmediate(V0, 42);
1353 __ ceqd(F0, F2);
1354 __ bc1t(&is_true);
1355 __ mov(V0, ZR);
1356 __ Bind(&is_true);
1357 __ Ret();
1358 }
1359
1360
1361 ASSEMBLER_TEST_RUN(Cop1CEq_not_taken, test) {
1362 typedef int (*SimpleCode)();
1363 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1364 }
1365
1366
1367 ASSEMBLER_TEST_GENERATE(Cop1CEq_false, assembler) {
1368 Label is_true;
1369
1370 __ LoadImmediate(F0, 42.0);
1371 __ LoadImmediate(F2, 42.5);
1372 __ LoadImmediate(V0, 42);
1373 __ ceqd(F0, F2);
1374 __ bc1f(&is_true);
1375 __ mov(V0, ZR);
1376 __ Bind(&is_true);
1377 __ Ret();
1378 }
1379
1380
1381 ASSEMBLER_TEST_RUN(Cop1CEq_false, test) {
1382 typedef int (*SimpleCode)();
1383 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1384 }
1385
1386
1387 ASSEMBLER_TEST_GENERATE(Cop1CEq_false_not_taken, assembler) {
1388 Label is_true;
1389
1390 __ LoadImmediate(F0, 42.5);
1391 __ LoadImmediate(F2, 42.5);
1392 __ LoadImmediate(V0, 42);
1393 __ ceqd(F0, F2);
1394 __ bc1f(&is_true);
1395 __ mov(V0, ZR);
1396 __ Bind(&is_true);
1397 __ Ret();
1398 }
1399
1400
1401 ASSEMBLER_TEST_RUN(Cop1CEq_false_not_taken, test) {
1402 typedef int (*SimpleCode)();
1403 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1404 }
1405
1406
1407 ASSEMBLER_TEST_GENERATE(Cop1COLT, assembler) {
1408 Label is_true;
1409
1410 __ LoadImmediate(F0, 42.0);
1411 __ LoadImmediate(F2, 42.5);
1412 __ LoadImmediate(V0, 42);
1413 __ coltd(F0, F2);
1414 __ bc1t(&is_true);
1415 __ mov(V0, ZR);
1416 __ Bind(&is_true);
1417 __ Ret();
1418 }
1419
1420
1421 ASSEMBLER_TEST_RUN(Cop1COLT, test) {
1422 typedef int (*SimpleCode)();
1423 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1424 }
1425
1426
1427 ASSEMBLER_TEST_GENERATE(Cop1COLT_not_taken, assembler) {
1428 Label is_true;
1429
1430 __ LoadImmediate(F0, 42.5);
1431 __ LoadImmediate(F2, 42.0);
1432 __ LoadImmediate(V0, 42);
1433 __ coltd(F0, F2);
1434 __ bc1t(&is_true);
1435 __ mov(V0, ZR);
1436 __ Bind(&is_true);
1437 __ Ret();
1438 }
1439
1440
1441 ASSEMBLER_TEST_RUN(Cop1COLT_not_taken, test) {
1442 typedef int (*SimpleCode)();
1443 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1444 }
1445
1446
1447 ASSEMBLER_TEST_GENERATE(Cop1COLE, assembler) {
1448 Label is_true;
1449
1450 __ LoadImmediate(F0, 42.0);
1451 __ LoadImmediate(F2, 42.0);
1452 __ LoadImmediate(V0, 42);
1453 __ coled(F0, F2);
1454 __ bc1t(&is_true);
1455 __ mov(V0, ZR);
1456 __ Bind(&is_true);
1457 __ Ret();
1458 }
1459
1460
1461 ASSEMBLER_TEST_RUN(Cop1COLE, test) {
1462 typedef int (*SimpleCode)();
1463 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1464 }
1465
1466
1467 ASSEMBLER_TEST_GENERATE(Cop1COLE_not_taken, assembler) {
1468 Label is_true;
1469
1470 __ LoadImmediate(F0, 42.5);
1471 __ LoadImmediate(F2, 42.0);
1472 __ LoadImmediate(V0, 42);
1473 __ coled(F0, F2);
1474 __ bc1t(&is_true);
1475 __ mov(V0, ZR);
1476 __ Bind(&is_true);
1477 __ Ret();
1478 }
1479
1480
1481 ASSEMBLER_TEST_RUN(Cop1COLE_not_taken, test) {
1482 typedef int (*SimpleCode)();
1483 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
1484 }
1485
1486
1331 // Called from assembler_test.cc. 1487 // Called from assembler_test.cc.
1332 // RA: return address. 1488 // RA: return address.
1333 // A0: context. 1489 // A0: context.
1334 // A1: value. 1490 // A1: value.
1335 // A2: growable array. 1491 // A2: growable array.
1336 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { 1492 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
1337 __ addiu(SP, SP, Immediate(-2 * kWordSize)); 1493 __ addiu(SP, SP, Immediate(-2 * kWordSize));
1338 __ sw(CTX, Address(SP, 1 * kWordSize)); 1494 __ sw(CTX, Address(SP, 1 * kWordSize));
1339 __ sw(RA, Address(SP, 0 * kWordSize)); 1495 __ sw(RA, Address(SP, 0 * kWordSize));
1340 1496
1341 __ mov(CTX, A0); 1497 __ mov(CTX, A0);
1342 __ StoreIntoObject(A2, 1498 __ StoreIntoObject(A2,
1343 FieldAddress(A2, GrowableObjectArray::data_offset()), 1499 FieldAddress(A2, GrowableObjectArray::data_offset()),
1344 A1); 1500 A1);
1345 __ lw(RA, Address(SP, 0 * kWordSize)); 1501 __ lw(RA, Address(SP, 0 * kWordSize));
1346 __ lw(CTX, Address(SP, 1 * kWordSize)); 1502 __ lw(CTX, Address(SP, 1 * kWordSize));
1347 __ addiu(SP, SP, Immediate(2 * kWordSize)); 1503 __ addiu(SP, SP, Immediate(2 * kWordSize));
1348 __ Ret(); 1504 __ Ret();
1349 } 1505 }
1350 1506
1351 } // namespace dart 1507 } // namespace dart
1352 1508
1353 #endif // defined TARGET_ARCH_MIPS 1509 #endif // defined TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « runtime/vm/assembler_mips.h ('k') | runtime/vm/constants_mips.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698