@@ -882,10 +882,10 @@ let unboxed_float_array_ref arr ofs dbg =
882
882
Cop
883
883
(Cload (Double , Mutable ), [array_indexing log2_size_float arr ofs dbg], dbg)
884
884
885
- let float_array_ref arr ofs dbg =
886
- box_float dbg Lambda. alloc_heap (unboxed_float_array_ref arr ofs dbg)
885
+ let float_array_ref mode arr ofs dbg =
886
+ box_float dbg mode (unboxed_float_array_ref arr ofs dbg)
887
887
888
- let addr_array_set arr ofs newval dbg =
888
+ let addr_array_set_heap arr ofs newval dbg =
889
889
Cop
890
890
( Cextcall
891
891
{ func = " caml_modify" ;
@@ -915,6 +915,25 @@ let addr_array_set_local arr ofs newval dbg =
915
915
[arr; untag_int ofs dbg; newval],
916
916
dbg )
917
917
918
+ let addr_array_set (mode : Lambda.modify_mode ) arr ofs newval dbg =
919
+ match mode with
920
+ | Modify_heap -> addr_array_set_heap arr ofs newval dbg
921
+ | Modify_maybe_stack -> addr_array_set_local arr ofs newval dbg
922
+
923
+ (* int and float arrays can be written to uniformly regardless of their mode *)
924
+
925
+ let int_array_set arr ofs newval dbg =
926
+ Cop
927
+ ( Cstore (Word_int , Assignment ),
928
+ [array_indexing log2_size_addr arr ofs dbg; newval],
929
+ dbg )
930
+
931
+ let float_array_set arr ofs newval dbg =
932
+ Cop
933
+ ( Cstore (Double , Assignment ),
934
+ [array_indexing log2_size_float arr ofs dbg; newval],
935
+ dbg )
936
+
918
937
let addr_array_initialize arr ofs newval dbg =
919
938
Cop
920
939
( Cextcall
@@ -930,18 +949,6 @@ let addr_array_initialize arr ofs newval dbg =
930
949
[array_indexing log2_size_addr arr ofs dbg; newval],
931
950
dbg )
932
951
933
- let int_array_set arr ofs newval dbg =
934
- Cop
935
- ( Cstore (Word_int , Assignment ),
936
- [array_indexing log2_size_addr arr ofs dbg; newval],
937
- dbg )
938
-
939
- let float_array_set arr ofs newval dbg =
940
- Cop
941
- ( Cstore (Double , Assignment ),
942
- [array_indexing log2_size_float arr ofs dbg; newval],
943
- dbg )
944
-
945
952
(* Get the field of a block given a possibly inconstant index *)
946
953
947
954
let get_field_computed imm_or_ptr mut ~block ~index dbg =
@@ -3281,28 +3288,28 @@ let bigstring_load size unsafe mode arg1 arg2 dbg =
3281
3288
check_bound unsafe size dbg (bigstring_length ba dbg) idx
3282
3289
(unaligned_load size ba_data idx dbg)))))
3283
3290
3284
- let arrayref_unsafe kind arg1 arg2 dbg =
3285
- match (kind : Lambda.array_kind ) with
3286
- | Pgenarray ->
3291
+ let arrayref_unsafe rkind arg1 arg2 dbg =
3292
+ match (rkind : Lambda.array_ref_kind ) with
3293
+ | Pgenarray_ref mode ->
3287
3294
bind " index" arg2 (fun idx ->
3288
3295
bind " arr" arg1 (fun arr ->
3289
3296
Cifthenelse
3290
3297
( is_addr_array_ptr arr dbg,
3291
3298
dbg,
3292
3299
addr_array_ref arr idx dbg,
3293
3300
dbg,
3294
- float_array_ref arr idx dbg,
3301
+ float_array_ref mode arr idx dbg,
3295
3302
dbg,
3296
3303
Any )))
3297
- | Paddrarray -> addr_array_ref arg1 arg2 dbg
3298
- | Pintarray ->
3304
+ | Paddrarray_ref -> addr_array_ref arg1 arg2 dbg
3305
+ | Pintarray_ref ->
3299
3306
(* CR mshinwell: for int/addr_array_ref move "dbg" to first arg *)
3300
3307
int_array_ref arg1 arg2 dbg
3301
- | Pfloatarray -> float_array_ref arg1 arg2 dbg
3308
+ | Pfloatarray_ref mode -> float_array_ref mode arg1 arg2 dbg
3302
3309
3303
- let arrayref_safe kind arg1 arg2 dbg =
3304
- match (kind : Lambda.array_kind ) with
3305
- | Pgenarray ->
3310
+ let arrayref_safe rkind arg1 arg2 dbg =
3311
+ match (rkind : Lambda.array_ref_kind ) with
3312
+ | Pgenarray_ref mode ->
3306
3313
bind " index" arg2 (fun idx ->
3307
3314
bind " arr" arg1 (fun arr ->
3308
3315
bind " header" (get_header_without_profinfo arr dbg) (fun hdr ->
@@ -3316,7 +3323,7 @@ let arrayref_safe kind arg1 arg2 dbg =
3316
3323
dbg,
3317
3324
addr_array_ref arr idx dbg,
3318
3325
dbg,
3319
- float_array_ref arr idx dbg,
3326
+ float_array_ref mode arr idx dbg,
3320
3327
dbg,
3321
3328
Any ) )
3322
3329
else
@@ -3331,10 +3338,10 @@ let arrayref_safe kind arg1 arg2 dbg =
3331
3338
Csequence
3332
3339
( make_checkbound dbg
3333
3340
[float_array_length_shifted hdr dbg; idx],
3334
- float_array_ref arr idx dbg ),
3341
+ float_array_ref mode arr idx dbg ),
3335
3342
dbg,
3336
3343
Any ))))
3337
- | Paddrarray ->
3344
+ | Paddrarray_ref ->
3338
3345
bind " index" arg2 (fun idx ->
3339
3346
bind " arr" arg1 (fun arr ->
3340
3347
Csequence
@@ -3344,7 +3351,7 @@ let arrayref_safe kind arg1 arg2 dbg =
3344
3351
dbg;
3345
3352
idx ],
3346
3353
addr_array_ref arr idx dbg )))
3347
- | Pintarray ->
3354
+ | Pintarray_ref ->
3348
3355
bind " index" arg2 (fun idx ->
3349
3356
bind " arr" arg1 (fun arr ->
3350
3357
Csequence
@@ -3354,8 +3361,8 @@ let arrayref_safe kind arg1 arg2 dbg =
3354
3361
dbg;
3355
3362
idx ],
3356
3363
int_array_ref arr idx dbg )))
3357
- | Pfloatarray ->
3358
- box_float dbg Lambda. alloc_heap
3364
+ | Pfloatarray_ref mode ->
3365
+ box_float dbg mode
3359
3366
(bind " index" arg2 (fun idx ->
3360
3367
bind " arr" arg1 (fun arr ->
3361
3368
Csequence
@@ -3371,7 +3378,7 @@ type ternary_primitive =
3371
3378
3372
3379
let setfield_computed ptr init arg1 arg2 arg3 dbg =
3373
3380
match assignment_kind ptr init with
3374
- | Caml_modify -> return_unit dbg (addr_array_set arg1 arg2 arg3 dbg)
3381
+ | Caml_modify -> return_unit dbg (addr_array_set_heap arg1 arg2 arg3 dbg)
3375
3382
| Caml_modify_local ->
3376
3383
return_unit dbg (addr_array_set_local arg1 arg2 arg3 dbg)
3377
3384
| Caml_initialize ->
@@ -3398,29 +3405,29 @@ let bytesset_safe arg1 arg2 arg3 dbg =
3398
3405
[add_int str idx dbg; ignore_high_bit_int newval],
3399
3406
dbg ) )))))
3400
3407
3401
- let arrayset_unsafe kind arg1 arg2 arg3 dbg =
3408
+ let arrayset_unsafe skind arg1 arg2 arg3 dbg =
3402
3409
return_unit dbg
3403
- (match (kind : Lambda.array_kind ) with
3404
- | Pgenarray ->
3410
+ (match (skind : Lambda.array_set_kind ) with
3411
+ | Pgenarray_set mode ->
3405
3412
bind " newval" arg3 (fun newval ->
3406
3413
bind " index" arg2 (fun index ->
3407
3414
bind " arr" arg1 (fun arr ->
3408
3415
Cifthenelse
3409
3416
( is_addr_array_ptr arr dbg,
3410
3417
dbg,
3411
- addr_array_set arr index newval dbg,
3418
+ addr_array_set mode arr index newval dbg,
3412
3419
dbg,
3413
3420
float_array_set arr index (unbox_float dbg newval) dbg,
3414
3421
dbg,
3415
3422
Any ))))
3416
- | Paddrarray -> addr_array_set arg1 arg2 arg3 dbg
3417
- | Pintarray -> int_array_set arg1 arg2 arg3 dbg
3418
- | Pfloatarray -> float_array_set arg1 arg2 arg3 dbg)
3423
+ | Paddrarray_set mode -> addr_array_set mode arg1 arg2 arg3 dbg
3424
+ | Pintarray_set -> int_array_set arg1 arg2 arg3 dbg
3425
+ | Pfloatarray_set -> float_array_set arg1 arg2 arg3 dbg)
3419
3426
3420
- let arrayset_safe kind arg1 arg2 arg3 dbg =
3427
+ let arrayset_safe skind arg1 arg2 arg3 dbg =
3421
3428
return_unit dbg
3422
- (match (kind : Lambda.array_kind ) with
3423
- | Pgenarray ->
3429
+ (match (skind : Lambda.array_set_kind ) with
3430
+ | Pgenarray_set mode ->
3424
3431
bind " newval" arg3 (fun newval ->
3425
3432
bind " index" arg2 (fun idx ->
3426
3433
bind " arr" arg1 (fun arr ->
@@ -3434,7 +3441,7 @@ let arrayset_safe kind arg1 arg2 arg3 dbg =
3434
3441
Cifthenelse
3435
3442
( is_addr_array_hdr hdr dbg,
3436
3443
dbg,
3437
- addr_array_set arr idx newval dbg,
3444
+ addr_array_set mode arr idx newval dbg,
3438
3445
dbg,
3439
3446
float_array_set arr idx (unbox_float dbg newval)
3440
3447
dbg,
@@ -3447,7 +3454,7 @@ let arrayset_safe kind arg1 arg2 arg3 dbg =
3447
3454
Csequence
3448
3455
( make_checkbound dbg
3449
3456
[addr_array_length_shifted hdr dbg; idx],
3450
- addr_array_set arr idx newval dbg ),
3457
+ addr_array_set mode arr idx newval dbg ),
3451
3458
dbg,
3452
3459
Csequence
3453
3460
( make_checkbound dbg
@@ -3456,7 +3463,7 @@ let arrayset_safe kind arg1 arg2 arg3 dbg =
3456
3463
dbg ),
3457
3464
dbg,
3458
3465
Any )))))
3459
- | Paddrarray ->
3466
+ | Paddrarray_set mode ->
3460
3467
bind " newval" arg3 (fun newval ->
3461
3468
bind " index" arg2 (fun idx ->
3462
3469
bind " arr" arg1 (fun arr ->
@@ -3466,8 +3473,8 @@ let arrayset_safe kind arg1 arg2 arg3 dbg =
3466
3473
(get_header_without_profinfo arr dbg)
3467
3474
dbg;
3468
3475
idx ],
3469
- addr_array_set arr idx newval dbg ))))
3470
- | Pintarray ->
3476
+ addr_array_set mode arr idx newval dbg ))))
3477
+ | Pintarray_set ->
3471
3478
bind " newval" arg3 (fun newval ->
3472
3479
bind " index" arg2 (fun idx ->
3473
3480
bind " arr" arg1 (fun arr ->
@@ -3478,7 +3485,7 @@ let arrayset_safe kind arg1 arg2 arg3 dbg =
3478
3485
dbg;
3479
3486
idx ],
3480
3487
int_array_set arr idx newval dbg ))))
3481
- | Pfloatarray ->
3488
+ | Pfloatarray_set ->
3482
3489
bind_load " newval" arg3 (fun newval ->
3483
3490
bind " index" arg2 (fun idx ->
3484
3491
bind " arr" arg1 (fun arr ->
0 commit comments