summaryrefslogtreecommitdiff
path: root/asmcomp/amd64/reload.ml
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2003-06-30 08:28:48 +0000
committerXavier Leroy <xavier.leroy@inria.fr>2003-06-30 08:28:48 +0000
commitbc333918980b97a2c81031ec33e72a417f854376 (patch)
treedd10bc370312a75e463eb5a1aebf341d1b590932 /asmcomp/amd64/reload.ml
parentc43e3a3d6ea16d63b28af9ac5b865252b13b9e5a (diff)
downloadocaml-bc333918980b97a2c81031ec33e72a417f854376.tar.gz
Portage AMD64
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@5634 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'asmcomp/amd64/reload.ml')
-rw-r--r--asmcomp/amd64/reload.ml113
1 files changed, 113 insertions, 0 deletions
diff --git a/asmcomp/amd64/reload.ml b/asmcomp/amd64/reload.ml
new file mode 100644
index 0000000000..f186044421
--- /dev/null
+++ b/asmcomp/amd64/reload.ml
@@ -0,0 +1,113 @@
+(***********************************************************************)
+(* *)
+(* Objective Caml *)
+(* *)
+(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
+(* *)
+(* Copyright 2000 Institut National de Recherche en Informatique et *)
+(* en Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the Q Public License version 1.0. *)
+(* *)
+(***********************************************************************)
+
+(* $Id$ *)
+
+open Cmm
+open Arch
+open Reg
+open Mach
+
+(* Reloading for the AMD64 *)
+
+(* Summary of instruction set constraints:
+ "S" means either stack or register, "R" means register only.
+ Operation Res Arg1 Arg2
+ Imove R S
+ or S R
+ Iconst_int S
+ Iconst_float R
+ Iconst_symbol S
+ Icall_ind R
+ Itailcall_ind R
+ Iload R R R
+ Istore R R
+ Iintop(Icomp) R R S
+ or S S R
+ Iintop(Imul|Idiv|mod) R R S
+ Iintop(shift) S S R
+ Iintop(others) R R S
+ or S S R
+ Iintop_imm(Iadd, n)/lea R R
+ Iintop_imm(others) S S
+ Inegf...Idivf R R S
+ Ifloatofint R S
+ Iintoffloat R S
+ Ispecific(Ilea) R R R
+ Ispecific(Ifloatarithmem) R R R
+
+ Conditional branches:
+ Iinttest S R
+ or R S
+ Ifloattest R S
+ other tests S
+*)
+
+let stackp r =
+ match r.loc with
+ Stack _ -> true
+ | _ -> false
+
+class reload = object (self)
+
+inherit Reloadgen.reload_generic as super
+
+method reload_operation op arg res =
+ match op with
+ Iintop(Iadd|Isub|Iand|Ior|Ixor|Icomp _|Icheckbound) ->
+ (* One of the two arguments can reside in the stack, but not both *)
+ if stackp arg.(0) && stackp arg.(1)
+ then ([|arg.(0); self#makereg arg.(1)|], res)
+ else (arg, res)
+ | Iintop_imm(Iadd, _) when arg.(0).loc <> res.(0).loc ->
+ (* This add will be turned into a lea; args and results must be
+ in registers *)
+ super#reload_operation op arg res
+ | Iconst_int _ | Iconst_symbol _
+ | Iintop(Idiv | Imod | Ilsl | Ilsr | Iasr)
+ | Iintop_imm(_, _) ->
+ (* The argument(s) and results can be either in register or on stack *)
+ (* Note: Idiv, Imod: arg(0) and res(0) already forced in regs
+ Ilsl, Ilsr, Iasr: arg(1) already forced in regs *)
+ (arg, res)
+ | Iintop(Imul) | Iaddf | Isubf | Imulf | Idivf ->
+ (* First argument (= result) must be in register, second arg
+ can reside in the stack *)
+ if stackp arg.(0)
+ then (let r = self#makereg arg.(0) in ([|r; arg.(1)|], [|r|]))
+ else (arg, res)
+ | Ifloatofint | Iintoffloat ->
+ (* Result must be in register, but argument can be on stack *)
+ (arg, (if stackp res.(0) then [| self#makereg res.(0) |] else res))
+ | _ -> (* Other operations: all args and results in registers *)
+ super#reload_operation op arg res
+
+method reload_test tst arg =
+ match tst with
+ Iinttest cmp ->
+ (* One of the two arguments can reside on stack *)
+ if stackp arg.(0) && stackp arg.(1)
+ then [| self#makereg arg.(0); arg.(1) |]
+ else arg
+ | Ifloattest(_, _) ->
+ (* Second argument can be on stack, first must be in register *)
+ if stackp arg.(0)
+ then [| self#makereg arg.(0); arg.(1) |]
+ else arg
+ | _ ->
+ (* The argument(s) can be either in register or on stack *)
+ arg
+
+end
+
+let fundecl f =
+ (new reload)#fundecl f