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

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

Issue 14246032: RecordWriteStubs on ARM need to save FP registers (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review from Ulan Created 7 years, 8 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
« no previous file with comments | « src/arm/code-stubs-arm.cc ('k') | src/arm/macro-assembler-arm.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 18 matching lines...) Expand all
29 29
30 #include "arm/lithium-codegen-arm.h" 30 #include "arm/lithium-codegen-arm.h"
31 #include "arm/lithium-gap-resolver-arm.h" 31 #include "arm/lithium-gap-resolver-arm.h"
32 #include "code-stubs.h" 32 #include "code-stubs.h"
33 #include "stub-cache.h" 33 #include "stub-cache.h"
34 34
35 namespace v8 { 35 namespace v8 {
36 namespace internal { 36 namespace internal {
37 37
38 38
39 static SaveFPRegsMode GetSaveFPRegsMode() {
40 // We don't need to save floating point regs when generating the snapshot
41 return CpuFeatures::IsSafeForSnapshot(VFP32DREGS)
42 ? kSaveFPRegs
43 : kDontSaveFPRegs;
44 }
45
46
47 class SafepointGenerator : public CallWrapper { 39 class SafepointGenerator : public CallWrapper {
48 public: 40 public:
49 SafepointGenerator(LCodeGen* codegen, 41 SafepointGenerator(LCodeGen* codegen,
50 LPointerMap* pointers, 42 LPointerMap* pointers,
51 Safepoint::DeoptMode mode) 43 Safepoint::DeoptMode mode)
52 : codegen_(codegen), 44 : codegen_(codegen),
53 pointers_(pointers), 45 pointers_(pointers),
54 deopt_mode_(mode) { } 46 deopt_mode_(mode) { }
55 virtual ~SafepointGenerator() { } 47 virtual ~SafepointGenerator() { }
56 48
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 // Store it in the context. 236 // Store it in the context.
245 MemOperand target = ContextOperand(cp, var->index()); 237 MemOperand target = ContextOperand(cp, var->index());
246 __ str(r0, target); 238 __ str(r0, target);
247 // Update the write barrier. This clobbers r3 and r0. 239 // Update the write barrier. This clobbers r3 and r0.
248 __ RecordWriteContextSlot( 240 __ RecordWriteContextSlot(
249 cp, 241 cp,
250 target.offset(), 242 target.offset(),
251 r0, 243 r0,
252 r3, 244 r3,
253 GetLinkRegisterState(), 245 GetLinkRegisterState(),
254 GetSaveFPRegsMode()); 246 kSaveFPRegs);
255 } 247 }
256 } 248 }
257 Comment(";;; End allocate local context"); 249 Comment(";;; End allocate local context");
258 } 250 }
259 251
260 // Trace the call. 252 // Trace the call.
261 if (FLAG_trace && info()->IsOptimizing()) { 253 if (FLAG_trace && info()->IsOptimizing()) {
262 __ CallRuntime(Runtime::kTraceEnter, 0); 254 __ CallRuntime(Runtime::kTraceEnter, 0);
263 } 255 }
264 return !is_aborted(); 256 return !is_aborted();
(...skipping 2808 matching lines...) Expand 10 before | Expand all | Expand 10 after
3073 __ str(value, target); 3065 __ str(value, target);
3074 if (instr->hydrogen()->NeedsWriteBarrier()) { 3066 if (instr->hydrogen()->NeedsWriteBarrier()) {
3075 HType type = instr->hydrogen()->value()->type(); 3067 HType type = instr->hydrogen()->value()->type();
3076 SmiCheck check_needed = 3068 SmiCheck check_needed =
3077 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; 3069 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
3078 __ RecordWriteContextSlot(context, 3070 __ RecordWriteContextSlot(context,
3079 target.offset(), 3071 target.offset(),
3080 value, 3072 value,
3081 scratch, 3073 scratch,
3082 GetLinkRegisterState(), 3074 GetLinkRegisterState(),
3083 GetSaveFPRegsMode(), 3075 kSaveFPRegs,
3084 EMIT_REMEMBERED_SET, 3076 EMIT_REMEMBERED_SET,
3085 check_needed); 3077 check_needed);
3086 } 3078 }
3087 3079
3088 __ bind(&skip_assignment); 3080 __ bind(&skip_assignment);
3089 } 3081 }
3090 3082
3091 3083
3092 void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) { 3084 void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
3093 Register object = ToRegister(instr->object()); 3085 Register object = ToRegister(instr->object());
(...skipping 1168 matching lines...) Expand 10 before | Expand all | Expand 10 after
4262 __ mov(scratch, Operand(instr->transition())); 4254 __ mov(scratch, Operand(instr->transition()));
4263 __ str(scratch, FieldMemOperand(object, HeapObject::kMapOffset)); 4255 __ str(scratch, FieldMemOperand(object, HeapObject::kMapOffset));
4264 if (instr->hydrogen()->NeedsWriteBarrierForMap()) { 4256 if (instr->hydrogen()->NeedsWriteBarrierForMap()) {
4265 Register temp = ToRegister(instr->temp()); 4257 Register temp = ToRegister(instr->temp());
4266 // Update the write barrier for the map field. 4258 // Update the write barrier for the map field.
4267 __ RecordWriteField(object, 4259 __ RecordWriteField(object,
4268 HeapObject::kMapOffset, 4260 HeapObject::kMapOffset,
4269 scratch, 4261 scratch,
4270 temp, 4262 temp,
4271 GetLinkRegisterState(), 4263 GetLinkRegisterState(),
4272 GetSaveFPRegsMode(), 4264 kSaveFPRegs,
4273 OMIT_REMEMBERED_SET, 4265 OMIT_REMEMBERED_SET,
4274 OMIT_SMI_CHECK); 4266 OMIT_SMI_CHECK);
4275 } 4267 }
4276 } 4268 }
4277 4269
4278 // Do the store. 4270 // Do the store.
4279 HType type = instr->hydrogen()->value()->type(); 4271 HType type = instr->hydrogen()->value()->type();
4280 SmiCheck check_needed = 4272 SmiCheck check_needed =
4281 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; 4273 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
4282 if (instr->is_in_object()) { 4274 if (instr->is_in_object()) {
4283 __ str(value, FieldMemOperand(object, offset)); 4275 __ str(value, FieldMemOperand(object, offset));
4284 if (instr->hydrogen()->NeedsWriteBarrier()) { 4276 if (instr->hydrogen()->NeedsWriteBarrier()) {
4285 // Update the write barrier for the object for in-object properties. 4277 // Update the write barrier for the object for in-object properties.
4286 __ RecordWriteField(object, 4278 __ RecordWriteField(object,
4287 offset, 4279 offset,
4288 value, 4280 value,
4289 scratch, 4281 scratch,
4290 GetLinkRegisterState(), 4282 GetLinkRegisterState(),
4291 GetSaveFPRegsMode(), 4283 kSaveFPRegs,
4292 EMIT_REMEMBERED_SET, 4284 EMIT_REMEMBERED_SET,
4293 check_needed); 4285 check_needed);
4294 } 4286 }
4295 } else { 4287 } else {
4296 __ ldr(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset)); 4288 __ ldr(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset));
4297 __ str(value, FieldMemOperand(scratch, offset)); 4289 __ str(value, FieldMemOperand(scratch, offset));
4298 if (instr->hydrogen()->NeedsWriteBarrier()) { 4290 if (instr->hydrogen()->NeedsWriteBarrier()) {
4299 // Update the write barrier for the properties array. 4291 // Update the write barrier for the properties array.
4300 // object is used as a scratch register. 4292 // object is used as a scratch register.
4301 __ RecordWriteField(scratch, 4293 __ RecordWriteField(scratch,
4302 offset, 4294 offset,
4303 value, 4295 value,
4304 object, 4296 object,
4305 GetLinkRegisterState(), 4297 GetLinkRegisterState(),
4306 GetSaveFPRegsMode(), 4298 kSaveFPRegs,
4307 EMIT_REMEMBERED_SET, 4299 EMIT_REMEMBERED_SET,
4308 check_needed); 4300 check_needed);
4309 } 4301 }
4310 } 4302 }
4311 } 4303 }
4312 4304
4313 4305
4314 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { 4306 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) {
4315 ASSERT(ToRegister(instr->object()).is(r1)); 4307 ASSERT(ToRegister(instr->object()).is(r1));
4316 ASSERT(ToRegister(instr->value()).is(r0)); 4308 ASSERT(ToRegister(instr->value()).is(r0));
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
4490 if (instr->hydrogen()->NeedsWriteBarrier()) { 4482 if (instr->hydrogen()->NeedsWriteBarrier()) {
4491 HType type = instr->hydrogen()->value()->type(); 4483 HType type = instr->hydrogen()->value()->type();
4492 SmiCheck check_needed = 4484 SmiCheck check_needed =
4493 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; 4485 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
4494 // Compute address of modified element and store it into key register. 4486 // Compute address of modified element and store it into key register.
4495 __ add(key, store_base, Operand(offset - kHeapObjectTag)); 4487 __ add(key, store_base, Operand(offset - kHeapObjectTag));
4496 __ RecordWrite(elements, 4488 __ RecordWrite(elements,
4497 key, 4489 key,
4498 value, 4490 value,
4499 GetLinkRegisterState(), 4491 GetLinkRegisterState(),
4500 GetSaveFPRegsMode(), 4492 kSaveFPRegs,
4501 EMIT_REMEMBERED_SET, 4493 EMIT_REMEMBERED_SET,
4502 check_needed); 4494 check_needed);
4503 } 4495 }
4504 } 4496 }
4505 4497
4506 4498
4507 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { 4499 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) {
4508 // By cases: external, fast double 4500 // By cases: external, fast double
4509 if (instr->is_external()) { 4501 if (instr->is_external()) {
4510 DoStoreKeyedExternalArray(instr); 4502 DoStoreKeyedExternalArray(instr);
(...skipping 1497 matching lines...) Expand 10 before | Expand all | Expand 10 after
6008 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); 6000 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize));
6009 __ ldr(result, FieldMemOperand(scratch, 6001 __ ldr(result, FieldMemOperand(scratch,
6010 FixedArray::kHeaderSize - kPointerSize)); 6002 FixedArray::kHeaderSize - kPointerSize));
6011 __ bind(&done); 6003 __ bind(&done);
6012 } 6004 }
6013 6005
6014 6006
6015 #undef __ 6007 #undef __
6016 6008
6017 } } // namespace v8::internal 6009 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm/code-stubs-arm.cc ('k') | src/arm/macro-assembler-arm.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698