1 // Source for generating some asm for cut'n'paste, why program asm ourselves
2 // when the compiler can do it?
3 // arm-linux-g++ -fverbose-asm -fPIC -W -Wall -Os -S cache_func_gen.cpp
11 void num_way_l1_cache_op()
13 asm volatile("@ Start:");
14 register unsigned long ccsidr;
15 asm volatile("mcr p15, 2, %0, c0, c0, 0" : : "r" (0)); // L1, data or unified
16 asm volatile("mrc p15, 1, %0, c0, c0, 0" : "=r" (ccsidr));
19 printf("ccsidr = %08lx\n", ccsidr);
22 register unsigned numsets = ((ccsidr >> 13) & ((1 << 15) - 1));
24 register unsigned numways = ((ccsidr >> 3) & ((1 << 10) - 1));
26 register unsigned linesizel2 = (ccsidr >> 0) & ((1 << 3) - 1);
29 printf("linesizel2: %d numways: %d numsets: %d\n",
30 linesizel2, numways + 1, numsets + 1);
32 register int shiftways = __builtin_clz(numways);
33 register int shiftset = linesizel2 + 4;
36 printf("shiftways: %d shiftset: %d\n", shiftways, shiftset);
39 for (register int w = numways; w >= 0; --w)
40 for (register int s = numsets; s >= 0; --s)
42 register unsigned long v = (w << shiftways) | (s << shiftset);
45 asm volatile("mcr p15, 0, %0, c7, c6, 2" : : "r" (v));
47 printf("w=%d s=%d: %08lx\n", w, s, v);
54 asm volatile("@ End:");
56 printf("cnt: %d\n", cnt);