static void insn_xor_(bdd r0[XO_NUM_BITS], bdd r1[XO_NUM_BITS], bdd f[XO_NUM_FLAGS]) { for(int i = 0; i < XO_NUM_BITS; ++i) r0[i] = r0[i] ^ r1[i]; f[0] = bdd_false(); f[1] = bdd_false(); f[2] = pf_(r0); f[3] = sf_(r0); f[4] = zf_(r0); }
static void insn_dec_(bdd r0[XO_NUM_BITS], bdd r1[XO_NUM_BITS], bdd f[XO_NUM_FLAGS]) { bdd c[XO_NUM_BITS]; c[0] = !r0[0]; r0[0] = !r0[0]; for(int i = 1; i < XO_NUM_BITS; ++i) { c[i] = !r0[i] & c[i-1]; r0[i] = r0[i] ^ c[i-1]; } f[1] = c[30] ^ c[31]; f[2] = pf_(r0); f[3] = sf_(r0); f[4] = zf_(r0); }
static void insn_cmp_(bdd r0[XO_NUM_BITS], bdd r1[XO_NUM_BITS], bdd f[XO_NUM_FLAGS]) { bdd c[XO_NUM_BITS]; bdd tmp[XO_NUM_BITS]; c[0] = !r0[0] & r1[0]; tmp[0] = r0[0] ^ r1[0]; for(int i = 1; i < XO_NUM_BITS; ++i) { c[i] = !r0[i] & r1[i] | !r0[i] & c[i-1] | r1[i] & c[i-1]; tmp[i] = r0[i] ^ r1[i] ^ c[i-1]; } f[0] = c[31]; f[1] = c[30] ^ c[31]; f[2] = pf_(tmp); f[3] = sf_(tmp); f[4] = zf_(tmp); }
unsigned Select::branch(const Args& args, void* p) const { assert(sf_arity() == args.size()); return sf_(args, p); }