summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--asmcomp/power/emit.mlp18
1 files changed, 12 insertions, 6 deletions
diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp
index 1c8132eba..ceb269f31 100644
--- a/asmcomp/power/emit.mlp
+++ b/asmcomp/power/emit.mlp
@@ -448,7 +448,8 @@ let rec emit_instr i dslot =
` addi {emit_gpr 1}, {emit_gpr 1}, {emit_int n}\n`;
` mtlr {emit_gpr 11}\n`
end else begin
- ` addi {emit_gpr 1}, {emit_gpr 1}, {emit_int n}\n`
+ if n > 0 then
+ ` addi {emit_gpr 1}, {emit_gpr 1}, {emit_int n}\n`
end;
` bctr\n`
| Lop(Itailcall_imm s) ->
@@ -461,7 +462,8 @@ let rec emit_instr i dslot =
` addi {emit_gpr 1}, {emit_gpr 1}, {emit_int n}\n`;
` mtlr {emit_gpr 11}\n`
end else begin
- ` addi {emit_gpr 1}, {emit_gpr 1}, {emit_int n}\n`
+ if n > 0 then
+ ` addi {emit_gpr 1}, {emit_gpr 1}, {emit_int n}\n`
end;
` b {emit_codesymbol s}\n`
end else begin
@@ -484,7 +486,8 @@ let rec emit_instr i dslot =
` lwz 0, 0(12)\n`;
` lwz 2, 4(12)\n`;
` mtctr 0\n`;
- ` addi 1, 1, {emit_int n}\n`
+ if n > 0 then
+ ` addi 1, 1, {emit_int n}\n`
end;
` bctr\n`
end
@@ -634,7 +637,8 @@ let rec emit_instr i dslot =
` mtlr {emit_gpr 11}\n`
| Lreturn ->
let n = frame_size() in
- ` addi {emit_gpr 1}, {emit_gpr 1}, {emit_int n}\n`;
+ if n > 0 then
+ ` addi {emit_gpr 1}, {emit_gpr 1}, {emit_int n}\n`;
` blr\n`
| Llabel lbl ->
`{emit_label lbl}:\n`
@@ -817,8 +821,10 @@ let fundecl fundecl =
` mflr {emit_gpr 0}\n`;
` addi {emit_gpr 1}, {emit_gpr 1}, {emit_int(-n)}\n`;
` stw {emit_gpr 0}, {emit_int(n - 4)}({emit_gpr 1})\n`
- end else
- ` addi {emit_gpr 1}, {emit_gpr 1}, {emit_int(-n)}\n`;
+ end else begin
+ if n > 0 then
+ ` addi {emit_gpr 1}, {emit_gpr 1}, {emit_int(-n)}\n`
+ end;
`{emit_label !tailrec_entry_point}:\n`;
emit_all fundecl.fun_body;
(* Emit the glue code to call the GC *)