| 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 4233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4244 } | 4244 } |
| 4245 __ mtc1(src, dbl_scratch); | 4245 __ mtc1(src, dbl_scratch); |
| 4246 __ cvt_d_w(dbl_scratch, dbl_scratch); | 4246 __ cvt_d_w(dbl_scratch, dbl_scratch); |
| 4247 } else { | 4247 } else { |
| 4248 __ mtc1(src, dbl_scratch); | 4248 __ mtc1(src, dbl_scratch); |
| 4249 __ Cvt_d_uw(dbl_scratch, dbl_scratch, f22); | 4249 __ Cvt_d_uw(dbl_scratch, dbl_scratch, f22); |
| 4250 } | 4250 } |
| 4251 | 4251 |
| 4252 if (FLAG_inline_new) { | 4252 if (FLAG_inline_new) { |
| 4253 __ LoadRoot(t2, Heap::kHeapNumberMapRootIndex); | 4253 __ LoadRoot(t2, Heap::kHeapNumberMapRootIndex); |
| 4254 __ AllocateHeapNumber(t1, a3, t0, t2, &slow); | 4254 __ AllocateHeapNumber(t1, a3, t0, t2, &slow, DONT_TAG_RESULT); |
| 4255 __ Move(dst, t1); | 4255 __ Move(dst, t1); |
| 4256 __ Branch(&done); | 4256 __ Branch(&done); |
| 4257 } | 4257 } |
| 4258 | 4258 |
| 4259 // Slow case: Call the runtime system to do the number allocation. | 4259 // Slow case: Call the runtime system to do the number allocation. |
| 4260 __ bind(&slow); | 4260 __ bind(&slow); |
| 4261 | 4261 |
| 4262 // TODO(3095996): Put a valid pointer value in the stack slot where the result | 4262 // TODO(3095996): Put a valid pointer value in the stack slot where the result |
| 4263 // register is stored, as this register is in the pointer map, but contains an | 4263 // register is stored, as this register is in the pointer map, but contains an |
| 4264 // integer value. | 4264 // integer value. |
| 4265 __ StoreToSafepointRegisterSlot(zero_reg, dst); | 4265 __ StoreToSafepointRegisterSlot(zero_reg, dst); |
| 4266 CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr); | 4266 CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr); |
| 4267 __ Move(dst, v0); | 4267 __ Move(dst, v0); |
| 4268 __ Subu(dst, dst, kHeapObjectTag); |
| 4268 | 4269 |
| 4269 // Done. Put the value in dbl_scratch into the value of the allocated heap | 4270 // Done. Put the value in dbl_scratch into the value of the allocated heap |
| 4270 // number. | 4271 // number. |
| 4271 __ bind(&done); | 4272 __ bind(&done); |
| 4272 __ sdc1(dbl_scratch, FieldMemOperand(dst, HeapNumber::kValueOffset)); | 4273 __ sdc1(dbl_scratch, MemOperand(dst, HeapNumber::kValueOffset)); |
| 4274 __ Addu(dst, dst, kHeapObjectTag); |
| 4273 __ StoreToSafepointRegisterSlot(dst, dst); | 4275 __ StoreToSafepointRegisterSlot(dst, dst); |
| 4274 } | 4276 } |
| 4275 | 4277 |
| 4276 | 4278 |
| 4277 void LCodeGen::DoNumberTagD(LNumberTagD* instr) { | 4279 void LCodeGen::DoNumberTagD(LNumberTagD* instr) { |
| 4278 class DeferredNumberTagD: public LDeferredCode { | 4280 class DeferredNumberTagD: public LDeferredCode { |
| 4279 public: | 4281 public: |
| 4280 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr) | 4282 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr) |
| 4281 : LDeferredCode(codegen), instr_(instr) { } | 4283 : LDeferredCode(codegen), instr_(instr) { } |
| 4282 virtual void Generate() { codegen()->DoDeferredNumberTagD(instr_); } | 4284 virtual void Generate() { codegen()->DoDeferredNumberTagD(instr_); } |
| 4283 virtual LInstruction* instr() { return instr_; } | 4285 virtual LInstruction* instr() { return instr_; } |
| 4284 private: | 4286 private: |
| 4285 LNumberTagD* instr_; | 4287 LNumberTagD* instr_; |
| 4286 }; | 4288 }; |
| 4287 | 4289 |
| 4288 DoubleRegister input_reg = ToDoubleRegister(instr->value()); | 4290 DoubleRegister input_reg = ToDoubleRegister(instr->value()); |
| 4289 Register scratch = scratch0(); | 4291 Register scratch = scratch0(); |
| 4290 Register reg = ToRegister(instr->result()); | 4292 Register reg = ToRegister(instr->result()); |
| 4291 Register temp1 = ToRegister(instr->temp()); | 4293 Register temp1 = ToRegister(instr->temp()); |
| 4292 Register temp2 = ToRegister(instr->temp2()); | 4294 Register temp2 = ToRegister(instr->temp2()); |
| 4293 | 4295 |
| 4294 DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr); | 4296 DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr); |
| 4295 if (FLAG_inline_new) { | 4297 if (FLAG_inline_new) { |
| 4296 __ LoadRoot(scratch, Heap::kHeapNumberMapRootIndex); | 4298 __ LoadRoot(scratch, Heap::kHeapNumberMapRootIndex); |
| 4297 __ AllocateHeapNumber(reg, temp1, temp2, scratch, deferred->entry()); | 4299 // We want the untagged address first for performance |
| 4300 __ AllocateHeapNumber(reg, temp1, temp2, scratch, deferred->entry(), |
| 4301 DONT_TAG_RESULT); |
| 4298 } else { | 4302 } else { |
| 4299 __ Branch(deferred->entry()); | 4303 __ Branch(deferred->entry()); |
| 4300 } | 4304 } |
| 4301 __ bind(deferred->exit()); | 4305 __ bind(deferred->exit()); |
| 4302 __ sdc1(input_reg, FieldMemOperand(reg, HeapNumber::kValueOffset)); | 4306 __ sdc1(input_reg, MemOperand(reg, HeapNumber::kValueOffset)); |
| 4307 // Now that we have finished with the object's real address tag it |
| 4308 __ Addu(reg, reg, kHeapObjectTag); |
| 4303 } | 4309 } |
| 4304 | 4310 |
| 4305 | 4311 |
| 4306 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { | 4312 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { |
| 4307 // TODO(3095996): Get rid of this. For now, we need to make the | 4313 // TODO(3095996): Get rid of this. For now, we need to make the |
| 4308 // result register contain a valid pointer because it is already | 4314 // result register contain a valid pointer because it is already |
| 4309 // contained in the register pointer map. | 4315 // contained in the register pointer map. |
| 4310 Register reg = ToRegister(instr->result()); | 4316 Register reg = ToRegister(instr->result()); |
| 4311 __ mov(reg, zero_reg); | 4317 __ mov(reg, zero_reg); |
| 4312 | 4318 |
| 4313 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4319 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); |
| 4314 CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr); | 4320 CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr); |
| 4321 __ Subu(v0, v0, kHeapObjectTag); |
| 4315 __ StoreToSafepointRegisterSlot(v0, reg); | 4322 __ StoreToSafepointRegisterSlot(v0, reg); |
| 4316 } | 4323 } |
| 4317 | 4324 |
| 4318 | 4325 |
| 4319 void LCodeGen::DoSmiTag(LSmiTag* instr) { | 4326 void LCodeGen::DoSmiTag(LSmiTag* instr) { |
| 4320 ASSERT(!instr->hydrogen_value()->CheckFlag(HValue::kCanOverflow)); | 4327 ASSERT(!instr->hydrogen_value()->CheckFlag(HValue::kCanOverflow)); |
| 4321 __ SmiTag(ToRegister(instr->result()), ToRegister(instr->value())); | 4328 __ SmiTag(ToRegister(instr->result()), ToRegister(instr->value())); |
| 4322 } | 4329 } |
| 4323 | 4330 |
| 4324 | 4331 |
| (...skipping 1176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5501 __ Subu(scratch, result, scratch); | 5508 __ Subu(scratch, result, scratch); |
| 5502 __ lw(result, FieldMemOperand(scratch, | 5509 __ lw(result, FieldMemOperand(scratch, |
| 5503 FixedArray::kHeaderSize - kPointerSize)); | 5510 FixedArray::kHeaderSize - kPointerSize)); |
| 5504 __ bind(&done); | 5511 __ bind(&done); |
| 5505 } | 5512 } |
| 5506 | 5513 |
| 5507 | 5514 |
| 5508 #undef __ | 5515 #undef __ |
| 5509 | 5516 |
| 5510 } } // namespace v8::internal | 5517 } } // namespace v8::internal |
| OLD | NEW |