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

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

Issue 246075: Optimize calls to GenericBinaryStub (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 2 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/assembler-ia32.h ('k') | src/ia32/codegen-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 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 586 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 friend class JumpTarget; 597 friend class JumpTarget;
598 friend class Reference; 598 friend class Reference;
599 friend class Result; 599 friend class Result;
600 600
601 friend class CodeGeneratorPatcher; // Used in test-log-stack-tracer.cc 601 friend class CodeGeneratorPatcher; // Used in test-log-stack-tracer.cc
602 602
603 DISALLOW_COPY_AND_ASSIGN(CodeGenerator); 603 DISALLOW_COPY_AND_ASSIGN(CodeGenerator);
604 }; 604 };
605 605
606 606
607 // Flag that indicates whether or not the code that handles smi arguments 607 // Flag that indicates whether how to generate code for the stub.
608 // should be placed in the stub, inlined, or omitted entirely.
609 enum GenericBinaryFlags { 608 enum GenericBinaryFlags {
610 SMI_CODE_IN_STUB, 609 NO_GENERIC_BINARY_FLAGS = 0,
611 SMI_CODE_INLINED 610 NO_SMI_CODE_IN_STUB = 1 << 0 // Omit smi code in stub.
612 }; 611 };
613 612
614 613
615 class GenericBinaryOpStub: public CodeStub { 614 class GenericBinaryOpStub: public CodeStub {
616 public: 615 public:
617 GenericBinaryOpStub(Token::Value op, 616 GenericBinaryOpStub(Token::Value operation,
618 OverwriteMode mode, 617 OverwriteMode mode,
619 GenericBinaryFlags flags) 618 GenericBinaryFlags flags)
620 : op_(op), mode_(mode), flags_(flags) { 619 : op_(operation),
620 mode_(mode),
621 flags_(flags),
622 args_in_registers_(false),
623 args_reversed_(false) {
621 use_sse3_ = CpuFeatures::IsSupported(CpuFeatures::SSE3); 624 use_sse3_ = CpuFeatures::IsSupported(CpuFeatures::SSE3);
622 ASSERT(OpBits::is_valid(Token::NUM_TOKENS)); 625 ASSERT(OpBits::is_valid(Token::NUM_TOKENS));
623 } 626 }
624 627
625 void GenerateSmiCode(MacroAssembler* masm, Label* slow); 628 // Generate code to call the stub with the supplied arguments. This will add
629 // code at the call site to prepare arguments either in registers or on the
630 // stack together with the actual call.
631 void GenerateCall(MacroAssembler* masm, Register left, Register right);
632 void GenerateCall(MacroAssembler* masm, Register left, Smi* right);
633 void GenerateCall(MacroAssembler* masm, Smi* left, Register right);
626 634
627 private: 635 private:
628 Token::Value op_; 636 Token::Value op_;
629 OverwriteMode mode_; 637 OverwriteMode mode_;
630 GenericBinaryFlags flags_; 638 GenericBinaryFlags flags_;
639 bool args_in_registers_; // Arguments passed in registers not on the stack.
640 bool args_reversed_; // Left and right argument are swapped.
631 bool use_sse3_; 641 bool use_sse3_;
632 642
633 const char* GetName(); 643 const char* GetName();
634 644
635 #ifdef DEBUG 645 #ifdef DEBUG
636 void Print() { 646 void Print() {
637 PrintF("GenericBinaryOpStub (op %s), (mode %d, flags %d)\n", 647 PrintF("GenericBinaryOpStub (op %s), (mode %d, flags %d, registers %d, rever sed %d)\n",
638 Token::String(op_), 648 Token::String(op_),
639 static_cast<int>(mode_), 649 static_cast<int>(mode_),
640 static_cast<int>(flags_)); 650 static_cast<int>(flags_),
651 static_cast<int>(args_in_registers_),
652 static_cast<int>(args_reversed_));
641 } 653 }
642 #endif 654 #endif
643 655
644 // Minor key encoding in 16 bits FSOOOOOOOOOOOOMM. 656 // Minor key encoding in 16 bits FRASOOOOOOOOOOMM.
645 class ModeBits: public BitField<OverwriteMode, 0, 2> {}; 657 class ModeBits: public BitField<OverwriteMode, 0, 2> {};
646 class OpBits: public BitField<Token::Value, 2, 12> {}; 658 class OpBits: public BitField<Token::Value, 2, 10> {};
647 class SSE3Bits: public BitField<bool, 14, 1> {}; 659 class SSE3Bits: public BitField<bool, 12, 1> {};
660 class ArgsInRegistersBits: public BitField<bool, 13, 1> {};
661 class ArgsReversedBits: public BitField<bool, 14, 1> {};
648 class FlagBits: public BitField<GenericBinaryFlags, 15, 1> {}; 662 class FlagBits: public BitField<GenericBinaryFlags, 15, 1> {};
649 663
650 Major MajorKey() { return GenericBinaryOp; } 664 Major MajorKey() { return GenericBinaryOp; }
651 int MinorKey() { 665 int MinorKey() {
652 // Encode the parameters in a unique 16 bit value. 666 // Encode the parameters in a unique 16 bit value.
653 return OpBits::encode(op_) 667 return OpBits::encode(op_)
654 | ModeBits::encode(mode_) 668 | ModeBits::encode(mode_)
655 | FlagBits::encode(flags_) 669 | FlagBits::encode(flags_)
656 | SSE3Bits::encode(use_sse3_); 670 | SSE3Bits::encode(use_sse3_)
671 | ArgsInRegistersBits::encode(args_in_registers_)
672 | ArgsReversedBits::encode(args_reversed_);
657 } 673 }
674
658 void Generate(MacroAssembler* masm); 675 void Generate(MacroAssembler* masm);
676 void GenerateSmiCode(MacroAssembler* masm, Label* slow);
677 void GenerateLoadArguments(MacroAssembler* masm);
678 void GenerateReturn(MacroAssembler* masm);
679
680 bool ArgsInRegistersSupported() {
681 return ((op_ == Token::ADD) || (op_ == Token::SUB)
682 || (op_ == Token::MUL) || (op_ == Token::DIV))
683 && flags_ != NO_SMI_CODE_IN_STUB;
684 }
685 bool IsOperationCommutative() {
686 return (op_ == Token::ADD) || (op_ == Token::MUL);
687 }
688
689 void SetArgsInRegisters() { args_in_registers_ = true; }
690 void SetArgsReversed() { args_reversed_ = true; }
691 bool HasSmiCodeInStub() { return (flags_ & NO_SMI_CODE_IN_STUB) == 0; }
692 bool HasArgumentsInRegisters() { return args_in_registers_; }
693 bool HasArgumentsReversed() { return args_reversed_; }
659 }; 694 };
660 695
661 696
662 } } // namespace v8::internal 697 } } // namespace v8::internal
663 698
664 #endif // V8_IA32_CODEGEN_IA32_H_ 699 #endif // V8_IA32_CODEGEN_IA32_H_
OLDNEW
« no previous file with comments | « src/ia32/assembler-ia32.h ('k') | src/ia32/codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698