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

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

Issue 931623002: [turbofan] Optimize certain chains of Branch into a Switch. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addrssed comments. Created 5 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
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/arm64/macro-assembler-arm64.h" 7 #include "src/arm64/macro-assembler-arm64.h"
8 #include "src/compiler/code-generator-impl.h" 8 #include "src/compiler/code-generator-impl.h"
9 #include "src/compiler/gap-resolver.h" 9 #include "src/compiler/gap-resolver.h"
10 #include "src/compiler/node-matchers.h" 10 #include "src/compiler/node-matchers.h"
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 __ Assert(eq, kWrongFunctionContext); 350 __ Assert(eq, kWrongFunctionContext);
351 } 351 }
352 __ Ldr(x10, FieldMemOperand(func, JSFunction::kCodeEntryOffset)); 352 __ Ldr(x10, FieldMemOperand(func, JSFunction::kCodeEntryOffset));
353 __ Call(x10); 353 __ Call(x10);
354 AddSafepointAndDeopt(instr); 354 AddSafepointAndDeopt(instr);
355 break; 355 break;
356 } 356 }
357 case kArchJmp: 357 case kArchJmp:
358 AssembleArchJump(i.InputRpo(0)); 358 AssembleArchJump(i.InputRpo(0));
359 break; 359 break;
360 case kArchSwitch: 360 case kArchTableSwitch:
361 AssembleArchSwitch(instr); 361 AssembleArchTableSwitch(instr);
362 break;
363 case kArchLookupSwitch:
364 AssembleArchLookupSwitch(instr);
362 break; 365 break;
363 case kArchNop: 366 case kArchNop:
364 // don't emit code for nops. 367 // don't emit code for nops.
365 break; 368 break;
366 case kArchRet: 369 case kArchRet:
367 AssembleReturn(); 370 AssembleReturn();
368 break; 371 break;
369 case kArchStackPointer: 372 case kArchStackPointer:
370 __ mov(i.OutputRegister(), masm()->StackPointer()); 373 __ mov(i.OutputRegister(), masm()->StackPointer());
371 break; 374 break;
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 } 837 }
835 if (!branch->fallthru) __ B(flabel); // no fallthru to flabel. 838 if (!branch->fallthru) __ B(flabel); // no fallthru to flabel.
836 } 839 }
837 840
838 841
839 void CodeGenerator::AssembleArchJump(BasicBlock::RpoNumber target) { 842 void CodeGenerator::AssembleArchJump(BasicBlock::RpoNumber target) {
840 if (!IsNextInAssemblyOrder(target)) __ B(GetLabel(target)); 843 if (!IsNextInAssemblyOrder(target)) __ B(GetLabel(target));
841 } 844 }
842 845
843 846
844 void CodeGenerator::AssembleArchSwitch(Instruction* instr) {
845 Arm64OperandConverter i(this, instr);
846 UseScratchRegisterScope scope(masm());
847 Register reg = i.InputRegister(0);
848 Register tmp = scope.AcquireX();
849 Label table;
850 __ Adr(tmp, &table);
851 __ Add(tmp, tmp, Operand(reg, LSL, 2));
852 __ Br(tmp);
853 __ Bind(&table);
854 for (size_t index = 1; index < instr->InputCount(); ++index) {
855 __ B(GetLabel(i.InputRpo(index)));
856 }
857 }
858
859
860 // Assemble boolean materializations after this instruction. 847 // Assemble boolean materializations after this instruction.
861 void CodeGenerator::AssembleArchBoolean(Instruction* instr, 848 void CodeGenerator::AssembleArchBoolean(Instruction* instr,
862 FlagsCondition condition) { 849 FlagsCondition condition) {
863 Arm64OperandConverter i(this, instr); 850 Arm64OperandConverter i(this, instr);
864 851
865 // Materialize a full 64-bit 1 or 0 value. The result register is always the 852 // Materialize a full 64-bit 1 or 0 value. The result register is always the
866 // last output of the instruction. 853 // last output of the instruction.
867 DCHECK_NE(0u, instr->OutputCount()); 854 DCHECK_NE(0u, instr->OutputCount());
868 Register reg = i.OutputRegister(instr->OutputCount() - 1); 855 Register reg = i.OutputRegister(instr->OutputCount() - 1);
869 Condition cc = FlagsConditionToCondition(condition); 856 Condition cc = FlagsConditionToCondition(condition);
870 __ Cset(reg, cc); 857 __ Cset(reg, cc);
871 } 858 }
872 859
873 860
861 void CodeGenerator::AssembleArchLookupSwitch(Instruction* instr) {
862 Arm64OperandConverter i(this, instr);
863 Register input = i.InputRegister32(0);
864 for (size_t index = 2; index < instr->InputCount(); index += 2) {
865 __ Cmp(input, i.InputInt32(index + 0));
866 __ B(eq, GetLabel(i.InputRpo(index + 1)));
867 }
868 AssembleArchJump(i.InputRpo(1));
869 }
870
871
872 void CodeGenerator::AssembleArchTableSwitch(Instruction* instr) {
873 Arm64OperandConverter i(this, instr);
874 UseScratchRegisterScope scope(masm());
875 Register input = i.InputRegister32(0);
876 Register temp = scope.AcquireX();
877 size_t const case_count = instr->InputCount() - 2;
878 Label table;
879 __ Cmp(input, case_count);
880 __ B(hs, GetLabel(i.InputRpo(1)));
881 __ Adr(temp, &table);
882 __ Add(temp, temp, Operand(input, UXTW, 2));
883 __ Br(temp);
884 __ StartBlockPools();
885 __ Bind(&table);
886 for (size_t index = 0; index < case_count; ++index) {
887 __ B(GetLabel(i.InputRpo(index + 2)));
888 }
889 __ EndBlockPools();
890 }
891
892
874 void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { 893 void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) {
875 Address deopt_entry = Deoptimizer::GetDeoptimizationEntry( 894 Address deopt_entry = Deoptimizer::GetDeoptimizationEntry(
876 isolate(), deoptimization_id, Deoptimizer::LAZY); 895 isolate(), deoptimization_id, Deoptimizer::LAZY);
877 __ Call(deopt_entry, RelocInfo::RUNTIME_ENTRY); 896 __ Call(deopt_entry, RelocInfo::RUNTIME_ENTRY);
878 } 897 }
879 898
880 899
881 // TODO(dcarney): increase stack slots in frame once before first use. 900 // TODO(dcarney): increase stack slots in frame once before first use.
882 static int AlignedStackSlots(int stack_slots) { 901 static int AlignedStackSlots(int stack_slots) {
883 if (stack_slots & 1) stack_slots++; 902 if (stack_slots & 1) stack_slots++;
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
1134 } 1153 }
1135 } 1154 }
1136 MarkLazyDeoptSite(); 1155 MarkLazyDeoptSite();
1137 } 1156 }
1138 1157
1139 #undef __ 1158 #undef __
1140 1159
1141 } // namespace compiler 1160 } // namespace compiler
1142 } // namespace internal 1161 } // namespace internal
1143 } // namespace v8 1162 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/arm/instruction-selector-arm.cc ('k') | src/compiler/arm64/instruction-selector-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698