diff options
author | Damien Doligez <damien.doligez-inria.fr> | 2000-03-06 14:52:19 +0000 |
---|---|---|
committer | Damien Doligez <damien.doligez-inria.fr> | 2000-03-06 14:52:19 +0000 |
commit | 836c41cd32eeb63af260c4bf35c3d6437bbd619c (patch) | |
tree | a3111e5eb3336b3f5dd01b15192108d9b1bf1780 | |
parent | 9c705cb7c8c53800ac60018ee2e6e0d9a9ac8336 (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.ml | 21 |
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 *) |