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

Side by Side Diff: src/mips/lithium-codegen-mips.cc

Issue 178193026: Deoptimization fix for HPushArgument. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Remove dead code. Created 6 years, 9 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 | « src/lithium-allocator.h ('k') | src/x64/lithium-codegen-x64.cc » ('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 2012 the V8 project authors. All rights reserved.7 1 // Copyright 2012 the V8 project authors. All rights reserved.7
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 } else if (r.IsSmi()) { 394 } else if (r.IsSmi()) {
395 ASSERT(constant->HasSmiValue()); 395 ASSERT(constant->HasSmiValue());
396 __ li(scratch, Operand(Smi::FromInt(constant->Integer32Value()))); 396 __ li(scratch, Operand(Smi::FromInt(constant->Integer32Value())));
397 } else if (r.IsDouble()) { 397 } else if (r.IsDouble()) {
398 Abort(kEmitLoadRegisterUnsupportedDoubleImmediate); 398 Abort(kEmitLoadRegisterUnsupportedDoubleImmediate);
399 } else { 399 } else {
400 ASSERT(r.IsSmiOrTagged()); 400 ASSERT(r.IsSmiOrTagged());
401 __ li(scratch, literal); 401 __ li(scratch, literal);
402 } 402 }
403 return scratch; 403 return scratch;
404 } else if (op->IsStackSlot() || op->IsArgument()) { 404 } else if (op->IsStackSlot()) {
405 __ lw(scratch, ToMemOperand(op)); 405 __ lw(scratch, ToMemOperand(op));
406 return scratch; 406 return scratch;
407 } 407 }
408 UNREACHABLE(); 408 UNREACHABLE();
409 return scratch; 409 return scratch;
410 } 410 }
411 411
412 412
413 DoubleRegister LCodeGen::ToDoubleRegister(LOperand* op) const { 413 DoubleRegister LCodeGen::ToDoubleRegister(LOperand* op) const {
414 ASSERT(op->IsDoubleRegister()); 414 ASSERT(op->IsDoubleRegister());
(...skipping 15 matching lines...) Expand all
430 ASSERT(literal->IsNumber()); 430 ASSERT(literal->IsNumber());
431 __ li(at, Operand(static_cast<int32_t>(literal->Number()))); 431 __ li(at, Operand(static_cast<int32_t>(literal->Number())));
432 __ mtc1(at, flt_scratch); 432 __ mtc1(at, flt_scratch);
433 __ cvt_d_w(dbl_scratch, flt_scratch); 433 __ cvt_d_w(dbl_scratch, flt_scratch);
434 return dbl_scratch; 434 return dbl_scratch;
435 } else if (r.IsDouble()) { 435 } else if (r.IsDouble()) {
436 Abort(kUnsupportedDoubleImmediate); 436 Abort(kUnsupportedDoubleImmediate);
437 } else if (r.IsTagged()) { 437 } else if (r.IsTagged()) {
438 Abort(kUnsupportedTaggedImmediate); 438 Abort(kUnsupportedTaggedImmediate);
439 } 439 }
440 } else if (op->IsStackSlot() || op->IsArgument()) { 440 } else if (op->IsStackSlot()) {
441 MemOperand mem_op = ToMemOperand(op); 441 MemOperand mem_op = ToMemOperand(op);
442 __ ldc1(dbl_scratch, mem_op); 442 __ ldc1(dbl_scratch, mem_op);
443 return dbl_scratch; 443 return dbl_scratch;
444 } 444 }
445 UNREACHABLE(); 445 UNREACHABLE();
446 return dbl_scratch; 446 return dbl_scratch;
447 } 447 }
448 448
449 449
450 Handle<Object> LCodeGen::ToHandle(LConstantOperand* op) const { 450 Handle<Object> LCodeGen::ToHandle(LConstantOperand* op) const {
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 if (op->IsStackSlot()) { 648 if (op->IsStackSlot()) {
649 if (is_tagged) { 649 if (is_tagged) {
650 translation->StoreStackSlot(op->index()); 650 translation->StoreStackSlot(op->index());
651 } else if (is_uint32) { 651 } else if (is_uint32) {
652 translation->StoreUint32StackSlot(op->index()); 652 translation->StoreUint32StackSlot(op->index());
653 } else { 653 } else {
654 translation->StoreInt32StackSlot(op->index()); 654 translation->StoreInt32StackSlot(op->index());
655 } 655 }
656 } else if (op->IsDoubleStackSlot()) { 656 } else if (op->IsDoubleStackSlot()) {
657 translation->StoreDoubleStackSlot(op->index()); 657 translation->StoreDoubleStackSlot(op->index());
658 } else if (op->IsArgument()) {
659 ASSERT(is_tagged);
660 int src_index = GetStackSlotCount() + op->index();
661 translation->StoreStackSlot(src_index);
662 } else if (op->IsRegister()) { 658 } else if (op->IsRegister()) {
663 Register reg = ToRegister(op); 659 Register reg = ToRegister(op);
664 if (is_tagged) { 660 if (is_tagged) {
665 translation->StoreRegister(reg); 661 translation->StoreRegister(reg);
666 } else if (is_uint32) { 662 } else if (is_uint32) {
667 translation->StoreUint32Register(reg); 663 translation->StoreUint32Register(reg);
668 } else { 664 } else {
669 translation->StoreInt32Register(reg); 665 translation->StoreInt32Register(reg);
670 } 666 }
671 } else if (op->IsDoubleRegister()) { 667 } else if (op->IsDoubleRegister()) {
(...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after
1460 1456
1461 1457
1462 void LCodeGen::DoBitI(LBitI* instr) { 1458 void LCodeGen::DoBitI(LBitI* instr) {
1463 LOperand* left_op = instr->left(); 1459 LOperand* left_op = instr->left();
1464 LOperand* right_op = instr->right(); 1460 LOperand* right_op = instr->right();
1465 ASSERT(left_op->IsRegister()); 1461 ASSERT(left_op->IsRegister());
1466 Register left = ToRegister(left_op); 1462 Register left = ToRegister(left_op);
1467 Register result = ToRegister(instr->result()); 1463 Register result = ToRegister(instr->result());
1468 Operand right(no_reg); 1464 Operand right(no_reg);
1469 1465
1470 if (right_op->IsStackSlot() || right_op->IsArgument()) { 1466 if (right_op->IsStackSlot()) {
1471 right = Operand(EmitLoadRegister(right_op, at)); 1467 right = Operand(EmitLoadRegister(right_op, at));
1472 } else { 1468 } else {
1473 ASSERT(right_op->IsRegister() || right_op->IsConstantOperand()); 1469 ASSERT(right_op->IsRegister() || right_op->IsConstantOperand());
1474 right = ToOperand(right_op); 1470 right = ToOperand(right_op);
1475 } 1471 }
1476 1472
1477 switch (instr->op()) { 1473 switch (instr->op()) {
1478 case Token::BIT_AND: 1474 case Token::BIT_AND:
1479 __ And(result, left, right); 1475 __ And(result, left, right);
1480 break; 1476 break;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1582 } 1578 }
1583 1579
1584 1580
1585 void LCodeGen::DoSubI(LSubI* instr) { 1581 void LCodeGen::DoSubI(LSubI* instr) {
1586 LOperand* left = instr->left(); 1582 LOperand* left = instr->left();
1587 LOperand* right = instr->right(); 1583 LOperand* right = instr->right();
1588 LOperand* result = instr->result(); 1584 LOperand* result = instr->result();
1589 bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow); 1585 bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow);
1590 1586
1591 if (!can_overflow) { 1587 if (!can_overflow) {
1592 if (right->IsStackSlot() || right->IsArgument()) { 1588 if (right->IsStackSlot()) {
1593 Register right_reg = EmitLoadRegister(right, at); 1589 Register right_reg = EmitLoadRegister(right, at);
1594 __ Subu(ToRegister(result), ToRegister(left), Operand(right_reg)); 1590 __ Subu(ToRegister(result), ToRegister(left), Operand(right_reg));
1595 } else { 1591 } else {
1596 ASSERT(right->IsRegister() || right->IsConstantOperand()); 1592 ASSERT(right->IsRegister() || right->IsConstantOperand());
1597 __ Subu(ToRegister(result), ToRegister(left), ToOperand(right)); 1593 __ Subu(ToRegister(result), ToRegister(left), ToOperand(right));
1598 } 1594 }
1599 } else { // can_overflow. 1595 } else { // can_overflow.
1600 Register overflow = scratch0(); 1596 Register overflow = scratch0();
1601 Register scratch = scratch1(); 1597 Register scratch = scratch1();
1602 if (right->IsStackSlot() || 1598 if (right->IsStackSlot() || right->IsConstantOperand()) {
1603 right->IsArgument() ||
1604 right->IsConstantOperand()) {
1605 Register right_reg = EmitLoadRegister(right, scratch); 1599 Register right_reg = EmitLoadRegister(right, scratch);
1606 __ SubuAndCheckForOverflow(ToRegister(result), 1600 __ SubuAndCheckForOverflow(ToRegister(result),
1607 ToRegister(left), 1601 ToRegister(left),
1608 right_reg, 1602 right_reg,
1609 overflow); // Reg at also used as scratch. 1603 overflow); // Reg at also used as scratch.
1610 } else { 1604 } else {
1611 ASSERT(right->IsRegister()); 1605 ASSERT(right->IsRegister());
1612 // Due to overflow check macros not supporting constant operands, 1606 // Due to overflow check macros not supporting constant operands,
1613 // handling the IsConstantOperand case was moved to prev if clause. 1607 // handling the IsConstantOperand case was moved to prev if clause.
1614 __ SubuAndCheckForOverflow(ToRegister(result), 1608 __ SubuAndCheckForOverflow(ToRegister(result),
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
1774 } 1768 }
1775 1769
1776 1770
1777 void LCodeGen::DoAddI(LAddI* instr) { 1771 void LCodeGen::DoAddI(LAddI* instr) {
1778 LOperand* left = instr->left(); 1772 LOperand* left = instr->left();
1779 LOperand* right = instr->right(); 1773 LOperand* right = instr->right();
1780 LOperand* result = instr->result(); 1774 LOperand* result = instr->result();
1781 bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow); 1775 bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow);
1782 1776
1783 if (!can_overflow) { 1777 if (!can_overflow) {
1784 if (right->IsStackSlot() || right->IsArgument()) { 1778 if (right->IsStackSlot()) {
1785 Register right_reg = EmitLoadRegister(right, at); 1779 Register right_reg = EmitLoadRegister(right, at);
1786 __ Addu(ToRegister(result), ToRegister(left), Operand(right_reg)); 1780 __ Addu(ToRegister(result), ToRegister(left), Operand(right_reg));
1787 } else { 1781 } else {
1788 ASSERT(right->IsRegister() || right->IsConstantOperand()); 1782 ASSERT(right->IsRegister() || right->IsConstantOperand());
1789 __ Addu(ToRegister(result), ToRegister(left), ToOperand(right)); 1783 __ Addu(ToRegister(result), ToRegister(left), ToOperand(right));
1790 } 1784 }
1791 } else { // can_overflow. 1785 } else { // can_overflow.
1792 Register overflow = scratch0(); 1786 Register overflow = scratch0();
1793 Register scratch = scratch1(); 1787 Register scratch = scratch1();
1794 if (right->IsStackSlot() || 1788 if (right->IsStackSlot() ||
1795 right->IsArgument() ||
1796 right->IsConstantOperand()) { 1789 right->IsConstantOperand()) {
1797 Register right_reg = EmitLoadRegister(right, scratch); 1790 Register right_reg = EmitLoadRegister(right, scratch);
1798 __ AdduAndCheckForOverflow(ToRegister(result), 1791 __ AdduAndCheckForOverflow(ToRegister(result),
1799 ToRegister(left), 1792 ToRegister(left),
1800 right_reg, 1793 right_reg,
1801 overflow); // Reg at also used as scratch. 1794 overflow); // Reg at also used as scratch.
1802 } else { 1795 } else {
1803 ASSERT(right->IsRegister()); 1796 ASSERT(right->IsRegister());
1804 // Due to overflow check macros not supporting constant operands, 1797 // Due to overflow check macros not supporting constant operands,
1805 // handling the IsConstantOperand case was moved to prev if clause. 1798 // handling the IsConstantOperand case was moved to prev if clause.
(...skipping 3947 matching lines...) Expand 10 before | Expand all | Expand 10 after
5753 __ Subu(scratch, result, scratch); 5746 __ Subu(scratch, result, scratch);
5754 __ lw(result, FieldMemOperand(scratch, 5747 __ lw(result, FieldMemOperand(scratch,
5755 FixedArray::kHeaderSize - kPointerSize)); 5748 FixedArray::kHeaderSize - kPointerSize));
5756 __ bind(&done); 5749 __ bind(&done);
5757 } 5750 }
5758 5751
5759 5752
5760 #undef __ 5753 #undef __
5761 5754
5762 } } // namespace v8::internal 5755 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/lithium-allocator.h ('k') | src/x64/lithium-codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698