summaryrefslogtreecommitdiff
path: root/asmcomp
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2011-12-22 09:14:22 +0000
committerXavier Leroy <xavier.leroy@inria.fr>2011-12-22 09:14:22 +0000
commit5c0f191601d10218e7d33e721c745b58a782939c (patch)
tree8cd987fd49c174c1f9103f741ecf08530b18d88e /asmcomp
parent38e4e84f7e7f45a3c193e6d1298372dc36e16dea (diff)
downloadocaml-5c0f191601d10218e7d33e721c745b58a782939c.tar.gz
PR#5360: on 64-bit platforms, generate more compact code for Parrayrefs and Parraysets.
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@11932 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'asmcomp')
-rw-r--r--asmcomp/cmmgen.ml49
1 files changed, 31 insertions, 18 deletions
diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml
index 61fef31b80..89b3436366 100644
--- a/asmcomp/cmmgen.ml
+++ b/asmcomp/cmmgen.ml
@@ -1228,15 +1228,21 @@ and transl_prim_2 p arg1 arg2 dbg =
end
| Parrayrefs kind ->
begin match kind with
- Pgenarray ->
+ | Pgenarray ->
bind "index" (transl arg2) (fun idx ->
- bind "arr" (transl arg1) (fun arr ->
- bind "header" (header arr) (fun hdr ->
- Cifthenelse(is_addr_array_hdr hdr,
- Csequence(Cop(Ccheckbound dbg, [addr_array_length hdr; idx]),
- addr_array_ref arr idx),
- Csequence(Cop(Ccheckbound dbg, [float_array_length hdr; idx]),
- float_array_ref arr idx)))))
+ bind "arr" (transl arg1) (fun arr ->
+ bind "header" (header arr) (fun hdr ->
+ if wordsize_shift = numfloat_shift then
+ Csequence(Cop(Ccheckbound dbg, [addr_array_length hdr; idx]),
+ Cifthenelse(is_addr_array_hdr hdr,
+ addr_array_ref arr idx,
+ float_array_ref arr idx))
+ else
+ Cifthenelse(is_addr_array_hdr hdr,
+ Csequence(Cop(Ccheckbound dbg, [addr_array_length hdr; idx]),
+ addr_array_ref arr idx),
+ Csequence(Cop(Ccheckbound dbg, [float_array_length hdr; idx]),
+ float_array_ref arr idx)))))
| Paddrarray | Pintarray ->
bind "index" (transl arg2) (fun idx ->
bind "arr" (transl arg1) (fun arr ->
@@ -1339,17 +1345,24 @@ and transl_prim_3 p arg1 arg2 arg3 dbg =
end)
| Parraysets kind ->
return_unit(begin match kind with
- Pgenarray ->
+ | Pgenarray ->
bind "newval" (transl arg3) (fun newval ->
- bind "index" (transl arg2) (fun idx ->
- bind "arr" (transl arg1) (fun arr ->
- bind "header" (header arr) (fun hdr ->
- Cifthenelse(is_addr_array_hdr hdr,
- Csequence(Cop(Ccheckbound dbg, [addr_array_length hdr; idx]),
- addr_array_set arr idx newval),
- Csequence(Cop(Ccheckbound dbg, [float_array_length hdr; idx]),
- float_array_set arr idx
- (unbox_float newval)))))))
+ bind "index" (transl arg2) (fun idx ->
+ bind "arr" (transl arg1) (fun arr ->
+ bind "header" (header arr) (fun hdr ->
+ if wordsize_shift = numfloat_shift then
+ Csequence(Cop(Ccheckbound dbg, [addr_array_length hdr; idx]),
+ Cifthenelse(is_addr_array_hdr hdr,
+ addr_array_set arr idx newval,
+ float_array_set arr idx
+ (unbox_float newval)))
+ else
+ Cifthenelse(is_addr_array_hdr hdr,
+ Csequence(Cop(Ccheckbound dbg, [addr_array_length hdr; idx]),
+ addr_array_set arr idx newval),
+ Csequence(Cop(Ccheckbound dbg, [float_array_length hdr; idx]),
+ float_array_set arr idx
+ (unbox_float newval)))))))
| Paddrarray ->
bind "index" (transl arg2) (fun idx ->
bind "arr" (transl arg1) (fun arr ->