@@ -160,7 +160,7 @@ let comparison (cmp : Lambda.comparison) a b : bool =
160
160
| Clt -> a < b
161
161
| Cge -> a > = b
162
162
163
- let int i : t =
163
+ let lift_int i : t =
164
164
Lconst (Const_base (Const_int i))
165
165
166
166
@@ -169,15 +169,54 @@ let int32 i : t =
169
169
170
170
let lift_bool b = if b then true_ else false_
171
171
172
+ (* ATTENTION: [float, nativeint] constant propogaton is not done
173
+ yet , due to cross platform problem
174
+ *)
175
+ let lift_float b : t =
176
+ Lconst (Const_base (Const_float b))
177
+
178
+ let lift_nativeint b : t =
179
+ Lconst (Const_base (Const_nativeint b))
180
+
181
+ let lift_int32 b : t =
182
+ Lconst (Const_base (Const_int32 b))
183
+
184
+ let lift_int64 b : t =
185
+ Lconst (Const_base (Const_int64 b))
186
+
172
187
let prim (prim : Prim.t ) (ll : t list ) : t =
173
188
let default () : t = Lprim (prim,ll) in
174
189
match ll with
175
190
| [Lconst a] ->
176
191
begin match prim, a with
177
192
| Pnegint , (Const_base (Const_int a))
178
- -> int (- a)
193
+ -> lift_int (- a)
194
+ (* | Pfloatofint, (Const_base (Const_int a)) *)
195
+ (* -> lift_float (float_of_int a) *)
196
+ | Pintoffloat , (Const_base (Const_float a))
197
+ ->
198
+ lift_int (int_of_float (float_of_string a))
199
+ (* | Pnegfloat -> lift_float (-. a) *)
200
+ (* | Pabsfloat -> lift_float (abs_float a) *)
201
+ | Pstringlength , (Const_base (Const_string (a,_)) )
202
+ ->
203
+ lift_int (String. length a)
204
+ (* | Pnegbint Pnativeint, (Const_base (Const_nativeint i)) *)
205
+ (* -> *)
206
+ (* lift_nativeint (Nativeint.neg i) *)
207
+ | Pnegbint Pint32 , (Const_base (Const_int32 a))
208
+ ->
209
+ lift_int32 (Int32. neg a)
210
+ | Pnegbint Pint64 , (Const_base (Const_int64 a))
211
+ ->
212
+ lift_int64 (Int64. neg a)
213
+ | Pnot , Const_pointer (a,_)
214
+ -> lift_bool (a = 0 )
215
+
179
216
| _ -> default ()
180
217
end
218
+
219
+
181
220
| [Lconst a ; Lconst b] ->
182
221
begin match prim, a, b with
183
222
| Pbintcomp (_, cmp), Const_base (Const_int32 a), Const_base (Const_int32 b)
@@ -186,6 +225,11 @@ let prim (prim : Prim.t) (ll : t list) : t =
186
225
-> lift_bool (comparison cmp a b)
187
226
| Pbintcomp (_, cmp), Const_base (Const_nativeint a), Const_base (Const_nativeint b)
188
227
-> lift_bool (comparison cmp a b)
228
+ | Pfloatcomp cmp, Const_base (Const_nativeint a), Const_base (Const_nativeint b)
229
+ -> lift_bool (comparison cmp a b)
230
+ | Pintcomp cmp , Const_base (Const_int a), Const_base (Const_int b)
231
+ -> lift_bool (comparison cmp a b)
232
+
189
233
| (Paddint
190
234
| Psubint
191
235
| Pmulint
@@ -196,34 +240,89 @@ let prim (prim : Prim.t) (ll : t list) : t =
196
240
| Pxorint
197
241
| Plslint
198
242
| Plsrint
199
- | Pasrint | Pintcomp _ ), _, _
243
+ | Pasrint ), Const_base ( Const_int a ), Const_base ( Const_int b)
200
244
->
201
- begin match a, b with
202
- | Const_base (Const_int a), Const_base (Const_int b)
203
- ->
204
245
(* WE SHOULD keep it as [int], to preserve types *)
205
246
let aa,bb = Int32. of_int a, Int32. of_int b in
206
- let int_ v = int (Int32. to_int v ) in
247
+ let int_ v = lift_int (Int32. to_int v ) in
207
248
begin match prim with
208
249
| Paddint -> int_ (Int32. add aa bb)
209
250
| Psubint -> int_ (Int32. sub aa bb)
210
251
| Pmulint -> int_ (Int32. mul aa bb)
211
- | Pdivint -> int_ (Int32. div aa bb)
252
+ | Pdivint -> ( try int_ (Int32. div aa bb) with _ -> default () )
212
253
| Pmodint -> int_ (Int32. rem aa bb)
213
254
| Pandint -> int_ (Int32. logand aa bb)
214
255
| Porint -> int_ (Int32. logor aa bb)
215
256
| Pxorint -> int_ (Int32. logxor aa bb)
216
257
| Plslint -> int_ (Int32. shift_left aa b )
217
258
| Plsrint -> int_ (Int32. shift_right_logical aa b)
218
259
| Pasrint -> int_ (Int32. shift_right aa b)
219
- | Pintcomp cmp
220
- -> lift_bool (comparison cmp a b)
221
260
| _ -> default ()
222
261
end
262
+ | (Paddbint Pint32
263
+ | Psubbint Pint32
264
+ | Pmulbint Pint32
265
+ | Pdivbint Pint32
266
+ | Pmodbint Pint32
267
+ | Pandbint Pint32
268
+ | Porbint Pint32
269
+ | Pxorbint Pint32
270
+ ), Const_base (Const_int32 aa), Const_base (Const_int32 bb)
271
+ ->
272
+ begin match prim with
273
+ | Paddbint _ -> lift_int32 (Int32. add aa bb)
274
+ | Psubbint _ -> lift_int32 (Int32. sub aa bb)
275
+ | Pmulbint _ -> lift_int32 (Int32. mul aa bb)
276
+ | Pdivbint _ -> (try lift_int32 (Int32. div aa bb) with _ -> default () )
277
+ | Pmodbint _ -> lift_int32 (Int32. rem aa bb)
278
+ | Pandbint _ -> lift_int32 (Int32. logand aa bb)
279
+ | Porbint _ -> lift_int32 (Int32. logor aa bb)
280
+ | Pxorbint _ -> lift_int32 (Int32. logxor aa bb)
223
281
| _ -> default ()
224
- end
282
+ end
283
+ | Plslbint Pint32 , Const_base (Const_int32 aa), Const_base (Const_int b)
284
+ -> lift_int32 (Int32. shift_left aa b )
285
+ | Plsrbint Pint32 , Const_base (Const_int32 aa), Const_base (Const_int b)
286
+ -> lift_int32 (Int32. shift_right_logical aa b )
287
+ | Pasrbint Pint32 , Const_base (Const_int32 aa), Const_base (Const_int b)
288
+ -> lift_int32 (Int32. shift_right aa b )
289
+
290
+ | (Paddbint Pint64
291
+ | Psubbint Pint64
292
+ | Pmulbint Pint64
293
+ | Pdivbint Pint64
294
+ | Pmodbint Pint64
295
+ | Pandbint Pint64
296
+ | Porbint Pint64
297
+ | Pxorbint Pint64
298
+ ), Const_base (Const_int64 aa), Const_base (Const_int64 bb)
299
+ ->
300
+ begin match prim with
301
+ | Paddbint _ -> lift_int64 (Int64. add aa bb)
302
+ | Psubbint _ -> lift_int64 (Int64. sub aa bb)
303
+ | Pmulbint _ -> lift_int64 (Int64. mul aa bb)
304
+ | Pdivbint _ -> (try lift_int64 (Int64. div aa bb) with _ -> default () )
305
+ | Pmodbint _ -> lift_int64 (Int64. rem aa bb)
306
+ | Pandbint _ -> lift_int64 (Int64. logand aa bb)
307
+ | Porbint _ -> lift_int64 (Int64. logor aa bb)
308
+ | Pxorbint _ -> lift_int64 (Int64. logxor aa bb)
309
+ | _ -> default ()
310
+ end
311
+ | Plslbint Pint64 , Const_base (Const_int64 aa), Const_base (Const_int b)
312
+ -> lift_int64 (Int64. shift_left aa b )
313
+ | Plsrbint Pint64 , Const_base (Const_int64 aa), Const_base (Const_int b)
314
+ -> lift_int64 (Int64. shift_right_logical aa b )
315
+ | Pasrbint Pint64 , Const_base (Const_int64 aa), Const_base (Const_int b)
316
+ -> lift_int64 (Int64. shift_right aa b )
317
+ | Psequand , Const_pointer (a, _), Const_pointer ( b, _)
318
+ ->
319
+ lift_bool (a = 1 && b = 1 )
320
+ | Psequor , Const_pointer (a, _), Const_pointer ( b, _)
321
+ ->
322
+ lift_bool (a = 1 || b = 1 )
225
323
| _ -> default ()
226
324
end
325
+
227
326
| _ -> default ()
228
327
229
328
0 commit comments