Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/arm/lithium-codegen-arm.cc

Issue 12221064: Implement many KeyedStoreStubs using Crankshaft (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add runtime flag and address review feedback Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 if (var->IsContextSlot()) { 232 if (var->IsContextSlot()) {
233 int parameter_offset = StandardFrameConstants::kCallerSPOffset + 233 int parameter_offset = StandardFrameConstants::kCallerSPOffset +
234 (num_parameters - 1 - i) * kPointerSize; 234 (num_parameters - 1 - i) * kPointerSize;
235 // Load parameter from stack. 235 // Load parameter from stack.
236 __ ldr(r0, MemOperand(fp, parameter_offset)); 236 __ ldr(r0, MemOperand(fp, parameter_offset));
237 // Store it in the context. 237 // Store it in the context.
238 MemOperand target = ContextOperand(cp, var->index()); 238 MemOperand target = ContextOperand(cp, var->index());
239 __ str(r0, target); 239 __ str(r0, target);
240 // Update the write barrier. This clobbers r3 and r0. 240 // Update the write barrier. This clobbers r3 and r0.
241 __ RecordWriteContextSlot( 241 __ RecordWriteContextSlot(
242 cp, target.offset(), r0, r3, kLRHasBeenSaved, kSaveFPRegs); 242 cp, target.offset(), r0, r3, GetLinkRegisterState(), kSaveFPRegs);
243 } 243 }
244 } 244 }
245 Comment(";;; End allocate local context"); 245 Comment(";;; End allocate local context");
246 } 246 }
247 247
248 // Trace the call. 248 // Trace the call.
249 if (FLAG_trace && info()->IsOptimizing()) { 249 if (FLAG_trace && info()->IsOptimizing()) {
250 __ CallRuntime(Runtime::kTraceEnter, 0); 250 __ CallRuntime(Runtime::kTraceEnter, 0);
251 } 251 }
252 return !is_aborted(); 252 return !is_aborted();
(...skipping 2814 matching lines...) Expand 10 before | Expand all | Expand 10 after
3067 3067
3068 __ str(value, target); 3068 __ str(value, target);
3069 if (instr->hydrogen()->NeedsWriteBarrier()) { 3069 if (instr->hydrogen()->NeedsWriteBarrier()) {
3070 HType type = instr->hydrogen()->value()->type(); 3070 HType type = instr->hydrogen()->value()->type();
3071 SmiCheck check_needed = 3071 SmiCheck check_needed =
3072 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; 3072 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
3073 __ RecordWriteContextSlot(context, 3073 __ RecordWriteContextSlot(context,
3074 target.offset(), 3074 target.offset(),
3075 value, 3075 value,
3076 scratch, 3076 scratch,
3077 kLRHasBeenSaved, 3077 GetLinkRegisterState(),
3078 kSaveFPRegs, 3078 kSaveFPRegs,
3079 EMIT_REMEMBERED_SET, 3079 EMIT_REMEMBERED_SET,
3080 check_needed); 3080 check_needed);
3081 } 3081 }
3082 3082
3083 __ bind(&skip_assignment); 3083 __ bind(&skip_assignment);
3084 } 3084 }
3085 3085
3086 3086
3087 void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) { 3087 void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
(...skipping 1271 matching lines...) Expand 10 before | Expand all | Expand 10 after
4359 if (!instr->transition().is_null()) { 4359 if (!instr->transition().is_null()) {
4360 __ mov(scratch, Operand(instr->transition())); 4360 __ mov(scratch, Operand(instr->transition()));
4361 __ str(scratch, FieldMemOperand(object, HeapObject::kMapOffset)); 4361 __ str(scratch, FieldMemOperand(object, HeapObject::kMapOffset));
4362 if (instr->hydrogen()->NeedsWriteBarrierForMap()) { 4362 if (instr->hydrogen()->NeedsWriteBarrierForMap()) {
4363 Register temp = ToRegister(instr->temp()); 4363 Register temp = ToRegister(instr->temp());
4364 // Update the write barrier for the map field. 4364 // Update the write barrier for the map field.
4365 __ RecordWriteField(object, 4365 __ RecordWriteField(object,
4366 HeapObject::kMapOffset, 4366 HeapObject::kMapOffset,
4367 scratch, 4367 scratch,
4368 temp, 4368 temp,
4369 kLRHasBeenSaved, 4369 GetLinkRegisterState(),
4370 kSaveFPRegs, 4370 kSaveFPRegs,
4371 OMIT_REMEMBERED_SET, 4371 OMIT_REMEMBERED_SET,
4372 OMIT_SMI_CHECK); 4372 OMIT_SMI_CHECK);
4373 } 4373 }
4374 } 4374 }
4375 4375
4376 // Do the store. 4376 // Do the store.
4377 HType type = instr->hydrogen()->value()->type(); 4377 HType type = instr->hydrogen()->value()->type();
4378 SmiCheck check_needed = 4378 SmiCheck check_needed =
4379 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; 4379 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
4380 if (instr->is_in_object()) { 4380 if (instr->is_in_object()) {
4381 __ str(value, FieldMemOperand(object, offset)); 4381 __ str(value, FieldMemOperand(object, offset));
4382 if (instr->hydrogen()->NeedsWriteBarrier()) { 4382 if (instr->hydrogen()->NeedsWriteBarrier()) {
4383 // Update the write barrier for the object for in-object properties. 4383 // Update the write barrier for the object for in-object properties.
4384 __ RecordWriteField(object, 4384 __ RecordWriteField(object,
4385 offset, 4385 offset,
4386 value, 4386 value,
4387 scratch, 4387 scratch,
4388 kLRHasBeenSaved, 4388 GetLinkRegisterState(),
4389 kSaveFPRegs, 4389 kSaveFPRegs,
4390 EMIT_REMEMBERED_SET, 4390 EMIT_REMEMBERED_SET,
4391 check_needed); 4391 check_needed);
4392 } 4392 }
4393 } else { 4393 } else {
4394 __ ldr(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset)); 4394 __ ldr(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset));
4395 __ str(value, FieldMemOperand(scratch, offset)); 4395 __ str(value, FieldMemOperand(scratch, offset));
4396 if (instr->hydrogen()->NeedsWriteBarrier()) { 4396 if (instr->hydrogen()->NeedsWriteBarrier()) {
4397 // Update the write barrier for the properties array. 4397 // Update the write barrier for the properties array.
4398 // object is used as a scratch register. 4398 // object is used as a scratch register.
4399 __ RecordWriteField(scratch, 4399 __ RecordWriteField(scratch,
4400 offset, 4400 offset,
4401 value, 4401 value,
4402 object, 4402 object,
4403 kLRHasBeenSaved, 4403 GetLinkRegisterState(),
4404 kSaveFPRegs, 4404 kSaveFPRegs,
4405 EMIT_REMEMBERED_SET, 4405 EMIT_REMEMBERED_SET,
4406 check_needed); 4406 check_needed);
4407 } 4407 }
4408 } 4408 }
4409 } 4409 }
4410 4410
4411 4411
4412 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { 4412 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) {
4413 ASSERT(ToRegister(instr->object()).is(r1)); 4413 ASSERT(ToRegister(instr->object()).is(r1));
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
4594 4594
4595 if (instr->hydrogen()->NeedsWriteBarrier()) { 4595 if (instr->hydrogen()->NeedsWriteBarrier()) {
4596 HType type = instr->hydrogen()->value()->type(); 4596 HType type = instr->hydrogen()->value()->type();
4597 SmiCheck check_needed = 4597 SmiCheck check_needed =
4598 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; 4598 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
4599 // Compute address of modified element and store it into key register. 4599 // Compute address of modified element and store it into key register.
4600 __ add(key, store_base, Operand(offset - kHeapObjectTag)); 4600 __ add(key, store_base, Operand(offset - kHeapObjectTag));
4601 __ RecordWrite(elements, 4601 __ RecordWrite(elements,
4602 key, 4602 key,
4603 value, 4603 value,
4604 kLRHasBeenSaved, 4604 GetLinkRegisterState(),
4605 kSaveFPRegs, 4605 kSaveFPRegs,
4606 EMIT_REMEMBERED_SET, 4606 EMIT_REMEMBERED_SET,
4607 check_needed); 4607 check_needed);
4608 } 4608 }
4609 } 4609 }
4610 4610
4611 4611
4612 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { 4612 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) {
4613 // By cases: external, fast double 4613 // By cases: external, fast double
4614 if (instr->is_external()) { 4614 if (instr->is_external()) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
4646 __ ldr(scratch, FieldMemOperand(object_reg, HeapObject::kMapOffset)); 4646 __ ldr(scratch, FieldMemOperand(object_reg, HeapObject::kMapOffset));
4647 __ cmp(scratch, Operand(from_map)); 4647 __ cmp(scratch, Operand(from_map));
4648 __ b(ne, &not_applicable); 4648 __ b(ne, &not_applicable);
4649 4649
4650 if (IsSimpleMapChangeTransition(from_kind, to_kind)) { 4650 if (IsSimpleMapChangeTransition(from_kind, to_kind)) {
4651 Register new_map_reg = ToRegister(instr->new_map_temp()); 4651 Register new_map_reg = ToRegister(instr->new_map_temp());
4652 __ mov(new_map_reg, Operand(to_map)); 4652 __ mov(new_map_reg, Operand(to_map));
4653 __ str(new_map_reg, FieldMemOperand(object_reg, HeapObject::kMapOffset)); 4653 __ str(new_map_reg, FieldMemOperand(object_reg, HeapObject::kMapOffset));
4654 // Write barrier. 4654 // Write barrier.
4655 __ RecordWriteField(object_reg, HeapObject::kMapOffset, new_map_reg, 4655 __ RecordWriteField(object_reg, HeapObject::kMapOffset, new_map_reg,
4656 scratch, kLRHasBeenSaved, kDontSaveFPRegs); 4656 scratch, GetLinkRegisterState(), kDontSaveFPRegs);
4657 } else if (FLAG_compiled_transitions) { 4657 } else if (FLAG_compiled_transitions) {
4658 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 4658 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
4659 __ Move(r0, object_reg); 4659 __ Move(r0, object_reg);
4660 __ Move(r1, to_map); 4660 __ Move(r1, to_map);
4661 TransitionElementsKindStub stub(from_kind, to_kind); 4661 TransitionElementsKindStub stub(from_kind, to_kind);
4662 __ CallStub(&stub); 4662 __ CallStub(&stub);
4663 RecordSafepointWithRegisters( 4663 RecordSafepointWithRegisters(
4664 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); 4664 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
4665 } else if (IsFastSmiElementsKind(from_kind) && 4665 } else if (IsFastSmiElementsKind(from_kind) &&
4666 IsFastDoubleElementsKind(to_kind)) { 4666 IsFastDoubleElementsKind(to_kind)) {
(...skipping 1731 matching lines...) Expand 10 before | Expand all | Expand 10 after
6398 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); 6398 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize));
6399 __ ldr(result, FieldMemOperand(scratch, 6399 __ ldr(result, FieldMemOperand(scratch,
6400 FixedArray::kHeaderSize - kPointerSize)); 6400 FixedArray::kHeaderSize - kPointerSize));
6401 __ bind(&done); 6401 __ bind(&done);
6402 } 6402 }
6403 6403
6404 6404
6405 #undef __ 6405 #undef __
6406 6406
6407 } } // namespace v8::internal 6407 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698