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/x64/lithium-codegen-x64.cc

Issue 6201006: X64 Crankshaft: Ported lots of boilerplate code. (Closed)
Patch Set: Addressed review comments. Updated to match newest ia32 version. Created 9 years, 11 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
« no previous file with comments | « src/x64/lithium-codegen-x64.h ('k') | src/x64/lithium-x64.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 17 matching lines...) Expand all
28 #include "x64/lithium-codegen-x64.h" 28 #include "x64/lithium-codegen-x64.h"
29 #include "code-stubs.h" 29 #include "code-stubs.h"
30 #include "stub-cache.h" 30 #include "stub-cache.h"
31 31
32 namespace v8 { 32 namespace v8 {
33 namespace internal { 33 namespace internal {
34 34
35 35
36 #define __ masm()-> 36 #define __ masm()->
37 37
38 bool LCodeGen::GenerateCode() {
39 HPhase phase("Code generation", chunk());
40 ASSERT(is_unused());
41 status_ = GENERATING;
42 return GeneratePrologue() &&
43 GenerateBody() &&
44 GenerateDeferredCode() &&
45 GenerateSafepointTable();
46 }
47
48
49 void LCodeGen::FinishCode(Handle<Code> code) {
50 ASSERT(is_done());
51 code->set_stack_slots(StackSlotCount());
52 code->set_safepoint_table_start(safepoints_.GetCodeOffset());
53 PopulateDeoptimizationData(code);
54 }
55
56
57 void LCodeGen::Abort(const char* format, ...) {
58 if (FLAG_trace_bailout) {
59 SmartPointer<char> debug_name = graph()->debug_name()->ToCString();
60 PrintF("Aborting LCodeGen in @\"%s\": ", *debug_name);
61 va_list arguments;
62 va_start(arguments, format);
63 OS::VPrint(format, arguments);
64 va_end(arguments);
65 PrintF("\n");
66 }
67 status_ = ABORTED;
68 }
69
70
71 void LCodeGen::Comment(const char* format, ...) {
72 Abort("Unimplemented: %s", "Comment");
73 }
74
75
76 bool LCodeGen::GeneratePrologue() {
77 Abort("Unimplemented: %s", "GeneratePrologue");
78 return !is_aborted();
79 }
80
81
82 bool LCodeGen::GenerateBody() {
83 ASSERT(is_generating());
84 bool emit_instructions = true;
85 for (current_instruction_ = 0;
86 !is_aborted() && current_instruction_ < instructions_->length();
87 current_instruction_++) {
88 LInstruction* instr = instructions_->at(current_instruction_);
89 if (instr->IsLabel()) {
90 LLabel* label = LLabel::cast(instr);
91 emit_instructions = !label->HasReplacement();
92 }
93
94 if (emit_instructions) {
95 Comment(";;; @%d: %s.", current_instruction_, instr->Mnemonic());
96 instr->CompileToNative(this);
97 }
98 }
99 return !is_aborted();
100 }
101
102
103 LInstruction* LCodeGen::GetNextInstruction() {
104 if (current_instruction_ < instructions_->length() - 1) {
105 return instructions_->at(current_instruction_ + 1);
106 } else {
107 return NULL;
108 }
109 }
110
111
112 bool LCodeGen::GenerateDeferredCode() {
113 ASSERT(is_generating());
114 for (int i = 0; !is_aborted() && i < deferred_.length(); i++) {
115 LDeferredCode* code = deferred_[i];
116 __ bind(code->entry());
117 code->Generate();
118 __ jmp(code->exit());
119 }
120
121 // Deferred code is the last part of the instruction sequence. Mark
122 // the generated code as done unless we bailed out.
123 if (!is_aborted()) status_ = DONE;
124 return !is_aborted();
125 }
126
127
128 bool LCodeGen::GenerateSafepointTable() {
129 Abort("Unimplemented: %s", "GeneratePrologue");
130 return !is_aborted();
131 }
132
133
134 Register LCodeGen::ToRegister(int index) const {
135 return Register::FromAllocationIndex(index);
136 }
137
138
139 XMMRegister LCodeGen::ToDoubleRegister(int index) const {
140 return XMMRegister::FromAllocationIndex(index);
141 }
142
143
144 Register LCodeGen::ToRegister(LOperand* op) const {
145 ASSERT(op->IsRegister());
146 return ToRegister(op->index());
147 }
148
149
150 XMMRegister LCodeGen::ToDoubleRegister(LOperand* op) const {
151 ASSERT(op->IsDoubleRegister());
152 return ToDoubleRegister(op->index());
153 }
154
155
156 int LCodeGen::ToInteger32(LConstantOperand* op) const {
157 Handle<Object> value = chunk_->LookupLiteral(op);
158 ASSERT(chunk_->LookupLiteralRepresentation(op).IsInteger32());
159 ASSERT(static_cast<double>(static_cast<int32_t>(value->Number())) ==
160 value->Number());
161 return static_cast<int32_t>(value->Number());
162 }
163
164
165 Operand LCodeGen::ToOperand(LOperand* op) const {
166 // Does not handle registers. In X64 assembler, plain registers are not
167 // representable as an Operand.
168 ASSERT(op->IsStackSlot() || op->IsDoubleStackSlot());
169 int index = op->index();
170 if (index >= 0) {
171 // Local or spill slot. Skip the frame pointer, function, and
172 // context in the fixed part of the frame.
173 return Operand(rbp, -(index + 3) * kPointerSize);
174 } else {
175 // Incoming parameter. Skip the return address.
176 return Operand(rbp, -(index - 1) * kPointerSize);
177 }
178 }
179
38 180
39 void LCodeGen::WriteTranslation(LEnvironment* environment, 181 void LCodeGen::WriteTranslation(LEnvironment* environment,
40 Translation* translation) { 182 Translation* translation) {
41 if (environment == NULL) return; 183 if (environment == NULL) return;
42 184
43 // The translation includes one command per value in the environment. 185 // The translation includes one command per value in the environment.
44 int translation_size = environment->values()->length(); 186 int translation_size = environment->values()->length();
45 // The output frame height does not include the parameters. 187 // The output frame height does not include the parameters.
46 int height = translation_size - environment->parameter_count(); 188 int height = translation_size - environment->parameter_count();
47 189
(...skipping 20 matching lines...) Expand all
68 environment->spilled_double_registers()[value->index()], 210 environment->spilled_double_registers()[value->index()],
69 false); 211 false);
70 } 212 }
71 } 213 }
72 214
73 AddToTranslation(translation, value, environment->HasTaggedValueAt(i)); 215 AddToTranslation(translation, value, environment->HasTaggedValueAt(i));
74 } 216 }
75 } 217 }
76 218
77 219
220 void LCodeGen::AddToTranslation(Translation* translation,
221 LOperand* op,
222 bool is_tagged) {
223 if (op == NULL) {
224 // TODO(twuerthinger): Introduce marker operands to indicate that this value
225 // is not present and must be reconstructed from the deoptimizer. Currently
226 // this is only used for the arguments object.
227 translation->StoreArgumentsObject();
228 } else if (op->IsStackSlot()) {
229 if (is_tagged) {
230 translation->StoreStackSlot(op->index());
231 } else {
232 translation->StoreInt32StackSlot(op->index());
233 }
234 } else if (op->IsDoubleStackSlot()) {
235 translation->StoreDoubleStackSlot(op->index());
236 } else if (op->IsArgument()) {
237 ASSERT(is_tagged);
238 int src_index = StackSlotCount() + op->index();
239 translation->StoreStackSlot(src_index);
240 } else if (op->IsRegister()) {
241 Register reg = ToRegister(op);
242 if (is_tagged) {
243 translation->StoreRegister(reg);
244 } else {
245 translation->StoreInt32Register(reg);
246 }
247 } else if (op->IsDoubleRegister()) {
248 XMMRegister reg = ToDoubleRegister(op);
249 translation->StoreDoubleRegister(reg);
250 } else if (op->IsConstantOperand()) {
251 Handle<Object> literal = chunk()->LookupLiteral(LConstantOperand::cast(op));
252 int src_index = DefineDeoptimizationLiteral(literal);
253 translation->StoreLiteral(src_index);
254 } else {
255 UNREACHABLE();
256 }
257 }
258
259
260 void LCodeGen::CallCode(Handle<Code> code,
261 RelocInfo::Mode mode,
262 LInstruction* instr) {
263 Abort("Unimplemented: %s", "CallCode");
264 }
265
266
267 void LCodeGen::CallRuntime(Runtime::Function* function,
268 int num_arguments,
269 LInstruction* instr) {
270 Abort("Unimplemented: %s", "CallRuntime");
271 }
272
273
274 void LCodeGen::RegisterLazyDeoptimization(LInstruction* instr) {
275 // Create the environment to bailout to. If the call has side effects
276 // execution has to continue after the call otherwise execution can continue
277 // from a previous bailout point repeating the call.
278 LEnvironment* deoptimization_environment;
279 if (instr->HasDeoptimizationEnvironment()) {
280 deoptimization_environment = instr->deoptimization_environment();
281 } else {
282 deoptimization_environment = instr->environment();
283 }
284
285 RegisterEnvironmentForDeoptimization(deoptimization_environment);
286 RecordSafepoint(instr->pointer_map(),
287 deoptimization_environment->deoptimization_index());
288 }
289
290
291 void LCodeGen::RegisterEnvironmentForDeoptimization(LEnvironment* environment) {
292 Abort("Unimplemented: %s", "RegisterEnvironmentForDeoptimization");
293 }
294
295
296 void LCodeGen::DeoptimizeIf(Condition cc, LEnvironment* environment) {
297 Abort("Unimplemented: %s", "Deoptimiz");
298 }
299
300
301 void LCodeGen::PopulateDeoptimizationData(Handle<Code> code) {
302 int length = deoptimizations_.length();
303 if (length == 0) return;
304 ASSERT(FLAG_deopt);
305 Handle<DeoptimizationInputData> data =
306 Factory::NewDeoptimizationInputData(length, TENURED);
307
308 data->SetTranslationByteArray(*translations_.CreateByteArray());
309 data->SetInlinedFunctionCount(Smi::FromInt(inlined_function_count_));
310
311 Handle<FixedArray> literals =
312 Factory::NewFixedArray(deoptimization_literals_.length(), TENURED);
313 for (int i = 0; i < deoptimization_literals_.length(); i++) {
314 literals->set(i, *deoptimization_literals_[i]);
315 }
316 data->SetLiteralArray(*literals);
317
318 data->SetOsrAstId(Smi::FromInt(info_->osr_ast_id()));
319 data->SetOsrPcOffset(Smi::FromInt(osr_pc_offset_));
320
321 // Populate the deoptimization entries.
322 for (int i = 0; i < length; i++) {
323 LEnvironment* env = deoptimizations_[i];
324 data->SetAstId(i, Smi::FromInt(env->ast_id()));
325 data->SetTranslationIndex(i, Smi::FromInt(env->translation_index()));
326 data->SetArgumentsStackHeight(i,
327 Smi::FromInt(env->arguments_stack_height()));
328 }
329 code->set_deoptimization_data(*data);
330 }
331
332
333 int LCodeGen::DefineDeoptimizationLiteral(Handle<Object> literal) {
334 int result = deoptimization_literals_.length();
335 for (int i = 0; i < deoptimization_literals_.length(); ++i) {
336 if (deoptimization_literals_[i].is_identical_to(literal)) return i;
337 }
338 deoptimization_literals_.Add(literal);
339 return result;
340 }
341
342
343 void LCodeGen::PopulateDeoptimizationLiteralsWithInlinedFunctions() {
344 ASSERT(deoptimization_literals_.length() == 0);
345
346 const ZoneList<Handle<JSFunction> >* inlined_closures =
347 chunk()->inlined_closures();
348
349 for (int i = 0, length = inlined_closures->length();
350 i < length;
351 i++) {
352 DefineDeoptimizationLiteral(inlined_closures->at(i));
353 }
354
355 inlined_function_count_ = deoptimization_literals_.length();
356 }
357
358
359 void LCodeGen::RecordSafepoint(LPointerMap* pointers,
360 int deoptimization_index) {
361 const ZoneList<LOperand*>* operands = pointers->operands();
362 Safepoint safepoint = safepoints_.DefineSafepoint(masm(),
363 deoptimization_index);
364 for (int i = 0; i < operands->length(); i++) {
365 LOperand* pointer = operands->at(i);
366 if (pointer->IsStackSlot()) {
367 safepoint.DefinePointerSlot(pointer->index());
368 }
369 }
370 }
371
372
373 void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers,
374 int arguments,
375 int deoptimization_index) {
376 const ZoneList<LOperand*>* operands = pointers->operands();
377 Safepoint safepoint =
378 safepoints_.DefineSafepointWithRegisters(
379 masm(), arguments, deoptimization_index);
380 for (int i = 0; i < operands->length(); i++) {
381 LOperand* pointer = operands->at(i);
382 if (pointer->IsStackSlot()) {
383 safepoint.DefinePointerSlot(pointer->index());
384 } else if (pointer->IsRegister()) {
385 safepoint.DefinePointerRegister(ToRegister(pointer));
386 }
387 }
388 // Register rsi always contains a pointer to the context.
389 safepoint.DefinePointerRegister(rsi);
390 }
391
392
393 void LCodeGen::RecordPosition(int position) {
394 if (!FLAG_debug_info || position == RelocInfo::kNoPosition) return;
395 masm()->positions_recorder()->RecordPosition(position);
396 }
397
398
399 void LCodeGen::DoLabel(LLabel* label) {
400 if (label->is_loop_header()) {
401 Comment(";;; B%d - LOOP entry", label->block_id());
402 } else {
403 Comment(";;; B%d", label->block_id());
404 }
405 __ bind(label->label());
406 current_block_ = label->block_id();
407 LCodeGen::DoGap(label);
408 }
409
410
411 void LCodeGen::DoParallelMove(LParallelMove* move) {
412 Abort("Unimplemented: %s", "DoParallelMove");
413 }
414
415
416 void LCodeGen::DoGap(LGap* gap) {
417 for (int i = LGap::FIRST_INNER_POSITION;
418 i <= LGap::LAST_INNER_POSITION;
419 i++) {
420 LGap::InnerPosition inner_pos = static_cast<LGap::InnerPosition>(i);
421 LParallelMove* move = gap->GetParallelMove(inner_pos);
422 if (move != NULL) DoParallelMove(move);
423 }
424
425 LInstruction* next = GetNextInstruction();
426 if (next != NULL && next->IsLazyBailout()) {
427 int pc = masm()->pc_offset();
428 safepoints_.SetPcAfterGap(pc);
429 }
430 }
431
432
433 void LCodeGen::DoParameter(LParameter* instr) {
434 // Nothing to do.
435 }
436
437
438 void LCodeGen::DoCallStub(LCallStub* instr) {
439 Abort("Unimplemented: %s", "DoCallStub");
440 }
441
442
443 void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) {
444 // Nothing to do.
445 }
446
447
448 void LCodeGen::DoModI(LModI* instr) {
449 Abort("Unimplemented: %s", "DoModI");
450 }
451
452
453 void LCodeGen::DoDivI(LDivI* instr) {
454 Abort("Unimplemented: %s", "DoDivI");}
455
456
457 void LCodeGen::DoMulI(LMulI* instr) {
458 Abort("Unimplemented: %s", "DoMultI");}
459
460
461 void LCodeGen::DoBitI(LBitI* instr) {
462 Abort("Unimplemented: %s", "DoBitI");}
463
464
465 void LCodeGen::DoShiftI(LShiftI* instr) {
466 Abort("Unimplemented: %s", "DoShiftI");
467 }
468
469
470 void LCodeGen::DoSubI(LSubI* instr) {
471 Abort("Unimplemented: %s", "DoSubI");
472 }
473
474
475 void LCodeGen::DoConstantI(LConstantI* instr) {
476 Abort("Unimplemented: %s", "DoConstantI");
477 }
478
479
480 void LCodeGen::DoConstantD(LConstantD* instr) {
481 Abort("Unimplemented: %s", "DoConstantI");
482 }
483
484
485 void LCodeGen::DoConstantT(LConstantT* instr) {
486 Abort("Unimplemented: %s", "DoConstantT");
487 }
488
489
490 void LCodeGen::DoJSArrayLength(LJSArrayLength* instr) {
491 Abort("Unimplemented: %s", "DoJSArrayLength");
492 }
493
494
495 void LCodeGen::DoFixedArrayLength(LFixedArrayLength* instr) {
496 Abort("Unimplemented: %s", "DoFixedArrayLength");
497 }
498
499
500 void LCodeGen::DoValueOf(LValueOf* instr) {
501 Abort("Unimplemented: %s", "DoValueOf");
502 }
503
504
505 void LCodeGen::DoBitNotI(LBitNotI* instr) {
506 Abort("Unimplemented: %s", "DoBitNotI");
507 }
508
509
510 void LCodeGen::DoThrow(LThrow* instr) {
511 Abort("Unimplemented: %s", "DoThrow");
512 }
513
514
515 void LCodeGen::DoAddI(LAddI* instr) {
516 Abort("Unimplemented: %s", "DoAddI");
517 }
518
519
520 void LCodeGen::DoArithmeticD(LArithmeticD* instr) {
521 Abort("Unimplemented: %s", "DoArithmeticD");
522 }
523
524
525 void LCodeGen::DoArithmeticT(LArithmeticT* instr) {
526 Abort("Unimplemented: %s", "DoArithmeticT");
527 }
528
529
530 int LCodeGen::GetNextEmittedBlock(int block) {
531 for (int i = block + 1; i < graph()->blocks()->length(); ++i) {
532 LLabel* label = chunk_->GetLabel(i);
533 if (!label->HasReplacement()) return i;
534 }
535 return -1;
536 }
537
538
539 void LCodeGen::EmitBranch(int left_block, int right_block, Condition cc) {
540 Abort("Unimplemented: %s", "EmitBranch");
541 }
542
543
544 void LCodeGen::DoBranch(LBranch* instr) {
545 Abort("Unimplemented: %s", "DoBranch");
546 }
547
548
549 void LCodeGen::EmitGoto(int block, LDeferredCode* deferred_stack_check) {
550 Abort("Unimplemented: %s", "EmitGoto");
551 }
552
553
554 void LCodeGen::DoDeferredStackCheck(LGoto* instr) {
555 Abort("Unimplemented: %s", "DoDeferredStackCheck");
556 }
557
558
559 void LCodeGen::DoGoto(LGoto* instr) {
560 Abort("Unimplemented: %s", "DoGoto");
561 }
562
563
564 Condition LCodeGen::TokenToCondition(Token::Value op, bool is_unsigned) {
565 Condition cond = no_condition;
566 switch (op) {
567 case Token::EQ:
568 case Token::EQ_STRICT:
569 cond = equal;
570 break;
571 case Token::LT:
572 cond = is_unsigned ? below : less;
573 break;
574 case Token::GT:
575 cond = is_unsigned ? above : greater;
576 break;
577 case Token::LTE:
578 cond = is_unsigned ? below_equal : less_equal;
579 break;
580 case Token::GTE:
581 cond = is_unsigned ? above_equal : greater_equal;
582 break;
583 case Token::IN:
584 case Token::INSTANCEOF:
585 default:
586 UNREACHABLE();
587 }
588 return cond;
589 }
590
591
592 void LCodeGen::EmitCmpI(LOperand* left, LOperand* right) {
593 Abort("Unimplemented: %s", "EmitCmpI");
594 }
595
596
597 void LCodeGen::DoCmpID(LCmpID* instr) {
598 Abort("Unimplemented: %s", "DoCmpID");
599 }
600
601
602 void LCodeGen::DoCmpIDAndBranch(LCmpIDAndBranch* instr) {
603 Abort("Unimplemented: %s", "DoCmpIDAndBranch");
604 }
605
606
607 void LCodeGen::DoCmpJSObjectEq(LCmpJSObjectEq* instr) {
608 Abort("Unimplemented: %s", "DoCmpJSObjectEq");
609 }
610
611
612 void LCodeGen::DoCmpJSObjectEqAndBranch(LCmpJSObjectEqAndBranch* instr) {
613 Abort("Unimplemented: %s", "DoCmpJSObjectAndBranch");
614 }
615
616
617 void LCodeGen::DoIsNull(LIsNull* instr) {
618 Abort("Unimplemented: %s", "DoIsNull");
619 }
620
621
622 void LCodeGen::DoIsNullAndBranch(LIsNullAndBranch* instr) {
623 Abort("Unimplemented: %s", "DoIsNullAndBranch");
624 }
625
626
627 Condition LCodeGen::EmitIsObject(Register input,
628 Register temp1,
629 Register temp2,
630 Label* is_not_object,
631 Label* is_object) {
632 Abort("Unimplemented: %s", "EmitIsObject");
633 return below_equal;
634 }
635
636
637 void LCodeGen::DoIsObject(LIsObject* instr) {
638 Abort("Unimplemented: %s", "DoIsObject");
639 }
640
641
642 void LCodeGen::DoIsObjectAndBranch(LIsObjectAndBranch* instr) {
643 Abort("Unimplemented: %s", "DoIsObjectAndBranch");
644 }
645
646
647 void LCodeGen::DoIsSmi(LIsSmi* instr) {
648 Abort("Unimplemented: %s", "DoIsSmi");
649 }
650
651
652 void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) {
653 Abort("Unimplemented: %s", "DoIsSmiAndBranch");
654 }
655
656
657 InstanceType LHasInstanceType::TestType() {
658 InstanceType from = hydrogen()->from();
659 InstanceType to = hydrogen()->to();
660 if (from == FIRST_TYPE) return to;
661 ASSERT(from == to || to == LAST_TYPE);
662 return from;
663 }
664
665
666
667 Condition LHasInstanceType::BranchCondition() {
668 InstanceType from = hydrogen()->from();
669 InstanceType to = hydrogen()->to();
670 if (from == to) return equal;
671 if (to == LAST_TYPE) return above_equal;
672 if (from == FIRST_TYPE) return below_equal;
673 UNREACHABLE();
674 return equal;
675 }
676
677
678 void LCodeGen::DoHasInstanceType(LHasInstanceType* instr) {
679 Abort("Unimplemented: %s", "DoHasInstanceType");
680 }
681
682
683 void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) {
684 Abort("Unimplemented: %s", "DoHasInstanceTypeAndBranch");
685 }
686
687
688 void LCodeGen::DoHasCachedArrayIndex(LHasCachedArrayIndex* instr) {
689 Abort("Unimplemented: %s", "DoHasCachedArrayIndex");
690 }
691
692
693 void LCodeGen::DoHasCachedArrayIndexAndBranch(
694 LHasCachedArrayIndexAndBranch* instr) {
695 Abort("Unimplemented: %s", "DoHasCachedArrayIndexAndBranch");
696 }
697
698
699 // Branches to a label or falls through with the answer in the z flag. Trashes
700 // the temp registers, but not the input. Only input and temp2 may alias.
701 void LCodeGen::EmitClassOfTest(Label* is_true,
702 Label* is_false,
703 Handle<String>class_name,
704 Register input,
705 Register temp,
706 Register temp2) {
707 Abort("Unimplemented: %s", "EmitClassOfTest");
708 }
709
710
711 void LCodeGen::DoClassOfTest(LClassOfTest* instr) {
712 Abort("Unimplemented: %s", "DoClassOfTest");
713 }
714
715
716 void LCodeGen::DoClassOfTestAndBranch(LClassOfTestAndBranch* instr) {
717 Abort("Unimplemented: %s", "DoClassOfTestAndBranch");
718 }
719
720
721 void LCodeGen::DoCmpMapAndBranch(LCmpMapAndBranch* instr) {
722 Abort("Unimplemented: %s", "DoCmpMapAndBranch");
723 }
724
725
726 void LCodeGen::DoInstanceOf(LInstanceOf* instr) {
727 Abort("Unimplemented: %s", "DoInstanceOf");
728 }
729
730
731 void LCodeGen::DoInstanceOfAndBranch(LInstanceOfAndBranch* instr) {
732 Abort("Unimplemented: %s", "DoInstanceOfAndBranch");
733 }
734
735
736 void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) {
737 Abort("Unimplemented: %s", "DoInstanceOfKnowGLobal");
738 }
739
740
741 void LCodeGen::DoDeferredLInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
742 Label* map_check) {
743 Abort("Unimplemented: %s", "DoDeferredLInstanceOfKnownGlobakl");
744 }
745
746
747 void LCodeGen::DoCmpT(LCmpT* instr) {
748 Abort("Unimplemented: %s", "DoCmpT");
749 }
750
751
752 void LCodeGen::DoCmpTAndBranch(LCmpTAndBranch* instr) {
753 Abort("Unimplemented: %s", "DoCmpTAndBranch");
754 }
755
756
757 void LCodeGen::DoReturn(LReturn* instr) {
758 Abort("Unimplemented: %s", "DoReturn");
759 }
760
761
762 void LCodeGen::DoLoadGlobal(LLoadGlobal* instr) {
763 Abort("Unimplemented: %s", "DoLoadGlobal");
764 }
765
766
767 void LCodeGen::DoStoreGlobal(LStoreGlobal* instr) {
768 Abort("Unimplemented: %s", "DoStoreGlobal");
769 }
770
771
772 void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
773 Abort("Unimplemented: %s", "DoLoadNamedField");
774 }
775
776
777 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) {
778 Abort("Unimplemented: %s", "DoLoadNamedGeneric");
779 }
780
781
782 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) {
783 Abort("Unimplemented: %s", "DoLoadFunctionPrototype");
784 }
785
786
787 void LCodeGen::DoLoadElements(LLoadElements* instr) {
788 Abort("Unimplemented: %s", "DoLoadElements");
789 }
790
791
792 void LCodeGen::DoAccessArgumentsAt(LAccessArgumentsAt* instr) {
793 Abort("Unimplemented: %s", "DoAccessArgumentsAt");
794 }
795
796
797 void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) {
798 Abort("Unimplemented: %s", "DoLoadKeyedFastElement");
799 }
800
801
802 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) {
803 Abort("Unimplemented: %s", "DoLoadKeyedGeneric");
804 }
805
806
807 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) {
808 Abort("Unimplemented: %s", "DoArgumentsElements");
809 }
810
811
812 void LCodeGen::DoArgumentsLength(LArgumentsLength* instr) {
813 Abort("Unimplemented: %s", "DoArgumentsLength");
814 }
815
816
817 void LCodeGen::DoApplyArguments(LApplyArguments* instr) {
818 Abort("Unimplemented: %s", "DoApplyArguments");
819 }
820
821
822 void LCodeGen::DoPushArgument(LPushArgument* instr) {
823 Abort("Unimplemented: %s", "DoPushArgument");
824 }
825
826
827 void LCodeGen::DoGlobalObject(LGlobalObject* instr) {
828 Abort("Unimplemented: %s", "DoGlobalObject");
829 }
830
831
832 void LCodeGen::DoGlobalReceiver(LGlobalReceiver* instr) {
833 Abort("Unimplemented: %s", "DoGlobalReceiver");
834 }
835
836
837 void LCodeGen::CallKnownFunction(Handle<JSFunction> function,
838 int arity,
839 LInstruction* instr) {
840 Abort("Unimplemented: %s", "CallKnownFunction");
841 }
842
843
844 void LCodeGen::DoCallConstantFunction(LCallConstantFunction* instr) {
845 Abort("Unimplemented: %s", "DoCallConstantFunction");
846 }
847
848
849 void LCodeGen::DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr) {
850 Abort("Unimplemented: %s", "DoDeferredMathAbsTaggedHeapNumber");
851 }
852
853
854 void LCodeGen::DoMathAbs(LUnaryMathOperation* instr) {
855 Abort("Unimplemented: %s", "DoMathAbs");
856 }
857
858
859 void LCodeGen::DoMathFloor(LUnaryMathOperation* instr) {
860 Abort("Unimplemented: %s", "DoMathFloor");
861 }
862
863
864 void LCodeGen::DoMathRound(LUnaryMathOperation* instr) {
865 Abort("Unimplemented: %s", "DoMathRound");
866 }
867
868
869 void LCodeGen::DoMathSqrt(LUnaryMathOperation* instr) {
870 Abort("Unimplemented: %s", "DoMathSqrt");
871 }
872
873
874 void LCodeGen::DoMathPowHalf(LUnaryMathOperation* instr) {
875 Abort("Unimplemented: %s", "DoMathPowHalf");
876 }
877
878
879 void LCodeGen::DoPower(LPower* instr) {
880 Abort("Unimplemented: %s", "DoPower");
881 }
882
883
884 void LCodeGen::DoMathLog(LUnaryMathOperation* instr) {
885 Abort("Unimplemented: %s", "DoMathLog");
886 }
887
888
889 void LCodeGen::DoMathCos(LUnaryMathOperation* instr) {
890 Abort("Unimplemented: %s", "DoMathCos");
891 }
892
893
894 void LCodeGen::DoMathSin(LUnaryMathOperation* instr) {
895 Abort("Unimplemented: %s", "DoMathSin");
896 }
897
898
899 void LCodeGen::DoUnaryMathOperation(LUnaryMathOperation* instr) {
900 Abort("Unimplemented: %s", "DoUnaryMathOperation");
901 }
902
903
904 void LCodeGen::DoCallKeyed(LCallKeyed* instr) {
905 Abort("Unimplemented: %s", "DoCallKeyed");
906 }
907
908
909 void LCodeGen::DoCallNamed(LCallNamed* instr) {
910 Abort("Unimplemented: %s", "DoCallNamed");
911 }
912
913
914 void LCodeGen::DoCallFunction(LCallFunction* instr) {
915 Abort("Unimplemented: %s", "DoCallFunction");
916 }
917
918
919 void LCodeGen::DoCallGlobal(LCallGlobal* instr) {
920 Abort("Unimplemented: %s", "DoCallGlobal");
921 }
922
923
924 void LCodeGen::DoCallKnownGlobal(LCallKnownGlobal* instr) {
925 Abort("Unimplemented: %s", "DoCallKnownGlobal");
926 }
927
928
929 void LCodeGen::DoCallNew(LCallNew* instr) {
930 Abort("Unimplemented: %s", "DoCallNew");
931 }
932
933
934 void LCodeGen::DoCallRuntime(LCallRuntime* instr) {
935 Abort("Unimplemented: %s", "DoCallRuntime");
936 }
937
938
939 void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
940 Abort("Unimplemented: %s", "DoStoreNamedField");
941 }
942
943
944 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) {
945 Abort("Unimplemented: %s", "DoStoreNamedGeneric");
946 }
947
948
949 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) {
950 Abort("Unimplemented: %s", "DoBoundsCheck");
951 }
952
953
954 void LCodeGen::DoStoreKeyedFastElement(LStoreKeyedFastElement* instr) {
955 Abort("Unimplemented: %s", "DoStoreKeyedFastElement");
956 }
957
958
959 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) {
960 Abort("Unimplemented: %s", "DoStoreKeyedGeneric");
961 }
962
963
964 void LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) {
965 Abort("Unimplemented: %s", "DoInteger32ToDouble");
966 }
967
968
969 void LCodeGen::DoNumberTagI(LNumberTagI* instr) {
970 Abort("Unimplemented: %s", "DoNumberTagI");
971 }
972
973
974 void LCodeGen::DoDeferredNumberTagI(LNumberTagI* instr) {
975 Abort("Unimplemented: %s", "DoDeferredNumberTagI");
976 }
977
978
979 void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
980 Abort("Unimplemented: %s", "DoNumberTagD");
981 }
982
983
984 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) {
985 Abort("Unimplemented: %s", "DoDeferredNumberTagD");
986 }
987
988
989 void LCodeGen::DoSmiTag(LSmiTag* instr) {
990 Abort("Unimplemented: %s", "DoSmiTag");
991 }
992
993
994 void LCodeGen::DoSmiUntag(LSmiUntag* instr) {
995 Abort("Unimplemented: %s", "DoSmiUntag");
996 }
997
998
999 void LCodeGen::EmitNumberUntagD(Register input_reg,
1000 XMMRegister result_reg,
1001 LEnvironment* env) {
1002 Abort("Unimplemented: %s", "EmitNumberUntagD");
1003 }
1004
1005
1006 void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) {
1007 Abort("Unimplemented: %s", "DoDeferredTaggedToI");
1008 }
1009
1010
1011 void LCodeGen::DoTaggedToI(LTaggedToI* instr) {
1012 Abort("Unimplemented: %s", "DoTaggedToI");
1013 }
1014
1015
1016 void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) {
1017 Abort("Unimplemented: %s", "DoNumberUntagD");
1018 }
1019
1020
1021 void LCodeGen::DoDoubleToI(LDoubleToI* instr) {
1022 Abort("Unimplemented: %s", "DoDoubleToI");
1023 }
1024
1025
1026 void LCodeGen::DoCheckSmi(LCheckSmi* instr) {
1027 Abort("Unimplemented: %s", "DoCheckSmi");
1028 }
1029
1030
1031 void LCodeGen::DoCheckInstanceType(LCheckInstanceType* instr) {
1032 Abort("Unimplemented: %s", "DoCheckInstanceType");
1033 }
1034
1035
1036 void LCodeGen::DoCheckFunction(LCheckFunction* instr) {
1037 Abort("Unimplemented: %s", "DoCheckFunction");
1038 }
1039
1040
1041 void LCodeGen::DoCheckMap(LCheckMap* instr) {
1042 Abort("Unimplemented: %s", "DoCheckMap");
1043 }
1044
1045
1046 void LCodeGen::LoadPrototype(Register result, Handle<JSObject> prototype) {
1047 Abort("Unimplemented: %s", "LoadPrototype");
1048 }
1049
1050
1051 void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
1052 Abort("Unimplemented: %s", "DoCheckPrototypeMaps");
1053 }
1054
1055
1056 void LCodeGen::DoArrayLiteral(LArrayLiteral* instr) {
1057 Abort("Unimplemented: %s", "DoArrayLiteral");
1058 }
1059
1060
1061 void LCodeGen::DoObjectLiteral(LObjectLiteral* instr) {
1062 Abort("Unimplemented: %s", "DoObjectLiteral");
1063 }
1064
1065
1066 void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) {
1067 Abort("Unimplemented: %s", "DoRegExpLiteral");
1068 }
1069
1070
1071 void LCodeGen::DoFunctionLiteral(LFunctionLiteral* instr) {
1072 Abort("Unimplemented: %s", "DoFunctionLiteral");
1073 }
1074
1075
1076 void LCodeGen::DoTypeof(LTypeof* instr) {
1077 Abort("Unimplemented: %s", "DoTypeof");
1078 }
1079
1080
1081 void LCodeGen::DoTypeofIs(LTypeofIs* instr) {
1082 Abort("Unimplemented: %s", "DoTypeofIs");
1083 }
1084
1085
1086 void LCodeGen::DoTypeofIsAndBranch(LTypeofIsAndBranch* instr) {
1087 Abort("Unimplemented: %s", "DoTypeofIsAndBranch");
1088 }
1089
1090
1091 Condition LCodeGen::EmitTypeofIs(Label* true_label,
1092 Label* false_label,
1093 Register input,
1094 Handle<String> type_name) {
1095 Abort("Unimplemented: %s", "EmitTypeofIs");
1096 return no_condition;
1097 }
1098
1099
78 void LCodeGen::DoLazyBailout(LLazyBailout* instr) { 1100 void LCodeGen::DoLazyBailout(LLazyBailout* instr) {
79 // No code for lazy bailout instruction. Used to capture environment after a 1101 // No code for lazy bailout instruction. Used to capture environment after a
80 // call for populating the safepoint data with deoptimization data. 1102 // call for populating the safepoint data with deoptimization data.
81 } 1103 }
82 1104
83 1105
84 void LCodeGen::DoDeoptimize(LDeoptimize* instr) { 1106 void LCodeGen::DoDeoptimize(LDeoptimize* instr) {
85 DeoptimizeIf(no_condition, instr->environment()); 1107 DeoptimizeIf(no_condition, instr->environment());
86 } 1108 }
87 1109
88 1110
1111 void LCodeGen::DoDeleteProperty(LDeleteProperty* instr) {
1112 Abort("Unimplemented: %s", "DoDeleteProperty");
1113 }
1114
1115
1116 void LCodeGen::DoStackCheck(LStackCheck* instr) {
1117 Abort("Unimplemented: %s", "DoStackCheck");
1118 }
1119
1120
89 void LCodeGen::DoOsrEntry(LOsrEntry* instr) { 1121 void LCodeGen::DoOsrEntry(LOsrEntry* instr) {
90 UNIMPLEMENTED(); 1122 Abort("Unimplemented: %s", "DoOsrEntry");
91 } 1123 }
92 1124
93
94 #undef __ 1125 #undef __
95 1126
96 } } // namespace v8::internal 1127 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/x64/lithium-codegen-x64.h ('k') | src/x64/lithium-x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698