OLD | NEW |
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 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 __ j(greater, &negative, Label::kNear); | 504 __ j(greater, &negative, Label::kNear); |
505 __ mov(ecx, scratch2); | 505 __ mov(ecx, scratch2); |
506 __ jmp(&done, Label::kNear); | 506 __ jmp(&done, Label::kNear); |
507 __ bind(&negative); | 507 __ bind(&negative); |
508 __ sub(ecx, Operand(scratch2)); | 508 __ sub(ecx, Operand(scratch2)); |
509 __ bind(&done); | 509 __ bind(&done); |
510 } | 510 } |
511 } | 511 } |
512 | 512 |
513 | 513 |
514 const char* UnaryOpStub::GetName() { | 514 void UnaryOpStub::PrintName(StringStream* stream) { |
515 if (name_ != NULL) return name_; | |
516 const int kMaxNameLength = 100; | |
517 name_ = Isolate::Current()->bootstrapper()->AllocateAutoDeletedArray( | |
518 kMaxNameLength); | |
519 if (name_ == NULL) return "OOM"; | |
520 const char* op_name = Token::Name(op_); | 515 const char* op_name = Token::Name(op_); |
521 const char* overwrite_name = NULL; // Make g++ happy. | 516 const char* overwrite_name = NULL; // Make g++ happy. |
522 switch (mode_) { | 517 switch (mode_) { |
523 case UNARY_NO_OVERWRITE: overwrite_name = "Alloc"; break; | 518 case UNARY_NO_OVERWRITE: overwrite_name = "Alloc"; break; |
524 case UNARY_OVERWRITE: overwrite_name = "Overwrite"; break; | 519 case UNARY_OVERWRITE: overwrite_name = "Overwrite"; break; |
525 } | 520 } |
526 | 521 stream->Add("UnaryOpStub_%s_%s_%s", |
527 OS::SNPrintF(Vector<char>(name_, kMaxNameLength), | 522 op_name, |
528 "UnaryOpStub_%s_%s_%s", | 523 overwrite_name, |
529 op_name, | 524 UnaryOpIC::GetName(operand_type_)); |
530 overwrite_name, | |
531 UnaryOpIC::GetName(operand_type_)); | |
532 return name_; | |
533 } | 525 } |
534 | 526 |
535 | 527 |
536 // TODO(svenpanne): Use virtual functions instead of switch. | 528 // TODO(svenpanne): Use virtual functions instead of switch. |
537 void UnaryOpStub::Generate(MacroAssembler* masm) { | 529 void UnaryOpStub::Generate(MacroAssembler* masm) { |
538 switch (operand_type_) { | 530 switch (operand_type_) { |
539 case UnaryOpIC::UNINITIALIZED: | 531 case UnaryOpIC::UNINITIALIZED: |
540 GenerateTypeTransition(masm); | 532 GenerateTypeTransition(masm); |
541 break; | 533 break; |
542 case UnaryOpIC::SMI: | 534 case UnaryOpIC::SMI: |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
907 break; | 899 break; |
908 case BinaryOpIC::GENERIC: | 900 case BinaryOpIC::GENERIC: |
909 GenerateGeneric(masm); | 901 GenerateGeneric(masm); |
910 break; | 902 break; |
911 default: | 903 default: |
912 UNREACHABLE(); | 904 UNREACHABLE(); |
913 } | 905 } |
914 } | 906 } |
915 | 907 |
916 | 908 |
917 const char* BinaryOpStub::GetName() { | 909 void BinaryOpStub::PrintName(StringStream* stream) { |
918 if (name_ != NULL) return name_; | |
919 const int kMaxNameLength = 100; | |
920 name_ = Isolate::Current()->bootstrapper()->AllocateAutoDeletedArray( | |
921 kMaxNameLength); | |
922 if (name_ == NULL) return "OOM"; | |
923 const char* op_name = Token::Name(op_); | 910 const char* op_name = Token::Name(op_); |
924 const char* overwrite_name; | 911 const char* overwrite_name; |
925 switch (mode_) { | 912 switch (mode_) { |
926 case NO_OVERWRITE: overwrite_name = "Alloc"; break; | 913 case NO_OVERWRITE: overwrite_name = "Alloc"; break; |
927 case OVERWRITE_RIGHT: overwrite_name = "OverwriteRight"; break; | 914 case OVERWRITE_RIGHT: overwrite_name = "OverwriteRight"; break; |
928 case OVERWRITE_LEFT: overwrite_name = "OverwriteLeft"; break; | 915 case OVERWRITE_LEFT: overwrite_name = "OverwriteLeft"; break; |
929 default: overwrite_name = "UnknownOverwrite"; break; | 916 default: overwrite_name = "UnknownOverwrite"; break; |
930 } | 917 } |
931 | 918 stream->Add("BinaryOpStub_%s_%s_%s", |
932 OS::SNPrintF(Vector<char>(name_, kMaxNameLength), | 919 op_name, |
933 "BinaryOpStub_%s_%s_%s", | 920 overwrite_name, |
934 op_name, | 921 BinaryOpIC::GetName(operands_type_)); |
935 overwrite_name, | |
936 BinaryOpIC::GetName(operands_type_)); | |
937 return name_; | |
938 } | 922 } |
939 | 923 |
940 | 924 |
941 void BinaryOpStub::GenerateSmiCode( | 925 void BinaryOpStub::GenerateSmiCode( |
942 MacroAssembler* masm, | 926 MacroAssembler* masm, |
943 Label* slow, | 927 Label* slow, |
944 SmiCodeGenerateHeapNumberResults allow_heapnumber_results) { | 928 SmiCodeGenerateHeapNumberResults allow_heapnumber_results) { |
945 // 1. Move arguments into edx, eax except for DIV and MOD, which need the | 929 // 1. Move arguments into edx, eax except for DIV and MOD, which need the |
946 // dividend in eax and edx free for the division. Use eax, ebx for those. | 930 // dividend in eax and edx free for the division. Use eax, ebx for those. |
947 Comment load_comment(masm, "-- Load arguments"); | 931 Comment load_comment(masm, "-- Load arguments"); |
(...skipping 3771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4719 | RegisterField::encode(false) // lhs_ and rhs_ are not used | 4703 | RegisterField::encode(false) // lhs_ and rhs_ are not used |
4720 | StrictField::encode(strict_) | 4704 | StrictField::encode(strict_) |
4721 | NeverNanNanField::encode(cc_ == equal ? never_nan_nan_ : false) | 4705 | NeverNanNanField::encode(cc_ == equal ? never_nan_nan_ : false) |
4722 | IncludeNumberCompareField::encode(include_number_compare_) | 4706 | IncludeNumberCompareField::encode(include_number_compare_) |
4723 | IncludeSmiCompareField::encode(include_smi_compare_); | 4707 | IncludeSmiCompareField::encode(include_smi_compare_); |
4724 } | 4708 } |
4725 | 4709 |
4726 | 4710 |
4727 // Unfortunately you have to run without snapshots to see most of these | 4711 // Unfortunately you have to run without snapshots to see most of these |
4728 // names in the profile since most compare stubs end up in the snapshot. | 4712 // names in the profile since most compare stubs end up in the snapshot. |
4729 const char* CompareStub::GetName() { | 4713 void CompareStub::PrintName(StringStream* stream) { |
4730 ASSERT(lhs_.is(no_reg) && rhs_.is(no_reg)); | 4714 ASSERT(lhs_.is(no_reg) && rhs_.is(no_reg)); |
4731 | |
4732 if (name_ != NULL) return name_; | |
4733 const int kMaxNameLength = 100; | |
4734 name_ = Isolate::Current()->bootstrapper()->AllocateAutoDeletedArray( | |
4735 kMaxNameLength); | |
4736 if (name_ == NULL) return "OOM"; | |
4737 | |
4738 const char* cc_name; | 4715 const char* cc_name; |
4739 switch (cc_) { | 4716 switch (cc_) { |
4740 case less: cc_name = "LT"; break; | 4717 case less: cc_name = "LT"; break; |
4741 case greater: cc_name = "GT"; break; | 4718 case greater: cc_name = "GT"; break; |
4742 case less_equal: cc_name = "LE"; break; | 4719 case less_equal: cc_name = "LE"; break; |
4743 case greater_equal: cc_name = "GE"; break; | 4720 case greater_equal: cc_name = "GE"; break; |
4744 case equal: cc_name = "EQ"; break; | 4721 case equal: cc_name = "EQ"; break; |
4745 case not_equal: cc_name = "NE"; break; | 4722 case not_equal: cc_name = "NE"; break; |
4746 default: cc_name = "UnknownCondition"; break; | 4723 default: cc_name = "UnknownCondition"; break; |
4747 } | 4724 } |
4748 | 4725 bool is_equality = cc_ == equal || cc_ == not_equal; |
4749 const char* strict_name = ""; | 4726 stream->Add("CompareStub_%s", cc_name); |
4750 if (strict_ && (cc_ == equal || cc_ == not_equal)) { | 4727 if (strict_ && is_equality) stream->Add("_STRICT"); |
4751 strict_name = "_STRICT"; | 4728 if (never_nan_nan_ && is_equality) stream->Add("_NO_NAN"); |
4752 } | 4729 if (!include_number_compare_) stream->Add("_NO_NUMBER"); |
4753 | 4730 if (!include_smi_compare_) stream->Add("_NO_SMI"); |
4754 const char* never_nan_nan_name = ""; | |
4755 if (never_nan_nan_ && (cc_ == equal || cc_ == not_equal)) { | |
4756 never_nan_nan_name = "_NO_NAN"; | |
4757 } | |
4758 | |
4759 const char* include_number_compare_name = ""; | |
4760 if (!include_number_compare_) { | |
4761 include_number_compare_name = "_NO_NUMBER"; | |
4762 } | |
4763 | |
4764 const char* include_smi_compare_name = ""; | |
4765 if (!include_smi_compare_) { | |
4766 include_smi_compare_name = "_NO_SMI"; | |
4767 } | |
4768 | |
4769 OS::SNPrintF(Vector<char>(name_, kMaxNameLength), | |
4770 "CompareStub_%s%s%s%s%s", | |
4771 cc_name, | |
4772 strict_name, | |
4773 never_nan_nan_name, | |
4774 include_number_compare_name, | |
4775 include_smi_compare_name); | |
4776 return name_; | |
4777 } | 4731 } |
4778 | 4732 |
4779 | 4733 |
4780 // ------------------------------------------------------------------------- | 4734 // ------------------------------------------------------------------------- |
4781 // StringCharCodeAtGenerator | 4735 // StringCharCodeAtGenerator |
4782 | 4736 |
4783 void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { | 4737 void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { |
4784 Label flat_string; | 4738 Label flat_string; |
4785 Label ascii_string; | 4739 Label ascii_string; |
4786 Label got_char_code; | 4740 Label got_char_code; |
(...skipping 1551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6338 __ Drop(1); | 6292 __ Drop(1); |
6339 __ ret(2 * kPointerSize); | 6293 __ ret(2 * kPointerSize); |
6340 } | 6294 } |
6341 | 6295 |
6342 | 6296 |
6343 #undef __ | 6297 #undef __ |
6344 | 6298 |
6345 } } // namespace v8::internal | 6299 } } // namespace v8::internal |
6346 | 6300 |
6347 #endif // V8_TARGET_ARCH_IA32 | 6301 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |