Ajout de pseudo-registres supplementaires pour le passage de plus de 6 arguments

git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@6596 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
master
Xavier Leroy 2004-08-12 14:29:25 +00:00
parent 357b5b7166
commit 6fbad77c8a
2 changed files with 13 additions and 3 deletions

View File

@ -39,13 +39,16 @@ let frame_size () = (* includes return address *)
let slot_offset loc cl =
match loc with
Incoming n -> frame_size() + n
Incoming n ->
assert (n >= 0);
frame_size() + n
| Local n ->
if cl = 0
then !stack_offset + n * 4
else !stack_offset + num_stack_slots.(0) * 4 + n * 8
| Outgoing n -> n
| Outgoing n ->
assert (n >= 0);
n
(* Record symbols used and defined - at the end generate extern for those
used but not defined *)
@ -75,6 +78,8 @@ let emit_align n = ` ALIGN {emit_int n}\n`
let emit_reg = function
{ loc = Reg r } ->
emit_string (register_name r)
| { loc = Stack(Incoming n | Outgoing n) } when n < 0 ->
`{emit_symbol "caml_extra_params"} + {emit_int (n + 64)}`
| { loc = Stack s; typ = Float } as r ->
let ofs = slot_offset s (register_class r) in
`REAL8 PTR {emit_int ofs}[esp]`
@ -823,6 +828,7 @@ let begin_assembly() =
` EXTERN _caml_young_ptr: DWORD\n`;
` EXTERN _caml_young_limit: DWORD\n`;
` EXTERN _caml_exception_pointer: DWORD\n`;
` EXTERN _caml_extra_params: DWORD\n`;
` EXTERN _caml_call_gc: PROC\n`;
` EXTERN _caml_c_call: PROC\n`;
` EXTERN _caml_allocN: PROC\n`;

View File

@ -275,3 +275,7 @@ _caml_system__frametable LABEL DWORD
WORD 0 ; no roots here
END
PUBLIC _caml_extra_params
_caml_extra_params LABEL DWORD
BYTE 64 DUP (?)