summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2018-04-02 20:34:23 +0200
committerFlorian Westphal <fw@strlen.de>2018-04-03 14:27:03 +0200
commitfbcbd9ad18808a83b96e7bfe522498652907cc39 (patch)
tree5a0a7864eb6b95de761ab795cc96f4adaa17852b /src
parent440ea91fbcc9d7d7f50ec12cb65b68ce58a7c5f5 (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.c47
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;
}