| 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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 RegisterDependentCodeForEmbeddedMaps(code); | 106 RegisterDependentCodeForEmbeddedMaps(code); |
| 107 } | 107 } |
| 108 PopulateDeoptimizationData(code); | 108 PopulateDeoptimizationData(code); |
| 109 if (!info()->IsStub()) { | 109 if (!info()->IsStub()) { |
| 110 Deoptimizer::EnsureRelocSpaceForLazyDeoptimization(code); | 110 Deoptimizer::EnsureRelocSpaceForLazyDeoptimization(code); |
| 111 } | 111 } |
| 112 info()->CommitDependencies(code); | 112 info()->CommitDependencies(code); |
| 113 } | 113 } |
| 114 | 114 |
| 115 | 115 |
| 116 void LCodeGen::Abort(const char* reason) { | 116 void LCodeGen::Abort(BailoutReason reason) { |
| 117 info()->set_bailout_reason(reason); | 117 info()->set_bailout_reason(reason); |
| 118 status_ = ABORTED; | 118 status_ = ABORTED; |
| 119 } | 119 } |
| 120 | 120 |
| 121 | 121 |
| 122 void LCodeGen::Comment(const char* format, ...) { | 122 void LCodeGen::Comment(const char* format, ...) { |
| 123 if (!FLAG_code_comments) return; | 123 if (!FLAG_code_comments) return; |
| 124 char buffer[4 * KB]; | 124 char buffer[4 * KB]; |
| 125 StringBuilder builder(buffer, ARRAY_SIZE(buffer)); | 125 StringBuilder builder(buffer, ARRAY_SIZE(buffer)); |
| 126 va_list arguments; | 126 va_list arguments; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 __ push(Immediate(Smi::FromInt(StackFrame::STUB))); | 203 __ push(Immediate(Smi::FromInt(StackFrame::STUB))); |
| 204 } else { | 204 } else { |
| 205 __ push(edi); // Callee's JS function. | 205 __ push(edi); // Callee's JS function. |
| 206 } | 206 } |
| 207 } | 207 } |
| 208 | 208 |
| 209 if (info()->IsOptimizing() && | 209 if (info()->IsOptimizing() && |
| 210 dynamic_frame_alignment_ && | 210 dynamic_frame_alignment_ && |
| 211 FLAG_debug_code) { | 211 FLAG_debug_code) { |
| 212 __ test(esp, Immediate(kPointerSize)); | 212 __ test(esp, Immediate(kPointerSize)); |
| 213 __ Assert(zero, "frame is expected to be aligned"); | 213 __ Assert(zero, kFrameIsExpectedToBeAligned); |
| 214 } | 214 } |
| 215 | 215 |
| 216 // Reserve space for the stack slots needed by the code. | 216 // Reserve space for the stack slots needed by the code. |
| 217 int slots = GetStackSlotCount(); | 217 int slots = GetStackSlotCount(); |
| 218 ASSERT(slots != 0 || !info()->IsOptimizing()); | 218 ASSERT(slots != 0 || !info()->IsOptimizing()); |
| 219 if (slots > 0) { | 219 if (slots > 0) { |
| 220 if (slots == 1) { | 220 if (slots == 1) { |
| 221 if (dynamic_frame_alignment_) { | 221 if (dynamic_frame_alignment_) { |
| 222 __ push(edx); | 222 __ push(edx); |
| 223 } else { | 223 } else { |
| (...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 936 void LCodeGen::DeoptimizeIf(Condition cc, | 936 void LCodeGen::DeoptimizeIf(Condition cc, |
| 937 LEnvironment* environment, | 937 LEnvironment* environment, |
| 938 Deoptimizer::BailoutType bailout_type) { | 938 Deoptimizer::BailoutType bailout_type) { |
| 939 RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); | 939 RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); |
| 940 ASSERT(environment->HasBeenRegistered()); | 940 ASSERT(environment->HasBeenRegistered()); |
| 941 int id = environment->deoptimization_index(); | 941 int id = environment->deoptimization_index(); |
| 942 ASSERT(info()->IsOptimizing() || info()->IsStub()); | 942 ASSERT(info()->IsOptimizing() || info()->IsStub()); |
| 943 Address entry = | 943 Address entry = |
| 944 Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type); | 944 Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type); |
| 945 if (entry == NULL) { | 945 if (entry == NULL) { |
| 946 Abort("bailout was not prepared"); | 946 Abort(kBailoutWasNotPrepared); |
| 947 return; | 947 return; |
| 948 } | 948 } |
| 949 | 949 |
| 950 if (FLAG_deopt_every_n_times != 0 && !info()->IsStub()) { | 950 if (FLAG_deopt_every_n_times != 0 && !info()->IsStub()) { |
| 951 ExternalReference count = ExternalReference::stress_deopt_count(isolate()); | 951 ExternalReference count = ExternalReference::stress_deopt_count(isolate()); |
| 952 Label no_deopt; | 952 Label no_deopt; |
| 953 __ pushfd(); | 953 __ pushfd(); |
| 954 __ push(eax); | 954 __ push(eax); |
| 955 __ mov(eax, Operand::StaticVariable(count)); | 955 __ mov(eax, Operand::StaticVariable(count)); |
| 956 __ sub(eax, Immediate(1)); | 956 __ sub(eax, Immediate(1)); |
| (...skipping 1007 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1964 if (FLAG_debug_code) { | 1964 if (FLAG_debug_code) { |
| 1965 __ push(value); | 1965 __ push(value); |
| 1966 __ mov(value, FieldOperand(string, HeapObject::kMapOffset)); | 1966 __ mov(value, FieldOperand(string, HeapObject::kMapOffset)); |
| 1967 __ movzx_b(value, FieldOperand(value, Map::kInstanceTypeOffset)); | 1967 __ movzx_b(value, FieldOperand(value, Map::kInstanceTypeOffset)); |
| 1968 | 1968 |
| 1969 __ and_(value, Immediate(kStringRepresentationMask | kStringEncodingMask)); | 1969 __ and_(value, Immediate(kStringRepresentationMask | kStringEncodingMask)); |
| 1970 static const uint32_t one_byte_seq_type = kSeqStringTag | kOneByteStringTag; | 1970 static const uint32_t one_byte_seq_type = kSeqStringTag | kOneByteStringTag; |
| 1971 static const uint32_t two_byte_seq_type = kSeqStringTag | kTwoByteStringTag; | 1971 static const uint32_t two_byte_seq_type = kSeqStringTag | kTwoByteStringTag; |
| 1972 __ cmp(value, Immediate(encoding == String::ONE_BYTE_ENCODING | 1972 __ cmp(value, Immediate(encoding == String::ONE_BYTE_ENCODING |
| 1973 ? one_byte_seq_type : two_byte_seq_type)); | 1973 ? one_byte_seq_type : two_byte_seq_type)); |
| 1974 __ Check(equal, "Unexpected string type"); | 1974 __ Check(equal, kUnexpectedStringType); |
| 1975 __ pop(value); | 1975 __ pop(value); |
| 1976 } | 1976 } |
| 1977 | 1977 |
| 1978 if (encoding == String::ONE_BYTE_ENCODING) { | 1978 if (encoding == String::ONE_BYTE_ENCODING) { |
| 1979 __ mov_b(FieldOperand(string, index, times_1, SeqString::kHeaderSize), | 1979 __ mov_b(FieldOperand(string, index, times_1, SeqString::kHeaderSize), |
| 1980 value); | 1980 value); |
| 1981 } else { | 1981 } else { |
| 1982 __ mov_w(FieldOperand(string, index, times_2, SeqString::kHeaderSize), | 1982 __ mov_w(FieldOperand(string, index, times_2, SeqString::kHeaderSize), |
| 1983 value); | 1983 value); |
| 1984 } | 1984 } |
| (...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2851 | 2851 |
| 2852 void LCodeGen::EmitReturn(LReturn* instr, bool dynamic_frame_alignment) { | 2852 void LCodeGen::EmitReturn(LReturn* instr, bool dynamic_frame_alignment) { |
| 2853 int extra_value_count = dynamic_frame_alignment ? 2 : 1; | 2853 int extra_value_count = dynamic_frame_alignment ? 2 : 1; |
| 2854 | 2854 |
| 2855 if (instr->has_constant_parameter_count()) { | 2855 if (instr->has_constant_parameter_count()) { |
| 2856 int parameter_count = ToInteger32(instr->constant_parameter_count()); | 2856 int parameter_count = ToInteger32(instr->constant_parameter_count()); |
| 2857 if (dynamic_frame_alignment && FLAG_debug_code) { | 2857 if (dynamic_frame_alignment && FLAG_debug_code) { |
| 2858 __ cmp(Operand(esp, | 2858 __ cmp(Operand(esp, |
| 2859 (parameter_count + extra_value_count) * kPointerSize), | 2859 (parameter_count + extra_value_count) * kPointerSize), |
| 2860 Immediate(kAlignmentZapValue)); | 2860 Immediate(kAlignmentZapValue)); |
| 2861 __ Assert(equal, "expected alignment marker"); | 2861 __ Assert(equal, kExpectedAlignmentMarker); |
| 2862 } | 2862 } |
| 2863 __ Ret((parameter_count + extra_value_count) * kPointerSize, ecx); | 2863 __ Ret((parameter_count + extra_value_count) * kPointerSize, ecx); |
| 2864 } else { | 2864 } else { |
| 2865 Register reg = ToRegister(instr->parameter_count()); | 2865 Register reg = ToRegister(instr->parameter_count()); |
| 2866 // The argument count parameter is a smi | 2866 // The argument count parameter is a smi |
| 2867 __ SmiUntag(reg); | 2867 __ SmiUntag(reg); |
| 2868 Register return_addr_reg = reg.is(ecx) ? ebx : ecx; | 2868 Register return_addr_reg = reg.is(ecx) ? ebx : ecx; |
| 2869 if (dynamic_frame_alignment && FLAG_debug_code) { | 2869 if (dynamic_frame_alignment && FLAG_debug_code) { |
| 2870 ASSERT(extra_value_count == 2); | 2870 ASSERT(extra_value_count == 2); |
| 2871 __ cmp(Operand(esp, reg, times_pointer_size, | 2871 __ cmp(Operand(esp, reg, times_pointer_size, |
| 2872 extra_value_count * kPointerSize), | 2872 extra_value_count * kPointerSize), |
| 2873 Immediate(kAlignmentZapValue)); | 2873 Immediate(kAlignmentZapValue)); |
| 2874 __ Assert(equal, "expected alignment marker"); | 2874 __ Assert(equal, kExpectedAlignmentMarker); |
| 2875 } | 2875 } |
| 2876 | 2876 |
| 2877 // emit code to restore stack based on instr->parameter_count() | 2877 // emit code to restore stack based on instr->parameter_count() |
| 2878 __ pop(return_addr_reg); // save return address | 2878 __ pop(return_addr_reg); // save return address |
| 2879 if (dynamic_frame_alignment) { | 2879 if (dynamic_frame_alignment) { |
| 2880 __ inc(reg); // 1 more for alignment | 2880 __ inc(reg); // 1 more for alignment |
| 2881 } | 2881 } |
| 2882 __ shl(reg, kPointerSizeLog2); | 2882 __ shl(reg, kPointerSizeLog2); |
| 2883 __ add(esp, reg); | 2883 __ add(esp, reg); |
| 2884 __ jmp(return_addr_reg); | 2884 __ jmp(return_addr_reg); |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3435 Representation key_representation, | 3435 Representation key_representation, |
| 3436 ElementsKind elements_kind, | 3436 ElementsKind elements_kind, |
| 3437 uint32_t offset, | 3437 uint32_t offset, |
| 3438 uint32_t additional_index) { | 3438 uint32_t additional_index) { |
| 3439 Register elements_pointer_reg = ToRegister(elements_pointer); | 3439 Register elements_pointer_reg = ToRegister(elements_pointer); |
| 3440 int element_shift_size = ElementsKindToShiftSize(elements_kind); | 3440 int element_shift_size = ElementsKindToShiftSize(elements_kind); |
| 3441 int shift_size = element_shift_size; | 3441 int shift_size = element_shift_size; |
| 3442 if (key->IsConstantOperand()) { | 3442 if (key->IsConstantOperand()) { |
| 3443 int constant_value = ToInteger32(LConstantOperand::cast(key)); | 3443 int constant_value = ToInteger32(LConstantOperand::cast(key)); |
| 3444 if (constant_value & 0xF0000000) { | 3444 if (constant_value & 0xF0000000) { |
| 3445 Abort("array index constant value too big"); | 3445 Abort(kArrayIndexConstantValueTooBig); |
| 3446 } | 3446 } |
| 3447 return Operand(elements_pointer_reg, | 3447 return Operand(elements_pointer_reg, |
| 3448 ((constant_value + additional_index) << shift_size) | 3448 ((constant_value + additional_index) << shift_size) |
| 3449 + offset); | 3449 + offset); |
| 3450 } else { | 3450 } else { |
| 3451 // Take the tag bit into account while computing the shift size. | 3451 // Take the tag bit into account while computing the shift size. |
| 3452 if (key_representation.IsSmi() && (shift_size >= 1)) { | 3452 if (key_representation.IsSmi() && (shift_size >= 1)) { |
| 3453 shift_size -= kSmiTagSize; | 3453 shift_size -= kSmiTagSize; |
| 3454 } | 3454 } |
| 3455 ScaleFactor scale_factor = static_cast<ScaleFactor>(shift_size); | 3455 ScaleFactor scale_factor = static_cast<ScaleFactor>(shift_size); |
| (...skipping 3050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6506 FixedArray::kHeaderSize - kPointerSize)); | 6506 FixedArray::kHeaderSize - kPointerSize)); |
| 6507 __ bind(&done); | 6507 __ bind(&done); |
| 6508 } | 6508 } |
| 6509 | 6509 |
| 6510 | 6510 |
| 6511 #undef __ | 6511 #undef __ |
| 6512 | 6512 |
| 6513 } } // namespace v8::internal | 6513 } } // namespace v8::internal |
| 6514 | 6514 |
| 6515 #endif // V8_TARGET_ARCH_IA32 | 6515 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |