Local Open Scope logic.
Local Open Scope nat.
Definition rearrange_regs2c :=
Ssequence (Sset _h (Etempvar _g tuint))
(Ssequence (Sset _g (Etempvar _f tuint))
(Ssequence (Sset _f (Etempvar _e tuint))
(Ssequence
(Sset _e
(Ebinop Oadd (Etempvar _d tuint) (Etempvar _T1 tuint)
tuint))
(Ssequence (Sset _d (Etempvar _c tuint))
(Ssequence (Sset _c (Etempvar _b tuint))
(Ssequence (Sset _b (Etempvar _a tuint))
(Sset _a
(Ebinop Oadd (Etempvar _T1 tuint)
(Etempvar _T2 tuint) tuint)))))))).
Definition rearrange_regs2b :=
Ssequence
(Sset _T1
(Ebinop Oadd (Etempvar _T1 tuint)
(Ebinop Oadd
(Ebinop Oadd
(Ebinop Oadd (Etempvar _h tuint)
(Ebinop Oxor
(Ebinop Oxor
(Ebinop Oor
(Ebinop Oshl (Etempvar _e tuint)
(Econst_int (Int.repr 26) tint) tuint)
(Ebinop Oshr
(Ebinop Oand (Etempvar _e tuint)
(Econst_int (Int.repr (-1)) tuint) tuint)
(Ebinop Osub (Econst_int (Int.repr 32) tint)
(Econst_int (Int.repr 26) tint) tint) tuint)
tuint)
(Ebinop Oor
(Ebinop Oshl (Etempvar _e tuint)
(Econst_int (Int.repr 21) tint) tuint)
(Ebinop Oshr
(Ebinop Oand (Etempvar _e tuint)
(Econst_int (Int.repr (-1)) tuint) tuint)
(Ebinop Osub (Econst_int (Int.repr 32) tint)
(Econst_int (Int.repr 21) tint) tint) tuint)
tuint) tuint)
(Ebinop Oor
(Ebinop Oshl (Etempvar _e tuint)
(Econst_int (Int.repr 7) tint) tuint)
(Ebinop Oshr
(Ebinop Oand (Etempvar _e tuint)
(Econst_int (Int.repr (-1)) tuint) tuint)
(Ebinop Osub (Econst_int (Int.repr 32) tint)
(Econst_int (Int.repr 7) tint) tint) tuint)
tuint) tuint) tuint)
(Ebinop Oxor
(Ebinop Oand (Etempvar _e tuint) (Etempvar _f tuint) tuint)
(Ebinop Oand (Eunop Onotint (Etempvar _e tuint) tuint)
(Etempvar _g tuint) tuint) tuint) tuint)
(Etempvar _Ki tuint) tuint) tuint))
(Ssequence
(Sset _T2
(Ebinop Oadd
(Ebinop Oxor
(Ebinop Oxor
(Ebinop Oor
(Ebinop Oshl (Etempvar _a tuint)
(Econst_int (Int.repr 30) tint) tuint)
(Ebinop Oshr
(Ebinop Oand (Etempvar _a tuint)
(Econst_int (Int.repr (-1)) tuint) tuint)
(Ebinop Osub (Econst_int (Int.repr 32) tint)
(Econst_int (Int.repr 30) tint) tint) tuint) tuint)
(Ebinop Oor
(Ebinop Oshl (Etempvar _a tuint)
(Econst_int (Int.repr 19) tint) tuint)
(Ebinop Oshr
(Ebinop Oand (Etempvar _a tuint)
(Econst_int (Int.repr (-1)) tuint) tuint)
(Ebinop Osub (Econst_int (Int.repr 32) tint)
(Econst_int (Int.repr 19) tint) tint) tuint) tuint)
tuint)
(Ebinop Oor
(Ebinop Oshl (Etempvar _a tuint)
(Econst_int (Int.repr 10) tint) tuint)
(Ebinop Oshr
(Ebinop Oand (Etempvar _a tuint)
(Econst_int (Int.repr (-1)) tuint) tuint)
(Ebinop Osub (Econst_int (Int.repr 32) tint)
(Econst_int (Int.repr 10) tint) tint) tuint) tuint)
tuint)
(Ebinop Oxor
(Ebinop Oxor
(Ebinop Oand (Etempvar _a tuint) (Etempvar _b tuint) tuint)
(Ebinop Oand (Etempvar _a tuint) (Etempvar _c tuint) tuint)
tuint)
(Ebinop Oand (Etempvar _b tuint) (Etempvar _c tuint) tuint)
tuint) tuint))
rearrange_regs2c).
Definition bdo_loop2_body :=
(Ssequence
(Sset _s0
(Ederef
(Ebinop Oadd (Evar _X (tarray tuint 16))
(Ebinop Oand
(Ebinop Oadd (Etempvar _i tint)
(Econst_int (Int.repr 1) tint) tint)
(Econst_int (Int.repr 15) tint) tint) (tptr tuint)) tuint))
(Ssequence
(Sset _s0
(Ebinop Oxor
(Ebinop Oxor
(Ebinop Oor
(Ebinop Oshl (Etempvar _s0 tuint)
(Econst_int (Int.repr 25) tint) tuint)
(Ebinop Oshr
(Ebinop Oand (Etempvar _s0 tuint)
(Econst_int (Int.repr (-1)) tuint) tuint)
(Ebinop Osub (Econst_int (Int.repr 32) tint)
(Econst_int (Int.repr 25) tint) tint) tuint) tuint)
(Ebinop Oor
(Ebinop Oshl (Etempvar _s0 tuint)
(Econst_int (Int.repr 14) tint) tuint)
(Ebinop Oshr
(Ebinop Oand (Etempvar _s0 tuint)
(Econst_int (Int.repr (-1)) tuint) tuint)
(Ebinop Osub (Econst_int (Int.repr 32) tint)
(Econst_int (Int.repr 14) tint) tint) tuint) tuint)
tuint)
(Ebinop Oshr (Etempvar _s0 tuint)
(Econst_int (Int.repr 3) tint) tuint) tuint))
(Ssequence
(Sset _s1
(Ederef
(Ebinop Oadd (Evar _X (tarray tuint 16))
(Ebinop Oand
(Ebinop Oadd (Etempvar _i tint)
(Econst_int (Int.repr 14) tint) tint)
(Econst_int (Int.repr 15) tint) tint) (tptr tuint))
tuint))
(Ssequence
(Sset _s1
(Ebinop Oxor
(Ebinop Oxor
(Ebinop Oor
(Ebinop Oshl (Etempvar _s1 tuint)
(Econst_int (Int.repr 15) tint) tuint)
(Ebinop Oshr
(Ebinop Oand (Etempvar _s1 tuint)
(Econst_int (Int.repr (-1)) tuint) tuint)
(Ebinop Osub (Econst_int (Int.repr 32) tint)
(Econst_int (Int.repr 15) tint) tint) tuint)
tuint)
(Ebinop Oor
(Ebinop Oshl (Etempvar _s1 tuint)
(Econst_int (Int.repr 13) tint) tuint)
(Ebinop Oshr
(Ebinop Oand (Etempvar _s1 tuint)
(Econst_int (Int.repr (-1)) tuint) tuint)
(Ebinop Osub (Econst_int (Int.repr 32) tint)
(Econst_int (Int.repr 13) tint) tint) tuint)
tuint) tuint)
(Ebinop Oshr (Etempvar _s1 tuint)
(Econst_int (Int.repr 10) tint) tuint) tuint))
(Ssequence
(Sset _T1
(Ederef
(Ebinop Oadd (Evar _X (tarray tuint 16))
(Ebinop Oand (Etempvar _i tint)
(Econst_int (Int.repr 15) tint) tint)
(tptr tuint)) tuint))
(Ssequence
(Sset _t
(Ederef
(Ebinop Oadd (Evar _X (tarray tuint 16))
(Ebinop Oand
(Ebinop Oadd (Etempvar _i tint)
(Econst_int (Int.repr 9) tint) tint)
(Econst_int (Int.repr 15) tint) tint)
(tptr tuint)) tuint))
(Ssequence
(Sset _T1
(Ebinop Oadd (Etempvar _T1 tuint)
(Ebinop Oadd
(Ebinop Oadd (Etempvar _s0 tuint)
(Etempvar _s1 tuint) tuint)
(Etempvar _t tuint) tuint) tuint))
(Ssequence
(Sassign
(Ederef
(Ebinop Oadd (Evar _X (tarray tuint 16))
(Ebinop Oand (Etempvar _i tint)
(Econst_int (Int.repr 15) tint) tint)
(tptr tuint)) tuint) (Etempvar _T1 tuint))
(Ssequence
(Sset _Ki
(Ederef
(Ebinop Oadd
(Evar _K256 (tarray tuint 64))
(Etempvar _i tint) (tptr tuint)) tuint))
rearrange_regs2b))))))))).
Definition block_data_order_loop2 :=
nth 1 (loops (fn_body f_sha256_block_data_order)) Sskip.
Fixpoint Xarray' (b: list int) (i k: nat) : list int :=
match k with
| O => nil
| S k' => W (nthi b) (Z.of_nat i - 16 + (16-(Z.of_nat k)- Z.of_nat i) mod 16) ::
Xarray' b i k'
end.
Definition Xarray (b: list int) (i: nat) := Xarray' b i 16.
Hint Resolve Znth_land_is_int.

Lemma extract_from_b:
forall b i n,
length b = 16%nat ->
16 <= i < 64 ->
(0 <= n < 16)%Z ->
nthi (Xarray b i) ((Z.of_nat i + n) mod 16) = W (nthi b) (Z.of_nat i - 16 + n).