#ifndef _instq_fs #define _instq_fs /****************************************************************************** ** FILE: instq.fs ** Datatypes and queues to implement an out-of-order execution engine. */ #include "param.h" #include "rename_types.fs" // // InstOp: translated instruction data. type InstOp = struct { pc : stream, // instruction address npc : stream, // next instruction address srcq : SrcRef queue, // source data description destq : DestRef queue, // destination register description op : ushort, // internal instruction operator tag ftype : uchar, // function unit type to use ftime : uchar, // time left in function unit taken : bool, // branch is taken delta : char, // change CWP0 by this delta on retire trap : bool, // trap to OS done : bool, // flag to trigger exit from main align : uchar // log2 width of mem accesses (for alignment) }; // Out-of-order instruction queue. [RT_STAT] val instq : InstOp queue = queue(OOLIMIT){}; fun init_inst(var inst : InstOp, pc, npc) { inst.pc = pc; inst.npc = npc; inst.srcq?clear(); inst.destq?clear(); inst.op = 0?cvt(ushort); inst.ftype = 0?cvt(uchar); inst.ftime = 0?cvt(uchar); inst.taken = false; inst.delta = 0?cvt(char); inst.trap = false; inst.done = false; inst.align = 0?cvt(uchar); } #endif