| OLD | NEW |
| 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 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 __ jr(RA); | 185 __ jr(RA); |
| 186 } | 186 } |
| 187 | 187 |
| 188 | 188 |
| 189 ASSEMBLER_TEST_RUN(Div, test) { | 189 ASSEMBLER_TEST_RUN(Div, test) { |
| 190 typedef int (*SimpleCode)(); | 190 typedef int (*SimpleCode)(); |
| 191 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 191 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 192 } | 192 } |
| 193 | 193 |
| 194 | 194 |
| 195 ASSEMBLER_TEST_GENERATE(Divu_zero, assembler) { | |
| 196 __ addiu(R1, ZR, Immediate(27)); | |
| 197 __ addiu(R2, ZR, Immediate(0)); | |
| 198 __ divu(R1, R2); | |
| 199 __ mflo(V0); | |
| 200 __ jr(RA); | |
| 201 } | |
| 202 | |
| 203 | |
| 204 ASSEMBLER_TEST_RUN(Divu_zero, test) { | |
| 205 typedef int (*SimpleCode)(); | |
| 206 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 207 } | |
| 208 | |
| 209 | |
| 210 ASSEMBLER_TEST_GENERATE(Div_zero, assembler) { | |
| 211 __ addiu(R1, ZR, Immediate(27)); | |
| 212 __ addiu(R2, ZR, Immediate(0)); | |
| 213 __ div(R1, R2); | |
| 214 __ mflo(V0); | |
| 215 __ jr(RA); | |
| 216 } | |
| 217 | |
| 218 | |
| 219 ASSEMBLER_TEST_RUN(Div_zero, test) { | |
| 220 typedef int (*SimpleCode)(); | |
| 221 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 222 } | |
| 223 | |
| 224 | |
| 225 ASSEMBLER_TEST_GENERATE(Divu_corner, assembler) { | 195 ASSEMBLER_TEST_GENERATE(Divu_corner, assembler) { |
| 226 __ LoadImmediate(R1, 0x80000000); | 196 __ LoadImmediate(R1, 0x80000000); |
| 227 __ LoadImmediate(R2, 0xffffffff); | 197 __ LoadImmediate(R2, 0xffffffff); |
| 228 __ divu(R1, R2); | 198 __ divu(R1, R2); |
| 229 __ mflo(V0); | 199 __ mflo(V0); |
| 230 __ jr(RA); | 200 __ jr(RA); |
| 231 } | 201 } |
| 232 | 202 |
| 233 | 203 |
| 234 ASSEMBLER_TEST_RUN(Divu_corner, test) { | 204 ASSEMBLER_TEST_RUN(Divu_corner, test) { |
| (...skipping 975 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1210 | 1180 |
| 1211 | 1181 |
| 1212 ASSEMBLER_TEST_RUN(SubOverflow_detect, test) { | 1182 ASSEMBLER_TEST_RUN(SubOverflow_detect, test) { |
| 1213 typedef int (*SimpleCode)(); | 1183 typedef int (*SimpleCode)(); |
| 1214 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 1184 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 1215 } | 1185 } |
| 1216 | 1186 |
| 1217 | 1187 |
| 1218 ASSEMBLER_TEST_GENERATE(Mtc1Mfc1, assembler) { | 1188 ASSEMBLER_TEST_GENERATE(Mtc1Mfc1, assembler) { |
| 1219 __ mtc1(ZR, F0); | 1189 __ mtc1(ZR, F0); |
| 1190 __ mtc1(ZR, F1); |
| 1220 __ mfc1(V0, F0); | 1191 __ mfc1(V0, F0); |
| 1192 __ mfc1(V1, F1); |
| 1221 __ Ret(); | 1193 __ Ret(); |
| 1222 } | 1194 } |
| 1223 | 1195 |
| 1224 | 1196 |
| 1225 ASSEMBLER_TEST_RUN(Mtc1Mfc1, test) { | 1197 ASSEMBLER_TEST_RUN(Mtc1Mfc1, test) { |
| 1226 typedef double (*SimpleCode)(); | 1198 typedef int (*SimpleCode)(); |
| 1227 EXPECT(test != NULL); | 1199 EXPECT(test != NULL); |
| 1228 double res = EXECUTE_TEST_CODE_FLOAT(SimpleCode, test->entry()); | 1200 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 1229 EXPECT_FLOAT_EQ(0.0, res, 0.001); | |
| 1230 } | 1201 } |
| 1231 | 1202 |
| 1232 | 1203 |
| 1233 ASSEMBLER_TEST_GENERATE(Addd, assembler) { | 1204 ASSEMBLER_TEST_GENERATE(Addd, assembler) { |
| 1234 __ LoadImmediate(D0, 1.0); | 1205 __ LoadImmediate(D0, 1.0); |
| 1235 __ LoadImmediate(D1, 2.0); | 1206 __ LoadImmediate(D1, 2.0); |
| 1236 __ addd(D2, D0, D1); | 1207 __ addd(D0, D0, D1); |
| 1237 __ mfc1(V0, F4); | |
| 1238 __ mfc1(V1, F5); | |
| 1239 __ Ret(); | 1208 __ Ret(); |
| 1240 } | 1209 } |
| 1241 | 1210 |
| 1242 | 1211 |
| 1243 ASSEMBLER_TEST_RUN(Addd, test) { | 1212 ASSEMBLER_TEST_RUN(Addd, test) { |
| 1244 typedef double (*SimpleCode)(); | 1213 typedef double (*SimpleCode)(); |
| 1245 EXPECT(test != NULL); | 1214 EXPECT(test != NULL); |
| 1246 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); | 1215 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
| 1247 EXPECT_FLOAT_EQ(3.0, res, 0.001); | 1216 EXPECT_FLOAT_EQ(3.0, res, 0.001); |
| 1248 } | 1217 } |
| 1249 | 1218 |
| 1250 | 1219 |
| 1251 ASSEMBLER_TEST_GENERATE(Movd, assembler) { | 1220 ASSEMBLER_TEST_GENERATE(Movd, assembler) { |
| 1252 __ LoadImmediate(D0, 1.0); | 1221 __ LoadImmediate(D1, 1.0); |
| 1253 __ movd(D1, D0); | 1222 __ movd(D0, D1); |
| 1254 __ mfc1(V0, F2); | |
| 1255 __ mfc1(V1, F3); | |
| 1256 __ Ret(); | 1223 __ Ret(); |
| 1257 } | 1224 } |
| 1258 | 1225 |
| 1259 | 1226 |
| 1260 ASSEMBLER_TEST_RUN(Movd, test) { | 1227 ASSEMBLER_TEST_RUN(Movd, test) { |
| 1261 typedef double (*SimpleCode)(); | 1228 typedef double (*SimpleCode)(); |
| 1262 EXPECT(test != NULL); | 1229 EXPECT(test != NULL); |
| 1263 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); | 1230 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
| 1264 EXPECT_FLOAT_EQ(1.0, res, 0.001); | 1231 EXPECT_FLOAT_EQ(1.0, res, 0.001); |
| 1265 } | 1232 } |
| 1266 | 1233 |
| 1267 | 1234 |
| 1268 ASSEMBLER_TEST_GENERATE(Sdc1Ldc1, assembler) { | 1235 ASSEMBLER_TEST_GENERATE(Sdc1Ldc1, assembler) { |
| 1269 __ AddImmediate(SP, -8 * kWordSize); | 1236 __ AddImmediate(SP, -8 * kWordSize); |
| 1270 __ LoadImmediate(T1, ~(8 - 1)); | 1237 __ LoadImmediate(T1, ~(8 - 1)); |
| 1271 __ and_(T0, SP, T1); // Need 8 byte alignment. | 1238 __ and_(T0, SP, T1); // Need 8 byte alignment. |
| 1272 __ LoadImmediate(D0, 1.0); | 1239 __ LoadImmediate(D1, 1.0); |
| 1273 __ sdc1(D0, Address(T0)); | 1240 __ sdc1(D1, Address(T0)); |
| 1274 __ ldc1(D1, Address(T0)); | 1241 __ ldc1(D0, Address(T0)); |
| 1275 __ mfc1(V0, F2); | |
| 1276 __ mfc1(V1, F3); | |
| 1277 __ Ret(); | 1242 __ Ret(); |
| 1278 } | 1243 } |
| 1279 | 1244 |
| 1280 | 1245 |
| 1281 ASSEMBLER_TEST_RUN(Sdc1Ldc1, test) { | 1246 ASSEMBLER_TEST_RUN(Sdc1Ldc1, test) { |
| 1282 typedef double (*SimpleCode)(); | 1247 typedef double (*SimpleCode)(); |
| 1283 EXPECT(test != NULL); | 1248 EXPECT(test != NULL); |
| 1284 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); | 1249 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
| 1285 EXPECT_FLOAT_EQ(1.0, res, 0.001); | 1250 EXPECT_FLOAT_EQ(1.0, res, 0.001); |
| 1286 } | 1251 } |
| 1287 | 1252 |
| 1288 | 1253 |
| 1289 ASSEMBLER_TEST_GENERATE(Addd_NaN, assembler) { | 1254 ASSEMBLER_TEST_GENERATE(Addd_NaN, assembler) { |
| 1290 __ LoadImmediate(D0, 1.0); | 1255 __ LoadImmediate(D0, 1.0); |
| 1291 // Double non-signaling NaN is 0x7FF8000000000000. | 1256 // Double non-signaling NaN is 0x7FF8000000000000. |
| 1292 __ LoadImmediate(T0, 0x7FF80000); | 1257 __ LoadImmediate(T0, 0x7FF80000); |
| 1293 __ mtc1(ZR, F2); // Load upper bits of NaN. | 1258 __ mtc1(ZR, F2); // Load upper bits of NaN. |
| 1294 __ mtc1(T0, F3); // Load lower bits of NaN. | 1259 __ mtc1(T0, F3); // Load lower bits of NaN. |
| 1295 __ addd(D2, D0, D1); | 1260 __ addd(D0, D0, D1); |
| 1296 __ mfc1(V0, F4); | |
| 1297 __ mfc1(V1, F5); | |
| 1298 __ Ret(); | 1261 __ Ret(); |
| 1299 } | 1262 } |
| 1300 | 1263 |
| 1301 | 1264 |
| 1302 ASSEMBLER_TEST_RUN(Addd_NaN, test) { | 1265 ASSEMBLER_TEST_RUN(Addd_NaN, test) { |
| 1303 typedef double (*SimpleCode)(); | 1266 typedef double (*SimpleCode)(); |
| 1304 EXPECT(test != NULL); | 1267 EXPECT(test != NULL); |
| 1305 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); | 1268 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
| 1306 EXPECT_EQ(isnan(res), true); | 1269 EXPECT_EQ(isnan(res), true); |
| 1307 } | 1270 } |
| 1308 | 1271 |
| 1309 | 1272 |
| 1310 ASSEMBLER_TEST_GENERATE(Addd_Inf, assembler) { | 1273 ASSEMBLER_TEST_GENERATE(Addd_Inf, assembler) { |
| 1311 __ LoadImmediate(D0, 1.0); | 1274 __ LoadImmediate(D0, 1.0); |
| 1312 __ LoadImmediate(T0, 0x7FF00000); // +inf | 1275 __ LoadImmediate(T0, 0x7FF00000); // +inf |
| 1313 __ mtc1(ZR, F2); | 1276 __ mtc1(ZR, F2); |
| 1314 __ mtc1(T0, F3); | 1277 __ mtc1(T0, F3); |
| 1315 __ addd(D2, D0, D1); | 1278 __ addd(D0, D0, D1); |
| 1316 __ mfc1(V0, F4); | |
| 1317 __ mfc1(V1, F5); | |
| 1318 __ Ret(); | 1279 __ Ret(); |
| 1319 } | 1280 } |
| 1320 | 1281 |
| 1321 | 1282 |
| 1322 ASSEMBLER_TEST_RUN(Addd_Inf, test) { | 1283 ASSEMBLER_TEST_RUN(Addd_Inf, test) { |
| 1323 typedef double (*SimpleCode)(); | 1284 typedef double (*SimpleCode)(); |
| 1324 EXPECT(test != NULL); | 1285 EXPECT(test != NULL); |
| 1325 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); | 1286 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
| 1326 EXPECT_EQ(isfinite(res), false); | 1287 EXPECT_EQ(isfinite(res), false); |
| 1327 } | 1288 } |
| 1328 | 1289 |
| 1329 | 1290 |
| 1330 ASSEMBLER_TEST_GENERATE(Subd, assembler) { | 1291 ASSEMBLER_TEST_GENERATE(Subd, assembler) { |
| 1331 __ LoadImmediate(D0, 2.5); | 1292 __ LoadImmediate(D0, 2.5); |
| 1332 __ LoadImmediate(D1, 1.5); | 1293 __ LoadImmediate(D1, 1.5); |
| 1333 __ subd(D2, D0, D1); | 1294 __ subd(D0, D0, D1); |
| 1334 __ mfc1(V0, F4); | |
| 1335 __ mfc1(V1, F5); | |
| 1336 __ Ret(); | 1295 __ Ret(); |
| 1337 } | 1296 } |
| 1338 | 1297 |
| 1339 | 1298 |
| 1340 ASSEMBLER_TEST_RUN(Subd, test) { | 1299 ASSEMBLER_TEST_RUN(Subd, test) { |
| 1341 typedef double (*SimpleCode)(); | 1300 typedef double (*SimpleCode)(); |
| 1342 EXPECT(test != NULL); | 1301 EXPECT(test != NULL); |
| 1343 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); | 1302 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
| 1344 EXPECT_FLOAT_EQ(1.0, res, 0.001); | 1303 EXPECT_FLOAT_EQ(1.0, res, 0.001); |
| 1345 } | 1304 } |
| 1346 | 1305 |
| 1347 | 1306 |
| 1348 ASSEMBLER_TEST_GENERATE(Muld, assembler) { | 1307 ASSEMBLER_TEST_GENERATE(Muld, assembler) { |
| 1349 __ LoadImmediate(D0, 6.0); | 1308 __ LoadImmediate(D0, 6.0); |
| 1350 __ LoadImmediate(D1, 7.0); | 1309 __ LoadImmediate(D1, 7.0); |
| 1351 __ muld(D2, D0, D1); | 1310 __ muld(D0, D0, D1); |
| 1352 __ mfc1(V0, F4); | |
| 1353 __ mfc1(V1, F5); | |
| 1354 __ Ret(); | 1311 __ Ret(); |
| 1355 } | 1312 } |
| 1356 | 1313 |
| 1357 | 1314 |
| 1358 ASSEMBLER_TEST_RUN(Muld, test) { | 1315 ASSEMBLER_TEST_RUN(Muld, test) { |
| 1359 typedef double (*SimpleCode)(); | 1316 typedef double (*SimpleCode)(); |
| 1360 EXPECT(test != NULL); | 1317 EXPECT(test != NULL); |
| 1361 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); | 1318 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
| 1362 EXPECT_FLOAT_EQ(42.0, res, 0.001); | 1319 EXPECT_FLOAT_EQ(42.0, res, 0.001); |
| 1363 } | 1320 } |
| 1364 | 1321 |
| 1365 | 1322 |
| 1366 ASSEMBLER_TEST_GENERATE(Divd, assembler) { | 1323 ASSEMBLER_TEST_GENERATE(Divd, assembler) { |
| 1367 __ LoadImmediate(D0, 42.0); | 1324 __ LoadImmediate(D0, 42.0); |
| 1368 __ LoadImmediate(D1, 7.0); | 1325 __ LoadImmediate(D1, 7.0); |
| 1369 __ divd(D2, D0, D1); | 1326 __ divd(D0, D0, D1); |
| 1370 __ mfc1(V0, F4); | |
| 1371 __ mfc1(V1, F5); | |
| 1372 __ Ret(); | 1327 __ Ret(); |
| 1373 } | 1328 } |
| 1374 | 1329 |
| 1375 | 1330 |
| 1376 ASSEMBLER_TEST_RUN(Divd, test) { | 1331 ASSEMBLER_TEST_RUN(Divd, test) { |
| 1377 typedef double (*SimpleCode)(); | 1332 typedef double (*SimpleCode)(); |
| 1378 EXPECT(test != NULL); | 1333 EXPECT(test != NULL); |
| 1379 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); | 1334 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
| 1380 EXPECT_FLOAT_EQ(6.0, res, 0.001); | 1335 EXPECT_FLOAT_EQ(6.0, res, 0.001); |
| 1381 } | 1336 } |
| 1382 | 1337 |
| 1383 | 1338 |
| 1384 ASSEMBLER_TEST_GENERATE(Sqrtd, assembler) { | 1339 ASSEMBLER_TEST_GENERATE(Sqrtd, assembler) { |
| 1385 __ LoadImmediate(D0, 36.0); | 1340 __ LoadImmediate(D1, 36.0); |
| 1386 __ sqrtd(D2, D0); | 1341 __ sqrtd(D0, D1); |
| 1387 __ mfc1(V0, F4); | |
| 1388 __ mfc1(V1, F5); | |
| 1389 __ Ret(); | 1342 __ Ret(); |
| 1390 } | 1343 } |
| 1391 | 1344 |
| 1392 | 1345 |
| 1393 ASSEMBLER_TEST_RUN(Sqrtd, test) { | 1346 ASSEMBLER_TEST_RUN(Sqrtd, test) { |
| 1394 typedef double (*SimpleCode)(); | 1347 typedef double (*SimpleCode)(); |
| 1395 EXPECT(test != NULL); | 1348 EXPECT(test != NULL); |
| 1396 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); | 1349 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
| 1397 EXPECT_FLOAT_EQ(6.0, res, 0.001); | 1350 EXPECT_FLOAT_EQ(6.0, res, 0.001); |
| 1398 } | 1351 } |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1595 | 1548 |
| 1596 | 1549 |
| 1597 ASSEMBLER_TEST_RUN(Cop1COLE_not_taken, test) { | 1550 ASSEMBLER_TEST_RUN(Cop1COLE_not_taken, test) { |
| 1598 typedef int (*SimpleCode)(); | 1551 typedef int (*SimpleCode)(); |
| 1599 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 1552 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 1600 } | 1553 } |
| 1601 | 1554 |
| 1602 | 1555 |
| 1603 ASSEMBLER_TEST_GENERATE(Cop1CvtDW, assembler) { | 1556 ASSEMBLER_TEST_GENERATE(Cop1CvtDW, assembler) { |
| 1604 __ LoadImmediate(T0, 42); | 1557 __ LoadImmediate(T0, 42); |
| 1605 __ mtc1(T0, F0); | 1558 __ mtc1(T0, F2); |
| 1606 __ cvtdw(D1, F0); | 1559 __ cvtdw(D0, F2); |
| 1607 __ mfc1(V0, F2); | |
| 1608 __ mfc1(V1, F3); | |
| 1609 __ Ret(); | 1560 __ Ret(); |
| 1610 } | 1561 } |
| 1611 | 1562 |
| 1612 | 1563 |
| 1613 ASSEMBLER_TEST_RUN(Cop1CvtDW, test) { | 1564 ASSEMBLER_TEST_RUN(Cop1CvtDW, test) { |
| 1614 typedef double (*SimpleCode)(); | 1565 typedef double (*SimpleCode)(); |
| 1615 EXPECT(test != NULL); | 1566 EXPECT(test != NULL); |
| 1616 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); | 1567 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
| 1617 EXPECT_FLOAT_EQ(42.0, res, 0.001); | 1568 EXPECT_FLOAT_EQ(42.0, res, 0.001); |
| 1618 } | 1569 } |
| 1619 | 1570 |
| 1620 | 1571 |
| 1621 ASSEMBLER_TEST_GENERATE(Cop1CvtDW_neg, assembler) { | 1572 ASSEMBLER_TEST_GENERATE(Cop1CvtDW_neg, assembler) { |
| 1622 __ LoadImmediate(T0, -42); | 1573 __ LoadImmediate(T0, -42); |
| 1623 __ mtc1(T0, F0); | 1574 __ mtc1(T0, F2); |
| 1624 __ cvtdw(D1, F0); | 1575 __ cvtdw(D0, F2); |
| 1625 __ mfc1(V0, F2); | |
| 1626 __ mfc1(V1, F3); | |
| 1627 __ Ret(); | 1576 __ Ret(); |
| 1628 } | 1577 } |
| 1629 | 1578 |
| 1630 | 1579 |
| 1631 ASSEMBLER_TEST_RUN(Cop1CvtDW_neg, test) { | 1580 ASSEMBLER_TEST_RUN(Cop1CvtDW_neg, test) { |
| 1632 typedef double (*SimpleCode)(); | 1581 typedef double (*SimpleCode)(); |
| 1633 EXPECT(test != NULL); | 1582 EXPECT(test != NULL); |
| 1634 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); | 1583 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
| 1635 EXPECT_FLOAT_EQ(-42.0, res, 0.001); | 1584 EXPECT_FLOAT_EQ(-42.0, res, 0.001); |
| 1636 } | 1585 } |
| 1637 | 1586 |
| 1638 | 1587 |
| 1639 ASSEMBLER_TEST_GENERATE(Cop1CvtDL, assembler) { | 1588 ASSEMBLER_TEST_GENERATE(Cop1CvtDL, assembler) { |
| 1640 __ LoadImmediate(T0, 0x1); | 1589 __ LoadImmediate(T0, 0x1); |
| 1641 __ mtc1(ZR, F0); | 1590 __ mtc1(ZR, F2); |
| 1642 __ mtc1(T0, F1); // D0 <- 0x100000000 = 4294967296 | 1591 __ mtc1(T0, F3); // D0 <- 0x100000000 = 4294967296 |
| 1643 __ cvtdl(D1, D0); | 1592 __ cvtdl(D0, D1); |
| 1644 __ mfc1(V0, F2); | |
| 1645 __ mfc1(V1, F3); | |
| 1646 __ Ret(); | 1593 __ Ret(); |
| 1647 } | 1594 } |
| 1648 | 1595 |
| 1649 | 1596 |
| 1650 ASSEMBLER_TEST_RUN(Cop1CvtDL, test) { | 1597 ASSEMBLER_TEST_RUN(Cop1CvtDL, test) { |
| 1651 typedef double (*SimpleCode)(); | 1598 typedef double (*SimpleCode)(); |
| 1652 EXPECT(test != NULL); | 1599 EXPECT(test != NULL); |
| 1653 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); | 1600 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
| 1654 EXPECT_FLOAT_EQ(4294967296.0, res, 0.001); | 1601 EXPECT_FLOAT_EQ(4294967296.0, res, 0.001); |
| 1655 } | 1602 } |
| 1656 | 1603 |
| 1657 | 1604 |
| 1658 ASSEMBLER_TEST_GENERATE(Cop1CvtDL_neg, assembler) { | 1605 ASSEMBLER_TEST_GENERATE(Cop1CvtDL_neg, assembler) { |
| 1659 __ LoadImmediate(T0, 0xffffffff); | 1606 __ LoadImmediate(T0, 0xffffffff); |
| 1660 __ mtc1(T0, F0); | 1607 __ mtc1(T0, F2); |
| 1661 __ mtc1(T0, F1); // D0 <- 0xffffffffffffffff = -1 | 1608 __ mtc1(T0, F3); // D0 <- 0xffffffffffffffff = -1 |
| 1662 __ cvtdl(D1, D0); | 1609 __ cvtdl(D0, D1);; |
| 1663 __ mfc1(V0, F2); | |
| 1664 __ mfc1(V1, F3); | |
| 1665 __ Ret(); | 1610 __ Ret(); |
| 1666 } | 1611 } |
| 1667 | 1612 |
| 1668 | 1613 |
| 1669 ASSEMBLER_TEST_RUN(Cop1CvtDL_neg, test) { | 1614 ASSEMBLER_TEST_RUN(Cop1CvtDL_neg, test) { |
| 1670 typedef double (*SimpleCode)(); | 1615 typedef double (*SimpleCode)(); |
| 1671 EXPECT(test != NULL); | 1616 EXPECT(test != NULL); |
| 1672 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); | 1617 double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
| 1673 EXPECT_FLOAT_EQ(-1.0, res, 0.001); | 1618 EXPECT_FLOAT_EQ(-1.0, res, 0.001); |
| 1674 } | 1619 } |
| 1675 | 1620 |
| 1676 | 1621 |
| 1677 ASSEMBLER_TEST_GENERATE(Cop1CvtWD, assembler) { | 1622 ASSEMBLER_TEST_GENERATE(Cop1CvtWD, assembler) { |
| 1678 __ LoadImmediate(D0, 42.0); | 1623 __ LoadImmediate(D1, 42.0); |
| 1679 __ cvtwd(F2, D0); | 1624 __ cvtwd(F0, D1); |
| 1680 __ mfc1(V0, F2); | 1625 __ mfc1(V0, F0); |
| 1681 __ Ret(); | 1626 __ Ret(); |
| 1682 } | 1627 } |
| 1683 | 1628 |
| 1684 | 1629 |
| 1685 ASSEMBLER_TEST_RUN(Cop1CvtWD, test) { | 1630 ASSEMBLER_TEST_RUN(Cop1CvtWD, test) { |
| 1686 typedef double (*SimpleCode)(); | 1631 typedef int (*SimpleCode)(); |
| 1687 EXPECT(test != NULL); | 1632 EXPECT(test != NULL); |
| 1688 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 1633 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 1689 } | 1634 } |
| 1690 | 1635 |
| 1691 | 1636 |
| 1692 ASSEMBLER_TEST_GENERATE(Cop1CvtWD_neg, assembler) { | 1637 ASSEMBLER_TEST_GENERATE(Cop1CvtWD_neg, assembler) { |
| 1693 __ LoadImmediate(D0, -42.0); | 1638 __ LoadImmediate(D1, -42.0); |
| 1694 __ cvtwd(F2, D0); | 1639 __ cvtwd(F0, D1); |
| 1695 __ mfc1(V0, F2); | 1640 __ mfc1(V0, F0); |
| 1696 __ Ret(); | 1641 __ Ret(); |
| 1697 } | 1642 } |
| 1698 | 1643 |
| 1699 | 1644 |
| 1700 ASSEMBLER_TEST_RUN(Cop1CvtWD_neg, test) { | 1645 ASSEMBLER_TEST_RUN(Cop1CvtWD_neg, test) { |
| 1701 typedef double (*SimpleCode)(); | 1646 typedef int (*SimpleCode)(); |
| 1702 EXPECT(test != NULL); | 1647 EXPECT(test != NULL); |
| 1703 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 1648 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 1704 } | 1649 } |
| 1705 | 1650 |
| 1706 | 1651 |
| 1707 // Called from assembler_test.cc. | 1652 // Called from assembler_test.cc. |
| 1708 // RA: return address. | 1653 // RA: return address. |
| 1709 // A0: context. | 1654 // A0: context. |
| 1710 // A1: value. | 1655 // A1: value. |
| 1711 // A2: growable array. | 1656 // A2: growable array. |
| 1712 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { | 1657 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { |
| 1713 __ addiu(SP, SP, Immediate(-2 * kWordSize)); | 1658 __ addiu(SP, SP, Immediate(-2 * kWordSize)); |
| 1714 __ sw(CTX, Address(SP, 1 * kWordSize)); | 1659 __ sw(CTX, Address(SP, 1 * kWordSize)); |
| 1715 __ sw(RA, Address(SP, 0 * kWordSize)); | 1660 __ sw(RA, Address(SP, 0 * kWordSize)); |
| 1716 | 1661 |
| 1717 __ mov(CTX, A0); | 1662 __ mov(CTX, A0); |
| 1718 __ StoreIntoObject(A2, | 1663 __ StoreIntoObject(A2, |
| 1719 FieldAddress(A2, GrowableObjectArray::data_offset()), | 1664 FieldAddress(A2, GrowableObjectArray::data_offset()), |
| 1720 A1); | 1665 A1); |
| 1721 __ lw(RA, Address(SP, 0 * kWordSize)); | 1666 __ lw(RA, Address(SP, 0 * kWordSize)); |
| 1722 __ lw(CTX, Address(SP, 1 * kWordSize)); | 1667 __ lw(CTX, Address(SP, 1 * kWordSize)); |
| 1723 __ addiu(SP, SP, Immediate(2 * kWordSize)); | 1668 __ addiu(SP, SP, Immediate(2 * kWordSize)); |
| 1724 __ Ret(); | 1669 __ Ret(); |
| 1725 } | 1670 } |
| 1726 | 1671 |
| 1727 } // namespace dart | 1672 } // namespace dart |
| 1728 | 1673 |
| 1729 #endif // defined TARGET_ARCH_MIPS | 1674 #endif // defined TARGET_ARCH_MIPS |
| OLD | NEW |