- case INDEX_op_macro_2:
- {
- int dead_args[2], macro_id;
- int saved_op_index, saved_arg_index;
- int macro_op_index, macro_arg_index;
- int macro_end_op_index, macro_end_arg_index;
- int last_nb_temps;
-
- nb_args = 3;
- args -= nb_args;
- dead_args[0] = dead_temps[args[0]];
- dead_args[1] = dead_temps[args[1]];
- macro_id = args[2];
-
- /* call the macro function which generate code
- depending on the live outputs */
- saved_op_index = op_index;
- saved_arg_index = args - gen_opparam_buf;
-
- /* add a macro start instruction */
- *gen_opc_ptr++ = INDEX_op_macro_start;
- *gen_opparam_ptr++ = saved_op_index;
- *gen_opparam_ptr++ = saved_arg_index;
-
- macro_op_index = gen_opc_ptr - gen_opc_buf;
- macro_arg_index = gen_opparam_ptr - gen_opparam_buf;
-
- last_nb_temps = s->nb_temps;
-
- s->macro_func(s, macro_id, dead_args);
-
- /* realloc temp info (XXX: make it faster) */
- if (s->nb_temps > last_nb_temps) {
- uint8_t *new_dead_temps;
-
- new_dead_temps = tcg_malloc(s->nb_temps);
- memcpy(new_dead_temps, dead_temps, last_nb_temps);
- memset(new_dead_temps + last_nb_temps, 1,
- s->nb_temps - last_nb_temps);
- dead_temps = new_dead_temps;
- }
-
- macro_end_op_index = gen_opc_ptr - gen_opc_buf;
- macro_end_arg_index = gen_opparam_ptr - gen_opparam_buf;
-
- /* end of macro: add a goto to the next instruction */
- *gen_opc_ptr++ = INDEX_op_macro_end;
- *gen_opparam_ptr++ = op_index + 1;
- *gen_opparam_ptr++ = saved_arg_index + nb_args;
-
- /* modify the macro operation to be a macro_goto */
- gen_opc_buf[op_index] = INDEX_op_macro_goto;
- args[0] = macro_op_index;
- args[1] = macro_arg_index;
- args[2] = 0; /* dummy third arg to match the
- macro parameters */
-
- /* set the next instruction to the end of the macro */
- op_index = macro_end_op_index;
- args = macro_end_arg_index + gen_opparam_buf;
- }
- break;
- case INDEX_op_macro_start:
- args -= 2;
- op_index = args[0];
- args = gen_opparam_buf + args[1];
- break;
- case INDEX_op_macro_goto:
- case INDEX_op_macro_end:
- tcg_abort(); /* should never happen in liveness analysis */