1958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Copyright 2014 the V8 project authors. All rights reserved. 2958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Use of this source code is governed by a BSD-style license that can be 3958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// found in the LICENSE file. 4958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// CPU specific code for ppc independent of OS goes here. 6958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC 8958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/assembler.h" 10958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/macro-assembler.h" 11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 12958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace v8 { 13958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace internal { 14958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid CpuFeatures::FlushICache(void* buffer, size_t size) { 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !defined(USE_SIMULATOR) 17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (CpuFeatures::IsSupported(INSTR_AND_DATA_CACHE_COHERENCY)) { 18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __asm__ __volatile__( 19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier "sync \n" 20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier "icbi 0, %0 \n" 21958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier "isync \n" 22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : /* no output */ 23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : "r"(buffer) 24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : "memory"); 25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 28342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch const int kCacheLineSize = CpuFeatures::icache_line_size(); 29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier intptr_t mask = kCacheLineSize - 1; 30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier byte *start = 31958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier reinterpret_cast<byte *>(reinterpret_cast<intptr_t>(buffer) & ~mask); 32958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier byte *end = static_cast<byte *>(buffer) + size; 33958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (byte *pointer = start; pointer < end; pointer += kCacheLineSize) { 34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __asm__( 35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier "dcbf 0, %0 \n" 36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier "sync \n" 37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier "icbi 0, %0 \n" 38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier "isync \n" 39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : /* no output */ 40958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : "r"(pointer)); 41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 42958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // !USE_SIMULATOR 44958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 47958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 48958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif // V8_TARGET_ARCH_PPC 49