| Index: src/compiler/code-generator.cc
|
| diff --git a/src/compiler/code-generator.cc b/src/compiler/code-generator.cc
|
| index 3a56ece0c0cf794fe97a4a53ea562d875d2df43d..67dd1eca293655a597f0713406211a0f23f11511 100644
|
| --- a/src/compiler/code-generator.cc
|
| +++ b/src/compiler/code-generator.cc
|
| @@ -12,6 +12,24 @@ namespace v8 {
|
| namespace internal {
|
| namespace compiler {
|
|
|
| +class CodeGenerator::JumpTable FINAL : public ZoneObject {
|
| + public:
|
| + JumpTable(JumpTable* next, Label** targets, size_t target_count)
|
| + : next_(next), targets_(targets), target_count_(target_count) {}
|
| +
|
| + Label* label() { return &label_; }
|
| + JumpTable* next() const { return next_; }
|
| + Label** targets() const { return targets_; }
|
| + size_t target_count() const { return target_count_; }
|
| +
|
| + private:
|
| + Label label_;
|
| + JumpTable* const next_;
|
| + Label** const targets_;
|
| + size_t const target_count_;
|
| +};
|
| +
|
| +
|
| CodeGenerator::CodeGenerator(Frame* frame, Linkage* linkage,
|
| InstructionSequence* code, CompilationInfo* info)
|
| : frame_(frame),
|
| @@ -28,6 +46,7 @@ CodeGenerator::CodeGenerator(Frame* frame, Linkage* linkage,
|
| deoptimization_literals_(code->zone()),
|
| translations_(code->zone()),
|
| last_lazy_deopt_pc_(0),
|
| + jump_tables_(nullptr),
|
| ools_(nullptr),
|
| osr_pc_offset_(-1) {
|
| for (int i = 0; i < code->InstructionBlockCount(); ++i) {
|
| @@ -81,7 +100,7 @@ Handle<Code> CodeGenerator::GenerateCode() {
|
| for (OutOfLineCode* ool = ools_; ool; ool = ool->next()) {
|
| masm()->bind(ool->entry());
|
| ool->Generate();
|
| - masm()->jmp(ool->exit());
|
| + if (ool->exit()->is_bound()) masm()->jmp(ool->exit());
|
| }
|
| }
|
|
|
| @@ -95,6 +114,15 @@ Handle<Code> CodeGenerator::GenerateCode() {
|
|
|
| FinishCode(masm());
|
|
|
| + // Emit the jump tables.
|
| + if (jump_tables_) {
|
| + masm()->Align(kPointerSize);
|
| + for (JumpTable* table = jump_tables_; table; table = table->next()) {
|
| + masm()->bind(table->label());
|
| + AssembleJumpTable(table->targets(), table->target_count());
|
| + }
|
| + }
|
| +
|
| safepoints()->Emit(masm(), frame()->GetSpillSlotCount());
|
|
|
| // TODO(titzer): what are the right code flags here?
|
| @@ -292,6 +320,12 @@ void CodeGenerator::PopulateDeoptimizationData(Handle<Code> code_object) {
|
| }
|
|
|
|
|
| +Label* CodeGenerator::AddJumpTable(Label** targets, size_t target_count) {
|
| + jump_tables_ = new (zone()) JumpTable(jump_tables_, targets, target_count);
|
| + return jump_tables_->label();
|
| +}
|
| +
|
| +
|
| void CodeGenerator::AddSafepointAndDeopt(Instruction* instr) {
|
| CallDescriptor::Flags flags(MiscField::decode(instr->opcode()));
|
|
|
|
|