diff options
| author | Graydon Hoare <[email protected]> | 2010-10-08 23:58:48 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-10-08 23:58:48 -0700 |
| commit | f956067867f176992261f305befd9c718aa4a028 (patch) | |
| tree | 137410b391aaf06405d60cf1b724b069283e186c /src/boot | |
| parent | Quad counters are revealing. Move drops out-of-line, cut 200kb from rustc. (diff) | |
| download | rust-f956067867f176992261f305befd9c718aa4a028.tar.xz rust-f956067867f176992261f305befd9c718aa4a028.zip | |
Implement a -minimal mode prologue, cut 100kb from rustc.
Diffstat (limited to 'src/boot')
| -rw-r--r-- | src/boot/be/x86.ml | 106 | ||||
| -rw-r--r-- | src/boot/me/trans.ml | 4 |
2 files changed, 78 insertions, 32 deletions
diff --git a/src/boot/be/x86.ml b/src/boot/be/x86.ml index 388c627a..d2d70ea2 100644 --- a/src/boot/be/x86.ml +++ b/src/boot/be/x86.ml @@ -1229,14 +1229,63 @@ let stack_growth_check Il.patch_jump e bypass_grow_upcall_jmp_pc e.Il.emit_pc ;; -let fn_prologue - (e:Il.emitter) +let n_glue_args = Int64.of_int Abi.worst_case_glue_call_args;; +let n_glue_words = Int64.mul word_sz n_glue_args;; + +let combined_frame_size (framesz:size) (callsz:size) + : size = + (* + * We double the reserved callsz because we need a 'temporary tail-call + * region' above the actual call region, in case there's a drop call at the + * end of assembling the tail-call args and before copying them to callee + * position. + *) + + let callsz = add_sz callsz callsz in + + (* + * Add in *another* word to handle an extra-awkward spill of the + * callee address that might occur during an indirect tail call. + *) + let callsz = add_sz (SIZE_fixed word_sz) callsz in + + (* + * Add in enough words for a glue-call (these occur underneath esp) + *) + let callsz = add_sz (SIZE_fixed n_glue_words) callsz in + + add_sz callsz framesz +;; + +let minimal_fn_prologue + (e:Il.emitter) + (call_and_frame_sz:Asm.expr64) + : unit = + + let emit = Il.emit e in + let mov dst src = emit (Il.umov dst src) in + let add dst src = emit (Il.binary Il.ADD dst (Il.Cell dst) src) in + let sub dst src = emit (Il.binary Il.SUB dst (Il.Cell dst) src) in + + (* See diagram and explanation in full_fn_prologue, below. *) + save_callee_saves e; + mov (rc ebp) (ro esp); (* Establish frame base. *) + sub (rc esp) (imm call_and_frame_sz); (* Establish a frame. *) + mov (rc edi) (ro esp); (* Zero the frame. *) + mov (rc ecx) (imm call_and_frame_sz); + emit (Il.unary Il.ZERO (word_at (h edi)) (ro ecx)); + (* Move esp back up over the glue region. *) + add (rc esp) (immi n_glue_words); +;; + +let full_fn_prologue + (e:Il.emitter) + (call_and_frame_sz:size) (nabi:nabi) (grow_task_fixup:fixup) (is_obj_fn:bool) - (_(*minimal*):bool) : unit = let esi_n = word_n (h esi) in @@ -1299,33 +1348,6 @@ let fn_prologue * callee-saves) before we perform the next check. *) - (* - * We double the reserved callsz because we need a 'temporary tail-call - * region' above the actual call region, in case there's a drop call at the - * end of assembling the tail-call args and before copying them to callee - * position. - *) - - let callsz = add_sz callsz callsz in - let n_glue_args = Int64.of_int Abi.worst_case_glue_call_args in - let n_glue_words = Int64.mul word_sz n_glue_args in - - (* - * Add in *another* word to handle an extra-awkward spill of the - * callee address that might occur during an indirect tail call. - *) - let callsz = add_sz (SIZE_fixed word_sz) callsz in - - (* - * Add in enough words for a glue-call (these occur underneath esp) - *) - let callsz = add_sz (SIZE_fixed n_glue_words) callsz in - - (* - * Cumulative dynamic-frame size. - *) - let call_and_frame_sz = add_sz callsz framesz in - (* Already have room to save regs on entry. *) save_callee_saves e; @@ -1393,6 +1415,30 @@ let fn_prologue add (rc esp) (immi n_glue_words); ;; +let fn_prologue + (e:Il.emitter) + (framesz:size) + (callsz:size) + (nabi:nabi) + (grow_task_fixup:fixup) + (is_obj_fn:bool) + (minimal:bool) + : unit = + + let call_and_frame_sz = combined_frame_size framesz callsz in + + let full _ = + full_fn_prologue e call_and_frame_sz nabi grow_task_fixup is_obj_fn + in + + if minimal + then + match Il.size_to_expr64 call_and_frame_sz with + None -> full() + | Some sz -> minimal_fn_prologue e sz + else + full() +;; let fn_epilogue (e:Il.emitter) : unit = diff --git a/src/boot/me/trans.ml b/src/boot/me/trans.ml index d4579211..d84c87a4 100644 --- a/src/boot/me/trans.ml +++ b/src/boot/me/trans.ml @@ -3477,7 +3477,7 @@ let trans_visitor * the non-zero refcount case (i.e. fall-through means zero refcount). *) and drop_refcount_and_cmp (boxed:Il.cell) : quad_idx = - in_quad_category "drop refcnt + free" + in_quad_category "refcount" begin fun _ -> iflog (fun _ -> annotate "drop refcount and maybe free"); @@ -3498,7 +3498,7 @@ let trans_visitor end and incr_refcount (boxed:Il.cell) : unit = - in_quad_category "incr refcnt" + in_quad_category "refcount" begin fun _ -> let rc = box_rc_cell boxed in |