aboutsummaryrefslogtreecommitdiff
path: root/tools/translate.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/translate.c')
-rw-r--r--tools/translate.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/tools/translate.c b/tools/translate.c
index 64ed407..8b28aad 100644
--- a/tools/translate.c
+++ b/tools/translate.c
@@ -426,6 +426,42 @@ fail:
return -1;
}
+static int _translate_br_if(struct translation *data)
+{
+ struct target *br_end;
+ struct instruction **expr = &data->function->translated_body;
+ struct types *backed_stack = NULL;
+ int retval = -1;
+
+ br_end = add_target(data->module);
+
+ if (!br_end)
+ goto fail;
+
+ if (i_cond_jump_n(ptr_after(&br_end->instr), expr))
+ goto fail;
+
+ backed_stack = data->types_stack;
+ get_type(backed_stack);
+
+ if (_translate_br(data))
+ goto fail;
+
+ br_end->instr = data->function->translated_body->prev;
+ retval = 0;
+
+fail:
+ if (backed_stack) {
+ put_type(data->types_stack);
+ data->types_stack = backed_stack;
+ }
+
+ if (retval)
+ PRERR("Couldn't translate br_if instruction\n");
+
+ return retval;
+}
+
static int _translate_call(struct translation *data)
{
uint32_t funcidx;