Mercurial > hg > truffle
comparison src/cpu/ppc/vm/icache_ppc.cpp @ 14445:67fa91961822
8029940: PPC64 (part 122): C2 compiler port
Reviewed-by: kvn
author | goetz |
---|---|
date | Wed, 11 Dec 2013 00:06:11 +0100 |
parents | ec28f9c041ff |
children |
comparison
equal
deleted
inserted
replaced
14444:492e67693373 | 14445:67fa91961822 |
---|---|
26 #include "precompiled.hpp" | 26 #include "precompiled.hpp" |
27 #include "assembler_ppc.inline.hpp" | 27 #include "assembler_ppc.inline.hpp" |
28 #include "runtime/icache.hpp" | 28 #include "runtime/icache.hpp" |
29 | 29 |
30 // Use inline assembler to implement icache flush. | 30 // Use inline assembler to implement icache flush. |
31 int ppc64_flush_icache(address start, int lines, int magic){ | 31 int ICache::ppc64_flush_icache(address start, int lines, int magic) { |
32 address end = start + (unsigned int)lines*ICache::line_size; | 32 address end = start + (unsigned int)lines*ICache::line_size; |
33 assert(start <= end, "flush_icache parms"); | 33 assert(start <= end, "flush_icache parms"); |
34 | 34 |
35 // store modified cache lines from data cache | 35 // store modified cache lines from data cache |
36 for (address a=start; a<end; a+=ICache::line_size) { | 36 for (address a = start; a < end; a += ICache::line_size) { |
37 __asm__ __volatile__( | 37 __asm__ __volatile__( |
38 "dcbst 0, %0 \n" | 38 "dcbst 0, %0 \n" |
39 : | 39 : |
40 : "r" (a) | 40 : "r" (a) |
41 : "memory"); | 41 : "memory"); |
42 } | 42 } |
43 | 43 |
44 // sync instruction | 44 // sync instruction |
45 __asm__ __volatile__( | 45 __asm__ __volatile__( |
46 "sync \n" | 46 "sync \n" |
47 : | 47 : |
48 : | 48 : |
49 : "memory"); | 49 : "memory"); |
50 | 50 |
51 // invalidate respective cache lines in instruction cache | 51 // invalidate respective cache lines in instruction cache |
52 for (address a=start; a<end; a+=ICache::line_size) { | 52 for (address a = start; a < end; a += ICache::line_size) { |
53 __asm__ __volatile__( | 53 __asm__ __volatile__( |
54 "icbi 0, %0 \n" | 54 "icbi 0, %0 \n" |
55 : | 55 : |
56 : "r" (a) | 56 : "r" (a) |
57 : "memory"); | 57 : "memory"); |
58 } | 58 } |
59 | 59 |
60 // discard fetched instructions | 60 // discard fetched instructions |
61 __asm__ __volatile__( | 61 __asm__ __volatile__( |
62 "isync \n" | 62 "isync \n" |
63 : | 63 : |
64 : | 64 : |
65 : "memory"); | 65 : "memory"); |
66 | 66 |
67 return magic; | 67 return magic; |
68 } | 68 } |
69 | 69 |
70 void ICacheStubGenerator::generate_icache_flush(ICache::flush_icache_stub_t* flush_icache_stub) { | 70 void ICacheStubGenerator::generate_icache_flush(ICache::flush_icache_stub_t* flush_icache_stub) { |
71 StubCodeMark mark(this, "ICache", "flush_icache_stub"); | 71 StubCodeMark mark(this, "ICache", "flush_icache_stub"); |
72 | 72 |
73 *flush_icache_stub = (ICache::flush_icache_stub_t)ppc64_flush_icache; | 73 *flush_icache_stub = (ICache::flush_icache_stub_t)ICache::ppc64_flush_icache; |
74 | 74 |
75 // First call to flush itself | 75 // First call to flush itself |
76 ICache::invalidate_range((address)(*flush_icache_stub), 0); | 76 ICache::invalidate_range((address)(*flush_icache_stub), 0); |
77 } | 77 } |