Module OpHelpers


Require Import Coqlib.
Require Import AST Integers Floats.
Require Import Op CminorSel.

Some arithmetic operations are transformed into calls to runtime library functions. The following type class collects the names of these functions.

Definition sig_l_l := mksignature (Tlong :: nil) Tlong cc_default.
Definition sig_l_f := mksignature (Tlong :: nil) Tfloat cc_default.
Definition sig_l_s := mksignature (Tlong :: nil) Tsingle cc_default.
Definition sig_f_l := mksignature (Tfloat :: nil) Tlong cc_default.
Definition sig_ll_l := mksignature (Tlong :: Tlong :: nil) Tlong cc_default.
Definition sig_li_l := mksignature (Tlong :: Tint :: nil) Tlong cc_default.
Definition sig_ii_l := mksignature (Tint :: Tint :: nil) Tlong cc_default.
Definition sig_ii_i := mksignature (Tint :: Tint :: nil) Tint cc_default.
Definition sig_ff_f := mksignature (Tfloat :: Tfloat :: nil) Tfloat cc_default.
Definition sig_ss_s := mksignature (Tsingle :: Tsingle :: nil) Tsingle cc_default.

Class helper_functions := mk_helper_functions {
  i64_dtos: ident; (* float64 -> signed long *)
  i64_dtou: ident; (* float64 -> unsigned long *)
  i64_stod: ident; (* signed long -> float64 *)
  i64_utod: ident; (* unsigned long -> float64 *)
  i64_stof: ident; (* signed long -> float32 *)
  i64_utof: ident; (* unsigned long -> float32 *)
  i64_sdiv: ident; (* signed division *)
  i64_udiv: ident; (* unsigned division *)
  i64_smod: ident; (* signed remainder *)
  i64_umod: ident; (* unsigned remainder *)
  i64_shl: ident; (* shift left *)
  i64_shr: ident; (* shift right unsigned *)
  i64_sar: ident; (* shift right signed *)
  i64_umulh: ident; (* unsigned multiply high *)
  i64_smulh: ident; (* signed multiply high *)
  i32_sdiv: ident; (* signed division *)
  i32_udiv: ident; (* unsigned division *)
  i32_smod: ident; (* signed remainder *)
  i32_umod: ident; (* unsigned remainder *)
  f64_div: ident;
  f32_div: ident;
}.