summaryrefslogtreecommitdiffstats
path: root/gcc
diff options
context:
space:
mode:
authorYannick Moy <moy@adacore.com>2022-04-11 15:56:01 +0000
committerPierre-Marie de Rodat <derodat@adacore.com>2022-05-19 14:05:29 +0000
commit054cf924ac00a47301a1c49f6433f70775fe1c0d (patch)
treec4b9ea9836b00503a8617c66309c39cdedddfecc /gcc
parent[Ada] Improve optimization of "=" on bit-packed arrays (diff)
downloadgcc-054cf924ac00a47301a1c49f6433f70775fe1c0d.tar.gz
gcc-054cf924ac00a47301a1c49f6433f70775fe1c0d.tar.bz2
gcc-054cf924ac00a47301a1c49f6433f70775fe1c0d.tar.xz
[Ada] Further adapt proof of double arithmetic runtime unit
After changes in Why3 and generation of VCs, ghost code needs to be adapted for proofs to remain automatic. gcc/ada/ * libgnat/s-aridou.adb (Lemma_Abs_Range, Lemma_Double_Shift_Left, Lemma_Shift_Left): New lemmas. (Double_Divide): Add ghost code. (Lemma_Concat_Definition, Lemma_Double_Shift_Left, Lemma_Shift_Left, Lemma_Shift_Right): Define or complete lemmas. (Scaled_Divide): Add ghost code.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/libgnat/s-aridou.adb175
1 files changed, 171 insertions, 4 deletions
diff --git a/gcc/ada/libgnat/s-aridou.adb b/gcc/ada/libgnat/s-aridou.adb
index e2afd524ec4..d2149681dbe 100644
--- a/gcc/ada/libgnat/s-aridou.adb
+++ b/gcc/ada/libgnat/s-aridou.adb
@@ -208,6 +208,13 @@ is
208 Ghost, 208 Ghost,
209 Post => abs (X * Y) = abs X * abs Y; 209 Post => abs (X * Y) = abs X * abs Y;
210 210
211 procedure Lemma_Abs_Range (X : Big_Integer)
212 with
213 Ghost,
214 Pre => In_Double_Int_Range (X),
215 Post => abs (X) <= Big_2xxDouble_Minus_1
216 and then In_Double_Int_Range (-abs (X));
217
211 procedure Lemma_Abs_Rem_Commutation (X, Y : Big_Integer) 218 procedure Lemma_Abs_Rem_Commutation (X, Y : Big_Integer)
212 with 219 with
213 Ghost, 220 Ghost,
@@ -306,6 +313,20 @@ is
306 Pre => S <= Double_Size - S1, 313 Pre => S <= Double_Size - S1,
307 Post => Shift_Left (Shift_Left (X, S), S1) = Shift_Left (X, S + S1); 314 Post => Shift_Left (Shift_Left (X, S), S1) = Shift_Left (X, S + S1);
308 315
316 procedure Lemma_Double_Shift_Left (X : Double_Uns; S, S1 : Double_Uns)
317 with
318 Ghost,
319 Pre => S <= Double_Uns (Double_Size)
320 and then S1 <= Double_Uns (Double_Size),
321 Post => Shift_Left (Shift_Left (X, Natural (S)), Natural (S1)) =
322 Shift_Left (X, Natural (S + S1));
323
324 procedure Lemma_Double_Shift_Left (X : Double_Uns; S, S1 : Natural)
325 with
326 Ghost,
327 Pre => S <= Double_Size - S1,
328 Post => Shift_Left (Shift_Left (X, S), S1) = Shift_Left (X, S + S1);
329
309 procedure Lemma_Double_Shift_Right (X : Double_Uns; S, S1 : Double_Uns) 330 procedure Lemma_Double_Shift_Right (X : Double_Uns; S, S1 : Double_Uns)
310 with 331 with
311 Ghost, 332 Ghost,
@@ -505,6 +526,13 @@ is
505 Pre => A = B * Q + R and then R < B, 526 Pre => A = B * Q + R and then R < B,
506 Post => Q = A / B and then R = A rem B; 527 Post => Q = A / B and then R = A rem B;
507 528
529 procedure Lemma_Shift_Left (X : Double_Uns; Shift : Natural)
530 with
531 Ghost,
532 Pre => Shift < Double_Size
533 and then Big (X) * Big_2xx (Shift) < Big_2xxDouble,
534 Post => Big (Shift_Left (X, Shift)) = Big (X) * Big_2xx (Shift);
535
508 procedure Lemma_Shift_Right (X : Double_Uns; Shift : Natural) 536 procedure Lemma_Shift_Right (X : Double_Uns; Shift : Natural)
509 with 537 with
510 Ghost, 538 Ghost,
@@ -560,10 +588,10 @@ is
560 procedure Inline_Le3 (X1, X2, X3, Y1, Y2, Y3 : Single_Uns) is null; 588 procedure Inline_Le3 (X1, X2, X3, Y1, Y2, Y3 : Single_Uns) is null;
561 procedure Lemma_Abs_Commutation (X : Double_Int) is null; 589 procedure Lemma_Abs_Commutation (X : Double_Int) is null;
562 procedure Lemma_Abs_Mult_Commutation (X, Y : Big_Integer) is null; 590 procedure Lemma_Abs_Mult_Commutation (X, Y : Big_Integer) is null;
591 procedure Lemma_Abs_Range (X : Big_Integer) is null;
563 procedure Lemma_Add_Commutation (X : Double_Uns; Y : Single_Uns) is null; 592 procedure Lemma_Add_Commutation (X : Double_Uns; Y : Single_Uns) is null;
564 procedure Lemma_Add_One (X : Double_Uns) is null; 593 procedure Lemma_Add_One (X : Double_Uns) is null;
565 procedure Lemma_Bounded_Powers_Of_2_Increasing (M, N : Natural) is null; 594 procedure Lemma_Bounded_Powers_Of_2_Increasing (M, N : Natural) is null;
566 procedure Lemma_Concat_Definition (X, Y : Single_Uns) is null;
567 procedure Lemma_Deep_Mult_Commutation 595 procedure Lemma_Deep_Mult_Commutation
568 (Factor : Big_Integer; 596 (Factor : Big_Integer;
569 X, Y : Single_Uns) 597 X, Y : Single_Uns)
@@ -581,6 +609,8 @@ is
581 procedure Lemma_Double_Big_2xxSingle is null; 609 procedure Lemma_Double_Big_2xxSingle is null;
582 procedure Lemma_Double_Shift (X : Double_Uns; S, S1 : Double_Uns) is null; 610 procedure Lemma_Double_Shift (X : Double_Uns; S, S1 : Double_Uns) is null;
583 procedure Lemma_Double_Shift (X : Single_Uns; S, S1 : Natural) is null; 611 procedure Lemma_Double_Shift (X : Single_Uns; S, S1 : Natural) is null;
612 procedure Lemma_Double_Shift_Left (X : Double_Uns; S, S1 : Double_Uns)
613 is null;
584 procedure Lemma_Double_Shift_Right (X : Double_Uns; S, S1 : Double_Uns) 614 procedure Lemma_Double_Shift_Right (X : Double_Uns; S, S1 : Double_Uns)
585 is null; 615 is null;
586 procedure Lemma_Ge_Commutation (A, B : Double_Uns) is null; 616 procedure Lemma_Ge_Commutation (A, B : Double_Uns) is null;
@@ -949,6 +979,7 @@ is
949 pragma Assert (if X = Double_Int'First and then Round then 979 pragma Assert (if X = Double_Int'First and then Round then
950 Mult > Big_2xxDouble); 980 Mult > Big_2xxDouble);
951 elsif Ylo > 0 then 981 elsif Ylo > 0 then
982 pragma Assert (Double_Uns'(Ylo * Zhi) > 0);
952 pragma Assert (Big (Double_Uns'(Ylo * Zhi)) > 0); 983 pragma Assert (Big (Double_Uns'(Ylo * Zhi)) > 0);
953 pragma Assert (if X = Double_Int'First and then Round then 984 pragma Assert (if X = Double_Int'First and then Round then
954 Mult > Big_2xxDouble); 985 Mult > Big_2xxDouble);
@@ -1024,15 +1055,24 @@ is
1024 pragma Assert (Big (Double_Uns (Hi (T2))) >= 1); 1055 pragma Assert (Big (Double_Uns (Hi (T2))) >= 1);
1025 pragma Assert (Big (Double_Uns (Lo (T2))) >= 0); 1056 pragma Assert (Big (Double_Uns (Lo (T2))) >= 0);
1026 pragma Assert (Big (Double_Uns (Lo (T1))) >= 0); 1057 pragma Assert (Big (Double_Uns (Lo (T1))) >= 0);
1058 pragma Assert (Mult >= Big_2xxDouble * Big (Double_Uns (Hi (T2))));
1027 pragma Assert (Mult >= Big_2xxDouble); 1059 pragma Assert (Mult >= Big_2xxDouble);
1028 if Hi (T2) > 1 then 1060 if Hi (T2) > 1 then
1029 pragma Assert (Big (Double_Uns (Hi (T2))) > 1); 1061 pragma Assert (Big (Double_Uns (Hi (T2))) > 1);
1062 pragma Assert (if X = Double_Int'First and then Round then
1063 Mult > Big_2xxDouble);
1030 elsif Lo (T2) > 0 then 1064 elsif Lo (T2) > 0 then
1031 pragma Assert (Big (Double_Uns (Lo (T2))) > 0); 1065 pragma Assert (Big (Double_Uns (Lo (T2))) > 0);
1066 pragma Assert (if X = Double_Int'First and then Round then
1067 Mult > Big_2xxDouble);
1032 elsif Lo (T1) > 0 then 1068 elsif Lo (T1) > 0 then
1033 pragma Assert (Double_Uns (Lo (T1)) > 0); 1069 pragma Assert (Double_Uns (Lo (T1)) > 0);
1034 Lemma_Gt_Commutation (Double_Uns (Lo (T1)), 0); 1070 Lemma_Gt_Commutation (Double_Uns (Lo (T1)), 0);
1035 pragma Assert (Big (Double_Uns (Lo (T1))) > 0); 1071 pragma Assert (Big (Double_Uns (Lo (T1))) > 0);
1072 pragma Assert (if X = Double_Int'First and then Round then
1073 Mult > Big_2xxDouble);
1074 else
1075 pragma Assert (not (X = Double_Int'First and then Round));
1036 end if; 1076 end if;
1037 Prove_Quotient_Zero; 1077 Prove_Quotient_Zero;
1038 end if; 1078 end if;
@@ -1172,6 +1212,18 @@ is
1172 end if; 1212 end if;
1173 end Lemma_Abs_Rem_Commutation; 1213 end Lemma_Abs_Rem_Commutation;
1174 1214
1215 -----------------------------
1216 -- Lemma_Concat_Definition --
1217 -----------------------------
1218
1219 procedure Lemma_Concat_Definition (X, Y : Single_Uns) is
1220 Hi : constant Double_Uns := Shift_Left (Double_Uns (X), Single_Size);
1221 Lo : constant Double_Uns := Double_Uns (Y);
1222 begin
1223 pragma Assert (Hi = Double_Uns'(2 ** Single_Size) * Double_Uns (X));
1224 pragma Assert ((Hi or Lo) = Hi + Lo);
1225 end Lemma_Concat_Definition;
1226
1175 ------------------------ 1227 ------------------------
1176 -- Lemma_Double_Shift -- 1228 -- Lemma_Double_Shift --
1177 ------------------------ 1229 ------------------------
@@ -1185,6 +1237,19 @@ is
1185 = Shift_Left (X, Natural (Double_Uns (S + S1)))); 1237 = Shift_Left (X, Natural (Double_Uns (S + S1))));
1186 end Lemma_Double_Shift; 1238 end Lemma_Double_Shift;
1187 1239
1240 -----------------------------
1241 -- Lemma_Double_Shift_Left --
1242 -----------------------------
1243
1244 procedure Lemma_Double_Shift_Left (X : Double_Uns; S, S1 : Natural) is
1245 begin
1246 Lemma_Double_Shift_Left (X, Double_Uns (S), Double_Uns (S1));
1247 pragma Assert (Shift_Left (Shift_Left (X, S), S1)
1248 = Shift_Left (Shift_Left (X, S), Natural (Double_Uns (S1))));
1249 pragma Assert (Shift_Left (X, S + S1)
1250 = Shift_Left (X, Natural (Double_Uns (S + S1))));
1251 end Lemma_Double_Shift_Left;
1252
1188 ------------------------------ 1253 ------------------------------
1189 -- Lemma_Double_Shift_Right -- 1254 -- Lemma_Double_Shift_Right --
1190 ------------------------------ 1255 ------------------------------
@@ -1328,15 +1393,78 @@ is
1328 Lemma_Neg_Rem (X, Y); 1393 Lemma_Neg_Rem (X, Y);
1329 end Lemma_Rem_Abs; 1394 end Lemma_Rem_Abs;
1330 1395
1396 ----------------------
1397 -- Lemma_Shift_Left --
1398 ----------------------
1399
1400 procedure Lemma_Shift_Left (X : Double_Uns; Shift : Natural) is
1401
1402 procedure Lemma_Mult_Pow2 (X : Double_Uns; I : Natural)
1403 with
1404 Ghost,
1405 Pre => I < Double_Size - 1,
1406 Post => X * Double_Uns'(2) ** I * Double_Uns'(2)
1407 = X * Double_Uns'(2) ** (I + 1);
1408
1409 procedure Lemma_Mult_Pow2 (X : Double_Uns; I : Natural) is
1410 Mul1 : constant Double_Uns := Double_Uns'(2) ** I;
1411 Mul2 : constant Double_Uns := Double_Uns'(2);
1412 Left : constant Double_Uns := X * Mul1 * Mul2;
1413 begin
1414 pragma Assert (Left = X * (Mul1 * Mul2));
1415 pragma Assert (Mul1 * Mul2 = Double_Uns'(2) ** (I + 1));
1416 end Lemma_Mult_Pow2;
1417
1418 XX : Double_Uns := X;
1419
1420 begin
1421 for J in 1 .. Shift loop
1422 declare
1423 Cur_XX : constant Double_Uns := XX;
1424 begin
1425 XX := Shift_Left (XX, 1);
1426 pragma Assert (XX = Cur_XX * Double_Uns'(2));
1427 Lemma_Mult_Pow2 (X, J - 1);
1428 end;
1429 Lemma_Double_Shift_Left (X, J - 1, 1);
1430 pragma Loop_Invariant (XX = Shift_Left (X, J));
1431 pragma Loop_Invariant (XX = X * Double_Uns'(2) ** J);
1432 end loop;
1433 end Lemma_Shift_Left;
1434
1331 ----------------------- 1435 -----------------------
1332 -- Lemma_Shift_Right -- 1436 -- Lemma_Shift_Right --
1333 ----------------------- 1437 -----------------------
1334 1438
1335 procedure Lemma_Shift_Right (X : Double_Uns; Shift : Natural) is 1439 procedure Lemma_Shift_Right (X : Double_Uns; Shift : Natural) is
1440
1441 procedure Lemma_Div_Pow2 (X : Double_Uns; I : Natural)
1442 with
1443 Ghost,
1444 Pre => I < Double_Size - 1,
1445 Post => X / Double_Uns'(2) ** I / Double_Uns'(2)
1446 = X / Double_Uns'(2) ** (I + 1);
1447
1448 procedure Lemma_Div_Pow2 (X : Double_Uns; I : Natural) is
1449 Div1 : constant Double_Uns := Double_Uns'(2) ** I;
1450 Div2 : constant Double_Uns := Double_Uns'(2);
1451 Left : constant Double_Uns := X / Div1 / Div2;
1452 begin
1453 pragma Assert (Left = X / (Div1 * Div2));
1454 pragma Assert (Div1 * Div2 = Double_Uns'(2) ** (I + 1));
1455 end Lemma_Div_Pow2;
1456
1336 XX : Double_Uns := X; 1457 XX : Double_Uns := X;
1458
1337 begin 1459 begin
1338 for J in 1 .. Shift loop 1460 for J in 1 .. Shift loop
1339 XX := Shift_Right (XX, 1); 1461 declare
1462 Cur_XX : constant Double_Uns := XX;
1463 begin
1464 XX := Shift_Right (XX, 1);
1465 pragma Assert (XX = Cur_XX / Double_Uns'(2));
1466 Lemma_Div_Pow2 (X, J - 1);
1467 end;
1340 Lemma_Double_Shift_Right (X, J - 1, 1); 1468 Lemma_Double_Shift_Right (X, J - 1, 1);
1341 pragma Loop_Invariant (XX = Shift_Right (X, J)); 1469 pragma Loop_Invariant (XX = Shift_Right (X, J));
1342 pragma Loop_Invariant (XX = X / Double_Uns'(2) ** J); 1470 pragma Loop_Invariant (XX = X / Double_Uns'(2) ** J);
@@ -1607,6 +1735,7 @@ is
1607 "Intentional Unsigned->Signed conversion"); 1735 "Intentional Unsigned->Signed conversion");
1608 else 1736 else
1609 Prove_Neg_Int; 1737 Prove_Neg_Int;
1738 Lemma_Abs_Range (Big (X) * Big (Y));
1610 return To_Neg_Int (T2); 1739 return To_Neg_Int (T2);
1611 end if; 1740 end if;
1612 else -- X < 0 1741 else -- X < 0
@@ -1617,6 +1746,7 @@ is
1617 "Intentional Unsigned->Signed conversion"); 1746 "Intentional Unsigned->Signed conversion");
1618 else 1747 else
1619 Prove_Neg_Int; 1748 Prove_Neg_Int;
1749 Lemma_Abs_Range (Big (X) * Big (Y));
1620 return To_Neg_Int (T2); 1750 return To_Neg_Int (T2);
1621 end if; 1751 end if;
1622 end if; 1752 end if;
@@ -1901,6 +2031,9 @@ is
1901 2031
1902 procedure Prove_Dividend_Scaling is 2032 procedure Prove_Dividend_Scaling is
1903 begin 2033 begin
2034 Lemma_Shift_Left (D (1) & D (2), Scale);
2035 Lemma_Shift_Left (Double_Uns (D (3)), Scale);
2036 Lemma_Shift_Left (Double_Uns (D (4)), Scale);
1904 Lemma_Hi_Lo (D (1) & D (2), D (1), D (2)); 2037 Lemma_Hi_Lo (D (1) & D (2), D (1), D (2));
1905 pragma Assert (Mult * Big_2xx (Scale) = 2038 pragma Assert (Mult * Big_2xx (Scale) =
1906 Big_2xxSingle 2039 Big_2xxSingle
@@ -2116,6 +2249,7 @@ is
2116 pragma Assert (Double_Uns (Lo (T1 rem Zlo)) = T1 rem Zlo); 2249 pragma Assert (Double_Uns (Lo (T1 rem Zlo)) = T1 rem Zlo);
2117 Lemma_Hi_Lo (T2, Lo (T1 rem Zlo), D (4)); 2250 Lemma_Hi_Lo (T2, Lo (T1 rem Zlo), D (4));
2118 pragma Assert (T1 rem Zlo + Double_Uns'(1) <= Double_Uns (Zlo)); 2251 pragma Assert (T1 rem Zlo + Double_Uns'(1) <= Double_Uns (Zlo));
2252 Lemma_Ge_Commutation (Double_Uns (Zlo), T1 rem Zlo + Double_Uns'(1));
2119 Lemma_Add_Commutation (T1 rem Zlo, 1); 2253 Lemma_Add_Commutation (T1 rem Zlo, 1);
2120 pragma Assert (Big (T1 rem Zlo) + 1 <= Big (Double_Uns (Zlo))); 2254 pragma Assert (Big (T1 rem Zlo) + 1 <= Big (Double_Uns (Zlo)));
2121 Lemma_Div_Definition (T2, Zlo, T2 / Zlo, Ru); 2255 Lemma_Div_Definition (T2, Zlo, T2 / Zlo, Ru);
@@ -2567,6 +2701,21 @@ is
2567 elsif D (J) = Zhi then 2701 elsif D (J) = Zhi then
2568 Qd (J) := Single_Uns'Last; 2702 Qd (J) := Single_Uns'Last;
2569 2703
2704 Lemma_Concat_Definition (D (J), D (J + 1));
2705 pragma Assert (Big_2xxSingle > Big (Double_Uns (D (J + 2))));
2706 pragma Assert (Big3 (D (J), D (J + 1), 0) + Big_2xxSingle
2707 > Big3 (D (J), D (J + 1), D (J + 2)));
2708 pragma Assert (Big (Double_Uns'(0)) = 0);
2709 pragma Assert (Big (D (J) & D (J + 1)) * Big_2xxSingle =
2710 Big_2xxSingle * (Big_2xxSingle * Big (Double_Uns (D (J)))
2711 + Big (Double_Uns (D (J + 1)))));
2712 pragma Assert (Big (D (J) & D (J + 1)) * Big_2xxSingle =
2713 Big_2xxSingle * Big_2xxSingle * Big (Double_Uns (D (J)))
2714 + Big_2xxSingle * Big (Double_Uns (D (J + 1))));
2715 pragma Assert (Big (D (J) & D (J + 1)) * Big_2xxSingle
2716 = Big3 (D (J), D (J + 1), 0));
2717 pragma Assert ((Big (D (J) & D (J + 1)) + 1) * Big_2xxSingle
2718 = Big3 (D (J), D (J + 1), 0) + Big_2xxSingle);
2570 Lemma_Gt_Mult (Big (Zu), Big (D (J) & D (J + 1)) + 1, 2719 Lemma_Gt_Mult (Big (Zu), Big (D (J) & D (J + 1)) + 1,
2571 Big_2xxSingle, 2720 Big_2xxSingle,
2572 Big3 (D (J), D (J + 1), D (J + 2))); 2721 Big3 (D (J), D (J + 1), D (J + 2)));
@@ -2617,6 +2766,8 @@ is
2617 pragma Loop_Invariant (Qd (J)'Initialized); 2766 pragma Loop_Invariant (Qd (J)'Initialized);
2618 pragma Loop_Invariant 2767 pragma Loop_Invariant
2619 (Big3 (S1, S2, S3) = Big (Double_Uns (Qd (J))) * Big (Zu)); 2768 (Big3 (S1, S2, S3) = Big (Double_Uns (Qd (J))) * Big (Zu));
2769 pragma Loop_Invariant
2770 (Big3 (S1, S2, S3) > Big3 (D (J), D (J + 1), D (J + 2)));
2620 pragma Assert (Big3 (S1, S2, S3) > 0); 2771 pragma Assert (Big3 (S1, S2, S3) > 0);
2621 if Qd (J) = 0 then 2772 if Qd (J) = 0 then
2622 pragma Assert (Big3 (S1, S2, S3) = 0); 2773 pragma Assert (Big3 (S1, S2, S3) = 0);
@@ -2632,6 +2783,9 @@ is
2632 (Big3 (S1, S2, S3) > 2783 (Big3 (S1, S2, S3) >
2633 Big3 (D (J), D (J + 1), D (J + 2)) - Big (Zu)); 2784 Big3 (D (J), D (J + 1), D (J + 2)) - Big (Zu));
2634 Lemma_Subtract_Commutation (Double_Uns (Qd (J)), 1); 2785 Lemma_Subtract_Commutation (Double_Uns (Qd (J)), 1);
2786 pragma Assert (Double_Uns (Qd (J)) - Double_Uns'(1)
2787 = Double_Uns (Qd (J) - 1));
2788 pragma Assert (Big (Double_Uns'(1)) = 1);
2635 Lemma_Substitution (Big3 (S1, S2, S3), Big (Zu), 2789 Lemma_Substitution (Big3 (S1, S2, S3), Big (Zu),
2636 Big (Double_Uns (Qd (J))) - 1, 2790 Big (Double_Uns (Qd (J))) - 1,
2637 Big (Double_Uns (Qd (J) - 1)), 0); 2791 Big (Double_Uns (Qd (J) - 1)), 0);
@@ -2660,8 +2814,7 @@ is
2660 2814
2661 pragma Assert (Big3 (D (J), D (J + 1), D (J + 2)) < Big (Zu)); 2815 pragma Assert (Big3 (D (J), D (J + 1), D (J + 2)) < Big (Zu));
2662 if D (J) > 0 then 2816 if D (J) > 0 then
2663 pragma Assert 2817 Lemma_Double_Big_2xxSingle;
2664 (Big_2xxSingle * Big_2xxSingle = Big_2xxDouble);
2665 pragma Assert (Big3 (D (J), D (J + 1), D (J + 2)) = 2818 pragma Assert (Big3 (D (J), D (J + 1), D (J + 2)) =
2666 Big_2xxSingle 2819 Big_2xxSingle
2667 * Big_2xxSingle * Big (Double_Uns (D (J))) 2820 * Big_2xxSingle * Big (Double_Uns (D (J)))
@@ -2671,9 +2824,22 @@ is
2671 Big_2xxDouble * Big (Double_Uns (D (J))) 2824 Big_2xxDouble * Big (Double_Uns (D (J)))
2672 + Big_2xxSingle * Big (Double_Uns (D (J + 1))) 2825 + Big_2xxSingle * Big (Double_Uns (D (J + 1)))
2673 + Big (Double_Uns (D (J + 2)))); 2826 + Big (Double_Uns (D (J + 2))));
2827 pragma Assert (Big_2xxSingle >= 0);
2828 pragma Assert (Big (Double_Uns (D (J + 1))) >= 0);
2829 pragma Assert
2830 (Big_2xxSingle * Big (Double_Uns (D (J + 1))) >= 0);
2831 pragma Assert
2832 (Big_2xxSingle * Big (Double_Uns (D (J + 1)))
2833 + Big (Double_Uns (D (J + 2))) >= 0);
2674 pragma Assert (Big3 (D (J), D (J + 1), D (J + 2)) >= 2834 pragma Assert (Big3 (D (J), D (J + 1), D (J + 2)) >=
2675 Big_2xxDouble * Big (Double_Uns (D (J)))); 2835 Big_2xxDouble * Big (Double_Uns (D (J))));
2676 Lemma_Ge_Commutation (Double_Uns (D (J)), Double_Uns'(1)); 2836 Lemma_Ge_Commutation (Double_Uns (D (J)), Double_Uns'(1));
2837 Lemma_Ge_Mult (Big (Double_Uns (D (J))),
2838 Big (Double_Uns'(1)),
2839 Big_2xxDouble,
2840 Big (Double_Uns'(1)) * Big_2xxDouble);
2841 pragma Assert
2842 (Big_2xxDouble * Big (Double_Uns'(1)) = Big_2xxDouble);
2677 pragma Assert 2843 pragma Assert
2678 (Big3 (D (J), D (J + 1), D (J + 2)) >= Big_2xxDouble); 2844 (Big3 (D (J), D (J + 1), D (J + 2)) >= Big_2xxDouble);
2679 pragma Assert (False); 2845 pragma Assert (False);
@@ -3039,6 +3205,7 @@ is
3039 begin 3205 begin
3040 pragma Assert (Ru = Double_Uns (X) - Double_Uns (Y)); 3206 pragma Assert (Ru = Double_Uns (X) - Double_Uns (Y));
3041 if Ru < 2 ** (Double_Size - 1) then -- R >= 0 3207 if Ru < 2 ** (Double_Size - 1) then -- R >= 0
3208 pragma Assert (To_Uns (Y) <= To_Uns (X));
3042 Lemma_Subtract_Double_Uns (X => Y, Y => X); 3209 Lemma_Subtract_Double_Uns (X => Y, Y => X);
3043 pragma Assert (Ru = Double_Uns (X - Y)); 3210 pragma Assert (Ru = Double_Uns (X - Y));
3044 3211