diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 1998-06-22 12:43:04 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 1998-06-22 12:43:04 +0000 |
commit | 5ac8854085a397a80c3e5864451687eaa9fbd043 (patch) | |
tree | ec3c19eaedfeacb58a726a6790a6435967f83aab | |
parent | a859063f3b28b02bb13a9dfbe39042c5c27cd20e (diff) |
Eviter d'emettre des addi 1, 1, 0 en cas de fonction qui n'utilise pas la pile
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@1988 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r-- | asmcomp/power/emit.mlp | 18 |
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 *) |