Skip to content

Commit 65579d2

Browse files
Make precache() cleaner and more efficient (#8903)
No need to issue a MEMW instrunction per load from each cache line. Only once after the last load is sufficient. MEMW ensures that all previous load, store, acquire, release, prefetch, and cache instructions perform before performing any subsequent load, store, acquire, release, prefetch, or cache instructions. -- MEMW (Memory Wait), 6. Instruction Descriptions, Xtensa ISA Reference Manual (p.409)
1 parent a76ef29 commit 65579d2

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

cores/esp8266/core_esp8266_features.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ void precache(void *f, uint32_t bytes) {
3838
// page (ie 1 word in 8) for this to work.
3939
#define CACHE_PAGE_SIZE 32
4040

41-
uint32_t a0;
42-
__asm__("mov.n %0, a0" : "=r"(a0));
43-
uint32_t lines = (bytes/CACHE_PAGE_SIZE)+2;
44-
volatile uint32_t *p = (uint32_t*)((f ? (uint32_t)f : a0) & ~0x03);
45-
uint32_t x;
46-
for (uint32_t i=0; i<lines; i++, p+=CACHE_PAGE_SIZE/sizeof(uint32_t)) x=*p;
47-
(void)x;
41+
uint32_t lines = (bytes / CACHE_PAGE_SIZE) + 2;
42+
uint32_t *p = (uint32_t*)((uint32_t)(f ? f : __builtin_return_address(0)) & ~0x03);
43+
do {
44+
__asm__ volatile ("" : : "r"(*p)); // guarantee that the value of *p will be in some register (forced load)
45+
p += CACHE_PAGE_SIZE / sizeof(uint32_t);
46+
} while (--lines);
47+
__sync_synchronize(); // full memory barrier, mapped to MEMW in Xtensa
4848
}
4949

5050
/** based on efuse data, we could determine what type of chip this is

0 commit comments

Comments
 (0)