fun rmap_read(var src : SrcRef, inum) : unsigned[64]
{
    if(src.bypass == 0?cvt(uchar) || src.bypass > inum?cvt(uchar)) {
	switch(src.rtype?cvt(ulong)) {
	 case 0 :
	    return src.literal?sext(64);
	 case 1 :
	    return global_registers[src.regnum];
	 case 2 :
	    return register_windows[src.regnum];
	 case 3 :
	    return fregs[src.regnum]?ext(64);
	 case 9 :
	    if(src.regnum == 0?cvt(uchar))
		return CCR?bits(8)?cvt(unsigned[64]);
	    return CCR?bits(4,7)?cvt(unsigned[64]);
	 case 10 :
	    return fcc[src.regnum]?bits(2)?cvt(unsigned[64]);
	 case 11 :
	    return Y?ext(64);
	}
    }

    return destq[+(inum?cvt(uchar)-src.bypass)][src.outnum];
}