Module Builtins1


Platform-specific built-in functions

From Coq Require Import String.
Require Import Coqlib AST Integers Floats Values.
Require Import Builtins0.

Inductive platform_builtin : Type :=
| BI_bits_of_float
| BI_float_of_bits
| BI_clz
| BI_ctz
| BI_reverse_bits.

Local Open Scope string_scope.
Local Open Scope asttyp_scope.

Definition platform_builtin_table : list (string * platform_builtin) :=
     ("__builtin_bits_of_float", BI_bits_of_float)
  :: ("__builtin_float_of_bits", BI_float_of_bits)
  :: ("__builtin_clz", BI_clz)
  :: ("__builtin_ctz", BI_ctz)
  :: ("__builtin_ctzl", BI_ctz)
  :: ("__builtin_reverse_bits", BI_reverse_bits)
  :: nil.

Definition platform_builtin_sig (b: platform_builtin) : signature :=
  match b with
  | BI_bits_of_float => [Xsingle ---> Xint ]
  | BI_float_of_bits => [Xint ---> Xsingle ]
  | BI_clz => [Xint ---> Xint ]
  | BI_ctz => [Xint ---> Xint ]
  | BI_reverse_bits => [Xint ---> Xint ]
  end.

Definition platform_builtin_sem (b: platform_builtin) : builtin_sem (sig_res (platform_builtin_sig b)) :=
  match b with
  | BI_bits_of_float => mkbuiltin_n1t Tsingle Xint Float32.to_bits
  | BI_float_of_bits => mkbuiltin_n1t Tint Xsingle Float32.of_bits
  | BI_clz => mkbuiltin_n1t Tint Xint Int.clz
  | BI_ctz => mkbuiltin_n1t Tint Xint Int.ctz
  | BI_reverse_bits => mkbuiltin_n1t Tint Xint Int.reverse_bits
  end.

Definition eq_platform_builtin: forall (x y: platform_builtin), {x=y} + {x<>y}.
Proof.
  decide equality.
Defined.