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

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

Issue 6237002: Remove the remaining LOperand-members from concrete LIR instructions.... (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 | « src/ia32/lithium-codegen-ia32.cc ('k') | 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 25 matching lines...) Expand all
36 namespace v8 { 36 namespace v8 {
37 namespace internal { 37 namespace internal {
38 38
39 // Forward declarations. 39 // Forward declarations.
40 class LCodeGen; 40 class LCodeGen;
41 41
42 42
43 // Type hierarchy: 43 // Type hierarchy:
44 // 44 //
45 // LInstruction 45 // LInstruction
46 // LAccessArgumentsAt 46 // LTemplateInstruction
47 // LArgumentsElements 47 // LControlInstruction
48 // LArgumentsLength 48 // LBranch
49 // LBinaryOperation 49 // LClassOfTestAndBranch
50 // LCmpJSObjectEqAndBranch
51 // LCmpIDAndBranch
52 // LHasCachedArrayIndexAndBranch
53 // LHasInstanceTypeAndBranch
54 // LInstanceOfAndBranch
55 // LIsNullAndBranch
56 // LIsObjectAndBranch
57 // LIsSmiAndBranch
58 // LTypeofIsAndBranch
59 // LAccessArgumentsAt
60 // LArgumentsElements
61 // LArgumentsLength
50 // LAddI 62 // LAddI
51 // LApplyArguments 63 // LApplyArguments
52 // LArithmeticD 64 // LArithmeticD
53 // LArithmeticT 65 // LArithmeticT
54 // LBitI 66 // LBitI
55 // LBoundsCheck 67 // LBoundsCheck
56 // LCmpID 68 // LCmpID
57 // LCmpIDAndBranch
58 // LCmpJSObjectEq 69 // LCmpJSObjectEq
59 // LCmpJSObjectEqAndBranch
60 // LCmpT 70 // LCmpT
61 // LDivI 71 // LDivI
62 // LInstanceOf 72 // LInstanceOf
63 // LInstanceOfAndBranch
64 // LInstanceOfKnownGlobal 73 // LInstanceOfKnownGlobal
65 // LLoadKeyedFastElement 74 // LLoadKeyedFastElement
66 // LLoadKeyedGeneric 75 // LLoadKeyedGeneric
67 // LModI 76 // LModI
68 // LMulI 77 // LMulI
69 // LPower 78 // LPower
70 // LShiftI 79 // LShiftI
71 // LSubI 80 // LSubI
72 // LCallConstantFunction 81 // LCallConstantFunction
73 // LCallFunction 82 // LCallFunction
74 // LCallGlobal 83 // LCallGlobal
75 // LCallKeyed 84 // LCallKeyed
76 // LCallKnownGlobal 85 // LCallKnownGlobal
77 // LCallNamed 86 // LCallNamed
78 // LCallRuntime 87 // LCallRuntime
79 // LCallStub 88 // LCallStub
80 // LCheckPrototypeMaps 89 // LConstant
81 // LConstant 90 // LConstantD
82 // LConstantD 91 // LConstantI
83 // LConstantI 92 // LConstantT
84 // LConstantT 93 // LDeoptimize
85 // LDeoptimize 94 // LFunctionLiteral
86 // LFunctionLiteral 95 // LGap
87 // LGap 96 // LLabel
88 // LLabel 97 // LGlobalObject
89 // LGlobalObject 98 // LGlobalReceiver
90 // LGlobalReceiver 99 // LGoto
91 // LGoto 100 // LLazyBailout
92 // LLazyBailout 101 // LLoadGlobal
93 // LLoadGlobal
94 // LMaterializedLiteral
95 // LArrayLiteral 102 // LArrayLiteral
96 // LObjectLiteral 103 // LObjectLiteral
97 // LRegExpLiteral 104 // LRegExpLiteral
98 // LOsrEntry 105 // LOsrEntry
99 // LParameter 106 // LParameter
100 // LRegExpConstructResult 107 // LRegExpConstructResult
101 // LStackCheck 108 // LStackCheck
102 // LStoreKeyed 109 // LStoreKeyed
103 // LStoreKeyedFastElement 110 // LStoreKeyedFastElement
104 // LStoreKeyedGeneric 111 // LStoreKeyedGeneric
105 // LStoreNamed 112 // LStoreNamed
106 // LStoreNamedField 113 // LStoreNamedField
107 // LStoreNamedGeneric 114 // LStoreNamedGeneric
108 // LUnaryOperation
109 // LBitNotI 115 // LBitNotI
110 // LBranch
111 // LCallNew 116 // LCallNew
112 // LCheckFunction 117 // LCheckFunction
118 // LCheckPrototypeMaps
113 // LCheckInstanceType 119 // LCheckInstanceType
114 // LCheckMap 120 // LCheckMap
115 // LCheckSmi 121 // LCheckSmi
116 // LClassOfTest 122 // LClassOfTest
117 // LClassOfTestAndBranch
118 // LDeleteProperty 123 // LDeleteProperty
119 // LDoubleToI 124 // LDoubleToI
120 // LFixedArrayLength 125 // LFixedArrayLength
121 // LHasCachedArrayIndex 126 // LHasCachedArrayIndex
122 // LHasCachedArrayIndexAndBranch
123 // LHasInstanceType 127 // LHasInstanceType
124 // LHasInstanceTypeAndBranch
125 // LInteger32ToDouble 128 // LInteger32ToDouble
126 // LIsNull 129 // LIsNull
127 // LIsNullAndBranch
128 // LIsObject 130 // LIsObject
129 // LIsObjectAndBranch
130 // LIsSmi 131 // LIsSmi
131 // LIsSmiAndBranch
132 // LJSArrayLength 132 // LJSArrayLength
133 // LLoadNamedField 133 // LLoadNamedField
134 // LLoadNamedGeneric 134 // LLoadNamedGeneric
135 // LLoadFunctionPrototype 135 // LLoadFunctionPrototype
136 // LNumberTagD 136 // LNumberTagD
137 // LNumberTagI 137 // LNumberTagI
138 // LPushArgument 138 // LPushArgument
139 // LReturn 139 // LReturn
140 // LSmiTag 140 // LSmiTag
141 // LStoreGlobal 141 // LStoreGlobal
142 // LTaggedToI 142 // LTaggedToI
143 // LThrow 143 // LThrow
144 // LTypeof 144 // LTypeof
145 // LTypeofIs 145 // LTypeofIs
146 // LTypeofIsAndBranch
147 // LUnaryMathOperation 146 // LUnaryMathOperation
148 // LValueOf 147 // LValueOf
149 // LUnknownOSRValue 148 // LUnknownOSRValue
150 149
151 #define LITHIUM_ALL_INSTRUCTION_LIST(V) \ 150 #define LITHIUM_ALL_INSTRUCTION_LIST(V) \
152 V(BinaryOperation) \ 151 V(ControlInstruction) \
153 V(Constant) \ 152 V(Constant) \
154 V(Call) \ 153 V(Call) \
155 V(MaterializedLiteral) \
156 V(StoreKeyed) \ 154 V(StoreKeyed) \
157 V(StoreNamed) \ 155 V(StoreNamed) \
158 V(UnaryOperation) \
159 LITHIUM_CONCRETE_INSTRUCTION_LIST(V) 156 LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
160 157
161 158
162 #define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \ 159 #define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
163 V(AccessArgumentsAt) \ 160 V(AccessArgumentsAt) \
164 V(AddI) \ 161 V(AddI) \
165 V(ApplyArguments) \ 162 V(ApplyArguments) \
166 V(ArgumentsElements) \ 163 V(ArgumentsElements) \
167 V(ArgumentsLength) \ 164 V(ArgumentsLength) \
168 V(ArithmeticD) \ 165 V(ArithmeticD) \
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 virtual void CompileToNative(LCodeGen* generator) = 0; 290 virtual void CompileToNative(LCodeGen* generator) = 0;
294 virtual const char* Mnemonic() const = 0; 291 virtual const char* Mnemonic() const = 0;
295 virtual void PrintTo(StringStream* stream); 292 virtual void PrintTo(StringStream* stream);
296 virtual void PrintDataTo(StringStream* stream) = 0; 293 virtual void PrintDataTo(StringStream* stream) = 0;
297 virtual void PrintOutputOperandTo(StringStream* stream) = 0; 294 virtual void PrintOutputOperandTo(StringStream* stream) = 0;
298 295
299 // Declare virtual type testers. 296 // Declare virtual type testers.
300 #define DECLARE_DO(type) virtual bool Is##type() const { return false; } 297 #define DECLARE_DO(type) virtual bool Is##type() const { return false; }
301 LITHIUM_ALL_INSTRUCTION_LIST(DECLARE_DO) 298 LITHIUM_ALL_INSTRUCTION_LIST(DECLARE_DO)
302 #undef DECLARE_DO 299 #undef DECLARE_DO
300
303 virtual bool IsControl() const { return false; } 301 virtual bool IsControl() const { return false; }
302 virtual void SetBranchTargets(int true_block_id, int false_block_id) { }
304 303
305 void set_environment(LEnvironment* env) { environment_.set(env); } 304 void set_environment(LEnvironment* env) { environment_.set(env); }
306 LEnvironment* environment() const { return environment_.get(); } 305 LEnvironment* environment() const { return environment_.get(); }
307 bool HasEnvironment() const { return environment_.is_set(); } 306 bool HasEnvironment() const { return environment_.is_set(); }
308 307
309 void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); } 308 void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
310 LPointerMap* pointer_map() const { return pointer_map_.get(); } 309 LPointerMap* pointer_map() const { return pointer_map_.get(); }
311 bool HasPointerMap() const { return pointer_map_.is_set(); } 310 bool HasPointerMap() const { return pointer_map_.is_set(); }
312 311
313 virtual bool HasResult() const = 0; 312 virtual bool HasResult() const = 0;
(...skipping 18 matching lines...) Expand all
332 SetOncePointer<LEnvironment> deoptimization_environment_; 331 SetOncePointer<LEnvironment> deoptimization_environment_;
333 }; 332 };
334 333
335 334
336 template<typename T, int N> 335 template<typename T, int N>
337 class OperandContainer { 336 class OperandContainer {
338 public: 337 public:
339 OperandContainer() { 338 OperandContainer() {
340 for (int i = 0; i < N; i++) elems_[i] = NULL; 339 for (int i = 0; i < N; i++) elems_[i] = NULL;
341 } 340 }
342 int length() const { return N; } 341 int length() { return N; }
343 T at(int i) const { return elems_[i]; } 342 T& operator[](int i) {
344 void set_at(int i, T value) { elems_[i] = value; } 343 ASSERT(i < length());
344 return elems_[i];
345 }
346 void PrintOperandsTo(StringStream* stream);
347
345 private: 348 private:
346 T elems_[N]; 349 T elems_[N];
347 }; 350 };
348 351
349 352
350 template<typename T> 353 template<typename T>
351 class OperandContainer<T, 0> { 354 class OperandContainer<T, 0> {
352 public: 355 public:
353 int length() const { return 0; } 356 int length() { return 0; }
354 T at(int i) const { 357 void PrintOperandsTo(StringStream* stream) { }
355 UNREACHABLE();
356 return NULL;
357 }
358 void set_at(int i, T value) {
359 UNREACHABLE();
360 }
361 }; 358 };
362 359
363 360
364 template<int R, int I, int T> 361 template<int R, int I, int T = 0>
365 class LTemplateInstruction: public LInstruction { 362 class LTemplateInstruction: public LInstruction {
366 public: 363 public:
367 // Allow 0 or 1 output operands. 364 // Allow 0 or 1 output operands.
368 STATIC_ASSERT(R == 0 || R == 1); 365 STATIC_ASSERT(R == 0 || R == 1);
369 virtual bool HasResult() const { return R != 0; } 366 virtual bool HasResult() const { return R != 0; }
370 void set_result(LOperand* operand) { outputs_.set_at(0, operand); } 367 void set_result(LOperand* operand) { results_[0] = operand; }
371 LOperand* result() const { return outputs_.at(0); } 368 LOperand* result() { return results_[0]; }
372 369
373 int InputCount() const { return inputs_.length(); } 370 int InputCount() { return I; }
374 LOperand* InputAt(int i) const { return inputs_.at(i); } 371 LOperand* InputAt(int i) { return inputs_[i]; }
375 void SetInputAt(int i, LOperand* operand) { inputs_.set_at(i, operand); }
376 372
377 int TempCount() const { return temps_.length(); } 373 int TempCount() { return T; }
378 LOperand* TempAt(int i) const { return temps_.at(i); } 374 LOperand* TempAt(int i) { return temps_[i]; }
379 375
380 virtual void PrintDataTo(StringStream* stream); 376 virtual void PrintDataTo(StringStream* stream);
381 virtual void PrintOutputOperandTo(StringStream* stream); 377 virtual void PrintOutputOperandTo(StringStream* stream);
382 378
383 private: 379 protected:
384 OperandContainer<LOperand*, R> outputs_; 380 OperandContainer<LOperand*, R> results_;
385 OperandContainer<LOperand*, I> inputs_; 381 OperandContainer<LOperand*, I> inputs_;
386 OperandContainer<LOperand*, T> temps_; 382 OperandContainer<LOperand*, T> temps_;
387 }; 383 };
388 384
389 385
390 class LGap: public LTemplateInstruction<0, 0, 0> { 386 class LGap: public LTemplateInstruction<0, 0, 0> {
391 public: 387 public:
392 explicit LGap(HBasicBlock* block) 388 explicit LGap(HBasicBlock* block)
393 : block_(block) { 389 : block_(block) {
394 parallel_moves_[BEFORE] = NULL; 390 parallel_moves_[BEFORE] = NULL;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 } 502 }
507 }; 503 };
508 504
509 505
510 class LUnknownOSRValue: public LTemplateInstruction<1, 0, 0> { 506 class LUnknownOSRValue: public LTemplateInstruction<1, 0, 0> {
511 public: 507 public:
512 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value") 508 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value")
513 }; 509 };
514 510
515 511
516 template<int R> 512 template<int I, int T = 0>
517 class LUnaryOperation: public LTemplateInstruction<R, 1, 0> { 513 class LControlInstruction: public LTemplateInstruction<0, I, T> {
518 public: 514 public:
519 explicit LUnaryOperation<R>(LOperand* input) { 515 DECLARE_INSTRUCTION(ControlInstruction)
520 this->SetInputAt(0, input); 516 virtual bool IsControl() const { return true; }
517
518 int true_block_id() const { return true_block_id_; }
519 int false_block_id() const { return false_block_id_; }
520 void SetBranchTargets(int true_block_id, int false_block_id) {
521 true_block_id_ = true_block_id;
522 false_block_id_ = false_block_id;
521 } 523 }
522 524
523 LOperand* input() const { return this->InputAt(0); } 525 private:
524 526 int true_block_id_;
525 DECLARE_INSTRUCTION(UnaryOperation) 527 int false_block_id_;
526 }; 528 };
527 529
528 530
529 template<int R>
530 class LBinaryOperation: public LTemplateInstruction<R, 2, 0> {
531 public:
532 LBinaryOperation(LOperand* left, LOperand* right) {
533 this->SetInputAt(0, left);
534 this->SetInputAt(1, right);
535 }
536
537 DECLARE_INSTRUCTION(BinaryOperation)
538
539 LOperand* left() const { return this->InputAt(0); }
540 LOperand* right() const { return this->InputAt(1); }
541 };
542
543
544 class LApplyArguments: public LTemplateInstruction<1, 4, 0> { 531 class LApplyArguments: public LTemplateInstruction<1, 4, 0> {
545 public: 532 public:
546 LApplyArguments(LOperand* function, 533 LApplyArguments(LOperand* function,
547 LOperand* receiver, 534 LOperand* receiver,
548 LOperand* length, 535 LOperand* length,
549 LOperand* elements) { 536 LOperand* elements) {
550 this->SetInputAt(0, function); 537 inputs_[0] = function;
551 this->SetInputAt(1, receiver); 538 inputs_[1] = receiver;
552 this->SetInputAt(2, length); 539 inputs_[2] = length;
553 this->SetInputAt(3, elements); 540 inputs_[3] = elements;
554 } 541 }
555 542
556 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply-arguments") 543 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply-arguments")
557 544
558 LOperand* function() const { return InputAt(0); } 545 LOperand* function() { return inputs_[0]; }
559 LOperand* receiver() const { return InputAt(1); } 546 LOperand* receiver() { return inputs_[1]; }
560 LOperand* length() const { return InputAt(2); } 547 LOperand* length() { return inputs_[2]; }
561 LOperand* elements() const { return InputAt(3); } 548 LOperand* elements() { return inputs_[3]; }
562 }; 549 };
563 550
564 551
565 class LAccessArgumentsAt: public LTemplateInstruction<1, 3, 0> { 552 class LAccessArgumentsAt: public LTemplateInstruction<1, 3, 0> {
566 public: 553 public:
567 LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) { 554 LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) {
568 this->SetInputAt(0, arguments); 555 inputs_[0] = arguments;
569 this->SetInputAt(1, length); 556 inputs_[1] = length;
570 this->SetInputAt(2, index); 557 inputs_[2] = index;
571 } 558 }
572 559
573 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at") 560 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at")
574 561
575 LOperand* arguments() const { return this->InputAt(0); } 562 LOperand* arguments() { return inputs_[0]; }
576 LOperand* length() const { return this->InputAt(1); } 563 LOperand* length() { return inputs_[1]; }
577 LOperand* index() const { return this->InputAt(2); } 564 LOperand* index() { return inputs_[2]; }
578 565
579 virtual void PrintDataTo(StringStream* stream); 566 virtual void PrintDataTo(StringStream* stream);
580 }; 567 };
581 568
582 569
583 class LArgumentsLength: public LUnaryOperation<1> { 570 class LArgumentsLength: public LTemplateInstruction<1, 1> {
584 public: 571 public:
585 explicit LArgumentsLength(LOperand* elements) 572 explicit LArgumentsLength(LOperand* elements) {
586 : LUnaryOperation<1>(elements) {} 573 inputs_[0] = elements;
574 }
587 575
588 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length") 576 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length")
589 }; 577 };
590 578
591 579
592 class LArgumentsElements: public LTemplateInstruction<1, 0, 0> { 580 class LArgumentsElements: public LTemplateInstruction<1, 0, 0> {
593 public: 581 public:
594 LArgumentsElements() { } 582 LArgumentsElements() { }
595 583
596 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements") 584 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements")
597 }; 585 };
598 586
599 587
600 class LModI: public LBinaryOperation<1> { 588 class LModI: public LTemplateInstruction<1, 2, 1> {
601 public: 589 public:
602 LModI(LOperand* left, LOperand* right) : LBinaryOperation<1>(left, right) { } 590 LModI(LOperand* left, LOperand* right, LOperand* temp) {
591 inputs_[0] = left;
592 inputs_[1] = right;
593 temps_[0] = temp;
594 }
603 595
604 DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i") 596 DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i")
605 DECLARE_HYDROGEN_ACCESSOR(Mod) 597 DECLARE_HYDROGEN_ACCESSOR(Mod)
606 }; 598 };
607 599
608 600
609 class LDivI: public LBinaryOperation<1> { 601 class LDivI: public LTemplateInstruction<1, 2, 1> {
610 public: 602 public:
611 LDivI(LOperand* left, LOperand* right) 603 LDivI(LOperand* left, LOperand* right, LOperand* temp) {
612 : LBinaryOperation<1>(left, right) { } 604 inputs_[0] = left;
605 inputs_[1] = right;
606 temps_[0] = temp;
607 }
613 608
614 DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i") 609 DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i")
615 DECLARE_HYDROGEN_ACCESSOR(Div) 610 DECLARE_HYDROGEN_ACCESSOR(Div)
616 }; 611 };
617 612
618 613
619 class LMulI: public LBinaryOperation<1> { 614 class LMulI: public LTemplateInstruction<1, 2, 1> {
620 public: 615 public:
621 LMulI(LOperand* left, LOperand* right, LOperand* temp) 616 LMulI(LOperand* left, LOperand* right, LOperand* temp) {
622 : LBinaryOperation<1>(left, right), temp_(temp) { } 617 inputs_[0] = left;
618 inputs_[1] = right;
619 temps_[0] = temp;
620 }
623 621
624 DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i") 622 DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i")
625 DECLARE_HYDROGEN_ACCESSOR(Mul) 623 DECLARE_HYDROGEN_ACCESSOR(Mul)
626
627 LOperand* temp() const { return temp_; }
628
629 private:
630 LOperand* temp_;
631 }; 624 };
632 625
633 626
634 class LCmpID: public LBinaryOperation<1> { 627 class LCmpID: public LTemplateInstruction<1, 2> {
635 public: 628 public:
636 LCmpID(LOperand* left, LOperand* right) 629 LCmpID(LOperand* left, LOperand* right) {
637 : LBinaryOperation<1>(left, right) { } 630 inputs_[0] = left;
631 inputs_[1] = right;
632 }
633
634 DECLARE_CONCRETE_INSTRUCTION(CmpID, "cmp-id")
635 DECLARE_HYDROGEN_ACCESSOR(Compare)
636
637 Token::Value op() const { return hydrogen()->token(); }
638 bool is_double() const {
639 return hydrogen()->GetInputRepresentation().IsDouble();
640 }
641 };
642
643
644 class LCmpIDAndBranch: public LControlInstruction<2> {
645 public:
646 LCmpIDAndBranch(LOperand* left, LOperand* right) {
647 inputs_[0] = left;
648 inputs_[1] = right;
649 }
650
651 DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch")
652 DECLARE_HYDROGEN_ACCESSOR(Compare)
638 653
639 Token::Value op() const { return hydrogen()->token(); } 654 Token::Value op() const { return hydrogen()->token(); }
640 bool is_double() const { 655 bool is_double() const {
641 return hydrogen()->GetInputRepresentation().IsDouble(); 656 return hydrogen()->GetInputRepresentation().IsDouble();
642 } 657 }
643 658
644 DECLARE_CONCRETE_INSTRUCTION(CmpID, "cmp-id") 659 virtual void PrintDataTo(StringStream* stream);
645 DECLARE_HYDROGEN_ACCESSOR(Compare)
646 }; 660 };
647 661
648 662
649 class LCmpIDAndBranch: public LCmpID { 663 class LUnaryMathOperation: public LTemplateInstruction<1, 1> {
650 public: 664 public:
651 LCmpIDAndBranch(LOperand* left, 665 explicit LUnaryMathOperation(LOperand* value) {
652 LOperand* right, 666 inputs_[0] = value;
653 int true_block_id, 667 }
654 int false_block_id)
655 : LCmpID(left, right),
656 true_block_id_(true_block_id),
657 false_block_id_(false_block_id) { }
658
659 DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch")
660 virtual void PrintDataTo(StringStream* stream);
661 virtual bool IsControl() const { return true; }
662
663 int true_block_id() const { return true_block_id_; }
664 int false_block_id() const { return false_block_id_; }
665
666 private:
667 int true_block_id_;
668 int false_block_id_;
669 };
670
671
672 class LUnaryMathOperation: public LUnaryOperation<1> {
673 public:
674 explicit LUnaryMathOperation(LOperand* value)
675 : LUnaryOperation<1>(value) { }
676 668
677 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation") 669 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation")
678 DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation) 670 DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
679 671
680 virtual void PrintDataTo(StringStream* stream); 672 virtual void PrintDataTo(StringStream* stream);
681 BuiltinFunctionId op() const { return hydrogen()->op(); } 673 BuiltinFunctionId op() const { return hydrogen()->op(); }
682 }; 674 };
683 675
684 676
685 class LCmpJSObjectEq: public LBinaryOperation<1> { 677 class LCmpJSObjectEq: public LTemplateInstruction<1, 2> {
686 public: 678 public:
687 LCmpJSObjectEq(LOperand* left, LOperand* right) 679 LCmpJSObjectEq(LOperand* left, LOperand* right) {
688 : LBinaryOperation<1>(left, right) {} 680 inputs_[0] = left;
681 inputs_[1] = right;
682 }
689 683
690 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEq, "cmp-jsobject-eq") 684 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEq, "cmp-jsobject-eq")
691 }; 685 };
692 686
693 687
694 class LCmpJSObjectEqAndBranch: public LCmpJSObjectEq { 688 class LCmpJSObjectEqAndBranch: public LControlInstruction<2> {
695 public: 689 public:
696 LCmpJSObjectEqAndBranch(LOperand* left, 690 LCmpJSObjectEqAndBranch(LOperand* left, LOperand* right) {
697 LOperand* right, 691 inputs_[0] = left;
698 int true_block_id, 692 inputs_[1] = right;
699 int false_block_id) 693 }
700 : LCmpJSObjectEq(left, right),
701 true_block_id_(true_block_id),
702 false_block_id_(false_block_id) { }
703 694
704 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEqAndBranch, 695 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEqAndBranch,
705 "cmp-jsobject-eq-and-branch") 696 "cmp-jsobject-eq-and-branch")
706
707 int true_block_id() const { return true_block_id_; }
708 int false_block_id() const { return false_block_id_; }
709
710 private:
711 int true_block_id_;
712 int false_block_id_;
713 }; 697 };
714 698
715 699
716 class LIsNull: public LUnaryOperation<1> { 700 class LIsNull: public LTemplateInstruction<1, 1> {
717 public: 701 public:
718 explicit LIsNull(LOperand* value) : LUnaryOperation<1>(value) { } 702 explicit LIsNull(LOperand* value) {
703 inputs_[0] = value;
704 }
719 705
720 DECLARE_CONCRETE_INSTRUCTION(IsNull, "is-null") 706 DECLARE_CONCRETE_INSTRUCTION(IsNull, "is-null")
721 DECLARE_HYDROGEN_ACCESSOR(IsNull) 707 DECLARE_HYDROGEN_ACCESSOR(IsNull)
722 708
723 bool is_strict() const { return hydrogen()->is_strict(); } 709 bool is_strict() const { return hydrogen()->is_strict(); }
724 }; 710 };
725 711
726 712
727 class LIsNullAndBranch: public LIsNull { 713 class LIsNullAndBranch: public LControlInstruction<1, 1> {
728 public: 714 public:
729 LIsNullAndBranch(LOperand* value, 715 LIsNullAndBranch(LOperand* value, LOperand* temp) {
730 LOperand* temp, 716 inputs_[0] = value;
731 int true_block_id, 717 temps_[0] = temp;
732 int false_block_id) 718 }
733 : LIsNull(value),
734 temp_(temp),
735 true_block_id_(true_block_id),
736 false_block_id_(false_block_id) { }
737 719
738 DECLARE_CONCRETE_INSTRUCTION(IsNullAndBranch, "is-null-and-branch") 720 DECLARE_CONCRETE_INSTRUCTION(IsNullAndBranch, "is-null-and-branch")
721 DECLARE_HYDROGEN_ACCESSOR(IsNull)
722
723 bool is_strict() const { return hydrogen()->is_strict(); }
724
739 virtual void PrintDataTo(StringStream* stream); 725 virtual void PrintDataTo(StringStream* stream);
740 virtual bool IsControl() const { return true; }
741
742 int true_block_id() const { return true_block_id_; }
743 int false_block_id() const { return false_block_id_; }
744
745 LOperand* temp() const { return temp_; }
746
747 private:
748 LOperand* temp_;
749 int true_block_id_;
750 int false_block_id_;
751 }; 726 };
752 727
753 728
754 class LIsObject: public LUnaryOperation<1> { 729 class LIsObject: public LTemplateInstruction<1, 1, 1> {
755 public: 730 public:
756 LIsObject(LOperand* value, LOperand* temp) 731 LIsObject(LOperand* value, LOperand* temp) {
757 : LUnaryOperation<1>(value), temp_(temp) {} 732 inputs_[0] = value;
733 temps_[0] = temp;
734 }
758 735
759 DECLARE_CONCRETE_INSTRUCTION(IsObject, "is-object") 736 DECLARE_CONCRETE_INSTRUCTION(IsObject, "is-object")
760
761 LOperand* temp() const { return temp_; }
762
763 private:
764 LOperand* temp_;
765 }; 737 };
766 738
767 739
768 class LIsObjectAndBranch: public LIsObject { 740 class LIsObjectAndBranch: public LControlInstruction<1, 2> {
769 public: 741 public:
770 LIsObjectAndBranch(LOperand* value, 742 LIsObjectAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) {
771 LOperand* temp, 743 inputs_[0] = value;
772 LOperand* temp2, 744 temps_[0] = temp;
773 int true_block_id, 745 temps_[1] = temp2;
774 int false_block_id) 746 }
775 : LIsObject(value, temp),
776 temp2_(temp2),
777 true_block_id_(true_block_id),
778 false_block_id_(false_block_id) { }
779 747
780 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch") 748 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch")
749
781 virtual void PrintDataTo(StringStream* stream); 750 virtual void PrintDataTo(StringStream* stream);
782 virtual bool IsControl() const { return true; }
783
784 int true_block_id() const { return true_block_id_; }
785 int false_block_id() const { return false_block_id_; }
786
787 LOperand* temp2() const { return temp2_; }
788
789 private:
790 LOperand* temp2_;
791 int true_block_id_;
792 int false_block_id_;
793 }; 751 };
794 752
795 753
796 class LIsSmi: public LUnaryOperation<1> { 754 class LIsSmi: public LTemplateInstruction<1, 1> {
797 public: 755 public:
798 explicit LIsSmi(LOperand* value) : LUnaryOperation<1>(value) {} 756 explicit LIsSmi(LOperand* value) {
757 inputs_[0] = value;
758 }
799 759
800 DECLARE_CONCRETE_INSTRUCTION(IsSmi, "is-smi") 760 DECLARE_CONCRETE_INSTRUCTION(IsSmi, "is-smi")
801 DECLARE_HYDROGEN_ACCESSOR(IsSmi) 761 DECLARE_HYDROGEN_ACCESSOR(IsSmi)
802 }; 762 };
803 763
804 764
805 class LIsSmiAndBranch: public LIsSmi { 765 class LIsSmiAndBranch: public LControlInstruction<1> {
806 public: 766 public:
807 LIsSmiAndBranch(LOperand* value, 767 explicit LIsSmiAndBranch(LOperand* value) {
808 int true_block_id, 768 inputs_[0] = value;
809 int false_block_id) 769 }
810 : LIsSmi(value),
811 true_block_id_(true_block_id),
812 false_block_id_(false_block_id) { }
813 770
814 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch") 771 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
772
815 virtual void PrintDataTo(StringStream* stream); 773 virtual void PrintDataTo(StringStream* stream);
816 virtual bool IsControl() const { return true; }
817
818 int true_block_id() const { return true_block_id_; }
819 int false_block_id() const { return false_block_id_; }
820
821 private:
822 int true_block_id_;
823 int false_block_id_;
824 }; 774 };
825 775
826 776
827 class LHasInstanceType: public LUnaryOperation<1> { 777 class LHasInstanceType: public LTemplateInstruction<1, 1> {
828 public: 778 public:
829 explicit LHasInstanceType(LOperand* value) 779 explicit LHasInstanceType(LOperand* value) {
830 : LUnaryOperation<1>(value) { } 780 inputs_[0] = value;
781 }
831 782
832 DECLARE_CONCRETE_INSTRUCTION(HasInstanceType, "has-instance-type") 783 DECLARE_CONCRETE_INSTRUCTION(HasInstanceType, "has-instance-type")
833 DECLARE_HYDROGEN_ACCESSOR(HasInstanceType) 784 DECLARE_HYDROGEN_ACCESSOR(HasInstanceType)
834
835 InstanceType TestType(); // The type to test against when generating code.
836 Condition BranchCondition(); // The branch condition for 'true'.
837 }; 785 };
838 786
839 787
840 class LHasInstanceTypeAndBranch: public LHasInstanceType { 788 class LHasInstanceTypeAndBranch: public LControlInstruction<1, 1> {
841 public: 789 public:
842 LHasInstanceTypeAndBranch(LOperand* value, 790 LHasInstanceTypeAndBranch(LOperand* value, LOperand* temp) {
843 LOperand* temporary, 791 inputs_[0] = value;
844 int true_block_id, 792 temps_[0] = temp;
845 int false_block_id) 793 }
846 : LHasInstanceType(value),
847 temp_(temporary),
848 true_block_id_(true_block_id),
849 false_block_id_(false_block_id) { }
850 794
851 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch, 795 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
852 "has-instance-type-and-branch") 796 "has-instance-type-and-branch")
797 DECLARE_HYDROGEN_ACCESSOR(HasInstanceType)
798
853 virtual void PrintDataTo(StringStream* stream); 799 virtual void PrintDataTo(StringStream* stream);
854 virtual bool IsControl() const { return true; }
855
856 int true_block_id() const { return true_block_id_; }
857 int false_block_id() const { return false_block_id_; }
858
859 LOperand* temp() { return temp_; }
860
861 private:
862 LOperand* temp_;
863 int true_block_id_;
864 int false_block_id_;
865 }; 800 };
866 801
867 802
868 class LHasCachedArrayIndex: public LUnaryOperation<1> { 803 class LHasCachedArrayIndex: public LTemplateInstruction<1, 1> {
869 public: 804 public:
870 explicit LHasCachedArrayIndex(LOperand* value) : LUnaryOperation<1>(value) {} 805 explicit LHasCachedArrayIndex(LOperand* value) {
806 inputs_[0] = value;
807 }
871 808
872 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex, "has-cached-array-index") 809 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex, "has-cached-array-index")
873 DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndex) 810 DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndex)
874 }; 811 };
875 812
876 813
877 class LHasCachedArrayIndexAndBranch: public LHasCachedArrayIndex { 814 class LHasCachedArrayIndexAndBranch: public LControlInstruction<1> {
878 public: 815 public:
879 LHasCachedArrayIndexAndBranch(LOperand* value, 816 explicit LHasCachedArrayIndexAndBranch(LOperand* value) {
880 int true_block_id, 817 inputs_[0] = value;
881 int false_block_id) 818 }
882 : LHasCachedArrayIndex(value),
883 true_block_id_(true_block_id),
884 false_block_id_(false_block_id) { }
885 819
886 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch, 820 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch,
887 "has-cached-array-index-and-branch") 821 "has-cached-array-index-and-branch")
888 virtual void PrintDataTo(StringStream* stream); 822 virtual void PrintDataTo(StringStream* stream);
889 virtual bool IsControl() const { return true; }
890
891 int true_block_id() const { return true_block_id_; }
892 int false_block_id() const { return false_block_id_; }
893
894 private:
895 int true_block_id_;
896 int false_block_id_;
897 }; 823 };
898 824
899 825
900 class LClassOfTest: public LUnaryOperation<1> { 826 class LClassOfTest: public LTemplateInstruction<1, 1, 1> {
901 public: 827 public:
902 LClassOfTest(LOperand* value, LOperand* temp) 828 LClassOfTest(LOperand* value, LOperand* temp) {
903 : LUnaryOperation<1>(value), temporary_(temp) {} 829 inputs_[0] = value;
830 temps_[0] = temp;
831 }
904 832
905 DECLARE_CONCRETE_INSTRUCTION(ClassOfTest, "class-of-test") 833 DECLARE_CONCRETE_INSTRUCTION(ClassOfTest, "class-of-test")
906 DECLARE_HYDROGEN_ACCESSOR(ClassOfTest) 834 DECLARE_HYDROGEN_ACCESSOR(ClassOfTest)
907 835
908 virtual void PrintDataTo(StringStream* stream); 836 virtual void PrintDataTo(StringStream* stream);
909
910 LOperand* temporary() { return temporary_; }
911
912 private:
913 LOperand* temporary_;
914 }; 837 };
915 838
916 839
917 class LClassOfTestAndBranch: public LClassOfTest { 840 class LClassOfTestAndBranch: public LControlInstruction<1, 2> {
918 public: 841 public:
919 LClassOfTestAndBranch(LOperand* value, 842 LClassOfTestAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) {
920 LOperand* temporary, 843 inputs_[0] = value;
921 LOperand* temporary2, 844 temps_[0] = temp;
922 int true_block_id, 845 temps_[1] = temp2;
923 int false_block_id) 846 }
924 : LClassOfTest(value, temporary),
925 temporary2_(temporary2),
926 true_block_id_(true_block_id),
927 false_block_id_(false_block_id) { }
928 847
929 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch, 848 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch,
930 "class-of-test-and-branch") 849 "class-of-test-and-branch")
850 DECLARE_HYDROGEN_ACCESSOR(ClassOfTest)
851
931 virtual void PrintDataTo(StringStream* stream); 852 virtual void PrintDataTo(StringStream* stream);
932 virtual bool IsControl() const { return true; }
933
934 int true_block_id() const { return true_block_id_; }
935 int false_block_id() const { return false_block_id_; }
936 LOperand* temporary2() { return temporary2_; }
937
938 private:
939 LOperand* temporary2_;
940 int true_block_id_;
941 int false_block_id_;
942 }; 853 };
943 854
944 855
945 class LCmpT: public LBinaryOperation<1> { 856 class LCmpT: public LTemplateInstruction<1, 2> {
946 public: 857 public:
947 LCmpT(LOperand* left, LOperand* right) : LBinaryOperation<1>(left, right) {} 858 LCmpT(LOperand* left, LOperand* right) {
859 inputs_[0] = left;
860 inputs_[1] = right;
861 }
948 862
949 DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t") 863 DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t")
950 DECLARE_HYDROGEN_ACCESSOR(Compare) 864 DECLARE_HYDROGEN_ACCESSOR(Compare)
951 865
952 Token::Value op() const { return hydrogen()->token(); } 866 Token::Value op() const { return hydrogen()->token(); }
953 }; 867 };
954 868
955 869
956 class LCmpTAndBranch: public LCmpT { 870 class LCmpTAndBranch: public LControlInstruction<2> {
957 public: 871 public:
958 LCmpTAndBranch(LOperand* left, 872 LCmpTAndBranch(LOperand* left, LOperand* right) {
959 LOperand* right, 873 inputs_[0] = left;
960 int true_block_id, 874 inputs_[1] = right;
961 int false_block_id) 875 }
962 : LCmpT(left, right),
963 true_block_id_(true_block_id),
964 false_block_id_(false_block_id) { }
965 876
966 DECLARE_CONCRETE_INSTRUCTION(CmpTAndBranch, "cmp-t-and-branch") 877 DECLARE_CONCRETE_INSTRUCTION(CmpTAndBranch, "cmp-t-and-branch")
878 DECLARE_HYDROGEN_ACCESSOR(Compare)
967 879
968 int true_block_id() const { return true_block_id_; } 880 Token::Value op() const { return hydrogen()->token(); }
969 int false_block_id() const { return false_block_id_; }
970
971 private:
972 int true_block_id_;
973 int false_block_id_;
974 }; 881 };
975 882
976 883
977 class LInstanceOf: public LBinaryOperation<1> { 884 class LInstanceOf: public LTemplateInstruction<1, 2> {
978 public: 885 public:
979 LInstanceOf(LOperand* left, LOperand* right) 886 LInstanceOf(LOperand* left, LOperand* right) {
980 : LBinaryOperation<1>(left, right) { } 887 inputs_[0] = left;
888 inputs_[1] = right;
889 }
981 890
982 DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of") 891 DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of")
983 }; 892 };
984 893
985 894
986 class LInstanceOfAndBranch: public LInstanceOf { 895 class LInstanceOfAndBranch: public LControlInstruction<2> {
987 public: 896 public:
988 LInstanceOfAndBranch(LOperand* left, 897 LInstanceOfAndBranch(LOperand* left, LOperand* right) {
989 LOperand* right, 898 inputs_[0] = left;
990 int true_block_id, 899 inputs_[1] = right;
991 int false_block_id) 900 }
992 : LInstanceOf(left, right),
993 true_block_id_(true_block_id),
994 false_block_id_(false_block_id) { }
995 901
996 DECLARE_CONCRETE_INSTRUCTION(InstanceOfAndBranch, "instance-of-and-branch") 902 DECLARE_CONCRETE_INSTRUCTION(InstanceOfAndBranch, "instance-of-and-branch")
997
998 int true_block_id() const { return true_block_id_; }
999 int false_block_id() const { return false_block_id_; }
1000
1001 private:
1002 int true_block_id_;
1003 int false_block_id_;
1004 }; 903 };
1005 904
1006 905
1007 class LInstanceOfKnownGlobal: public LUnaryOperation<1> { 906 class LInstanceOfKnownGlobal: public LTemplateInstruction<1, 1, 1> {
1008 public: 907 public:
1009 LInstanceOfKnownGlobal(LOperand* left, LOperand* temp) 908 LInstanceOfKnownGlobal(LOperand* value, LOperand* temp) {
1010 : LUnaryOperation<1>(left), temp_(temp) { } 909 inputs_[0] = value;
910 temps_[0] = temp;
911 }
1011 912
1012 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal, 913 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,
1013 "instance-of-known-global") 914 "instance-of-known-global")
1014 DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal) 915 DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal)
1015 916
1016 Handle<JSFunction> function() const { return hydrogen()->function(); } 917 Handle<JSFunction> function() const { return hydrogen()->function(); }
1017 LOperand* temp() const { return temp_; }
1018
1019 private:
1020 LOperand* temp_;
1021 }; 918 };
1022 919
1023 920
1024 class LBoundsCheck: public LBinaryOperation<0> { 921 class LBoundsCheck: public LTemplateInstruction<0, 2, 0> {
1025 public: 922 public:
1026 LBoundsCheck(LOperand* index, LOperand* length) 923 LBoundsCheck(LOperand* index, LOperand* length) {
1027 : LBinaryOperation<0>(index, length) { } 924 inputs_[0] = index;
925 inputs_[1] = length;
926 }
1028 927
1029 LOperand* index() const { return left(); } 928 LOperand* index() { return inputs_[0]; }
1030 LOperand* length() const { return right(); } 929 LOperand* length() { return inputs_[1]; }
1031 930
1032 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds-check") 931 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds-check")
1033 }; 932 };
1034 933
1035 934
1036 class LBitI: public LBinaryOperation<1> { 935 class LBitI: public LTemplateInstruction<1, 2> {
1037 public: 936 public:
1038 LBitI(Token::Value op, LOperand* left, LOperand* right) 937 LBitI(Token::Value op, LOperand* left, LOperand* right)
1039 : LBinaryOperation<1>(left, right), op_(op) { } 938 : op_(op) {
939 inputs_[0] = left;
940 inputs_[1] = right;
941 }
1040 942
1041 Token::Value op() const { return op_; } 943 Token::Value op() const { return op_; }
1042 944
1043 DECLARE_CONCRETE_INSTRUCTION(BitI, "bit-i") 945 DECLARE_CONCRETE_INSTRUCTION(BitI, "bit-i")
1044 946
1045 private: 947 private:
1046 Token::Value op_; 948 Token::Value op_;
1047 }; 949 };
1048 950
1049 951
1050 class LShiftI: public LBinaryOperation<1> { 952 class LShiftI: public LTemplateInstruction<1, 2> {
1051 public: 953 public:
1052 LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt) 954 LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt)
1053 : LBinaryOperation<1>(left, right), op_(op), can_deopt_(can_deopt) { } 955 : op_(op), can_deopt_(can_deopt) {
956 inputs_[0] = left;
957 inputs_[1] = right;
958 }
1054 959
1055 Token::Value op() const { return op_; } 960 Token::Value op() const { return op_; }
1056 961
1057 bool can_deopt() const { return can_deopt_; } 962 bool can_deopt() const { return can_deopt_; }
1058 963
1059 DECLARE_CONCRETE_INSTRUCTION(ShiftI, "shift-i") 964 DECLARE_CONCRETE_INSTRUCTION(ShiftI, "shift-i")
1060 965
1061 private: 966 private:
1062 Token::Value op_; 967 Token::Value op_;
1063 bool can_deopt_; 968 bool can_deopt_;
1064 }; 969 };
1065 970
1066 971
1067 class LSubI: public LBinaryOperation<1> { 972 class LSubI: public LTemplateInstruction<1, 2> {
1068 public: 973 public:
1069 LSubI(LOperand* left, LOperand* right) 974 LSubI(LOperand* left, LOperand* right) {
1070 : LBinaryOperation<1>(left, right) { } 975 inputs_[0] = left;
976 inputs_[1] = right;
977 }
1071 978
1072 DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i") 979 DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i")
1073 DECLARE_HYDROGEN_ACCESSOR(Sub) 980 DECLARE_HYDROGEN_ACCESSOR(Sub)
1074 }; 981 };
1075 982
1076 983
1077 class LConstant: public LTemplateInstruction<1, 0, 0> { 984 class LConstant: public LTemplateInstruction<1, 0, 0> {
1078 DECLARE_INSTRUCTION(Constant) 985 DECLARE_INSTRUCTION(Constant)
1079 }; 986 };
1080 987
(...skipping 27 matching lines...) Expand all
1108 explicit LConstantT(Handle<Object> value) : value_(value) { } 1015 explicit LConstantT(Handle<Object> value) : value_(value) { }
1109 Handle<Object> value() const { return value_; } 1016 Handle<Object> value() const { return value_; }
1110 1017
1111 DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t") 1018 DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t")
1112 1019
1113 private: 1020 private:
1114 Handle<Object> value_; 1021 Handle<Object> value_;
1115 }; 1022 };
1116 1023
1117 1024
1118 class LBranch: public LUnaryOperation<0> { 1025 class LBranch: public LControlInstruction<1> {
1119 public: 1026 public:
1120 LBranch(LOperand* input, int true_block_id, int false_block_id) 1027 explicit LBranch(LOperand* value) {
1121 : LUnaryOperation<0>(input), 1028 inputs_[0] = value;
1122 true_block_id_(true_block_id), 1029 }
1123 false_block_id_(false_block_id) { }
1124 1030
1125 DECLARE_CONCRETE_INSTRUCTION(Branch, "branch") 1031 DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
1126 DECLARE_HYDROGEN_ACCESSOR(Value) 1032 DECLARE_HYDROGEN_ACCESSOR(Value)
1127 1033
1128 virtual void PrintDataTo(StringStream* stream); 1034 virtual void PrintDataTo(StringStream* stream);
1129 virtual bool IsControl() const { return true; }
1130
1131 int true_block_id() const { return true_block_id_; }
1132 int false_block_id() const { return false_block_id_; }
1133
1134 private:
1135 int true_block_id_;
1136 int false_block_id_;
1137 }; 1035 };
1138 1036
1139 1037
1140 class LCmpMapAndBranch: public LUnaryOperation<0> { 1038 class LCmpMapAndBranch: public LTemplateInstruction<0, 1> {
1141 public: 1039 public:
1142 explicit LCmpMapAndBranch(LOperand* value) : LUnaryOperation<0>(value) { } 1040 explicit LCmpMapAndBranch(LOperand* value) {
1041 inputs_[0] = value;
1042 }
1143 1043
1144 DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch") 1044 DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
1145 DECLARE_HYDROGEN_ACCESSOR(CompareMapAndBranch) 1045 DECLARE_HYDROGEN_ACCESSOR(CompareMapAndBranch)
1146 1046
1147 virtual bool IsControl() const { return true; } 1047 virtual bool IsControl() const { return true; }
1148 1048
1149 Handle<Map> map() const { return hydrogen()->map(); } 1049 Handle<Map> map() const { return hydrogen()->map(); }
1150 int true_block_id() const { 1050 int true_block_id() const {
1151 return hydrogen()->true_destination()->block_id(); 1051 return hydrogen()->true_destination()->block_id();
1152 } 1052 }
1153 int false_block_id() const { 1053 int false_block_id() const {
1154 return hydrogen()->false_destination()->block_id(); 1054 return hydrogen()->false_destination()->block_id();
1155 } 1055 }
1156 }; 1056 };
1157 1057
1158 1058
1159 class LJSArrayLength: public LUnaryOperation<1> { 1059 class LJSArrayLength: public LTemplateInstruction<1, 1> {
1160 public: 1060 public:
1161 explicit LJSArrayLength(LOperand* input) : LUnaryOperation<1>(input) { } 1061 explicit LJSArrayLength(LOperand* value) {
1062 inputs_[0] = value;
1063 }
1162 1064
1163 DECLARE_CONCRETE_INSTRUCTION(JSArrayLength, "js-array-length") 1065 DECLARE_CONCRETE_INSTRUCTION(JSArrayLength, "js-array-length")
1164 DECLARE_HYDROGEN_ACCESSOR(JSArrayLength) 1066 DECLARE_HYDROGEN_ACCESSOR(JSArrayLength)
1165 }; 1067 };
1166 1068
1167 1069
1168 class LFixedArrayLength: public LUnaryOperation<1> { 1070 class LFixedArrayLength: public LTemplateInstruction<1, 1> {
1169 public: 1071 public:
1170 explicit LFixedArrayLength(LOperand* input) : LUnaryOperation<1>(input) { } 1072 explicit LFixedArrayLength(LOperand* value) {
1073 inputs_[0] = value;
1074 }
1171 1075
1172 DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength, "fixed-array-length") 1076 DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength, "fixed-array-length")
1173 DECLARE_HYDROGEN_ACCESSOR(FixedArrayLength) 1077 DECLARE_HYDROGEN_ACCESSOR(FixedArrayLength)
1174 }; 1078 };
1175 1079
1176 1080
1177 class LValueOf: public LUnaryOperation<1> { 1081 class LValueOf: public LTemplateInstruction<1, 1, 1> {
1178 public: 1082 public:
1179 LValueOf(LOperand* input, LOperand* temporary) 1083 LValueOf(LOperand* value, LOperand* temp) {
1180 : LUnaryOperation<1>(input), temporary_(temporary) { } 1084 inputs_[0] = value;
1181 1085 temps_[0] = temp;
1182 LOperand* temporary() const { return temporary_; } 1086 }
1183 1087
1184 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value-of") 1088 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value-of")
1185 DECLARE_HYDROGEN_ACCESSOR(ValueOf) 1089 DECLARE_HYDROGEN_ACCESSOR(ValueOf)
1186
1187 private:
1188 LOperand* temporary_;
1189 }; 1090 };
1190 1091
1191 1092
1192 class LThrow: public LUnaryOperation<0> { 1093 class LThrow: public LTemplateInstruction<0, 1> {
1193 public: 1094 public:
1194 explicit LThrow(LOperand* value) : LUnaryOperation<0>(value) { } 1095 explicit LThrow(LOperand* value) {
1096 inputs_[0] = value;
1097 }
1195 1098
1196 DECLARE_CONCRETE_INSTRUCTION(Throw, "throw") 1099 DECLARE_CONCRETE_INSTRUCTION(Throw, "throw")
1197 }; 1100 };
1198 1101
1199 1102
1200 class LBitNotI: public LUnaryOperation<1> { 1103 class LBitNotI: public LTemplateInstruction<1, 1> {
1201 public: 1104 public:
1202 explicit LBitNotI(LOperand* input) : LUnaryOperation<1>(input) { } 1105 explicit LBitNotI(LOperand* value) {
1106 inputs_[0] = value;
1107 }
1203 1108
1204 DECLARE_CONCRETE_INSTRUCTION(BitNotI, "bit-not-i") 1109 DECLARE_CONCRETE_INSTRUCTION(BitNotI, "bit-not-i")
1205 }; 1110 };
1206 1111
1207 1112
1208 class LAddI: public LBinaryOperation<1> { 1113 class LAddI: public LTemplateInstruction<1, 2> {
1209 public: 1114 public:
1210 LAddI(LOperand* left, LOperand* right) 1115 LAddI(LOperand* left, LOperand* right) {
1211 : LBinaryOperation<1>(left, right) { } 1116 inputs_[0] = left;
1117 inputs_[1] = right;
1118 }
1212 1119
1213 DECLARE_CONCRETE_INSTRUCTION(AddI, "add-i") 1120 DECLARE_CONCRETE_INSTRUCTION(AddI, "add-i")
1214 DECLARE_HYDROGEN_ACCESSOR(Add) 1121 DECLARE_HYDROGEN_ACCESSOR(Add)
1215 }; 1122 };
1216 1123
1217 1124
1218 class LPower: public LBinaryOperation<1> { 1125 class LPower: public LTemplateInstruction<1, 2> {
1219 public: 1126 public:
1220 LPower(LOperand* left, LOperand* right) 1127 LPower(LOperand* left, LOperand* right) {
1221 : LBinaryOperation<1>(left, right) { } 1128 inputs_[0] = left;
1129 inputs_[1] = right;
1130 }
1222 1131
1223 DECLARE_CONCRETE_INSTRUCTION(Power, "power") 1132 DECLARE_CONCRETE_INSTRUCTION(Power, "power")
1224 DECLARE_HYDROGEN_ACCESSOR(Power) 1133 DECLARE_HYDROGEN_ACCESSOR(Power)
1225 }; 1134 };
1226 1135
1227 1136
1228 class LArithmeticD: public LBinaryOperation<1> { 1137 class LArithmeticD: public LTemplateInstruction<1, 2> {
1229 public: 1138 public:
1230 LArithmeticD(Token::Value op, LOperand* left, LOperand* right) 1139 LArithmeticD(Token::Value op, LOperand* left, LOperand* right)
1231 : LBinaryOperation<1>(left, right), op_(op) { } 1140 : op_(op) {
1141 inputs_[0] = left;
1142 inputs_[1] = right;
1143 }
1232 1144
1233 Token::Value op() const { return op_; } 1145 Token::Value op() const { return op_; }
1234 1146
1235 virtual void CompileToNative(LCodeGen* generator); 1147 virtual void CompileToNative(LCodeGen* generator);
1236 virtual const char* Mnemonic() const; 1148 virtual const char* Mnemonic() const;
1237 1149
1238 private: 1150 private:
1239 Token::Value op_; 1151 Token::Value op_;
1240 }; 1152 };
1241 1153
1242 1154
1243 class LArithmeticT: public LBinaryOperation<1> { 1155 class LArithmeticT: public LTemplateInstruction<1, 2> {
1244 public: 1156 public:
1245 LArithmeticT(Token::Value op, LOperand* left, LOperand* right) 1157 LArithmeticT(Token::Value op, LOperand* left, LOperand* right)
1246 : LBinaryOperation<1>(left, right), op_(op) { } 1158 : op_(op) {
1159 inputs_[0] = left;
1160 inputs_[1] = right;
1161 }
1247 1162
1248 virtual void CompileToNative(LCodeGen* generator); 1163 virtual void CompileToNative(LCodeGen* generator);
1249 virtual const char* Mnemonic() const; 1164 virtual const char* Mnemonic() const;
1250 1165
1251 Token::Value op() const { return op_; } 1166 Token::Value op() const { return op_; }
1252 1167
1253 private: 1168 private:
1254 Token::Value op_; 1169 Token::Value op_;
1255 }; 1170 };
1256 1171
1257 1172
1258 class LReturn: public LUnaryOperation<0> { 1173 class LReturn: public LTemplateInstruction<0, 1> {
1259 public: 1174 public:
1260 explicit LReturn(LOperand* use) : LUnaryOperation<0>(use) { } 1175 explicit LReturn(LOperand* value) {
1176 inputs_[0] = value;
1177 }
1261 1178
1262 DECLARE_CONCRETE_INSTRUCTION(Return, "return") 1179 DECLARE_CONCRETE_INSTRUCTION(Return, "return")
1263 }; 1180 };
1264 1181
1265 1182
1266 class LLoadNamedField: public LUnaryOperation<1> { 1183 class LLoadNamedField: public LTemplateInstruction<1, 1> {
1267 public: 1184 public:
1268 explicit LLoadNamedField(LOperand* object) : LUnaryOperation<1>(object) { } 1185 explicit LLoadNamedField(LOperand* object) {
1186 inputs_[0] = object;
1187 }
1269 1188
1270 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field") 1189 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field")
1271 DECLARE_HYDROGEN_ACCESSOR(LoadNamedField) 1190 DECLARE_HYDROGEN_ACCESSOR(LoadNamedField)
1272 }; 1191 };
1273 1192
1274 1193
1275 class LLoadNamedGeneric: public LUnaryOperation<1> { 1194 class LLoadNamedGeneric: public LTemplateInstruction<1, 1> {
1276 public: 1195 public:
1277 explicit LLoadNamedGeneric(LOperand* object) : LUnaryOperation<1>(object) { } 1196 explicit LLoadNamedGeneric(LOperand* object) {
1197 inputs_[0] = object;
1198 }
1278 1199
1279 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic") 1200 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic")
1280 DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric) 1201 DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric)
1281 1202
1282 LOperand* object() const { return input(); } 1203 LOperand* object() { return inputs_[0]; }
1283 Handle<Object> name() const { return hydrogen()->name(); } 1204 Handle<Object> name() const { return hydrogen()->name(); }
1284 }; 1205 };
1285 1206
1286 1207
1287 class LLoadFunctionPrototype: public LUnaryOperation<1> { 1208 class LLoadFunctionPrototype: public LTemplateInstruction<1, 1, 1> {
1288 public: 1209 public:
1289 LLoadFunctionPrototype(LOperand* function, LOperand* temporary) 1210 LLoadFunctionPrototype(LOperand* function, LOperand* temp) {
1290 : LUnaryOperation<1>(function), temporary_(temporary) { } 1211 inputs_[0] = function;
1212 temps_[0] = temp;
1213 }
1291 1214
1292 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype") 1215 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype")
1293 DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype) 1216 DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype)
1294 1217
1295 LOperand* function() const { return input(); } 1218 LOperand* function() { return inputs_[0]; }
1296 LOperand* temporary() const { return temporary_; }
1297
1298 private:
1299 LOperand* temporary_;
1300 }; 1219 };
1301 1220
1302 1221
1303 class LLoadElements: public LUnaryOperation<1> { 1222 class LLoadElements: public LTemplateInstruction<1, 1> {
1304 public: 1223 public:
1305 explicit LLoadElements(LOperand* obj) : LUnaryOperation<1>(obj) { } 1224 explicit LLoadElements(LOperand* object) {
1225 inputs_[0] = object;
1226 }
1306 1227
1307 DECLARE_CONCRETE_INSTRUCTION(LoadElements, "load-elements") 1228 DECLARE_CONCRETE_INSTRUCTION(LoadElements, "load-elements")
1308 }; 1229 };
1309 1230
1310 1231
1311 class LLoadKeyedFastElement: public LBinaryOperation<1> { 1232 class LLoadKeyedFastElement: public LTemplateInstruction<1, 2> {
1312 public: 1233 public:
1313 LLoadKeyedFastElement(LOperand* elements, LOperand* key) 1234 LLoadKeyedFastElement(LOperand* elements, LOperand* key) {
1314 : LBinaryOperation<1>(elements, key) { } 1235 inputs_[0] = elements;
1236 inputs_[1] = key;
1237 }
1315 1238
1316 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement, "load-keyed-fast-element") 1239 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement, "load-keyed-fast-element")
1317 DECLARE_HYDROGEN_ACCESSOR(LoadKeyedFastElement) 1240 DECLARE_HYDROGEN_ACCESSOR(LoadKeyedFastElement)
1318 1241
1319 LOperand* elements() const { return left(); } 1242 LOperand* elements() { return inputs_[0]; }
1320 LOperand* key() const { return right(); } 1243 LOperand* key() { return inputs_[1]; }
1321 }; 1244 };
1322 1245
1323 1246
1324 class LLoadKeyedGeneric: public LBinaryOperation<1> { 1247 class LLoadKeyedGeneric: public LTemplateInstruction<1, 2> {
1325 public: 1248 public:
1326 LLoadKeyedGeneric(LOperand* obj, LOperand* key) 1249 LLoadKeyedGeneric(LOperand* obj, LOperand* key) {
1327 : LBinaryOperation<1>(obj, key) { } 1250 inputs_[0] = obj;
1251 inputs_[1] = key;
1252 }
1328 1253
1329 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load-keyed-generic") 1254 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load-keyed-generic")
1330 1255
1331 LOperand* object() const { return left(); } 1256 LOperand* object() { return inputs_[0]; }
1332 LOperand* key() const { return right(); } 1257 LOperand* key() { return inputs_[1]; }
1333 }; 1258 };
1334 1259
1335 1260
1336 class LLoadGlobal: public LTemplateInstruction<1, 0, 0> { 1261 class LLoadGlobal: public LTemplateInstruction<1, 0, 0> {
1337 public: 1262 public:
1338 DECLARE_CONCRETE_INSTRUCTION(LoadGlobal, "load-global") 1263 DECLARE_CONCRETE_INSTRUCTION(LoadGlobal, "load-global")
1339 DECLARE_HYDROGEN_ACCESSOR(LoadGlobal) 1264 DECLARE_HYDROGEN_ACCESSOR(LoadGlobal)
1340 }; 1265 };
1341 1266
1342 1267
1343 class LStoreGlobal: public LUnaryOperation<0> { 1268 class LStoreGlobal: public LTemplateInstruction<0, 1> {
1344 public: 1269 public:
1345 explicit LStoreGlobal(LOperand* value) : LUnaryOperation<0>(value) {} 1270 explicit LStoreGlobal(LOperand* value) {
1271 inputs_[0] = value;
1272 }
1346 1273
1347 DECLARE_CONCRETE_INSTRUCTION(StoreGlobal, "store-global") 1274 DECLARE_CONCRETE_INSTRUCTION(StoreGlobal, "store-global")
1348 DECLARE_HYDROGEN_ACCESSOR(StoreGlobal) 1275 DECLARE_HYDROGEN_ACCESSOR(StoreGlobal)
1349 }; 1276 };
1350 1277
1351 1278
1352 class LPushArgument: public LUnaryOperation<0> { 1279 class LPushArgument: public LTemplateInstruction<0, 1> {
1353 public: 1280 public:
1354 explicit LPushArgument(LOperand* argument) : LUnaryOperation<0>(argument) {} 1281 explicit LPushArgument(LOperand* value) {
1282 inputs_[0] = value;
1283 }
1355 1284
1356 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument") 1285 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument")
1357 }; 1286 };
1358 1287
1359 1288
1360 class LGlobalObject: public LTemplateInstruction<1, 0, 0> { 1289 class LGlobalObject: public LTemplateInstruction<1, 0, 0> {
1361 public: 1290 public:
1362 DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global-object") 1291 DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global-object")
1363 }; 1292 };
1364 1293
1365 1294
1366 class LGlobalReceiver: public LTemplateInstruction<1, 0, 0> { 1295 class LGlobalReceiver: public LTemplateInstruction<1, 0, 0> {
1367 public: 1296 public:
1368 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global-receiver") 1297 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global-receiver")
1369 }; 1298 };
1370 1299
1371 1300
1372 class LCallConstantFunction: public LTemplateInstruction<1, 0, 0> { 1301 class LCallConstantFunction: public LTemplateInstruction<1, 0, 0> {
1373 public: 1302 public:
1374 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call-constant-function") 1303 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call-constant-function")
1375 DECLARE_HYDROGEN_ACCESSOR(CallConstantFunction) 1304 DECLARE_HYDROGEN_ACCESSOR(CallConstantFunction)
1376 1305
1377 virtual void PrintDataTo(StringStream* stream); 1306 virtual void PrintDataTo(StringStream* stream);
1378 1307
1379 Handle<JSFunction> function() { return hydrogen()->function(); } 1308 Handle<JSFunction> function() { return hydrogen()->function(); }
1380 int arity() const { return hydrogen()->argument_count() - 1; } 1309 int arity() const { return hydrogen()->argument_count() - 1; }
1381 }; 1310 };
1382 1311
1383 1312
1384 class LCallKeyed: public LTemplateInstruction<1, 0, 0> { 1313 class LCallKeyed: public LTemplateInstruction<1, 0, 1> {
1385 public: 1314 public:
1315 explicit LCallKeyed(LOperand* temp) {
1316 temps_[0] = temp;
1317 }
1318
1386 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed") 1319 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed")
1387 DECLARE_HYDROGEN_ACCESSOR(CallKeyed) 1320 DECLARE_HYDROGEN_ACCESSOR(CallKeyed)
1388 1321
1389 virtual void PrintDataTo(StringStream* stream); 1322 virtual void PrintDataTo(StringStream* stream);
1390 1323
1391 int arity() const { return hydrogen()->argument_count() - 1; } 1324 int arity() const { return hydrogen()->argument_count() - 1; }
1392 }; 1325 };
1393 1326
1394 1327
1395 class LCallNamed: public LTemplateInstruction<1, 0, 0> { 1328 class LCallNamed: public LTemplateInstruction<1, 0, 0> {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1430 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call-known-global") 1363 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call-known-global")
1431 DECLARE_HYDROGEN_ACCESSOR(CallKnownGlobal) 1364 DECLARE_HYDROGEN_ACCESSOR(CallKnownGlobal)
1432 1365
1433 virtual void PrintDataTo(StringStream* stream); 1366 virtual void PrintDataTo(StringStream* stream);
1434 1367
1435 Handle<JSFunction> target() const { return hydrogen()->target(); } 1368 Handle<JSFunction> target() const { return hydrogen()->target(); }
1436 int arity() const { return hydrogen()->argument_count() - 1; } 1369 int arity() const { return hydrogen()->argument_count() - 1; }
1437 }; 1370 };
1438 1371
1439 1372
1440 class LCallNew: public LUnaryOperation<1> { 1373 class LCallNew: public LTemplateInstruction<1, 1> {
1441 public: 1374 public:
1442 explicit LCallNew(LOperand* constructor) : LUnaryOperation<1>(constructor) { } 1375 explicit LCallNew(LOperand* constructor) {
1376 inputs_[0] = constructor;
1377 }
1443 1378
1444 DECLARE_CONCRETE_INSTRUCTION(CallNew, "call-new") 1379 DECLARE_CONCRETE_INSTRUCTION(CallNew, "call-new")
1445 DECLARE_HYDROGEN_ACCESSOR(CallNew) 1380 DECLARE_HYDROGEN_ACCESSOR(CallNew)
1446 1381
1447 virtual void PrintDataTo(StringStream* stream); 1382 virtual void PrintDataTo(StringStream* stream);
1448 1383
1449 int arity() const { return hydrogen()->argument_count() - 1; } 1384 int arity() const { return hydrogen()->argument_count() - 1; }
1450 }; 1385 };
1451 1386
1452 1387
1453 class LCallRuntime: public LTemplateInstruction<1, 0, 0> { 1388 class LCallRuntime: public LTemplateInstruction<1, 0, 0> {
1454 public: 1389 public:
1455 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime") 1390 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
1456 DECLARE_HYDROGEN_ACCESSOR(CallRuntime) 1391 DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
1457 1392
1458 Runtime::Function* function() const { return hydrogen()->function(); } 1393 Runtime::Function* function() const { return hydrogen()->function(); }
1459 int arity() const { return hydrogen()->argument_count(); } 1394 int arity() const { return hydrogen()->argument_count(); }
1460 }; 1395 };
1461 1396
1462 1397
1463 class LInteger32ToDouble: public LUnaryOperation<1> { 1398 class LInteger32ToDouble: public LTemplateInstruction<1, 1> {
1464 public: 1399 public:
1465 explicit LInteger32ToDouble(LOperand* use) : LUnaryOperation<1>(use) { } 1400 explicit LInteger32ToDouble(LOperand* value) {
1401 inputs_[0] = value;
1402 }
1466 1403
1467 DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double") 1404 DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double")
1468 }; 1405 };
1469 1406
1470 1407
1471 class LNumberTagI: public LUnaryOperation<1> { 1408 class LNumberTagI: public LTemplateInstruction<1, 1> {
1472 public: 1409 public:
1473 explicit LNumberTagI(LOperand* use) : LUnaryOperation<1>(use) { } 1410 explicit LNumberTagI(LOperand* value) {
1411 inputs_[0] = value;
1412 }
1474 1413
1475 DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i") 1414 DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i")
1476 }; 1415 };
1477 1416
1478 1417
1479 class LNumberTagD: public LUnaryOperation<1> { 1418 class LNumberTagD: public LTemplateInstruction<1, 1, 1> {
1480 public: 1419 public:
1481 explicit LNumberTagD(LOperand* value, LOperand* temp) 1420 explicit LNumberTagD(LOperand* value, LOperand* temp) {
1482 : LUnaryOperation<1>(value), temp_(temp) { } 1421 inputs_[0] = value;
1422 temps_[0] = temp;
1423 }
1483 1424
1484 DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d") 1425 DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d")
1485
1486 LOperand* temp() const { return temp_; }
1487
1488 private:
1489 LOperand* temp_;
1490 }; 1426 };
1491 1427
1492 1428
1493 // Sometimes truncating conversion from a tagged value to an int32. 1429 // Sometimes truncating conversion from a tagged value to an int32.
1494 class LDoubleToI: public LUnaryOperation<1> { 1430 class LDoubleToI: public LTemplateInstruction<1, 1, 1> {
1495 public: 1431 public:
1496 LDoubleToI(LOperand* value, LOperand* temporary) 1432 LDoubleToI(LOperand* value, LOperand* temp) {
1497 : LUnaryOperation<1>(value), temporary_(temporary) { } 1433 inputs_[0] = value;
1434 temps_[0] = temp;
1435 }
1498 1436
1499 DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i") 1437 DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
1500 DECLARE_HYDROGEN_ACCESSOR(Change) 1438 DECLARE_HYDROGEN_ACCESSOR(Change)
1501 1439
1502 bool truncating() { return hydrogen()->CanTruncateToInt32(); } 1440 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1503 LOperand* temporary() const { return temporary_; }
1504
1505 private:
1506 LOperand* temporary_;
1507 }; 1441 };
1508 1442
1509 1443
1510 // Truncating conversion from a tagged value to an int32. 1444 // Truncating conversion from a tagged value to an int32.
1511 class LTaggedToI: public LUnaryOperation<1> { 1445 class LTaggedToI: public LTemplateInstruction<1, 1, 1> {
1512 public: 1446 public:
1513 LTaggedToI(LOperand* value, LOperand* temp) 1447 LTaggedToI(LOperand* value, LOperand* temp) {
1514 : LUnaryOperation<1>(value), temp_(temp) { } 1448 inputs_[0] = value;
1449 temps_[0] = temp;
1450 }
1515 1451
1516 DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i") 1452 DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
1517 DECLARE_HYDROGEN_ACCESSOR(Change) 1453 DECLARE_HYDROGEN_ACCESSOR(Change)
1518 1454
1519 bool truncating() { return hydrogen()->CanTruncateToInt32(); } 1455 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1520 LOperand* temp() const { return temp_; }
1521
1522 private:
1523 LOperand* temp_;
1524 }; 1456 };
1525 1457
1526 1458
1527 class LSmiTag: public LUnaryOperation<1> { 1459 class LSmiTag: public LTemplateInstruction<1, 1> {
1528 public: 1460 public:
1529 explicit LSmiTag(LOperand* use) : LUnaryOperation<1>(use) { } 1461 explicit LSmiTag(LOperand* value) {
1462 inputs_[0] = value;
1463 }
1530 1464
1531 DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag") 1465 DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag")
1532 }; 1466 };
1533 1467
1534 1468
1535 class LNumberUntagD: public LUnaryOperation<1> { 1469 class LNumberUntagD: public LTemplateInstruction<1, 1> {
1536 public: 1470 public:
1537 explicit LNumberUntagD(LOperand* value) : LUnaryOperation<1>(value) { } 1471 explicit LNumberUntagD(LOperand* value) {
1472 inputs_[0] = value;
1473 }
1538 1474
1539 DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag") 1475 DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
1540 }; 1476 };
1541 1477
1542 1478
1543 class LSmiUntag: public LUnaryOperation<1> { 1479 class LSmiUntag: public LTemplateInstruction<1, 1> {
1544 public: 1480 public:
1545 LSmiUntag(LOperand* use, bool needs_check) 1481 LSmiUntag(LOperand* value, bool needs_check)
1546 : LUnaryOperation<1>(use), needs_check_(needs_check) { } 1482 : needs_check_(needs_check) {
1483 inputs_[0] = value;
1484 }
1547 1485
1548 DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag") 1486 DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag")
1549 1487
1550 bool needs_check() const { return needs_check_; } 1488 bool needs_check() const { return needs_check_; }
1551 1489
1552 private: 1490 private:
1553 bool needs_check_; 1491 bool needs_check_;
1554 }; 1492 };
1555 1493
1556 1494
1557 class LStoreNamed: public LTemplateInstruction<0, 2, 0> { 1495 class LStoreNamed: public LTemplateInstruction<0, 2, 1> {
1558 public: 1496 public:
1559 LStoreNamed(LOperand* obj, LOperand* val) { 1497 LStoreNamed(LOperand* obj, LOperand* val) {
1560 this->SetInputAt(0, obj); 1498 inputs_[0] = obj;
1561 this->SetInputAt(1, val); 1499 inputs_[1] = val;
1562 } 1500 }
1563 1501
1564 DECLARE_INSTRUCTION(StoreNamed) 1502 DECLARE_INSTRUCTION(StoreNamed)
1565 DECLARE_HYDROGEN_ACCESSOR(StoreNamed) 1503 DECLARE_HYDROGEN_ACCESSOR(StoreNamed)
1566 1504
1567 virtual void PrintDataTo(StringStream* stream); 1505 virtual void PrintDataTo(StringStream* stream);
1568 1506
1569 LOperand* object() const { return this->InputAt(0); } 1507 LOperand* object() { return inputs_[0]; }
1570 LOperand* value() const { return this->InputAt(1); } 1508 LOperand* value() { return inputs_[1]; }
1571 Handle<Object> name() const { return hydrogen()->name(); } 1509 Handle<Object> name() const { return hydrogen()->name(); }
1572 }; 1510 };
1573 1511
1574 1512
1575 class LStoreNamedField: public LStoreNamed { 1513 class LStoreNamedField: public LStoreNamed {
1576 public: 1514 public:
1577 LStoreNamedField(LOperand* obj, LOperand* val, LOperand* temp) 1515 LStoreNamedField(LOperand* obj, LOperand* val, LOperand* temp)
1578 : LStoreNamed(obj, val), temp_(temp) { } 1516 : LStoreNamed(obj, val) {
1517 temps_[0] = temp;
1518 }
1579 1519
1580 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field") 1520 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field")
1581 DECLARE_HYDROGEN_ACCESSOR(StoreNamedField) 1521 DECLARE_HYDROGEN_ACCESSOR(StoreNamedField)
1582 1522
1583 bool is_in_object() { return hydrogen()->is_in_object(); } 1523 bool is_in_object() { return hydrogen()->is_in_object(); }
1584 int offset() { return hydrogen()->offset(); } 1524 int offset() { return hydrogen()->offset(); }
1585 bool needs_write_barrier() { return hydrogen()->NeedsWriteBarrier(); } 1525 bool needs_write_barrier() { return hydrogen()->NeedsWriteBarrier(); }
1586 Handle<Map> transition() const { return hydrogen()->transition(); } 1526 Handle<Map> transition() const { return hydrogen()->transition(); }
1587
1588 LOperand* temp() { return temp_; }
1589
1590 private:
1591 LOperand* temp_;
1592 }; 1527 };
1593 1528
1594 1529
1595 class LStoreNamedGeneric: public LStoreNamed { 1530 class LStoreNamedGeneric: public LStoreNamed {
1596 public: 1531 public:
1597 LStoreNamedGeneric(LOperand* obj, LOperand* val) 1532 LStoreNamedGeneric(LOperand* obj, LOperand* val)
1598 : LStoreNamed(obj, val) { } 1533 : LStoreNamed(obj, val) { }
1599 1534
1600 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic") 1535 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic")
1601 DECLARE_HYDROGEN_ACCESSOR(StoreNamedGeneric) 1536 DECLARE_HYDROGEN_ACCESSOR(StoreNamedGeneric)
1602 }; 1537 };
1603 1538
1604 1539
1605 class LStoreKeyed: public LTemplateInstruction<0, 3, 0> { 1540 class LStoreKeyed: public LTemplateInstruction<0, 3, 0> {
1606 public: 1541 public:
1607 LStoreKeyed(LOperand* obj, LOperand* key, LOperand* val) { 1542 LStoreKeyed(LOperand* obj, LOperand* key, LOperand* val) {
1608 this->SetInputAt(0, obj); 1543 inputs_[0] = obj;
1609 this->SetInputAt(1, key); 1544 inputs_[1] = key;
1610 this->SetInputAt(2, val); 1545 inputs_[2] = val;
1611 } 1546 }
1612 1547
1613 DECLARE_INSTRUCTION(StoreKeyed) 1548 DECLARE_INSTRUCTION(StoreKeyed)
1614 1549
1615 virtual void PrintDataTo(StringStream* stream); 1550 virtual void PrintDataTo(StringStream* stream);
1616 1551
1617 LOperand* object() const { return this->InputAt(0); } 1552 LOperand* object() { return inputs_[0]; }
1618 LOperand* key() const { return this->InputAt(1); } 1553 LOperand* key() { return inputs_[1]; }
1619 LOperand* value() const { return this->InputAt(2); } 1554 LOperand* value() { return inputs_[2]; }
1620 }; 1555 };
1621 1556
1622 1557
1623 class LStoreKeyedFastElement: public LStoreKeyed { 1558 class LStoreKeyedFastElement: public LStoreKeyed {
1624 public: 1559 public:
1625 LStoreKeyedFastElement(LOperand* obj, LOperand* key, LOperand* val) 1560 LStoreKeyedFastElement(LOperand* obj, LOperand* key, LOperand* val)
1626 : LStoreKeyed(obj, key, val) {} 1561 : LStoreKeyed(obj, key, val) {}
1627 1562
1628 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement, 1563 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement,
1629 "store-keyed-fast-element") 1564 "store-keyed-fast-element")
1630 DECLARE_HYDROGEN_ACCESSOR(StoreKeyedFastElement) 1565 DECLARE_HYDROGEN_ACCESSOR(StoreKeyedFastElement)
1631 }; 1566 };
1632 1567
1633 1568
1634 class LStoreKeyedGeneric: public LStoreKeyed { 1569 class LStoreKeyedGeneric: public LStoreKeyed {
1635 public: 1570 public:
1636 LStoreKeyedGeneric(LOperand* obj, LOperand* key, LOperand* val) 1571 LStoreKeyedGeneric(LOperand* obj, LOperand* key, LOperand* val)
1637 : LStoreKeyed(obj, key, val) { } 1572 : LStoreKeyed(obj, key, val) { }
1638 1573
1639 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic") 1574 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic")
1640 }; 1575 };
1641 1576
1642 1577
1643 class LCheckFunction: public LUnaryOperation<0> { 1578 class LCheckFunction: public LTemplateInstruction<0, 1> {
1644 public: 1579 public:
1645 explicit LCheckFunction(LOperand* use) : LUnaryOperation<0>(use) { } 1580 explicit LCheckFunction(LOperand* value) {
1581 inputs_[0] = value;
1582 }
1646 1583
1647 DECLARE_CONCRETE_INSTRUCTION(CheckFunction, "check-function") 1584 DECLARE_CONCRETE_INSTRUCTION(CheckFunction, "check-function")
1648 DECLARE_HYDROGEN_ACCESSOR(CheckFunction) 1585 DECLARE_HYDROGEN_ACCESSOR(CheckFunction)
1649 }; 1586 };
1650 1587
1651 1588
1652 class LCheckInstanceType: public LUnaryOperation<0> { 1589 class LCheckInstanceType: public LTemplateInstruction<0, 1, 1> {
1653 public: 1590 public:
1654 LCheckInstanceType(LOperand* use, LOperand* temp) 1591 LCheckInstanceType(LOperand* value, LOperand* temp) {
1655 : LUnaryOperation<0>(use), temp_(temp) { } 1592 inputs_[0] = value;
1593 temps_[0] = temp;
1594 }
1656 1595
1657 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type") 1596 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type")
1658 DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType) 1597 DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType)
1659
1660 LOperand* temp() const { return temp_; }
1661
1662 private:
1663 LOperand* temp_;
1664 }; 1598 };
1665 1599
1666 1600
1667 class LCheckMap: public LUnaryOperation<0> { 1601 class LCheckMap: public LTemplateInstruction<0, 1> {
1668 public: 1602 public:
1669 explicit LCheckMap(LOperand* use) : LUnaryOperation<0>(use) { } 1603 explicit LCheckMap(LOperand* value) {
1604 inputs_[0] = value;
1605 }
1670 1606
1671 DECLARE_CONCRETE_INSTRUCTION(CheckMap, "check-map") 1607 DECLARE_CONCRETE_INSTRUCTION(CheckMap, "check-map")
1672 DECLARE_HYDROGEN_ACCESSOR(CheckMap) 1608 DECLARE_HYDROGEN_ACCESSOR(CheckMap)
1673 }; 1609 };
1674 1610
1675 1611
1676 class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 0> { 1612 class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 1> {
1677 public: 1613 public:
1678 explicit LCheckPrototypeMaps(LOperand* temp) : temp_(temp) { } 1614 explicit LCheckPrototypeMaps(LOperand* temp) {
1615 temps_[0] = temp;
1616 }
1679 1617
1680 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps") 1618 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps")
1681 DECLARE_HYDROGEN_ACCESSOR(CheckPrototypeMaps) 1619 DECLARE_HYDROGEN_ACCESSOR(CheckPrototypeMaps)
1682 1620
1683 Handle<JSObject> prototype() const { return hydrogen()->prototype(); } 1621 Handle<JSObject> prototype() const { return hydrogen()->prototype(); }
1684 Handle<JSObject> holder() const { return hydrogen()->holder(); } 1622 Handle<JSObject> holder() const { return hydrogen()->holder(); }
1685
1686 LOperand* temp() const { return temp_; }
1687
1688 private:
1689 LOperand* temp_;
1690 }; 1623 };
1691 1624
1692 1625
1693 class LCheckSmi: public LUnaryOperation<0> { 1626 class LCheckSmi: public LTemplateInstruction<0, 1> {
1694 public: 1627 public:
1695 LCheckSmi(LOperand* use, Condition condition) 1628 LCheckSmi(LOperand* value, Condition condition)
1696 : LUnaryOperation<0>(use), condition_(condition) { } 1629 : condition_(condition) {
1630 inputs_[0] = value;
1631 }
1697 1632
1698 Condition condition() const { return condition_; } 1633 Condition condition() const { return condition_; }
1699 1634
1700 virtual void CompileToNative(LCodeGen* generator); 1635 virtual void CompileToNative(LCodeGen* generator);
1701 virtual const char* Mnemonic() const { 1636 virtual const char* Mnemonic() const {
1702 return (condition_ == zero) ? "check-non-smi" : "check-smi"; 1637 return (condition_ == zero) ? "check-non-smi" : "check-smi";
1703 } 1638 }
1704 1639
1705 private: 1640 private:
1706 Condition condition_; 1641 Condition condition_;
1707 }; 1642 };
1708 1643
1709 1644
1710 class LMaterializedLiteral: public LTemplateInstruction<1, 0, 0> { 1645 class LArrayLiteral: public LTemplateInstruction<1, 0, 0> {
1711 public:
1712 DECLARE_INSTRUCTION(MaterializedLiteral)
1713 };
1714
1715
1716 class LArrayLiteral: public LMaterializedLiteral {
1717 public: 1646 public:
1718 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array-literal") 1647 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array-literal")
1719 DECLARE_HYDROGEN_ACCESSOR(ArrayLiteral) 1648 DECLARE_HYDROGEN_ACCESSOR(ArrayLiteral)
1720 }; 1649 };
1721 1650
1722 1651
1723 class LObjectLiteral: public LMaterializedLiteral { 1652 class LObjectLiteral: public LTemplateInstruction<1, 0, 0> {
1724 public: 1653 public:
1725 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object-literal") 1654 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object-literal")
1726 DECLARE_HYDROGEN_ACCESSOR(ObjectLiteral) 1655 DECLARE_HYDROGEN_ACCESSOR(ObjectLiteral)
1727 }; 1656 };
1728 1657
1729 1658
1730 class LRegExpLiteral: public LMaterializedLiteral { 1659 class LRegExpLiteral: public LTemplateInstruction<1, 0, 0> {
1731 public: 1660 public:
1732 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal") 1661 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal")
1733 DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral) 1662 DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral)
1734 }; 1663 };
1735 1664
1736 1665
1737 class LFunctionLiteral: public LTemplateInstruction<1, 0, 0> { 1666 class LFunctionLiteral: public LTemplateInstruction<1, 0, 0> {
1738 public: 1667 public:
1739 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal") 1668 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal")
1740 DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral) 1669 DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral)
1741 1670
1742 Handle<SharedFunctionInfo> shared_info() { return hydrogen()->shared_info(); } 1671 Handle<SharedFunctionInfo> shared_info() { return hydrogen()->shared_info(); }
1743 }; 1672 };
1744 1673
1745 1674
1746 class LTypeof: public LUnaryOperation<1> { 1675 class LTypeof: public LTemplateInstruction<1, 1> {
1747 public: 1676 public:
1748 explicit LTypeof(LOperand* input) : LUnaryOperation<1>(input) { } 1677 explicit LTypeof(LOperand* value) {
1678 inputs_[0] = value;
1679 }
1749 1680
1750 DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof") 1681 DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
1751 }; 1682 };
1752 1683
1753 1684
1754 class LTypeofIs: public LUnaryOperation<1> { 1685 class LTypeofIs: public LTemplateInstruction<1, 1> {
1755 public: 1686 public:
1756 explicit LTypeofIs(LOperand* input) : LUnaryOperation<1>(input) { } 1687 explicit LTypeofIs(LOperand* value) {
1757 virtual void PrintDataTo(StringStream* stream); 1688 inputs_[0] = value;
1689 }
1758 1690
1759 DECLARE_CONCRETE_INSTRUCTION(TypeofIs, "typeof-is") 1691 DECLARE_CONCRETE_INSTRUCTION(TypeofIs, "typeof-is")
1760 DECLARE_HYDROGEN_ACCESSOR(TypeofIs) 1692 DECLARE_HYDROGEN_ACCESSOR(TypeofIs)
1761 1693
1762 Handle<String> type_literal() { return hydrogen()->type_literal(); } 1694 Handle<String> type_literal() { return hydrogen()->type_literal(); }
1695
1696 virtual void PrintDataTo(StringStream* stream);
1763 }; 1697 };
1764 1698
1765 1699
1766 class LTypeofIsAndBranch: public LTypeofIs { 1700 class LTypeofIsAndBranch: public LControlInstruction<1> {
1767 public: 1701 public:
1768 LTypeofIsAndBranch(LOperand* value, 1702 explicit LTypeofIsAndBranch(LOperand* value) {
1769 int true_block_id, 1703 inputs_[0] = value;
1770 int false_block_id) 1704 }
1771 : LTypeofIs(value),
1772 true_block_id_(true_block_id),
1773 false_block_id_(false_block_id) { }
1774 1705
1775 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch") 1706 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
1707 DECLARE_HYDROGEN_ACCESSOR(TypeofIs)
1708
1709 Handle<String> type_literal() { return hydrogen()->type_literal(); }
1776 1710
1777 virtual void PrintDataTo(StringStream* stream); 1711 virtual void PrintDataTo(StringStream* stream);
1778 virtual bool IsControl() const { return true; }
1779
1780 int true_block_id() const { return true_block_id_; }
1781 int false_block_id() const { return false_block_id_; }
1782
1783 private:
1784 int true_block_id_;
1785 int false_block_id_;
1786 }; 1712 };
1787 1713
1788 1714
1789 class LDeleteProperty: public LBinaryOperation<1> { 1715 class LDeleteProperty: public LTemplateInstruction<1, 2> {
1790 public: 1716 public:
1791 LDeleteProperty(LOperand* obj, LOperand* key) 1717 LDeleteProperty(LOperand* obj, LOperand* key) {
1792 : LBinaryOperation<1>(obj, key) { } 1718 inputs_[0] = obj;
1719 inputs_[1] = key;
1720 }
1793 1721
1794 DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property") 1722 DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property")
1795 1723
1796 LOperand* object() const { return left(); } 1724 LOperand* object() { return inputs_[0]; }
1797 LOperand* key() const { return right(); } 1725 LOperand* key() { return inputs_[1]; }
1798 }; 1726 };
1799 1727
1800 1728
1801 class LOsrEntry: public LTemplateInstruction<0, 0, 0> { 1729 class LOsrEntry: public LTemplateInstruction<0, 0, 0> {
1802 public: 1730 public:
1803 LOsrEntry(); 1731 LOsrEntry();
1804 1732
1805 DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry") 1733 DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry")
1806 1734
1807 LOperand** SpilledRegisterArray() { return register_spills_; } 1735 LOperand** SpilledRegisterArray() { return register_spills_; }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1931 bool is_aborted() const { return status_ == ABORTED; } 1859 bool is_aborted() const { return status_ == ABORTED; }
1932 1860
1933 void Abort(const char* format, ...); 1861 void Abort(const char* format, ...);
1934 1862
1935 // Methods for getting operands for Use / Define / Temp. 1863 // Methods for getting operands for Use / Define / Temp.
1936 LRegister* ToOperand(Register reg); 1864 LRegister* ToOperand(Register reg);
1937 LUnallocated* ToUnallocated(Register reg); 1865 LUnallocated* ToUnallocated(Register reg);
1938 LUnallocated* ToUnallocated(XMMRegister reg); 1866 LUnallocated* ToUnallocated(XMMRegister reg);
1939 1867
1940 // Methods for setting up define-use relationships. 1868 // Methods for setting up define-use relationships.
1941 LOperand* Use(HValue* value, LUnallocated* operand); 1869 MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand);
1942 LOperand* UseFixed(HValue* value, Register fixed_register); 1870 MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
1943 LOperand* UseFixedDouble(HValue* value, XMMRegister fixed_register); 1871 MUST_USE_RESULT LOperand* UseFixedDouble(HValue* value,
1872 XMMRegister fixed_register);
1944 1873
1945 // A value that is guaranteed to be allocated to a register. 1874 // A value that is guaranteed to be allocated to a register.
1946 // Operand created by UseRegister is guaranteed to be live until the end of 1875 // Operand created by UseRegister is guaranteed to be live until the end of
1947 // instruction. This means that register allocator will not reuse it's 1876 // instruction. This means that register allocator will not reuse it's
1948 // register for any other operand inside instruction. 1877 // register for any other operand inside instruction.
1949 // Operand created by UseRegisterAtStart is guaranteed to be live only at 1878 // Operand created by UseRegisterAtStart is guaranteed to be live only at
1950 // instruction start. Register allocator is free to assign the same register 1879 // instruction start. Register allocator is free to assign the same register
1951 // to some other operand used inside instruction (i.e. temporary or 1880 // to some other operand used inside instruction (i.e. temporary or
1952 // output). 1881 // output).
1953 LOperand* UseRegister(HValue* value); 1882 MUST_USE_RESULT LOperand* UseRegister(HValue* value);
1954 LOperand* UseRegisterAtStart(HValue* value); 1883 MUST_USE_RESULT LOperand* UseRegisterAtStart(HValue* value);
1955 1884
1956 // A value in a register that may be trashed. 1885 // A value in a register that may be trashed.
1957 LOperand* UseTempRegister(HValue* value); 1886 MUST_USE_RESULT LOperand* UseTempRegister(HValue* value);
1958 LOperand* Use(HValue* value); 1887 MUST_USE_RESULT LOperand* Use(HValue* value);
1959 LOperand* UseAtStart(HValue* value); 1888 MUST_USE_RESULT LOperand* UseAtStart(HValue* value);
1960 LOperand* UseOrConstant(HValue* value); 1889 MUST_USE_RESULT LOperand* UseOrConstant(HValue* value);
1961 LOperand* UseOrConstantAtStart(HValue* value); 1890 MUST_USE_RESULT LOperand* UseOrConstantAtStart(HValue* value);
1962 LOperand* UseRegisterOrConstant(HValue* value); 1891 MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value);
1963 LOperand* UseRegisterOrConstantAtStart(HValue* value); 1892 MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
1893
1894 // Temporary operand that must be in a register.
1895 MUST_USE_RESULT LUnallocated* TempRegister();
1896 MUST_USE_RESULT LOperand* FixedTemp(Register reg);
1897 MUST_USE_RESULT LOperand* FixedTemp(XMMRegister reg);
1964 1898
1965 // Methods for setting up define-use relationships. 1899 // Methods for setting up define-use relationships.
1966 // Return the same instruction that they are passed. 1900 // Return the same instruction that they are passed.
1967 template<int I, int T> 1901 template<int I, int T>
1968 LInstruction* Define(LTemplateInstruction<1, I, T>* instr, 1902 LInstruction* Define(LTemplateInstruction<1, I, T>* instr,
1969 LUnallocated* result); 1903 LUnallocated* result);
1970 template<int I, int T> 1904 template<int I, int T>
1971 LInstruction* Define(LTemplateInstruction<1, I, T>* instr); 1905 LInstruction* Define(LTemplateInstruction<1, I, T>* instr);
1972 template<int I, int T> 1906 template<int I, int T>
1973 LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr); 1907 LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr);
(...skipping 21 matching lines...) Expand all
1995 HInstruction* hinstr, 1929 HInstruction* hinstr,
1996 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY); 1930 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
1997 LInstruction* MarkAsSaveDoubles(LInstruction* instr); 1931 LInstruction* MarkAsSaveDoubles(LInstruction* instr);
1998 1932
1999 LInstruction* SetInstructionPendingDeoptimizationEnvironment( 1933 LInstruction* SetInstructionPendingDeoptimizationEnvironment(
2000 LInstruction* instr, int ast_id); 1934 LInstruction* instr, int ast_id);
2001 void ClearInstructionPendingDeoptimizationEnvironment(); 1935 void ClearInstructionPendingDeoptimizationEnvironment();
2002 1936
2003 LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env); 1937 LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env);
2004 1938
2005 // Temporary operand that must be in a register.
2006 LUnallocated* TempRegister();
2007 LOperand* FixedTemp(Register reg);
2008 LOperand* FixedTemp(XMMRegister reg);
2009
2010 void VisitInstruction(HInstruction* current); 1939 void VisitInstruction(HInstruction* current);
2011 1940
2012 void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block); 1941 void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2013 LInstruction* DoBit(Token::Value op, HBitwiseBinaryOperation* instr); 1942 LInstruction* DoBit(Token::Value op, HBitwiseBinaryOperation* instr);
2014 LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr); 1943 LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr);
2015 LInstruction* DoArithmeticD(Token::Value op, 1944 LInstruction* DoArithmeticD(Token::Value op,
2016 HArithmeticBinaryOperation* instr); 1945 HArithmeticBinaryOperation* instr);
2017 LInstruction* DoArithmeticT(Token::Value op, 1946 LInstruction* DoArithmeticT(Token::Value op,
2018 HArithmeticBinaryOperation* instr); 1947 HArithmeticBinaryOperation* instr);
2019 1948
(...skipping 12 matching lines...) Expand all
2032 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder); 1961 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
2033 }; 1962 };
2034 1963
2035 #undef DECLARE_HYDROGEN_ACCESSOR 1964 #undef DECLARE_HYDROGEN_ACCESSOR
2036 #undef DECLARE_INSTRUCTION 1965 #undef DECLARE_INSTRUCTION
2037 #undef DECLARE_CONCRETE_INSTRUCTION 1966 #undef DECLARE_CONCRETE_INSTRUCTION
2038 1967
2039 } } // namespace v8::internal 1968 } } // namespace v8::internal
2040 1969
2041 #endif // V8_IA32_LITHIUM_IA32_H_ 1970 #endif // V8_IA32_LITHIUM_IA32_H_
OLDNEW
« no previous file with comments | « src/ia32/lithium-codegen-ia32.cc ('k') | src/ia32/lithium-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698