Idris2/support/refc/mathFunctions.c
2022-09-21 12:12:34 +01:00

666 lines
24 KiB
C

#include "mathFunctions.h"
#include "memoryManagement.h"
#include "runtime.h"
double unpackDouble(Value *d) { return ((Value_Double *)d)->d; }
/* add */
Value *add_Bits8(Value *x, Value *y) {
return (Value *)makeBits8(((Value_Bits8 *)x)->ui8 + ((Value_Bits8 *)y)->ui8);
}
Value *add_Bits16(Value *x, Value *y) {
return (Value *)makeBits16(((Value_Bits16 *)x)->ui16 +
((Value_Bits16 *)y)->ui16);
}
Value *add_Bits32(Value *x, Value *y) {
return (Value *)makeBits32(((Value_Bits32 *)x)->ui32 +
((Value_Bits32 *)y)->ui32);
}
Value *add_Bits64(Value *x, Value *y) {
return (Value *)makeBits64(((Value_Bits64 *)x)->ui64 +
((Value_Bits64 *)y)->ui64);
}
Value *add_Int8(Value *x, Value *y) {
return (Value *)makeInt8(((Value_Int8 *)x)->i8 + ((Value_Int8 *)y)->i8);
}
Value *add_Int16(Value *x, Value *y) {
return (Value *)makeInt16(((Value_Int16 *)x)->i16 + ((Value_Int16 *)y)->i16);
}
Value *add_Int32(Value *x, Value *y) {
return (Value *)makeInt32(((Value_Int32 *)x)->i32 + ((Value_Int32 *)y)->i32);
}
Value *add_Int64(Value *x, Value *y) {
return (Value *)makeInt64(((Value_Int64 *)x)->i64 + ((Value_Int64 *)y)->i64);
}
Value *add_Integer(Value *x, Value *y) {
Value_Integer *retVal = makeInteger();
mpz_add(retVal->i, ((Value_Integer *)x)->i, ((Value_Integer *)y)->i);
return (Value *)retVal;
}
Value *add_double(Value *x, Value *y) {
return (Value *)makeDouble(((Value_Double *)x)->d + ((Value_Double *)y)->d);
}
/* sub */
Value *sub_Bits8(Value *x, Value *y) {
return (Value *)makeBits8(((Value_Bits8 *)x)->ui8 - ((Value_Bits8 *)y)->ui8);
}
Value *sub_Bits16(Value *x, Value *y) {
return (Value *)makeBits16(((Value_Bits16 *)x)->ui16 -
((Value_Bits16 *)y)->ui16);
}
Value *sub_Bits32(Value *x, Value *y) {
return (Value *)makeBits32(((Value_Bits32 *)x)->ui32 -
((Value_Bits32 *)y)->ui32);
}
Value *sub_Bits64(Value *x, Value *y) {
return (Value *)makeBits64(((Value_Bits64 *)x)->ui64 -
((Value_Bits64 *)y)->ui64);
}
Value *sub_Int8(Value *x, Value *y) {
return (Value *)makeInt8(((Value_Int8 *)x)->i8 - ((Value_Int8 *)y)->i8);
}
Value *sub_Int16(Value *x, Value *y) {
return (Value *)makeInt16(((Value_Int16 *)x)->i16 - ((Value_Int16 *)y)->i16);
}
Value *sub_Int32(Value *x, Value *y) {
return (Value *)makeInt32(((Value_Int32 *)x)->i32 - ((Value_Int32 *)y)->i32);
}
Value *sub_Int64(Value *x, Value *y) {
return (Value *)makeInt64(((Value_Int64 *)x)->i64 - ((Value_Int64 *)y)->i64);
}
Value *sub_Integer(Value *x, Value *y) {
Value_Integer *retVal = makeInteger();
mpz_sub(retVal->i, ((Value_Integer *)x)->i, ((Value_Integer *)y)->i);
return (Value *)retVal;
}
Value *sub_double(Value *x, Value *y) {
return (Value *)makeDouble(((Value_Double *)x)->d - ((Value_Double *)y)->d);
}
/* negate */
Value *negate_Bits8(Value *x) {
return (Value *)makeBits8(-((Value_Bits8 *)x)->ui8);
}
Value *negate_Bits16(Value *x) {
return (Value *)makeBits16(-((Value_Bits16 *)x)->ui16);
}
Value *negate_Bits32(Value *x) {
return (Value *)makeBits32(-((Value_Bits32 *)x)->ui32);
}
Value *negate_Bits64(Value *x) {
return (Value *)makeBits64(-((Value_Bits64 *)x)->ui64);
}
Value *negate_Int8(Value *x) {
return (Value *)makeInt8(-((Value_Int8 *)x)->i8);
}
Value *negate_Int16(Value *x) {
return (Value *)makeInt16(-((Value_Int16 *)x)->i16);
}
Value *negate_Int32(Value *x) {
return (Value *)makeInt32(-((Value_Int32 *)x)->i32);
}
Value *negate_Int64(Value *x) {
return (Value *)makeInt64(-((Value_Int64 *)x)->i64);
}
Value *negate_Integer(Value *x) {
Value_Integer *retVal = makeInteger();
mpz_neg(retVal->i, ((Value_Integer *)x)->i);
return (Value *)retVal;
}
Value *negate_double(Value *x) {
return (Value *)makeDouble(-((Value_Double *)x)->d);
}
/* mul */
Value *mul_Bits8(Value *x, Value *y) {
return (Value *)makeBits8(((Value_Bits8 *)x)->ui8 * ((Value_Bits8 *)y)->ui8);
}
Value *mul_Bits16(Value *x, Value *y) {
return (Value *)makeBits16(((Value_Bits16 *)x)->ui16 *
((Value_Bits16 *)y)->ui16);
}
Value *mul_Bits32(Value *x, Value *y) {
return (Value *)makeBits32(((Value_Bits32 *)x)->ui32 *
((Value_Bits32 *)y)->ui32);
}
Value *mul_Bits64(Value *x, Value *y) {
return (Value *)makeBits64(((Value_Bits64 *)x)->ui64 *
((Value_Bits64 *)y)->ui64);
}
Value *mul_Int8(Value *x, Value *y) {
return (Value *)makeInt8(((Value_Int8 *)x)->i8 * ((Value_Int8 *)y)->i8);
}
Value *mul_Int16(Value *x, Value *y) {
return (Value *)makeInt16(((Value_Int16 *)x)->i16 * ((Value_Int16 *)y)->i16);
}
Value *mul_Int32(Value *x, Value *y) {
return (Value *)makeInt32(((Value_Int32 *)x)->i32 * ((Value_Int32 *)y)->i32);
}
Value *mul_Int64(Value *x, Value *y) {
return (Value *)makeInt64(((Value_Int64 *)x)->i64 * ((Value_Int64 *)y)->i64);
}
Value *mul_Integer(Value *x, Value *y) {
Value_Integer *retVal = makeInteger();
mpz_mul(retVal->i, ((Value_Integer *)x)->i, ((Value_Integer *)y)->i);
return (Value *)retVal;
}
Value *mul_double(Value *x, Value *y) {
return (Value *)makeDouble(((Value_Double *)x)->d * ((Value_Double *)y)->d);
}
/* div */
Value *div_Bits8(Value *x, Value *y) {
return (Value *)makeBits8(((Value_Bits8 *)x)->ui8 / ((Value_Bits8 *)y)->ui8);
}
Value *div_Bits16(Value *x, Value *y) {
return (Value *)makeBits16(((Value_Bits16 *)x)->ui16 /
((Value_Bits16 *)y)->ui16);
}
Value *div_Bits32(Value *x, Value *y) {
return (Value *)makeBits32(((Value_Bits32 *)x)->ui32 /
((Value_Bits32 *)y)->ui32);
}
Value *div_Bits64(Value *x, Value *y) {
return (Value *)makeBits64(((Value_Bits64 *)x)->ui64 /
((Value_Bits64 *)y)->ui64);
}
Value *div_Int8(Value *x, Value *y) {
// Correction term added to convert from truncated division (C default) to
// Euclidean division For proof of correctness, see Division and Modulus for
// Computer Scientists (Daan Leijen)
// https://www.microsoft.com/en-us/research/publication/division-and-modulus-for-computer-scientists/
int8_t num = ((Value_Int8 *)x)->i8;
int8_t denom = ((Value_Int8 *)y)->i8;
int8_t rem = num % denom;
return (Value *)makeInt8(num / denom +
((rem < 0) ? (denom < 0) ? 1 : -1 : 0));
}
Value *div_Int16(Value *x, Value *y) {
// Correction term added to convert from truncated division (C default) to
// Euclidean division For proof of correctness, see Division and Modulus for
// Computer Scientists (Daan Leijen)
// https://www.microsoft.com/en-us/research/publication/division-and-modulus-for-computer-scientists/
int16_t num = ((Value_Int16 *)x)->i16;
int16_t denom = ((Value_Int16 *)y)->i16;
int16_t rem = num % denom;
return (Value *)makeInt16(num / denom +
((rem < 0) ? (denom < 0) ? 1 : -1 : 0));
}
Value *div_Int32(Value *x, Value *y) {
// Correction term added to convert from truncated division (C default) to
// Euclidean division For proof of correctness, see Division and Modulus for
// Computer Scientists (Daan Leijen)
// https://www.microsoft.com/en-us/research/publication/division-and-modulus-for-computer-scientists/
int32_t num = ((Value_Int32 *)x)->i32;
int32_t denom = ((Value_Int32 *)y)->i32;
int32_t rem = num % denom;
return (Value *)makeInt32(num / denom +
((rem < 0) ? (denom < 0) ? 1 : -1 : 0));
}
Value *div_Int64(Value *x, Value *y) {
// Correction term added to convert from truncated division (C default) to
// Euclidean division For proof of correctness, see Division and Modulus for
// Computer Scientists (Daan Leijen)
// https://www.microsoft.com/en-us/research/publication/division-and-modulus-for-computer-scientists/
int64_t num = ((Value_Int64 *)x)->i64;
int64_t denom = ((Value_Int64 *)y)->i64;
int64_t rem = num % denom;
return (Value *)makeInt64(num / denom +
((rem < 0) ? (denom < 0) ? 1 : -1 : 0));
}
Value *div_Integer(Value *x, Value *y) {
mpz_t rem, yq;
mpz_inits(rem, yq, NULL);
mpz_mod(rem, ((Value_Integer *)x)->i, ((Value_Integer *)y)->i);
mpz_sub(yq, ((Value_Integer *)x)->i, rem);
Value_Integer *retVal = makeInteger();
mpz_divexact(retVal->i, yq, ((Value_Integer *)y)->i);
mpz_clears(rem, yq, NULL);
return (Value *)retVal;
}
Value *div_double(Value *x, Value *y) {
return (Value *)makeDouble(((Value_Double *)x)->d / ((Value_Double *)y)->d);
}
/* mod */
Value *mod_Bits8(Value *x, Value *y) {
return (Value *)makeBits8(((Value_Bits8 *)x)->ui8 % ((Value_Bits8 *)y)->ui8);
}
Value *mod_Bits16(Value *x, Value *y) {
return (Value *)makeBits16(((Value_Bits16 *)x)->ui16 %
((Value_Bits16 *)y)->ui16);
}
Value *mod_Bits32(Value *x, Value *y) {
return (Value *)makeBits32(((Value_Bits32 *)x)->ui32 %
((Value_Bits32 *)y)->ui32);
}
Value *mod_Bits64(Value *x, Value *y) {
return (Value *)makeBits64(((Value_Bits64 *)x)->ui64 %
((Value_Bits64 *)y)->ui64);
}
Value *mod_Int8(Value *x, Value *y) {
int8_t num = ((Value_Int8 *)x)->i8;
int8_t denom = ((Value_Int8 *)y)->i8;
denom = (denom < 0) ? -denom : denom;
return (Value *)makeInt8(num % denom + (num < 0 ? denom : 0));
}
Value *mod_Int16(Value *x, Value *y) {
int16_t num = ((Value_Int16 *)x)->i16;
int16_t denom = ((Value_Int16 *)y)->i16;
denom = (denom < 0) ? -denom : denom;
return (Value *)makeInt16(num % denom + (num < 0 ? denom : 0));
}
Value *mod_Int32(Value *x, Value *y) {
int32_t num = ((Value_Int32 *)x)->i32;
int32_t denom = ((Value_Int32 *)y)->i32;
denom = (denom < 0) ? -denom : denom;
return (Value *)makeInt32(num % denom + (num < 0 ? denom : 0));
}
Value *mod_Int64(Value *x, Value *y) {
int64_t num = ((Value_Int64 *)x)->i64;
int64_t denom = ((Value_Int64 *)y)->i64;
denom = (denom < 0) ? -denom : denom;
return (Value *)makeInt64(num % denom + (num < 0 ? denom : 0));
}
Value *mod_Integer(Value *x, Value *y) {
Value_Integer *retVal = makeInteger();
mpz_mod(retVal->i, ((Value_Integer *)x)->i, ((Value_Integer *)y)->i);
return (Value *)retVal;
}
/* shiftl */
Value *shiftl_Bits8(Value *x, Value *y) {
return (Value *)makeBits8(((Value_Bits8 *)x)->ui8 << ((Value_Bits8 *)y)->ui8);
}
Value *shiftl_Bits16(Value *x, Value *y) {
return (Value *)makeBits16(((Value_Bits16 *)x)->ui16
<< ((Value_Bits16 *)y)->ui16);
}
Value *shiftl_Bits32(Value *x, Value *y) {
return (Value *)makeBits32(((Value_Bits32 *)x)->ui32
<< ((Value_Bits32 *)y)->ui32);
}
Value *shiftl_Bits64(Value *x, Value *y) {
return (Value *)makeBits64(((Value_Bits64 *)x)->ui64
<< ((Value_Bits64 *)y)->ui64);
}
Value *shiftl_Int8(Value *x, Value *y) {
return (Value *)makeInt8(((Value_Int8 *)x)->i8 << ((Value_Int8 *)y)->i8);
}
Value *shiftl_Int16(Value *x, Value *y) {
return (Value *)makeInt16(((Value_Int16 *)x)->i16 << ((Value_Int16 *)y)->i16);
}
Value *shiftl_Int32(Value *x, Value *y) {
return (Value *)makeInt32(((Value_Int32 *)x)->i32 << ((Value_Int32 *)y)->i32);
}
Value *shiftl_Int64(Value *x, Value *y) {
return (Value *)makeInt64(((Value_Int64 *)x)->i64 << ((Value_Int64 *)y)->i64);
}
Value *shiftl_Integer(Value *x, Value *y) {
Value_Integer *retVal = makeInteger();
mp_bitcnt_t cnt = (mp_bitcnt_t)mpz_get_ui(((Value_Integer *)y)->i);
mpz_mul_2exp(retVal->i, ((Value_Integer *)x)->i, cnt);
return (Value *)retVal;
}
/* shiftr */
Value *shiftr_Bits8(Value *x, Value *y) {
return (Value *)makeBits8(((Value_Bits8 *)x)->ui8 >> ((Value_Bits8 *)y)->ui8);
}
Value *shiftr_Bits16(Value *x, Value *y) {
return (Value *)makeBits16(((Value_Bits16 *)x)->ui16 >>
((Value_Bits16 *)y)->ui16);
}
Value *shiftr_Bits32(Value *x, Value *y) {
return (Value *)makeBits32(((Value_Bits32 *)x)->ui32 >>
((Value_Bits32 *)y)->ui32);
}
Value *shiftr_Bits64(Value *x, Value *y) {
return (Value *)makeBits64(((Value_Bits64 *)x)->ui64 >>
((Value_Bits64 *)y)->ui64);
}
Value *shiftr_Int8(Value *x, Value *y) {
return (Value *)makeInt8(((Value_Int8 *)x)->i8 >> ((Value_Int8 *)y)->i8);
}
Value *shiftr_Int16(Value *x, Value *y) {
return (Value *)makeInt16(((Value_Int16 *)x)->i16 >> ((Value_Int16 *)y)->i16);
}
Value *shiftr_Int32(Value *x, Value *y) {
return (Value *)makeInt32(((Value_Int32 *)x)->i32 >> ((Value_Int32 *)y)->i32);
}
Value *shiftr_Int64(Value *x, Value *y) {
return (Value *)makeInt64(((Value_Int64 *)x)->i64 >> ((Value_Int64 *)y)->i64);
}
Value *shiftr_Integer(Value *x, Value *y) {
Value_Integer *retVal = makeInteger();
mp_bitcnt_t cnt = (mp_bitcnt_t)mpz_get_ui(((Value_Integer *)y)->i);
mpz_fdiv_q_2exp(retVal->i, ((Value_Integer *)x)->i, cnt);
return (Value *)retVal;
}
/* and */
Value *and_Bits8(Value *x, Value *y) {
return (Value *)makeBits8(((Value_Bits8 *)x)->ui8 & ((Value_Bits8 *)y)->ui8);
}
Value *and_Bits16(Value *x, Value *y) {
return (Value *)makeBits16(((Value_Bits16 *)x)->ui16 &
((Value_Bits16 *)y)->ui16);
}
Value *and_Bits32(Value *x, Value *y) {
return (Value *)makeBits32(((Value_Bits32 *)x)->ui32 &
((Value_Bits32 *)y)->ui32);
}
Value *and_Bits64(Value *x, Value *y) {
return (Value *)makeBits64(((Value_Bits64 *)x)->ui64 &
((Value_Bits64 *)y)->ui64);
}
Value *and_Int8(Value *x, Value *y) {
return (Value *)makeInt8(((Value_Int8 *)x)->i8 & ((Value_Int8 *)y)->i8);
}
Value *and_Int16(Value *x, Value *y) {
return (Value *)makeInt16(((Value_Int16 *)x)->i16 & ((Value_Int16 *)y)->i16);
}
Value *and_Int32(Value *x, Value *y) {
return (Value *)makeInt32(((Value_Int32 *)x)->i32 & ((Value_Int32 *)y)->i32);
}
Value *and_Int64(Value *x, Value *y) {
return (Value *)makeInt64(((Value_Int64 *)x)->i64 & ((Value_Int64 *)y)->i64);
}
Value *and_Integer(Value *x, Value *y) {
Value_Integer *retVal = makeInteger();
mpz_and(retVal->i, ((Value_Integer *)x)->i, ((Value_Integer *)y)->i);
return (Value *)retVal;
}
/* or */
Value *or_Bits8(Value *x, Value *y) {
return (Value *)makeBits8(((Value_Bits8 *)x)->ui8 | ((Value_Bits8 *)y)->ui8);
}
Value *or_Bits16(Value *x, Value *y) {
return (Value *)makeBits16(((Value_Bits16 *)x)->ui16 |
((Value_Bits16 *)y)->ui16);
}
Value *or_Bits32(Value *x, Value *y) {
return (Value *)makeBits32(((Value_Bits32 *)x)->ui32 |
((Value_Bits32 *)y)->ui32);
}
Value *or_Bits64(Value *x, Value *y) {
return (Value *)makeBits64(((Value_Bits64 *)x)->ui64 |
((Value_Bits64 *)y)->ui64);
}
Value *or_Int8(Value *x, Value *y) {
return (Value *)makeInt8(((Value_Int8 *)x)->i8 | ((Value_Int8 *)y)->i8);
}
Value *or_Int16(Value *x, Value *y) {
return (Value *)makeInt16(((Value_Int16 *)x)->i16 | ((Value_Int16 *)y)->i16);
}
Value *or_Int32(Value *x, Value *y) {
return (Value *)makeInt32(((Value_Int32 *)x)->i32 | ((Value_Int32 *)y)->i32);
}
Value *or_Int64(Value *x, Value *y) {
return (Value *)makeInt64(((Value_Int64 *)x)->i64 | ((Value_Int64 *)y)->i64);
}
Value *or_Integer(Value *x, Value *y) {
Value_Integer *retVal = makeInteger();
mpz_ior(retVal->i, ((Value_Integer *)x)->i, ((Value_Integer *)y)->i);
return (Value *)retVal;
}
/* xor */
Value *xor_Bits8(Value *x, Value *y) {
return (Value *)makeBits8(((Value_Bits8 *)x)->ui8 ^ ((Value_Bits8 *)y)->ui8);
}
Value *xor_Bits16(Value *x, Value *y) {
return (Value *)makeBits16(((Value_Bits16 *)x)->ui16 ^
((Value_Bits16 *)y)->ui16);
}
Value *xor_Bits32(Value *x, Value *y) {
return (Value *)makeBits32(((Value_Bits32 *)x)->ui32 ^
((Value_Bits32 *)y)->ui32);
}
Value *xor_Bits64(Value *x, Value *y) {
return (Value *)makeBits64(((Value_Bits64 *)x)->ui64 ^
((Value_Bits64 *)y)->ui64);
}
Value *xor_Int8(Value *x, Value *y) {
return (Value *)makeInt8(((Value_Int8 *)x)->i8 ^ ((Value_Int8 *)y)->i8);
}
Value *xor_Int16(Value *x, Value *y) {
return (Value *)makeInt16(((Value_Int16 *)x)->i16 ^ ((Value_Int16 *)y)->i16);
}
Value *xor_Int32(Value *x, Value *y) {
return (Value *)makeInt32(((Value_Int32 *)x)->i32 ^ ((Value_Int32 *)y)->i32);
}
Value *xor_Int64(Value *x, Value *y) {
return (Value *)makeInt64(((Value_Int64 *)x)->i64 ^ ((Value_Int64 *)y)->i64);
}
Value *xor_Integer(Value *x, Value *y) {
Value_Integer *retVal = makeInteger();
mpz_xor(retVal->i, ((Value_Integer *)x)->i, ((Value_Integer *)y)->i);
return (Value *)retVal;
}
/* lt */
Value *lt_Bits8(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits8 *)x)->ui8 < ((Value_Bits8 *)y)->ui8);
}
Value *lt_Bits16(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits16 *)x)->ui16 <
((Value_Bits16 *)y)->ui16);
}
Value *lt_Bits32(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits32 *)x)->ui32 <
((Value_Bits32 *)y)->ui32);
}
Value *lt_Bits64(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits64 *)x)->ui64 <
((Value_Bits64 *)y)->ui64);
}
Value *lt_Int8(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int8 *)x)->i8 < ((Value_Int8 *)y)->i8);
}
Value *lt_Int16(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int16 *)x)->i16 < ((Value_Int16 *)y)->i16);
}
Value *lt_Int32(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int32 *)x)->i32 < ((Value_Int32 *)y)->i32);
}
Value *lt_Int64(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int64 *)x)->i64 < ((Value_Int64 *)y)->i64);
}
Value *lt_Integer(Value *x, Value *y) {
return (Value *)makeBool(
mpz_cmp(((Value_Integer *)x)->i, ((Value_Integer *)y)->i) < 0);
}
Value *lt_double(Value *x, Value *y) {
return (Value *)makeBool(((Value_Double *)x)->d < ((Value_Double *)y)->d);
}
Value *lt_char(Value *x, Value *y) {
return (Value *)makeBool(((Value_Char *)x)->c < ((Value_Char *)y)->c);
}
Value *lt_string(Value *x, Value *y) {
return (Value *)makeBool(
strcmp(((Value_String *)x)->str, ((Value_String *)y)->str) < 0);
}
/* gt */
Value *gt_Bits8(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits8 *)x)->ui8 > ((Value_Bits8 *)y)->ui8);
}
Value *gt_Bits16(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits16 *)x)->ui16 >
((Value_Bits16 *)y)->ui16);
}
Value *gt_Bits32(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits32 *)x)->ui32 >
((Value_Bits32 *)y)->ui32);
}
Value *gt_Bits64(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits64 *)x)->ui64 >
((Value_Bits64 *)y)->ui64);
}
Value *gt_Int8(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int8 *)x)->i8 > ((Value_Int8 *)y)->i8);
}
Value *gt_Int16(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int16 *)x)->i16 > ((Value_Int16 *)y)->i16);
}
Value *gt_Int32(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int32 *)x)->i32 > ((Value_Int32 *)y)->i32);
}
Value *gt_Int64(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int64 *)x)->i64 > ((Value_Int64 *)y)->i64);
}
Value *gt_Integer(Value *x, Value *y) {
return (Value *)makeBool(
mpz_cmp(((Value_Integer *)x)->i, ((Value_Integer *)y)->i) > 0);
}
Value *gt_double(Value *x, Value *y) {
return (Value *)makeBool(((Value_Double *)x)->d > ((Value_Double *)y)->d);
}
Value *gt_char(Value *x, Value *y) {
return (Value *)makeBool(((Value_Char *)x)->c > ((Value_Char *)y)->c);
}
Value *gt_string(Value *x, Value *y) {
return (Value *)makeBool(
strcmp(((Value_String *)x)->str, ((Value_String *)y)->str) > 0);
}
/* eq */
Value *eq_Bits8(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits8 *)x)->ui8 == ((Value_Bits8 *)y)->ui8);
}
Value *eq_Bits16(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits16 *)x)->ui16 ==
((Value_Bits16 *)y)->ui16);
}
Value *eq_Bits32(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits32 *)x)->ui32 ==
((Value_Bits32 *)y)->ui32);
}
Value *eq_Bits64(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits64 *)x)->ui64 ==
((Value_Bits64 *)y)->ui64);
}
Value *eq_Int8(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int8 *)x)->i8 == ((Value_Int8 *)y)->i8);
}
Value *eq_Int16(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int16 *)x)->i16 == ((Value_Int16 *)y)->i16);
}
Value *eq_Int32(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int32 *)x)->i32 == ((Value_Int32 *)y)->i32);
}
Value *eq_Int64(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int64 *)x)->i64 == ((Value_Int64 *)y)->i64);
}
Value *eq_Integer(Value *x, Value *y) {
return (Value *)makeBool(
mpz_cmp(((Value_Integer *)x)->i, ((Value_Integer *)y)->i) == 0);
}
Value *eq_double(Value *x, Value *y) {
return (Value *)makeBool(((Value_Double *)x)->d == ((Value_Double *)y)->d);
}
Value *eq_char(Value *x, Value *y) {
return (Value *)makeBool(((Value_Char *)x)->c == ((Value_Char *)y)->c);
}
Value *eq_string(Value *x, Value *y) {
return (Value *)makeBool(
!strcmp(((Value_String *)x)->str, ((Value_String *)y)->str));
}
/* lte */
Value *lte_Bits8(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits8 *)x)->ui8 <= ((Value_Bits8 *)y)->ui8);
}
Value *lte_Bits16(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits16 *)x)->ui16 <=
((Value_Bits16 *)y)->ui16);
}
Value *lte_Bits32(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits32 *)x)->ui32 <=
((Value_Bits32 *)y)->ui32);
}
Value *lte_Bits64(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits64 *)x)->ui64 <=
((Value_Bits64 *)y)->ui64);
}
Value *lte_Int8(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int8 *)x)->i8 <= ((Value_Int8 *)y)->i8);
}
Value *lte_Int16(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int16 *)x)->i16 <= ((Value_Int16 *)y)->i16);
}
Value *lte_Int32(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int32 *)x)->i32 <= ((Value_Int32 *)y)->i32);
}
Value *lte_Int64(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int64 *)x)->i64 <= ((Value_Int64 *)y)->i64);
}
Value *lte_Integer(Value *x, Value *y) {
return (Value *)makeBool(
mpz_cmp(((Value_Integer *)x)->i, ((Value_Integer *)y)->i) <= 0);
}
Value *lte_double(Value *x, Value *y) {
return (Value *)makeBool(((Value_Double *)x)->d <= ((Value_Double *)y)->d);
}
Value *lte_char(Value *x, Value *y) {
return (Value *)makeBool(((Value_Char *)x)->c <= ((Value_Char *)y)->c);
}
Value *lte_string(Value *x, Value *y) {
return (Value *)makeBool(
strcmp(((Value_String *)x)->str, ((Value_String *)y)->str) <= 0);
}
/* gte */
Value *gte_Bits8(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits8 *)x)->ui8 >= ((Value_Bits8 *)y)->ui8);
}
Value *gte_Bits16(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits16 *)x)->ui16 >=
((Value_Bits16 *)y)->ui16);
}
Value *gte_Bits32(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits32 *)x)->ui32 >=
((Value_Bits32 *)y)->ui32);
}
Value *gte_Bits64(Value *x, Value *y) {
return (Value *)makeBool(((Value_Bits64 *)x)->ui64 >=
((Value_Bits64 *)y)->ui64);
}
Value *gte_Int8(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int8 *)x)->i8 >= ((Value_Int8 *)y)->i8);
}
Value *gte_Int16(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int16 *)x)->i16 >= ((Value_Int16 *)y)->i16);
}
Value *gte_Int32(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int32 *)x)->i32 >= ((Value_Int32 *)y)->i32);
}
Value *gte_Int64(Value *x, Value *y) {
return (Value *)makeBool(((Value_Int64 *)x)->i64 >= ((Value_Int64 *)y)->i64);
}
Value *gte_Integer(Value *x, Value *y) {
return (Value *)makeBool(
mpz_cmp(((Value_Integer *)x)->i, ((Value_Integer *)y)->i) >= 0);
}
Value *gte_double(Value *x, Value *y) {
return (Value *)makeBool(((Value_Double *)x)->d >= ((Value_Double *)y)->d);
}
Value *gte_char(Value *x, Value *y) {
return (Value *)makeBool(((Value_Char *)x)->c >= ((Value_Char *)y)->c);
}
Value *gte_string(Value *x, Value *y) {
return (Value *)makeBool(
strcmp(((Value_String *)x)->str, ((Value_String *)y)->str) >= 0);
}