(** Some PowerPC instructions treat register GPR0 as the integer literal 0 when that register is used in argument position. *)
Definition gpr_or_zero (rs: regset) (r: ireg) :=
if ireg_eq r GPR0 then Vint Int.zero else rs#r.
Definition gpr_or_zero_l (rs: regset) (r: ireg) :=
if ireg_eq r GPR0 then Vlong Int64.zero else rs#r.
Variable ge: genv.
(** The two functions below axiomatize how the linker processes symbolic references [symbol + offset] and splits their actual values into two 16-bit halves. *)
Parameter low_half: genv -> ident -> ptrofs -> val.
Parameter high_half: genv -> ident -> ptrofs -> val.
(** The fundamental property of these operations is that, when applied to the address of a symbol, their results can be recombined by addition, rebuilding the original address. *)

(* Specifications: *)
Axiom low_high_half:
forall id ofs,
Val.add (high_half ge id ofs) (low_half ge id ofs) = Genv.symbol_address ge id ofs.