sv_reg_t sv_proc_t::to_uint32(sv_freg_t const& reg)
{
- return sv_reg_t(reg.to_uint32());
+ switch (reg.get_elwidth())
+ {
+ // 8-bit
+ case 1: throw trap_illegal_instruction(0); // XXX for now
+ // 16-bit data, up-convert to f32
+ case 2:
+ {
+ float32_t x32 = ::f32(reg.to_uint32());
+ return sv_reg_t(f32_to_f16(x32).v, xlen, reg.get_elwidth());
+ }
+ // 0 and 3 are 32-bit
+ default: break;
+ }
+ return sv_reg_t(reg.to_uint32(), xlen, reg.get_elwidth());
}
sv_reg_t sv_proc_t::to_uint32(sv_float32_t const& reg)
{
- return sv_reg_t(reg.to_uint32());
+ switch (reg.get_elwidth())
+ {
+ // 8-bit
+ case 1: throw trap_illegal_instruction(0); // XXX for now
+ // 16-bit data, up-convert to f32
+ case 2:
+ {
+ float32_t x32 = ::f32(reg.to_uint32());
+ return sv_reg_t(f32_to_f16(x32).v, xlen, reg.get_elwidth());
+ }
+ // 0 and 3 are 32-bit
+ default: break;
+ }
+ return sv_reg_t(reg.to_uint32(), xlen, reg.get_elwidth());
}
// ------