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;
}