summaryrefslogtreecommitdiff
path: root/lib/sail.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sail.h')
-rw-r--r--lib/sail.h29
1 files changed, 27 insertions, 2 deletions
diff --git a/lib/sail.h b/lib/sail.h
index 666c75fe..f5ff0eaa 100644
--- a/lib/sail.h
+++ b/lib/sail.h
@@ -8,6 +8,16 @@
#include<time.h>
+static inline void *sail_malloc(size_t size)
+{
+ return malloc(size);
+}
+
+static inline void sail_free(void *ptr)
+{
+ free(ptr);
+}
+
/*
* Called by the RTS to initialise and clear any library state.
*/
@@ -84,6 +94,8 @@ bool EQUAL(mach_int)(const mach_int, const mach_int);
typedef mpz_t sail_int;
+uint64_t sail_int_get_ui(const sail_int);
+
#define SAIL_INT_FUNCTION(fname, rtype, ...) void fname(rtype*, __VA_ARGS__)
SAIL_BUILTIN_TYPE(sail_int);
@@ -127,6 +139,7 @@ SAIL_INT_FUNCTION(shr_int, sail_int, const sail_int, const sail_int);
* constraints.
*/
SAIL_INT_FUNCTION(undefined_int, sail_int, const int);
+SAIL_INT_FUNCTION(undefined_nat, sail_int, const unit);
SAIL_INT_FUNCTION(undefined_range, sail_int, const sail_int, const sail_int);
/*
@@ -164,6 +177,11 @@ typedef uint64_t fbits;
bool eq_bit(const fbits a, const fbits b);
+static inline bool bit_to_bool(const fbits a)
+{
+ return (bool) a;
+}
+
bool EQUAL(fbits)(const fbits, const fbits);
typedef struct {
@@ -215,7 +233,7 @@ void CONVERT_OF(lbits, sbits)(lbits *, const sbits, const bool);
sbits CONVERT_OF(sbits, fbits)(const fbits, const uint64_t, const bool);
sbits CONVERT_OF(sbits, lbits)(const lbits, const bool);
-void UNDEFINED(lbits)(lbits *, const sail_int len, const fbits bit);
+void UNDEFINED(lbits)(lbits *, const sail_int len);
fbits UNDEFINED(fbits)(const unit);
sbits undefined_sbits(void);
@@ -254,6 +272,7 @@ fbits fast_sign_extend(const fbits op, const uint64_t n, const uint64_t m);
fbits fast_sign_extend2(const sbits op, const uint64_t m);
void length_lbits(sail_int *rop, const lbits op);
+void count_leading_zeros(sail_int *rop, const lbits op);
bool eq_bits(const lbits op1, const lbits op2);
bool EQUAL(lbits)(const lbits op1, const lbits op2);
@@ -316,19 +335,24 @@ void set_slice(lbits *rop,
const sail_int start_mpz,
const lbits slice);
-
void shift_bits_left(lbits *rop, const lbits op1, const lbits op2);
void shift_bits_right(lbits *rop, const lbits op1, const lbits op2);
void shift_bits_right_arith(lbits *rop, const lbits op1, const lbits op2);
void shiftl(lbits *rop, const lbits op1, const sail_int op2);
void shiftr(lbits *rop, const lbits op1, const sail_int op2);
+void arith_shiftr(lbits *rop, const lbits op1, const sail_int op2);
void reverse_endianness(lbits*, lbits);
bool eq_sbits(const sbits op1, const sbits op2);
bool neq_sbits(const sbits op1, const sbits op2);
+sbits not_sbits(const sbits op);
sbits xor_sbits(const sbits op1, const sbits op2);
+sbits or_sbits(const sbits op1, const sbits op2);
+sbits and_sbits(const sbits op1, const sbits op2);
+sbits add_sbits(const sbits op1, const sbits op2);
+sbits sub_sbits(const sbits op1, const sbits op2);
/* ***** Sail reals ***** */
@@ -376,6 +400,7 @@ void string_length(sail_int *len, sail_string s);
void string_drop(sail_string *dst, sail_string s, sail_int len);
void string_take(sail_string *dst, sail_string s, sail_int len);
+
/* ***** Printing ***** */
void string_of_int(sail_string *str, const sail_int i);