aboutsummaryrefslogtreecommitdiff
path: root/riscv/insns/vmadc_vim.h
blob: 36722d79d35d016d938dba07cdf033e2d3d283fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
// vmadc.vim vd, vs2, simm5
VI_XI_LOOP_CARRY
({
  auto v0 = P.VU.elt<uint64_t>(0, midx);
  const uint64_t mmask = (UINT64_MAX << (64 - mlen)) >> (64 - mlen - mpos);
  const uint128_t op_mask = (UINT64_MAX >> (64 - sew));
  uint64_t carry = insn.v_vm() == 0 ? (v0 >> mpos) & 0x1 : 0;

  uint128_t res = (op_mask & simm5) + (op_mask & vs2) + carry;

  carry = (res >> sew) & 0x1u;
  vd = (vd & ~mmask) | ((carry << mpos) & mmask);
})