diff options
author | Zoltan Varga <vargaz@gmail.com> | 2016-03-17 13:14:41 +0300 |
---|---|---|
committer | Alexis Christoforides <alexis@thenull.net> | 2016-03-22 22:48:53 +0300 |
commit | d2a0cd87a0d500f73dd8c324e68a93474b1a9d0c (patch) | |
tree | 532e89ad6137b66b8714ab0d42ae2f6acc509581 | |
parent | 832de4b8b4537fd2fc91bfc41f92414b789e446d (diff) |
[arm] Avoid storing fp arguments below the stack pointer if the param area has size 0. Fixes #38161.mono-4.2.0-branch-c6sr2
-rw-r--r-- | mono/mini/mini-arm.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/mono/mini/mini-arm.c b/mono/mini/mini-arm.c index addb060e58c..c143423b38b 100644 --- a/mono/mini/mini-arm.c +++ b/mono/mini/mini-arm.c @@ -2332,6 +2332,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) } else { int creg; + cfg->param_area = MAX (cfg->param_area, 8); MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORER4_MEMBASE_REG, ARMREG_SP, (cfg->param_area - 8), in->dreg); creg = mono_alloc_ireg (cfg); MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOAD_MEMBASE, creg, ARMREG_SP, (cfg->param_area - 8)); @@ -2353,6 +2354,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) } else { int creg; + cfg->param_area = MAX (cfg->param_area, 8); MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORER8_MEMBASE_REG, ARMREG_SP, (cfg->param_area - 8), in->dreg); creg = mono_alloc_ireg (cfg); MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOAD_MEMBASE, creg, ARMREG_SP, (cfg->param_area - 8)); @@ -2424,6 +2426,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) /* This should work for soft-float as well */ + cfg->param_area = MAX (cfg->param_area, 8); MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORER8_MEMBASE_REG, ARMREG_SP, (cfg->param_area - 8), in->dreg); creg = mono_alloc_ireg (cfg); mono_call_inst_add_outarg_reg (cfg, call, creg, ARMREG_R3, FALSE); |