Remark shift_symbol_address:
  forall id ofs delta,
  Genv.symbol_address ge id (Ptrofs.add ofs (Ptrofs.of_int delta)) = Val.add (Genv.symbol_address ge id ofs) (Vint delta).

(* Specifications: *)
Theorem eval_addimm: forall n, unary_constructor_sound (addimm n) (fun x => Val.add x (Vint n)).
Theorem eval_addsymbol: forall s ofs, unary_constructor_sound (addsymbol s ofs) (Val.add (Genv.symbol_address ge s ofs)).
Theorem eval_add: binary_constructor_sound add Val.add.
Theorem eval_subimm: forall n, unary_constructor_sound (subimm n) (fun v => Val.sub (Vint n) v).
Theorem eval_sub: binary_constructor_sound sub Val.sub.
Theorem eval_negint: unary_constructor_sound negint (fun v => Val.sub Vzero v).
Lemma eval_rolm: forall amount mask, unary_constructor_sound (fun a => rolm a amount mask) (fun x => Val.rolm x amount mask).
Theorem eval_shlimm: forall n, unary_constructor_sound (fun a => shlimm a n) (fun x => Val.shl x (Vint n)).
Theorem eval_shruimm: forall n, unary_constructor_sound (fun a => shruimm a n) (fun x => Val.shru x (Vint n)).
Theorem eval_shrimm: forall n, unary_constructor_sound (fun a => shrimm a n) (fun x => Val.shr x (Vint n)).
Lemma eval_mulimm_base: forall n, unary_constructor_sound (mulimm_base n) (fun x => Val.mul x (Vint n)).
Theorem eval_mulimm: forall n, unary_constructor_sound (mulimm n) (fun x => Val.mul x (Vint n)).
Theorem eval_mul: binary_constructor_sound mul Val.mul.
Theorem eval_mulhs: binary_constructor_sound mulhs Val.mulhs.
Theorem eval_mulhu: binary_constructor_sound mulhu Val.mulhu.
Theorem eval_andimm: forall n, unary_constructor_sound (andimm n) (fun x => Val.and x (Vint n)).
Theorem eval_and: binary_constructor_sound and Val.and.
Theorem eval_orimm: forall n, unary_constructor_sound (orimm n) (fun x => Val.or x (Vint n)).