- projs[get_Proj_proj(proj)] = proj;
- }
- assert(default_proj != NULL && "SwitchJmp should have a Default Proj");
-
- /*
- CMP %1S, n_projs - 1
- BHI default
- */
-
- be_emit_cstring(env->emit, "\tcmp ");
- arm_emit_source_register(env, irn, 0);
- be_emit_irprintf(env->emit, ", #%u", n_projs - 1);
- be_emit_finish_line_gas(env->emit, irn);
-
- be_emit_cstring(env->emit, "\tbhi ");
- arm_emit_cfop_target(env->emit, default_proj);
- be_emit_finish_line_gas(env->emit, default_proj);
-
- /*
- LDR %r12, .TABLE_X_START
- ADD %r12, %r12, [%1S, LSL #2]
- LDR %r15, %r12
- */
-
- be_emit_irprintf(env->emit, "\tldr %%r12, TABLE_%d_START", block_nr);
- be_emit_finish_line_gas(env->emit, NULL);
-
- be_emit_irprintf(env->emit, "\tadd %%r12, %%r12, ");
- arm_emit_source_register(env, irn, 0);
- be_emit_cstring(env->emit, ", LSL #2");
- be_emit_finish_line_gas(env->emit, NULL);
-
- be_emit_cstring(env->emit, "\tldr %r15, [%r12, #0]");
- be_emit_finish_line_gas(env->emit, NULL);
-
- be_emit_irprintf(env->emit, "TABLE_%d_START:\n\t.word\tTABLE_%d", block_nr, block_nr);
- be_emit_finish_line_gas(env->emit, NULL);
- be_emit_irprintf(env->emit, "\t.align 2");
- be_emit_finish_line_gas(env->emit, NULL);
- be_emit_irprintf(env->emit, "TABLE_%d:", block_nr);
- be_emit_finish_line_gas(env->emit, NULL);
-
- for (i = 0; i < n_projs; ++i) {
- proj = projs[i];
- if (proj == NULL) {
- proj = projs[get_arm_SwitchJmp_default_proj_num(irn)];
- }
- be_emit_cstring(env->emit, "\t.word\t");
- arm_emit_cfop_target(env->emit, proj);
- be_emit_finish_line_gas(env->emit, proj);
- }
- be_emit_irprintf(env->emit, "\t.align 2\n");
- be_emit_finish_line_gas(env->emit, NULL);
- xfree(projs);