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 |