OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
943 | 943 |
944 // TODO(svenpanne): Use virtual functions instead of switch. | 944 // TODO(svenpanne): Use virtual functions instead of switch. |
945 void UnaryOpStub::Generate(MacroAssembler* masm) { | 945 void UnaryOpStub::Generate(MacroAssembler* masm) { |
946 switch (operand_type_) { | 946 switch (operand_type_) { |
947 case UnaryOpIC::UNINITIALIZED: | 947 case UnaryOpIC::UNINITIALIZED: |
948 GenerateTypeTransition(masm); | 948 GenerateTypeTransition(masm); |
949 break; | 949 break; |
950 case UnaryOpIC::SMI: | 950 case UnaryOpIC::SMI: |
951 GenerateSmiStub(masm); | 951 GenerateSmiStub(masm); |
952 break; | 952 break; |
953 case UnaryOpIC::HEAP_NUMBER: | 953 case UnaryOpIC::NUMBER: |
954 GenerateHeapNumberStub(masm); | 954 GenerateNumberStub(masm); |
955 break; | 955 break; |
956 case UnaryOpIC::GENERIC: | 956 case UnaryOpIC::GENERIC: |
957 GenerateGenericStub(masm); | 957 GenerateGenericStub(masm); |
958 break; | 958 break; |
959 } | 959 } |
960 } | 960 } |
961 | 961 |
962 | 962 |
963 void UnaryOpStub::GenerateTypeTransition(MacroAssembler* masm) { | 963 void UnaryOpStub::GenerateTypeTransition(MacroAssembler* masm) { |
964 __ pop(ecx); // Save return address. | 964 __ pop(ecx); // Save return address. |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1048 __ ret(0); | 1048 __ ret(0); |
1049 } | 1049 } |
1050 | 1050 |
1051 | 1051 |
1052 void UnaryOpStub::GenerateSmiCodeUndo(MacroAssembler* masm) { | 1052 void UnaryOpStub::GenerateSmiCodeUndo(MacroAssembler* masm) { |
1053 __ mov(eax, edx); | 1053 __ mov(eax, edx); |
1054 } | 1054 } |
1055 | 1055 |
1056 | 1056 |
1057 // TODO(svenpanne): Use virtual functions instead of switch. | 1057 // TODO(svenpanne): Use virtual functions instead of switch. |
1058 void UnaryOpStub::GenerateHeapNumberStub(MacroAssembler* masm) { | 1058 void UnaryOpStub::GenerateNumberStub(MacroAssembler* masm) { |
1059 switch (op_) { | 1059 switch (op_) { |
1060 case Token::SUB: | 1060 case Token::SUB: |
1061 GenerateHeapNumberStubSub(masm); | 1061 GenerateNumberStubSub(masm); |
1062 break; | 1062 break; |
1063 case Token::BIT_NOT: | 1063 case Token::BIT_NOT: |
1064 GenerateHeapNumberStubBitNot(masm); | 1064 GenerateNumberStubBitNot(masm); |
1065 break; | 1065 break; |
1066 default: | 1066 default: |
1067 UNREACHABLE(); | 1067 UNREACHABLE(); |
1068 } | 1068 } |
1069 } | 1069 } |
1070 | 1070 |
1071 | 1071 |
1072 void UnaryOpStub::GenerateHeapNumberStubSub(MacroAssembler* masm) { | 1072 void UnaryOpStub::GenerateNumberStubSub(MacroAssembler* masm) { |
1073 Label non_smi, undo, slow, call_builtin; | 1073 Label non_smi, undo, slow, call_builtin; |
1074 GenerateSmiCodeSub(masm, &non_smi, &undo, &call_builtin, Label::kNear); | 1074 GenerateSmiCodeSub(masm, &non_smi, &undo, &call_builtin, Label::kNear); |
1075 __ bind(&non_smi); | 1075 __ bind(&non_smi); |
1076 GenerateHeapNumberCodeSub(masm, &slow); | 1076 GenerateHeapNumberCodeSub(masm, &slow); |
1077 __ bind(&undo); | 1077 __ bind(&undo); |
1078 GenerateSmiCodeUndo(masm); | 1078 GenerateSmiCodeUndo(masm); |
1079 __ bind(&slow); | 1079 __ bind(&slow); |
1080 GenerateTypeTransition(masm); | 1080 GenerateTypeTransition(masm); |
1081 __ bind(&call_builtin); | 1081 __ bind(&call_builtin); |
1082 GenerateGenericCodeFallback(masm); | 1082 GenerateGenericCodeFallback(masm); |
1083 } | 1083 } |
1084 | 1084 |
1085 | 1085 |
1086 void UnaryOpStub::GenerateHeapNumberStubBitNot( | 1086 void UnaryOpStub::GenerateNumberStubBitNot( |
1087 MacroAssembler* masm) { | 1087 MacroAssembler* masm) { |
1088 Label non_smi, slow; | 1088 Label non_smi, slow; |
1089 GenerateSmiCodeBitNot(masm, &non_smi, Label::kNear); | 1089 GenerateSmiCodeBitNot(masm, &non_smi, Label::kNear); |
1090 __ bind(&non_smi); | 1090 __ bind(&non_smi); |
1091 GenerateHeapNumberCodeBitNot(masm, &slow); | 1091 GenerateHeapNumberCodeBitNot(masm, &slow); |
1092 __ bind(&slow); | 1092 __ bind(&slow); |
1093 GenerateTypeTransition(masm); | 1093 GenerateTypeTransition(masm); |
1094 } | 1094 } |
1095 | 1095 |
1096 | 1096 |
(...skipping 874 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1971 __ bind(&check); | 1971 __ bind(&check); |
1972 __ cmp(eax, factory->undefined_value()); | 1972 __ cmp(eax, factory->undefined_value()); |
1973 __ j(not_equal, &done, Label::kNear); | 1973 __ j(not_equal, &done, Label::kNear); |
1974 if (Token::IsBitOp(op_)) { | 1974 if (Token::IsBitOp(op_)) { |
1975 __ xor_(eax, eax); | 1975 __ xor_(eax, eax); |
1976 } else { | 1976 } else { |
1977 __ mov(eax, Immediate(factory->nan_value())); | 1977 __ mov(eax, Immediate(factory->nan_value())); |
1978 } | 1978 } |
1979 __ bind(&done); | 1979 __ bind(&done); |
1980 | 1980 |
1981 GenerateHeapNumberStub(masm); | 1981 GenerateNumberStub(masm); |
1982 } | 1982 } |
1983 | 1983 |
1984 | 1984 |
1985 void BinaryOpStub::GenerateHeapNumberStub(MacroAssembler* masm) { | 1985 void BinaryOpStub::GenerateNumberStub(MacroAssembler* masm) { |
1986 Label call_runtime; | 1986 Label call_runtime; |
1987 | 1987 |
1988 // Floating point case. | 1988 // Floating point case. |
1989 switch (op_) { | 1989 switch (op_) { |
1990 case Token::ADD: | 1990 case Token::ADD: |
1991 case Token::SUB: | 1991 case Token::SUB: |
1992 case Token::MUL: | 1992 case Token::MUL: |
1993 case Token::DIV: { | 1993 case Token::DIV: { |
1994 Label not_floats; | 1994 Label not_floats; |
1995 if (CpuFeatures::IsSupported(SSE2)) { | 1995 if (CpuFeatures::IsSupported(SSE2)) { |
(...skipping 2440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4436 } | 4436 } |
4437 | 4437 |
4438 | 4438 |
4439 static void CheckInputType(MacroAssembler* masm, | 4439 static void CheckInputType(MacroAssembler* masm, |
4440 Register input, | 4440 Register input, |
4441 CompareIC::State expected, | 4441 CompareIC::State expected, |
4442 Label* fail) { | 4442 Label* fail) { |
4443 Label ok; | 4443 Label ok; |
4444 if (expected == CompareIC::SMI) { | 4444 if (expected == CompareIC::SMI) { |
4445 __ JumpIfNotSmi(input, fail); | 4445 __ JumpIfNotSmi(input, fail); |
4446 } else if (expected == CompareIC::HEAP_NUMBER) { | 4446 } else if (expected == CompareIC::NUMBER) { |
4447 __ JumpIfSmi(input, &ok); | 4447 __ JumpIfSmi(input, &ok); |
4448 __ cmp(FieldOperand(input, HeapObject::kMapOffset), | 4448 __ cmp(FieldOperand(input, HeapObject::kMapOffset), |
4449 Immediate(masm->isolate()->factory()->heap_number_map())); | 4449 Immediate(masm->isolate()->factory()->heap_number_map())); |
4450 __ j(not_equal, fail); | 4450 __ j(not_equal, fail); |
4451 } | 4451 } |
4452 // We could be strict about symbol/string here, but as long as | 4452 // We could be strict about symbol/string here, but as long as |
4453 // hydrogen doesn't care, the stub doesn't have to care either. | 4453 // hydrogen doesn't care, the stub doesn't have to care either. |
4454 __ bind(&ok); | 4454 __ bind(&ok); |
4455 } | 4455 } |
4456 | 4456 |
(...skipping 2292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6749 __ bind(&done); | 6749 __ bind(&done); |
6750 __ mov(eax, edx); | 6750 __ mov(eax, edx); |
6751 } | 6751 } |
6752 __ ret(0); | 6752 __ ret(0); |
6753 | 6753 |
6754 __ bind(&miss); | 6754 __ bind(&miss); |
6755 GenerateMiss(masm); | 6755 GenerateMiss(masm); |
6756 } | 6756 } |
6757 | 6757 |
6758 | 6758 |
6759 void ICCompareStub::GenerateHeapNumbers(MacroAssembler* masm) { | 6759 void ICCompareStub::GenerateNumbers(MacroAssembler* masm) { |
6760 ASSERT(state_ == CompareIC::HEAP_NUMBER); | 6760 ASSERT(state_ == CompareIC::NUMBER); |
6761 | 6761 |
6762 Label generic_stub; | 6762 Label generic_stub; |
6763 Label unordered, maybe_undefined1, maybe_undefined2; | 6763 Label unordered, maybe_undefined1, maybe_undefined2; |
6764 Label miss; | 6764 Label miss; |
6765 | 6765 |
6766 if (left_ == CompareIC::SMI) { | 6766 if (left_ == CompareIC::SMI) { |
6767 __ JumpIfNotSmi(edx, &miss); | 6767 __ JumpIfNotSmi(edx, &miss); |
6768 } | 6768 } |
6769 if (right_ == CompareIC::SMI) { | 6769 if (right_ == CompareIC::SMI) { |
6770 __ JumpIfNotSmi(eax, &miss); | 6770 __ JumpIfNotSmi(eax, &miss); |
(...skipping 925 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7696 // Restore ecx. | 7696 // Restore ecx. |
7697 __ pop(ecx); | 7697 __ pop(ecx); |
7698 __ ret(0); | 7698 __ ret(0); |
7699 } | 7699 } |
7700 | 7700 |
7701 #undef __ | 7701 #undef __ |
7702 | 7702 |
7703 } } // namespace v8::internal | 7703 } } // namespace v8::internal |
7704 | 7704 |
7705 #endif // V8_TARGET_ARCH_IA32 | 7705 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |