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 2201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2212 __ j(NegateCondition(cc), chunk_->GetAssemblyLabel(right_block)); | 2212 __ j(NegateCondition(cc), chunk_->GetAssemblyLabel(right_block)); |
2213 } else if (right_block == next_block) { | 2213 } else if (right_block == next_block) { |
2214 __ j(cc, chunk_->GetAssemblyLabel(left_block)); | 2214 __ j(cc, chunk_->GetAssemblyLabel(left_block)); |
2215 } else { | 2215 } else { |
2216 __ j(cc, chunk_->GetAssemblyLabel(left_block)); | 2216 __ j(cc, chunk_->GetAssemblyLabel(left_block)); |
2217 __ jmp(chunk_->GetAssemblyLabel(right_block)); | 2217 __ jmp(chunk_->GetAssemblyLabel(right_block)); |
2218 } | 2218 } |
2219 } | 2219 } |
2220 | 2220 |
2221 | 2221 |
| 2222 template<class InstrType> |
| 2223 void LCodeGen::EmitFalseBranch(InstrType instr, Condition cc) { |
| 2224 int false_block = instr->FalseDestination(chunk_); |
| 2225 __ j(cc, chunk_->GetAssemblyLabel(false_block)); |
| 2226 } |
| 2227 |
| 2228 |
2222 void LCodeGen::DoIsNumberAndBranch(LIsNumberAndBranch* instr) { | 2229 void LCodeGen::DoIsNumberAndBranch(LIsNumberAndBranch* instr) { |
2223 Representation r = instr->hydrogen()->value()->representation(); | 2230 Representation r = instr->hydrogen()->value()->representation(); |
2224 if (r.IsSmiOrInteger32() || r.IsDouble()) { | 2231 if (r.IsSmiOrInteger32() || r.IsDouble()) { |
2225 EmitBranch(instr, no_condition); | 2232 EmitBranch(instr, no_condition); |
2226 } else { | 2233 } else { |
2227 ASSERT(r.IsTagged()); | 2234 ASSERT(r.IsTagged()); |
2228 Register reg = ToRegister(instr->value()); | 2235 Register reg = ToRegister(instr->value()); |
2229 HType type = instr->hydrogen()->value()->type(); | 2236 HType type = instr->hydrogen()->value()->type(); |
2230 if (type.IsTaggedNumber()) { | 2237 if (type.IsTaggedNumber()) { |
2231 EmitBranch(instr, no_condition); | 2238 EmitBranch(instr, no_condition); |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2462 Handle<Object> right = ToHandle(LConstantOperand::cast(instr->right())); | 2469 Handle<Object> right = ToHandle(LConstantOperand::cast(instr->right())); |
2463 __ CmpObject(left, right); | 2470 __ CmpObject(left, right); |
2464 } else { | 2471 } else { |
2465 Operand right = ToOperand(instr->right()); | 2472 Operand right = ToOperand(instr->right()); |
2466 __ cmp(left, right); | 2473 __ cmp(left, right); |
2467 } | 2474 } |
2468 EmitBranch(instr, equal); | 2475 EmitBranch(instr, equal); |
2469 } | 2476 } |
2470 | 2477 |
2471 | 2478 |
| 2479 void LCodeGen::DoCmpHoleAndBranch(LCmpHoleAndBranch* instr) { |
| 2480 if (instr->hydrogen()->representation().IsTagged()) { |
| 2481 Register input_reg = ToRegister(instr->object()); |
| 2482 __ cmp(input_reg, factory()->the_hole_value()); |
| 2483 EmitBranch(instr, equal); |
| 2484 return; |
| 2485 } |
| 2486 |
| 2487 bool use_sse2 = CpuFeatures::IsSupported(SSE2); |
| 2488 if (use_sse2) { |
| 2489 CpuFeatureScope scope(masm(), SSE2); |
| 2490 XMMRegister input_reg = ToDoubleRegister(instr->object()); |
| 2491 __ ucomisd(input_reg, input_reg); |
| 2492 } else { |
| 2493 // Put the value to the top of stack |
| 2494 X87Register src = ToX87Register(instr->object()); |
| 2495 X87LoadForUsage(src); |
| 2496 __ fld(0); |
| 2497 __ fld(0); |
| 2498 __ FCmp(); |
| 2499 } |
| 2500 |
| 2501 EmitFalseBranch(instr, parity_odd); |
| 2502 |
| 2503 __ sub(esp, Immediate(kDoubleSize)); |
| 2504 if (use_sse2) { |
| 2505 CpuFeatureScope scope(masm(), SSE2); |
| 2506 XMMRegister input_reg = ToDoubleRegister(instr->object()); |
| 2507 __ movdbl(MemOperand(esp, 0), input_reg); |
| 2508 } else { |
| 2509 __ fld(0); |
| 2510 __ fstp_d(MemOperand(esp, 0)); |
| 2511 } |
| 2512 |
| 2513 __ add(esp, Immediate(kDoubleSize)); |
| 2514 __ cmp(MemOperand(esp, -sizeof(kHoleNanUpper32)), Immediate(kHoleNanUpper32)); |
| 2515 EmitBranch(instr, equal); |
| 2516 } |
| 2517 |
| 2518 |
2472 Condition LCodeGen::EmitIsObject(Register input, | 2519 Condition LCodeGen::EmitIsObject(Register input, |
2473 Register temp1, | 2520 Register temp1, |
2474 Label* is_not_object, | 2521 Label* is_not_object, |
2475 Label* is_object) { | 2522 Label* is_object) { |
2476 __ JumpIfSmi(input, is_not_object); | 2523 __ JumpIfSmi(input, is_not_object); |
2477 | 2524 |
2478 __ cmp(input, isolate()->factory()->null_value()); | 2525 __ cmp(input, isolate()->factory()->null_value()); |
2479 __ j(equal, is_object); | 2526 __ j(equal, is_object); |
2480 | 2527 |
2481 __ mov(temp1, FieldOperand(input, HeapObject::kMapOffset)); | 2528 __ mov(temp1, FieldOperand(input, HeapObject::kMapOffset)); |
(...skipping 2580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5062 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr) | 5109 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr) |
5063 : LDeferredCode(codegen), instr_(instr) { } | 5110 : LDeferredCode(codegen), instr_(instr) { } |
5064 virtual void Generate() { codegen()->DoDeferredNumberTagD(instr_); } | 5111 virtual void Generate() { codegen()->DoDeferredNumberTagD(instr_); } |
5065 virtual LInstruction* instr() { return instr_; } | 5112 virtual LInstruction* instr() { return instr_; } |
5066 private: | 5113 private: |
5067 LNumberTagD* instr_; | 5114 LNumberTagD* instr_; |
5068 }; | 5115 }; |
5069 | 5116 |
5070 Register reg = ToRegister(instr->result()); | 5117 Register reg = ToRegister(instr->result()); |
5071 | 5118 |
5072 bool convert_hole = false; | |
5073 HValue* change_input = instr->hydrogen()->value(); | |
5074 if (change_input->IsLoadKeyed()) { | |
5075 HLoadKeyed* load = HLoadKeyed::cast(change_input); | |
5076 convert_hole = load->UsesMustHandleHole(); | |
5077 } | |
5078 | |
5079 bool use_sse2 = CpuFeatures::IsSupported(SSE2); | 5119 bool use_sse2 = CpuFeatures::IsSupported(SSE2); |
5080 if (!use_sse2) { | 5120 if (!use_sse2) { |
5081 // Put the value to the top of stack | 5121 // Put the value to the top of stack |
5082 X87Register src = ToX87Register(instr->value()); | 5122 X87Register src = ToX87Register(instr->value()); |
5083 X87LoadForUsage(src); | 5123 X87LoadForUsage(src); |
5084 } | 5124 } |
5085 | 5125 |
5086 Label no_special_nan_handling; | |
5087 Label done; | |
5088 if (convert_hole) { | |
5089 if (use_sse2) { | |
5090 CpuFeatureScope scope(masm(), SSE2); | |
5091 XMMRegister input_reg = ToDoubleRegister(instr->value()); | |
5092 __ ucomisd(input_reg, input_reg); | |
5093 } else { | |
5094 __ fld(0); | |
5095 __ fld(0); | |
5096 __ FCmp(); | |
5097 } | |
5098 | |
5099 __ j(parity_odd, &no_special_nan_handling); | |
5100 __ sub(esp, Immediate(kDoubleSize)); | |
5101 if (use_sse2) { | |
5102 CpuFeatureScope scope(masm(), SSE2); | |
5103 XMMRegister input_reg = ToDoubleRegister(instr->value()); | |
5104 __ movdbl(MemOperand(esp, 0), input_reg); | |
5105 } else { | |
5106 __ fld(0); | |
5107 __ fstp_d(MemOperand(esp, 0)); | |
5108 } | |
5109 __ cmp(MemOperand(esp, sizeof(kHoleNanLower32)), | |
5110 Immediate(kHoleNanUpper32)); | |
5111 Label canonicalize; | |
5112 __ j(not_equal, &canonicalize); | |
5113 __ add(esp, Immediate(kDoubleSize)); | |
5114 __ mov(reg, factory()->the_hole_value()); | |
5115 if (!use_sse2) { | |
5116 __ fstp(0); | |
5117 } | |
5118 __ jmp(&done); | |
5119 __ bind(&canonicalize); | |
5120 __ add(esp, Immediate(kDoubleSize)); | |
5121 ExternalReference nan = | |
5122 ExternalReference::address_of_canonical_non_hole_nan(); | |
5123 if (use_sse2) { | |
5124 CpuFeatureScope scope(masm(), SSE2); | |
5125 XMMRegister input_reg = ToDoubleRegister(instr->value()); | |
5126 __ movdbl(input_reg, Operand::StaticVariable(nan)); | |
5127 } else { | |
5128 __ fstp(0); | |
5129 __ fld_d(Operand::StaticVariable(nan)); | |
5130 } | |
5131 } | |
5132 | |
5133 __ bind(&no_special_nan_handling); | |
5134 DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr); | 5126 DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr); |
5135 if (FLAG_inline_new) { | 5127 if (FLAG_inline_new) { |
5136 Register tmp = ToRegister(instr->temp()); | 5128 Register tmp = ToRegister(instr->temp()); |
5137 __ AllocateHeapNumber(reg, tmp, no_reg, deferred->entry()); | 5129 __ AllocateHeapNumber(reg, tmp, no_reg, deferred->entry()); |
5138 } else { | 5130 } else { |
5139 __ jmp(deferred->entry()); | 5131 __ jmp(deferred->entry()); |
5140 } | 5132 } |
5141 __ bind(deferred->exit()); | 5133 __ bind(deferred->exit()); |
5142 if (use_sse2) { | 5134 if (use_sse2) { |
5143 CpuFeatureScope scope(masm(), SSE2); | 5135 CpuFeatureScope scope(masm(), SSE2); |
5144 XMMRegister input_reg = ToDoubleRegister(instr->value()); | 5136 XMMRegister input_reg = ToDoubleRegister(instr->value()); |
5145 __ movdbl(FieldOperand(reg, HeapNumber::kValueOffset), input_reg); | 5137 __ movdbl(FieldOperand(reg, HeapNumber::kValueOffset), input_reg); |
5146 } else { | 5138 } else { |
5147 __ fstp_d(FieldOperand(reg, HeapNumber::kValueOffset)); | 5139 __ fstp_d(FieldOperand(reg, HeapNumber::kValueOffset)); |
5148 } | 5140 } |
5149 __ bind(&done); | |
5150 } | 5141 } |
5151 | 5142 |
5152 | 5143 |
5153 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { | 5144 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { |
5154 // TODO(3095996): Get rid of this. For now, we need to make the | 5145 // TODO(3095996): Get rid of this. For now, we need to make the |
5155 // result register contain a valid pointer because it is already | 5146 // result register contain a valid pointer because it is already |
5156 // contained in the register pointer map. | 5147 // contained in the register pointer map. |
5157 Register reg = ToRegister(instr->result()); | 5148 Register reg = ToRegister(instr->result()); |
5158 __ Set(reg, Immediate(0)); | 5149 __ Set(reg, Immediate(0)); |
5159 | 5150 |
(...skipping 29 matching lines...) Expand all Loading... |
5189 } else { | 5180 } else { |
5190 __ AssertSmi(result); | 5181 __ AssertSmi(result); |
5191 } | 5182 } |
5192 __ SmiUntag(result); | 5183 __ SmiUntag(result); |
5193 } | 5184 } |
5194 | 5185 |
5195 | 5186 |
5196 void LCodeGen::EmitNumberUntagDNoSSE2(Register input_reg, | 5187 void LCodeGen::EmitNumberUntagDNoSSE2(Register input_reg, |
5197 Register temp_reg, | 5188 Register temp_reg, |
5198 X87Register res_reg, | 5189 X87Register res_reg, |
5199 bool allow_undefined_as_nan, | 5190 bool can_convert_undefined_to_nan, |
5200 bool deoptimize_on_minus_zero, | 5191 bool deoptimize_on_minus_zero, |
5201 LEnvironment* env, | 5192 LEnvironment* env, |
5202 NumberUntagDMode mode) { | 5193 NumberUntagDMode mode) { |
5203 Label load_smi, done; | 5194 Label load_smi, done; |
5204 | 5195 |
5205 X87PrepareToWrite(res_reg); | 5196 X87PrepareToWrite(res_reg); |
5206 STATIC_ASSERT(NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE > | 5197 if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED) { |
5207 NUMBER_CANDIDATE_IS_ANY_TAGGED); | |
5208 if (mode >= NUMBER_CANDIDATE_IS_ANY_TAGGED) { | |
5209 // Smi check. | 5198 // Smi check. |
5210 __ JumpIfSmi(input_reg, &load_smi, Label::kNear); | 5199 __ JumpIfSmi(input_reg, &load_smi, Label::kNear); |
5211 | 5200 |
5212 // Heap number map check. | 5201 // Heap number map check. |
5213 __ cmp(FieldOperand(input_reg, HeapObject::kMapOffset), | 5202 __ cmp(FieldOperand(input_reg, HeapObject::kMapOffset), |
5214 factory()->heap_number_map()); | 5203 factory()->heap_number_map()); |
5215 if (!allow_undefined_as_nan) { | 5204 if (!can_convert_undefined_to_nan) { |
5216 DeoptimizeIf(not_equal, env); | 5205 DeoptimizeIf(not_equal, env); |
5217 } else { | 5206 } else { |
5218 Label heap_number, convert; | 5207 Label heap_number, convert; |
5219 __ j(equal, &heap_number, Label::kNear); | 5208 __ j(equal, &heap_number, Label::kNear); |
5220 | 5209 |
5221 // Convert undefined (or hole) to NaN. | 5210 // Convert undefined (or hole) to NaN. |
5222 __ cmp(input_reg, factory()->undefined_value()); | 5211 __ cmp(input_reg, factory()->undefined_value()); |
5223 if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE) { | |
5224 __ j(equal, &convert, Label::kNear); | |
5225 __ cmp(input_reg, factory()->the_hole_value()); | |
5226 } | |
5227 DeoptimizeIf(not_equal, env); | 5212 DeoptimizeIf(not_equal, env); |
5228 | 5213 |
5229 __ bind(&convert); | 5214 __ bind(&convert); |
5230 ExternalReference nan = | 5215 ExternalReference nan = |
5231 ExternalReference::address_of_canonical_non_hole_nan(); | 5216 ExternalReference::address_of_canonical_non_hole_nan(); |
5232 __ fld_d(Operand::StaticVariable(nan)); | 5217 __ fld_d(Operand::StaticVariable(nan)); |
5233 __ jmp(&done, Label::kNear); | 5218 __ jmp(&done, Label::kNear); |
5234 | 5219 |
5235 __ bind(&heap_number); | 5220 __ bind(&heap_number); |
5236 } | 5221 } |
(...skipping 26 matching lines...) Expand all Loading... |
5263 __ pop(input_reg); | 5248 __ pop(input_reg); |
5264 __ SmiTag(input_reg); // Retag smi. | 5249 __ SmiTag(input_reg); // Retag smi. |
5265 __ bind(&done); | 5250 __ bind(&done); |
5266 X87CommitWrite(res_reg); | 5251 X87CommitWrite(res_reg); |
5267 } | 5252 } |
5268 | 5253 |
5269 | 5254 |
5270 void LCodeGen::EmitNumberUntagD(Register input_reg, | 5255 void LCodeGen::EmitNumberUntagD(Register input_reg, |
5271 Register temp_reg, | 5256 Register temp_reg, |
5272 XMMRegister result_reg, | 5257 XMMRegister result_reg, |
5273 bool allow_undefined_as_nan, | 5258 bool can_convert_undefined_to_nan, |
5274 bool deoptimize_on_minus_zero, | 5259 bool deoptimize_on_minus_zero, |
5275 LEnvironment* env, | 5260 LEnvironment* env, |
5276 NumberUntagDMode mode) { | 5261 NumberUntagDMode mode) { |
5277 Label load_smi, done; | 5262 Label load_smi, done; |
5278 | 5263 |
5279 STATIC_ASSERT(NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE > | 5264 if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED) { |
5280 NUMBER_CANDIDATE_IS_ANY_TAGGED); | |
5281 if (mode >= NUMBER_CANDIDATE_IS_ANY_TAGGED) { | |
5282 // Smi check. | 5265 // Smi check. |
5283 __ JumpIfSmi(input_reg, &load_smi, Label::kNear); | 5266 __ JumpIfSmi(input_reg, &load_smi, Label::kNear); |
5284 | 5267 |
5285 // Heap number map check. | 5268 // Heap number map check. |
5286 __ cmp(FieldOperand(input_reg, HeapObject::kMapOffset), | 5269 __ cmp(FieldOperand(input_reg, HeapObject::kMapOffset), |
5287 factory()->heap_number_map()); | 5270 factory()->heap_number_map()); |
5288 if (!allow_undefined_as_nan) { | 5271 if (!can_convert_undefined_to_nan) { |
5289 DeoptimizeIf(not_equal, env); | 5272 DeoptimizeIf(not_equal, env); |
5290 } else { | 5273 } else { |
5291 Label heap_number, convert; | 5274 Label heap_number, convert; |
5292 __ j(equal, &heap_number, Label::kNear); | 5275 __ j(equal, &heap_number, Label::kNear); |
5293 | 5276 |
5294 // Convert undefined (and hole) to NaN. | 5277 // Convert undefined (and hole) to NaN. |
5295 __ cmp(input_reg, factory()->undefined_value()); | 5278 __ cmp(input_reg, factory()->undefined_value()); |
5296 if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE) { | |
5297 __ j(equal, &convert, Label::kNear); | |
5298 __ cmp(input_reg, factory()->the_hole_value()); | |
5299 } | |
5300 DeoptimizeIf(not_equal, env); | 5279 DeoptimizeIf(not_equal, env); |
5301 | 5280 |
5302 __ bind(&convert); | 5281 __ bind(&convert); |
5303 ExternalReference nan = | 5282 ExternalReference nan = |
5304 ExternalReference::address_of_canonical_non_hole_nan(); | 5283 ExternalReference::address_of_canonical_non_hole_nan(); |
5305 __ movdbl(result_reg, Operand::StaticVariable(nan)); | 5284 __ movdbl(result_reg, Operand::StaticVariable(nan)); |
5306 __ jmp(&done, Label::kNear); | 5285 __ jmp(&done, Label::kNear); |
5307 | 5286 |
5308 __ bind(&heap_number); | 5287 __ bind(&heap_number); |
5309 } | 5288 } |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5614 LOperand* temp = instr->temp(); | 5593 LOperand* temp = instr->temp(); |
5615 ASSERT(temp == NULL || temp->IsRegister()); | 5594 ASSERT(temp == NULL || temp->IsRegister()); |
5616 LOperand* result = instr->result(); | 5595 LOperand* result = instr->result(); |
5617 ASSERT(result->IsDoubleRegister()); | 5596 ASSERT(result->IsDoubleRegister()); |
5618 | 5597 |
5619 Register input_reg = ToRegister(input); | 5598 Register input_reg = ToRegister(input); |
5620 bool deoptimize_on_minus_zero = | 5599 bool deoptimize_on_minus_zero = |
5621 instr->hydrogen()->deoptimize_on_minus_zero(); | 5600 instr->hydrogen()->deoptimize_on_minus_zero(); |
5622 Register temp_reg = deoptimize_on_minus_zero ? ToRegister(temp) : no_reg; | 5601 Register temp_reg = deoptimize_on_minus_zero ? ToRegister(temp) : no_reg; |
5623 | 5602 |
5624 NumberUntagDMode mode = NUMBER_CANDIDATE_IS_ANY_TAGGED; | |
5625 HValue* value = instr->hydrogen()->value(); | 5603 HValue* value = instr->hydrogen()->value(); |
5626 if (value->representation().IsSmi()) { | 5604 NumberUntagDMode mode = value->representation().IsSmi() |
5627 mode = NUMBER_CANDIDATE_IS_SMI; | 5605 ? NUMBER_CANDIDATE_IS_SMI : NUMBER_CANDIDATE_IS_ANY_TAGGED; |
5628 } else if (value->IsLoadKeyed()) { | |
5629 HLoadKeyed* load = HLoadKeyed::cast(value); | |
5630 if (load->UsesMustHandleHole()) { | |
5631 mode = NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE; | |
5632 } | |
5633 } | |
5634 | 5606 |
5635 if (CpuFeatures::IsSupported(SSE2)) { | 5607 if (CpuFeatures::IsSupported(SSE2)) { |
5636 CpuFeatureScope scope(masm(), SSE2); | 5608 CpuFeatureScope scope(masm(), SSE2); |
5637 XMMRegister result_reg = ToDoubleRegister(result); | 5609 XMMRegister result_reg = ToDoubleRegister(result); |
5638 EmitNumberUntagD(input_reg, | 5610 EmitNumberUntagD(input_reg, |
5639 temp_reg, | 5611 temp_reg, |
5640 result_reg, | 5612 result_reg, |
5641 instr->hydrogen()->allow_undefined_as_nan(), | 5613 instr->hydrogen()->can_convert_undefined_to_nan(), |
5642 deoptimize_on_minus_zero, | 5614 deoptimize_on_minus_zero, |
5643 instr->environment(), | 5615 instr->environment(), |
5644 mode); | 5616 mode); |
5645 } else { | 5617 } else { |
5646 EmitNumberUntagDNoSSE2(input_reg, | 5618 EmitNumberUntagDNoSSE2(input_reg, |
5647 temp_reg, | 5619 temp_reg, |
5648 ToX87Register(instr->result()), | 5620 ToX87Register(instr->result()), |
5649 instr->hydrogen()->allow_undefined_as_nan(), | 5621 instr->hydrogen()->can_convert_undefined_to_nan(), |
5650 deoptimize_on_minus_zero, | 5622 deoptimize_on_minus_zero, |
5651 instr->environment(), | 5623 instr->environment(), |
5652 mode); | 5624 mode); |
5653 } | 5625 } |
5654 } | 5626 } |
5655 | 5627 |
5656 | 5628 |
5657 void LCodeGen::DoDoubleToI(LDoubleToI* instr) { | 5629 void LCodeGen::DoDoubleToI(LDoubleToI* instr) { |
5658 LOperand* input = instr->value(); | 5630 LOperand* input = instr->value(); |
5659 ASSERT(input->IsDoubleRegister()); | 5631 ASSERT(input->IsDoubleRegister()); |
(...skipping 890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6550 FixedArray::kHeaderSize - kPointerSize)); | 6522 FixedArray::kHeaderSize - kPointerSize)); |
6551 __ bind(&done); | 6523 __ bind(&done); |
6552 } | 6524 } |
6553 | 6525 |
6554 | 6526 |
6555 #undef __ | 6527 #undef __ |
6556 | 6528 |
6557 } } // namespace v8::internal | 6529 } } // namespace v8::internal |
6558 | 6530 |
6559 #endif // V8_TARGET_ARCH_IA32 | 6531 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |