OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 7564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7575 | 7575 |
7576 Smi* kEntrySizeSmi = Smi::FromInt(JSFunctionResultCache::kEntrySize); | 7576 Smi* kEntrySizeSmi = Smi::FromInt(JSFunctionResultCache::kEntrySize); |
7577 Smi* kEntriesIndexSmi = Smi::FromInt(JSFunctionResultCache::kEntriesIndex); | 7577 Smi* kEntriesIndexSmi = Smi::FromInt(JSFunctionResultCache::kEntriesIndex); |
7578 | 7578 |
7579 // Check the cache from finger to start of the cache. | 7579 // Check the cache from finger to start of the cache. |
7580 __ bind(&first_loop); | 7580 __ bind(&first_loop); |
7581 __ sub(Operand(dst_), Immediate(kEntrySizeSmi)); | 7581 __ sub(Operand(dst_), Immediate(kEntrySizeSmi)); |
7582 __ cmp(Operand(dst_), Immediate(kEntriesIndexSmi)); | 7582 __ cmp(Operand(dst_), Immediate(kEntriesIndexSmi)); |
7583 __ j(less, &search_further); | 7583 __ j(less, &search_further); |
7584 | 7584 |
7585 __ cmp(key_, CodeGenerator::FixedArrayElementOperand(cache_, dst_)); | 7585 __ cmp(key_, FixedArrayElementOperand(cache_, dst_)); |
7586 __ j(not_equal, &first_loop); | 7586 __ j(not_equal, &first_loop); |
7587 | 7587 |
7588 __ mov(FieldOperand(cache_, JSFunctionResultCache::kFingerOffset), dst_); | 7588 __ mov(FieldOperand(cache_, JSFunctionResultCache::kFingerOffset), dst_); |
7589 __ mov(dst_, CodeGenerator::FixedArrayElementOperand(cache_, dst_, 1)); | 7589 __ mov(dst_, FixedArrayElementOperand(cache_, dst_, 1)); |
7590 __ jmp(exit_label()); | 7590 __ jmp(exit_label()); |
7591 | 7591 |
7592 __ bind(&search_further); | 7592 __ bind(&search_further); |
7593 | 7593 |
7594 // Check the cache from end of cache up to finger. | 7594 // Check the cache from end of cache up to finger. |
7595 __ mov(dst_, FieldOperand(cache_, JSFunctionResultCache::kCacheSizeOffset)); | 7595 __ mov(dst_, FieldOperand(cache_, JSFunctionResultCache::kCacheSizeOffset)); |
7596 | 7596 |
7597 __ bind(&second_loop); | 7597 __ bind(&second_loop); |
7598 __ sub(Operand(dst_), Immediate(kEntrySizeSmi)); | 7598 __ sub(Operand(dst_), Immediate(kEntrySizeSmi)); |
7599 // Consider prefetching into some reg. | 7599 // Consider prefetching into some reg. |
7600 __ cmp(dst_, FieldOperand(cache_, JSFunctionResultCache::kFingerOffset)); | 7600 __ cmp(dst_, FieldOperand(cache_, JSFunctionResultCache::kFingerOffset)); |
7601 __ j(less_equal, &cache_miss); | 7601 __ j(less_equal, &cache_miss); |
7602 | 7602 |
7603 __ cmp(key_, CodeGenerator::FixedArrayElementOperand(cache_, dst_)); | 7603 __ cmp(key_, FixedArrayElementOperand(cache_, dst_)); |
7604 __ j(not_equal, &second_loop); | 7604 __ j(not_equal, &second_loop); |
7605 | 7605 |
7606 __ mov(FieldOperand(cache_, JSFunctionResultCache::kFingerOffset), dst_); | 7606 __ mov(FieldOperand(cache_, JSFunctionResultCache::kFingerOffset), dst_); |
7607 __ mov(dst_, CodeGenerator::FixedArrayElementOperand(cache_, dst_, 1)); | 7607 __ mov(dst_, FixedArrayElementOperand(cache_, dst_, 1)); |
7608 __ jmp(exit_label()); | 7608 __ jmp(exit_label()); |
7609 | 7609 |
7610 __ bind(&cache_miss); | 7610 __ bind(&cache_miss); |
7611 __ push(cache_); // store a reference to cache | 7611 __ push(cache_); // store a reference to cache |
7612 __ push(key_); // store a key | 7612 __ push(key_); // store a key |
7613 __ push(Operand(esi, Context::SlotOffset(Context::GLOBAL_INDEX))); | 7613 __ push(Operand(esi, Context::SlotOffset(Context::GLOBAL_INDEX))); |
7614 __ push(key_); | 7614 __ push(key_); |
7615 // On ia32 function must be in edi. | 7615 // On ia32 function must be in edi. |
7616 __ mov(edi, FieldOperand(cache_, JSFunctionResultCache::kFactoryOffset)); | 7616 __ mov(edi, FieldOperand(cache_, JSFunctionResultCache::kFactoryOffset)); |
7617 ParameterCount expected(1); | 7617 ParameterCount expected(1); |
(...skipping 25 matching lines...) Expand all Loading... |
7643 __ mov(edx, FieldOperand(ecx, JSFunctionResultCache::kCacheSizeOffset)); | 7643 __ mov(edx, FieldOperand(ecx, JSFunctionResultCache::kCacheSizeOffset)); |
7644 __ lea(ebx, Operand(edx, JSFunctionResultCache::kEntrySize << 1)); | 7644 __ lea(ebx, Operand(edx, JSFunctionResultCache::kEntrySize << 1)); |
7645 __ mov(FieldOperand(ecx, JSFunctionResultCache::kCacheSizeOffset), ebx); | 7645 __ mov(FieldOperand(ecx, JSFunctionResultCache::kCacheSizeOffset), ebx); |
7646 | 7646 |
7647 // Update the cache itself. | 7647 // Update the cache itself. |
7648 // edx holds the index. | 7648 // edx holds the index. |
7649 __ bind(&update_cache); | 7649 __ bind(&update_cache); |
7650 __ pop(ebx); // restore the key | 7650 __ pop(ebx); // restore the key |
7651 __ mov(FieldOperand(ecx, JSFunctionResultCache::kFingerOffset), edx); | 7651 __ mov(FieldOperand(ecx, JSFunctionResultCache::kFingerOffset), edx); |
7652 // Store key. | 7652 // Store key. |
7653 __ mov(CodeGenerator::FixedArrayElementOperand(ecx, edx), ebx); | 7653 __ mov(FixedArrayElementOperand(ecx, edx), ebx); |
7654 __ RecordWrite(ecx, 0, ebx, edx); | 7654 __ RecordWrite(ecx, 0, ebx, edx); |
7655 | 7655 |
7656 // Store value. | 7656 // Store value. |
7657 __ pop(ecx); // restore the cache. | 7657 __ pop(ecx); // restore the cache. |
7658 __ mov(edx, FieldOperand(ecx, JSFunctionResultCache::kFingerOffset)); | 7658 __ mov(edx, FieldOperand(ecx, JSFunctionResultCache::kFingerOffset)); |
7659 __ add(Operand(edx), Immediate(Smi::FromInt(1))); | 7659 __ add(Operand(edx), Immediate(Smi::FromInt(1))); |
7660 __ mov(ebx, eax); | 7660 __ mov(ebx, eax); |
7661 __ mov(CodeGenerator::FixedArrayElementOperand(ecx, edx), ebx); | 7661 __ mov(FixedArrayElementOperand(ecx, edx), ebx); |
7662 __ RecordWrite(ecx, 0, ebx, edx); | 7662 __ RecordWrite(ecx, 0, ebx, edx); |
7663 | 7663 |
7664 if (!dst_.is(eax)) { | 7664 if (!dst_.is(eax)) { |
7665 __ mov(dst_, eax); | 7665 __ mov(dst_, eax); |
7666 } | 7666 } |
7667 } | 7667 } |
7668 | 7668 |
7669 | 7669 |
7670 void CodeGenerator::GenerateGetFromCache(ZoneList<Expression*>* args) { | 7670 void CodeGenerator::GenerateGetFromCache(ZoneList<Expression*>* args) { |
7671 ASSERT_EQ(2, args->length()); | 7671 ASSERT_EQ(2, args->length()); |
(...skipping 2704 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10376 | 10376 |
10377 CPU::FlushICache(buffer, actual_size); | 10377 CPU::FlushICache(buffer, actual_size); |
10378 return FUNCTION_CAST<OS::MemCopyFunction>(buffer); | 10378 return FUNCTION_CAST<OS::MemCopyFunction>(buffer); |
10379 } | 10379 } |
10380 | 10380 |
10381 #undef __ | 10381 #undef __ |
10382 | 10382 |
10383 } } // namespace v8::internal | 10383 } } // namespace v8::internal |
10384 | 10384 |
10385 #endif // V8_TARGET_ARCH_IA32 | 10385 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |