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

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

Issue 149413010: A64: Synchronize with r16024. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/a64
Patch Set: Created 6 years, 10 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/a64/lithium-a64.h ('k') | src/a64/lithium-codegen-a64.h » ('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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 for (int i = 0; i < 4; i++) { 277 for (int i = 0; i < 4; i++) {
278 stream->Add("("); 278 stream->Add("(");
279 if (parallel_moves_[i] != NULL) { 279 if (parallel_moves_[i] != NULL) {
280 parallel_moves_[i]->PrintDataTo(stream); 280 parallel_moves_[i]->PrintDataTo(stream);
281 } 281 }
282 stream->Add(") "); 282 stream->Add(") ");
283 } 283 }
284 } 284 }
285 285
286 286
287 ExternalReference LLinkObjectInList::GetReference(Isolate* isolate) {
288 switch (hydrogen()->known_list()) {
289 case HLinkObjectInList::ALLOCATION_SITE_LIST:
290 return ExternalReference::allocation_sites_list_address(isolate);
291 }
292
293 UNREACHABLE();
294 // Return a dummy value
295 return ExternalReference::isolate_address(isolate);
296 }
297
298
299 void LLinkObjectInList::PrintDataTo(StringStream* stream) {
300 object()->PrintTo(stream);
301 stream->Add(" offset %d", hydrogen()->store_field().offset());
302 }
303
304
305 void LLoadContextSlot::PrintDataTo(StringStream* stream) { 287 void LLoadContextSlot::PrintDataTo(StringStream* stream) {
306 context()->PrintTo(stream); 288 context()->PrintTo(stream);
307 stream->Add("[%d]", slot_index()); 289 stream->Add("[%d]", slot_index());
308 } 290 }
309 291
310 292
311 void LStoreContextSlot::PrintDataTo(StringStream* stream) { 293 void LStoreContextSlot::PrintDataTo(StringStream* stream) {
312 context()->PrintTo(stream); 294 context()->PrintTo(stream);
313 stream->Add("[%d] <- ", slot_index()); 295 stream->Add("[%d] <- ", slot_index());
314 value()->PrintTo(stream); 296 value()->PrintTo(stream);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 case Token::SHL: return "shl-t"; 371 case Token::SHL: return "shl-t";
390 case Token::SAR: return "sar-t"; 372 case Token::SAR: return "sar-t";
391 case Token::SHR: return "shr-t"; 373 case Token::SHR: return "shr-t";
392 default: 374 default:
393 UNREACHABLE(); 375 UNREACHABLE();
394 return NULL; 376 return NULL;
395 } 377 }
396 } 378 }
397 379
398 380
399 void LChunkBuilder::Abort(const char* reason) { 381 void LChunkBuilder::Abort(BailoutReason reason) {
400 info()->set_bailout_reason(reason); 382 info()->set_bailout_reason(reason);
401 status_ = ABORTED; 383 status_ = ABORTED;
402 } 384 }
403 385
404 386
405 LUnallocated* LChunkBuilder::ToUnallocated(Register reg) { 387 LUnallocated* LChunkBuilder::ToUnallocated(Register reg) {
406 return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER, 388 return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER,
407 Register::ToAllocationIndex(reg)); 389 Register::ToAllocationIndex(reg));
408 } 390 }
409 391
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 instr->set_pointer_map(new(zone()) LPointerMap(position_, zone())); 542 instr->set_pointer_map(new(zone()) LPointerMap(position_, zone()));
561 return instr; 543 return instr;
562 } 544 }
563 545
564 546
565 LUnallocated* LChunkBuilder::TempRegister() { 547 LUnallocated* LChunkBuilder::TempRegister() {
566 LUnallocated* operand = 548 LUnallocated* operand =
567 new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER); 549 new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
568 int vreg = allocator_->GetVirtualRegister(); 550 int vreg = allocator_->GetVirtualRegister();
569 if (!allocator_->AllocationOk()) { 551 if (!allocator_->AllocationOk()) {
570 Abort("Out of virtual registers while trying to allocate temp register."); 552 Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
571 vreg = 0; 553 vreg = 0;
572 } 554 }
573 operand->set_virtual_register(vreg); 555 operand->set_virtual_register(vreg);
574 return operand; 556 return operand;
575 } 557 }
576 558
577 559
578 int LPlatformChunk::GetNextSpillIndex() { 560 int LPlatformChunk::GetNextSpillIndex() {
579 return spill_slot_count_++; 561 return spill_slot_count_++;
580 } 562 }
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 LOperand* left_operand = UseFixed(left, x1); 825 LOperand* left_operand = UseFixed(left, x1);
844 LOperand* right_operand = UseFixed(right, x0); 826 LOperand* right_operand = UseFixed(right, x0);
845 LArithmeticT* result = 827 LArithmeticT* result =
846 new(zone()) LArithmeticT(op, left_operand, right_operand); 828 new(zone()) LArithmeticT(op, left_operand, right_operand);
847 return MarkAsCall(DefineFixed(result, x0), instr); 829 return MarkAsCall(DefineFixed(result, x0), instr);
848 } 830 }
849 831
850 832
851 #define UNIMPLEMENTED_INSTRUCTION() \ 833 #define UNIMPLEMENTED_INSTRUCTION() \
852 do { \ 834 do { \
853 static char msg[128]; \ 835 info_->set_bailout_reason(kUnimplementedHydrogenInstruction); \
854 snprintf(msg, sizeof(msg), \
855 "unsupported hydrogen instruction (%s)", __func__); \
856 info_->set_bailout_reason(msg); \
857 status_ = ABORTED; \ 836 status_ = ABORTED; \
858 return NULL; \ 837 return NULL; \
859 } while (0) 838 } while (0)
860 839
861 840
862 LInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation( 841 LInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation(
863 HBoundsCheckBaseIndexInformation* instr) { 842 HBoundsCheckBaseIndexInformation* instr) {
864 UNREACHABLE(); 843 UNREACHABLE();
865 return NULL; 844 return NULL;
866 } 845 }
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after
1380 1359
1381 1360
1382 LInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 1361 LInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
1383 Representation r = instr->representation(); 1362 Representation r = instr->representation();
1384 if (r.IsSmi()) { 1363 if (r.IsSmi()) {
1385 return DefineAsRegister(new(zone()) LConstantS); 1364 return DefineAsRegister(new(zone()) LConstantS);
1386 } else if (r.IsInteger32()) { 1365 } else if (r.IsInteger32()) {
1387 return DefineAsRegister(new(zone()) LConstantI); 1366 return DefineAsRegister(new(zone()) LConstantI);
1388 } else if (r.IsDouble()) { 1367 } else if (r.IsDouble()) {
1389 return DefineAsRegister(new(zone()) LConstantD); 1368 return DefineAsRegister(new(zone()) LConstantD);
1369 } else if (r.IsExternal()) {
1370 return DefineAsRegister(new(zone()) LConstantE);
1390 } else if (r.IsTagged()) { 1371 } else if (r.IsTagged()) {
1391 return DefineAsRegister(new(zone()) LConstantT); 1372 return DefineAsRegister(new(zone()) LConstantT);
1392 } else { 1373 } else {
1393 UNREACHABLE(); 1374 UNREACHABLE();
1394 return NULL; 1375 return NULL;
1395 } 1376 }
1396 } 1377 }
1397 1378
1398 1379
1399 LInstruction* LChunkBuilder::DoContext(HContext* instr) { 1380 LInstruction* LChunkBuilder::DoContext(HContext* instr) {
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
1643 } 1624 }
1644 1625
1645 HEnvironment* outer = 1626 HEnvironment* outer =
1646 current_block_->last_environment()->DiscardInlined(false); 1627 current_block_->last_environment()->DiscardInlined(false);
1647 current_block_->UpdateEnvironment(outer); 1628 current_block_->UpdateEnvironment(outer);
1648 1629
1649 return pop; 1630 return pop;
1650 } 1631 }
1651 1632
1652 1633
1653 LInstruction* LChunkBuilder::DoLinkObjectInList(HLinkObjectInList* instr) {
1654 LOperand* object = UseRegister(instr->value());
1655 LOperand* temp = TempRegister();
1656 LLinkObjectInList* result = new(zone()) LLinkObjectInList(object, temp);
1657 return result;
1658 }
1659
1660
1661 LInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) { 1634 LInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
1662 LOperand* context = UseRegisterAtStart(instr->value()); 1635 LOperand* context = UseRegisterAtStart(instr->value());
1663 LInstruction* result = 1636 LInstruction* result =
1664 DefineAsRegister(new(zone()) LLoadContextSlot(context)); 1637 DefineAsRegister(new(zone()) LLoadContextSlot(context));
1665 return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result; 1638 return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result;
1666 } 1639 }
1667 1640
1668 1641
1669 LInstruction* LChunkBuilder::DoLoadExternalArrayPointer( 1642 LInstruction* LChunkBuilder::DoLoadExternalArrayPointer(
1670 HLoadExternalArrayPointer* instr) { 1643 HLoadExternalArrayPointer* instr) {
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after
2292 ASSERT(instr->left()->representation().IsTagged()); 2265 ASSERT(instr->left()->representation().IsTagged());
2293 ASSERT(instr->right()->representation().IsTagged()); 2266 ASSERT(instr->right()->representation().IsTagged());
2294 LOperand* left = UseFixed(instr->left(), x1); 2267 LOperand* left = UseFixed(instr->left(), x1);
2295 LOperand* right = UseFixed(instr->right(), x0); 2268 LOperand* right = UseFixed(instr->right(), x0);
2296 LStringCompareAndBranch* result = 2269 LStringCompareAndBranch* result =
2297 new(zone()) LStringCompareAndBranch(left, right); 2270 new(zone()) LStringCompareAndBranch(left, right);
2298 return MarkAsCall(result, instr); 2271 return MarkAsCall(result, instr);
2299 } 2272 }
2300 2273
2301 2274
2302 LInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) {
2303 // TODO(all): This instruction doesn't exist anymore on bleeding_edge.
2304 LOperand* string = UseRegisterAtStart(instr->value());
2305 return DefineAsRegister(new(zone()) LStringLength(string));
2306 }
2307
2308
2309 LInstruction* LChunkBuilder::DoSub(HSub* instr) { 2275 LInstruction* LChunkBuilder::DoSub(HSub* instr) {
2310 // TODO(jbramley): Add smi support. 2276 // TODO(jbramley): Add smi support.
2311 if (instr->representation().IsInteger32()) { 2277 if (instr->representation().IsInteger32()) {
2312 ASSERT(instr->left()->representation().IsInteger32()); 2278 ASSERT(instr->left()->representation().IsInteger32());
2313 ASSERT(instr->right()->representation().IsInteger32()); 2279 ASSERT(instr->right()->representation().IsInteger32());
2314 2280
2315 LOperand *left; 2281 LOperand *left;
2316 if (instr->left()->IsConstant() && 2282 if (instr->left()->IsConstant() &&
2317 (HConstant::cast(instr->left())->Integer32Value() == 0)) { 2283 (HConstant::cast(instr->left())->Integer32Value() == 0)) {
2318 left = UseConstant(instr->left()); 2284 left = UseConstant(instr->left());
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
2404 2370
2405 return new(zone()) LTypeofIsAndBranch( 2371 return new(zone()) LTypeofIsAndBranch(
2406 UseRegister(instr->value()), temp1, temp2); 2372 UseRegister(instr->value()), temp1, temp2);
2407 } 2373 }
2408 2374
2409 2375
2410 LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 2376 LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
2411 switch (instr->op()) { 2377 switch (instr->op()) {
2412 case kMathAbs: { 2378 case kMathAbs: {
2413 Representation r = instr->representation(); 2379 Representation r = instr->representation();
2380 // TODO(jbramley): Support smis in LMathAbs and use that.
2414 if (r.IsTagged() || r.IsSmi()) { 2381 if (r.IsTagged() || r.IsSmi()) {
2415 // The tagged case might need to allocate a HeapNumber for the result, 2382 // The tagged case might need to allocate a HeapNumber for the result,
2416 // so it is handled by a separate LInstruction. 2383 // so it is handled by a separate LInstruction.
2417 LOperand* input = UseRegister(instr->value()); 2384 LOperand* input = UseRegister(instr->value());
2418 LOperand* temp1 = TempRegister(); 2385 LOperand* temp1 = TempRegister();
2419 LOperand* temp2 = TempRegister(); 2386 LOperand* temp2 = TempRegister();
2420 LOperand* temp3 = TempRegister(); 2387 LOperand* temp3 = TempRegister();
2421 LMathAbsTagged* result = 2388 LMathAbsTagged* result =
2422 new(zone()) LMathAbsTagged(input, temp1, temp2, temp3); 2389 new(zone()) LMathAbsTagged(input, temp1, temp2, temp3);
2423 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 2390 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
2511 default: 2478 default:
2512 UNREACHABLE(); 2479 UNREACHABLE();
2513 return NULL; 2480 return NULL;
2514 } 2481 }
2515 } 2482 }
2516 2483
2517 2484
2518 LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { 2485 LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
2519 int spill_index = chunk_->GetNextSpillIndex(); 2486 int spill_index = chunk_->GetNextSpillIndex();
2520 if (spill_index > LUnallocated::kMaxFixedSlotIndex) { 2487 if (spill_index > LUnallocated::kMaxFixedSlotIndex) {
2521 Abort("Too many spill slots needed for OSR"); 2488 Abort(kTooManySpillSlotsNeededForOSR);
2522 spill_index = 0; 2489 spill_index = 0;
2523 } 2490 }
2524 return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); 2491 return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
2525 } 2492 }
2526 2493
2527 2494
2528 LInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 2495 LInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
2529 return NULL; 2496 return NULL;
2530 } 2497 }
2531 2498
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2570 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 2537 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
2571 LOperand* receiver = UseRegister(instr->receiver()); 2538 LOperand* receiver = UseRegister(instr->receiver());
2572 LOperand* function = UseRegisterAtStart(instr->function()); 2539 LOperand* function = UseRegisterAtStart(instr->function());
2573 LOperand* temp = TempRegister(); 2540 LOperand* temp = TempRegister();
2574 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function, temp); 2541 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function, temp);
2575 return AssignEnvironment(DefineAsRegister(result)); 2542 return AssignEnvironment(DefineAsRegister(result));
2576 } 2543 }
2577 2544
2578 2545
2579 } } // namespace v8::internal 2546 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/a64/lithium-a64.h ('k') | src/a64/lithium-codegen-a64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698