| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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" // Needed here to get TARGET_ARCH_IA32. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. |
| 6 #if defined(TARGET_ARCH_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
| 7 | 7 |
| 8 #include "vm/opt_code_generator.h" | 8 #include "vm/opt_code_generator.h" |
| 9 | 9 |
| 10 #include "vm/assembler_macros.h" | 10 #include "vm/assembler_macros.h" |
| (...skipping 1408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1419 __ j(ZERO, deopt_blob->label()); | 1419 __ j(ZERO, deopt_blob->label()); |
| 1420 } | 1420 } |
| 1421 | 1421 |
| 1422 __ LoadClassIndexOfObject(EAX, EBX); | 1422 __ LoadClassIndexOfObject(EAX, EBX); |
| 1423 const ICData& ic_data = node->ic_data(); | 1423 const ICData& ic_data = node->ic_data(); |
| 1424 Function& target = Function::Handle(); | 1424 Function& target = Function::Handle(); |
| 1425 Label load_field; | 1425 Label load_field; |
| 1426 for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) { | 1426 for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) { |
| 1427 Class& cls = Class::Handle(); | 1427 Class& cls = Class::Handle(); |
| 1428 ic_data.GetOneClassCheckAt(i, &cls, &target); | 1428 ic_data.GetOneClassCheckAt(i, &cls, &target); |
| 1429 __ cmpl(EAX, Immediate(cls.index())); | 1429 __ cmpl(EAX, Immediate(cls.id())); |
| 1430 if (i == (ic_data.NumberOfChecks() - 1)) { | 1430 if (i == (ic_data.NumberOfChecks() - 1)) { |
| 1431 __ j(NOT_EQUAL, deopt_blob->label()); | 1431 __ j(NOT_EQUAL, deopt_blob->label()); |
| 1432 } else { | 1432 } else { |
| 1433 __ j(EQUAL, &load_field); | 1433 __ j(EQUAL, &load_field); |
| 1434 } | 1434 } |
| 1435 } | 1435 } |
| 1436 Class& cls = Class::Handle(); | 1436 Class& cls = Class::Handle(); |
| 1437 ic_data.GetOneClassCheckAt(0, &cls, &target); | 1437 ic_data.GetOneClassCheckAt(0, &cls, &target); |
| 1438 | 1438 |
| 1439 __ Bind(&load_field); | 1439 __ Bind(&load_field); |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1631 } | 1631 } |
| 1632 __ LoadClassIndexOfObject(EBX, recv_reg); | 1632 __ LoadClassIndexOfObject(EBX, recv_reg); |
| 1633 // Initialize setter arguments, but leave the class and target fields NULL. | 1633 // Initialize setter arguments, but leave the class and target fields NULL. |
| 1634 InstanceSetterArgs setter_args = | 1634 InstanceSetterArgs setter_args = |
| 1635 {NULL, NULL, &field_name, recv_reg, value_reg, | 1635 {NULL, NULL, &field_name, recv_reg, value_reg, |
| 1636 node->id(), node->token_index()}; | 1636 node->id(), node->token_index()}; |
| 1637 | 1637 |
| 1638 if (unique_target) { | 1638 if (unique_target) { |
| 1639 Label store_field; | 1639 Label store_field; |
| 1640 for (intptr_t i = 0; i < classes.length(); i++) { | 1640 for (intptr_t i = 0; i < classes.length(); i++) { |
| 1641 __ cmpl(EBX, Immediate(classes[i]->index())); | 1641 __ cmpl(EBX, Immediate(classes[i]->id())); |
| 1642 if (i == (classes.length() - 1)) { | 1642 if (i == (classes.length() - 1)) { |
| 1643 __ j(NOT_EQUAL, deopt_blob->label()); | 1643 __ j(NOT_EQUAL, deopt_blob->label()); |
| 1644 } else { | 1644 } else { |
| 1645 __ j(EQUAL, &store_field); | 1645 __ j(EQUAL, &store_field); |
| 1646 } | 1646 } |
| 1647 } | 1647 } |
| 1648 __ Bind(&store_field); | 1648 __ Bind(&store_field); |
| 1649 setter_args.cls = classes[0]; | 1649 setter_args.cls = classes[0]; |
| 1650 setter_args.target = targets[0]; | 1650 setter_args.target = targets[0]; |
| 1651 GenerateInstanceSetter(setter_args); | 1651 GenerateInstanceSetter(setter_args); |
| 1652 return; | 1652 return; |
| 1653 } | 1653 } |
| 1654 // Targets are different. | 1654 // Targets are different. |
| 1655 Label done; | 1655 Label done; |
| 1656 for (intptr_t i = 0; i < classes.length(); i++) { | 1656 for (intptr_t i = 0; i < classes.length(); i++) { |
| 1657 setter_args.cls = classes[i]; | 1657 setter_args.cls = classes[i]; |
| 1658 setter_args.target = targets[i]; | 1658 setter_args.target = targets[i]; |
| 1659 __ cmpl(EBX, Immediate(classes[i]->index())); | 1659 __ cmpl(EBX, Immediate(classes[i]->id())); |
| 1660 if (i == (classes.length() - 1)) { | 1660 if (i == (classes.length() - 1)) { |
| 1661 __ j(NOT_EQUAL, deopt_blob->label()); | 1661 __ j(NOT_EQUAL, deopt_blob->label()); |
| 1662 GenerateInstanceSetter(setter_args); | 1662 GenerateInstanceSetter(setter_args); |
| 1663 } else { | 1663 } else { |
| 1664 Label next_check; | 1664 Label next_check; |
| 1665 __ j(NOT_EQUAL, &next_check); | 1665 __ j(NOT_EQUAL, &next_check); |
| 1666 GenerateInstanceSetter(setter_args); | 1666 GenerateInstanceSetter(setter_args); |
| 1667 __ jmp(&done); | 1667 __ jmp(&done); |
| 1668 __ Bind(&next_check); | 1668 __ Bind(&next_check); |
| 1669 } | 1669 } |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1988 } else { | 1988 } else { |
| 1989 DeoptimizationBlob* deopt_blob = | 1989 DeoptimizationBlob* deopt_blob = |
| 1990 AddDeoptimizationBlob(node, EAX, EDX, kDeoptEqualityClassCheck); | 1990 AddDeoptimizationBlob(node, EAX, EDX, kDeoptEqualityClassCheck); |
| 1991 __ j(EQUAL, &compare); | 1991 __ j(EQUAL, &compare); |
| 1992 // Smi causes deoptimization. | 1992 // Smi causes deoptimization. |
| 1993 __ testl(EAX, Immediate(kSmiTagMask)); | 1993 __ testl(EAX, Immediate(kSmiTagMask)); |
| 1994 __ j(ZERO, deopt_blob->label()); | 1994 __ j(ZERO, deopt_blob->label()); |
| 1995 __ LoadClassIndexOfObject(EBX, EAX); | 1995 __ LoadClassIndexOfObject(EBX, EAX); |
| 1996 for (intptr_t i = 0; i < num_classes; i++) { | 1996 for (intptr_t i = 0; i < num_classes; i++) { |
| 1997 const Class& cls = *(*classes)[i]; | 1997 const Class& cls = *(*classes)[i]; |
| 1998 __ cmpl(EBX, Immediate(cls.index())); | 1998 __ cmpl(EBX, Immediate(cls.id())); |
| 1999 if (i == (num_classes - 1)) { | 1999 if (i == (num_classes - 1)) { |
| 2000 __ j(NOT_EQUAL, deopt_blob->label()); | 2000 __ j(NOT_EQUAL, deopt_blob->label()); |
| 2001 } else { | 2001 } else { |
| 2002 __ j(EQUAL, &compare); | 2002 __ j(EQUAL, &compare); |
| 2003 } | 2003 } |
| 2004 } | 2004 } |
| 2005 } | 2005 } |
| 2006 __ Bind(&compare); | 2006 __ Bind(&compare); |
| 2007 __ cmpl(EAX, EDX); | 2007 __ cmpl(EAX, EDX); |
| 2008 if (NodeInfoHasLabels(node)) { | 2008 if (NodeInfoHasLabels(node)) { |
| (...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2642 AddDeoptimizationBlob(node, kDeoptCheckedInstanceCallSmiFail); | 2642 AddDeoptimizationBlob(node, kDeoptCheckedInstanceCallSmiFail); |
| 2643 __ testl(EAX, Immediate(kSmiTagMask)); | 2643 __ testl(EAX, Immediate(kSmiTagMask)); |
| 2644 __ j(ZERO, deopt_blob->label()); | 2644 __ j(ZERO, deopt_blob->label()); |
| 2645 } else { | 2645 } else { |
| 2646 // Receiver cannot be Smi, no need to test it. | 2646 // Receiver cannot be Smi, no need to test it. |
| 2647 } | 2647 } |
| 2648 __ LoadClassIndexOfObject(EAX, EAX); // Receiver's class. | 2648 __ LoadClassIndexOfObject(EAX, EAX); // Receiver's class. |
| 2649 for (intptr_t i = start_ix; i < classes.length(); i++) { | 2649 for (intptr_t i = start_ix; i < classes.length(); i++) { |
| 2650 const Class& cls = *classes[i]; | 2650 const Class& cls = *classes[i]; |
| 2651 const Function& target = *targets[i]; | 2651 const Function& target = *targets[i]; |
| 2652 __ cmpl(EAX, Immediate(cls.index())); | 2652 __ cmpl(EAX, Immediate(cls.id())); |
| 2653 if (i == (classes.length() - 1)) { | 2653 if (i == (classes.length() - 1)) { |
| 2654 // Last check. | 2654 // Last check. |
| 2655 DeoptimizationBlob* deopt_blob = | 2655 DeoptimizationBlob* deopt_blob = |
| 2656 AddDeoptimizationBlob(node, kDeoptCheckedInstanceCallCheckFail); | 2656 AddDeoptimizationBlob(node, kDeoptCheckedInstanceCallCheckFail); |
| 2657 __ j(NOT_EQUAL, deopt_blob->label()); | 2657 __ j(NOT_EQUAL, deopt_blob->label()); |
| 2658 GenerateDirectCall(node->id(), | 2658 GenerateDirectCall(node->id(), |
| 2659 token_index, | 2659 token_index, |
| 2660 target, | 2660 target, |
| 2661 num_args, | 2661 num_args, |
| 2662 optional_arguments_names); | 2662 optional_arguments_names); |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2899 } | 2899 } |
| 2900 } | 2900 } |
| 2901 // TODO(srdjan): Implement unary kSUB (negate) Mint. | 2901 // TODO(srdjan): Implement unary kSUB (negate) Mint. |
| 2902 CodeGenerator::VisitUnaryOpNode(node); | 2902 CodeGenerator::VisitUnaryOpNode(node); |
| 2903 } | 2903 } |
| 2904 | 2904 |
| 2905 | 2905 |
| 2906 } // namespace dart | 2906 } // namespace dart |
| 2907 | 2907 |
| 2908 #endif // defined TARGET_ARCH_IA32 | 2908 #endif // defined TARGET_ARCH_IA32 |
| OLD | NEW |