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-0dff7051ff02master
parent
357b5b7166
commit
6fbad77c8a
|
@ -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`;
|
||||
|
|
|
@ -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 (?)
|
||||
|
|
Loading…
Reference in New Issue