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

Side by Side Diff: src/ia32/lithium-ia32.h

Issue 6219001: Split LInstruction into multiple variant to make our LIR more compact.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/ia32/lithium-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 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 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 285
286 286
287 class LInstruction: public ZoneObject { 287 class LInstruction: public ZoneObject {
288 public: 288 public:
289 LInstruction() 289 LInstruction()
290 : hydrogen_value_(NULL) { } 290 : hydrogen_value_(NULL) { }
291 virtual ~LInstruction() { } 291 virtual ~LInstruction() { }
292 292
293 virtual void CompileToNative(LCodeGen* generator) = 0; 293 virtual void CompileToNative(LCodeGen* generator) = 0;
294 virtual const char* Mnemonic() const = 0; 294 virtual const char* Mnemonic() const = 0;
295 virtual void PrintTo(StringStream* stream) const; 295 virtual void PrintTo(StringStream* stream);
296 virtual void PrintDataTo(StringStream* stream) const { } 296 virtual void PrintDataTo(StringStream* stream) { }
297 297
298 // Declare virtual type testers. 298 // Declare virtual type testers.
299 #define DECLARE_DO(type) virtual bool Is##type() const { return false; } 299 #define DECLARE_DO(type) virtual bool Is##type() const { return false; }
300 LITHIUM_ALL_INSTRUCTION_LIST(DECLARE_DO) 300 LITHIUM_ALL_INSTRUCTION_LIST(DECLARE_DO)
301 #undef DECLARE_DO 301 #undef DECLARE_DO
302 virtual bool IsControl() const { return false; } 302 virtual bool IsControl() const { return false; }
303 303
304 void set_environment(LEnvironment* env) { environment_.set(env); } 304 void set_environment(LEnvironment* env) { environment_.set(env); }
305 LEnvironment* environment() const { return environment_.get(); } 305 LEnvironment* environment() const { return environment_.get(); }
306 bool HasEnvironment() const { return environment_.is_set(); } 306 bool HasEnvironment() const { return environment_.is_set(); }
307 307
308 void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); } 308 void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
309 LPointerMap* pointer_map() const { return pointer_map_.get(); } 309 LPointerMap* pointer_map() const { return pointer_map_.get(); }
310 bool HasPointerMap() const { return pointer_map_.is_set(); } 310 bool HasPointerMap() const { return pointer_map_.is_set(); }
311 311
312 void set_result(LOperand* operand) { result_.set(operand); } 312 virtual bool HasResult() const = 0;
313 LOperand* result() const { return result_.get(); }
314 bool HasResult() const { return result_.is_set(); }
315 313
316 void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; } 314 void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
317 HValue* hydrogen_value() const { return hydrogen_value_; } 315 HValue* hydrogen_value() const { return hydrogen_value_; }
318 316
319 void set_deoptimization_environment(LEnvironment* env) { 317 void set_deoptimization_environment(LEnvironment* env) {
320 deoptimization_environment_.set(env); 318 deoptimization_environment_.set(env);
321 } 319 }
322 LEnvironment* deoptimization_environment() const { 320 LEnvironment* deoptimization_environment() const {
323 return deoptimization_environment_.get(); 321 return deoptimization_environment_.get();
324 } 322 }
325 bool HasDeoptimizationEnvironment() const { 323 bool HasDeoptimizationEnvironment() const {
326 return deoptimization_environment_.is_set(); 324 return deoptimization_environment_.is_set();
327 } 325 }
328 326
329 private: 327 private:
330 SetOncePointer<LEnvironment> environment_; 328 SetOncePointer<LEnvironment> environment_;
331 SetOncePointer<LPointerMap> pointer_map_; 329 SetOncePointer<LPointerMap> pointer_map_;
332 SetOncePointer<LOperand> result_;
333 HValue* hydrogen_value_; 330 HValue* hydrogen_value_;
334 SetOncePointer<LEnvironment> deoptimization_environment_; 331 SetOncePointer<LEnvironment> deoptimization_environment_;
335 }; 332 };
336 333
337 334
335 template <int Result>
336 class LTemplateInstruction: public LInstruction { };
337
338
339 template<>
340 class LTemplateInstruction<0>: public LInstruction {
341 virtual bool HasResult() const { return false; }
342 };
343
344 template<>
345 class LTemplateInstruction<1>: public LInstruction {
346 public:
347 static LTemplateInstruction<1>* cast(LInstruction* instr) {
348 ASSERT(instr->HasResult());
349 return reinterpret_cast<LTemplateInstruction<1>*>(instr);
350 }
351 void set_result(LOperand* operand) { result_.set(operand); }
352 LOperand* result() const { return result_.get(); }
353 virtual bool HasResult() const { return result_.is_set(); }
354 private:
355 SetOncePointer<LOperand> result_;
356 };
357
358
338 class LParallelMove : public ZoneObject { 359 class LParallelMove : public ZoneObject {
339 public: 360 public:
340 LParallelMove() : move_operands_(4) { } 361 LParallelMove() : move_operands_(4) { }
341 362
342 void AddMove(LOperand* from, LOperand* to) { 363 void AddMove(LOperand* from, LOperand* to) {
343 move_operands_.Add(LMoveOperands(from, to)); 364 move_operands_.Add(LMoveOperands(from, to));
344 } 365 }
345 366
346 bool IsRedundant() const; 367 bool IsRedundant() const;
347 368
348 const ZoneList<LMoveOperands>* move_operands() const { 369 const ZoneList<LMoveOperands>* move_operands() const {
349 return &move_operands_; 370 return &move_operands_;
350 } 371 }
351 372
352 void PrintDataTo(StringStream* stream) const; 373 void PrintDataTo(StringStream* stream);
353 374
354 private: 375 private:
355 ZoneList<LMoveOperands> move_operands_; 376 ZoneList<LMoveOperands> move_operands_;
356 }; 377 };
357 378
358 379
359 class LGap: public LInstruction { 380 class LGap: public LTemplateInstruction<0> {
360 public: 381 public:
361 explicit LGap(HBasicBlock* block) 382 explicit LGap(HBasicBlock* block)
362 : block_(block) { 383 : block_(block) {
363 parallel_moves_[BEFORE] = NULL; 384 parallel_moves_[BEFORE] = NULL;
364 parallel_moves_[START] = NULL; 385 parallel_moves_[START] = NULL;
365 parallel_moves_[END] = NULL; 386 parallel_moves_[END] = NULL;
366 parallel_moves_[AFTER] = NULL; 387 parallel_moves_[AFTER] = NULL;
367 } 388 }
368 389
369 DECLARE_CONCRETE_INSTRUCTION(Gap, "gap") 390 DECLARE_CONCRETE_INSTRUCTION(Gap, "gap")
370 virtual void PrintDataTo(StringStream* stream) const; 391 virtual void PrintDataTo(StringStream* stream);
371 392
372 bool IsRedundant() const; 393 bool IsRedundant() const;
373 394
374 HBasicBlock* block() const { return block_; } 395 HBasicBlock* block() const { return block_; }
375 396
376 enum InnerPosition { 397 enum InnerPosition {
377 BEFORE, 398 BEFORE,
378 START, 399 START,
379 END, 400 END,
380 AFTER, 401 AFTER,
381 FIRST_INNER_POSITION = BEFORE, 402 FIRST_INNER_POSITION = BEFORE,
382 LAST_INNER_POSITION = AFTER 403 LAST_INNER_POSITION = AFTER
383 }; 404 };
384 405
385 LParallelMove* GetOrCreateParallelMove(InnerPosition pos) { 406 LParallelMove* GetOrCreateParallelMove(InnerPosition pos) {
386 if (parallel_moves_[pos] == NULL) parallel_moves_[pos] = new LParallelMove; 407 if (parallel_moves_[pos] == NULL) parallel_moves_[pos] = new LParallelMove;
387 return parallel_moves_[pos]; 408 return parallel_moves_[pos];
388 } 409 }
389 410
390 LParallelMove* GetParallelMove(InnerPosition pos) { 411 LParallelMove* GetParallelMove(InnerPosition pos) {
391 return parallel_moves_[pos]; 412 return parallel_moves_[pos];
392 } 413 }
393 414
394 private: 415 private:
395 LParallelMove* parallel_moves_[LAST_INNER_POSITION + 1]; 416 LParallelMove* parallel_moves_[LAST_INNER_POSITION + 1];
396 HBasicBlock* block_; 417 HBasicBlock* block_;
397 }; 418 };
398 419
399 420
400 class LGoto: public LInstruction { 421 class LGoto: public LTemplateInstruction<0> {
401 public: 422 public:
402 LGoto(int block_id, bool include_stack_check = false) 423 LGoto(int block_id, bool include_stack_check = false)
403 : block_id_(block_id), include_stack_check_(include_stack_check) { } 424 : block_id_(block_id), include_stack_check_(include_stack_check) { }
404 425
405 DECLARE_CONCRETE_INSTRUCTION(Goto, "goto") 426 DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
406 virtual void PrintDataTo(StringStream* stream) const; 427 virtual void PrintDataTo(StringStream* stream);
407 virtual bool IsControl() const { return true; } 428 virtual bool IsControl() const { return true; }
408 429
409 int block_id() const { return block_id_; } 430 int block_id() const { return block_id_; }
410 bool include_stack_check() const { return include_stack_check_; } 431 bool include_stack_check() const { return include_stack_check_; }
411 432
412 private: 433 private:
413 int block_id_; 434 int block_id_;
414 bool include_stack_check_; 435 bool include_stack_check_;
415 }; 436 };
416 437
417 438
418 class LLazyBailout: public LInstruction { 439 class LLazyBailout: public LTemplateInstruction<0> {
419 public: 440 public:
420 LLazyBailout() : gap_instructions_size_(0) { } 441 LLazyBailout() : gap_instructions_size_(0) { }
421 442
422 DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout") 443 DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout")
423 444
424 void set_gap_instructions_size(int gap_instructions_size) { 445 void set_gap_instructions_size(int gap_instructions_size) {
425 gap_instructions_size_ = gap_instructions_size; 446 gap_instructions_size_ = gap_instructions_size;
426 } 447 }
427 int gap_instructions_size() { return gap_instructions_size_; } 448 int gap_instructions_size() { return gap_instructions_size_; }
428 449
429 private: 450 private:
430 int gap_instructions_size_; 451 int gap_instructions_size_;
431 }; 452 };
432 453
433 454
434 class LDeoptimize: public LInstruction { 455 class LDeoptimize: public LTemplateInstruction<0> {
435 public: 456 public:
436 DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize") 457 DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
437 }; 458 };
438 459
439 460
440 class LLabel: public LGap { 461 class LLabel: public LGap {
441 public: 462 public:
442 explicit LLabel(HBasicBlock* block) 463 explicit LLabel(HBasicBlock* block)
443 : LGap(block), replacement_(NULL) { } 464 : LGap(block), replacement_(NULL) { }
444 465
445 DECLARE_CONCRETE_INSTRUCTION(Label, "label") 466 DECLARE_CONCRETE_INSTRUCTION(Label, "label")
446 467
447 virtual void PrintDataTo(StringStream* stream) const; 468 virtual void PrintDataTo(StringStream* stream);
448 469
449 int block_id() const { return block()->block_id(); } 470 int block_id() const { return block()->block_id(); }
450 bool is_loop_header() const { return block()->IsLoopHeader(); } 471 bool is_loop_header() const { return block()->IsLoopHeader(); }
451 Label* label() { return &label_; } 472 Label* label() { return &label_; }
452 LLabel* replacement() const { return replacement_; } 473 LLabel* replacement() const { return replacement_; }
453 void set_replacement(LLabel* label) { replacement_ = label; } 474 void set_replacement(LLabel* label) { replacement_ = label; }
454 bool HasReplacement() const { return replacement_ != NULL; } 475 bool HasReplacement() const { return replacement_ != NULL; }
455 476
456 private: 477 private:
457 Label label_; 478 Label label_;
458 LLabel* replacement_; 479 LLabel* replacement_;
459 }; 480 };
460 481
461 482
462 class LParameter: public LInstruction { 483 class LParameter: public LTemplateInstruction<1> {
463 public: 484 public:
464 DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter") 485 DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter")
465 }; 486 };
466 487
467 488
468 class LCallStub: public LInstruction { 489 class LCallStub: public LTemplateInstruction<1> {
469 public: 490 public:
470 DECLARE_CONCRETE_INSTRUCTION(CallStub, "call-stub") 491 DECLARE_CONCRETE_INSTRUCTION(CallStub, "call-stub")
471 DECLARE_HYDROGEN_ACCESSOR(CallStub) 492 DECLARE_HYDROGEN_ACCESSOR(CallStub)
472 493
473 TranscendentalCache::Type transcendental_type() { 494 TranscendentalCache::Type transcendental_type() {
474 return hydrogen()->transcendental_type(); 495 return hydrogen()->transcendental_type();
475 } 496 }
476 }; 497 };
477 498
478 499
479 class LUnknownOSRValue: public LInstruction { 500 class LUnknownOSRValue: public LTemplateInstruction<1> {
480 public: 501 public:
481 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value") 502 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value")
482 }; 503 };
483 504
484 505
485 class LUnaryOperation: public LInstruction { 506 template<int R>
507 class LUnaryOperation: public LTemplateInstruction<R> {
486 public: 508 public:
487 explicit LUnaryOperation(LOperand* input) : input_(input) { } 509 explicit LUnaryOperation(LOperand* input) : input_(input) { }
488 510
489 DECLARE_INSTRUCTION(UnaryOperation) 511 DECLARE_INSTRUCTION(UnaryOperation)
490 512
491 LOperand* input() const { return input_; } 513 LOperand* input() const { return input_; }
492 514
493 virtual void PrintDataTo(StringStream* stream) const; 515 virtual void PrintDataTo(StringStream* stream);
494 516
495 private: 517 private:
496 LOperand* input_; 518 LOperand* input_;
497 }; 519 };
498 520
499 521
500 class LBinaryOperation: public LInstruction { 522 class LBinaryOperation: public LTemplateInstruction<1> {
501 public: 523 public:
502 LBinaryOperation(LOperand* left, LOperand* right) 524 LBinaryOperation(LOperand* left, LOperand* right)
503 : left_(left), right_(right) { } 525 : left_(left), right_(right) { }
504 526
505 DECLARE_INSTRUCTION(BinaryOperation) 527 DECLARE_INSTRUCTION(BinaryOperation)
506 528
507 LOperand* left() const { return left_; } 529 LOperand* left() const { return left_; }
508 LOperand* right() const { return right_; } 530 LOperand* right() const { return right_; }
509 virtual void PrintDataTo(StringStream* stream) const; 531 virtual void PrintDataTo(StringStream* stream);
510 532
511 private: 533 private:
512 LOperand* left_; 534 LOperand* left_;
513 LOperand* right_; 535 LOperand* right_;
514 }; 536 };
515 537
516 538
517 class LApplyArguments: public LBinaryOperation { 539 class LApplyArguments: public LBinaryOperation {
518 public: 540 public:
519 LApplyArguments(LOperand* function, 541 LApplyArguments(LOperand* function,
(...skipping 10 matching lines...) Expand all
530 LOperand* receiver() const { return right(); } 552 LOperand* receiver() const { return right(); }
531 LOperand* length() const { return length_; } 553 LOperand* length() const { return length_; }
532 LOperand* elements() const { return elements_; } 554 LOperand* elements() const { return elements_; }
533 555
534 private: 556 private:
535 LOperand* length_; 557 LOperand* length_;
536 LOperand* elements_; 558 LOperand* elements_;
537 }; 559 };
538 560
539 561
540 class LAccessArgumentsAt: public LInstruction { 562 class LAccessArgumentsAt: public LTemplateInstruction<1> {
541 public: 563 public:
542 LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) 564 LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index)
543 : arguments_(arguments), length_(length), index_(index) { } 565 : arguments_(arguments), length_(length), index_(index) { }
544 566
545 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at") 567 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at")
546 568
547 LOperand* arguments() const { return arguments_; } 569 LOperand* arguments() const { return arguments_; }
548 LOperand* length() const { return length_; } 570 LOperand* length() const { return length_; }
549 LOperand* index() const { return index_; } 571 LOperand* index() const { return index_; }
550 572
551 virtual void PrintDataTo(StringStream* stream) const; 573 virtual void PrintDataTo(StringStream* stream);
552 574
553 private: 575 private:
554 LOperand* arguments_; 576 LOperand* arguments_;
555 LOperand* length_; 577 LOperand* length_;
556 LOperand* index_; 578 LOperand* index_;
557 }; 579 };
558 580
559 581
560 class LArgumentsLength: public LUnaryOperation { 582 class LArgumentsLength: public LUnaryOperation<1> {
561 public: 583 public:
562 explicit LArgumentsLength(LOperand* elements) : LUnaryOperation(elements) {} 584 explicit LArgumentsLength(LOperand* elements)
585 : LUnaryOperation<1>(elements) {}
563 586
564 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length") 587 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length")
565 }; 588 };
566 589
567 590
568 class LArgumentsElements: public LInstruction { 591 class LArgumentsElements: public LTemplateInstruction<1> {
569 public: 592 public:
570 LArgumentsElements() { } 593 LArgumentsElements() { }
571 594
572 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements") 595 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements")
573 }; 596 };
574 597
575 598
576 class LModI: public LBinaryOperation { 599 class LModI: public LBinaryOperation {
577 public: 600 public:
578 LModI(LOperand* left, LOperand* right) : LBinaryOperation(left, right) { } 601 LModI(LOperand* left, LOperand* right) : LBinaryOperation(left, right) { }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 LOperand* left, 652 LOperand* left,
630 LOperand* right, 653 LOperand* right,
631 int true_block_id, 654 int true_block_id,
632 int false_block_id, 655 int false_block_id,
633 bool is_double) 656 bool is_double)
634 : LCmpID(op, left, right, is_double), 657 : LCmpID(op, left, right, is_double),
635 true_block_id_(true_block_id), 658 true_block_id_(true_block_id),
636 false_block_id_(false_block_id) { } 659 false_block_id_(false_block_id) { }
637 660
638 DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch") 661 DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch")
639 virtual void PrintDataTo(StringStream* stream) const; 662 virtual void PrintDataTo(StringStream* stream);
640 virtual bool IsControl() const { return true; } 663 virtual bool IsControl() const { return true; }
641 664
642 int true_block_id() const { return true_block_id_; } 665 int true_block_id() const { return true_block_id_; }
643 int false_block_id() const { return false_block_id_; } 666 int false_block_id() const { return false_block_id_; }
644 667
645 private: 668 private:
646 int true_block_id_; 669 int true_block_id_;
647 int false_block_id_; 670 int false_block_id_;
648 }; 671 };
649 672
650 673
651 class LUnaryMathOperation: public LUnaryOperation { 674 class LUnaryMathOperation: public LUnaryOperation<1> {
652 public: 675 public:
653 explicit LUnaryMathOperation(LOperand* value) 676 explicit LUnaryMathOperation(LOperand* value)
654 : LUnaryOperation(value) { } 677 : LUnaryOperation<1>(value) { }
655 678
656 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation") 679 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation")
657 DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation) 680 DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
658 681
659 virtual void PrintDataTo(StringStream* stream) const; 682 virtual void PrintDataTo(StringStream* stream);
660 BuiltinFunctionId op() const { return hydrogen()->op(); } 683 BuiltinFunctionId op() const { return hydrogen()->op(); }
661 }; 684 };
662 685
663 686
664 class LCmpJSObjectEq: public LBinaryOperation { 687 class LCmpJSObjectEq: public LBinaryOperation {
665 public: 688 public:
666 LCmpJSObjectEq(LOperand* left, LOperand* right) 689 LCmpJSObjectEq(LOperand* left, LOperand* right)
667 : LBinaryOperation(left, right) {} 690 : LBinaryOperation(left, right) {}
668 691
669 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEq, "cmp-jsobject-eq") 692 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEq, "cmp-jsobject-eq")
(...skipping 15 matching lines...) Expand all
685 708
686 int true_block_id() const { return true_block_id_; } 709 int true_block_id() const { return true_block_id_; }
687 int false_block_id() const { return false_block_id_; } 710 int false_block_id() const { return false_block_id_; }
688 711
689 private: 712 private:
690 int true_block_id_; 713 int true_block_id_;
691 int false_block_id_; 714 int false_block_id_;
692 }; 715 };
693 716
694 717
695 class LIsNull: public LUnaryOperation { 718 class LIsNull: public LUnaryOperation<1> {
696 public: 719 public:
697 LIsNull(LOperand* value, bool is_strict) 720 LIsNull(LOperand* value, bool is_strict)
698 : LUnaryOperation(value), is_strict_(is_strict) {} 721 : LUnaryOperation<1>(value), is_strict_(is_strict) {}
699 722
700 DECLARE_CONCRETE_INSTRUCTION(IsNull, "is-null") 723 DECLARE_CONCRETE_INSTRUCTION(IsNull, "is-null")
701 724
702 bool is_strict() const { return is_strict_; } 725 bool is_strict() const { return is_strict_; }
703 726
704 private: 727 private:
705 bool is_strict_; 728 bool is_strict_;
706 }; 729 };
707 730
708 731
709 class LIsNullAndBranch: public LIsNull { 732 class LIsNullAndBranch: public LIsNull {
710 public: 733 public:
711 LIsNullAndBranch(LOperand* value, 734 LIsNullAndBranch(LOperand* value,
712 bool is_strict, 735 bool is_strict,
713 LOperand* temp, 736 LOperand* temp,
714 int true_block_id, 737 int true_block_id,
715 int false_block_id) 738 int false_block_id)
716 : LIsNull(value, is_strict), 739 : LIsNull(value, is_strict),
717 temp_(temp), 740 temp_(temp),
718 true_block_id_(true_block_id), 741 true_block_id_(true_block_id),
719 false_block_id_(false_block_id) { } 742 false_block_id_(false_block_id) { }
720 743
721 DECLARE_CONCRETE_INSTRUCTION(IsNullAndBranch, "is-null-and-branch") 744 DECLARE_CONCRETE_INSTRUCTION(IsNullAndBranch, "is-null-and-branch")
722 virtual void PrintDataTo(StringStream* stream) const; 745 virtual void PrintDataTo(StringStream* stream);
723 virtual bool IsControl() const { return true; } 746 virtual bool IsControl() const { return true; }
724 747
725 int true_block_id() const { return true_block_id_; } 748 int true_block_id() const { return true_block_id_; }
726 int false_block_id() const { return false_block_id_; } 749 int false_block_id() const { return false_block_id_; }
727 750
728 LOperand* temp() const { return temp_; } 751 LOperand* temp() const { return temp_; }
729 752
730 private: 753 private:
731 LOperand* temp_; 754 LOperand* temp_;
732 int true_block_id_; 755 int true_block_id_;
733 int false_block_id_; 756 int false_block_id_;
734 }; 757 };
735 758
736 759
737 class LIsObject: public LUnaryOperation { 760 class LIsObject: public LUnaryOperation<1> {
738 public: 761 public:
739 LIsObject(LOperand* value, LOperand* temp) 762 LIsObject(LOperand* value, LOperand* temp)
740 : LUnaryOperation(value), temp_(temp) {} 763 : LUnaryOperation<1>(value), temp_(temp) {}
741 764
742 DECLARE_CONCRETE_INSTRUCTION(IsObject, "is-object") 765 DECLARE_CONCRETE_INSTRUCTION(IsObject, "is-object")
743 766
744 LOperand* temp() const { return temp_; } 767 LOperand* temp() const { return temp_; }
745 768
746 private: 769 private:
747 LOperand* temp_; 770 LOperand* temp_;
748 }; 771 };
749 772
750 773
751 class LIsObjectAndBranch: public LIsObject { 774 class LIsObjectAndBranch: public LIsObject {
752 public: 775 public:
753 LIsObjectAndBranch(LOperand* value, 776 LIsObjectAndBranch(LOperand* value,
754 LOperand* temp, 777 LOperand* temp,
755 LOperand* temp2, 778 LOperand* temp2,
756 int true_block_id, 779 int true_block_id,
757 int false_block_id) 780 int false_block_id)
758 : LIsObject(value, temp), 781 : LIsObject(value, temp),
759 temp2_(temp2), 782 temp2_(temp2),
760 true_block_id_(true_block_id), 783 true_block_id_(true_block_id),
761 false_block_id_(false_block_id) { } 784 false_block_id_(false_block_id) { }
762 785
763 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch") 786 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch")
764 virtual void PrintDataTo(StringStream* stream) const; 787 virtual void PrintDataTo(StringStream* stream);
765 virtual bool IsControl() const { return true; } 788 virtual bool IsControl() const { return true; }
766 789
767 int true_block_id() const { return true_block_id_; } 790 int true_block_id() const { return true_block_id_; }
768 int false_block_id() const { return false_block_id_; } 791 int false_block_id() const { return false_block_id_; }
769 792
770 LOperand* temp2() const { return temp2_; } 793 LOperand* temp2() const { return temp2_; }
771 794
772 private: 795 private:
773 LOperand* temp2_; 796 LOperand* temp2_;
774 int true_block_id_; 797 int true_block_id_;
775 int false_block_id_; 798 int false_block_id_;
776 }; 799 };
777 800
778 801
779 class LIsSmi: public LUnaryOperation { 802 class LIsSmi: public LUnaryOperation<1> {
780 public: 803 public:
781 explicit LIsSmi(LOperand* value) : LUnaryOperation(value) {} 804 explicit LIsSmi(LOperand* value) : LUnaryOperation<1>(value) {}
782 805
783 DECLARE_CONCRETE_INSTRUCTION(IsSmi, "is-smi") 806 DECLARE_CONCRETE_INSTRUCTION(IsSmi, "is-smi")
784 DECLARE_HYDROGEN_ACCESSOR(IsSmi) 807 DECLARE_HYDROGEN_ACCESSOR(IsSmi)
785 }; 808 };
786 809
787 810
788 class LIsSmiAndBranch: public LIsSmi { 811 class LIsSmiAndBranch: public LIsSmi {
789 public: 812 public:
790 LIsSmiAndBranch(LOperand* value, 813 LIsSmiAndBranch(LOperand* value,
791 int true_block_id, 814 int true_block_id,
792 int false_block_id) 815 int false_block_id)
793 : LIsSmi(value), 816 : LIsSmi(value),
794 true_block_id_(true_block_id), 817 true_block_id_(true_block_id),
795 false_block_id_(false_block_id) { } 818 false_block_id_(false_block_id) { }
796 819
797 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch") 820 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
798 virtual void PrintDataTo(StringStream* stream) const; 821 virtual void PrintDataTo(StringStream* stream);
799 virtual bool IsControl() const { return true; } 822 virtual bool IsControl() const { return true; }
800 823
801 int true_block_id() const { return true_block_id_; } 824 int true_block_id() const { return true_block_id_; }
802 int false_block_id() const { return false_block_id_; } 825 int false_block_id() const { return false_block_id_; }
803 826
804 private: 827 private:
805 int true_block_id_; 828 int true_block_id_;
806 int false_block_id_; 829 int false_block_id_;
807 }; 830 };
808 831
809 832
810 class LHasInstanceType: public LUnaryOperation { 833 class LHasInstanceType: public LUnaryOperation<1> {
811 public: 834 public:
812 explicit LHasInstanceType(LOperand* value) 835 explicit LHasInstanceType(LOperand* value)
813 : LUnaryOperation(value) { } 836 : LUnaryOperation<1>(value) { }
814 837
815 DECLARE_CONCRETE_INSTRUCTION(HasInstanceType, "has-instance-type") 838 DECLARE_CONCRETE_INSTRUCTION(HasInstanceType, "has-instance-type")
816 DECLARE_HYDROGEN_ACCESSOR(HasInstanceType) 839 DECLARE_HYDROGEN_ACCESSOR(HasInstanceType)
817 840
818 InstanceType TestType(); // The type to test against when generating code. 841 InstanceType TestType(); // The type to test against when generating code.
819 Condition BranchCondition(); // The branch condition for 'true'. 842 Condition BranchCondition(); // The branch condition for 'true'.
820 }; 843 };
821 844
822 845
823 class LHasInstanceTypeAndBranch: public LHasInstanceType { 846 class LHasInstanceTypeAndBranch: public LHasInstanceType {
824 public: 847 public:
825 LHasInstanceTypeAndBranch(LOperand* value, 848 LHasInstanceTypeAndBranch(LOperand* value,
826 LOperand* temporary, 849 LOperand* temporary,
827 int true_block_id, 850 int true_block_id,
828 int false_block_id) 851 int false_block_id)
829 : LHasInstanceType(value), 852 : LHasInstanceType(value),
830 temp_(temporary), 853 temp_(temporary),
831 true_block_id_(true_block_id), 854 true_block_id_(true_block_id),
832 false_block_id_(false_block_id) { } 855 false_block_id_(false_block_id) { }
833 856
834 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch, 857 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
835 "has-instance-type-and-branch") 858 "has-instance-type-and-branch")
836 virtual void PrintDataTo(StringStream* stream) const; 859 virtual void PrintDataTo(StringStream* stream);
837 virtual bool IsControl() const { return true; } 860 virtual bool IsControl() const { return true; }
838 861
839 int true_block_id() const { return true_block_id_; } 862 int true_block_id() const { return true_block_id_; }
840 int false_block_id() const { return false_block_id_; } 863 int false_block_id() const { return false_block_id_; }
841 864
842 LOperand* temp() { return temp_; } 865 LOperand* temp() { return temp_; }
843 866
844 private: 867 private:
845 LOperand* temp_; 868 LOperand* temp_;
846 int true_block_id_; 869 int true_block_id_;
847 int false_block_id_; 870 int false_block_id_;
848 }; 871 };
849 872
850 873
851 class LHasCachedArrayIndex: public LUnaryOperation { 874 class LHasCachedArrayIndex: public LUnaryOperation<1> {
852 public: 875 public:
853 explicit LHasCachedArrayIndex(LOperand* value) : LUnaryOperation(value) {} 876 explicit LHasCachedArrayIndex(LOperand* value) : LUnaryOperation<1>(value) {}
854 877
855 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex, "has-cached-array-index") 878 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex, "has-cached-array-index")
856 DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndex) 879 DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndex)
857 }; 880 };
858 881
859 882
860 class LHasCachedArrayIndexAndBranch: public LHasCachedArrayIndex { 883 class LHasCachedArrayIndexAndBranch: public LHasCachedArrayIndex {
861 public: 884 public:
862 LHasCachedArrayIndexAndBranch(LOperand* value, 885 LHasCachedArrayIndexAndBranch(LOperand* value,
863 int true_block_id, 886 int true_block_id,
864 int false_block_id) 887 int false_block_id)
865 : LHasCachedArrayIndex(value), 888 : LHasCachedArrayIndex(value),
866 true_block_id_(true_block_id), 889 true_block_id_(true_block_id),
867 false_block_id_(false_block_id) { } 890 false_block_id_(false_block_id) { }
868 891
869 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch, 892 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch,
870 "has-cached-array-index-and-branch") 893 "has-cached-array-index-and-branch")
871 virtual void PrintDataTo(StringStream* stream) const; 894 virtual void PrintDataTo(StringStream* stream);
872 virtual bool IsControl() const { return true; } 895 virtual bool IsControl() const { return true; }
873 896
874 int true_block_id() const { return true_block_id_; } 897 int true_block_id() const { return true_block_id_; }
875 int false_block_id() const { return false_block_id_; } 898 int false_block_id() const { return false_block_id_; }
876 899
877 private: 900 private:
878 int true_block_id_; 901 int true_block_id_;
879 int false_block_id_; 902 int false_block_id_;
880 }; 903 };
881 904
882 905
883 class LClassOfTest: public LUnaryOperation { 906 class LClassOfTest: public LUnaryOperation<1> {
884 public: 907 public:
885 LClassOfTest(LOperand* value, LOperand* temp) 908 LClassOfTest(LOperand* value, LOperand* temp)
886 : LUnaryOperation(value), temporary_(temp) {} 909 : LUnaryOperation<1>(value), temporary_(temp) {}
887 910
888 DECLARE_CONCRETE_INSTRUCTION(ClassOfTest, "class-of-test") 911 DECLARE_CONCRETE_INSTRUCTION(ClassOfTest, "class-of-test")
889 DECLARE_HYDROGEN_ACCESSOR(ClassOfTest) 912 DECLARE_HYDROGEN_ACCESSOR(ClassOfTest)
890 913
891 virtual void PrintDataTo(StringStream* stream) const; 914 virtual void PrintDataTo(StringStream* stream);
892 915
893 LOperand* temporary() { return temporary_; } 916 LOperand* temporary() { return temporary_; }
894 917
895 private: 918 private:
896 LOperand *temporary_; 919 LOperand *temporary_;
897 }; 920 };
898 921
899 922
900 class LClassOfTestAndBranch: public LClassOfTest { 923 class LClassOfTestAndBranch: public LClassOfTest {
901 public: 924 public:
902 LClassOfTestAndBranch(LOperand* value, 925 LClassOfTestAndBranch(LOperand* value,
903 LOperand* temporary, 926 LOperand* temporary,
904 LOperand* temporary2, 927 LOperand* temporary2,
905 int true_block_id, 928 int true_block_id,
906 int false_block_id) 929 int false_block_id)
907 : LClassOfTest(value, temporary), 930 : LClassOfTest(value, temporary),
908 temporary2_(temporary2), 931 temporary2_(temporary2),
909 true_block_id_(true_block_id), 932 true_block_id_(true_block_id),
910 false_block_id_(false_block_id) { } 933 false_block_id_(false_block_id) { }
911 934
912 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch, 935 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch,
913 "class-of-test-and-branch") 936 "class-of-test-and-branch")
914 virtual void PrintDataTo(StringStream* stream) const; 937 virtual void PrintDataTo(StringStream* stream);
915 virtual bool IsControl() const { return true; } 938 virtual bool IsControl() const { return true; }
916 939
917 int true_block_id() const { return true_block_id_; } 940 int true_block_id() const { return true_block_id_; }
918 int false_block_id() const { return false_block_id_; } 941 int false_block_id() const { return false_block_id_; }
919 LOperand* temporary2() { return temporary2_; } 942 LOperand* temporary2() { return temporary2_; }
920 943
921 private: 944 private:
922 LOperand* temporary2_; 945 LOperand* temporary2_;
923 int true_block_id_; 946 int true_block_id_;
924 int false_block_id_; 947 int false_block_id_;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
980 1003
981 int true_block_id() const { return true_block_id_; } 1004 int true_block_id() const { return true_block_id_; }
982 int false_block_id() const { return false_block_id_; } 1005 int false_block_id() const { return false_block_id_; }
983 1006
984 private: 1007 private:
985 int true_block_id_; 1008 int true_block_id_;
986 int false_block_id_; 1009 int false_block_id_;
987 }; 1010 };
988 1011
989 1012
990 class LInstanceOfKnownGlobal: public LUnaryOperation { 1013 class LInstanceOfKnownGlobal: public LUnaryOperation<1> {
991 public: 1014 public:
992 LInstanceOfKnownGlobal(LOperand* left, LOperand* temp) 1015 LInstanceOfKnownGlobal(LOperand* left, LOperand* temp)
993 : LUnaryOperation(left), temp_(temp) { } 1016 : LUnaryOperation<1>(left), temp_(temp) { }
994 1017
995 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal, 1018 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,
996 "instance-of-known-global") 1019 "instance-of-known-global")
997 DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal) 1020 DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal)
998 1021
999 Handle<JSFunction> function() const { return hydrogen()->function(); } 1022 Handle<JSFunction> function() const { return hydrogen()->function(); }
1000 LOperand* temp() const { return temp_; } 1023 LOperand* temp() const { return temp_; }
1001 1024
1002 private: 1025 private:
1003 LOperand* temp_; 1026 LOperand* temp_;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 class LSubI: public LBinaryOperation { 1073 class LSubI: public LBinaryOperation {
1051 public: 1074 public:
1052 LSubI(LOperand* left, LOperand* right) 1075 LSubI(LOperand* left, LOperand* right)
1053 : LBinaryOperation(left, right) { } 1076 : LBinaryOperation(left, right) { }
1054 1077
1055 DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i") 1078 DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i")
1056 DECLARE_HYDROGEN_ACCESSOR(Sub) 1079 DECLARE_HYDROGEN_ACCESSOR(Sub)
1057 }; 1080 };
1058 1081
1059 1082
1060 class LConstant: public LInstruction { 1083 class LConstant: public LTemplateInstruction<1> {
1061 DECLARE_INSTRUCTION(Constant) 1084 DECLARE_INSTRUCTION(Constant)
1062 }; 1085 };
1063 1086
1064 1087
1065 class LConstantI: public LConstant { 1088 class LConstantI: public LConstant {
1066 public: 1089 public:
1067 explicit LConstantI(int32_t value) : value_(value) { } 1090 explicit LConstantI(int32_t value) : value_(value) { }
1068 int32_t value() const { return value_; } 1091 int32_t value() const { return value_; }
1069 1092
1070 DECLARE_CONCRETE_INSTRUCTION(ConstantI, "constant-i") 1093 DECLARE_CONCRETE_INSTRUCTION(ConstantI, "constant-i")
(...skipping 20 matching lines...) Expand all
1091 explicit LConstantT(Handle<Object> value) : value_(value) { } 1114 explicit LConstantT(Handle<Object> value) : value_(value) { }
1092 Handle<Object> value() const { return value_; } 1115 Handle<Object> value() const { return value_; }
1093 1116
1094 DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t") 1117 DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t")
1095 1118
1096 private: 1119 private:
1097 Handle<Object> value_; 1120 Handle<Object> value_;
1098 }; 1121 };
1099 1122
1100 1123
1101 class LBranch: public LUnaryOperation { 1124 class LBranch: public LUnaryOperation<1> {
1102 public: 1125 public:
1103 LBranch(LOperand* input, int true_block_id, int false_block_id) 1126 LBranch(LOperand* input, int true_block_id, int false_block_id)
1104 : LUnaryOperation(input), 1127 : LUnaryOperation<1>(input),
1105 true_block_id_(true_block_id), 1128 true_block_id_(true_block_id),
1106 false_block_id_(false_block_id) { } 1129 false_block_id_(false_block_id) { }
1107 1130
1108 DECLARE_CONCRETE_INSTRUCTION(Branch, "branch") 1131 DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
1109 DECLARE_HYDROGEN_ACCESSOR(Value) 1132 DECLARE_HYDROGEN_ACCESSOR(Value)
1110 1133
1111 virtual void PrintDataTo(StringStream* stream) const; 1134 virtual void PrintDataTo(StringStream* stream);
1112 virtual bool IsControl() const { return true; } 1135 virtual bool IsControl() const { return true; }
1113 1136
1114 int true_block_id() const { return true_block_id_; } 1137 int true_block_id() const { return true_block_id_; }
1115 int false_block_id() const { return false_block_id_; } 1138 int false_block_id() const { return false_block_id_; }
1116 1139
1117 private: 1140 private:
1118 int true_block_id_; 1141 int true_block_id_;
1119 int false_block_id_; 1142 int false_block_id_;
1120 }; 1143 };
1121 1144
1122 1145
1123 class LCmpMapAndBranch: public LUnaryOperation { 1146 class LCmpMapAndBranch: public LUnaryOperation<1> {
1124 public: 1147 public:
1125 explicit LCmpMapAndBranch(LOperand* value) : LUnaryOperation(value) { } 1148 explicit LCmpMapAndBranch(LOperand* value) : LUnaryOperation<1>(value) { }
1126 1149
1127 DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch") 1150 DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
1128 DECLARE_HYDROGEN_ACCESSOR(CompareMapAndBranch) 1151 DECLARE_HYDROGEN_ACCESSOR(CompareMapAndBranch)
1129 1152
1130 virtual bool IsControl() const { return true; } 1153 virtual bool IsControl() const { return true; }
1131 1154
1132 Handle<Map> map() const { return hydrogen()->map(); } 1155 Handle<Map> map() const { return hydrogen()->map(); }
1133 int true_block_id() const { 1156 int true_block_id() const {
1134 return hydrogen()->true_destination()->block_id(); 1157 return hydrogen()->true_destination()->block_id();
1135 } 1158 }
1136 int false_block_id() const { 1159 int false_block_id() const {
1137 return hydrogen()->false_destination()->block_id(); 1160 return hydrogen()->false_destination()->block_id();
1138 } 1161 }
1139 }; 1162 };
1140 1163
1141 1164
1142 class LJSArrayLength: public LUnaryOperation { 1165 class LJSArrayLength: public LUnaryOperation<1> {
1143 public: 1166 public:
1144 explicit LJSArrayLength(LOperand* input) : LUnaryOperation(input) { } 1167 explicit LJSArrayLength(LOperand* input) : LUnaryOperation<1>(input) { }
1145 1168
1146 DECLARE_CONCRETE_INSTRUCTION(JSArrayLength, "js-array-length") 1169 DECLARE_CONCRETE_INSTRUCTION(JSArrayLength, "js-array-length")
1147 DECLARE_HYDROGEN_ACCESSOR(JSArrayLength) 1170 DECLARE_HYDROGEN_ACCESSOR(JSArrayLength)
1148 }; 1171 };
1149 1172
1150 1173
1151 class LFixedArrayLength: public LUnaryOperation { 1174 class LFixedArrayLength: public LUnaryOperation<1> {
1152 public: 1175 public:
1153 explicit LFixedArrayLength(LOperand* input) : LUnaryOperation(input) { } 1176 explicit LFixedArrayLength(LOperand* input) : LUnaryOperation<1>(input) { }
1154 1177
1155 DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength, "fixed-array-length") 1178 DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength, "fixed-array-length")
1156 DECLARE_HYDROGEN_ACCESSOR(FixedArrayLength) 1179 DECLARE_HYDROGEN_ACCESSOR(FixedArrayLength)
1157 }; 1180 };
1158 1181
1159 1182
1160 class LValueOf: public LUnaryOperation { 1183 class LValueOf: public LUnaryOperation<1> {
1161 public: 1184 public:
1162 LValueOf(LOperand* input, LOperand* temporary) 1185 LValueOf(LOperand* input, LOperand* temporary)
1163 : LUnaryOperation(input), temporary_(temporary) { } 1186 : LUnaryOperation<1>(input), temporary_(temporary) { }
1164 1187
1165 LOperand* temporary() const { return temporary_; } 1188 LOperand* temporary() const { return temporary_; }
1166 1189
1167 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value-of") 1190 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value-of")
1168 DECLARE_HYDROGEN_ACCESSOR(ValueOf) 1191 DECLARE_HYDROGEN_ACCESSOR(ValueOf)
1169 1192
1170 private: 1193 private:
1171 LOperand* temporary_; 1194 LOperand* temporary_;
1172 }; 1195 };
1173 1196
1174 1197
1175 class LThrow: public LUnaryOperation { 1198 class LThrow: public LUnaryOperation<1> {
1176 public: 1199 public:
1177 explicit LThrow(LOperand* value) : LUnaryOperation(value) { } 1200 explicit LThrow(LOperand* value) : LUnaryOperation<1>(value) { }
1178 1201
1179 DECLARE_CONCRETE_INSTRUCTION(Throw, "throw") 1202 DECLARE_CONCRETE_INSTRUCTION(Throw, "throw")
1180 }; 1203 };
1181 1204
1182 1205
1183 class LBitNotI: public LUnaryOperation { 1206 class LBitNotI: public LUnaryOperation<1> {
1184 public: 1207 public:
1185 explicit LBitNotI(LOperand* use) : LUnaryOperation(use) { } 1208 explicit LBitNotI(LOperand* use) : LUnaryOperation<1>(use) { }
1186 1209
1187 DECLARE_CONCRETE_INSTRUCTION(BitNotI, "bit-not-i") 1210 DECLARE_CONCRETE_INSTRUCTION(BitNotI, "bit-not-i")
1188 }; 1211 };
1189 1212
1190 1213
1191 class LAddI: public LBinaryOperation { 1214 class LAddI: public LBinaryOperation {
1192 public: 1215 public:
1193 LAddI(LOperand* left, LOperand* right) 1216 LAddI(LOperand* left, LOperand* right)
1194 : LBinaryOperation(left, right) { } 1217 : LBinaryOperation(left, right) { }
1195 1218
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 virtual void CompileToNative(LCodeGen* generator); 1254 virtual void CompileToNative(LCodeGen* generator);
1232 virtual const char* Mnemonic() const; 1255 virtual const char* Mnemonic() const;
1233 1256
1234 Token::Value op() const { return op_; } 1257 Token::Value op() const { return op_; }
1235 1258
1236 private: 1259 private:
1237 Token::Value op_; 1260 Token::Value op_;
1238 }; 1261 };
1239 1262
1240 1263
1241 class LReturn: public LUnaryOperation { 1264 class LReturn: public LUnaryOperation<1> {
1242 public: 1265 public:
1243 explicit LReturn(LOperand* use) : LUnaryOperation(use) { } 1266 explicit LReturn(LOperand* use) : LUnaryOperation<1>(use) { }
1244 1267
1245 DECLARE_CONCRETE_INSTRUCTION(Return, "return") 1268 DECLARE_CONCRETE_INSTRUCTION(Return, "return")
1246 }; 1269 };
1247 1270
1248 1271
1249 class LLoadNamedField: public LUnaryOperation { 1272 class LLoadNamedField: public LUnaryOperation<1> {
1250 public: 1273 public:
1251 explicit LLoadNamedField(LOperand* object) : LUnaryOperation(object) { } 1274 explicit LLoadNamedField(LOperand* object) : LUnaryOperation<1>(object) { }
1252 1275
1253 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field") 1276 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field")
1254 DECLARE_HYDROGEN_ACCESSOR(LoadNamedField) 1277 DECLARE_HYDROGEN_ACCESSOR(LoadNamedField)
1255 }; 1278 };
1256 1279
1257 1280
1258 class LLoadNamedGeneric: public LUnaryOperation { 1281 class LLoadNamedGeneric: public LUnaryOperation<1> {
1259 public: 1282 public:
1260 explicit LLoadNamedGeneric(LOperand* object) : LUnaryOperation(object) { } 1283 explicit LLoadNamedGeneric(LOperand* object) : LUnaryOperation<1>(object) { }
1261 1284
1262 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic") 1285 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic")
1263 DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric) 1286 DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric)
1264 1287
1265 LOperand* object() const { return input(); } 1288 LOperand* object() const { return input(); }
1266 Handle<Object> name() const { return hydrogen()->name(); } 1289 Handle<Object> name() const { return hydrogen()->name(); }
1267 }; 1290 };
1268 1291
1269 1292
1270 class LLoadFunctionPrototype: public LUnaryOperation { 1293 class LLoadFunctionPrototype: public LUnaryOperation<1> {
1271 public: 1294 public:
1272 LLoadFunctionPrototype(LOperand* function, LOperand* temporary) 1295 LLoadFunctionPrototype(LOperand* function, LOperand* temporary)
1273 : LUnaryOperation(function), temporary_(temporary) { } 1296 : LUnaryOperation<1>(function), temporary_(temporary) { }
1274 1297
1275 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype") 1298 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype")
1276 DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype) 1299 DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype)
1277 1300
1278 LOperand* function() const { return input(); } 1301 LOperand* function() const { return input(); }
1279 LOperand* temporary() const { return temporary_; } 1302 LOperand* temporary() const { return temporary_; }
1280 1303
1281 private: 1304 private:
1282 LOperand* temporary_; 1305 LOperand* temporary_;
1283 }; 1306 };
1284 1307
1285 1308
1286 class LLoadElements: public LUnaryOperation { 1309 class LLoadElements: public LUnaryOperation<1> {
1287 public: 1310 public:
1288 explicit LLoadElements(LOperand* obj) : LUnaryOperation(obj) { } 1311 explicit LLoadElements(LOperand* obj) : LUnaryOperation<1>(obj) { }
1289 1312
1290 DECLARE_CONCRETE_INSTRUCTION(LoadElements, "load-elements") 1313 DECLARE_CONCRETE_INSTRUCTION(LoadElements, "load-elements")
1291 }; 1314 };
1292 1315
1293 1316
1294 class LLoadKeyedFastElement: public LBinaryOperation { 1317 class LLoadKeyedFastElement: public LBinaryOperation {
1295 public: 1318 public:
1296 LLoadKeyedFastElement(LOperand* elements, 1319 LLoadKeyedFastElement(LOperand* elements,
1297 LOperand* key, 1320 LOperand* key,
1298 LOperand* load_result) 1321 LOperand* load_result)
(...skipping 17 matching lines...) Expand all
1316 LLoadKeyedGeneric(LOperand* obj, LOperand* key) 1339 LLoadKeyedGeneric(LOperand* obj, LOperand* key)
1317 : LBinaryOperation(obj, key) { } 1340 : LBinaryOperation(obj, key) { }
1318 1341
1319 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load-keyed-generic") 1342 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load-keyed-generic")
1320 1343
1321 LOperand* object() const { return left(); } 1344 LOperand* object() const { return left(); }
1322 LOperand* key() const { return right(); } 1345 LOperand* key() const { return right(); }
1323 }; 1346 };
1324 1347
1325 1348
1326 class LLoadGlobal: public LInstruction { 1349 class LLoadGlobal: public LTemplateInstruction<1> {
1327 public: 1350 public:
1328 DECLARE_CONCRETE_INSTRUCTION(LoadGlobal, "load-global") 1351 DECLARE_CONCRETE_INSTRUCTION(LoadGlobal, "load-global")
1329 DECLARE_HYDROGEN_ACCESSOR(LoadGlobal) 1352 DECLARE_HYDROGEN_ACCESSOR(LoadGlobal)
1330 }; 1353 };
1331 1354
1332 1355
1333 class LStoreGlobal: public LUnaryOperation { 1356 class LStoreGlobal: public LUnaryOperation<1> {
1334 public: 1357 public:
1335 explicit LStoreGlobal(LOperand* value) : LUnaryOperation(value) {} 1358 explicit LStoreGlobal(LOperand* value) : LUnaryOperation<1>(value) {}
1336 1359
1337 DECLARE_CONCRETE_INSTRUCTION(StoreGlobal, "store-global") 1360 DECLARE_CONCRETE_INSTRUCTION(StoreGlobal, "store-global")
1338 DECLARE_HYDROGEN_ACCESSOR(StoreGlobal) 1361 DECLARE_HYDROGEN_ACCESSOR(StoreGlobal)
1339 }; 1362 };
1340 1363
1341 1364
1342 class LPushArgument: public LUnaryOperation { 1365 class LPushArgument: public LUnaryOperation<1> {
1343 public: 1366 public:
1344 explicit LPushArgument(LOperand* argument) : LUnaryOperation(argument) {} 1367 explicit LPushArgument(LOperand* argument) : LUnaryOperation<1>(argument) {}
1345 1368
1346 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument") 1369 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument")
1347 }; 1370 };
1348 1371
1349 1372
1350 class LGlobalObject: public LInstruction { 1373 class LGlobalObject: public LTemplateInstruction<1> {
1351 public: 1374 public:
1352 DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global-object") 1375 DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global-object")
1353 }; 1376 };
1354 1377
1355 1378
1356 class LGlobalReceiver: public LInstruction { 1379 class LGlobalReceiver: public LTemplateInstruction<1> {
1357 public: 1380 public:
1358 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global-receiver") 1381 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global-receiver")
1359 }; 1382 };
1360 1383
1361 1384
1362 class LCallConstantFunction: public LInstruction { 1385 class LCallConstantFunction: public LTemplateInstruction<1> {
1363 public: 1386 public:
1364 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call-constant-function") 1387 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call-constant-function")
1365 DECLARE_HYDROGEN_ACCESSOR(CallConstantFunction) 1388 DECLARE_HYDROGEN_ACCESSOR(CallConstantFunction)
1366 1389
1367 virtual void PrintDataTo(StringStream* stream) const; 1390 virtual void PrintDataTo(StringStream* stream);
1368 1391
1369 Handle<JSFunction> function() const { return hydrogen()->function(); } 1392 Handle<JSFunction> function() const { return hydrogen()->function(); }
1370 int arity() const { return hydrogen()->argument_count() - 1; } 1393 int arity() const { return hydrogen()->argument_count() - 1; }
1371 }; 1394 };
1372 1395
1373 1396
1374 class LCallKeyed: public LInstruction { 1397 class LCallKeyed: public LTemplateInstruction<1> {
1375 public: 1398 public:
1376 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed") 1399 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed")
1377 DECLARE_HYDROGEN_ACCESSOR(CallKeyed) 1400 DECLARE_HYDROGEN_ACCESSOR(CallKeyed)
1378 1401
1379 virtual void PrintDataTo(StringStream* stream) const; 1402 virtual void PrintDataTo(StringStream* stream);
1380 1403
1381 int arity() const { return hydrogen()->argument_count() - 1; } 1404 int arity() const { return hydrogen()->argument_count() - 1; }
1382 }; 1405 };
1383 1406
1384 1407
1385 class LCallNamed: public LInstruction { 1408 class LCallNamed: public LTemplateInstruction<1> {
1386 public: 1409 public:
1387 DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call-named") 1410 DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call-named")
1388 DECLARE_HYDROGEN_ACCESSOR(CallNamed) 1411 DECLARE_HYDROGEN_ACCESSOR(CallNamed)
1389 1412
1390 virtual void PrintDataTo(StringStream* stream) const; 1413 virtual void PrintDataTo(StringStream* stream);
1391 1414
1392 Handle<String> name() const { return hydrogen()->name(); } 1415 Handle<String> name() const { return hydrogen()->name(); }
1393 int arity() const { return hydrogen()->argument_count() - 1; } 1416 int arity() const { return hydrogen()->argument_count() - 1; }
1394 }; 1417 };
1395 1418
1396 1419
1397 class LCallFunction: public LInstruction { 1420 class LCallFunction: public LTemplateInstruction<1> {
1398 public: 1421 public:
1399 DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call-function") 1422 DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call-function")
1400 DECLARE_HYDROGEN_ACCESSOR(CallFunction) 1423 DECLARE_HYDROGEN_ACCESSOR(CallFunction)
1401 1424
1402 int arity() const { return hydrogen()->argument_count() - 2; } 1425 int arity() const { return hydrogen()->argument_count() - 2; }
1403 }; 1426 };
1404 1427
1405 1428
1406 class LCallGlobal: public LInstruction { 1429 class LCallGlobal: public LTemplateInstruction<1> {
1407 public: 1430 public:
1408 DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call-global") 1431 DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call-global")
1409 DECLARE_HYDROGEN_ACCESSOR(CallGlobal) 1432 DECLARE_HYDROGEN_ACCESSOR(CallGlobal)
1410 1433
1411 virtual void PrintDataTo(StringStream* stream) const; 1434 virtual void PrintDataTo(StringStream* stream);
1412 1435
1413 Handle<String> name() const {return hydrogen()->name(); } 1436 Handle<String> name() const {return hydrogen()->name(); }
1414 int arity() const { return hydrogen()->argument_count() - 1; } 1437 int arity() const { return hydrogen()->argument_count() - 1; }
1415 }; 1438 };
1416 1439
1417 1440
1418 class LCallKnownGlobal: public LInstruction { 1441 class LCallKnownGlobal: public LTemplateInstruction<1> {
1419 public: 1442 public:
1420 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call-known-global") 1443 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call-known-global")
1421 DECLARE_HYDROGEN_ACCESSOR(CallKnownGlobal) 1444 DECLARE_HYDROGEN_ACCESSOR(CallKnownGlobal)
1422 1445
1423 virtual void PrintDataTo(StringStream* stream) const; 1446 virtual void PrintDataTo(StringStream* stream);
1424 1447
1425 Handle<JSFunction> target() const { return hydrogen()->target(); } 1448 Handle<JSFunction> target() const { return hydrogen()->target(); }
1426 int arity() const { return hydrogen()->argument_count() - 1; } 1449 int arity() const { return hydrogen()->argument_count() - 1; }
1427 }; 1450 };
1428 1451
1429 1452
1430 class LCallNew: public LUnaryOperation { 1453 class LCallNew: public LUnaryOperation<1> {
1431 public: 1454 public:
1432 explicit LCallNew(LOperand* constructor) : LUnaryOperation(constructor) { } 1455 explicit LCallNew(LOperand* constructor) : LUnaryOperation<1>(constructor) { }
1433 1456
1434 DECLARE_CONCRETE_INSTRUCTION(CallNew, "call-new") 1457 DECLARE_CONCRETE_INSTRUCTION(CallNew, "call-new")
1435 DECLARE_HYDROGEN_ACCESSOR(CallNew) 1458 DECLARE_HYDROGEN_ACCESSOR(CallNew)
1436 1459
1437 virtual void PrintDataTo(StringStream* stream) const; 1460 virtual void PrintDataTo(StringStream* stream);
1438 1461
1439 int arity() const { return hydrogen()->argument_count() - 1; } 1462 int arity() const { return hydrogen()->argument_count() - 1; }
1440 }; 1463 };
1441 1464
1442 1465
1443 class LCallRuntime: public LInstruction { 1466 class LCallRuntime: public LTemplateInstruction<1> {
1444 public: 1467 public:
1445 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime") 1468 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
1446 DECLARE_HYDROGEN_ACCESSOR(CallRuntime) 1469 DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
1447 1470
1448 Runtime::Function* function() const { return hydrogen()->function(); } 1471 Runtime::Function* function() const { return hydrogen()->function(); }
1449 int arity() const { return hydrogen()->argument_count(); } 1472 int arity() const { return hydrogen()->argument_count(); }
1450 }; 1473 };
1451 1474
1452 1475
1453 class LInteger32ToDouble: public LUnaryOperation { 1476 class LInteger32ToDouble: public LUnaryOperation<1> {
1454 public: 1477 public:
1455 explicit LInteger32ToDouble(LOperand* use) : LUnaryOperation(use) { } 1478 explicit LInteger32ToDouble(LOperand* use) : LUnaryOperation<1>(use) { }
1456 1479
1457 DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double") 1480 DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double")
1458 }; 1481 };
1459 1482
1460 1483
1461 class LNumberTagI: public LUnaryOperation { 1484 class LNumberTagI: public LUnaryOperation<1> {
1462 public: 1485 public:
1463 explicit LNumberTagI(LOperand* use) : LUnaryOperation(use) { } 1486 explicit LNumberTagI(LOperand* use) : LUnaryOperation<1>(use) { }
1464 1487
1465 DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i") 1488 DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i")
1466 }; 1489 };
1467 1490
1468 1491
1469 class LNumberTagD: public LUnaryOperation { 1492 class LNumberTagD: public LUnaryOperation<1> {
1470 public: 1493 public:
1471 explicit LNumberTagD(LOperand* value, LOperand* temp) 1494 explicit LNumberTagD(LOperand* value, LOperand* temp)
1472 : LUnaryOperation(value), temp_(temp) { } 1495 : LUnaryOperation<1>(value), temp_(temp) { }
1473 1496
1474 DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d") 1497 DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d")
1475 1498
1476 LOperand* temp() const { return temp_; } 1499 LOperand* temp() const { return temp_; }
1477 1500
1478 private: 1501 private:
1479 LOperand* temp_; 1502 LOperand* temp_;
1480 }; 1503 };
1481 1504
1482 1505
1483 // Sometimes truncating conversion from a tagged value to an int32. 1506 // Sometimes truncating conversion from a tagged value to an int32.
1484 class LDoubleToI: public LUnaryOperation { 1507 class LDoubleToI: public LUnaryOperation<1> {
1485 public: 1508 public:
1486 explicit LDoubleToI(LOperand* value) : LUnaryOperation(value) { } 1509 explicit LDoubleToI(LOperand* value) : LUnaryOperation<1>(value) { }
1487 1510
1488 DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i") 1511 DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
1489 DECLARE_HYDROGEN_ACCESSOR(Change) 1512 DECLARE_HYDROGEN_ACCESSOR(Change)
1490 1513
1491 bool truncating() { return hydrogen()->CanTruncateToInt32(); } 1514 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1492 }; 1515 };
1493 1516
1494 1517
1495 // Truncating conversion from a tagged value to an int32. 1518 // Truncating conversion from a tagged value to an int32.
1496 class LTaggedToI: public LUnaryOperation { 1519 class LTaggedToI: public LUnaryOperation<1> {
1497 public: 1520 public:
1498 LTaggedToI(LOperand* value, LOperand* temp) 1521 LTaggedToI(LOperand* value, LOperand* temp)
1499 : LUnaryOperation(value), temp_(temp) { } 1522 : LUnaryOperation<1>(value), temp_(temp) { }
1500 1523
1501 DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i") 1524 DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
1502 DECLARE_HYDROGEN_ACCESSOR(Change) 1525 DECLARE_HYDROGEN_ACCESSOR(Change)
1503 1526
1504 bool truncating() { return hydrogen()->CanTruncateToInt32(); } 1527 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1505 LOperand* temp() const { return temp_; } 1528 LOperand* temp() const { return temp_; }
1506 1529
1507 private: 1530 private:
1508 LOperand* temp_; 1531 LOperand* temp_;
1509 }; 1532 };
1510 1533
1511 1534
1512 class LSmiTag: public LUnaryOperation { 1535 class LSmiTag: public LUnaryOperation<1> {
1513 public: 1536 public:
1514 explicit LSmiTag(LOperand* use) : LUnaryOperation(use) { } 1537 explicit LSmiTag(LOperand* use) : LUnaryOperation<1>(use) { }
1515 1538
1516 DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag") 1539 DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag")
1517 }; 1540 };
1518 1541
1519 1542
1520 class LNumberUntagD: public LUnaryOperation { 1543 class LNumberUntagD: public LUnaryOperation<1> {
1521 public: 1544 public:
1522 explicit LNumberUntagD(LOperand* value) : LUnaryOperation(value) { } 1545 explicit LNumberUntagD(LOperand* value) : LUnaryOperation<1>(value) { }
1523 1546
1524 DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag") 1547 DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
1525 }; 1548 };
1526 1549
1527 1550
1528 class LSmiUntag: public LUnaryOperation { 1551 class LSmiUntag: public LUnaryOperation<1> {
1529 public: 1552 public:
1530 LSmiUntag(LOperand* use, bool needs_check) 1553 LSmiUntag(LOperand* use, bool needs_check)
1531 : LUnaryOperation(use), needs_check_(needs_check) { } 1554 : LUnaryOperation<1>(use), needs_check_(needs_check) { }
1532 1555
1533 DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag") 1556 DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag")
1534 1557
1535 bool needs_check() const { return needs_check_; } 1558 bool needs_check() const { return needs_check_; }
1536 1559
1537 private: 1560 private:
1538 bool needs_check_; 1561 bool needs_check_;
1539 }; 1562 };
1540 1563
1541 1564
1542 class LStoreNamed: public LInstruction { 1565 class LStoreNamed: public LTemplateInstruction<0> {
1543 public: 1566 public:
1544 LStoreNamed(LOperand* obj, Handle<Object> name, LOperand* val) 1567 LStoreNamed(LOperand* obj, Handle<Object> name, LOperand* val)
1545 : object_(obj), name_(name), value_(val) { } 1568 : object_(obj), name_(name), value_(val) { }
1546 1569
1547 DECLARE_INSTRUCTION(StoreNamed) 1570 DECLARE_INSTRUCTION(StoreNamed)
1548 1571
1549 virtual void PrintDataTo(StringStream* stream) const; 1572 virtual void PrintDataTo(StringStream* stream);
1550 1573
1551 LOperand* object() const { return object_; } 1574 LOperand* object() const { return object_; }
1552 Handle<Object> name() const { return name_; } 1575 Handle<Object> name() const { return name_; }
1553 LOperand* value() const { return value_; } 1576 LOperand* value() const { return value_; }
1554 1577
1555 private: 1578 private:
1556 LOperand* object_; 1579 LOperand* object_;
1557 Handle<Object> name_; 1580 Handle<Object> name_;
1558 LOperand* value_; 1581 LOperand* value_;
1559 }; 1582 };
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1598 public: 1621 public:
1599 LStoreNamedGeneric(LOperand* obj, 1622 LStoreNamedGeneric(LOperand* obj,
1600 Handle<Object> name, 1623 Handle<Object> name,
1601 LOperand* val) 1624 LOperand* val)
1602 : LStoreNamed(obj, name, val) { } 1625 : LStoreNamed(obj, name, val) { }
1603 1626
1604 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic") 1627 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic")
1605 }; 1628 };
1606 1629
1607 1630
1608 class LStoreKeyed: public LInstruction { 1631 class LStoreKeyed: public LTemplateInstruction<0> {
1609 public: 1632 public:
1610 LStoreKeyed(LOperand* obj, LOperand* key, LOperand* val) 1633 LStoreKeyed(LOperand* obj, LOperand* key, LOperand* val)
1611 : object_(obj), key_(key), value_(val) { } 1634 : object_(obj), key_(key), value_(val) { }
1612 1635
1613 DECLARE_INSTRUCTION(StoreKeyed) 1636 DECLARE_INSTRUCTION(StoreKeyed)
1614 1637
1615 virtual void PrintDataTo(StringStream* stream) const; 1638 virtual void PrintDataTo(StringStream* stream);
1616 1639
1617 LOperand* object() const { return object_; } 1640 LOperand* object() const { return object_; }
1618 LOperand* key() const { return key_; } 1641 LOperand* key() const { return key_; }
1619 LOperand* value() const { return value_; } 1642 LOperand* value() const { return value_; }
1620 1643
1621 private: 1644 private:
1622 LOperand* object_; 1645 LOperand* object_;
1623 LOperand* key_; 1646 LOperand* key_;
1624 LOperand* value_; 1647 LOperand* value_;
1625 }; 1648 };
(...skipping 12 matching lines...) Expand all
1638 1661
1639 class LStoreKeyedGeneric: public LStoreKeyed { 1662 class LStoreKeyedGeneric: public LStoreKeyed {
1640 public: 1663 public:
1641 LStoreKeyedGeneric(LOperand* obj, LOperand* key, LOperand* val) 1664 LStoreKeyedGeneric(LOperand* obj, LOperand* key, LOperand* val)
1642 : LStoreKeyed(obj, key, val) { } 1665 : LStoreKeyed(obj, key, val) { }
1643 1666
1644 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic") 1667 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic")
1645 }; 1668 };
1646 1669
1647 1670
1648 class LCheckFunction: public LUnaryOperation { 1671 class LCheckFunction: public LUnaryOperation<0> {
1649 public: 1672 public:
1650 explicit LCheckFunction(LOperand* use) : LUnaryOperation(use) { } 1673 explicit LCheckFunction(LOperand* use) : LUnaryOperation<0>(use) { }
1651 1674
1652 DECLARE_CONCRETE_INSTRUCTION(CheckFunction, "check-function") 1675 DECLARE_CONCRETE_INSTRUCTION(CheckFunction, "check-function")
1653 DECLARE_HYDROGEN_ACCESSOR(CheckFunction) 1676 DECLARE_HYDROGEN_ACCESSOR(CheckFunction)
1654 }; 1677 };
1655 1678
1656 1679
1657 class LCheckInstanceType: public LUnaryOperation { 1680 class LCheckInstanceType: public LUnaryOperation<0> {
1658 public: 1681 public:
1659 LCheckInstanceType(LOperand* use, LOperand* temp) 1682 LCheckInstanceType(LOperand* use, LOperand* temp)
1660 : LUnaryOperation(use), temp_(temp) { } 1683 : LUnaryOperation<0>(use), temp_(temp) { }
1661 1684
1662 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type") 1685 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type")
1663 DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType) 1686 DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType)
1664 1687
1665 LOperand* temp() const { return temp_; } 1688 LOperand* temp() const { return temp_; }
1666 1689
1667 private: 1690 private:
1668 LOperand* temp_; 1691 LOperand* temp_;
1669 }; 1692 };
1670 1693
1671 1694
1672 class LCheckMap: public LUnaryOperation { 1695 class LCheckMap: public LUnaryOperation<0> {
1673 public: 1696 public:
1674 explicit LCheckMap(LOperand* use) : LUnaryOperation(use) { } 1697 explicit LCheckMap(LOperand* use) : LUnaryOperation<0>(use) { }
1675 1698
1676 DECLARE_CONCRETE_INSTRUCTION(CheckMap, "check-map") 1699 DECLARE_CONCRETE_INSTRUCTION(CheckMap, "check-map")
1677 DECLARE_HYDROGEN_ACCESSOR(CheckMap) 1700 DECLARE_HYDROGEN_ACCESSOR(CheckMap)
1678 }; 1701 };
1679 1702
1680 1703
1681 class LCheckPrototypeMaps: public LInstruction { 1704 class LCheckPrototypeMaps: public LTemplateInstruction<0> {
1682 public: 1705 public:
1683 LCheckPrototypeMaps(LOperand* temp, 1706 LCheckPrototypeMaps(LOperand* temp,
1684 Handle<JSObject> holder, 1707 Handle<JSObject> holder,
1685 Handle<Map> receiver_map) 1708 Handle<Map> receiver_map)
1686 : temp_(temp), 1709 : temp_(temp),
1687 holder_(holder), 1710 holder_(holder),
1688 receiver_map_(receiver_map) { } 1711 receiver_map_(receiver_map) { }
1689 1712
1690 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps") 1713 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps")
1691 1714
1692 LOperand* temp() const { return temp_; } 1715 LOperand* temp() const { return temp_; }
1693 Handle<JSObject> holder() const { return holder_; } 1716 Handle<JSObject> holder() const { return holder_; }
1694 Handle<Map> receiver_map() const { return receiver_map_; } 1717 Handle<Map> receiver_map() const { return receiver_map_; }
1695 1718
1696 private: 1719 private:
1697 LOperand* temp_; 1720 LOperand* temp_;
1698 Handle<JSObject> holder_; 1721 Handle<JSObject> holder_;
1699 Handle<Map> receiver_map_; 1722 Handle<Map> receiver_map_;
1700 }; 1723 };
1701 1724
1702 1725
1703 class LCheckSmi: public LUnaryOperation { 1726 class LCheckSmi: public LUnaryOperation<0> {
1704 public: 1727 public:
1705 LCheckSmi(LOperand* use, Condition condition) 1728 LCheckSmi(LOperand* use, Condition condition)
1706 : LUnaryOperation(use), condition_(condition) { } 1729 : LUnaryOperation<0>(use), condition_(condition) { }
1707 1730
1708 Condition condition() const { return condition_; } 1731 Condition condition() const { return condition_; }
1709 1732
1710 virtual void CompileToNative(LCodeGen* generator); 1733 virtual void CompileToNative(LCodeGen* generator);
1711 virtual const char* Mnemonic() const { 1734 virtual const char* Mnemonic() const {
1712 return (condition_ == zero) ? "check-non-smi" : "check-smi"; 1735 return (condition_ == zero) ? "check-non-smi" : "check-smi";
1713 } 1736 }
1714 1737
1715 private: 1738 private:
1716 Condition condition_; 1739 Condition condition_;
1717 }; 1740 };
1718 1741
1719 1742
1720 class LMaterializedLiteral: public LInstruction { 1743 class LMaterializedLiteral: public LTemplateInstruction<1> {
1721 public: 1744 public:
1722 DECLARE_INSTRUCTION(MaterializedLiteral) 1745 DECLARE_INSTRUCTION(MaterializedLiteral)
1723 }; 1746 };
1724 1747
1725 1748
1726 class LArrayLiteral: public LMaterializedLiteral { 1749 class LArrayLiteral: public LMaterializedLiteral {
1727 public: 1750 public:
1728 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array-literal") 1751 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array-literal")
1729 DECLARE_HYDROGEN_ACCESSOR(ArrayLiteral) 1752 DECLARE_HYDROGEN_ACCESSOR(ArrayLiteral)
1730 }; 1753 };
1731 1754
1732 1755
1733 class LObjectLiteral: public LMaterializedLiteral { 1756 class LObjectLiteral: public LMaterializedLiteral {
1734 public: 1757 public:
1735 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object-literal") 1758 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object-literal")
1736 DECLARE_HYDROGEN_ACCESSOR(ObjectLiteral) 1759 DECLARE_HYDROGEN_ACCESSOR(ObjectLiteral)
1737 }; 1760 };
1738 1761
1739 1762
1740 class LRegExpLiteral: public LMaterializedLiteral { 1763 class LRegExpLiteral: public LMaterializedLiteral {
1741 public: 1764 public:
1742 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal") 1765 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal")
1743 DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral) 1766 DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral)
1744 }; 1767 };
1745 1768
1746 1769
1747 class LFunctionLiteral: public LInstruction { 1770 class LFunctionLiteral: public LTemplateInstruction<1> {
1748 public: 1771 public:
1749 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal") 1772 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal")
1750 DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral) 1773 DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral)
1751 1774
1752 Handle<SharedFunctionInfo> shared_info() { return hydrogen()->shared_info(); } 1775 Handle<SharedFunctionInfo> shared_info() { return hydrogen()->shared_info(); }
1753 }; 1776 };
1754 1777
1755 1778
1756 class LTypeof: public LUnaryOperation { 1779 class LTypeof: public LUnaryOperation<1> {
1757 public: 1780 public:
1758 explicit LTypeof(LOperand* input) : LUnaryOperation(input) { } 1781 explicit LTypeof(LOperand* input) : LUnaryOperation<1>(input) { }
1759 1782
1760 DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof") 1783 DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
1761 }; 1784 };
1762 1785
1763 1786
1764 class LTypeofIs: public LUnaryOperation { 1787 class LTypeofIs: public LUnaryOperation<1> {
1765 public: 1788 public:
1766 explicit LTypeofIs(LOperand* input) : LUnaryOperation(input) { } 1789 explicit LTypeofIs(LOperand* input) : LUnaryOperation<1>(input) { }
1767 virtual void PrintDataTo(StringStream* stream) const; 1790 virtual void PrintDataTo(StringStream* stream);
1768 1791
1769 DECLARE_CONCRETE_INSTRUCTION(TypeofIs, "typeof-is") 1792 DECLARE_CONCRETE_INSTRUCTION(TypeofIs, "typeof-is")
1770 DECLARE_HYDROGEN_ACCESSOR(TypeofIs) 1793 DECLARE_HYDROGEN_ACCESSOR(TypeofIs)
1771 1794
1772 Handle<String> type_literal() { return hydrogen()->type_literal(); } 1795 Handle<String> type_literal() { return hydrogen()->type_literal(); }
1773 }; 1796 };
1774 1797
1775 1798
1776 class LTypeofIsAndBranch: public LTypeofIs { 1799 class LTypeofIsAndBranch: public LTypeofIs {
1777 public: 1800 public:
1778 LTypeofIsAndBranch(LOperand* value, 1801 LTypeofIsAndBranch(LOperand* value,
1779 int true_block_id, 1802 int true_block_id,
1780 int false_block_id) 1803 int false_block_id)
1781 : LTypeofIs(value), 1804 : LTypeofIs(value),
1782 true_block_id_(true_block_id), 1805 true_block_id_(true_block_id),
1783 false_block_id_(false_block_id) { } 1806 false_block_id_(false_block_id) { }
1784 1807
1785 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch") 1808 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
1786 1809
1787 virtual void PrintDataTo(StringStream* stream) const; 1810 virtual void PrintDataTo(StringStream* stream);
1788 virtual bool IsControl() const { return true; } 1811 virtual bool IsControl() const { return true; }
1789 1812
1790 int true_block_id() const { return true_block_id_; } 1813 int true_block_id() const { return true_block_id_; }
1791 int false_block_id() const { return false_block_id_; } 1814 int false_block_id() const { return false_block_id_; }
1792 1815
1793 private: 1816 private:
1794 int true_block_id_; 1817 int true_block_id_;
1795 int false_block_id_; 1818 int false_block_id_;
1796 }; 1819 };
1797 1820
1798 1821
1799 class LDeleteProperty: public LBinaryOperation { 1822 class LDeleteProperty: public LBinaryOperation {
1800 public: 1823 public:
1801 LDeleteProperty(LOperand* obj, LOperand* key) : LBinaryOperation(obj, key) {} 1824 LDeleteProperty(LOperand* obj, LOperand* key) : LBinaryOperation(obj, key) {}
1802 1825
1803 DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property") 1826 DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property")
1804 1827
1805 LOperand* object() const { return left(); } 1828 LOperand* object() const { return left(); }
1806 LOperand* key() const { return right(); } 1829 LOperand* key() const { return right(); }
1807 }; 1830 };
1808 1831
1809 1832
1810 class LOsrEntry: public LInstruction { 1833 class LOsrEntry: public LTemplateInstruction<0> {
1811 public: 1834 public:
1812 LOsrEntry(); 1835 LOsrEntry();
1813 1836
1814 DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry") 1837 DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry")
1815 1838
1816 LOperand** SpilledRegisterArray() { return register_spills_; } 1839 LOperand** SpilledRegisterArray() { return register_spills_; }
1817 LOperand** SpilledDoubleRegisterArray() { return double_register_spills_; } 1840 LOperand** SpilledDoubleRegisterArray() { return double_register_spills_; }
1818 1841
1819 void MarkSpilledRegister(int allocation_index, LOperand* spill_operand); 1842 void MarkSpilledRegister(int allocation_index, LOperand* spill_operand);
1820 void MarkSpilledDoubleRegister(int allocation_index, 1843 void MarkSpilledDoubleRegister(int allocation_index,
1821 LOperand* spill_operand); 1844 LOperand* spill_operand);
1822 1845
1823 private: 1846 private:
1824 // Arrays of spill slot operands for registers with an assigned spill 1847 // Arrays of spill slot operands for registers with an assigned spill
1825 // slot, i.e., that must also be restored to the spill slot on OSR entry. 1848 // slot, i.e., that must also be restored to the spill slot on OSR entry.
1826 // NULL if the register has no assigned spill slot. Indexed by allocation 1849 // NULL if the register has no assigned spill slot. Indexed by allocation
1827 // index. 1850 // index.
1828 LOperand* register_spills_[Register::kNumAllocatableRegisters]; 1851 LOperand* register_spills_[Register::kNumAllocatableRegisters];
1829 LOperand* double_register_spills_[DoubleRegister::kNumAllocatableRegisters]; 1852 LOperand* double_register_spills_[DoubleRegister::kNumAllocatableRegisters];
1830 }; 1853 };
1831 1854
1832 1855
1833 class LStackCheck: public LInstruction { 1856 class LStackCheck: public LTemplateInstruction<0> {
1834 public: 1857 public:
1835 DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check") 1858 DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check")
1836 }; 1859 };
1837 1860
1838 1861
1839 class LPointerMap: public ZoneObject { 1862 class LPointerMap: public ZoneObject {
1840 public: 1863 public:
1841 explicit LPointerMap(int position) 1864 explicit LPointerMap(int position)
1842 : pointer_operands_(8), position_(position), lithium_position_(-1) { } 1865 : pointer_operands_(8), position_(position), lithium_position_(-1) { }
1843 1866
1844 const ZoneList<LOperand*>* operands() const { return &pointer_operands_; } 1867 const ZoneList<LOperand*>* operands() const { return &pointer_operands_; }
1845 int position() const { return position_; } 1868 int position() const { return position_; }
1846 int lithium_position() const { return lithium_position_; } 1869 int lithium_position() const { return lithium_position_; }
1847 1870
1848 void set_lithium_position(int pos) { 1871 void set_lithium_position(int pos) {
1849 ASSERT(lithium_position_ == -1); 1872 ASSERT(lithium_position_ == -1);
1850 lithium_position_ = pos; 1873 lithium_position_ = pos;
1851 } 1874 }
1852 1875
1853 void RecordPointer(LOperand* op); 1876 void RecordPointer(LOperand* op);
1854 void PrintTo(StringStream* stream) const; 1877 void PrintTo(StringStream* stream);
1855 1878
1856 private: 1879 private:
1857 ZoneList<LOperand*> pointer_operands_; 1880 ZoneList<LOperand*> pointer_operands_;
1858 int position_; 1881 int position_;
1859 int lithium_position_; 1882 int lithium_position_;
1860 }; 1883 };
1861 1884
1862 1885
1863 class LEnvironment: public ZoneObject { 1886 class LEnvironment: public ZoneObject {
1864 public: 1887 public:
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1910 1933
1911 void SetSpilledRegisters(LOperand** registers, 1934 void SetSpilledRegisters(LOperand** registers,
1912 LOperand** double_registers) { 1935 LOperand** double_registers) {
1913 spilled_registers_ = registers; 1936 spilled_registers_ = registers;
1914 spilled_double_registers_ = double_registers; 1937 spilled_double_registers_ = double_registers;
1915 } 1938 }
1916 1939
1917 // Emit frame translation commands for this environment. 1940 // Emit frame translation commands for this environment.
1918 void WriteTranslation(LCodeGen* cgen, Translation* translation) const; 1941 void WriteTranslation(LCodeGen* cgen, Translation* translation) const;
1919 1942
1920 void PrintTo(StringStream* stream) const; 1943 void PrintTo(StringStream* stream);
1921 1944
1922 private: 1945 private:
1923 Handle<JSFunction> closure_; 1946 Handle<JSFunction> closure_;
1924 int arguments_stack_height_; 1947 int arguments_stack_height_;
1925 int deoptimization_index_; 1948 int deoptimization_index_;
1926 int translation_index_; 1949 int translation_index_;
1927 int ast_id_; 1950 int ast_id_;
1928 int parameter_count_; 1951 int parameter_count_;
1929 ZoneList<LOperand*> values_; 1952 ZoneList<LOperand*> values_;
1930 ZoneList<Representation> representations_; 1953 ZoneList<Representation> representations_;
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
2070 LOperand* UseTempRegister(HValue* value); 2093 LOperand* UseTempRegister(HValue* value);
2071 LOperand* Use(HValue* value); 2094 LOperand* Use(HValue* value);
2072 LOperand* UseAtStart(HValue* value); 2095 LOperand* UseAtStart(HValue* value);
2073 LOperand* UseOrConstant(HValue* value); 2096 LOperand* UseOrConstant(HValue* value);
2074 LOperand* UseOrConstantAtStart(HValue* value); 2097 LOperand* UseOrConstantAtStart(HValue* value);
2075 LOperand* UseRegisterOrConstant(HValue* value); 2098 LOperand* UseRegisterOrConstant(HValue* value);
2076 LOperand* UseRegisterOrConstantAtStart(HValue* value); 2099 LOperand* UseRegisterOrConstantAtStart(HValue* value);
2077 2100
2078 // Methods for setting up define-use relationships. 2101 // Methods for setting up define-use relationships.
2079 // Return the same instruction that they are passed. 2102 // Return the same instruction that they are passed.
2080 LInstruction* Define(LInstruction* instr, LUnallocated* result); 2103 LInstruction* Define(LTemplateInstruction<1>* instr, LUnallocated* result);
2081 LInstruction* Define(LInstruction* instr); 2104 LInstruction* Define(LTemplateInstruction<1>* instr);
2082 LInstruction* DefineAsRegister(LInstruction* instr); 2105 LInstruction* DefineAsRegister(LTemplateInstruction<1>* instr);
2083 LInstruction* DefineAsSpilled(LInstruction* instr, int index); 2106 LInstruction* DefineAsSpilled(LTemplateInstruction<1>* instr, int index);
2084 LInstruction* DefineSameAsFirst(LInstruction* instr); 2107 LInstruction* DefineSameAsFirst(LTemplateInstruction<1>* instr);
2085 LInstruction* DefineFixed(LInstruction* instr, Register reg); 2108 LInstruction* DefineFixed(LTemplateInstruction<1>* instr, Register reg);
2086 LInstruction* DefineFixedDouble(LInstruction* instr, XMMRegister reg); 2109 LInstruction* DefineFixedDouble(LTemplateInstruction<1>* instr,
2110 XMMRegister reg);
2087 LInstruction* AssignEnvironment(LInstruction* instr); 2111 LInstruction* AssignEnvironment(LInstruction* instr);
2088 LInstruction* AssignPointerMap(LInstruction* instr); 2112 LInstruction* AssignPointerMap(LInstruction* instr);
2089 2113
2090 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY }; 2114 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2091 2115
2092 // By default we assume that instruction sequences generated for calls 2116 // By default we assume that instruction sequences generated for calls
2093 // cannot deoptimize eagerly and we do not attach environment to this 2117 // cannot deoptimize eagerly and we do not attach environment to this
2094 // instruction. 2118 // instruction.
2095 LInstruction* MarkAsCall( 2119 LInstruction* MarkAsCall(
2096 LInstruction* instr, 2120 LInstruction* instr,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2136 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder); 2160 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
2137 }; 2161 };
2138 2162
2139 #undef DECLARE_HYDROGEN_ACCESSOR 2163 #undef DECLARE_HYDROGEN_ACCESSOR
2140 #undef DECLARE_INSTRUCTION 2164 #undef DECLARE_INSTRUCTION
2141 #undef DECLARE_CONCRETE_INSTRUCTION 2165 #undef DECLARE_CONCRETE_INSTRUCTION
2142 2166
2143 } } // namespace v8::internal 2167 } } // namespace v8::internal
2144 2168
2145 #endif // V8_IA32_LITHIUM_IA32_H_ 2169 #endif // V8_IA32_LITHIUM_IA32_H_
OLDNEW
« no previous file with comments | « no previous file | src/ia32/lithium-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698