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

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

Issue 7247002: Estimate a (close) upper bound on the size of black-marked objects on each page. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/gc
Patch Set: Address review comments. Make compile on x64. Created 9 years, 6 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/ia32/macro-assembler-ia32.h ('k') | src/ia32/stub-cache-ia32.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 2313 matching lines...) Expand 10 before | Expand all | Expand 10 after
2324 jmp(&other_color, Label::kNear); 2324 jmp(&other_color, Label::kNear);
2325 2325
2326 bind(&word_boundary); 2326 bind(&word_boundary);
2327 test_b(Operand(bitmap_scratch, MemoryChunk::kHeaderSize + kPointerSize), 1); 2327 test_b(Operand(bitmap_scratch, MemoryChunk::kHeaderSize + kPointerSize), 1);
2328 2328
2329 j(second_bit == 1 ? not_zero : zero, has_color, has_color_distance); 2329 j(second_bit == 1 ? not_zero : zero, has_color, has_color_distance);
2330 bind(&other_color); 2330 bind(&other_color);
2331 } 2331 }
2332 2332
2333 2333
2334 // Detect some, but not all, common pointer-free objects. This is used by the
2335 // incremental write barrier which doesn't care about oddballs (they are always
2336 // marked black immediately so this code is not hit).
2337 void MacroAssembler::JumpIfDataObject(
2338 Register value,
2339 Register scratch,
2340 Label* not_data_object,
2341 Label::Distance not_data_object_distance) {
2342 Label is_data_object;
2343 mov(scratch, FieldOperand(value, HeapObject::kMapOffset));
2344 cmp(scratch, FACTORY->heap_number_map());
2345 j(equal, &is_data_object, Label::kNear);
2346 ASSERT(kConsStringTag == 1 && kIsConsStringMask == 1);
2347 ASSERT(kNotStringTag == 0x80 && kIsNotStringMask == 0x80);
2348 // If it's a string and it's not a cons string then it's an object containing
2349 // no GC pointers.
2350 test_b(FieldOperand(scratch, Map::kInstanceTypeOffset),
2351 kIsConsStringMask | kIsNotStringMask);
2352 j(not_zero, not_data_object, not_data_object_distance);
2353 bind(&is_data_object);
2354 }
2355
2356
2357 void MacroAssembler::GetMarkBits(Register addr_reg, 2334 void MacroAssembler::GetMarkBits(Register addr_reg,
2358 Register bitmap_reg, 2335 Register bitmap_reg,
2359 Register mask_reg) { 2336 Register mask_reg) {
2360 ASSERT(!AreAliased(addr_reg, bitmap_reg, mask_reg, ecx)); 2337 ASSERT(!AreAliased(addr_reg, mask_reg, bitmap_reg, ecx));
2361 mov(bitmap_reg, Operand(addr_reg)); 2338 mov(bitmap_reg, Immediate(~Page::kPageAlignmentMask));
2362 and_(bitmap_reg, ~Page::kPageAlignmentMask); 2339 and_(Operand(bitmap_reg), addr_reg);
2363 mov(ecx, Operand(addr_reg)); 2340 mov(ecx, Operand(addr_reg));
2364 int shift = 2341 int shift =
2365 Bitmap::kBitsPerCellLog2 + kPointerSizeLog2 - Bitmap::kBytesPerCellLog2; 2342 Bitmap::kBitsPerCellLog2 + kPointerSizeLog2 - Bitmap::kBytesPerCellLog2;
2366 shr(ecx, shift); 2343 shr(ecx, shift);
2367 and_(ecx, 2344 and_(ecx,
2368 (Page::kPageAlignmentMask >> shift) & ~(Bitmap::kBytesPerCell - 1)); 2345 (Page::kPageAlignmentMask >> shift) & ~(Bitmap::kBytesPerCell - 1));
2369 2346
2370 add(bitmap_reg, Operand(ecx)); 2347 add(bitmap_reg, Operand(ecx));
2371 mov(ecx, Operand(addr_reg)); 2348 mov(ecx, Operand(addr_reg));
2372 shr(ecx, kPointerSizeLog2); 2349 shr(ecx, kPointerSizeLog2);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2405 // shl. May overflow making the check conservative. 2382 // shl. May overflow making the check conservative.
2406 add(mask_scratch, Operand(mask_scratch)); 2383 add(mask_scratch, Operand(mask_scratch));
2407 test(mask_scratch, Operand(bitmap_scratch, MemoryChunk::kHeaderSize)); 2384 test(mask_scratch, Operand(bitmap_scratch, MemoryChunk::kHeaderSize));
2408 j(zero, &ok, Label::kNear); 2385 j(zero, &ok, Label::kNear);
2409 int3(); 2386 int3();
2410 bind(&ok); 2387 bind(&ok);
2411 pop(mask_scratch); 2388 pop(mask_scratch);
2412 } 2389 }
2413 2390
2414 // Value is white. We check whether it is data that doesn't need scanning. 2391 // Value is white. We check whether it is data that doesn't need scanning.
2415 JumpIfDataObject(value, ecx, value_is_white_and_not_data, distance); 2392 // Currently only checks for HeapNumber and non-cons strings.
2393 Register map = ecx; // Holds map while checking type.
2394 Register length = ecx; // Holds length of object after checking type.
2395 Label not_heap_number;
2396 Label is_data_object;
2416 2397
2398 // Check for heap-number
2399 mov(map, FieldOperand(value, HeapObject::kMapOffset));
2400 cmp(map, FACTORY->heap_number_map());
2401 j(not_equal, &not_heap_number, Label::kNear);
2402 mov(length, Immediate(HeapNumber::kSize));
2403 jmp(&is_data_object, Label::kNear);
2404
2405 bind(&not_heap_number);
2406 // Check for strings.
2407 ASSERT(kConsStringTag == 1 && kIsConsStringMask == 1);
2408 ASSERT(kNotStringTag == 0x80 && kIsNotStringMask == 0x80);
2409 // If it's a string and it's not a cons string then it's an object containing
2410 // no GC pointers.
2411 Register instance_type = ecx;
2412 movzx_b(instance_type, FieldOperand(map, Map::kInstanceTypeOffset));
2413 test_b(Operand(instance_type), kIsConsStringMask | kIsNotStringMask);
2414 j(not_zero, value_is_white_and_not_data);
2415 // It's a non-cons string.
2416 // If it's external, the length is just ExternalString::kSize.
2417 // Otherwise it's String::kHeaderSize + string->length() * (1 or 2).
2418 Label not_external;
2419 // External strings are the only ones with the kExternalStringTag bit
2420 // set.
2421 ASSERT_EQ(0, kSeqStringTag & kExternalStringTag);
2422 ASSERT_EQ(0, kConsStringTag & kExternalStringTag);
2423 test_b(Operand(instance_type), kExternalStringTag);
2424 j(zero, &not_external, Label::kNear);
2425 mov(length, Immediate(ExternalString::kSize));
2426 jmp(&is_data_object, Label::kNear);
2427
2428 bind(&not_external);
2429 // Sequential string, either ASCII or UC16.
2430 ASSERT(kAsciiStringTag == 0x04);
2431 and_(Operand(length), Immediate(kStringEncodingMask));
2432 xor_(Operand(length), Immediate(kStringEncodingMask));
2433 add(Operand(length), Immediate(0x04));
2434 // Value now either 4 (if ASCII) or 8 (if UC16), i.e., char-size shifted
2435 // by 2. If we multiply the string length as smi by this, it still
2436 // won't overflow a 32-bit value.
2437 ASSERT_EQ(SeqAsciiString::kMaxSize, SeqTwoByteString::kMaxSize);
2438 ASSERT(SeqAsciiString::kMaxSize <=
2439 static_cast<int>(0xffffffffu >> (2 + kSmiTagSize)));
2440 imul(length, FieldOperand(value, String::kLengthOffset));
2441 shr(length, 2 + kSmiTagSize);
2442 add(Operand(length),
2443 Immediate(SeqString::kHeaderSize + kObjectAlignmentMask));
2444 and_(Operand(length),
2445 Immediate(~kObjectAlignmentMask));
2446
2447 bind(&is_data_object);
2417 // Value is a data object, and it is white. Mark it black. Since we know 2448 // Value is a data object, and it is white. Mark it black. Since we know
2418 // that the object is white we can make it black by flipping one bit. 2449 // that the object is white we can make it black by flipping one bit.
2419 or_(Operand(bitmap_scratch, MemoryChunk::kHeaderSize), mask_scratch); 2450 or_(Operand(bitmap_scratch, MemoryChunk::kHeaderSize), mask_scratch);
2451
2452 and_(bitmap_scratch, Immediate(~Page::kPageAlignmentMask));
2453 add(Operand(bitmap_scratch, MemoryChunk::kLiveBytesOffset),
2454 length);
2455
2420 bind(&done); 2456 bind(&done);
2421 } 2457 }
2422 2458
2423 } } // namespace v8::internal 2459 } } // namespace v8::internal
2424 2460
2425 #endif // V8_TARGET_ARCH_IA32 2461 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/macro-assembler-ia32.h ('k') | src/ia32/stub-cache-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698