@@ -148,6 +148,14 @@ let rec add_const c n dbg =
148148let incr_int c dbg = add_const c 1 dbg
149149let decr_int c dbg = add_const c (- 1 ) dbg
150150
151+ let offset_addr c1 c2 dbg =
152+ match c1, c2 with
153+ | c , Cconst_int (0 , _ ) -> c
154+ | c , Cconst_natint (0n , _ ) -> c
155+ | Cop (Cadda, [c ; Cconst_int(n1 , _ )], _ ), _ ->
156+ Cop (Cadda , [c; add_const c2 n1 dbg], dbg)
157+ | _ , _ -> Cop (Cadda , [c1; c2], dbg)
158+
151159let rec add_int c1 c2 dbg =
152160 match (c1, c2) with
153161 | (Cconst_int (n , _ ), c ) | (c , Cconst_int (n , _ )) ->
@@ -1100,20 +1108,21 @@ let make_unsigned_int bi arg dbg =
11001108
11011109let unaligned_load_16 ptr idx dbg =
11021110 if Arch. allow_unaligned_access
1103- then Cop (mk_load_mut Sixteen_unsigned , [add_int ptr idx dbg], dbg)
1111+ then Cop (mk_load_mut Sixteen_unsigned , [offset_addr ptr idx dbg], dbg)
11041112 else
11051113 let cconst_int i = Cconst_int (i, dbg) in
1106- let v1 = Cop (mk_load_mut Byte_unsigned , [add_int ptr idx dbg], dbg) in
1114+ let v1 = Cop (mk_load_mut Byte_unsigned , [offset_addr ptr idx dbg], dbg) in
11071115 let v2 = Cop (mk_load_mut Byte_unsigned ,
1108- [add_int (add_int ptr idx dbg) (cconst_int 1 ) dbg], dbg) in
1116+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 1 ) dbg],
1117+ dbg) in
11091118 let b1, b2 = if Arch. big_endian then v1, v2 else v2, v1 in
11101119 Cop (Cor , [lsl_int b1 (cconst_int 8 ) dbg; b2], dbg)
11111120
11121121let unaligned_set_16 ptr idx newval dbg =
11131122 if Arch. allow_unaligned_access
11141123 then
11151124 Cop (Cstore (Sixteen_unsigned , Assignment ),
1116- [add_int ptr idx dbg; newval], dbg)
1125+ [offset_addr ptr idx dbg; newval], dbg)
11171126 else
11181127 let cconst_int i = Cconst_int (i, dbg) in
11191128 let v1 =
@@ -1123,24 +1132,29 @@ let unaligned_set_16 ptr idx newval dbg =
11231132 let v2 = Cop (Cand , [newval; cconst_int 0xFF ], dbg) in
11241133 let b1, b2 = if Arch. big_endian then v1, v2 else v2, v1 in
11251134 Csequence (
1126- Cop (Cstore (Byte_unsigned , Assignment ), [add_int ptr idx dbg; b1], dbg),
1135+ Cop (Cstore (Byte_unsigned , Assignment ), [offset_addr ptr idx dbg; b1],
1136+ dbg),
11271137 Cop (Cstore (Byte_unsigned , Assignment ),
1128- [add_int (add_int ptr idx dbg) (cconst_int 1 ) dbg; b2], dbg))
1138+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 1 ) dbg; b2],
1139+ dbg))
11291140
11301141let unaligned_load_32 ptr idx dbg =
11311142 if Arch. allow_unaligned_access
1132- then Cop (mk_load_mut Thirtytwo_unsigned , [add_int ptr idx dbg], dbg)
1143+ then Cop (mk_load_mut Thirtytwo_unsigned , [offset_addr ptr idx dbg], dbg)
11331144 else
11341145 let cconst_int i = Cconst_int (i, dbg) in
1135- let v1 = Cop (mk_load_mut Byte_unsigned , [add_int ptr idx dbg], dbg) in
1146+ let v1 = Cop (mk_load_mut Byte_unsigned , [offset_addr ptr idx dbg], dbg) in
11361147 let v2 = Cop (mk_load_mut Byte_unsigned ,
1137- [add_int (add_int ptr idx dbg) (cconst_int 1 ) dbg], dbg)
1148+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 1 ) dbg],
1149+ dbg)
11381150 in
11391151 let v3 = Cop (mk_load_mut Byte_unsigned ,
1140- [add_int (add_int ptr idx dbg) (cconst_int 2 ) dbg], dbg)
1152+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 2 ) dbg],
1153+ dbg)
11411154 in
11421155 let v4 = Cop (mk_load_mut Byte_unsigned ,
1143- [add_int (add_int ptr idx dbg) (cconst_int 3 ) dbg], dbg)
1156+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 3 ) dbg],
1157+ dbg)
11441158 in
11451159 let b1, b2, b3, b4 =
11461160 if Arch. big_endian
@@ -1155,15 +1169,18 @@ let unaligned_load_32 ptr idx dbg =
11551169let unaligned_set_32 ptr idx newval dbg =
11561170 if Arch. allow_unaligned_access
11571171 then
1158- Cop (Cstore (Thirtytwo_unsigned , Assignment ), [add_int ptr idx dbg; newval],
1172+ Cop (Cstore (Thirtytwo_unsigned , Assignment ),
1173+ [offset_addr ptr idx dbg; newval],
11591174 dbg)
11601175 else
11611176 let cconst_int i = Cconst_int (i, dbg) in
11621177 let v1 =
1163- Cop (Cand , [Cop (Clsr , [newval; cconst_int 24 ], dbg); cconst_int 0xFF ], dbg)
1178+ Cop (Cand , [Cop (Clsr , [newval; cconst_int 24 ], dbg); cconst_int 0xFF ],
1179+ dbg)
11641180 in
11651181 let v2 =
1166- Cop (Cand , [Cop (Clsr , [newval; cconst_int 16 ], dbg); cconst_int 0xFF ], dbg)
1182+ Cop (Cand , [Cop (Clsr , [newval; cconst_int 16 ], dbg); cconst_int 0xFF ],
1183+ dbg)
11671184 in
11681185 let v3 =
11691186 Cop (Cand , [Cop (Clsr , [newval; cconst_int 8 ], dbg); cconst_int 0xFF ], dbg)
@@ -1176,38 +1193,48 @@ let unaligned_set_32 ptr idx newval dbg =
11761193 Csequence (
11771194 Csequence (
11781195 Cop (Cstore (Byte_unsigned , Assignment ),
1179- [add_int ptr idx dbg; b1], dbg),
1196+ [offset_addr ptr idx dbg; b1], dbg),
11801197 Cop (Cstore (Byte_unsigned , Assignment ),
1181- [add_int (add_int ptr idx dbg) (cconst_int 1 ) dbg; b2],
1198+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 1 ) dbg;
1199+ b2],
11821200 dbg)),
11831201 Csequence (
11841202 Cop (Cstore (Byte_unsigned , Assignment ),
1185- [add_int (add_int ptr idx dbg) (cconst_int 2 ) dbg; b3],
1203+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 2 ) dbg;
1204+ b3],
11861205 dbg),
11871206 Cop (Cstore (Byte_unsigned , Assignment ),
1188- [add_int (add_int ptr idx dbg) (cconst_int 3 ) dbg; b4],
1207+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 3 ) dbg;
1208+ b4],
11891209 dbg)))
11901210
11911211let unaligned_load_64 ptr idx dbg =
11921212 if Arch. allow_unaligned_access
1193- then Cop (mk_load_mut Word_int , [add_int ptr idx dbg], dbg)
1213+ then Cop (mk_load_mut Word_int , [offset_addr ptr idx dbg], dbg)
11941214 else
11951215 let cconst_int i = Cconst_int (i, dbg) in
1196- let v1 = Cop (mk_load_mut Byte_unsigned , [add_int ptr idx dbg], dbg) in
1216+ let v1 = Cop (mk_load_mut Byte_unsigned , [offset_addr ptr idx dbg], dbg) in
11971217 let v2 = Cop (mk_load_mut Byte_unsigned ,
1198- [add_int (add_int ptr idx dbg) (cconst_int 1 ) dbg], dbg) in
1218+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 1 ) dbg],
1219+ dbg) in
11991220 let v3 = Cop (mk_load_mut Byte_unsigned ,
1200- [add_int (add_int ptr idx dbg) (cconst_int 2 ) dbg], dbg) in
1221+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 2 ) dbg],
1222+ dbg) in
12011223 let v4 = Cop (mk_load_mut Byte_unsigned ,
1202- [add_int (add_int ptr idx dbg) (cconst_int 3 ) dbg], dbg) in
1224+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 3 ) dbg],
1225+ dbg) in
12031226 let v5 = Cop (mk_load_mut Byte_unsigned ,
1204- [add_int (add_int ptr idx dbg) (cconst_int 4 ) dbg], dbg) in
1227+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 4 ) dbg],
1228+ dbg) in
12051229 let v6 = Cop (mk_load_mut Byte_unsigned ,
1206- [add_int (add_int ptr idx dbg) (cconst_int 5 ) dbg], dbg) in
1230+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 5 ) dbg],
1231+ dbg) in
12071232 let v7 = Cop (mk_load_mut Byte_unsigned ,
1208- [add_int (add_int ptr idx dbg) (cconst_int 6 ) dbg], dbg) in
1233+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 6 ) dbg],
1234+ dbg) in
12091235 let v8 = Cop (mk_load_mut Byte_unsigned ,
1210- [add_int (add_int ptr idx dbg) (cconst_int 7 ) dbg], dbg) in
1236+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 7 ) dbg],
1237+ dbg) in
12111238 let b1, b2, b3, b4, b5, b6, b7, b8 =
12121239 if Arch. big_endian
12131240 then v1, v2, v3, v4, v5, v6, v7, v8
@@ -1228,7 +1255,8 @@ let unaligned_load_64 ptr idx dbg =
12281255
12291256let unaligned_set_64 ptr idx newval dbg =
12301257 if Arch. allow_unaligned_access
1231- then Cop (Cstore (Word_int , Assignment ), [add_int ptr idx dbg; newval], dbg)
1258+ then
1259+ Cop (Cstore (Word_int , Assignment ), [offset_addr ptr idx dbg; newval], dbg)
12321260 else
12331261 let cconst_int i = Cconst_int (i, dbg) in
12341262 let v1 =
@@ -1268,32 +1296,39 @@ let unaligned_set_64 ptr idx newval dbg =
12681296 Csequence (
12691297 Csequence (
12701298 Cop (Cstore (Byte_unsigned , Assignment ),
1271- [add_int ptr idx dbg; b1],
1299+ [offset_addr ptr idx dbg; b1],
12721300 dbg),
12731301 Cop (Cstore (Byte_unsigned , Assignment ),
1274- [add_int (add_int ptr idx dbg) (cconst_int 1 ) dbg; b2],
1302+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 1 )
1303+ dbg; b2],
12751304 dbg)),
12761305 Csequence (
12771306 Cop (Cstore (Byte_unsigned , Assignment ),
1278- [add_int (add_int ptr idx dbg) (cconst_int 2 ) dbg; b3],
1307+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 2 )
1308+ dbg; b3],
12791309 dbg),
12801310 Cop (Cstore (Byte_unsigned , Assignment ),
1281- [add_int (add_int ptr idx dbg) (cconst_int 3 ) dbg; b4],
1311+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 3 )
1312+ dbg; b4],
12821313 dbg))),
12831314 Csequence (
12841315 Csequence (
12851316 Cop (Cstore (Byte_unsigned , Assignment ),
1286- [add_int (add_int ptr idx dbg) (cconst_int 4 ) dbg; b5],
1317+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 4 )
1318+ dbg; b5],
12871319 dbg),
12881320 Cop (Cstore (Byte_unsigned , Assignment ),
1289- [add_int (add_int ptr idx dbg) (cconst_int 5 ) dbg; b6],
1321+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 5 )
1322+ dbg; b6],
12901323 dbg)),
12911324 Csequence (
12921325 Cop (Cstore (Byte_unsigned , Assignment ),
1293- [add_int (add_int ptr idx dbg) (cconst_int 6 ) dbg; b7],
1326+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 6 )
1327+ dbg; b7],
12941328 dbg),
12951329 Cop (Cstore (Byte_unsigned , Assignment ),
1296- [add_int (add_int ptr idx dbg) (cconst_int 7 ) dbg; b8],
1330+ [offset_addr (offset_addr ptr idx dbg) (cconst_int 7 )
1331+ dbg; b8],
12971332 dbg))))
12981333
12991334let max_or_zero a dbg =
@@ -2217,7 +2252,7 @@ let int_comp_caml cmp arg1 arg2 dbg =
22172252
22182253let stringref_unsafe arg1 arg2 dbg =
22192254 tag_int(Cop (mk_load_mut Byte_unsigned ,
2220- [add_int arg1 (untag_int arg2 dbg) dbg],
2255+ [offset_addr arg1 (untag_int arg2 dbg) dbg],
22212256 dbg)) dbg
22222257
22232258let stringref_safe arg1 arg2 dbg =
@@ -2227,7 +2262,7 @@ let stringref_safe arg1 arg2 dbg =
22272262 Csequence (
22282263 make_checkbound dbg [string_length str dbg; idx],
22292264 Cop (mk_load_mut Byte_unsigned ,
2230- [add_int str idx dbg], dbg))))) dbg
2265+ [offset_addr str idx dbg], dbg))))) dbg
22312266
22322267let string_load size unsafe arg1 arg2 dbg =
22332268 box_sized size dbg
@@ -2335,7 +2370,7 @@ let setfield_computed ptr init arg1 arg2 arg3 dbg =
23352370
23362371let bytesset_unsafe arg1 arg2 arg3 dbg =
23372372 return_unit dbg (Cop (Cstore (Byte_unsigned , Assignment ),
2338- [add_int arg1 (untag_int arg2 dbg) dbg;
2373+ [offset_addr arg1 (untag_int arg2 dbg) dbg;
23392374 ignore_high_bit_int (untag_int arg3 dbg)], dbg))
23402375
23412376let bytesset_safe arg1 arg2 arg3 dbg =
@@ -2346,7 +2381,7 @@ let bytesset_safe arg1 arg2 arg3 dbg =
23462381 Csequence (
23472382 make_checkbound dbg [string_length str dbg; idx],
23482383 Cop (Cstore (Byte_unsigned , Assignment ),
2349- [add_int str idx dbg; newval],
2384+ [offset_addr str idx dbg; newval],
23502385 dbg))))))
23512386
23522387let arrayset_unsafe kind arg1 arg2 arg3 dbg =
0 commit comments