Platform-specific built-in functions 
From Coq Require Import String.
Require Import Coqlib AST Integers Floats Values.
Require Import Builtins0.
Local Open Scope asttyp_scope.
Inductive platform_builtin : 
Type :=
  | 
BI_isel
  | 
BI_uisel
  | 
BI_isel64
  | 
BI_uisel64
  | 
BI_bsel
  | 
BI_mulhw
  | 
BI_mulhwu
  | 
BI_mulhd
  | 
BI_mulhdu.
Local Open Scope string_scope.
Definition platform_builtin_table : 
list (
string * 
platform_builtin) :=
     (
"__builtin_isel", 
BI_isel)
  :: (
"__builtin_uisel", 
BI_uisel)
  :: (
"__builtin_isel64", 
BI_isel64)
  :: (
"__builtin_uisel64", 
BI_uisel64)
  :: (
"__builtin_bsel", 
BI_bsel)
  :: (
"__builtin_mulhw", 
BI_mulhw)
  :: (
"__builtin_mulhwu", 
BI_mulhwu)
  :: (
"__builtin_mulhd", 
BI_mulhd)
  :: (
"__builtin_mulhdu", 
BI_mulhdu)
  :: 
nil.
Definition platform_builtin_sig (
b: 
platform_builtin) : 
signature :=
  
match b with
  | 
BI_isel | 
BI_uisel =>
     [
Xint; 
Xint; 
Xint ---> 
Xint]
  | 
BI_isel64 | 
BI_uisel64 =>
     [
Xint; 
Xlong; 
Xlong ---> 
Xlong]
  | 
BI_bsel =>
     [
Xint; 
Xint; 
Xint ---> 
Xbool]
  | 
BI_mulhw | 
BI_mulhwu =>
     [
Xint; 
Xint ---> 
Xint]
  | 
BI_mulhd | 
BI_mulhdu =>
     [
Xlong; 
Xlong ---> 
Xlong]
  
end.
Definition isel {
A: 
Type} (
c: 
int) (
n1 n2: 
A) : 
A :=
  
if Int.eq c Int.zero then n2 else n1.
Program Definition bsel (
c n1 n2: 
int) : { 
n : 
int | 
n = 
Int.zero \/ 
n = 
Int.one } :=
  
if  Int.eq (
isel c n1 n2) 
Int.zero then Int.zero else Int.one.
Definition platform_builtin_sem (
b: 
platform_builtin) : 
builtin_sem (
sig_res (
platform_builtin_sig b)) :=
  
match b with
  | 
BI_isel | 
BI_uisel =>
    
mkbuiltin_n3t Tint Tint Tint Xint isel
  | 
BI_isel64 | 
BI_uisel64 =>
    
mkbuiltin_n3t Tint Tlong Tlong Xlong isel
  | 
BI_bsel =>
    
mkbuiltin_n3t Tint Tint Tint Xbool bsel
  | 
BI_mulhw =>
    
mkbuiltin_n2t Tint Tint Xint Int.mulhs
  | 
BI_mulhwu =>
    
mkbuiltin_n2t Tint Tint Xint Int.mulhu
  | 
BI_mulhd =>
    
mkbuiltin_n2t Tlong Tlong Xlong Int64.mulhs
  | 
BI_mulhdu =>
    
mkbuiltin_n2t Tlong Tlong Xlong Int64.mulhu
  end.
Definition eq_platform_builtin: 
forall (
x y: 
platform_builtin), {
x=
y} + {
x<>
y}.
Proof.
  decide equality.
Defined.