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

Side by Side Diff: src/ia32/lithium-ia32.cc

Issue 7132002: Remove RESTORE_CONTEXT flag from ia32 crankshaft codegen. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: last linting changes Created 9 years, 5 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/ia32/lithium-ia32.h ('k') | src/x64/lithium-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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
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 793 matching lines...) Expand 10 before | Expand all | Expand 10 after
804 ASSERT(instr->right()->representation().IsInteger32()); 804 ASSERT(instr->right()->representation().IsInteger32());
805 805
806 LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand()); 806 LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand());
807 LOperand* right = UseOrConstantAtStart(instr->MostConstantOperand()); 807 LOperand* right = UseOrConstantAtStart(instr->MostConstantOperand());
808 return DefineSameAsFirst(new LBitI(op, left, right)); 808 return DefineSameAsFirst(new LBitI(op, left, right));
809 } else { 809 } else {
810 ASSERT(instr->representation().IsTagged()); 810 ASSERT(instr->representation().IsTagged());
811 ASSERT(instr->left()->representation().IsTagged()); 811 ASSERT(instr->left()->representation().IsTagged());
812 ASSERT(instr->right()->representation().IsTagged()); 812 ASSERT(instr->right()->representation().IsTagged());
813 813
814 LOperand* context = UseFixed(instr->context(), esi);
814 LOperand* left = UseFixed(instr->left(), edx); 815 LOperand* left = UseFixed(instr->left(), edx);
815 LOperand* right = UseFixed(instr->right(), eax); 816 LOperand* right = UseFixed(instr->right(), eax);
816 LArithmeticT* result = new LArithmeticT(op, left, right); 817 LArithmeticT* result = new LArithmeticT(op, context, left, right);
817 return MarkAsCall(DefineFixed(result, eax), instr); 818 return MarkAsCall(DefineFixed(result, eax), instr);
818 } 819 }
819 } 820 }
820 821
821 822
822 LInstruction* LChunkBuilder::DoShift(Token::Value op, 823 LInstruction* LChunkBuilder::DoShift(Token::Value op,
823 HBitwiseBinaryOperation* instr) { 824 HBitwiseBinaryOperation* instr) {
824 if (instr->representation().IsTagged()) { 825 if (instr->representation().IsTagged()) {
825 ASSERT(instr->left()->representation().IsTagged()); 826 ASSERT(instr->left()->representation().IsTagged());
826 ASSERT(instr->right()->representation().IsTagged()); 827 ASSERT(instr->right()->representation().IsTagged());
827 828
829 LOperand* context = UseFixed(instr->context(), esi);
828 LOperand* left = UseFixed(instr->left(), edx); 830 LOperand* left = UseFixed(instr->left(), edx);
829 LOperand* right = UseFixed(instr->right(), eax); 831 LOperand* right = UseFixed(instr->right(), eax);
830 LArithmeticT* result = new LArithmeticT(op, left, right); 832 LArithmeticT* result = new LArithmeticT(op, context, left, right);
831 return MarkAsCall(DefineFixed(result, eax), instr); 833 return MarkAsCall(DefineFixed(result, eax), instr);
832 } 834 }
833 835
834 ASSERT(instr->representation().IsInteger32()); 836 ASSERT(instr->representation().IsInteger32());
835 ASSERT(instr->OperandAt(0)->representation().IsInteger32()); 837 ASSERT(instr->left()->representation().IsInteger32());
836 ASSERT(instr->OperandAt(1)->representation().IsInteger32()); 838 ASSERT(instr->right()->representation().IsInteger32());
837 LOperand* left = UseRegisterAtStart(instr->OperandAt(0)); 839 LOperand* left = UseRegisterAtStart(instr->left());
838 840
839 HValue* right_value = instr->OperandAt(1); 841 HValue* right_value = instr->right();
840 LOperand* right = NULL; 842 LOperand* right = NULL;
841 int constant_value = 0; 843 int constant_value = 0;
842 if (right_value->IsConstant()) { 844 if (right_value->IsConstant()) {
843 HConstant* constant = HConstant::cast(right_value); 845 HConstant* constant = HConstant::cast(right_value);
844 right = chunk_->DefineConstantOperand(constant); 846 right = chunk_->DefineConstantOperand(constant);
845 constant_value = constant->Integer32Value() & 0x1f; 847 constant_value = constant->Integer32Value() & 0x1f;
846 } else { 848 } else {
847 right = UseFixed(right_value, ecx); 849 right = UseFixed(right_value, ecx);
848 } 850 }
849 851
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 HArithmeticBinaryOperation* instr) { 885 HArithmeticBinaryOperation* instr) {
884 ASSERT(op == Token::ADD || 886 ASSERT(op == Token::ADD ||
885 op == Token::DIV || 887 op == Token::DIV ||
886 op == Token::MOD || 888 op == Token::MOD ||
887 op == Token::MUL || 889 op == Token::MUL ||
888 op == Token::SUB); 890 op == Token::SUB);
889 HValue* left = instr->left(); 891 HValue* left = instr->left();
890 HValue* right = instr->right(); 892 HValue* right = instr->right();
891 ASSERT(left->representation().IsTagged()); 893 ASSERT(left->representation().IsTagged());
892 ASSERT(right->representation().IsTagged()); 894 ASSERT(right->representation().IsTagged());
895 LOperand* context = UseFixed(instr->context(), esi);
893 LOperand* left_operand = UseFixed(left, edx); 896 LOperand* left_operand = UseFixed(left, edx);
894 LOperand* right_operand = UseFixed(right, eax); 897 LOperand* right_operand = UseFixed(right, eax);
895 LArithmeticT* result = new LArithmeticT(op, left_operand, right_operand); 898 LArithmeticT* result =
899 new LArithmeticT(op, context, left_operand, right_operand);
896 return MarkAsCall(DefineFixed(result, eax), instr); 900 return MarkAsCall(DefineFixed(result, eax), instr);
897 } 901 }
898 902
903
899 void LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { 904 void LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) {
900 ASSERT(is_building()); 905 ASSERT(is_building());
901 current_block_ = block; 906 current_block_ = block;
902 next_block_ = next_block; 907 next_block_ = next_block;
903 if (block->IsStartBlock()) { 908 if (block->IsStartBlock()) {
904 block->UpdateEnvironment(graph_->start_environment()); 909 block->UpdateEnvironment(graph_->start_environment());
905 argument_count_ = 0; 910 argument_count_ = 0;
906 } else if (block->predecessors()->length() == 1) { 911 } else if (block->predecessors()->length() == 1) {
907 // We have a single predecessor => copy environment and outgoing 912 // We have a single predecessor => copy environment and outgoing
908 // argument count from the predecessor. 913 // argument count from the predecessor.
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1054 LOperand* context = UseFixed(instr->context(), esi); 1059 LOperand* context = UseFixed(instr->context(), esi);
1055 LInstanceOf* result = new LInstanceOf(context, left, right); 1060 LInstanceOf* result = new LInstanceOf(context, left, right);
1056 return MarkAsCall(DefineFixed(result, eax), instr); 1061 return MarkAsCall(DefineFixed(result, eax), instr);
1057 } 1062 }
1058 1063
1059 1064
1060 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( 1065 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
1061 HInstanceOfKnownGlobal* instr) { 1066 HInstanceOfKnownGlobal* instr) {
1062 LInstanceOfKnownGlobal* result = 1067 LInstanceOfKnownGlobal* result =
1063 new LInstanceOfKnownGlobal( 1068 new LInstanceOfKnownGlobal(
1064 UseFixed(instr->value(), InstanceofStub::left()), 1069 UseFixed(instr->context(), esi),
1070 UseFixed(instr->left(), InstanceofStub::left()),
1065 FixedTemp(edi)); 1071 FixedTemp(edi));
1066 return MarkAsCall(DefineFixed(result, eax), instr); 1072 return MarkAsCall(DefineFixed(result, eax), instr);
1067 } 1073 }
1068 1074
1069 1075
1070 LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { 1076 LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
1071 LOperand* function = UseFixed(instr->function(), edi); 1077 LOperand* function = UseFixed(instr->function(), edi);
1072 LOperand* receiver = UseFixed(instr->receiver(), eax); 1078 LOperand* receiver = UseFixed(instr->receiver(), eax);
1073 LOperand* length = UseFixed(instr->length(), ebx); 1079 LOperand* length = UseFixed(instr->length(), ebx);
1074 LOperand* elements = UseFixed(instr->elements(), ecx); 1080 LOperand* elements = UseFixed(instr->elements(), ecx);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 LInvokeFunction* result = new LInvokeFunction(context, function); 1137 LInvokeFunction* result = new LInvokeFunction(context, function);
1132 return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); 1138 return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY);
1133 } 1139 }
1134 1140
1135 1141
1136 LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 1142 LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
1137 BuiltinFunctionId op = instr->op(); 1143 BuiltinFunctionId op = instr->op();
1138 if (op == kMathLog) { 1144 if (op == kMathLog) {
1139 ASSERT(instr->representation().IsDouble()); 1145 ASSERT(instr->representation().IsDouble());
1140 ASSERT(instr->value()->representation().IsDouble()); 1146 ASSERT(instr->value()->representation().IsDouble());
1147 LOperand* context = UseAny(instr->context()); // Not actually used.
1141 LOperand* input = UseRegisterAtStart(instr->value()); 1148 LOperand* input = UseRegisterAtStart(instr->value());
1142 LUnaryMathOperation* result = new LUnaryMathOperation(input); 1149 LUnaryMathOperation* result = new LUnaryMathOperation(context, input);
1143 return DefineSameAsFirst(result); 1150 return DefineSameAsFirst(result);
1144 } else if (op == kMathSin || op == kMathCos) { 1151 } else if (op == kMathSin || op == kMathCos) {
1152 LOperand* context = UseFixed(instr->context(), esi);
1145 LOperand* input = UseFixedDouble(instr->value(), xmm1); 1153 LOperand* input = UseFixedDouble(instr->value(), xmm1);
1146 LUnaryMathOperation* result = new LUnaryMathOperation(input); 1154 LUnaryMathOperation* result = new LUnaryMathOperation(context, input);
1147 return MarkAsCall(DefineFixedDouble(result, xmm1), instr); 1155 return MarkAsCall(DefineFixedDouble(result, xmm1), instr);
1148 } else { 1156 } else {
1149 LOperand* input = UseRegisterAtStart(instr->value()); 1157 LOperand* input = UseRegisterAtStart(instr->value());
1150 LUnaryMathOperation* result = new LUnaryMathOperation(input); 1158 LOperand* context = UseAny(instr->context()); // Deferred use by MathAbs.
1159 LUnaryMathOperation* result = new LUnaryMathOperation(context, input);
1151 switch (op) { 1160 switch (op) {
1152 case kMathAbs: 1161 case kMathAbs:
1153 return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result))); 1162 return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result)));
1154 case kMathFloor: 1163 case kMathFloor:
1155 return AssignEnvironment(DefineAsRegister(result)); 1164 return AssignEnvironment(DefineAsRegister(result));
1156 case kMathRound: 1165 case kMathRound:
1157 return AssignEnvironment(DefineAsRegister(result)); 1166 return AssignEnvironment(DefineAsRegister(result));
1158 case kMathSqrt: 1167 case kMathSqrt:
1159 return DefineSameAsFirst(result); 1168 return DefineSameAsFirst(result);
1160 case kMathPowHalf: 1169 case kMathPowHalf:
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1211 LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { 1220 LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) {
1212 LOperand* context = UseFixed(instr->context(), esi); 1221 LOperand* context = UseFixed(instr->context(), esi);
1213 argument_count_ -= instr->argument_count(); 1222 argument_count_ -= instr->argument_count();
1214 LCallFunction* result = new LCallFunction(context); 1223 LCallFunction* result = new LCallFunction(context);
1215 return MarkAsCall(DefineFixed(result, eax), instr); 1224 return MarkAsCall(DefineFixed(result, eax), instr);
1216 } 1225 }
1217 1226
1218 1227
1219 LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { 1228 LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
1220 argument_count_ -= instr->argument_count(); 1229 argument_count_ -= instr->argument_count();
1221 return MarkAsCall(DefineFixed(new LCallRuntime, eax), instr); 1230 LOperand* context = UseFixed(instr->context(), esi);
1231 return MarkAsCall(DefineFixed(new LCallRuntime(context), eax), instr);
1222 } 1232 }
1223 1233
1224 1234
1225 LInstruction* LChunkBuilder::DoShr(HShr* instr) { 1235 LInstruction* LChunkBuilder::DoShr(HShr* instr) {
1226 return DoShift(Token::SHR, instr); 1236 return DoShift(Token::SHR, instr);
1227 } 1237 }
1228 1238
1229 1239
1230 LInstruction* LChunkBuilder::DoSar(HSar* instr) { 1240 LInstruction* LChunkBuilder::DoSar(HSar* instr) {
1231 return DoShift(Token::SAR, instr); 1241 return DoShift(Token::SAR, instr);
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1396 return MarkAsCall(DefineFixedDouble(result, xmm3), instr, 1406 return MarkAsCall(DefineFixedDouble(result, xmm3), instr,
1397 CAN_DEOPTIMIZE_EAGERLY); 1407 CAN_DEOPTIMIZE_EAGERLY);
1398 } 1408 }
1399 1409
1400 1410
1401 LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { 1411 LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
1402 Token::Value op = instr->token(); 1412 Token::Value op = instr->token();
1403 ASSERT(instr->left()->representation().IsTagged()); 1413 ASSERT(instr->left()->representation().IsTagged());
1404 ASSERT(instr->right()->representation().IsTagged()); 1414 ASSERT(instr->right()->representation().IsTagged());
1405 bool reversed = (op == Token::GT || op == Token::LTE); 1415 bool reversed = (op == Token::GT || op == Token::LTE);
1416 LOperand* context = UseFixed(instr->context(), esi);
1406 LOperand* left = UseFixed(instr->left(), reversed ? eax : edx); 1417 LOperand* left = UseFixed(instr->left(), reversed ? eax : edx);
1407 LOperand* right = UseFixed(instr->right(), reversed ? edx : eax); 1418 LOperand* right = UseFixed(instr->right(), reversed ? edx : eax);
1408 LCmpT* result = new LCmpT(left, right); 1419 LCmpT* result = new LCmpT(context, left, right);
1409 return MarkAsCall(DefineFixed(result, eax), instr); 1420 return MarkAsCall(DefineFixed(result, eax), instr);
1410 } 1421 }
1411 1422
1412 1423
1413 LInstruction* LChunkBuilder::DoCompareIDAndBranch( 1424 LInstruction* LChunkBuilder::DoCompareIDAndBranch(
1414 HCompareIDAndBranch* instr) { 1425 HCompareIDAndBranch* instr) {
1415 Representation r = instr->GetInputRepresentation(); 1426 Representation r = instr->GetInputRepresentation();
1416 if (r.IsInteger32()) { 1427 if (r.IsInteger32()) {
1417 ASSERT(instr->left()->representation().IsInteger32()); 1428 ASSERT(instr->left()->representation().IsInteger32());
1418 ASSERT(instr->right()->representation().IsInteger32()); 1429 ASSERT(instr->right()->representation().IsInteger32());
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1545 1556
1546 1557
1547 LInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { 1558 LInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
1548 // The control instruction marking the end of a block that completed 1559 // The control instruction marking the end of a block that completed
1549 // abruptly (e.g., threw an exception). There is nothing specific to do. 1560 // abruptly (e.g., threw an exception). There is nothing specific to do.
1550 return NULL; 1561 return NULL;
1551 } 1562 }
1552 1563
1553 1564
1554 LInstruction* LChunkBuilder::DoThrow(HThrow* instr) { 1565 LInstruction* LChunkBuilder::DoThrow(HThrow* instr) {
1566 LOperand* context = UseFixed(instr->context(), esi);
1555 LOperand* value = UseFixed(instr->value(), eax); 1567 LOperand* value = UseFixed(instr->value(), eax);
1556 return MarkAsCall(new LThrow(value), instr); 1568 return MarkAsCall(new LThrow(context, value), instr);
1557 } 1569 }
1558 1570
1559 1571
1560 LInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 1572 LInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
1561 return NULL; 1573 return NULL;
1562 } 1574 }
1563 1575
1564 1576
1565 LInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) { 1577 LInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) {
1566 // All HForceRepresentation instructions should be eliminated in the 1578 // All HForceRepresentation instructions should be eliminated in the
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
1804 LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { 1816 LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
1805 ASSERT(instr->representation().IsTagged()); 1817 ASSERT(instr->representation().IsTagged());
1806 LOperand* obj = UseRegisterAtStart(instr->object()); 1818 LOperand* obj = UseRegisterAtStart(instr->object());
1807 return DefineAsRegister(new LLoadNamedField(obj)); 1819 return DefineAsRegister(new LLoadNamedField(obj));
1808 } 1820 }
1809 1821
1810 1822
1811 LInstruction* LChunkBuilder::DoLoadNamedFieldPolymorphic( 1823 LInstruction* LChunkBuilder::DoLoadNamedFieldPolymorphic(
1812 HLoadNamedFieldPolymorphic* instr) { 1824 HLoadNamedFieldPolymorphic* instr) {
1813 ASSERT(instr->representation().IsTagged()); 1825 ASSERT(instr->representation().IsTagged());
1826 LOperand* context = UseFixed(instr->context(), esi);
1814 if (instr->need_generic()) { 1827 if (instr->need_generic()) {
1815 LOperand* obj = UseFixed(instr->object(), eax); 1828 LOperand* obj = UseFixed(instr->object(), eax);
1816 LLoadNamedFieldPolymorphic* result = new LLoadNamedFieldPolymorphic(obj); 1829 LLoadNamedFieldPolymorphic* result =
1830 new LLoadNamedFieldPolymorphic(context, obj);
1817 return MarkAsCall(DefineFixed(result, eax), instr); 1831 return MarkAsCall(DefineFixed(result, eax), instr);
1818 } else { 1832 } else {
1819 LOperand* obj = UseRegisterAtStart(instr->object()); 1833 LOperand* obj = UseRegisterAtStart(instr->object());
1820 LLoadNamedFieldPolymorphic* result = new LLoadNamedFieldPolymorphic(obj); 1834 LLoadNamedFieldPolymorphic* result =
1835 new LLoadNamedFieldPolymorphic(context, obj);
1821 return AssignEnvironment(DefineAsRegister(result)); 1836 return AssignEnvironment(DefineAsRegister(result));
1822 } 1837 }
1823 } 1838 }
1824 1839
1825 1840
1826 LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { 1841 LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
1827 LOperand* context = UseFixed(instr->context(), esi); 1842 LOperand* context = UseFixed(instr->context(), esi);
1828 LOperand* object = UseFixed(instr->object(), eax); 1843 LOperand* object = UseFixed(instr->object(), eax);
1829 LLoadNamedGeneric* result = new LLoadNamedGeneric(context, object); 1844 LLoadNamedGeneric* result = new LLoadNamedGeneric(context, object);
1830 return MarkAsCall(DefineFixed(result, eax), instr); 1845 return MarkAsCall(DefineFixed(result, eax), instr);
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1991 LOperand* context = UseFixed(instr->context(), esi); 2006 LOperand* context = UseFixed(instr->context(), esi);
1992 LOperand* object = UseFixed(instr->object(), edx); 2007 LOperand* object = UseFixed(instr->object(), edx);
1993 LOperand* value = UseFixed(instr->value(), eax); 2008 LOperand* value = UseFixed(instr->value(), eax);
1994 2009
1995 LStoreNamedGeneric* result = new LStoreNamedGeneric(context, object, value); 2010 LStoreNamedGeneric* result = new LStoreNamedGeneric(context, object, value);
1996 return MarkAsCall(result, instr); 2011 return MarkAsCall(result, instr);
1997 } 2012 }
1998 2013
1999 2014
2000 LInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { 2015 LInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
2016 LOperand* context = UseFixed(instr->context(), esi);
2001 LOperand* left = UseOrConstantAtStart(instr->left()); 2017 LOperand* left = UseOrConstantAtStart(instr->left());
2002 LOperand* right = UseOrConstantAtStart(instr->right()); 2018 LOperand* right = UseOrConstantAtStart(instr->right());
2003 return MarkAsCall(DefineFixed(new LStringAdd(left, right), eax), instr); 2019 LStringAdd* string_add = new LStringAdd(context, left, right);
2020 return MarkAsCall(DefineFixed(string_add, eax), instr);
2004 } 2021 }
2005 2022
2006 2023
2007 LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { 2024 LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
2008 LOperand* string = UseRegister(instr->string()); 2025 LOperand* string = UseRegister(instr->string());
2009 LOperand* index = UseRegisterOrConstant(instr->index()); 2026 LOperand* index = UseRegisterOrConstant(instr->index());
2010 LStringCharCodeAt* result = new LStringCharCodeAt(string, index); 2027 LOperand* context = UseAny(instr->context());
2028 LStringCharCodeAt* result = new LStringCharCodeAt(context, string, index);
2011 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 2029 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
2012 } 2030 }
2013 2031
2014 2032
2015 LInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { 2033 LInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
2016 LOperand* char_code = UseRegister(instr->value()); 2034 LOperand* char_code = UseRegister(instr->value());
2017 LStringCharFromCode* result = new LStringCharFromCode(char_code); 2035 LOperand* context = UseAny(instr->context());
2036 LStringCharFromCode* result = new LStringCharFromCode(context, char_code);
2018 return AssignPointerMap(DefineAsRegister(result)); 2037 return AssignPointerMap(DefineAsRegister(result));
2019 } 2038 }
2020 2039
2021 2040
2022 LInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) { 2041 LInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) {
2023 LOperand* string = UseRegisterAtStart(instr->value()); 2042 LOperand* string = UseRegisterAtStart(instr->value());
2024 return DefineAsRegister(new LStringLength(string)); 2043 return DefineAsRegister(new LStringLength(string));
2025 } 2044 }
2026 2045
2027 2046
2028 LInstruction* LChunkBuilder::DoArrayLiteral(HArrayLiteral* instr) { 2047 LInstruction* LChunkBuilder::DoArrayLiteral(HArrayLiteral* instr) {
2029 return MarkAsCall(DefineFixed(new LArrayLiteral, eax), instr); 2048 LOperand* context = UseFixed(instr->context(), esi);
2049 return MarkAsCall(DefineFixed(new LArrayLiteral(context), eax), instr);
2030 } 2050 }
2031 2051
2032 2052
2033 LInstruction* LChunkBuilder::DoObjectLiteral(HObjectLiteral* instr) { 2053 LInstruction* LChunkBuilder::DoObjectLiteral(HObjectLiteral* instr) {
2034 LOperand* context = UseFixed(instr->context(), esi); 2054 LOperand* context = UseFixed(instr->context(), esi);
2035 return MarkAsCall(DefineFixed(new LObjectLiteral(context), eax), instr); 2055 return MarkAsCall(DefineFixed(new LObjectLiteral(context), eax), instr);
2036 } 2056 }
2037 2057
2038 2058
2039 LInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { 2059 LInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) {
2040 return MarkAsCall(DefineFixed(new LRegExpLiteral, eax), instr); 2060 LOperand* context = UseFixed(instr->context(), esi);
2061 return MarkAsCall(DefineFixed(new LRegExpLiteral(context), eax), instr);
2041 } 2062 }
2042 2063
2043 2064
2044 LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { 2065 LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) {
2045 return MarkAsCall(DefineFixed(new LFunctionLiteral, eax), instr); 2066 LOperand* context = UseFixed(instr->context(), esi);
2067 return MarkAsCall(DefineFixed(new LFunctionLiteral(context), eax), instr);
2046 } 2068 }
2047 2069
2048 2070
2049 LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) { 2071 LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) {
2050 LDeleteProperty* result = 2072 LOperand* context = UseFixed(instr->context(), esi);
2051 new LDeleteProperty(UseAtStart(instr->object()), 2073 LOperand* object = UseAtStart(instr->object());
2052 UseOrConstantAtStart(instr->key())); 2074 LOperand* key = UseOrConstantAtStart(instr->key());
2075 LDeleteProperty* result = new LDeleteProperty(context, object, key);
2053 return MarkAsCall(DefineFixed(result, eax), instr); 2076 return MarkAsCall(DefineFixed(result, eax), instr);
2054 } 2077 }
2055 2078
2056 2079
2057 LInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { 2080 LInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) {
2058 allocator_->MarkAsOsrEntry(); 2081 allocator_->MarkAsOsrEntry();
2059 current_block_->last_environment()->set_ast_id(instr->ast_id()); 2082 current_block_->last_environment()->set_ast_id(instr->ast_id());
2060 return AssignEnvironment(new LOsrEntry); 2083 return AssignEnvironment(new LOsrEntry);
2061 } 2084 }
2062 2085
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2104 2127
2105 2128
2106 LInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { 2129 LInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) {
2107 LOperand* object = UseFixed(instr->value(), eax); 2130 LOperand* object = UseFixed(instr->value(), eax);
2108 LToFastProperties* result = new LToFastProperties(object); 2131 LToFastProperties* result = new LToFastProperties(object);
2109 return MarkAsCall(DefineFixed(result, eax), instr); 2132 return MarkAsCall(DefineFixed(result, eax), instr);
2110 } 2133 }
2111 2134
2112 2135
2113 LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { 2136 LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
2114 LTypeof* result = new LTypeof(UseAtStart(instr->value())); 2137 LOperand* context = UseFixed(instr->context(), esi);
2138 LOperand* value = UseAtStart(instr->value());
2139 LTypeof* result = new LTypeof(context, value);
2115 return MarkAsCall(DefineFixed(result, eax), instr); 2140 return MarkAsCall(DefineFixed(result, eax), instr);
2116 } 2141 }
2117 2142
2118 2143
2119 LInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 2144 LInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
2120 return new LTypeofIsAndBranch(UseTempRegister(instr->value())); 2145 return new LTypeofIsAndBranch(UseTempRegister(instr->value()));
2121 } 2146 }
2122 2147
2123 2148
2124 LInstruction* LChunkBuilder::DoIsConstructCallAndBranch( 2149 LInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
(...skipping 29 matching lines...) Expand all
2154 ClearInstructionPendingDeoptimizationEnvironment(); 2179 ClearInstructionPendingDeoptimizationEnvironment();
2155 return result; 2180 return result;
2156 } 2181 }
2157 2182
2158 return NULL; 2183 return NULL;
2159 } 2184 }
2160 2185
2161 2186
2162 LInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { 2187 LInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
2163 if (instr->is_function_entry()) { 2188 if (instr->is_function_entry()) {
2164 return MarkAsCall(new LStackCheck, instr); 2189 LOperand* context = UseFixed(instr->context(), esi);
2190 return MarkAsCall(new LStackCheck(context), instr);
2165 } else { 2191 } else {
2166 ASSERT(instr->is_backwards_branch()); 2192 ASSERT(instr->is_backwards_branch());
2167 return AssignEnvironment(AssignPointerMap(new LStackCheck)); 2193 LOperand* context = UseAny(instr->context());
2194 return AssignEnvironment(AssignPointerMap(new LStackCheck(context)));
2168 } 2195 }
2169 } 2196 }
2170 2197
2171 2198
2172 LInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { 2199 LInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
2173 HEnvironment* outer = current_block_->last_environment(); 2200 HEnvironment* outer = current_block_->last_environment();
2174 HConstant* undefined = graph()->GetConstantUndefined(); 2201 HConstant* undefined = graph()->GetConstantUndefined();
2175 HEnvironment* inner = outer->CopyForInlining(instr->closure(), 2202 HEnvironment* inner = outer->CopyForInlining(instr->closure(),
2176 instr->function(), 2203 instr->function(),
2177 undefined, 2204 undefined,
2178 instr->call_kind()); 2205 instr->call_kind());
2179 current_block_->UpdateEnvironment(inner); 2206 current_block_->UpdateEnvironment(inner);
2180 chunk_->AddInlinedClosure(instr->closure()); 2207 chunk_->AddInlinedClosure(instr->closure());
2181 return NULL; 2208 return NULL;
2182 } 2209 }
2183 2210
2184 2211
2185 LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { 2212 LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
2186 HEnvironment* outer = current_block_->last_environment()->outer(); 2213 HEnvironment* outer = current_block_->last_environment()->outer();
2187 current_block_->UpdateEnvironment(outer); 2214 current_block_->UpdateEnvironment(outer);
2188 return NULL; 2215 return NULL;
2189 } 2216 }
2190 2217
2191 2218
2192 LInstruction* LChunkBuilder::DoIn(HIn* instr) { 2219 LInstruction* LChunkBuilder::DoIn(HIn* instr) {
2220 LOperand* context = UseFixed(instr->context(), esi);
2193 LOperand* key = UseOrConstantAtStart(instr->key()); 2221 LOperand* key = UseOrConstantAtStart(instr->key());
2194 LOperand* object = UseOrConstantAtStart(instr->object()); 2222 LOperand* object = UseOrConstantAtStart(instr->object());
2195 LIn* result = new LIn(key, object); 2223 LIn* result = new LIn(context, key, object);
2196 return MarkAsCall(DefineFixed(result, eax), instr); 2224 return MarkAsCall(DefineFixed(result, eax), instr);
2197 } 2225 }
2198 2226
2199 2227
2200 } } // namespace v8::internal 2228 } } // namespace v8::internal
2201 2229
2202 #endif // V8_TARGET_ARCH_IA32 2230 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/lithium-ia32.h ('k') | src/x64/lithium-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698