diff options
Diffstat (limited to 'tools/translate.c')
-rw-r--r-- | tools/translate.c | 36 |
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; |