(* *********************************************************************)
(*                                                                     *)
(*              The Compcert verified compiler                         *)
(*                                                                     *)
(*          Xavier Leroy, INRIA Paris-Rocquencourt                     *)
(*                                                                     *)
(*  Copyright Institut National de Recherche en Informatique et en     *)
(*  Automatique.  All rights reserved.  This file is distributed       *)
(*  under the terms of the INRIA Non-Commercial License Agreement.     *)
(*                                                                     *)
(* *********************************************************************)
(** Abstract syntax and semantics for PowerPC assembly language *)
(** * Abstract syntax *)
(** Integer registers, floating-point registers. *)
Inductive ireg: Type :=
| GPR0: ireg  | GPR1: ireg  | GPR2: ireg  | GPR3: ireg
| GPR4: ireg  | GPR5: ireg  | GPR6: ireg  | GPR7: ireg
| GPR8: ireg  | GPR9: ireg  | GPR10: ireg | GPR11: ireg
| GPR12: ireg | GPR13: ireg | GPR14: ireg | GPR15: ireg
| GPR16: ireg | GPR17: ireg | GPR18: ireg | GPR19: ireg
| GPR20: ireg | GPR21: ireg | GPR22: ireg | GPR23: ireg
| GPR24: ireg | GPR25: ireg | GPR26: ireg | GPR27: ireg
| GPR28: ireg | GPR29: ireg | GPR30: ireg | GPR31: ireg.
Inductive freg: Type :=
| FPR0: freg  | FPR1: freg  | FPR2: freg  | FPR3: freg
| FPR4: freg  | FPR5: freg  | FPR6: freg  | FPR7: freg
| FPR8: freg  | FPR9: freg  | FPR10: freg | FPR11: freg
| FPR12: freg | FPR13: freg | FPR14: freg | FPR15: freg
| FPR16: freg | FPR17: freg | FPR18: freg | FPR19: freg
| FPR20: freg | FPR21: freg | FPR22: freg | FPR23: freg
| FPR24: freg | FPR25: freg | FPR26: freg | FPR27: freg
| FPR28: freg | FPR29: freg | FPR30: freg | FPR31: freg.

Lemma ireg_eq: forall (x y: ireg), {x=y} + {x<>y}.
Fixpoint label_pos (lbl: label) (pos: Z) (c: code) {struct c} : option Z :=
match c with
| nil => None
| instr :: c' =>
if is_label lbl instr then Some (pos + 1) else label_pos lbl (pos + 1) c'
end.