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