int bitwidth = get_bitwidth(_insn->reg_elwidth(reg, true), xlen);
unsigned int shift = 0;
unsigned int offs = 0;
- if (spec.offset) {
+ if (spec.offset != NULL) {
unsigned int nbytes = xlen / bitwidth;
offs = *spec.offset;
shift = offs % nbytes;
offs /= nbytes;
- fprintf(stderr, "writereg spec %ld bitwidth %d offs %d shift %d\n",
- spec.reg, bitwidth, offs, shift);
reg += offs;
+ fprintf(stderr, "writereg spec %ld %lx bitwidth %d offs %d shift %d\n",
+ reg, wval, bitwidth, offs, shift);
}
if (xlen != bitwidth)
{
uint64_t data = _insn->p->get_state()->XPR[reg];
uint64_t mask = ((1UL<<bitwidth)-1UL) << (shift*bitwidth);
- wval = wval << (shift*bitwidth); // gets element within the reg-block
+ wval = (uint64_t)(wval << (shift*bitwidth)); // element within reg-block
+ wval &= mask;
uint64_t ndata = data & (uint64_t)(~mask); // masks off the right bits
wval |= ndata;
fprintf(stderr, "writereg %ld bitwidth %d offs %d shift %d %lx " \
int bitwidth = get_bitwidth(_insn->reg_elwidth(reg, true), xlen);
int shift = 0;
int offs = 0;
- if (spec.offset && spec.reg != 2) { // XXX HACK on spec.reg != 2
+ if (spec.offset != NULL && spec.reg != 2) { // XXX HACK on spec.reg != 2
int nbytes = xlen / bitwidth;
offs = *spec.offset;
shift = offs % nbytes;
{
uint64_t x = v;
x = ((sreg_t)(int32_t)(x));
- return sv_sreg_t((int64_t)x);
+ return sv_sreg_t((int64_t)x, v.get_xlen(), v.get_elwidth());
}
//sv_sreg_t (sv_proc_t::sext32)(sv_sreg_t const& v)
{
uint8_t bitwidth = _insn->src_bitwidth;
if (bitwidth == xlen) {
- //fprintf(stderr, "add result %lx %lx %lx\n",
- // (uint64_t)lhs, (uint64_t)rhs, (uint64_t)(lhs + rhs));
+ fprintf(stderr, "add result %lx %lx %lx\n",
+ (uint64_t)lhs, (uint64_t)rhs, (uint64_t)(lhs + rhs));
return lhs + rhs;
}
uint64_t vlhs = 0;
result = zext_bwid(result, bitwidth);
}
uint8_t reswidth = maxelwidth(lhs.get_elwidth(), rhs.get_elwidth());
- //fprintf(stderr, "add result %ld\n", result);
+ fprintf(stderr, "add result sext %d wid %d %lx\n", _insn->signextended,
+ reswidth, result);
return sv_reg_t(result, xlen, reswidth); // XXX TODO: bitwidth
}