| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // |
| 3 // Copyright IBM Corp. 2012, 2013. All rights reserved. |
| 4 // |
| 2 // Use of this source code is governed by a BSD-style license that can be | 5 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 6 // found in the LICENSE file. |
| 4 | 7 |
| 5 #include "src/v8.h" | 8 #include "src/v8.h" |
| 6 | 9 |
| 7 #include "src/arm/lithium-codegen-arm.h" | |
| 8 #include "src/hydrogen-osr.h" | 10 #include "src/hydrogen-osr.h" |
| 9 #include "src/lithium-inl.h" | 11 #include "src/lithium-inl.h" |
| 12 #include "src/ppc/lithium-codegen-ppc.h" |
| 10 | 13 |
| 11 namespace v8 { | 14 namespace v8 { |
| 12 namespace internal { | 15 namespace internal { |
| 13 | 16 |
| 14 #define DEFINE_COMPILE(type) \ | 17 #define DEFINE_COMPILE(type) \ |
| 15 void L##type::CompileToNative(LCodeGen* generator) { \ | 18 void L##type::CompileToNative(LCodeGen* generator) { \ |
| 16 generator->Do##type(this); \ | 19 generator->Do##type(this); \ |
| 17 } | 20 } |
| 18 LITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) | 21 LITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) |
| 19 #undef DEFINE_COMPILE | 22 #undef DEFINE_COMPILE |
| (...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 718 } | 721 } |
| 719 } | 722 } |
| 720 | 723 |
| 721 | 724 |
| 722 LInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, | 725 LInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, |
| 723 HArithmeticBinaryOperation* instr) { | 726 HArithmeticBinaryOperation* instr) { |
| 724 DCHECK(instr->representation().IsDouble()); | 727 DCHECK(instr->representation().IsDouble()); |
| 725 DCHECK(instr->left()->representation().IsDouble()); | 728 DCHECK(instr->left()->representation().IsDouble()); |
| 726 DCHECK(instr->right()->representation().IsDouble()); | 729 DCHECK(instr->right()->representation().IsDouble()); |
| 727 if (op == Token::MOD) { | 730 if (op == Token::MOD) { |
| 728 LOperand* left = UseFixedDouble(instr->left(), d0); | 731 LOperand* left = UseFixedDouble(instr->left(), d1); |
| 729 LOperand* right = UseFixedDouble(instr->right(), d1); | 732 LOperand* right = UseFixedDouble(instr->right(), d2); |
| 730 LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); | 733 LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); |
| 731 return MarkAsCall(DefineFixedDouble(result, d0), instr); | 734 // We call a C function for double modulo. It can't trigger a GC. We need |
| 735 // to use fixed result register for the call. |
| 736 // TODO(fschneider): Allow any register as input registers. |
| 737 return MarkAsCall(DefineFixedDouble(result, d1), instr); |
| 732 } else { | 738 } else { |
| 733 LOperand* left = UseRegisterAtStart(instr->left()); | 739 LOperand* left = UseRegisterAtStart(instr->left()); |
| 734 LOperand* right = UseRegisterAtStart(instr->right()); | 740 LOperand* right = UseRegisterAtStart(instr->right()); |
| 735 LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); | 741 LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); |
| 736 return DefineAsRegister(result); | 742 return DefineAsRegister(result); |
| 737 } | 743 } |
| 738 } | 744 } |
| 739 | 745 |
| 740 | 746 |
| 741 LInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, | 747 LInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, |
| 742 HBinaryOperation* instr) { | 748 HBinaryOperation* instr) { |
| 743 HValue* left = instr->left(); | 749 HValue* left = instr->left(); |
| 744 HValue* right = instr->right(); | 750 HValue* right = instr->right(); |
| 745 DCHECK(left->representation().IsTagged()); | 751 DCHECK(left->representation().IsTagged()); |
| 746 DCHECK(right->representation().IsTagged()); | 752 DCHECK(right->representation().IsTagged()); |
| 747 LOperand* context = UseFixed(instr->context(), cp); | 753 LOperand* context = UseFixed(instr->context(), cp); |
| 748 LOperand* left_operand = UseFixed(left, r1); | 754 LOperand* left_operand = UseFixed(left, r4); |
| 749 LOperand* right_operand = UseFixed(right, r0); | 755 LOperand* right_operand = UseFixed(right, r3); |
| 750 LArithmeticT* result = | 756 LArithmeticT* result = |
| 751 new(zone()) LArithmeticT(op, context, left_operand, right_operand); | 757 new(zone()) LArithmeticT(op, context, left_operand, right_operand); |
| 752 return MarkAsCall(DefineFixed(result, r0), instr); | 758 return MarkAsCall(DefineFixed(result, r3), instr); |
| 753 } | 759 } |
| 754 | 760 |
| 755 | 761 |
| 756 void LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { | 762 void LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { |
| 757 DCHECK(is_building()); | 763 DCHECK(is_building()); |
| 758 current_block_ = block; | 764 current_block_ = block; |
| 759 next_block_ = next_block; | 765 next_block_ = next_block; |
| 760 if (block->IsStartBlock()) { | 766 if (block->IsStartBlock()) { |
| 761 block->UpdateEnvironment(graph_->start_environment()); | 767 block->UpdateEnvironment(graph_->start_environment()); |
| 762 argument_count_ = 0; | 768 argument_count_ = 0; |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 974 | 980 |
| 975 LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { | 981 LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { |
| 976 info()->MarkAsRequiresFrame(); | 982 info()->MarkAsRequiresFrame(); |
| 977 return DefineAsRegister(new(zone()) LArgumentsElements); | 983 return DefineAsRegister(new(zone()) LArgumentsElements); |
| 978 } | 984 } |
| 979 | 985 |
| 980 | 986 |
| 981 LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { | 987 LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { |
| 982 LOperand* context = UseFixed(instr->context(), cp); | 988 LOperand* context = UseFixed(instr->context(), cp); |
| 983 LInstanceOf* result = | 989 LInstanceOf* result = |
| 984 new(zone()) LInstanceOf(context, UseFixed(instr->left(), r0), | 990 new(zone()) LInstanceOf(context, UseFixed(instr->left(), r3), |
| 985 UseFixed(instr->right(), r1)); | 991 UseFixed(instr->right(), r4)); |
| 986 return MarkAsCall(DefineFixed(result, r0), instr); | 992 return MarkAsCall(DefineFixed(result, r3), instr); |
| 987 } | 993 } |
| 988 | 994 |
| 989 | 995 |
| 990 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( | 996 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( |
| 991 HInstanceOfKnownGlobal* instr) { | 997 HInstanceOfKnownGlobal* instr) { |
| 992 LInstanceOfKnownGlobal* result = | 998 LInstanceOfKnownGlobal* result = |
| 993 new(zone()) LInstanceOfKnownGlobal( | 999 new(zone()) LInstanceOfKnownGlobal( |
| 994 UseFixed(instr->context(), cp), | 1000 UseFixed(instr->context(), cp), |
| 995 UseFixed(instr->left(), r0), | 1001 UseFixed(instr->left(), r3), |
| 996 FixedTemp(r4)); | 1002 FixedTemp(r7)); |
| 997 return MarkAsCall(DefineFixed(result, r0), instr); | 1003 return MarkAsCall(DefineFixed(result, r3), instr); |
| 998 } | 1004 } |
| 999 | 1005 |
| 1000 | 1006 |
| 1001 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { | 1007 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { |
| 1002 LOperand* receiver = UseRegisterAtStart(instr->receiver()); | 1008 LOperand* receiver = UseRegisterAtStart(instr->receiver()); |
| 1003 LOperand* function = UseRegisterAtStart(instr->function()); | 1009 LOperand* function = UseRegisterAtStart(instr->function()); |
| 1004 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); | 1010 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); |
| 1005 return AssignEnvironment(DefineAsRegister(result)); | 1011 return AssignEnvironment(DefineAsRegister(result)); |
| 1006 } | 1012 } |
| 1007 | 1013 |
| 1008 | 1014 |
| 1009 LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { | 1015 LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { |
| 1010 LOperand* function = UseFixed(instr->function(), r1); | 1016 LOperand* function = UseFixed(instr->function(), r4); |
| 1011 LOperand* receiver = UseFixed(instr->receiver(), r0); | 1017 LOperand* receiver = UseFixed(instr->receiver(), r3); |
| 1012 LOperand* length = UseFixed(instr->length(), r2); | 1018 LOperand* length = UseFixed(instr->length(), r5); |
| 1013 LOperand* elements = UseFixed(instr->elements(), r3); | 1019 LOperand* elements = UseFixed(instr->elements(), r6); |
| 1014 LApplyArguments* result = new(zone()) LApplyArguments(function, | 1020 LApplyArguments* result = new(zone()) LApplyArguments(function, |
| 1015 receiver, | 1021 receiver, |
| 1016 length, | 1022 length, |
| 1017 elements); | 1023 elements); |
| 1018 return MarkAsCall(DefineFixed(result, r0), instr, CAN_DEOPTIMIZE_EAGERLY); | 1024 return MarkAsCall(DefineFixed(result, r3), instr, CAN_DEOPTIMIZE_EAGERLY); |
| 1019 } | 1025 } |
| 1020 | 1026 |
| 1021 | 1027 |
| 1022 LInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) { | 1028 LInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) { |
| 1023 int argc = instr->OperandCount(); | 1029 int argc = instr->OperandCount(); |
| 1024 for (int i = 0; i < argc; ++i) { | 1030 for (int i = 0; i < argc; ++i) { |
| 1025 LOperand* argument = Use(instr->argument(i)); | 1031 LOperand* argument = Use(instr->argument(i)); |
| 1026 AddInstruction(new(zone()) LPushArgument(argument), instr); | 1032 AddInstruction(new(zone()) LPushArgument(argument), instr); |
| 1027 } | 1033 } |
| 1028 return NULL; | 1034 return NULL; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1065 | 1071 |
| 1066 | 1072 |
| 1067 LInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { | 1073 LInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { |
| 1068 LOperand* context = UseFixed(instr->context(), cp); | 1074 LOperand* context = UseFixed(instr->context(), cp); |
| 1069 return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); | 1075 return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); |
| 1070 } | 1076 } |
| 1071 | 1077 |
| 1072 | 1078 |
| 1073 LInstruction* LChunkBuilder::DoCallJSFunction( | 1079 LInstruction* LChunkBuilder::DoCallJSFunction( |
| 1074 HCallJSFunction* instr) { | 1080 HCallJSFunction* instr) { |
| 1075 LOperand* function = UseFixed(instr->function(), r1); | 1081 LOperand* function = UseFixed(instr->function(), r4); |
| 1076 | 1082 |
| 1077 LCallJSFunction* result = new(zone()) LCallJSFunction(function); | 1083 LCallJSFunction* result = new(zone()) LCallJSFunction(function); |
| 1078 | 1084 |
| 1079 return MarkAsCall(DefineFixed(result, r0), instr); | 1085 return MarkAsCall(DefineFixed(result, r3), instr); |
| 1080 } | 1086 } |
| 1081 | 1087 |
| 1082 | 1088 |
| 1083 LInstruction* LChunkBuilder::DoCallWithDescriptor( | 1089 LInstruction* LChunkBuilder::DoCallWithDescriptor( |
| 1084 HCallWithDescriptor* instr) { | 1090 HCallWithDescriptor* instr) { |
| 1085 const InterfaceDescriptor* descriptor = instr->descriptor(); | 1091 const InterfaceDescriptor* descriptor = instr->descriptor(); |
| 1086 | 1092 |
| 1087 LOperand* target = UseRegisterOrConstantAtStart(instr->target()); | 1093 LOperand* target = UseRegisterOrConstantAtStart(instr->target()); |
| 1088 ZoneList<LOperand*> ops(instr->OperandCount(), zone()); | 1094 ZoneList<LOperand*> ops(instr->OperandCount(), zone()); |
| 1089 ops.Add(target, zone()); | 1095 ops.Add(target, zone()); |
| 1090 for (int i = 1; i < instr->OperandCount(); i++) { | 1096 for (int i = 1; i < instr->OperandCount(); i++) { |
| 1091 LOperand* op = UseFixed(instr->OperandAt(i), | 1097 LOperand* op = UseFixed(instr->OperandAt(i), |
| 1092 descriptor->GetParameterRegister(i - 1)); | 1098 descriptor->GetParameterRegister(i - 1)); |
| 1093 ops.Add(op, zone()); | 1099 ops.Add(op, zone()); |
| 1094 } | 1100 } |
| 1095 | 1101 |
| 1096 LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( | 1102 LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( |
| 1097 descriptor, ops, zone()); | 1103 descriptor, ops, zone()); |
| 1098 return MarkAsCall(DefineFixed(result, r0), instr); | 1104 return MarkAsCall(DefineFixed(result, r3), instr); |
| 1099 } | 1105 } |
| 1100 | 1106 |
| 1101 | 1107 |
| 1102 LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { | 1108 LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { |
| 1103 LOperand* context = UseFixed(instr->context(), cp); | 1109 LOperand* context = UseFixed(instr->context(), cp); |
| 1104 LOperand* function = UseFixed(instr->function(), r1); | 1110 LOperand* function = UseFixed(instr->function(), r4); |
| 1105 LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); | 1111 LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); |
| 1106 return MarkAsCall(DefineFixed(result, r0), instr, CANNOT_DEOPTIMIZE_EAGERLY); | 1112 return MarkAsCall(DefineFixed(result, r3), instr, CANNOT_DEOPTIMIZE_EAGERLY); |
| 1107 } | 1113 } |
| 1108 | 1114 |
| 1109 | 1115 |
| 1110 LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { | 1116 LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { |
| 1111 switch (instr->op()) { | 1117 switch (instr->op()) { |
| 1112 case kMathFloor: | 1118 case kMathFloor: |
| 1113 return DoMathFloor(instr); | 1119 return DoMathFloor(instr); |
| 1114 case kMathRound: | 1120 case kMathRound: |
| 1115 return DoMathRound(instr); | 1121 return DoMathRound(instr); |
| 1116 case kMathFround: | 1122 case kMathFround: |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1166 DefineAsRegister(new(zone()) LMathAbs(context, input)); | 1172 DefineAsRegister(new(zone()) LMathAbs(context, input)); |
| 1167 if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result); | 1173 if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result); |
| 1168 if (!r.IsDouble()) result = AssignEnvironment(result); | 1174 if (!r.IsDouble()) result = AssignEnvironment(result); |
| 1169 return result; | 1175 return result; |
| 1170 } | 1176 } |
| 1171 | 1177 |
| 1172 | 1178 |
| 1173 LInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) { | 1179 LInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) { |
| 1174 DCHECK(instr->representation().IsDouble()); | 1180 DCHECK(instr->representation().IsDouble()); |
| 1175 DCHECK(instr->value()->representation().IsDouble()); | 1181 DCHECK(instr->value()->representation().IsDouble()); |
| 1176 LOperand* input = UseFixedDouble(instr->value(), d0); | 1182 LOperand* input = UseFixedDouble(instr->value(), d1); |
| 1177 return MarkAsCall(DefineFixedDouble(new(zone()) LMathLog(input), d0), instr); | 1183 return MarkAsCall(DefineFixedDouble(new(zone()) LMathLog(input), d1), instr); |
| 1178 } | 1184 } |
| 1179 | 1185 |
| 1180 | 1186 |
| 1181 LInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) { | 1187 LInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) { |
| 1182 LOperand* input = UseRegisterAtStart(instr->value()); | 1188 LOperand* input = UseRegisterAtStart(instr->value()); |
| 1183 LMathClz32* result = new(zone()) LMathClz32(input); | 1189 LMathClz32* result = new(zone()) LMathClz32(input); |
| 1184 return DefineAsRegister(result); | 1190 return DefineAsRegister(result); |
| 1185 } | 1191 } |
| 1186 | 1192 |
| 1187 | 1193 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1206 | 1212 |
| 1207 LInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { | 1213 LInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { |
| 1208 LOperand* input = UseRegisterAtStart(instr->value()); | 1214 LOperand* input = UseRegisterAtStart(instr->value()); |
| 1209 LMathPowHalf* result = new(zone()) LMathPowHalf(input); | 1215 LMathPowHalf* result = new(zone()) LMathPowHalf(input); |
| 1210 return DefineAsRegister(result); | 1216 return DefineAsRegister(result); |
| 1211 } | 1217 } |
| 1212 | 1218 |
| 1213 | 1219 |
| 1214 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { | 1220 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { |
| 1215 LOperand* context = UseFixed(instr->context(), cp); | 1221 LOperand* context = UseFixed(instr->context(), cp); |
| 1216 LOperand* constructor = UseFixed(instr->constructor(), r1); | 1222 LOperand* constructor = UseFixed(instr->constructor(), r4); |
| 1217 LCallNew* result = new(zone()) LCallNew(context, constructor); | 1223 LCallNew* result = new(zone()) LCallNew(context, constructor); |
| 1218 return MarkAsCall(DefineFixed(result, r0), instr); | 1224 return MarkAsCall(DefineFixed(result, r3), instr); |
| 1219 } | 1225 } |
| 1220 | 1226 |
| 1221 | 1227 |
| 1222 LInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { | 1228 LInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { |
| 1223 LOperand* context = UseFixed(instr->context(), cp); | 1229 LOperand* context = UseFixed(instr->context(), cp); |
| 1224 LOperand* constructor = UseFixed(instr->constructor(), r1); | 1230 LOperand* constructor = UseFixed(instr->constructor(), r4); |
| 1225 LCallNewArray* result = new(zone()) LCallNewArray(context, constructor); | 1231 LCallNewArray* result = new(zone()) LCallNewArray(context, constructor); |
| 1226 return MarkAsCall(DefineFixed(result, r0), instr); | 1232 return MarkAsCall(DefineFixed(result, r3), instr); |
| 1227 } | 1233 } |
| 1228 | 1234 |
| 1229 | 1235 |
| 1230 LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { | 1236 LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { |
| 1231 LOperand* context = UseFixed(instr->context(), cp); | 1237 LOperand* context = UseFixed(instr->context(), cp); |
| 1232 LOperand* function = UseFixed(instr->function(), r1); | 1238 LOperand* function = UseFixed(instr->function(), r4); |
| 1233 LCallFunction* call = new(zone()) LCallFunction(context, function); | 1239 LCallFunction* call = new(zone()) LCallFunction(context, function); |
| 1234 return MarkAsCall(DefineFixed(call, r0), instr); | 1240 return MarkAsCall(DefineFixed(call, r3), instr); |
| 1235 } | 1241 } |
| 1236 | 1242 |
| 1237 | 1243 |
| 1238 LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { | 1244 LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { |
| 1239 LOperand* context = UseFixed(instr->context(), cp); | 1245 LOperand* context = UseFixed(instr->context(), cp); |
| 1240 return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), r0), instr); | 1246 return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), r3), instr); |
| 1241 } | 1247 } |
| 1242 | 1248 |
| 1243 | 1249 |
| 1244 LInstruction* LChunkBuilder::DoRor(HRor* instr) { | 1250 LInstruction* LChunkBuilder::DoRor(HRor* instr) { |
| 1245 return DoShift(Token::ROR, instr); | 1251 return DoShift(Token::ROR, instr); |
| 1246 } | 1252 } |
| 1247 | 1253 |
| 1248 | 1254 |
| 1249 LInstruction* LChunkBuilder::DoShr(HShr* instr) { | 1255 LInstruction* LChunkBuilder::DoShr(HShr* instr) { |
| 1250 return DoShift(Token::SHR, instr); | 1256 return DoShift(Token::SHR, instr); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1310 return result; | 1316 return result; |
| 1311 } | 1317 } |
| 1312 | 1318 |
| 1313 | 1319 |
| 1314 LInstruction* LChunkBuilder::DoDivI(HDiv* instr) { | 1320 LInstruction* LChunkBuilder::DoDivI(HDiv* instr) { |
| 1315 DCHECK(instr->representation().IsSmiOrInteger32()); | 1321 DCHECK(instr->representation().IsSmiOrInteger32()); |
| 1316 DCHECK(instr->left()->representation().Equals(instr->representation())); | 1322 DCHECK(instr->left()->representation().Equals(instr->representation())); |
| 1317 DCHECK(instr->right()->representation().Equals(instr->representation())); | 1323 DCHECK(instr->right()->representation().Equals(instr->representation())); |
| 1318 LOperand* dividend = UseRegister(instr->left()); | 1324 LOperand* dividend = UseRegister(instr->left()); |
| 1319 LOperand* divisor = UseRegister(instr->right()); | 1325 LOperand* divisor = UseRegister(instr->right()); |
| 1320 LOperand* temp = | |
| 1321 CpuFeatures::IsSupported(SUDIV) ? NULL : TempDoubleRegister(); | |
| 1322 LInstruction* result = | 1326 LInstruction* result = |
| 1323 DefineAsRegister(new(zone()) LDivI(dividend, divisor, temp)); | 1327 DefineAsRegister(new(zone()) LDivI(dividend, divisor)); |
| 1324 if (instr->CheckFlag(HValue::kCanBeDivByZero) || | 1328 if (instr->CheckFlag(HValue::kCanBeDivByZero) || |
| 1325 instr->CheckFlag(HValue::kBailoutOnMinusZero) || | 1329 instr->CheckFlag(HValue::kBailoutOnMinusZero) || |
| 1326 (instr->CheckFlag(HValue::kCanOverflow) && | 1330 (instr->CheckFlag(HValue::kCanOverflow) && |
| 1327 (!CpuFeatures::IsSupported(SUDIV) || | 1331 !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) || |
| 1328 !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) || | |
| 1329 (!instr->IsMathFloorOfDiv() && | 1332 (!instr->IsMathFloorOfDiv() && |
| 1330 !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) { | 1333 !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) { |
| 1331 result = AssignEnvironment(result); | 1334 result = AssignEnvironment(result); |
| 1332 } | 1335 } |
| 1333 return result; | 1336 return result; |
| 1334 } | 1337 } |
| 1335 | 1338 |
| 1336 | 1339 |
| 1337 LInstruction* LChunkBuilder::DoDiv(HDiv* instr) { | 1340 LInstruction* LChunkBuilder::DoDiv(HDiv* instr) { |
| 1338 if (instr->representation().IsSmiOrInteger32()) { | 1341 if (instr->representation().IsSmiOrInteger32()) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1383 return result; | 1386 return result; |
| 1384 } | 1387 } |
| 1385 | 1388 |
| 1386 | 1389 |
| 1387 LInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { | 1390 LInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { |
| 1388 DCHECK(instr->representation().IsSmiOrInteger32()); | 1391 DCHECK(instr->representation().IsSmiOrInteger32()); |
| 1389 DCHECK(instr->left()->representation().Equals(instr->representation())); | 1392 DCHECK(instr->left()->representation().Equals(instr->representation())); |
| 1390 DCHECK(instr->right()->representation().Equals(instr->representation())); | 1393 DCHECK(instr->right()->representation().Equals(instr->representation())); |
| 1391 LOperand* dividend = UseRegister(instr->left()); | 1394 LOperand* dividend = UseRegister(instr->left()); |
| 1392 LOperand* divisor = UseRegister(instr->right()); | 1395 LOperand* divisor = UseRegister(instr->right()); |
| 1393 LOperand* temp = | 1396 LFlooringDivI* div = new(zone()) LFlooringDivI(dividend, divisor); |
| 1394 CpuFeatures::IsSupported(SUDIV) ? NULL : TempDoubleRegister(); | |
| 1395 LFlooringDivI* div = new(zone()) LFlooringDivI(dividend, divisor, temp); | |
| 1396 return AssignEnvironment(DefineAsRegister(div)); | 1397 return AssignEnvironment(DefineAsRegister(div)); |
| 1397 } | 1398 } |
| 1398 | 1399 |
| 1399 | 1400 |
| 1400 LInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { | 1401 LInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { |
| 1401 if (instr->RightIsPowerOf2()) { | 1402 if (instr->RightIsPowerOf2()) { |
| 1402 return DoFlooringDivByPowerOf2I(instr); | 1403 return DoFlooringDivByPowerOf2I(instr); |
| 1403 } else if (instr->right()->IsConstant()) { | 1404 } else if (instr->right()->IsConstant()) { |
| 1404 return DoFlooringDivByConstI(instr); | 1405 return DoFlooringDivByConstI(instr); |
| 1405 } else { | 1406 } else { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1438 return result; | 1439 return result; |
| 1439 } | 1440 } |
| 1440 | 1441 |
| 1441 | 1442 |
| 1442 LInstruction* LChunkBuilder::DoModI(HMod* instr) { | 1443 LInstruction* LChunkBuilder::DoModI(HMod* instr) { |
| 1443 DCHECK(instr->representation().IsSmiOrInteger32()); | 1444 DCHECK(instr->representation().IsSmiOrInteger32()); |
| 1444 DCHECK(instr->left()->representation().Equals(instr->representation())); | 1445 DCHECK(instr->left()->representation().Equals(instr->representation())); |
| 1445 DCHECK(instr->right()->representation().Equals(instr->representation())); | 1446 DCHECK(instr->right()->representation().Equals(instr->representation())); |
| 1446 LOperand* dividend = UseRegister(instr->left()); | 1447 LOperand* dividend = UseRegister(instr->left()); |
| 1447 LOperand* divisor = UseRegister(instr->right()); | 1448 LOperand* divisor = UseRegister(instr->right()); |
| 1448 LOperand* temp = | |
| 1449 CpuFeatures::IsSupported(SUDIV) ? NULL : TempDoubleRegister(); | |
| 1450 LOperand* temp2 = | |
| 1451 CpuFeatures::IsSupported(SUDIV) ? NULL : TempDoubleRegister(); | |
| 1452 LInstruction* result = DefineAsRegister(new(zone()) LModI( | 1449 LInstruction* result = DefineAsRegister(new(zone()) LModI( |
| 1453 dividend, divisor, temp, temp2)); | 1450 dividend, divisor)); |
| 1454 if (instr->CheckFlag(HValue::kCanBeDivByZero) || | 1451 if (instr->CheckFlag(HValue::kCanBeDivByZero) || |
| 1455 instr->CheckFlag(HValue::kBailoutOnMinusZero)) { | 1452 instr->CheckFlag(HValue::kBailoutOnMinusZero)) { |
| 1456 result = AssignEnvironment(result); | 1453 result = AssignEnvironment(result); |
| 1457 } | 1454 } |
| 1458 return result; | 1455 return result; |
| 1459 } | 1456 } |
| 1460 | 1457 |
| 1461 | 1458 |
| 1462 LInstruction* LChunkBuilder::DoMod(HMod* instr) { | 1459 LInstruction* LChunkBuilder::DoMod(HMod* instr) { |
| 1463 if (instr->representation().IsSmiOrInteger32()) { | 1460 if (instr->representation().IsSmiOrInteger32()) { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1520 } else if (instr->representation().IsDouble()) { | 1517 } else if (instr->representation().IsDouble()) { |
| 1521 if (instr->HasOneUse() && (instr->uses().value()->IsAdd() || | 1518 if (instr->HasOneUse() && (instr->uses().value()->IsAdd() || |
| 1522 instr->uses().value()->IsSub())) { | 1519 instr->uses().value()->IsSub())) { |
| 1523 HBinaryOperation* use = HBinaryOperation::cast(instr->uses().value()); | 1520 HBinaryOperation* use = HBinaryOperation::cast(instr->uses().value()); |
| 1524 | 1521 |
| 1525 if (use->IsAdd() && instr == use->left()) { | 1522 if (use->IsAdd() && instr == use->left()) { |
| 1526 // This mul is the lhs of an add. The add and mul will be folded into a | 1523 // This mul is the lhs of an add. The add and mul will be folded into a |
| 1527 // multiply-add in DoAdd. | 1524 // multiply-add in DoAdd. |
| 1528 return NULL; | 1525 return NULL; |
| 1529 } | 1526 } |
| 1530 if (instr == use->right() && use->IsAdd() && !use->left()->IsMul()) { | 1527 if (instr == use->right() && use->IsAdd() && |
| 1528 !(use->left()->IsMul() && use->left()->HasOneUse())) { |
| 1531 // This mul is the rhs of an add, where the lhs is not another mul. | 1529 // This mul is the rhs of an add, where the lhs is not another mul. |
| 1532 // The add and mul will be folded into a multiply-add in DoAdd. | 1530 // The add and mul will be folded into a multiply-add in DoAdd. |
| 1533 return NULL; | 1531 return NULL; |
| 1534 } | 1532 } |
| 1535 if (instr == use->right() && use->IsSub()) { | 1533 if (instr == use->left() && use->IsSub()) { |
| 1536 // This mul is the rhs of a sub. The sub and mul will be folded into a | 1534 // This mul is the lhs of a sub. The mul and sub will be folded into a |
| 1537 // multiply-sub in DoSub. | 1535 // multiply-sub in DoSub. |
| 1538 return NULL; | 1536 return NULL; |
| 1539 } | 1537 } |
| 1540 } | 1538 } |
| 1541 | 1539 |
| 1542 return DoArithmeticD(Token::MUL, instr); | 1540 return DoArithmeticD(Token::MUL, instr); |
| 1543 } else { | 1541 } else { |
| 1544 return DoArithmeticT(Token::MUL, instr); | 1542 return DoArithmeticT(Token::MUL, instr); |
| 1545 } | 1543 } |
| 1546 } | 1544 } |
| 1547 | 1545 |
| 1548 | 1546 |
| 1549 LInstruction* LChunkBuilder::DoSub(HSub* instr) { | 1547 LInstruction* LChunkBuilder::DoSub(HSub* instr) { |
| 1550 if (instr->representation().IsSmiOrInteger32()) { | 1548 if (instr->representation().IsSmiOrInteger32()) { |
| 1551 DCHECK(instr->left()->representation().Equals(instr->representation())); | 1549 DCHECK(instr->left()->representation().Equals(instr->representation())); |
| 1552 DCHECK(instr->right()->representation().Equals(instr->representation())); | 1550 DCHECK(instr->right()->representation().Equals(instr->representation())); |
| 1553 | 1551 |
| 1554 if (instr->left()->IsConstant()) { | 1552 if (instr->left()->IsConstant() && |
| 1553 !instr->CheckFlag(HValue::kCanOverflow)) { |
| 1555 // If lhs is constant, do reverse subtraction instead. | 1554 // If lhs is constant, do reverse subtraction instead. |
| 1556 return DoRSub(instr); | 1555 return DoRSub(instr); |
| 1557 } | 1556 } |
| 1558 | 1557 |
| 1559 LOperand* left = UseRegisterAtStart(instr->left()); | 1558 LOperand* left = UseRegisterAtStart(instr->left()); |
| 1560 LOperand* right = UseOrConstantAtStart(instr->right()); | 1559 LOperand* right = UseOrConstantAtStart(instr->right()); |
| 1561 LSubI* sub = new(zone()) LSubI(left, right); | 1560 LSubI* sub = new(zone()) LSubI(left, right); |
| 1562 LInstruction* result = DefineAsRegister(sub); | 1561 LInstruction* result = DefineAsRegister(sub); |
| 1563 if (instr->CheckFlag(HValue::kCanOverflow)) { | 1562 if (instr->CheckFlag(HValue::kCanOverflow)) { |
| 1564 result = AssignEnvironment(result); | 1563 result = AssignEnvironment(result); |
| 1565 } | 1564 } |
| 1566 return result; | 1565 return result; |
| 1567 } else if (instr->representation().IsDouble()) { | 1566 } else if (instr->representation().IsDouble()) { |
| 1568 if (instr->right()->IsMul() && instr->right()->HasOneUse()) { | 1567 if (instr->left()->IsMul() && instr->left()->HasOneUse()) { |
| 1569 return DoMultiplySub(instr->left(), HMul::cast(instr->right())); | 1568 return DoMultiplySub(instr->right(), HMul::cast(instr->left())); |
| 1570 } | 1569 } |
| 1571 | 1570 |
| 1572 return DoArithmeticD(Token::SUB, instr); | 1571 return DoArithmeticD(Token::SUB, instr); |
| 1573 } else { | 1572 } else { |
| 1574 return DoArithmeticT(Token::SUB, instr); | 1573 return DoArithmeticT(Token::SUB, instr); |
| 1575 } | 1574 } |
| 1576 } | 1575 } |
| 1577 | 1576 |
| 1578 | 1577 |
| 1579 LInstruction* LChunkBuilder::DoRSub(HSub* instr) { | 1578 LInstruction* LChunkBuilder::DoRSub(HSub* instr) { |
| 1580 DCHECK(instr->representation().IsSmiOrInteger32()); | 1579 DCHECK(instr->representation().IsSmiOrInteger32()); |
| 1581 DCHECK(instr->left()->representation().Equals(instr->representation())); | 1580 DCHECK(instr->left()->representation().Equals(instr->representation())); |
| 1582 DCHECK(instr->right()->representation().Equals(instr->representation())); | 1581 DCHECK(instr->right()->representation().Equals(instr->representation())); |
| 1582 DCHECK(!instr->CheckFlag(HValue::kCanOverflow)); |
| 1583 | 1583 |
| 1584 // Note: The lhs of the subtraction becomes the rhs of the | 1584 // Note: The lhs of the subtraction becomes the rhs of the |
| 1585 // reverse-subtraction. | 1585 // reverse-subtraction. |
| 1586 LOperand* left = UseRegisterAtStart(instr->right()); | 1586 LOperand* left = UseRegisterAtStart(instr->right()); |
| 1587 LOperand* right = UseOrConstantAtStart(instr->left()); | 1587 LOperand* right = UseOrConstantAtStart(instr->left()); |
| 1588 LRSubI* rsb = new(zone()) LRSubI(left, right); | 1588 LRSubI* rsb = new(zone()) LRSubI(left, right); |
| 1589 LInstruction* result = DefineAsRegister(rsb); | 1589 LInstruction* result = DefineAsRegister(rsb); |
| 1590 if (instr->CheckFlag(HValue::kCanOverflow)) { | |
| 1591 result = AssignEnvironment(result); | |
| 1592 } | |
| 1593 return result; | 1590 return result; |
| 1594 } | 1591 } |
| 1595 | 1592 |
| 1596 | 1593 |
| 1597 LInstruction* LChunkBuilder::DoMultiplyAdd(HMul* mul, HValue* addend) { | 1594 LInstruction* LChunkBuilder::DoMultiplyAdd(HMul* mul, HValue* addend) { |
| 1598 LOperand* multiplier_op = UseRegisterAtStart(mul->left()); | 1595 LOperand* multiplier_op = UseRegisterAtStart(mul->left()); |
| 1599 LOperand* multiplicand_op = UseRegisterAtStart(mul->right()); | 1596 LOperand* multiplicand_op = UseRegisterAtStart(mul->right()); |
| 1600 LOperand* addend_op = UseRegisterAtStart(addend); | 1597 LOperand* addend_op = UseRegisterAtStart(addend); |
| 1601 return DefineSameAsFirst(new(zone()) LMultiplyAddD(addend_op, multiplier_op, | 1598 return DefineSameAsFirst(new(zone()) LMultiplyAddD(addend_op, multiplier_op, |
| 1602 multiplicand_op)); | 1599 multiplicand_op)); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1670 return DefineAsRegister(new(zone()) LMathMinMax(left, right)); | 1667 return DefineAsRegister(new(zone()) LMathMinMax(left, right)); |
| 1671 } | 1668 } |
| 1672 | 1669 |
| 1673 | 1670 |
| 1674 LInstruction* LChunkBuilder::DoPower(HPower* instr) { | 1671 LInstruction* LChunkBuilder::DoPower(HPower* instr) { |
| 1675 DCHECK(instr->representation().IsDouble()); | 1672 DCHECK(instr->representation().IsDouble()); |
| 1676 // We call a C function for double power. It can't trigger a GC. | 1673 // We call a C function for double power. It can't trigger a GC. |
| 1677 // We need to use fixed result register for the call. | 1674 // We need to use fixed result register for the call. |
| 1678 Representation exponent_type = instr->right()->representation(); | 1675 Representation exponent_type = instr->right()->representation(); |
| 1679 DCHECK(instr->left()->representation().IsDouble()); | 1676 DCHECK(instr->left()->representation().IsDouble()); |
| 1680 LOperand* left = UseFixedDouble(instr->left(), d0); | 1677 LOperand* left = UseFixedDouble(instr->left(), d1); |
| 1681 LOperand* right = exponent_type.IsDouble() ? | 1678 LOperand* right = exponent_type.IsDouble() ? |
| 1682 UseFixedDouble(instr->right(), d1) : | 1679 UseFixedDouble(instr->right(), d2) : |
| 1683 UseFixed(instr->right(), r2); | 1680 UseFixed(instr->right(), r5); |
| 1684 LPower* result = new(zone()) LPower(left, right); | 1681 LPower* result = new(zone()) LPower(left, right); |
| 1685 return MarkAsCall(DefineFixedDouble(result, d2), | 1682 return MarkAsCall(DefineFixedDouble(result, d3), |
| 1686 instr, | 1683 instr, |
| 1687 CAN_DEOPTIMIZE_EAGERLY); | 1684 CAN_DEOPTIMIZE_EAGERLY); |
| 1688 } | 1685 } |
| 1689 | 1686 |
| 1690 | 1687 |
| 1691 LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { | 1688 LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { |
| 1692 DCHECK(instr->left()->representation().IsTagged()); | 1689 DCHECK(instr->left()->representation().IsTagged()); |
| 1693 DCHECK(instr->right()->representation().IsTagged()); | 1690 DCHECK(instr->right()->representation().IsTagged()); |
| 1694 LOperand* context = UseFixed(instr->context(), cp); | 1691 LOperand* context = UseFixed(instr->context(), cp); |
| 1695 LOperand* left = UseFixed(instr->left(), r1); | 1692 LOperand* left = UseFixed(instr->left(), r4); |
| 1696 LOperand* right = UseFixed(instr->right(), r0); | 1693 LOperand* right = UseFixed(instr->right(), r3); |
| 1697 LCmpT* result = new(zone()) LCmpT(context, left, right); | 1694 LCmpT* result = new(zone()) LCmpT(context, left, right); |
| 1698 return MarkAsCall(DefineFixed(result, r0), instr); | 1695 return MarkAsCall(DefineFixed(result, r3), instr); |
| 1699 } | 1696 } |
| 1700 | 1697 |
| 1701 | 1698 |
| 1702 LInstruction* LChunkBuilder::DoCompareNumericAndBranch( | 1699 LInstruction* LChunkBuilder::DoCompareNumericAndBranch( |
| 1703 HCompareNumericAndBranch* instr) { | 1700 HCompareNumericAndBranch* instr) { |
| 1704 Representation r = instr->representation(); | 1701 Representation r = instr->representation(); |
| 1705 if (r.IsSmiOrInteger32()) { | 1702 if (r.IsSmiOrInteger32()) { |
| 1706 DCHECK(instr->left()->representation().Equals(r)); | 1703 DCHECK(instr->left()->representation().Equals(r)); |
| 1707 DCHECK(instr->right()->representation().Equals(r)); | 1704 DCHECK(instr->right()->representation().Equals(r)); |
| 1708 LOperand* left = UseRegisterOrConstantAtStart(instr->left()); | 1705 LOperand* left = UseRegisterOrConstantAtStart(instr->left()); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1770 LOperand* value = UseRegisterAtStart(instr->value()); | 1767 LOperand* value = UseRegisterAtStart(instr->value()); |
| 1771 return new(zone()) LIsUndetectableAndBranch(value, TempRegister()); | 1768 return new(zone()) LIsUndetectableAndBranch(value, TempRegister()); |
| 1772 } | 1769 } |
| 1773 | 1770 |
| 1774 | 1771 |
| 1775 LInstruction* LChunkBuilder::DoStringCompareAndBranch( | 1772 LInstruction* LChunkBuilder::DoStringCompareAndBranch( |
| 1776 HStringCompareAndBranch* instr) { | 1773 HStringCompareAndBranch* instr) { |
| 1777 DCHECK(instr->left()->representation().IsTagged()); | 1774 DCHECK(instr->left()->representation().IsTagged()); |
| 1778 DCHECK(instr->right()->representation().IsTagged()); | 1775 DCHECK(instr->right()->representation().IsTagged()); |
| 1779 LOperand* context = UseFixed(instr->context(), cp); | 1776 LOperand* context = UseFixed(instr->context(), cp); |
| 1780 LOperand* left = UseFixed(instr->left(), r1); | 1777 LOperand* left = UseFixed(instr->left(), r4); |
| 1781 LOperand* right = UseFixed(instr->right(), r0); | 1778 LOperand* right = UseFixed(instr->right(), r3); |
| 1782 LStringCompareAndBranch* result = | 1779 LStringCompareAndBranch* result = |
| 1783 new(zone()) LStringCompareAndBranch(context, left, right); | 1780 new(zone()) LStringCompareAndBranch(context, left, right); |
| 1784 return MarkAsCall(result, instr); | 1781 return MarkAsCall(result, instr); |
| 1785 } | 1782 } |
| 1786 | 1783 |
| 1787 | 1784 |
| 1788 LInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( | 1785 LInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( |
| 1789 HHasInstanceTypeAndBranch* instr) { | 1786 HHasInstanceTypeAndBranch* instr) { |
| 1790 DCHECK(instr->value()->representation().IsTagged()); | 1787 DCHECK(instr->value()->representation().IsTagged()); |
| 1791 LOperand* value = UseRegisterAtStart(instr->value()); | 1788 LOperand* value = UseRegisterAtStart(instr->value()); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1818 } | 1815 } |
| 1819 | 1816 |
| 1820 | 1817 |
| 1821 LInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) { | 1818 LInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) { |
| 1822 LOperand* map = UseRegisterAtStart(instr->value()); | 1819 LOperand* map = UseRegisterAtStart(instr->value()); |
| 1823 return DefineAsRegister(new(zone()) LMapEnumLength(map)); | 1820 return DefineAsRegister(new(zone()) LMapEnumLength(map)); |
| 1824 } | 1821 } |
| 1825 | 1822 |
| 1826 | 1823 |
| 1827 LInstruction* LChunkBuilder::DoDateField(HDateField* instr) { | 1824 LInstruction* LChunkBuilder::DoDateField(HDateField* instr) { |
| 1828 LOperand* object = UseFixed(instr->value(), r0); | 1825 LOperand* object = UseFixed(instr->value(), r3); |
| 1829 LDateField* result = | 1826 LDateField* result = |
| 1830 new(zone()) LDateField(object, FixedTemp(r1), instr->index()); | 1827 new(zone()) LDateField(object, FixedTemp(r4), instr->index()); |
| 1831 return MarkAsCall(DefineFixed(result, r0), instr, CAN_DEOPTIMIZE_EAGERLY); | 1828 return MarkAsCall(DefineFixed(result, r3), instr, CAN_DEOPTIMIZE_EAGERLY); |
| 1832 } | 1829 } |
| 1833 | 1830 |
| 1834 | 1831 |
| 1835 LInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) { | 1832 LInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) { |
| 1836 LOperand* string = UseRegisterAtStart(instr->string()); | 1833 LOperand* string = UseRegisterAtStart(instr->string()); |
| 1837 LOperand* index = UseRegisterOrConstantAtStart(instr->index()); | 1834 LOperand* index = UseRegisterOrConstantAtStart(instr->index()); |
| 1838 return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index)); | 1835 return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index)); |
| 1839 } | 1836 } |
| 1840 | 1837 |
| 1841 | 1838 |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2033 LInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { | 2030 LInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { |
| 2034 HValue* value = instr->value(); | 2031 HValue* value = instr->value(); |
| 2035 Representation input_rep = value->representation(); | 2032 Representation input_rep = value->representation(); |
| 2036 LOperand* reg = UseRegister(value); | 2033 LOperand* reg = UseRegister(value); |
| 2037 if (input_rep.IsDouble()) { | 2034 if (input_rep.IsDouble()) { |
| 2038 return DefineAsRegister(new(zone()) LClampDToUint8(reg)); | 2035 return DefineAsRegister(new(zone()) LClampDToUint8(reg)); |
| 2039 } else if (input_rep.IsInteger32()) { | 2036 } else if (input_rep.IsInteger32()) { |
| 2040 return DefineAsRegister(new(zone()) LClampIToUint8(reg)); | 2037 return DefineAsRegister(new(zone()) LClampIToUint8(reg)); |
| 2041 } else { | 2038 } else { |
| 2042 DCHECK(input_rep.IsSmiOrTagged()); | 2039 DCHECK(input_rep.IsSmiOrTagged()); |
| 2043 // Register allocator doesn't (yet) support allocation of double | |
| 2044 // temps. Reserve d1 explicitly. | |
| 2045 LClampTToUint8* result = | 2040 LClampTToUint8* result = |
| 2046 new(zone()) LClampTToUint8(reg, TempDoubleRegister()); | 2041 new(zone()) LClampTToUint8(reg, TempDoubleRegister()); |
| 2047 return AssignEnvironment(DefineAsRegister(result)); | 2042 return AssignEnvironment(DefineAsRegister(result)); |
| 2048 } | 2043 } |
| 2049 } | 2044 } |
| 2050 | 2045 |
| 2051 | 2046 |
| 2052 LInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) { | 2047 LInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) { |
| 2053 HValue* value = instr->value(); | 2048 HValue* value = instr->value(); |
| 2054 DCHECK(value->representation().IsDouble()); | 2049 DCHECK(value->representation().IsDouble()); |
| 2055 return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value))); | 2050 return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value))); |
| 2056 } | 2051 } |
| 2057 | 2052 |
| 2058 | 2053 |
| 2059 LInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) { | 2054 LInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) { |
| 2060 LOperand* lo = UseRegister(instr->lo()); | 2055 LOperand* lo = UseRegister(instr->lo()); |
| 2061 LOperand* hi = UseRegister(instr->hi()); | 2056 LOperand* hi = UseRegister(instr->hi()); |
| 2062 return DefineAsRegister(new(zone()) LConstructDouble(hi, lo)); | 2057 return DefineAsRegister(new(zone()) LConstructDouble(hi, lo)); |
| 2063 } | 2058 } |
| 2064 | 2059 |
| 2065 | 2060 |
| 2066 LInstruction* LChunkBuilder::DoReturn(HReturn* instr) { | 2061 LInstruction* LChunkBuilder::DoReturn(HReturn* instr) { |
| 2067 LOperand* context = info()->IsStub() | 2062 LOperand* context = info()->IsStub() |
| 2068 ? UseFixed(instr->context(), cp) | 2063 ? UseFixed(instr->context(), cp) |
| 2069 : NULL; | 2064 : NULL; |
| 2070 LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count()); | 2065 LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count()); |
| 2071 return new(zone()) LReturn(UseFixed(instr->value(), r0), context, | 2066 return new(zone()) LReturn(UseFixed(instr->value(), r3), context, |
| 2072 parameter_count); | 2067 parameter_count); |
| 2073 } | 2068 } |
| 2074 | 2069 |
| 2075 | 2070 |
| 2076 LInstruction* LChunkBuilder::DoConstant(HConstant* instr) { | 2071 LInstruction* LChunkBuilder::DoConstant(HConstant* instr) { |
| 2077 Representation r = instr->representation(); | 2072 Representation r = instr->representation(); |
| 2078 if (r.IsSmi()) { | 2073 if (r.IsSmi()) { |
| 2079 return DefineAsRegister(new(zone()) LConstantS); | 2074 return DefineAsRegister(new(zone()) LConstantS); |
| 2080 } else if (r.IsInteger32()) { | 2075 } else if (r.IsInteger32()) { |
| 2081 return DefineAsRegister(new(zone()) LConstantI); | 2076 return DefineAsRegister(new(zone()) LConstantI); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2103 LInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { | 2098 LInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { |
| 2104 LOperand* context = UseFixed(instr->context(), cp); | 2099 LOperand* context = UseFixed(instr->context(), cp); |
| 2105 LOperand* global_object = UseFixed(instr->global_object(), | 2100 LOperand* global_object = UseFixed(instr->global_object(), |
| 2106 LoadIC::ReceiverRegister()); | 2101 LoadIC::ReceiverRegister()); |
| 2107 LOperand* vector = NULL; | 2102 LOperand* vector = NULL; |
| 2108 if (FLAG_vector_ics) { | 2103 if (FLAG_vector_ics) { |
| 2109 vector = FixedTemp(LoadIC::VectorRegister()); | 2104 vector = FixedTemp(LoadIC::VectorRegister()); |
| 2110 } | 2105 } |
| 2111 LLoadGlobalGeneric* result = | 2106 LLoadGlobalGeneric* result = |
| 2112 new(zone()) LLoadGlobalGeneric(context, global_object, vector); | 2107 new(zone()) LLoadGlobalGeneric(context, global_object, vector); |
| 2113 return MarkAsCall(DefineFixed(result, r0), instr); | 2108 return MarkAsCall(DefineFixed(result, r3), instr); |
| 2114 } | 2109 } |
| 2115 | 2110 |
| 2116 | 2111 |
| 2117 LInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) { | 2112 LInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) { |
| 2118 LOperand* value = UseRegister(instr->value()); | 2113 LOperand* value = UseRegister(instr->value()); |
| 2119 // Use a temp to check the value in the cell in the case where we perform | 2114 // Use a temp to check the value in the cell in the case where we perform |
| 2120 // a hole check. | 2115 // a hole check. |
| 2121 return instr->RequiresHoleCheck() | 2116 return instr->RequiresHoleCheck() |
| 2122 ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister())) | 2117 ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister())) |
| 2123 : new(zone()) LStoreGlobalCell(value, NULL); | 2118 : new(zone()) LStoreGlobalCell(value, NULL); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2161 | 2156 |
| 2162 LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { | 2157 LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { |
| 2163 LOperand* context = UseFixed(instr->context(), cp); | 2158 LOperand* context = UseFixed(instr->context(), cp); |
| 2164 LOperand* object = UseFixed(instr->object(), LoadIC::ReceiverRegister()); | 2159 LOperand* object = UseFixed(instr->object(), LoadIC::ReceiverRegister()); |
| 2165 LOperand* vector = NULL; | 2160 LOperand* vector = NULL; |
| 2166 if (FLAG_vector_ics) { | 2161 if (FLAG_vector_ics) { |
| 2167 vector = FixedTemp(LoadIC::VectorRegister()); | 2162 vector = FixedTemp(LoadIC::VectorRegister()); |
| 2168 } | 2163 } |
| 2169 | 2164 |
| 2170 LInstruction* result = | 2165 LInstruction* result = |
| 2171 DefineFixed(new(zone()) LLoadNamedGeneric(context, object, vector), r0); | 2166 DefineFixed(new(zone()) LLoadNamedGeneric(context, object, vector), r3); |
| 2172 return MarkAsCall(result, instr); | 2167 return MarkAsCall(result, instr); |
| 2173 } | 2168 } |
| 2174 | 2169 |
| 2175 | 2170 |
| 2176 LInstruction* LChunkBuilder::DoLoadFunctionPrototype( | 2171 LInstruction* LChunkBuilder::DoLoadFunctionPrototype( |
| 2177 HLoadFunctionPrototype* instr) { | 2172 HLoadFunctionPrototype* instr) { |
| 2178 return AssignEnvironment(DefineAsRegister( | 2173 return AssignEnvironment(DefineAsRegister( |
| 2179 new(zone()) LLoadFunctionPrototype(UseRegister(instr->function())))); | 2174 new(zone()) LLoadFunctionPrototype(UseRegister(instr->function())))); |
| 2180 } | 2175 } |
| 2181 | 2176 |
| 2182 | 2177 |
| 2183 LInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { | 2178 LInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { |
| 2184 return DefineAsRegister(new(zone()) LLoadRoot); | 2179 return DefineAsRegister(new(zone()) LLoadRoot); |
| 2185 } | 2180 } |
| 2186 | 2181 |
| 2187 | 2182 |
| 2188 LInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { | 2183 LInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { |
| 2189 DCHECK(instr->key()->representation().IsSmiOrInteger32()); | 2184 DCHECK(instr->key()->representation().IsSmiOrInteger32()); |
| 2190 ElementsKind elements_kind = instr->elements_kind(); | 2185 ElementsKind elements_kind = instr->elements_kind(); |
| 2191 LOperand* key = UseRegisterOrConstantAtStart(instr->key()); | 2186 LOperand* key = UseRegisterOrConstantAtStart(instr->key()); |
| 2192 LInstruction* result = NULL; | 2187 LInstruction* result = NULL; |
| 2193 | 2188 |
| 2194 if (!instr->is_typed_elements()) { | 2189 if (!instr->is_typed_elements()) { |
| 2195 LOperand* obj = NULL; | 2190 LOperand* obj = NULL; |
| 2196 if (instr->representation().IsDouble()) { | 2191 if (instr->representation().IsDouble()) { |
| 2197 obj = UseRegister(instr->elements()); | 2192 obj = UseRegister(instr->elements()); |
| 2198 } else { | 2193 } else { |
| 2199 DCHECK(instr->representation().IsSmiOrTagged()); | |
| 2200 obj = UseRegisterAtStart(instr->elements()); | 2194 obj = UseRegisterAtStart(instr->elements()); |
| 2201 } | 2195 } |
| 2202 result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key)); | 2196 result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key)); |
| 2203 } else { | 2197 } else { |
| 2204 DCHECK( | 2198 DCHECK( |
| 2205 (instr->representation().IsInteger32() && | 2199 (instr->representation().IsInteger32() && |
| 2206 !IsDoubleOrFloatElementsKind(elements_kind)) || | 2200 !IsDoubleOrFloatElementsKind(elements_kind)) || |
| 2207 (instr->representation().IsDouble() && | 2201 (instr->representation().IsDouble() && |
| 2208 IsDoubleOrFloatElementsKind(elements_kind))); | 2202 IsDoubleOrFloatElementsKind(elements_kind))); |
| 2209 LOperand* backing_store = UseRegister(instr->elements()); | 2203 LOperand* backing_store = UseRegister(instr->elements()); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2228 LOperand* context = UseFixed(instr->context(), cp); | 2222 LOperand* context = UseFixed(instr->context(), cp); |
| 2229 LOperand* object = UseFixed(instr->object(), LoadIC::ReceiverRegister()); | 2223 LOperand* object = UseFixed(instr->object(), LoadIC::ReceiverRegister()); |
| 2230 LOperand* key = UseFixed(instr->key(), LoadIC::NameRegister()); | 2224 LOperand* key = UseFixed(instr->key(), LoadIC::NameRegister()); |
| 2231 LOperand* vector = NULL; | 2225 LOperand* vector = NULL; |
| 2232 if (FLAG_vector_ics) { | 2226 if (FLAG_vector_ics) { |
| 2233 vector = FixedTemp(LoadIC::VectorRegister()); | 2227 vector = FixedTemp(LoadIC::VectorRegister()); |
| 2234 } | 2228 } |
| 2235 | 2229 |
| 2236 LInstruction* result = | 2230 LInstruction* result = |
| 2237 DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key, vector), | 2231 DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key, vector), |
| 2238 r0); | 2232 r3); |
| 2239 return MarkAsCall(result, instr); | 2233 return MarkAsCall(result, instr); |
| 2240 } | 2234 } |
| 2241 | 2235 |
| 2242 | 2236 |
| 2243 LInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { | 2237 LInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { |
| 2244 if (!instr->is_typed_elements()) { | 2238 if (!instr->is_typed_elements()) { |
| 2245 DCHECK(instr->elements()->representation().IsTagged()); | 2239 DCHECK(instr->elements()->representation().IsTagged()); |
| 2246 bool needs_write_barrier = instr->NeedsWriteBarrier(); | 2240 bool needs_write_barrier = instr->NeedsWriteBarrier(); |
| 2247 LOperand* object = NULL; | 2241 LOperand* object = NULL; |
| 2248 LOperand* key = NULL; | 2242 LOperand* key = NULL; |
| 2249 LOperand* val = NULL; | 2243 LOperand* val = NULL; |
| 2250 | 2244 |
| 2251 if (instr->value()->representation().IsDouble()) { | 2245 if (instr->value()->representation().IsDouble()) { |
| 2252 object = UseRegisterAtStart(instr->elements()); | 2246 object = UseRegisterAtStart(instr->elements()); |
| 2253 val = UseRegister(instr->value()); | 2247 val = UseRegister(instr->value()); |
| 2254 key = UseRegisterOrConstantAtStart(instr->key()); | 2248 key = UseRegisterOrConstantAtStart(instr->key()); |
| 2255 } else { | 2249 } else { |
| 2256 DCHECK(instr->value()->representation().IsSmiOrTagged()); | |
| 2257 if (needs_write_barrier) { | 2250 if (needs_write_barrier) { |
| 2258 object = UseTempRegister(instr->elements()); | 2251 object = UseTempRegister(instr->elements()); |
| 2259 val = UseTempRegister(instr->value()); | 2252 val = UseTempRegister(instr->value()); |
| 2260 key = UseTempRegister(instr->key()); | 2253 key = UseTempRegister(instr->key()); |
| 2261 } else { | 2254 } else { |
| 2262 object = UseRegisterAtStart(instr->elements()); | 2255 object = UseRegisterAtStart(instr->elements()); |
| 2263 val = UseRegisterAtStart(instr->value()); | 2256 val = UseRegisterAtStart(instr->value()); |
| 2264 key = UseRegisterOrConstantAtStart(instr->key()); | 2257 key = UseRegisterOrConstantAtStart(instr->key()); |
| 2265 } | 2258 } |
| 2266 } | 2259 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2301 | 2294 |
| 2302 LInstruction* LChunkBuilder::DoTransitionElementsKind( | 2295 LInstruction* LChunkBuilder::DoTransitionElementsKind( |
| 2303 HTransitionElementsKind* instr) { | 2296 HTransitionElementsKind* instr) { |
| 2304 if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { | 2297 if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { |
| 2305 LOperand* object = UseRegister(instr->object()); | 2298 LOperand* object = UseRegister(instr->object()); |
| 2306 LOperand* new_map_reg = TempRegister(); | 2299 LOperand* new_map_reg = TempRegister(); |
| 2307 LTransitionElementsKind* result = | 2300 LTransitionElementsKind* result = |
| 2308 new(zone()) LTransitionElementsKind(object, NULL, new_map_reg); | 2301 new(zone()) LTransitionElementsKind(object, NULL, new_map_reg); |
| 2309 return result; | 2302 return result; |
| 2310 } else { | 2303 } else { |
| 2311 LOperand* object = UseFixed(instr->object(), r0); | 2304 LOperand* object = UseFixed(instr->object(), r3); |
| 2312 LOperand* context = UseFixed(instr->context(), cp); | 2305 LOperand* context = UseFixed(instr->context(), cp); |
| 2313 LTransitionElementsKind* result = | 2306 LTransitionElementsKind* result = |
| 2314 new(zone()) LTransitionElementsKind(object, context, NULL); | 2307 new(zone()) LTransitionElementsKind(object, context, NULL); |
| 2315 return MarkAsCall(result, instr); | 2308 return MarkAsCall(result, instr); |
| 2316 } | 2309 } |
| 2317 } | 2310 } |
| 2318 | 2311 |
| 2319 | 2312 |
| 2320 LInstruction* LChunkBuilder::DoTrapAllocationMemento( | 2313 LInstruction* LChunkBuilder::DoTrapAllocationMemento( |
| 2321 HTrapAllocationMemento* instr) { | 2314 HTrapAllocationMemento* instr) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2365 LOperand* obj = UseFixed(instr->object(), StoreIC::ReceiverRegister()); | 2358 LOperand* obj = UseFixed(instr->object(), StoreIC::ReceiverRegister()); |
| 2366 LOperand* val = UseFixed(instr->value(), StoreIC::ValueRegister()); | 2359 LOperand* val = UseFixed(instr->value(), StoreIC::ValueRegister()); |
| 2367 | 2360 |
| 2368 LInstruction* result = new(zone()) LStoreNamedGeneric(context, obj, val); | 2361 LInstruction* result = new(zone()) LStoreNamedGeneric(context, obj, val); |
| 2369 return MarkAsCall(result, instr); | 2362 return MarkAsCall(result, instr); |
| 2370 } | 2363 } |
| 2371 | 2364 |
| 2372 | 2365 |
| 2373 LInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { | 2366 LInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { |
| 2374 LOperand* context = UseFixed(instr->context(), cp); | 2367 LOperand* context = UseFixed(instr->context(), cp); |
| 2375 LOperand* left = UseFixed(instr->left(), r1); | 2368 LOperand* left = UseFixed(instr->left(), r4); |
| 2376 LOperand* right = UseFixed(instr->right(), r0); | 2369 LOperand* right = UseFixed(instr->right(), r3); |
| 2377 return MarkAsCall( | 2370 return MarkAsCall( |
| 2378 DefineFixed(new(zone()) LStringAdd(context, left, right), r0), | 2371 DefineFixed(new(zone()) LStringAdd(context, left, right), r3), |
| 2379 instr); | 2372 instr); |
| 2380 } | 2373 } |
| 2381 | 2374 |
| 2382 | 2375 |
| 2383 LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { | 2376 LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { |
| 2384 LOperand* string = UseTempRegister(instr->string()); | 2377 LOperand* string = UseTempRegister(instr->string()); |
| 2385 LOperand* index = UseTempRegister(instr->index()); | 2378 LOperand* index = UseTempRegister(instr->index()); |
| 2386 LOperand* context = UseAny(instr->context()); | 2379 LOperand* context = UseAny(instr->context()); |
| 2387 LStringCharCodeAt* result = | 2380 LStringCharCodeAt* result = |
| 2388 new(zone()) LStringCharCodeAt(context, string, index); | 2381 new(zone()) LStringCharCodeAt(context, string, index); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2406 LOperand* temp1 = TempRegister(); | 2399 LOperand* temp1 = TempRegister(); |
| 2407 LOperand* temp2 = TempRegister(); | 2400 LOperand* temp2 = TempRegister(); |
| 2408 LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2); | 2401 LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2); |
| 2409 return AssignPointerMap(DefineAsRegister(result)); | 2402 return AssignPointerMap(DefineAsRegister(result)); |
| 2410 } | 2403 } |
| 2411 | 2404 |
| 2412 | 2405 |
| 2413 LInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { | 2406 LInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { |
| 2414 LOperand* context = UseFixed(instr->context(), cp); | 2407 LOperand* context = UseFixed(instr->context(), cp); |
| 2415 return MarkAsCall( | 2408 return MarkAsCall( |
| 2416 DefineFixed(new(zone()) LRegExpLiteral(context), r0), instr); | 2409 DefineFixed(new(zone()) LRegExpLiteral(context), r3), instr); |
| 2417 } | 2410 } |
| 2418 | 2411 |
| 2419 | 2412 |
| 2420 LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { | 2413 LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { |
| 2421 LOperand* context = UseFixed(instr->context(), cp); | 2414 LOperand* context = UseFixed(instr->context(), cp); |
| 2422 return MarkAsCall( | 2415 return MarkAsCall( |
| 2423 DefineFixed(new(zone()) LFunctionLiteral(context), r0), instr); | 2416 DefineFixed(new(zone()) LFunctionLiteral(context), r3), instr); |
| 2424 } | 2417 } |
| 2425 | 2418 |
| 2426 | 2419 |
| 2427 LInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { | 2420 LInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { |
| 2428 DCHECK(argument_count_ == 0); | 2421 DCHECK(argument_count_ == 0); |
| 2429 allocator_->MarkAsOsrEntry(); | 2422 allocator_->MarkAsOsrEntry(); |
| 2430 current_block_->last_environment()->set_ast_id(instr->ast_id()); | 2423 current_block_->last_environment()->set_ast_id(instr->ast_id()); |
| 2431 return AssignEnvironment(new(zone()) LOsrEntry); | 2424 return AssignEnvironment(new(zone()) LOsrEntry); |
| 2432 } | 2425 } |
| 2433 | 2426 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2461 Abort(kTooManySpillSlotsNeededForOSR); | 2454 Abort(kTooManySpillSlotsNeededForOSR); |
| 2462 spill_index = 0; | 2455 spill_index = 0; |
| 2463 } | 2456 } |
| 2464 } | 2457 } |
| 2465 return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); | 2458 return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); |
| 2466 } | 2459 } |
| 2467 | 2460 |
| 2468 | 2461 |
| 2469 LInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { | 2462 LInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { |
| 2470 LOperand* context = UseFixed(instr->context(), cp); | 2463 LOperand* context = UseFixed(instr->context(), cp); |
| 2471 return MarkAsCall(DefineFixed(new(zone()) LCallStub(context), r0), instr); | 2464 return MarkAsCall(DefineFixed(new(zone()) LCallStub(context), r3), instr); |
| 2472 } | 2465 } |
| 2473 | 2466 |
| 2474 | 2467 |
| 2475 LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { | 2468 LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { |
| 2476 // There are no real uses of the arguments object. | 2469 // There are no real uses of the arguments object. |
| 2477 // arguments.length and element access are supported directly on | 2470 // arguments.length and element access are supported directly on |
| 2478 // stack arguments, and any real arguments object use causes a bailout. | 2471 // stack arguments, and any real arguments object use causes a bailout. |
| 2479 // So this value is never used. | 2472 // So this value is never used. |
| 2480 return NULL; | 2473 return NULL; |
| 2481 } | 2474 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2492 LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { | 2485 LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { |
| 2493 info()->MarkAsRequiresFrame(); | 2486 info()->MarkAsRequiresFrame(); |
| 2494 LOperand* args = UseRegister(instr->arguments()); | 2487 LOperand* args = UseRegister(instr->arguments()); |
| 2495 LOperand* length = UseRegisterOrConstantAtStart(instr->length()); | 2488 LOperand* length = UseRegisterOrConstantAtStart(instr->length()); |
| 2496 LOperand* index = UseRegisterOrConstantAtStart(instr->index()); | 2489 LOperand* index = UseRegisterOrConstantAtStart(instr->index()); |
| 2497 return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index)); | 2490 return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index)); |
| 2498 } | 2491 } |
| 2499 | 2492 |
| 2500 | 2493 |
| 2501 LInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { | 2494 LInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { |
| 2502 LOperand* object = UseFixed(instr->value(), r0); | 2495 LOperand* object = UseFixed(instr->value(), r3); |
| 2503 LToFastProperties* result = new(zone()) LToFastProperties(object); | 2496 LToFastProperties* result = new(zone()) LToFastProperties(object); |
| 2504 return MarkAsCall(DefineFixed(result, r0), instr); | 2497 return MarkAsCall(DefineFixed(result, r3), instr); |
| 2505 } | 2498 } |
| 2506 | 2499 |
| 2507 | 2500 |
| 2508 LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { | 2501 LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { |
| 2509 LOperand* context = UseFixed(instr->context(), cp); | 2502 LOperand* context = UseFixed(instr->context(), cp); |
| 2510 LTypeof* result = new(zone()) LTypeof(context, UseFixed(instr->value(), r0)); | 2503 LTypeof* result = new(zone()) LTypeof(context, UseFixed(instr->value(), r3)); |
| 2511 return MarkAsCall(DefineFixed(result, r0), instr); | 2504 return MarkAsCall(DefineFixed(result, r3), instr); |
| 2512 } | 2505 } |
| 2513 | 2506 |
| 2514 | 2507 |
| 2515 LInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { | 2508 LInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { |
| 2516 return new(zone()) LTypeofIsAndBranch(UseRegister(instr->value())); | 2509 return new(zone()) LTypeofIsAndBranch(UseRegister(instr->value())); |
| 2517 } | 2510 } |
| 2518 | 2511 |
| 2519 | 2512 |
| 2520 LInstruction* LChunkBuilder::DoIsConstructCallAndBranch( | 2513 LInstruction* LChunkBuilder::DoIsConstructCallAndBranch( |
| 2521 HIsConstructCallAndBranch* instr) { | 2514 HIsConstructCallAndBranch* instr) { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2576 HEnvironment* outer = current_block_->last_environment()-> | 2569 HEnvironment* outer = current_block_->last_environment()-> |
| 2577 DiscardInlined(false); | 2570 DiscardInlined(false); |
| 2578 current_block_->UpdateEnvironment(outer); | 2571 current_block_->UpdateEnvironment(outer); |
| 2579 | 2572 |
| 2580 return pop; | 2573 return pop; |
| 2581 } | 2574 } |
| 2582 | 2575 |
| 2583 | 2576 |
| 2584 LInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { | 2577 LInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { |
| 2585 LOperand* context = UseFixed(instr->context(), cp); | 2578 LOperand* context = UseFixed(instr->context(), cp); |
| 2586 LOperand* object = UseFixed(instr->enumerable(), r0); | 2579 LOperand* object = UseFixed(instr->enumerable(), r3); |
| 2587 LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object); | 2580 LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object); |
| 2588 return MarkAsCall(DefineFixed(result, r0), instr, CAN_DEOPTIMIZE_EAGERLY); | 2581 return MarkAsCall(DefineFixed(result, r3), instr, CAN_DEOPTIMIZE_EAGERLY); |
| 2589 } | 2582 } |
| 2590 | 2583 |
| 2591 | 2584 |
| 2592 LInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { | 2585 LInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { |
| 2593 LOperand* map = UseRegister(instr->map()); | 2586 LOperand* map = UseRegister(instr->map()); |
| 2594 return AssignEnvironment(DefineAsRegister(new(zone()) LForInCacheArray(map))); | 2587 return AssignEnvironment(DefineAsRegister(new(zone()) LForInCacheArray(map))); |
| 2595 } | 2588 } |
| 2596 | 2589 |
| 2597 | 2590 |
| 2598 LInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { | 2591 LInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2620 LInstruction* LChunkBuilder::DoAllocateBlockContext( | 2613 LInstruction* LChunkBuilder::DoAllocateBlockContext( |
| 2621 HAllocateBlockContext* instr) { | 2614 HAllocateBlockContext* instr) { |
| 2622 LOperand* context = UseFixed(instr->context(), cp); | 2615 LOperand* context = UseFixed(instr->context(), cp); |
| 2623 LOperand* function = UseRegisterAtStart(instr->function()); | 2616 LOperand* function = UseRegisterAtStart(instr->function()); |
| 2624 LAllocateBlockContext* result = | 2617 LAllocateBlockContext* result = |
| 2625 new(zone()) LAllocateBlockContext(context, function); | 2618 new(zone()) LAllocateBlockContext(context, function); |
| 2626 return MarkAsCall(DefineFixed(result, cp), instr); | 2619 return MarkAsCall(DefineFixed(result, cp), instr); |
| 2627 } | 2620 } |
| 2628 | 2621 |
| 2629 } } // namespace v8::internal | 2622 } } // namespace v8::internal |
| OLD | NEW |