@@ -288,18 +288,35 @@ Definition arith_rewrite_rulesT (max_const_val : Z) : list (bool * Prop)
288
288
; (forall s y x,
289
289
Z.add_get_carry_full s (- y) x
290
290
= dlet vb := Z.sub_get_borrow_full s x y in (fst vb, - snd vb))
291
+ ; (forall s y x k,
292
+ Z.add_get_carry_full s x (-y * k)
293
+ = dlet vb := Z.sub_get_borrow_full s x (y * k) in (fst vb, - snd vb))
294
+ ; (forall s y x k,
295
+ Z.add_get_carry_full s (-y * k) x
296
+ = dlet vb := Z.sub_get_borrow_full s x (y * k) in (fst vb, - snd vb))
291
297
; (forall s y x,
292
298
Z.add_with_get_carry_full s 0 x (- y)
293
299
= dlet vb := Z.sub_get_borrow_full s x y in (fst vb, - snd vb))
294
300
; (forall s y x,
295
301
Z.add_with_get_carry_full s 0 (- y) x
296
302
= dlet vb := Z.sub_get_borrow_full s x y in (fst vb, - snd vb))
303
+
304
+ ; (forall s c x,
305
+ Z.add_with_get_carry_full s (- c) x 0
306
+ = dlet vb := Z.sub_with_get_borrow_full s c x 0 in (fst vb, - snd vb))
307
+
297
308
; (forall s c y x,
298
309
Z.add_with_get_carry_full s (- c) (- y) x
299
310
= dlet vb := Z.sub_with_get_borrow_full s c x y in (fst vb, - snd vb))
300
311
; (forall s c y x,
301
312
Z.add_with_get_carry_full s (- c) x (- y)
302
313
= dlet vb := Z.sub_with_get_borrow_full s c x y in (fst vb, - snd vb))
314
+ ; (forall s c y x k,
315
+ Z.add_with_get_carry_full s c x (-y * k)
316
+ = dlet vb := Z.sub_with_get_borrow_full s (-c) x (y * k) in (fst vb, - snd vb))
317
+ ; (forall s c y x k,
318
+ Z.add_with_get_carry_full s c (-y * k) x
319
+ = dlet vb := Z.sub_with_get_borrow_full s (-c) x (y * k) in (fst vb, - snd vb))
303
320
; (forall b x, (* inline negation when the rewriter wouldn't already inline it *)
304
321
ident.gets_inlined b x = false
305
322
-> -x = dlet v := x in -v)
@@ -395,6 +412,16 @@ Definition arith_with_casts_rewrite_rulesT (adc_no_carry_to_add : bool) : list (
395
412
y ∈ ry -> y = Z.ones (Z.succ (Z.log2 y))
396
413
-> cstZ rv (cstZ ry ('y) &' cstZ rx x) = cstZ rx x)
397
414
]%Z%zrange
415
+ ; mymap
416
+ do_again
417
+ [ (forall x y, cstZ r[0~>1] x * y = Z.zselect (cstZ r[0~>1] x) (cstZ r[0~>0] (' 0)) y)
418
+ ; (forall x y, y * cstZ r[0~>1] x = Z.zselect (cstZ r[0~>1] x) (cstZ r[0~>0] (' 0)) y)
419
+ ; (forall c M rv r0 rM, 0 ∈ r0 -> M ∈ rM -> M ∈ rv -> 2^Z.log2 (M+1) = M + 1 -> 1 <= M ->
420
+ cstZ rv (Z.zselect (cstZ r[0~>1] c) (cstZ r0 ('0)) (cstZ rM ('M)))
421
+ = (dlet vc := cstZZ rv r[0~>1] (Z.sub_with_get_borrow_full ('(M+1)) (cstZ r[0~>1] c) 0 0) in
422
+ cstZ rv (fst vc)))
423
+ ; (forall rv c x y, cstZ rv (Z.zselect c x y) = dlet v := cstZ rv (Z.zselect c x y) in cstZ rv v)
424
+ ]
398
425
; mymap
399
426
do_again
400
427
[ (* [do_again], so that we can trigger add/sub rules on the output *)
@@ -415,6 +442,11 @@ Definition arith_with_casts_rewrite_rulesT (adc_no_carry_to_add : bool) : list (
415
442
adc_no_carry_to_add = true -> s ∈ rs -> (n rx - n ry - n rc <= r[0~>s-1])%zrange
416
443
-> cstZZ rv r[0~>0] (Z.sub_with_get_borrow_full (cstZ rs ('s)) (cstZ rc c) (cstZ rx x) (cstZ ry y))
417
444
= (cstZ rv (cstZ rx x - cstZ ry y - cstZ rc c), (cstZ r[0~>0] ('0))))
445
+ (* 0-0-c passes through the carry *)
446
+ ; (forall rv rs s c rx ry,
447
+ s ∈ rs -> 0 ∈ rx -> 0 ∈ ry -> -1 / s = -1
448
+ -> cstZZ rv r[0~>1] (Z.sub_with_get_borrow_full (cstZ rs ('s)) (cstZ r[0~>1] c) (cstZ rx ('0)) (cstZ ry ('0)))
449
+ = (cstZ rv (-(cstZ r[0~>1]c) mod 's), (cstZ r[0~>1] c)))
418
450
]%Z%zrange
419
451
; mymap
420
452
dont_do_again
0 commit comments