summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamien Doligez <damien.doligez-inria.fr>2000-03-06 14:52:19 +0000
committerDamien Doligez <damien.doligez-inria.fr>2000-03-06 14:52:19 +0000
commit836c41cd32eeb63af260c4bf35c3d6437bbd619c (patch)
treea3111e5eb3336b3f5dd01b15192108d9b1bf1780
parent9c705cb7c8c53800ac60018ee2e6e0d9a9ac8336 (diff)
Fix PR#48 (plus general)
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@2905 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r--asmcomp/selectgen.ml21
1 files changed, 13 insertions, 8 deletions
diff --git a/asmcomp/selectgen.ml b/asmcomp/selectgen.ml
index 0000c6184..62996b870 100644
--- a/asmcomp/selectgen.ml
+++ b/asmcomp/selectgen.ml
@@ -566,14 +566,19 @@ method private emit_stores env data regs_addr addr =
List.iter
(fun e ->
let (op, arg) = self#select_store !a e in
- let r = self#emit_expr env arg in
- let op' =
- match op with
- | Istore(_, addr) when Array.length r > 0 && r.(0).typ = Float
- -> Istore(Double, addr)
- | _ -> op in
- self#insert (Iop op') (Array.append r regs_addr) [||];
- a := Arch.offset_addressing !a (size_expr env e))
+ let regs = self#emit_expr env arg in
+ match op with
+ Istore(_, _) ->
+ for i = 0 to Array.length regs - 1 do
+ let r = regs.(i) in
+ let kind = if r.typ = Float then Double else Word in
+ self#insert (Iop(Istore(kind, !a)))
+ (Array.append [|r|] regs_addr) [||];
+ a := Arch.offset_addressing !a (size_component r.typ)
+ done
+ | _ ->
+ self#insert (Iop op) (Array.append regs regs_addr) [||];
+ a := Arch.offset_addressing !a (size_expr env e))
data
(* Same, but in tail position *)