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

Side by Side Diff: src/mips/macro-assembler-mips.cc

Issue 1819383002: MIPS: [wasm] Lowering of Int64Shl, Int64Shr, Int64Sar, Int64Add and Int64Sub. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Enable all lowering tests Created 4 years, 8 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
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698