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

Side by Side Diff: src/compiler/ia32/code-generator-ia32.cc

Issue 745633002: [turbofan] Clean up and factor out branch generation logic. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix IA32 fall through. Created 6 years, 1 month 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
« no previous file with comments | « src/compiler/code-generator.cc ('k') | src/compiler/ia32/instruction-selector-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 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 "src/compiler/code-generator.h" 5 #include "src/compiler/code-generator.h"
6 6
7 #include "src/compiler/code-generator-impl.h" 7 #include "src/compiler/code-generator-impl.h"
8 #include "src/compiler/gap-resolver.h" 8 #include "src/compiler/gap-resolver.h"
9 #include "src/compiler/node-matchers.h" 9 #include "src/compiler/node-matchers.h"
10 #include "src/compiler/node-properties-inl.h" 10 #include "src/compiler/node-properties-inl.h"
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 if (FLAG_debug_code) { 188 if (FLAG_debug_code) {
189 // Check the function's context matches the context argument. 189 // Check the function's context matches the context argument.
190 __ cmp(esi, FieldOperand(func, JSFunction::kContextOffset)); 190 __ cmp(esi, FieldOperand(func, JSFunction::kContextOffset));
191 __ Assert(equal, kWrongFunctionContext); 191 __ Assert(equal, kWrongFunctionContext);
192 } 192 }
193 __ call(FieldOperand(func, JSFunction::kCodeEntryOffset)); 193 __ call(FieldOperand(func, JSFunction::kCodeEntryOffset));
194 AddSafepointAndDeopt(instr); 194 AddSafepointAndDeopt(instr);
195 break; 195 break;
196 } 196 }
197 case kArchJmp: 197 case kArchJmp:
198 __ jmp(GetLabel(i.InputRpo(0))); 198 AssembleArchJump(i.InputRpo(0));
199 break; 199 break;
200 case kArchNop: 200 case kArchNop:
201 // don't emit code for nops. 201 // don't emit code for nops.
202 break; 202 break;
203 case kArchRet: 203 case kArchRet:
204 AssembleReturn(); 204 AssembleReturn();
205 break; 205 break;
206 case kArchStackPointer: 206 case kArchStackPointer:
207 __ mov(i.OutputRegister(), esp); 207 __ mov(i.OutputRegister(), esp);
208 break; 208 break;
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 __ lea(index, Operand(object, index, times_1, 0)); 478 __ lea(index, Operand(object, index, times_1, 0));
479 SaveFPRegsMode mode = 479 SaveFPRegsMode mode =
480 frame()->DidAllocateDoubleRegisters() ? kSaveFPRegs : kDontSaveFPRegs; 480 frame()->DidAllocateDoubleRegisters() ? kSaveFPRegs : kDontSaveFPRegs;
481 __ RecordWrite(object, index, value, mode); 481 __ RecordWrite(object, index, value, mode);
482 break; 482 break;
483 } 483 }
484 } 484 }
485 } 485 }
486 486
487 487
488 // Assembles branches after an instruction. 488 // Assembles a branch after an instruction.
489 void CodeGenerator::AssembleArchBranch(Instruction* instr, 489 void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) {
490 FlagsCondition condition) {
491 IA32OperandConverter i(this, instr); 490 IA32OperandConverter i(this, instr);
492 Label done; 491 Label::Distance flabel_distance =
493 492 branch->fallthru ? Label::kNear : Label::kFar;
494 // Emit a branch. The true and false targets are always the last two inputs 493 Label* tlabel = branch->true_label;
495 // to the instruction. 494 Label* flabel = branch->false_label;
496 BasicBlock::RpoNumber tblock = 495 switch (branch->condition) {
497 i.InputRpo(static_cast<int>(instr->InputCount()) - 2);
498 BasicBlock::RpoNumber fblock =
499 i.InputRpo(static_cast<int>(instr->InputCount()) - 1);
500 bool fallthru = IsNextInAssemblyOrder(fblock);
501 Label* tlabel = GetLabel(tblock);
502 Label* flabel = fallthru ? &done : GetLabel(fblock);
503 Label::Distance flabel_distance = fallthru ? Label::kNear : Label::kFar;
504 switch (condition) {
505 case kUnorderedEqual: 496 case kUnorderedEqual:
506 __ j(parity_even, flabel, flabel_distance); 497 __ j(parity_even, flabel, flabel_distance);
507 // Fall through. 498 // Fall through.
508 case kEqual: 499 case kEqual:
509 __ j(equal, tlabel); 500 __ j(equal, tlabel);
510 break; 501 break;
511 case kUnorderedNotEqual: 502 case kUnorderedNotEqual:
512 __ j(parity_even, tlabel); 503 __ j(parity_even, tlabel);
513 // Fall through. 504 // Fall through.
514 case kNotEqual: 505 case kNotEqual:
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 case kUnsignedGreaterThan: 541 case kUnsignedGreaterThan:
551 __ j(above, tlabel); 542 __ j(above, tlabel);
552 break; 543 break;
553 case kOverflow: 544 case kOverflow:
554 __ j(overflow, tlabel); 545 __ j(overflow, tlabel);
555 break; 546 break;
556 case kNotOverflow: 547 case kNotOverflow:
557 __ j(no_overflow, tlabel); 548 __ j(no_overflow, tlabel);
558 break; 549 break;
559 } 550 }
560 if (!fallthru) __ jmp(flabel, flabel_distance); // no fallthru to flabel. 551 // Add a jump if not falling through to the next block.
561 __ bind(&done); 552 if (!branch->fallthru) __ jmp(flabel);
562 } 553 }
563 554
564 555
556 void CodeGenerator::AssembleArchJump(BasicBlock::RpoNumber target) {
557 if (!IsNextInAssemblyOrder(target)) __ jmp(GetLabel(target));
558 }
559
560
565 // Assembles boolean materializations after an instruction. 561 // Assembles boolean materializations after an instruction.
566 void CodeGenerator::AssembleArchBoolean(Instruction* instr, 562 void CodeGenerator::AssembleArchBoolean(Instruction* instr,
567 FlagsCondition condition) { 563 FlagsCondition condition) {
568 IA32OperandConverter i(this, instr); 564 IA32OperandConverter i(this, instr);
569 Label done; 565 Label done;
570 566
571 // Materialize a full 32-bit 1 or 0 value. The result register is always the 567 // Materialize a full 32-bit 1 or 0 value. The result register is always the
572 // last output of the instruction. 568 // last output of the instruction.
573 Label check; 569 Label check;
574 DCHECK_NE(0, instr->OutputCount()); 570 DCHECK_NE(0, instr->OutputCount());
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after
1036 } 1032 }
1037 } 1033 }
1038 MarkLazyDeoptSite(); 1034 MarkLazyDeoptSite();
1039 } 1035 }
1040 1036
1041 #undef __ 1037 #undef __
1042 1038
1043 } // namespace compiler 1039 } // namespace compiler
1044 } // namespace internal 1040 } // namespace internal
1045 } // namespace v8 1041 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/code-generator.cc ('k') | src/compiler/ia32/instruction-selector-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698