-/**
- * Emit code for a Reload.
- */
-static void emit_be_Reload(arm_emit_env_t *env, const ir_node *irn) {
- ir_mode *mode = get_irn_mode(irn);
-
- if (mode_is_float(mode)) {
- if (USE_FPA(env->cg->isa)) {
- be_emit_cstring(env->emit, "\tldf ");
- } else {
- assert(0 && "reload not supported for this mode");
- panic("emit_be_Reload: reload not supported for this mode");
- }
- } else if (mode_is_dataM(mode)) {
- be_emit_cstring(env->emit, "\tldr ");
- } else {
- assert(0 && "reload not supported for this mode");
- panic("emit_be_Reload: reload not supported for this mode");
- }
- arm_emit_dest_register(env, irn, 0);
- be_emit_cstring(env->emit, ", [");
- arm_emit_source_register(env, irn, 0);
- be_emit_cstring(env->emit, ", #");
- arm_emit_offset(env, irn);
- be_emit_char(env->emit, ']');
- be_emit_finish_line_gas(env->emit, irn);
-}
-
-static void emit_be_Perm(arm_emit_env_t *env, const ir_node *irn) {
- be_emit_cstring(env->emit, "\teor ");
- arm_emit_source_register(env, irn, 0);
- be_emit_cstring(env->emit, ", ");
- arm_emit_source_register(env, irn, 0);
- be_emit_cstring(env->emit, ", ");
- arm_emit_source_register(env, irn, 1);
- be_emit_finish_line_gas(env->emit, NULL);
-
- be_emit_cstring(env->emit, "\teor ");
- arm_emit_source_register(env, irn, 1);
- be_emit_cstring(env->emit, ", ");
- arm_emit_source_register(env, irn, 0);
- be_emit_cstring(env->emit, ", ");
- arm_emit_source_register(env, irn, 1);
- be_emit_finish_line_gas(env->emit, NULL);
-
- be_emit_cstring(env->emit, "\teor ");
- arm_emit_source_register(env, irn, 0);
- be_emit_cstring(env->emit, ", ");
- arm_emit_source_register(env, irn, 0);
- be_emit_cstring(env->emit, ", ");
- arm_emit_source_register(env, irn, 1);
- be_emit_finish_line_gas(env->emit, irn);
-}
-
-static void emit_be_StackParam(arm_emit_env_t *env, const ir_node *irn) {
- ir_mode *mode = get_irn_mode(irn);
+static void emit_be_MemPerm(const ir_node *node)
+{
+ int i;
+ int memperm_arity;
+ int sp_change = 0;
+
+ /* TODO: this implementation is slower than necessary.
+ The longterm goal is however to avoid the memperm node completely */
+
+ memperm_arity = be_get_MemPerm_entity_arity(node);
+ if (memperm_arity > 12)
+ panic("memperm with more than 12 inputs not supported yet");
+
+ for (i = 0; i < memperm_arity; ++i) {
+ int offset;
+ ir_entity *entity = be_get_MemPerm_in_entity(node, i);
+
+ /* spill register */
+ be_emit_irprintf("\tstr r%d, [sp, #-4]!", i);
+ be_emit_finish_line_gas(node);
+ sp_change += 4;
+ /* load from entity */
+ offset = get_entity_offset(entity) + sp_change;
+ be_emit_irprintf("\tldr r%d, [sp, #%d]", i, offset);
+ be_emit_finish_line_gas(node);
+ }