| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved.7 | 1 // Copyright 2012 the V8 project authors. All rights reserved.7 |
| 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 5306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5317 | 5317 |
| 5318 | 5318 |
| 5319 void LCodeGen::DoToFastProperties(LToFastProperties* instr) { | 5319 void LCodeGen::DoToFastProperties(LToFastProperties* instr) { |
| 5320 DCHECK(ToRegister(instr->value()).is(a0)); | 5320 DCHECK(ToRegister(instr->value()).is(a0)); |
| 5321 DCHECK(ToRegister(instr->result()).is(v0)); | 5321 DCHECK(ToRegister(instr->result()).is(v0)); |
| 5322 __ push(a0); | 5322 __ push(a0); |
| 5323 CallRuntime(Runtime::kToFastProperties, 1, instr); | 5323 CallRuntime(Runtime::kToFastProperties, 1, instr); |
| 5324 } | 5324 } |
| 5325 | 5325 |
| 5326 | 5326 |
| 5327 void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) { | |
| 5328 DCHECK(ToRegister(instr->context()).is(cp)); | |
| 5329 Label materialized; | |
| 5330 // Registers will be used as follows: | |
| 5331 // t3 = literals array. | |
| 5332 // a1 = regexp literal. | |
| 5333 // a0 = regexp literal clone. | |
| 5334 // a2 and t0-t2 are used as temporaries. | |
| 5335 int literal_offset = | |
| 5336 LiteralsArray::OffsetOfLiteralAt(instr->hydrogen()->literal_index()); | |
| 5337 __ li(t3, instr->hydrogen()->literals()); | |
| 5338 __ lw(a1, FieldMemOperand(t3, literal_offset)); | |
| 5339 __ LoadRoot(at, Heap::kUndefinedValueRootIndex); | |
| 5340 __ Branch(&materialized, ne, a1, Operand(at)); | |
| 5341 | |
| 5342 // Create regexp literal using runtime function | |
| 5343 // Result will be in v0. | |
| 5344 __ li(t2, Operand(Smi::FromInt(instr->hydrogen()->literal_index()))); | |
| 5345 __ li(t1, Operand(instr->hydrogen()->pattern())); | |
| 5346 __ li(t0, Operand(instr->hydrogen()->flags())); | |
| 5347 __ Push(t3, t2, t1, t0); | |
| 5348 CallRuntime(Runtime::kMaterializeRegExpLiteral, 4, instr); | |
| 5349 __ mov(a1, v0); | |
| 5350 | |
| 5351 __ bind(&materialized); | |
| 5352 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; | |
| 5353 Label allocated, runtime_allocate; | |
| 5354 | |
| 5355 __ Allocate(size, v0, a2, a3, &runtime_allocate, TAG_OBJECT); | |
| 5356 __ jmp(&allocated); | |
| 5357 | |
| 5358 __ bind(&runtime_allocate); | |
| 5359 __ li(a0, Operand(Smi::FromInt(size))); | |
| 5360 __ Push(a1, a0); | |
| 5361 CallRuntime(Runtime::kAllocateInNewSpace, 1, instr); | |
| 5362 __ pop(a1); | |
| 5363 | |
| 5364 __ bind(&allocated); | |
| 5365 // Copy the content into the newly allocated memory. | |
| 5366 // (Unroll copy loop once for better throughput). | |
| 5367 for (int i = 0; i < size - kPointerSize; i += 2 * kPointerSize) { | |
| 5368 __ lw(a3, FieldMemOperand(a1, i)); | |
| 5369 __ lw(a2, FieldMemOperand(a1, i + kPointerSize)); | |
| 5370 __ sw(a3, FieldMemOperand(v0, i)); | |
| 5371 __ sw(a2, FieldMemOperand(v0, i + kPointerSize)); | |
| 5372 } | |
| 5373 if ((size % (2 * kPointerSize)) != 0) { | |
| 5374 __ lw(a3, FieldMemOperand(a1, size - kPointerSize)); | |
| 5375 __ sw(a3, FieldMemOperand(v0, size - kPointerSize)); | |
| 5376 } | |
| 5377 } | |
| 5378 | |
| 5379 | |
| 5380 void LCodeGen::DoTypeof(LTypeof* instr) { | 5327 void LCodeGen::DoTypeof(LTypeof* instr) { |
| 5381 DCHECK(ToRegister(instr->value()).is(a3)); | 5328 DCHECK(ToRegister(instr->value()).is(a3)); |
| 5382 DCHECK(ToRegister(instr->result()).is(v0)); | 5329 DCHECK(ToRegister(instr->result()).is(v0)); |
| 5383 Label end, do_call; | 5330 Label end, do_call; |
| 5384 Register value_register = ToRegister(instr->value()); | 5331 Register value_register = ToRegister(instr->value()); |
| 5385 __ JumpIfNotSmi(value_register, &do_call); | 5332 __ JumpIfNotSmi(value_register, &do_call); |
| 5386 __ li(v0, Operand(isolate()->factory()->number_string())); | 5333 __ li(v0, Operand(isolate()->factory()->number_string())); |
| 5387 __ jmp(&end); | 5334 __ jmp(&end); |
| 5388 __ bind(&do_call); | 5335 __ bind(&do_call); |
| 5389 TypeofStub stub(isolate()); | 5336 TypeofStub stub(isolate()); |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5819 __ Push(at, ToRegister(instr->function())); | 5766 __ Push(at, ToRegister(instr->function())); |
| 5820 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5767 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
| 5821 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5768 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 5822 } | 5769 } |
| 5823 | 5770 |
| 5824 | 5771 |
| 5825 #undef __ | 5772 #undef __ |
| 5826 | 5773 |
| 5827 } // namespace internal | 5774 } // namespace internal |
| 5828 } // namespace v8 | 5775 } // namespace v8 |
| OLD | NEW |