/*
This file is part of JOP, the Java Optimized Processor
see <http://www.jopdesign.com/>
Copyright (C) 2009, Benedikt Huber (benedikt.huber@gmail.com)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* Autogenerated using ERB (tiny ruby, part of ruby distributions) */
/* erb LoadOnReturn.erb > LoadOnReturn.java */
package wcet.devel;
import com.jopdesign.sys.Config;
import com.jopdesign.sys.Const;
import com.jopdesign.sys.Native;
/*
* Load on Return Test for variable block method caches.
* NOTE: Analysis is trivial without cache
* TODO: Add real measurements (I'm currently lacking VMWare)
* dspio, 16 blocks, 4096K cache
* JSIM: 26681
* UPPAAL[fixed 14.3.09]: 26668 (still of by ~13 - INVESTIGATE !!)
* IPET: 32877
* With loop:
* JSIM: 2,668,635
* UPPAAL[fixed 14.3.09]: 2,668,647
* IPET: 3,294,330
*
* Edit erb file if you need different cache settings
*/
public class LoadOnReturn {
final static int CACHE_FLUSH = -51;
final static int CACHE_RD_COST = -52;
final static boolean MEASURE_CACHE = false;
static int ts, te, to;
static int cs, ce;
public static void main(String[] args) {
ts = Native.rdMem(Const.IO_CNT);
te = Native.rdMem(Const.IO_CNT);
to = te-ts;
invoke();
int val = te-ts-to;
int cacheCost = ce-cs;
if (Config.MEASURE) { System.out.print("max: "); System.out.println(val); }
if (MEASURE_CACHE) { System.out.print("cache cost: "); System.out.println(cacheCost); }
}
static void invoke() {
if(MEASURE_CACHE) {
cs = Native.rdMem(CACHE_RD_COST);
Native.wrMem(1,CACHE_FLUSH);
}
measure();
if (Config.MEASURE) te = Native.rdMem(Const.IO_CNT);
if (MEASURE_CACHE) ce = Native.rdMem(CACHE_RD_COST);
}
/* Generated for 16 blocks, 1024 words cache */
/* For a 2*n-cache block:
- f_i spans 2 blocks
- we load the cache with measure(), f_n,f_n-1,...f_1
- ### ^|f_n(0)|f_n(1)|...|f_1(0)|f_1(0)|
- measure and all-fit are loaded, invalidating f_n
- ### ^|f_n-1(0)|...|f_1(0)|f_1(1)|measure|callallfit
- then we call the all-fit region f1 (which in turn invokes f2,..,f_n-1)
- the call to f_n is a miss, overwriting f_{n-1}
- ### ^|f_n-2(0)|f_n-2(1)|...|f_1(0)|f_(1)|measure|callallfit|f_n(0)|f_n(1)|
- When returning, the accesses to f_n-1,f_n-2,...,f_1,callallfit and measure are cache misses
- ### ^|f_n-1(0)|f_n-1(1)|f_1(1)|...|callallfit|measure
- Luckily, we can loop at this point if we want
*/
static void measure() {
if (Config.MEASURE) ts = Native.rdMem(Const.IO_CNT);
// Optional: loop
// for(int i = 0; i < 100; i++) {
f_8();
f_7();
f_6();
f_5();
f_4();
f_3();
f_2();
f_1();
callallfit();
// }
}
static void callallfit() {
f_1();
}
static void f_1() {
f_2();
int val = 23;
/* Rest takes 8 bytes, val += 123 takes 3 bytes, and we want two fill two blocks */
/* Inserting 86 times val+=123 */
val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123;
}
static void f_2() {
f_3();
int val = 23;
/* Rest takes 8 bytes, val += 123 takes 3 bytes, and we want two fill two blocks */
/* Inserting 86 times val+=123 */
val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123;
}
static void f_3() {
f_4();
int val = 23;
/* Rest takes 8 bytes, val += 123 takes 3 bytes, and we want two fill two blocks */
/* Inserting 86 times val+=123 */
val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123;
}
static void f_4() {
f_5();
int val = 23;
/* Rest takes 8 bytes, val += 123 takes 3 bytes, and we want two fill two blocks */
/* Inserting 86 times val+=123 */
val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123;
}
static void f_5() {
f_6();
int val = 23;
/* Rest takes 8 bytes, val += 123 takes 3 bytes, and we want two fill two blocks */
/* Inserting 86 times val+=123 */
val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123;
}
static void f_6() {
f_7();
int val = 23;
/* Rest takes 8 bytes, val += 123 takes 3 bytes, and we want two fill two blocks */
/* Inserting 86 times val+=123 */
val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123;
}
static void f_7() {
f_8();
int val = 23;
/* Rest takes 8 bytes, val += 123 takes 3 bytes, and we want two fill two blocks */
/* Inserting 86 times val+=123 */
val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123;
}
static void f_8() {
int val = 23;
/* Rest takes 8 bytes, val += 123 takes 3 bytes, and we want two fill two blocks */
/* Inserting 86 times val+=123 */
val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123; val += 123;
}
}