diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 1995-08-12 14:26:23 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 1995-08-12 14:26:23 +0000 |
commit | 937fece4e311e11edcc3f0651e7ea24ae46c6d16 (patch) | |
tree | c610bd572a8f5c5c4a0181eb5d23c8ac94c85846 /asmcomp/emit_sparc.mlp | |
parent | 4b86eee145dde92965b1c0c27f721ba972dddd4d (diff) | |
download | ocaml-937fece4e311e11edcc3f0651e7ea24ae46c6d16.tar.gz |
Introduction de Lcondbranch3.
coloring: plus de variete dans le choix d'un registre.
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@201 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'asmcomp/emit_sparc.mlp')
-rw-r--r-- | asmcomp/emit_sparc.mlp | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/asmcomp/emit_sparc.mlp b/asmcomp/emit_sparc.mlp index 1638011585..59f89d134f 100644 --- a/asmcomp/emit_sparc.mlp +++ b/asmcomp/emit_sparc.mlp @@ -524,31 +524,31 @@ let emit_instr i = ` be {emit_label lbl}\n`; ` nop\n` end - | Lswitch jumptbl -> - (* Switches with 1 or 2 cases have normally been eliminated before *) - (* Do something for 3 cases *) - let lbl_jumptbl = new_label() in - begin match Array.length jumptbl with - 3 -> - ` cmp {emit_reg i.arg.(0)}, 1\n`; - ` bl {emit_label jumptbl.(0)}\n`; - ` nop\n`; - ` be {emit_label jumptbl.(1)}\n`; - ` nop\n`; - ` b {emit_label jumptbl.(2)}\n`; - ` nop\n` - | _ -> - ` sethi %hi({emit_label lbl_jumptbl}), %g1\n`; - ` or %g1, %lo({emit_label lbl_jumptbl}), %g1\n`; - ` sll {emit_reg i.arg.(0)}, 2, %g4\n`; - ` ld [%g1 + %g4], %g1\n`; - ` jmp %g1\n`; - ` nop\n`; - `{emit_label lbl_jumptbl}:`; - for i = 0 to Array.length jumptbl - 1 do - ` .word {emit_label jumptbl.(i)}\n` - done + | Lcondbranch3(lbl0, lbl1, lbl2) -> + ` cmp {emit_reg i.arg.(0)}, 1\n`; + begin match lbl0 with + None -> () + | Some lbl -> ` bl {emit_label lbl}\n nop\n` + end; + begin match lbl1 with + None -> () + | Some lbl -> ` be {emit_label lbl}\n nop\n` + end; + begin match lbl2 with + None -> () + | Some lbl -> ` bg {emit_label lbl}\n nop\n` end + | Lswitch jumptbl -> + ` sethi %hi({emit_label lbl_jumptbl}), %g1\n`; + ` or %g1, %lo({emit_label lbl_jumptbl}), %g1\n`; + ` sll {emit_reg i.arg.(0)}, 2, %g4\n`; + ` ld [%g1 + %g4], %g1\n`; + ` jmp %g1\n`; + ` nop\n`; + `{emit_label lbl_jumptbl}:`; + for i = 0 to Array.length jumptbl - 1 do + ` .word {emit_label jumptbl.(i)}\n` + done | Lsetuptrap lbl -> ` call {emit_label lbl}\n`; ` mov %o7, %g4\n` (* in delay slot *) |