summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 *)