(** 64-bit integer constants and arithmetic *)

(* Specifications: *)
Lemma load_hilo64_correct:
forall rd hi lo k rs m,
exists rs',
exec_straight ge fn (load_hilo64 rd hi lo k) rs m k rs' m
/\ rs'#rd = Vlong (Int64.add (Int64.sign_ext 32 (Int64.shl hi (Int64.repr 12))) lo)
/\ forall r, r <> PC -> r <> rd -> rs'#r = rs#r.
Lemma loadimm64_correct:
forall rd n k rs m,
exists rs',
exec_straight ge fn (loadimm64 rd n k) rs m k rs' m
/\ rs'#rd = Vlong n
/\ forall r, r <> PC -> r <> rd -> r <> X31 -> rs'#r = rs#r.
Lemma opimm64_correct:
forall (op: ireg -> ireg0 -> ireg0 -> instruction)
(opi: ireg -> ireg0 -> int64 -> instruction)
(sem: val -> val -> val) m,
(forall d s1 s2 rs,
exec_instr ge fn (op d s1 s2) rs m = Next (nextinstr (rs#d <- (sem rs###s1 rs###s2))) m) ->
(forall d s n rs,
exec_instr ge fn (opi d s n) rs m = Next (nextinstr (rs#d <- (sem rs###s (Vlong n)))) m) ->
forall rd r1 n k rs,
r1 <> X31 ->
exists rs',
exec_straight ge fn (opimm64 op opi rd r1 n k) rs m k rs' m
/\ rs'#rd = sem rs##r1 (Vlong n)
/\ forall r, r <> PC -> r <> rd -> r <> X31 -> rs'#r = rs#r.