(* Calls forward_if with the current precondition to which the provided conditions are added *)
(* QQQ TODO does this already exist? Add to library? *)
Ltac forward_if_diff add := match add with
| (PROPx ?P2 (LOCALx ?Q2 (SEPx ?R2))) => match goal with
  | |- semax ?Delta (PROPx ?P1 (LOCALx ?Q1 (SEPx ?R1))) _ _ =>
    let P3 := fresh "P3" in let Q3 := fresh "Q3" in let R3 := fresh "R3" in
    pose (P3 := P1 ++ P2); pose (Q3 := Q1 ++ Q2); pose (R3 := R1 ++ R2);
    simpl in P3, Q3, R3;
    forward_if (PROPx P3 (LOCALx Q3 (SEPx R3)));
    subst P3 Q3 R3
  end
end.

Lemma Znth_partially_expanded_key: forall key i, 0 <= i < 7 -> forall j, 0 <= j < 8 + i*8 -> (Znth j (map Vint (pow_fun GrowKeyByOne (Z.to_nat (i * 8)) key) ++ repeat_op_table (60 - i * 8) Vundef id)) = Vint (Znth j (KeyExpansion2 key)).