fun fu_finish(ftype, var inst : InstOp, inum) { switch(ftype?cvt(ulong)) { case 1 : return true; case 2 : return true; case 3 : val op = inst.op?cvt(ulong); val va = (rmap_read(inst.srcq[+0],inum) + rmap_read(inst.srcq[+1],inum))?cvt(ulong); val delay : short; assert(inst.align <= 3?cvt(uchar)); if((va & ((1<<inst.align?cvt(ulong))-1)) != 0) { if(inum > 0) { inst.ftime = 1?cvt(uchar); return false; } } if(unk_store_addr) { inst.ftime = 1?cvt(uchar); return false; } if(164 <= op && op <= 173 ) { if(cache_load_start(inum,va,no_loads,delay)) return true; delay?static; if(delay >= 0?cvt(short)) { inst.ftype = 4 ?cvt(uchar); inst.ftime = delay?cvt(uchar); } else { inst.ftime = (-delay)?cvt(uchar); unk_load_addr = true; } } else if(174 <= op && op <= 180 ) { if(cache_store_start(inum,va,is_spec||unk_load_addr,delay)) { delay?static; assert(delay >= 0?cvt(short)); if(!is_spec && !unk_load_addr && delay == 0?cvt(short)) { inst.ftype = 0 ?cvt(uchar); return true; } else { inst.ftype = 5 ?cvt(uchar); if(delay == 0?cvt(short)) inst.ftime = 1?cvt(uchar); else { assert(delay > 0?cvt(short)); inst.ftime = delay?cvt(uchar); } } } else { delay?static; assert(delay < 0?cvt(short)); inst.ftime = (-delay)?cvt(uchar); unk_store_addr = true; } } else { assert(181 <= op && op <= 184 ); if(cache_store_start(inum,va,is_spec||unk_load_addr,delay)) { delay?static; assert(delay >= 0?cvt(short)); if(!is_spec && !unk_load_addr && delay == 0?cvt(short)) { inst.ftype = 0 ?cvt(uchar); return true; } else { inst.ftype = 5 ?cvt(uchar); if(delay == 0?cvt(short)) inst.ftime = 1?cvt(uchar); else { assert(delay > 0?cvt(short)); inst.ftime = delay?cvt(uchar); } } } else { delay?static; assert(delay < 0?cvt(short)); inst.ftime = (-delay)?cvt(uchar); unk_store_addr = true; } } case 4 : val delay : short; if(cache_load_continue(inum, delay)) return true; inst.ftime = delay?static?cvt(uchar); case 5 : if(!is_spec && !unk_load_addr) { val delay : short; if(cache_store_commit(inum,delay)) { inst.ftype = 0 ?cvt(uchar); return true; } else { delay?static; assert(delay > 0?cvt(short)); inst.ftime = delay?cvt(uchar); } } else inst.ftime = 1?cvt(uchar); default: assert(false); } return false; }