Petite optimisation vis-a-vis du GC

git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@1664 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
master
Xavier Leroy 1997-07-27 09:43:09 +00:00
parent 1f1156a368
commit e14f372e05
1 changed files with 13 additions and 9 deletions

View File

@ -30,7 +30,7 @@ open Emitaux
let instr_copy i next =
{ desc = i.desc; next = next; arg = i.arg; res = i.res; live = i.live }
let insert_load_gp i =
let insert_load_gp f =
let labels_needing_gp = ref LabelSet.empty in
let fixpoint_reached = ref false in
@ -98,7 +98,7 @@ let insert_load_gp i =
while not !fixpoint_reached do
fixpoint_reached := true;
needs_gp i
needs_gp f.fun_body
done;
(* Insert Ireloadgp instructions after calls where needed *)
@ -120,7 +120,9 @@ let insert_load_gp i =
(new_instr, instr_needs_gp needs_next i.desc)
end in
insert_reload_gp i
{ fun_body = insert_reload_gp f.fun_body;
fun_name = f.fun_name;
fun_fast = f.fun_fast }
(* Second pass: code generation proper *)
@ -632,7 +634,7 @@ let emit_instr i =
` br {emit_label jumptbl.(i)}\n`
done;
`{emit_label lbl_jump}: s4addq {emit_reg i.arg.(0)}, $25, $25\n`;
` jmp ($25)\n`
` jmp ($25), {emit_label jumptbl.(0)}\n`
| Lsetuptrap lbl ->
` br $25, {emit_label lbl}\n`
| Lpushtrap ->
@ -658,8 +660,7 @@ let rec emit_all i =
(* Emission of a function declaration *)
let fundecl fundecl =
let (body, needs_gp) = insert_load_gp fundecl.fun_body in
let emit_fundecl (fundecl, needs_gp) =
function_name := fundecl.fun_name;
fastcode_flag := fundecl.fun_fast;
stack_offset := 0;
@ -692,7 +693,7 @@ let fundecl fundecl =
` .prologue {emit_int(if needs_gp then 1 else 0)}\n`;
tailrec_entry_point := new_label();
`{emit_label !tailrec_entry_point}:\n`;
emit_all body;
emit_all fundecl.fun_body;
List.iter emit_call_gc !call_gc_sites;
if !range_check_trap > 0 then begin
`{emit_label !range_check_trap}:\n`;
@ -700,6 +701,9 @@ let fundecl fundecl =
end;
` .end {emit_symbol fundecl.fun_name}\n`
let fundecl f =
emit_fundecl (insert_load_gp f)
(* Emission of data *)
let emit_item = function
@ -707,7 +711,7 @@ let emit_item = function
` .globl {emit_symbol s}\n`;
`{emit_symbol s}:\n`
| Cdefine_label lbl ->
`{emit_label (10000 + lbl)}:\n`
`{emit_label (100000 + lbl)}:\n`
| Cint8 n ->
` .byte {emit_int n}\n`
| Cint16 n ->
@ -719,7 +723,7 @@ let emit_item = function
| Csymbol_address s ->
` .quad {emit_symbol s}\n`
| Clabel_address lbl ->
` .quad {emit_label (10000 + lbl)}\n`
` .quad {emit_label (100000 + lbl)}\n`
| Cstring s ->
emit_string_directive " .ascii " s
| Cskip n ->