| 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 |