diff options
author | Florian Westphal <fw@strlen.de> | 2018-04-02 20:34:23 +0200 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2018-04-03 14:27:03 +0200 |
commit | fbcbd9ad18808a83b96e7bfe522498652907cc39 (patch) | |
tree | 5a0a7864eb6b95de761ab795cc96f4adaa17852b /src | |
parent | 440ea91fbcc9d7d7f50ec12cb65b68ce58a7c5f5 (diff) |
evaluate: move lhs fixup to a helper
... to reuse this in a followup patch.
Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/evaluate.c | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/src/evaluate.c b/src/evaluate.c index 967ad162..189f1ea4 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -1483,10 +1483,36 @@ static int binop_transfer_one(struct eval_ctx *ctx, return expr_evaluate(ctx, right); } +static void binop_transfer_handle_lhs(struct expr **expr) +{ + struct expr *tmp, *left = *expr; + unsigned int shift; + + assert(left->ops->type == EXPR_BINOP); + + switch (left->op) { + case OP_RSHIFT: + /* Mask out the bits the shift would have masked out */ + shift = mpz_get_uint8(left->right->value); + mpz_bitmask(left->right->value, left->left->len); + mpz_lshift_ui(left->right->value, shift); + left->op = OP_AND; + break; + case OP_LSHIFT: + case OP_XOR: + tmp = expr_get(left->left); + tmp->dtype = left->dtype; + expr_free(left); + *expr = tmp; + break; + default: + BUG("invalid binop operation %u", left->op); + } +} + static int binop_transfer(struct eval_ctx *ctx, struct expr **expr) { struct expr *left = (*expr)->left, *i, *next; - unsigned int shift; int err; if (left->ops->type != EXPR_BINOP) @@ -1555,24 +1581,7 @@ static int binop_transfer(struct eval_ctx *ctx, struct expr **expr) return 0; } - switch (left->op) { - case OP_RSHIFT: - /* Mask out the bits the shift would have masked out */ - shift = mpz_get_uint8(left->right->value); - mpz_bitmask(left->right->value, left->left->len); - mpz_lshift_ui(left->right->value, shift); - left->op = OP_AND; - break; - case OP_LSHIFT: - case OP_XOR: - left = expr_get((*expr)->left->left); - left->dtype = (*expr)->left->dtype; - expr_free((*expr)->left); - (*expr)->left = left; - break; - default: - BUG("invalid binop operation %u", left->op); - } + binop_transfer_handle_lhs(&(*expr)->left); return 0; } |