From: akos.palfi Date: Tue, 10 Feb 2015 04:02:18 +0000 (-0800) Subject: MIPS: [turbofan] Initial support for Switch. X-Git-Tag: upstream/4.7.83~4505 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0b692450c32f42f3859c4e0750310fcc225a29b9;p=platform%2Fupstream%2Fv8.git MIPS: [turbofan] Initial support for Switch. Port feb2890711e8072a9550abb89621929816fc9699 Original commit message: Adds Switch and Case operators to TurboFan and handles them appropriately in instruction selection and code generation. BUG= Review URL: https://codereview.chromium.org/896973005 Cr-Commit-Position: refs/heads/master@{#26535} --- diff --git a/src/compiler/mips/code-generator-mips.cc b/src/compiler/mips/code-generator-mips.cc index a9cb811..3353aab 100644 --- a/src/compiler/mips/code-generator-mips.cc +++ b/src/compiler/mips/code-generator-mips.cc @@ -428,6 +428,9 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { case kArchJmp: AssembleArchJump(i.InputRpo(0)); break; + case kArchSwitch: + AssembleArchSwitch(instr); + break; case kArchNop: // don't emit code for nops. break; @@ -802,6 +805,28 @@ void CodeGenerator::AssembleArchJump(BasicBlock::RpoNumber target) { } +void CodeGenerator::AssembleArchSwitch(Instruction* instr) { + MipsOperandConverter i(this, instr); + int const kNumLabels = static_cast(instr->InputCount() - 1); + v8::internal::Assembler::BlockTrampolinePoolScope block_trampoline_pool( + masm()); + Label here; + + __ bal(&here); + __ nop(); // Branch delay slot nop. + __ bind(&here); + __ sll(at, i.InputRegister(0), 2); + __ addu(at, at, ra); + __ lw(at, MemOperand(at, 5 * v8::internal::Assembler::kInstrSize)); + __ jr(at); + __ nop(); // Branch delay slot nop. + + for (int index = 0; index < kNumLabels; ++index) { + __ dd(GetLabel(i.InputRpo(index + 1))); + } +} + + // Assembles boolean materializations after an instruction. void CodeGenerator::AssembleArchBoolean(Instruction* instr, FlagsCondition condition) { @@ -1126,6 +1151,12 @@ void CodeGenerator::AssembleSwap(InstructionOperand* source, } +void CodeGenerator::AssembleJumpTable(Label** targets, size_t target_count) { + // On 32-bit MIPS we emit the jump tables inline. + UNREACHABLE(); +} + + void CodeGenerator::AddNopForSmiCodeInlining() { // Unused on 32-bit ARM. Still exists on 64-bit arm. // TODO(plind): Unclear when this is called now. Understand, fix if needed.