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

Side by Side Diff: src/s390/macro-assembler-s390.cc

Issue 2466573002: [stubs] Fix allocation memento detection. (Closed)
Patch Set: Created 4 years, 1 month 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
« no previous file with comments | « src/ppc/macro-assembler-ppc.cc ('k') | src/x64/macro-assembler-x64.cc » ('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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <assert.h> // For assert 5 #include <assert.h> // For assert
6 #include <limits.h> // For LONG_MIN, LONG_MAX. 6 #include <limits.h> // For LONG_MIN, LONG_MAX.
7 7
8 #if V8_TARGET_ARCH_S390 8 #if V8_TARGET_ARCH_S390
9 9
10 #include "src/base/bits.h" 10 #include "src/base/bits.h"
(...skipping 3336 matching lines...) Expand 10 before | Expand all | Expand 10 after
3347 3347
3348 void MacroAssembler::TestJSArrayForAllocationMemento(Register receiver_reg, 3348 void MacroAssembler::TestJSArrayForAllocationMemento(Register receiver_reg,
3349 Register scratch_reg, 3349 Register scratch_reg,
3350 Register scratch2_reg, 3350 Register scratch2_reg,
3351 Label* no_memento_found) { 3351 Label* no_memento_found) {
3352 Label map_check; 3352 Label map_check;
3353 Label top_check; 3353 Label top_check;
3354 ExternalReference new_space_allocation_top_adr = 3354 ExternalReference new_space_allocation_top_adr =
3355 ExternalReference::new_space_allocation_top_address(isolate()); 3355 ExternalReference::new_space_allocation_top_address(isolate());
3356 const int kMementoMapOffset = JSArray::kSize - kHeapObjectTag; 3356 const int kMementoMapOffset = JSArray::kSize - kHeapObjectTag;
3357 const int kMementoEndOffset = kMementoMapOffset + AllocationMemento::kSize; 3357 const int kMementoLastWordOffset =
3358 kMementoMapOffset + AllocationMemento::kSize - kPointerSize;
3358 3359
3359 DCHECK(!AreAliased(receiver_reg, scratch_reg)); 3360 DCHECK(!AreAliased(receiver_reg, scratch_reg));
3360 3361
3361 // Bail out if the object is not in new space. 3362 // Bail out if the object is not in new space.
3362 JumpIfNotInNewSpace(receiver_reg, scratch_reg, no_memento_found); 3363 JumpIfNotInNewSpace(receiver_reg, scratch_reg, no_memento_found);
3363 3364
3364 DCHECK((~Page::kPageAlignmentMask & 0xffff) == 0); 3365 DCHECK((~Page::kPageAlignmentMask & 0xffff) == 0);
3365 3366
3366 // If the object is in new space, we need to check whether it is on the same 3367 // If the object is in new space, we need to check whether it is on the same
3367 // page as the current top. 3368 // page as the current top.
3368 AddP(scratch_reg, receiver_reg, Operand(kMementoEndOffset)); 3369 AddP(scratch_reg, receiver_reg, Operand(kMementoLastWordOffset));
3369 mov(ip, Operand(new_space_allocation_top_adr)); 3370 mov(ip, Operand(new_space_allocation_top_adr));
3370 LoadP(ip, MemOperand(ip)); 3371 LoadP(ip, MemOperand(ip));
3371 XorP(r0, scratch_reg, ip); 3372 XorP(r0, scratch_reg, ip);
3372 AndP(r0, r0, Operand(~Page::kPageAlignmentMask)); 3373 AndP(r0, r0, Operand(~Page::kPageAlignmentMask));
3373 beq(&top_check, Label::kNear); 3374 beq(&top_check, Label::kNear);
3374 // The object is on a different page than allocation top. Bail out if the 3375 // The object is on a different page than allocation top. Bail out if the
3375 // object sits on the page boundary as no memento can follow and we cannot 3376 // object sits on the page boundary as no memento can follow and we cannot
3376 // touch the memory following it. 3377 // touch the memory following it.
3377 XorP(r0, scratch_reg, receiver_reg); 3378 XorP(r0, scratch_reg, receiver_reg);
3378 AndP(r0, r0, Operand(~Page::kPageAlignmentMask)); 3379 AndP(r0, r0, Operand(~Page::kPageAlignmentMask));
3379 bne(no_memento_found); 3380 bne(no_memento_found);
3380 // Continue with the actual map check. 3381 // Continue with the actual map check.
3381 b(&map_check, Label::kNear); 3382 b(&map_check, Label::kNear);
3382 // If top is on the same page as the current object, we need to check whether 3383 // If top is on the same page as the current object, we need to check whether
3383 // we are below top. 3384 // we are below top.
3384 bind(&top_check); 3385 bind(&top_check);
3385 CmpP(scratch_reg, ip); 3386 CmpP(scratch_reg, ip);
3386 bgt(no_memento_found); 3387 bge(no_memento_found);
3387 // Memento map check. 3388 // Memento map check.
3388 bind(&map_check); 3389 bind(&map_check);
3389 LoadP(scratch_reg, MemOperand(receiver_reg, kMementoMapOffset)); 3390 LoadP(scratch_reg, MemOperand(receiver_reg, kMementoMapOffset));
3390 CmpP(scratch_reg, Operand(isolate()->factory()->allocation_memento_map())); 3391 CmpP(scratch_reg, Operand(isolate()->factory()->allocation_memento_map()));
3391 } 3392 }
3392 3393
3393 Register GetRegisterThatIsNotOneOf(Register reg1, Register reg2, Register reg3, 3394 Register GetRegisterThatIsNotOneOf(Register reg1, Register reg2, Register reg3,
3394 Register reg4, Register reg5, 3395 Register reg4, Register reg5,
3395 Register reg6) { 3396 Register reg6) {
3396 RegList regs = 0; 3397 RegList regs = 0;
(...skipping 1909 matching lines...) Expand 10 before | Expand all | Expand 10 after
5306 } 5307 }
5307 if (mag.shift > 0) ShiftRightArith(result, result, Operand(mag.shift)); 5308 if (mag.shift > 0) ShiftRightArith(result, result, Operand(mag.shift));
5308 ExtractBit(r0, dividend, 31); 5309 ExtractBit(r0, dividend, 31);
5309 AddP(result, r0); 5310 AddP(result, r0);
5310 } 5311 }
5311 5312
5312 } // namespace internal 5313 } // namespace internal
5313 } // namespace v8 5314 } // namespace v8
5314 5315
5315 #endif // V8_TARGET_ARCH_S390 5316 #endif // V8_TARGET_ARCH_S390
OLDNEW
« no previous file with comments | « src/ppc/macro-assembler-ppc.cc ('k') | src/x64/macro-assembler-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698