/* This file is part of JOP, the Java Optimized Processor see <http://www.jopdesign.com/> Copyright (C) 2001-2008, Martin Schoeberl (martin@jopdesign.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/>. */ /** * * Simulation of simple cache (as in JOP) * */ package com.jopdesign.tools; public class TwoBlockCache extends Cache { int[] addr = {0, 0}; int next = 0; int currentBlock = 0; TwoBlockCache(int[] main, JopSim js) { mem = main; sim = js; } int corrPc(int pc) { // save block relative pc on invoke return pc & (MAX_BC_MASK>>1); } // TODO use both blocks for methods larger than 512 bytes int invoke(int start, int len) { if (len*4 > (MAX_BC>>1)) { System.out.println("block too large"); System.exit(0); } int off = testCache(start, len); return off; } int ret(int start, int len, int pc) { int off = testCache(start, len); return off+pc; } int testCache(int start, int len) { this.lastHit = true; if(flush) { flush=false; addr[0]=0; addr[1]=0; } else if (start==addr[0]) { currentBlock = 0; return 0; } else if (start==addr[1]) { currentBlock = 1; return (MAX_BC>>1); } this.lastHit=false; if (currentBlock==0) { next = 1; } else { next = 0; } currentBlock = next; int off = 0; if (next!=0) { off = MAX_BC>>1; } addr[next] = start; loadBc(off, start, len); return off; } void loadBc(int off, int start, int len) { // high byte of word is first bc!!! for (int i=0; i<len; ++i) { int val = sim.readInstrMem(start+i); for (int j=0; j<4; ++j) { bc[off+i*4+(3-j)] = (byte) val; val >>>= 8; } } memRead += len*4; memTrans++; } byte bc(int addr) { ++cacheRead; return bc[addr]; } }