OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 | 300 |
301 | 301 |
302 void LInnerAllocatedObject::PrintDataTo(StringStream* stream) { | 302 void LInnerAllocatedObject::PrintDataTo(StringStream* stream) { |
303 stream->Add(" = "); | 303 stream->Add(" = "); |
304 base_object()->PrintTo(stream); | 304 base_object()->PrintTo(stream); |
305 stream->Add(" + "); | 305 stream->Add(" + "); |
306 offset()->PrintTo(stream); | 306 offset()->PrintTo(stream); |
307 } | 307 } |
308 | 308 |
309 | 309 |
310 void LCallConstantFunction::PrintDataTo(StringStream* stream) { | 310 void LCallJSFunction::PrintDataTo(StringStream* stream) { |
| 311 stream->Add("= "); |
| 312 function()->PrintTo(stream); |
311 stream->Add("#%d / ", arity()); | 313 stream->Add("#%d / ", arity()); |
312 } | 314 } |
313 | 315 |
| 316 |
| 317 void LCallWithDescriptor::PrintDataTo(StringStream* stream) { |
| 318 for (int i = 0; i < InputCount(); i++) { |
| 319 InputAt(i)->PrintTo(stream); |
| 320 stream->Add(" "); |
| 321 } |
| 322 stream->Add("#%d / ", arity()); |
| 323 } |
| 324 |
314 | 325 |
315 void LLoadContextSlot::PrintDataTo(StringStream* stream) { | 326 void LLoadContextSlot::PrintDataTo(StringStream* stream) { |
316 context()->PrintTo(stream); | 327 context()->PrintTo(stream); |
317 stream->Add("[%d]", slot_index()); | 328 stream->Add("[%d]", slot_index()); |
318 } | 329 } |
319 | 330 |
320 | 331 |
321 void LStoreContextSlot::PrintDataTo(StringStream* stream) { | 332 void LStoreContextSlot::PrintDataTo(StringStream* stream) { |
322 context()->PrintTo(stream); | 333 context()->PrintTo(stream); |
323 stream->Add("[%d] <- ", slot_index()); | 334 stream->Add("[%d] <- ", slot_index()); |
324 value()->PrintTo(stream); | 335 value()->PrintTo(stream); |
325 } | 336 } |
326 | 337 |
327 | 338 |
328 void LInvokeFunction::PrintDataTo(StringStream* stream) { | 339 void LInvokeFunction::PrintDataTo(StringStream* stream) { |
329 stream->Add("= "); | 340 stream->Add("= "); |
330 context()->PrintTo(stream); | 341 context()->PrintTo(stream); |
331 stream->Add(" "); | 342 stream->Add(" "); |
332 function()->PrintTo(stream); | 343 function()->PrintTo(stream); |
333 stream->Add(" #%d / ", arity()); | 344 stream->Add(" #%d / ", arity()); |
334 } | 345 } |
335 | 346 |
336 | 347 |
337 void LCallKeyed::PrintDataTo(StringStream* stream) { | |
338 stream->Add("[ecx] #%d / ", arity()); | |
339 } | |
340 | |
341 | |
342 void LCallNamed::PrintDataTo(StringStream* stream) { | |
343 SmartArrayPointer<char> name_string = name()->ToCString(); | |
344 stream->Add("%s #%d / ", name_string.get(), arity()); | |
345 } | |
346 | |
347 | |
348 void LCallKnownGlobal::PrintDataTo(StringStream* stream) { | |
349 stream->Add("#%d / ", arity()); | |
350 } | |
351 | |
352 | |
353 void LCallNew::PrintDataTo(StringStream* stream) { | 348 void LCallNew::PrintDataTo(StringStream* stream) { |
354 stream->Add("= "); | 349 stream->Add("= "); |
355 context()->PrintTo(stream); | 350 context()->PrintTo(stream); |
356 stream->Add(" "); | 351 stream->Add(" "); |
357 constructor()->PrintTo(stream); | 352 constructor()->PrintTo(stream); |
358 stream->Add(" #%d / ", arity()); | 353 stream->Add(" #%d / ", arity()); |
359 } | 354 } |
360 | 355 |
361 | 356 |
362 void LCallNewArray::PrintDataTo(StringStream* stream) { | 357 void LCallNewArray::PrintDataTo(StringStream* stream) { |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 LOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { | 607 LOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { |
613 if (value->EmitAtUses()) { | 608 if (value->EmitAtUses()) { |
614 HInstruction* instr = HInstruction::cast(value); | 609 HInstruction* instr = HInstruction::cast(value); |
615 VisitInstruction(instr); | 610 VisitInstruction(instr); |
616 } | 611 } |
617 operand->set_virtual_register(value->id()); | 612 operand->set_virtual_register(value->id()); |
618 return operand; | 613 return operand; |
619 } | 614 } |
620 | 615 |
621 | 616 |
622 template<int I, int T> | 617 LInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr, |
623 LInstruction* LChunkBuilder::Define(LTemplateInstruction<1, I, T>* instr, | |
624 LUnallocated* result) { | 618 LUnallocated* result) { |
625 result->set_virtual_register(current_instruction_->id()); | 619 result->set_virtual_register(current_instruction_->id()); |
626 instr->set_result(result); | 620 instr->set_result(result); |
627 return instr; | 621 return instr; |
628 } | 622 } |
629 | 623 |
630 | 624 |
631 template<int I, int T> | |
632 LInstruction* LChunkBuilder::DefineAsRegister( | 625 LInstruction* LChunkBuilder::DefineAsRegister( |
633 LTemplateInstruction<1, I, T>* instr) { | 626 LTemplateResultInstruction<1>* instr) { |
634 return Define(instr, | 627 return Define(instr, |
635 new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); | 628 new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); |
636 } | 629 } |
637 | 630 |
638 | 631 |
639 template<int I, int T> | |
640 LInstruction* LChunkBuilder::DefineAsSpilled( | 632 LInstruction* LChunkBuilder::DefineAsSpilled( |
641 LTemplateInstruction<1, I, T>* instr, | 633 LTemplateResultInstruction<1>* instr, |
642 int index) { | 634 int index) { |
643 return Define(instr, | 635 return Define(instr, |
644 new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); | 636 new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); |
645 } | 637 } |
646 | 638 |
647 | 639 |
648 template<int I, int T> | |
649 LInstruction* LChunkBuilder::DefineSameAsFirst( | 640 LInstruction* LChunkBuilder::DefineSameAsFirst( |
650 LTemplateInstruction<1, I, T>* instr) { | 641 LTemplateResultInstruction<1>* instr) { |
651 return Define(instr, | 642 return Define(instr, |
652 new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); | 643 new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); |
653 } | 644 } |
654 | 645 |
655 | 646 |
656 template<int I, int T> | 647 LInstruction* LChunkBuilder::DefineFixed(LTemplateResultInstruction<1>* instr, |
657 LInstruction* LChunkBuilder::DefineFixed(LTemplateInstruction<1, I, T>* instr, | |
658 Register reg) { | 648 Register reg) { |
659 return Define(instr, ToUnallocated(reg)); | 649 return Define(instr, ToUnallocated(reg)); |
660 } | 650 } |
661 | 651 |
662 | 652 |
663 template<int I, int T> | |
664 LInstruction* LChunkBuilder::DefineFixedDouble( | 653 LInstruction* LChunkBuilder::DefineFixedDouble( |
665 LTemplateInstruction<1, I, T>* instr, | 654 LTemplateResultInstruction<1>* instr, |
666 XMMRegister reg) { | 655 XMMRegister reg) { |
667 return Define(instr, ToUnallocated(reg)); | 656 return Define(instr, ToUnallocated(reg)); |
668 } | 657 } |
669 | 658 |
670 | 659 |
671 LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { | 660 LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { |
672 HEnvironment* hydrogen_env = current_block_->last_environment(); | 661 HEnvironment* hydrogen_env = current_block_->last_environment(); |
673 int argument_index_accumulator = 0; | 662 int argument_index_accumulator = 0; |
674 ZoneList<HValue*> objects_to_materialize(0, zone()); | 663 ZoneList<HValue*> objects_to_materialize(0, zone()); |
675 instr->set_environment(CreateEnvironment(hydrogen_env, | 664 instr->set_environment(CreateEnvironment(hydrogen_env, |
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 return DefineAsRegister(new(zone()) LGlobalObject(context)); | 1144 return DefineAsRegister(new(zone()) LGlobalObject(context)); |
1156 } | 1145 } |
1157 | 1146 |
1158 | 1147 |
1159 LInstruction* LChunkBuilder::DoGlobalReceiver(HGlobalReceiver* instr) { | 1148 LInstruction* LChunkBuilder::DoGlobalReceiver(HGlobalReceiver* instr) { |
1160 LOperand* global_object = UseRegisterAtStart(instr->value()); | 1149 LOperand* global_object = UseRegisterAtStart(instr->value()); |
1161 return DefineAsRegister(new(zone()) LGlobalReceiver(global_object)); | 1150 return DefineAsRegister(new(zone()) LGlobalReceiver(global_object)); |
1162 } | 1151 } |
1163 | 1152 |
1164 | 1153 |
1165 LInstruction* LChunkBuilder::DoCallConstantFunction( | 1154 LInstruction* LChunkBuilder::DoCallJSFunction( |
1166 HCallConstantFunction* instr) { | 1155 HCallJSFunction* instr) { |
1167 return MarkAsCall(DefineFixed(new(zone()) LCallConstantFunction, eax), instr); | 1156 LOperand* function = UseFixed(instr->function(), edi); |
| 1157 |
| 1158 LCallJSFunction* result = new(zone()) LCallJSFunction(function); |
| 1159 |
| 1160 return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); |
1168 } | 1161 } |
1169 | 1162 |
1170 | 1163 |
| 1164 LInstruction* LChunkBuilder::DoCallWithDescriptor( |
| 1165 HCallWithDescriptor* instr) { |
| 1166 const CallInterfaceDescriptor* descriptor = instr->descriptor(); |
| 1167 |
| 1168 LOperand* target = UseRegisterOrConstantAtStart(instr->target()); |
| 1169 ZoneList<LOperand*> ops(instr->OperandCount(), zone()); |
| 1170 ops.Add(target, zone()); |
| 1171 for (int i = 1; i < instr->OperandCount(); i++) { |
| 1172 LOperand* op = UseFixed(instr->OperandAt(i), |
| 1173 descriptor->GetParameterRegister(i - 1)); |
| 1174 ops.Add(op, zone()); |
| 1175 } |
| 1176 |
| 1177 LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( |
| 1178 descriptor, ops, zone()); |
| 1179 return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); |
| 1180 } |
| 1181 |
| 1182 |
1171 LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { | 1183 LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { |
1172 LOperand* context = UseFixed(instr->context(), esi); | 1184 LOperand* context = UseFixed(instr->context(), esi); |
1173 LOperand* function = UseFixed(instr->function(), edi); | 1185 LOperand* function = UseFixed(instr->function(), edi); |
1174 LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); | 1186 LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); |
1175 return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); | 1187 return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); |
1176 } | 1188 } |
1177 | 1189 |
1178 | 1190 |
1179 LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { | 1191 LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { |
1180 switch (instr->op()) { | 1192 switch (instr->op()) { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1242 | 1254 |
1243 | 1255 |
1244 LInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { | 1256 LInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { |
1245 LOperand* input = UseRegisterAtStart(instr->value()); | 1257 LOperand* input = UseRegisterAtStart(instr->value()); |
1246 LOperand* temp = TempRegister(); | 1258 LOperand* temp = TempRegister(); |
1247 LMathPowHalf* result = new(zone()) LMathPowHalf(input, temp); | 1259 LMathPowHalf* result = new(zone()) LMathPowHalf(input, temp); |
1248 return DefineSameAsFirst(result); | 1260 return DefineSameAsFirst(result); |
1249 } | 1261 } |
1250 | 1262 |
1251 | 1263 |
1252 LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { | |
1253 ASSERT(instr->key()->representation().IsTagged()); | |
1254 LOperand* context = UseFixed(instr->context(), esi); | |
1255 LOperand* key = UseFixed(instr->key(), ecx); | |
1256 LCallKeyed* result = new(zone()) LCallKeyed(context, key); | |
1257 return MarkAsCall(DefineFixed(result, eax), instr); | |
1258 } | |
1259 | |
1260 | |
1261 LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { | |
1262 LOperand* context = UseFixed(instr->context(), esi); | |
1263 LCallNamed* result = new(zone()) LCallNamed(context); | |
1264 return MarkAsCall(DefineFixed(result, eax), instr); | |
1265 } | |
1266 | |
1267 | |
1268 LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { | |
1269 return MarkAsCall(DefineFixed(new(zone()) LCallKnownGlobal, eax), instr); | |
1270 } | |
1271 | |
1272 | |
1273 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { | 1264 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { |
1274 LOperand* context = UseFixed(instr->context(), esi); | 1265 LOperand* context = UseFixed(instr->context(), esi); |
1275 LOperand* constructor = UseFixed(instr->constructor(), edi); | 1266 LOperand* constructor = UseFixed(instr->constructor(), edi); |
1276 LCallNew* result = new(zone()) LCallNew(context, constructor); | 1267 LCallNew* result = new(zone()) LCallNew(context, constructor); |
1277 return MarkAsCall(DefineFixed(result, eax), instr); | 1268 return MarkAsCall(DefineFixed(result, eax), instr); |
1278 } | 1269 } |
1279 | 1270 |
1280 | 1271 |
1281 LInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { | 1272 LInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { |
1282 LOperand* context = UseFixed(instr->context(), esi); | 1273 LOperand* context = UseFixed(instr->context(), esi); |
(...skipping 1383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2666 LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { | 2657 LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { |
2667 LOperand* object = UseRegister(instr->object()); | 2658 LOperand* object = UseRegister(instr->object()); |
2668 LOperand* index = UseTempRegister(instr->index()); | 2659 LOperand* index = UseTempRegister(instr->index()); |
2669 return DefineSameAsFirst(new(zone()) LLoadFieldByIndex(object, index)); | 2660 return DefineSameAsFirst(new(zone()) LLoadFieldByIndex(object, index)); |
2670 } | 2661 } |
2671 | 2662 |
2672 | 2663 |
2673 } } // namespace v8::internal | 2664 } } // namespace v8::internal |
2674 | 2665 |
2675 #endif // V8_TARGET_ARCH_IA32 | 2666 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |