#ifndef _rename_decode_fs
#define _rename_decode_fs
/******************************************************************************
** FILE: rename_decode.fs
** Functions used durring instruction decode to set up register renaming.
*/
#include "param.h"
#include "rename_regs.h"
#include "rename_types.fs"
#include "rename_alloc.fs"
#include "rename_data.fs"
#include "instq.fs"
///////////////////////////////////////////////////////////////////////////////
// Set up mapping for src and dest registers.
// rmap_src() -- lookup mapping for src register
// literal_src() -- set source data as a literal value
// rmap_dest() -- alter mapping to bind a new destination register
//
fun rmap_src(rtype, regnum, // identify register type & num
inum) // index of instruction
{
val src : SrcRef;
src.rtype = rtype?cvt(uchar);
src.regnum = regnum?cvt(uchar);
src.literal = 0;
val ii = +(inum - 1);
while(ii >= +0) {
// Search for register in all earlier instructions
val jj = 0;
while(jj < instq[ii].destq?length()) {
// Search all destinations of an instruction
val dest = instq[ii].destq[+jj];
if(dest.rtype == rtype?cvt(uchar) &&
dest.regnum == regnum?cvt(uchar)) {
// Value in produced by an earlier instruction
src.bypass = (+inum - ii)?cvt(uchar);
src.outnum = jj?cvt(uchar);
return src;
}
jj = jj + 1;
}
ii = ii - +1;
}
// Value is in the architectural register file
src.bypass = 0?cvt(uchar);
src.outnum = 0?cvt(uchar);
return src;
}
fun literal_src(lit) // literal value
{
val src : SrcRef;
src.rtype = REG_LITERAL?cvt(uchar);
src.regnum = 0?cvt(uchar);
src.bypass = 0?cvt(uchar);
src.outnum = 0?cvt(uchar);
src.literal = lit?cvt(ulong);
return src;
}
fun rmap_dest(rtype, regnum, // identify register type & num
inum) // instruction index
{
val dest : DestRef;
dest.rtype = rtype?cvt(uchar);
dest.regnum = regnum?cvt(uchar);
return dest;
}
fun rmap_src(rtype, regnum)
{ return rmap_src(rtype,regnum,instq?length()); }
fun rmap_dest(rtype, regnum)
{ return rmap_dest(rtype,regnum,instq?length()); }
///////////////////////////////////////////////////////////////////////////////
// Update rmap structures after fetching 1 instruction
//
fun rmap_fetch()
{
destq?push_back();
}
///////////////////////////////////////////////////////////////////////////////
// Checkpoint the rmap to support speculative execution.
//
fun rmap_checkpoint()
{}
#endif