Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 | 1 |
| 2 // Copyright 2012 the V8 project authors. All rights reserved. | 2 // Copyright 2012 the V8 project authors. All rights reserved. |
| 3 // Use of this source code is governed by a BSD-style license that can be | 3 // Use of this source code is governed by a BSD-style license that can be |
| 4 // found in the LICENSE file. | 4 // found in the LICENSE file. |
| 5 | 5 |
| 6 #include <limits.h> // For LONG_MIN, LONG_MAX. | 6 #include <limits.h> // For LONG_MIN, LONG_MAX. |
| 7 | 7 |
| 8 #if V8_TARGET_ARCH_MIPS | 8 #if V8_TARGET_ARCH_MIPS |
| 9 | 9 |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 1309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1320 | 1320 |
| 1321 for (int16_t i = kNumRegisters - 1; i >= 0; i--) { | 1321 for (int16_t i = kNumRegisters - 1; i >= 0; i--) { |
| 1322 if ((regs & (1 << i)) != 0) { | 1322 if ((regs & (1 << i)) != 0) { |
| 1323 ldc1(FPURegister::from_code(i), MemOperand(sp, stack_offset)); | 1323 ldc1(FPURegister::from_code(i), MemOperand(sp, stack_offset)); |
| 1324 stack_offset += kDoubleSize; | 1324 stack_offset += kDoubleSize; |
| 1325 } | 1325 } |
| 1326 } | 1326 } |
| 1327 addiu(sp, sp, stack_offset); | 1327 addiu(sp, sp, stack_offset); |
| 1328 } | 1328 } |
| 1329 | 1329 |
| 1330 void MacroAssembler::AddPair(Register dst_low, Register dst_high, | |
| 1331 Register left_low, Register left_high, | |
| 1332 Register right_low, Register right_high) { | |
| 1333 Label no_overflow; | |
| 1334 Register kScratchReg = s3; | |
| 1335 Register kScratchReg2 = s4; | |
| 1336 // Add lower word | |
| 1337 Addu(dst_low, left_low, right_low); | |
| 1338 Addu(dst_high, left_high, right_high); | |
| 1339 // Check for lower word overflow | |
|
balazs.kilvady
2016/04/05 11:13:16
Could you put the 'unsigned' word in the above com
Marija Antic
2016/04/05 12:28:35
Done.
| |
| 1340 Sltu(kScratchReg, dst_low, left_low); | |
| 1341 Sltu(kScratchReg2, dst_low, right_low); | |
| 1342 Or(kScratchReg, kScratchReg2, kScratchReg); | |
| 1343 Branch(&no_overflow, eq, kScratchReg, Operand(zero_reg)); | |
| 1344 // Increment higher word if there was overflow | |
| 1345 Addu(dst_high, dst_high, 0x1); | |
| 1346 bind(&no_overflow); | |
| 1347 } | |
| 1348 | |
| 1349 void MacroAssembler::SubPair(Register dst_low, Register dst_high, | |
| 1350 Register left_low, Register left_high, | |
| 1351 Register right_low, Register right_high) { | |
| 1352 Label no_overflow; | |
| 1353 Register kScratchReg = s3; | |
| 1354 // Subtract lower word | |
| 1355 Subu(dst_low, left_low, right_low); | |
| 1356 Subu(dst_high, left_high, right_high); | |
| 1357 // Check for lower word underflow | |
|
balazs.kilvady
2016/04/05 11:13:16
Could you put the 'unsigned' word in the above com
Marija Antic
2016/04/05 12:28:35
Done.
| |
| 1358 Sltu(kScratchReg, left_low, right_low); | |
| 1359 Branch(&no_overflow, eq, kScratchReg, Operand(zero_reg)); | |
| 1360 // Decrement higher word if there was underflow | |
| 1361 Subu(dst_high, dst_high, 0x1); | |
| 1362 bind(&no_overflow); | |
| 1363 } | |
| 1364 | |
| 1365 void MacroAssembler::ShlPair(Register dst_low, Register dst_high, | |
| 1366 Register src_low, Register src_high, | |
| 1367 Register shift) { | |
| 1368 Label less_than_32; | |
| 1369 Label zero_shift; | |
| 1370 Label word_shift; | |
| 1371 Label done; | |
| 1372 Register kScratchReg = s3; | |
| 1373 li(kScratchReg, 0x20); | |
| 1374 Branch(&less_than_32, lt, shift, Operand(kScratchReg)); | |
| 1375 | |
| 1376 Branch(&word_shift, eq, shift, Operand(kScratchReg)); | |
| 1377 // Shift more than 32 | |
| 1378 Subu(kScratchReg, shift, kScratchReg); | |
| 1379 mov(dst_low, zero_reg); | |
| 1380 sllv(dst_high, src_low, kScratchReg); | |
| 1381 Branch(&done); | |
| 1382 // Word shift | |
| 1383 bind(&word_shift); | |
| 1384 mov(dst_low, zero_reg); | |
| 1385 mov(dst_high, src_low); | |
| 1386 Branch(&done); | |
| 1387 | |
| 1388 bind(&less_than_32); | |
| 1389 // Check if zero shift | |
| 1390 Branch(&zero_shift, eq, shift, Operand(zero_reg)); | |
| 1391 // Shift less than 32 | |
| 1392 Subu(kScratchReg, kScratchReg, shift); | |
| 1393 sllv(dst_high, src_high, shift); | |
| 1394 sllv(dst_low, src_low, shift); | |
| 1395 srlv(kScratchReg, src_low, kScratchReg); | |
| 1396 Or(dst_high, dst_high, kScratchReg); | |
| 1397 Branch(&done); | |
| 1398 // Zero shift | |
| 1399 bind(&zero_shift); | |
| 1400 mov(dst_low, src_low); | |
| 1401 mov(dst_high, src_high); | |
| 1402 bind(&done); | |
| 1403 } | |
| 1404 | |
| 1405 void MacroAssembler::ShlPair(Register dst_low, Register dst_high, | |
| 1406 Register src_low, Register src_high, | |
| 1407 uint32_t shift) { | |
| 1408 Register kScratchReg = s3; | |
| 1409 if (shift < 32) { | |
| 1410 if (shift == 0) { | |
| 1411 mov(dst_low, src_low); | |
| 1412 mov(dst_high, src_high); | |
| 1413 } else { | |
| 1414 sll(dst_high, src_high, shift); | |
| 1415 sll(dst_low, src_low, shift); | |
| 1416 shift = 32 - shift; | |
| 1417 srl(kScratchReg, src_low, shift); | |
| 1418 Or(dst_high, dst_high, kScratchReg); | |
| 1419 } | |
| 1420 } else { | |
| 1421 if (shift == 32) { | |
| 1422 mov(dst_low, zero_reg); | |
| 1423 mov(dst_high, src_low); | |
| 1424 } else { | |
| 1425 shift = shift - 32; | |
| 1426 mov(dst_low, zero_reg); | |
| 1427 sll(dst_high, src_low, shift); | |
| 1428 } | |
| 1429 } | |
| 1430 } | |
| 1431 | |
| 1432 void MacroAssembler::ShrPair(Register dst_low, Register dst_high, | |
| 1433 Register src_low, Register src_high, | |
| 1434 Register shift) { | |
| 1435 Label less_than_32; | |
| 1436 Label zero_shift; | |
| 1437 Label word_shift; | |
| 1438 Label done; | |
| 1439 Register kScratchReg = s3; | |
| 1440 li(kScratchReg, 0x20); | |
| 1441 Branch(&less_than_32, lt, shift, Operand(kScratchReg)); | |
| 1442 | |
| 1443 Branch(&word_shift, eq, shift, Operand(kScratchReg)); | |
| 1444 // Shift more than 32 | |
| 1445 Subu(kScratchReg, shift, kScratchReg); | |
| 1446 mov(dst_high, zero_reg); | |
| 1447 srlv(dst_low, src_high, kScratchReg); | |
| 1448 Branch(&done); | |
| 1449 // Word shift | |
| 1450 bind(&word_shift); | |
| 1451 mov(dst_high, zero_reg); | |
| 1452 mov(dst_low, src_high); | |
| 1453 Branch(&done); | |
| 1454 | |
| 1455 bind(&less_than_32); | |
| 1456 // Check if zero shift | |
| 1457 Branch(&zero_shift, eq, shift, Operand(zero_reg)); | |
| 1458 // Shift less than 32 | |
| 1459 Subu(kScratchReg, kScratchReg, shift); | |
| 1460 srlv(dst_high, src_high, shift); | |
| 1461 srlv(dst_low, src_low, shift); | |
| 1462 sllv(kScratchReg, src_high, kScratchReg); | |
| 1463 Or(dst_low, dst_low, kScratchReg); | |
| 1464 Branch(&done); | |
| 1465 // Zero shift | |
| 1466 bind(&zero_shift); | |
| 1467 mov(dst_low, src_low); | |
| 1468 mov(dst_high, src_high); | |
| 1469 bind(&done); | |
| 1470 } | |
| 1471 | |
| 1472 void MacroAssembler::ShrPair(Register dst_low, Register dst_high, | |
| 1473 Register src_low, Register src_high, | |
| 1474 uint32_t shift) { | |
| 1475 Register kScratchReg = s3; | |
| 1476 if (shift < 32) { | |
| 1477 if (shift == 0) { | |
| 1478 mov(dst_low, src_low); | |
| 1479 mov(dst_high, src_high); | |
| 1480 } else { | |
| 1481 srl(dst_high, src_high, shift); | |
| 1482 srl(dst_low, src_low, shift); | |
| 1483 shift = 32 - shift; | |
| 1484 sll(kScratchReg, src_high, shift); | |
| 1485 Or(dst_low, dst_low, kScratchReg); | |
| 1486 } | |
| 1487 } else { | |
| 1488 if (shift == 32) { | |
| 1489 mov(dst_high, zero_reg); | |
| 1490 mov(dst_low, src_high); | |
| 1491 } else { | |
| 1492 shift = shift - 32; | |
| 1493 mov(dst_high, zero_reg); | |
| 1494 srl(dst_low, src_high, shift); | |
| 1495 } | |
| 1496 } | |
| 1497 } | |
| 1498 | |
| 1499 void MacroAssembler::SarPair(Register dst_low, Register dst_high, | |
| 1500 Register src_low, Register src_high, | |
| 1501 Register shift) { | |
| 1502 Label less_than_32; | |
| 1503 Label zero_shift; | |
| 1504 Label word_shift; | |
| 1505 Label done; | |
| 1506 Register kScratchReg = s3; | |
| 1507 Register kScratchReg2 = s4; | |
| 1508 li(kScratchReg, 0x20); | |
| 1509 Branch(&less_than_32, lt, shift, Operand(kScratchReg)); | |
| 1510 | |
| 1511 Branch(&word_shift, eq, shift, Operand(kScratchReg)); | |
| 1512 | |
| 1513 // Shift more than 32 | |
| 1514 li(kScratchReg2, 0x1F); | |
| 1515 Subu(kScratchReg, shift, kScratchReg); | |
| 1516 srav(dst_high, src_high, kScratchReg2); | |
| 1517 srav(dst_low, src_high, kScratchReg); | |
| 1518 Branch(&done); | |
| 1519 // Word shift | |
| 1520 bind(&word_shift); | |
| 1521 li(kScratchReg2, 0x1F); | |
| 1522 srav(dst_high, src_high, kScratchReg2); | |
| 1523 mov(dst_low, src_high); | |
| 1524 Branch(&done); | |
| 1525 | |
| 1526 bind(&less_than_32); | |
| 1527 // Check if zero shift | |
| 1528 Branch(&zero_shift, eq, shift, Operand(zero_reg)); | |
| 1529 | |
| 1530 // Shift less than 32 | |
| 1531 Subu(kScratchReg, kScratchReg, shift); | |
| 1532 srav(dst_high, src_high, shift); | |
| 1533 srlv(dst_low, src_low, shift); | |
| 1534 sllv(kScratchReg, src_high, kScratchReg); | |
| 1535 Or(dst_low, dst_low, kScratchReg); | |
| 1536 Branch(&done); | |
| 1537 // Zero shift | |
| 1538 bind(&zero_shift); | |
| 1539 mov(dst_low, src_low); | |
| 1540 mov(dst_high, src_high); | |
| 1541 bind(&done); | |
| 1542 } | |
| 1543 | |
| 1544 void MacroAssembler::SarPair(Register dst_low, Register dst_high, | |
| 1545 Register src_low, Register src_high, | |
| 1546 uint32_t shift) { | |
| 1547 Register kScratchReg = s3; | |
| 1548 if (shift < 32) { | |
| 1549 if (shift == 0) { | |
| 1550 mov(dst_low, src_low); | |
| 1551 mov(dst_high, src_high); | |
| 1552 } else { | |
| 1553 sra(dst_high, src_high, shift); | |
| 1554 srl(dst_low, src_low, shift); | |
| 1555 shift = 32 - shift; | |
| 1556 sll(kScratchReg, src_high, shift); | |
| 1557 Or(dst_low, dst_low, kScratchReg); | |
| 1558 } | |
| 1559 } else { | |
| 1560 if (shift == 32) { | |
| 1561 sra(dst_high, src_high, 31); | |
| 1562 mov(dst_low, src_high); | |
| 1563 } else { | |
| 1564 shift = shift - 32; | |
| 1565 sra(dst_high, src_high, 31); | |
| 1566 sra(dst_low, src_high, shift); | |
| 1567 } | |
| 1568 } | |
| 1569 } | |
| 1330 | 1570 |
| 1331 void MacroAssembler::Ext(Register rt, | 1571 void MacroAssembler::Ext(Register rt, |
| 1332 Register rs, | 1572 Register rs, |
| 1333 uint16_t pos, | 1573 uint16_t pos, |
| 1334 uint16_t size) { | 1574 uint16_t size) { |
| 1335 DCHECK(pos < 32); | 1575 DCHECK(pos < 32); |
| 1336 DCHECK(pos + size < 33); | 1576 DCHECK(pos + size < 33); |
| 1337 | 1577 |
| 1338 if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { | 1578 if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { |
| 1339 ext_(rt, rs, pos, size); | 1579 ext_(rt, rs, pos, size); |
| (...skipping 4889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6229 if (mag.shift > 0) sra(result, result, mag.shift); | 6469 if (mag.shift > 0) sra(result, result, mag.shift); |
| 6230 srl(at, dividend, 31); | 6470 srl(at, dividend, 31); |
| 6231 Addu(result, result, Operand(at)); | 6471 Addu(result, result, Operand(at)); |
| 6232 } | 6472 } |
| 6233 | 6473 |
| 6234 | 6474 |
| 6235 } // namespace internal | 6475 } // namespace internal |
| 6236 } // namespace v8 | 6476 } // namespace v8 |
| 6237 | 6477 |
| 6238 #endif // V8_TARGET_ARCH_MIPS | 6478 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |