summaryrefslogtreecommitdiff
path: root/asmcomp/emit_sparc.mlp
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>1995-08-12 14:26:23 +0000
committerXavier Leroy <xavier.leroy@inria.fr>1995-08-12 14:26:23 +0000
commit937fece4e311e11edcc3f0651e7ea24ae46c6d16 (patch)
treec610bd572a8f5c5c4a0181eb5d23c8ac94c85846 /asmcomp/emit_sparc.mlp
parent4b86eee145dde92965b1c0c27f721ba972dddd4d (diff)
downloadocaml-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.mlp48
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 *)