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

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

Issue 261933002: ARM64: Introduce TempDoubleRegister as a lithium operand constraint. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 7 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/arm64/lithium-arm64.h ('k') | src/lithium.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 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "v8.h" 5 #include "v8.h"
6 6
7 #include "lithium-allocator-inl.h" 7 #include "lithium-allocator-inl.h"
8 #include "arm64/lithium-arm64.h" 8 #include "arm64/lithium-arm64.h"
9 #include "arm64/lithium-codegen-arm64.h" 9 #include "arm64/lithium-codegen-arm64.h"
10 #include "hydrogen-osr.h" 10 #include "hydrogen-osr.h"
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 int vreg = allocator_->GetVirtualRegister(); 513 int vreg = allocator_->GetVirtualRegister();
514 if (!allocator_->AllocationOk()) { 514 if (!allocator_->AllocationOk()) {
515 Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 515 Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
516 vreg = 0; 516 vreg = 0;
517 } 517 }
518 operand->set_virtual_register(vreg); 518 operand->set_virtual_register(vreg);
519 return operand; 519 return operand;
520 } 520 }
521 521
522 522
523 LUnallocated* LChunkBuilder::TempDoubleRegister() {
524 LUnallocated* operand =
525 new(zone()) LUnallocated(LUnallocated::MUST_HAVE_DOUBLE_REGISTER);
526 int vreg = allocator_->GetVirtualRegister();
527 if (!allocator_->AllocationOk()) {
528 Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
529 vreg = 0;
530 }
531 operand->set_virtual_register(vreg);
532 return operand;
533 }
534
535
523 int LPlatformChunk::GetNextSpillIndex() { 536 int LPlatformChunk::GetNextSpillIndex() {
524 return spill_slot_count_++; 537 return spill_slot_count_++;
525 } 538 }
526 539
527 540
528 LOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) { 541 LOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) {
529 int index = GetNextSpillIndex(); 542 int index = GetNextSpillIndex();
530 if (kind == DOUBLE_REGISTERS) { 543 if (kind == DOUBLE_REGISTERS) {
531 return LDoubleStackSlot::Create(index, zone()); 544 return LDoubleStackSlot::Create(index, zone());
532 } else { 545 } else {
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after
1084 } 1097 }
1085 return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value))); 1098 return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
1086 } else { 1099 } else {
1087 ASSERT(to.IsInteger32()); 1100 ASSERT(to.IsInteger32());
1088 if (val->type().IsSmi() || val->representation().IsSmi()) { 1101 if (val->type().IsSmi() || val->representation().IsSmi()) {
1089 LOperand* value = UseRegisterAtStart(val); 1102 LOperand* value = UseRegisterAtStart(val);
1090 return DefineAsRegister(new(zone()) LSmiUntag(value, false)); 1103 return DefineAsRegister(new(zone()) LSmiUntag(value, false));
1091 } else { 1104 } else {
1092 LOperand* value = UseRegister(val); 1105 LOperand* value = UseRegister(val);
1093 LOperand* temp1 = TempRegister(); 1106 LOperand* temp1 = TempRegister();
1094 LOperand* temp2 = instr->CanTruncateToInt32() ? NULL : FixedTemp(d24); 1107 LOperand* temp2 = instr->CanTruncateToInt32()
1108 ? NULL : TempDoubleRegister();
1095 LInstruction* result = 1109 LInstruction* result =
1096 DefineAsRegister(new(zone()) LTaggedToI(value, temp1, temp2)); 1110 DefineAsRegister(new(zone()) LTaggedToI(value, temp1, temp2));
1097 if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1111 if (!val->representation().IsSmi()) result = AssignEnvironment(result);
1098 return result; 1112 return result;
1099 } 1113 }
1100 } 1114 }
1101 } else if (from.IsDouble()) { 1115 } else if (from.IsDouble()) {
1102 if (to.IsTagged()) { 1116 if (to.IsTagged()) {
1103 info()->MarkAsDeferredCalling(); 1117 info()->MarkAsDeferredCalling();
1104 LOperand* value = UseRegister(val); 1118 LOperand* value = UseRegister(val);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1205 LOperand* reg = UseRegister(value); 1219 LOperand* reg = UseRegister(value);
1206 if (input_rep.IsDouble()) { 1220 if (input_rep.IsDouble()) {
1207 return DefineAsRegister(new(zone()) LClampDToUint8(reg)); 1221 return DefineAsRegister(new(zone()) LClampDToUint8(reg));
1208 } else if (input_rep.IsInteger32()) { 1222 } else if (input_rep.IsInteger32()) {
1209 return DefineAsRegister(new(zone()) LClampIToUint8(reg)); 1223 return DefineAsRegister(new(zone()) LClampIToUint8(reg));
1210 } else { 1224 } else {
1211 ASSERT(input_rep.IsSmiOrTagged()); 1225 ASSERT(input_rep.IsSmiOrTagged());
1212 return AssignEnvironment( 1226 return AssignEnvironment(
1213 DefineAsRegister(new(zone()) LClampTToUint8(reg, 1227 DefineAsRegister(new(zone()) LClampTToUint8(reg,
1214 TempRegister(), 1228 TempRegister(),
1215 FixedTemp(d24)))); 1229 TempDoubleRegister())));
1216 } 1230 }
1217 } 1231 }
1218 1232
1219 1233
1220 LInstruction* LChunkBuilder::DoClassOfTestAndBranch( 1234 LInstruction* LChunkBuilder::DoClassOfTestAndBranch(
1221 HClassOfTestAndBranch* instr) { 1235 HClassOfTestAndBranch* instr) {
1222 ASSERT(instr->value()->representation().IsTagged()); 1236 ASSERT(instr->value()->representation().IsTagged());
1223 LOperand* value = UseRegisterAtStart(instr->value()); 1237 LOperand* value = UseRegisterAtStart(instr->value());
1224 return new(zone()) LClassOfTestAndBranch(value, 1238 return new(zone()) LClassOfTestAndBranch(value,
1225 TempRegister(), 1239 TempRegister(),
(...skipping 1202 matching lines...) Expand 10 before | Expand all | Expand 10 after
2428 LOperand* input = UseRegisterAtStart(instr->value()); 2442 LOperand* input = UseRegisterAtStart(instr->value());
2429 LInstruction* result = DefineAsRegister(new(zone()) LMathAbs(input)); 2443 LInstruction* result = DefineAsRegister(new(zone()) LMathAbs(input));
2430 if (!r.IsDouble()) result = AssignEnvironment(result); 2444 if (!r.IsDouble()) result = AssignEnvironment(result);
2431 return result; 2445 return result;
2432 } 2446 }
2433 } 2447 }
2434 case kMathExp: { 2448 case kMathExp: {
2435 ASSERT(instr->representation().IsDouble()); 2449 ASSERT(instr->representation().IsDouble());
2436 ASSERT(instr->value()->representation().IsDouble()); 2450 ASSERT(instr->value()->representation().IsDouble());
2437 LOperand* input = UseRegister(instr->value()); 2451 LOperand* input = UseRegister(instr->value());
2438 // TODO(all): Implement TempFPRegister. 2452 LOperand* double_temp1 = TempDoubleRegister();
2439 LOperand* double_temp1 = FixedTemp(d24); // This was chosen arbitrarily.
2440 LOperand* temp1 = TempRegister(); 2453 LOperand* temp1 = TempRegister();
2441 LOperand* temp2 = TempRegister(); 2454 LOperand* temp2 = TempRegister();
2442 LOperand* temp3 = TempRegister(); 2455 LOperand* temp3 = TempRegister();
2443 LMathExp* result = new(zone()) LMathExp(input, double_temp1, 2456 LMathExp* result = new(zone()) LMathExp(input, double_temp1,
2444 temp1, temp2, temp3); 2457 temp1, temp2, temp3);
2445 return DefineAsRegister(result); 2458 return DefineAsRegister(result);
2446 } 2459 }
2447 case kMathFloor: { 2460 case kMathFloor: {
2448 ASSERT(instr->value()->representation().IsDouble()); 2461 ASSERT(instr->value()->representation().IsDouble());
2449 LOperand* input = UseRegisterAtStart(instr->value()); 2462 LOperand* input = UseRegisterAtStart(instr->value());
(...skipping 16 matching lines...) Expand all
2466 case kMathPowHalf: { 2479 case kMathPowHalf: {
2467 ASSERT(instr->representation().IsDouble()); 2480 ASSERT(instr->representation().IsDouble());
2468 ASSERT(instr->value()->representation().IsDouble()); 2481 ASSERT(instr->value()->representation().IsDouble());
2469 LOperand* input = UseRegister(instr->value()); 2482 LOperand* input = UseRegister(instr->value());
2470 return DefineAsRegister(new(zone()) LMathPowHalf(input)); 2483 return DefineAsRegister(new(zone()) LMathPowHalf(input));
2471 } 2484 }
2472 case kMathRound: { 2485 case kMathRound: {
2473 ASSERT(instr->value()->representation().IsDouble()); 2486 ASSERT(instr->value()->representation().IsDouble());
2474 LOperand* input = UseRegister(instr->value()); 2487 LOperand* input = UseRegister(instr->value());
2475 if (instr->representation().IsInteger32()) { 2488 if (instr->representation().IsInteger32()) {
2476 LMathRoundI* result = new(zone()) LMathRoundI(input, FixedTemp(d24)); 2489 LOperand* temp = TempDoubleRegister();
2490 LMathRoundI* result = new(zone()) LMathRoundI(input, temp);
2477 return AssignEnvironment(DefineAsRegister(result)); 2491 return AssignEnvironment(DefineAsRegister(result));
2478 } else { 2492 } else {
2479 ASSERT(instr->representation().IsDouble()); 2493 ASSERT(instr->representation().IsDouble());
2480 LMathRoundD* result = new(zone()) LMathRoundD(input); 2494 LMathRoundD* result = new(zone()) LMathRoundD(input);
2481 return DefineAsRegister(result); 2495 return DefineAsRegister(result);
2482 } 2496 }
2483 } 2497 }
2484 case kMathSqrt: { 2498 case kMathSqrt: {
2485 ASSERT(instr->representation().IsDouble()); 2499 ASSERT(instr->representation().IsDouble());
2486 ASSERT(instr->value()->representation().IsDouble()); 2500 ASSERT(instr->value()->representation().IsDouble());
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2558 2572
2559 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 2573 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
2560 LOperand* receiver = UseRegister(instr->receiver()); 2574 LOperand* receiver = UseRegister(instr->receiver());
2561 LOperand* function = UseRegister(instr->function()); 2575 LOperand* function = UseRegister(instr->function());
2562 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); 2576 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function);
2563 return AssignEnvironment(DefineAsRegister(result)); 2577 return AssignEnvironment(DefineAsRegister(result));
2564 } 2578 }
2565 2579
2566 2580
2567 } } // namespace v8::internal 2581 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm64/lithium-arm64.h ('k') | src/lithium.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698