Pastey Adding C_ULONGLONG
- Posted by ghaberek (admin) Feb 13, 2015
diff -r 7e229e5759d1 include/std/dll.e --- a/include/std/dll.e Fri Feb 13 12:58:19 2015 -0500 +++ b/include/std/dll.e Fri Feb 13 18:27:01 2015 -0500 @@ -52,6 +52,8 @@ C_POINTER = #03000001, --** longlong 64-bits C_LONGLONG = #03000002, + --** unsigned longlong 64-bits + C_ULONGLONG = #03000010, $ ifdef BITS32 then public constant diff -r 7e229e5759d1 source/be_callc.c --- a/source/be_callc.c Fri Feb 13 12:58:19 2015 -0500 +++ b/source/be_callc.c Fri Feb 13 18:27:01 2015 -0500 @@ -1361,7 +1361,7 @@ RTFatal("argument out of range."); } } - else if( size == C_LONGLONG ){ + else if( size == C_LONGLONG || size == C_ULONGLONG ){ if (IS_ATOM_INT(next_arg)) { PUSH_INT64_ARG(next_arg); } @@ -1504,6 +1504,24 @@ return NewDouble( (eudouble) int64_t_result ); } } + else if (return_type == C_ULONGLONG ){ + + #if UINTPTR_MAX == UINT32_MAX + unsigned long long int uint64_t_result; + #else + #define uint64_t_result int_result + #endif + #if __ARM_PCS_VFP == 1 + uint64_t_result = icall_x86_64( long_proc_address, (double*)dbl_op, arg_op, int_args SIGNATURE_PARAM ); + #endif + call_routine(uint64_t); + if( uint64_t_result <= (unsigned long long int)MAXINT && int64_t_result >= (unsigned long long int)0 ){ + return (intptr_t) uint64_t_result; + } + else{ + return NewDouble( (eudouble) uint64_t_result ); + } + } else if (return_type == C_FLOAT) { // expect float to be returned from C routine call_routine(float); diff -r 7e229e5759d1 source/be_runtime.c --- a/source/be_runtime.c Fri Feb 13 12:58:19 2015 -0500 +++ b/source/be_runtime.c Fri Feb 13 18:27:01 2015 -0500 @@ -6467,6 +6467,8 @@ return sizeof( long ); case C_LONGLONG: return sizeof( long long ); + case C_ULONGLONG: + return sizeof( unsigned long long ); default: return 0; } diff -r 7e229e5759d1 source/execute.h --- a/source/execute.h Fri Feb 13 12:58:19 2015 -0500 +++ b/source/execute.h Fri Feb 13 18:27:01 2015 -0500 @@ -308,23 +308,24 @@ #endif /* .dll argument & return value types */ -#define C_TYPE 0x0F000000 -#define C_DOUBLE 0x03000008 -#define C_FLOAT 0x03000004 -#define C_CHAR 0x01000001 -#define C_UCHAR 0x02000001 -#define C_SHORT 0x01000002 -#define C_USHORT 0x02000002 -#define E_INTEGER 0x06000004 -#define E_ATOM 0x07000004 -#define E_SEQUENCE 0x08000004 -#define E_OBJECT 0x09000004 -#define C_INT 0x01000004 -#define C_UINT 0x02000004 -#define C_LONG 0x01000008 -#define C_ULONG 0x02000008 -#define C_POINTER 0x03000001 -#define C_LONGLONG 0x03000002 +#define C_TYPE 0x0F000000 +#define C_DOUBLE 0x03000008 +#define C_FLOAT 0x03000004 +#define C_CHAR 0x01000001 +#define C_UCHAR 0x02000001 +#define C_SHORT 0x01000002 +#define C_USHORT 0x02000002 +#define E_INTEGER 0x06000004 +#define E_ATOM 0x07000004 +#define E_SEQUENCE 0x08000004 +#define E_OBJECT 0x09000004 +#define C_INT 0x01000004 +#define C_UINT 0x02000004 +#define C_LONG 0x01000008 +#define C_ULONG 0x02000008 +#define C_POINTER 0x03000001 +#define C_LONGLONG 0x03000002 +#define C_ULONGLONG 0x03000010 #define C_STDCALL 0 #define C_CDECL 1 diff -r 7e229e5759d1 source/test818.c --- a/source/test818.c Fri Feb 13 12:58:19 2015 -0500 +++ b/source/test818.c Fri Feb 13 18:27:01 2015 -0500 @@ -21,6 +21,7 @@ #define C000_LONG_VALUE (0xC * (1L << (8*sizeof(long)-8))) #define C000_SHORT_VALUE (0xC * (1 << (8*sizeof(short)-8))) #define C000_LONGLONG_VALUE (0xC * (1LL << (8*sizeof(long long)-8))) +#define C000_ULONGLONG_VALUE (0xC * (1ULL << (8*sizeof(unsigned long long)-8))) #define C000_FLOAT_VALUE (float)(0xC * (1 << (8*sizeof(float)-8))) #define C000_DOUBLE_VALUE (double)(0xC * (1 << (8*sizeof(double)-8))) typedef signed char Byte; @@ -58,6 +59,7 @@ MAKE_BORDER_FUNCTIONS(long,C_LONG) #endif MAKE_BORDER_FUNCTIONS(long long,C_LONGLONG) +MAKE_BORDER_FUNCTIONS(unsigned long long,C_ULONGLONG) MAKE_BORDER_FUNCTIONS(float, C_FLOAT) MAKE_BORDER_FUNCTIONS(double, C_DOUBLE) @@ -78,6 +80,7 @@ MAKE_ID_FUNCTION(long, C_LONG) MAKE_ID_FUNCTION(unsigned long, C_ULONG) MAKE_ID_FUNCTION(long long, C_LONGLONG) +MAKE_ID_FUNCTION(unsigned long long, C_ULONGLONG) MAKE_ID_FUNCTION(float, C_FLOAT) MAKE_ID_FUNCTION(double, C_DOUBLE) @@ -92,18 +95,21 @@ MAKE_GET_VAL_FN(int, C_INT, _BFF_FD, C000_INT_VALUE - 20) MAKE_GET_VAL_FN(long, C_LONG, _BFF_FD, C000_LONG_VALUE - 20) MAKE_GET_VAL_FN(long long, C_LONGLONG, _BFF_FD, C000_LONGLONG_VALUE - 20) +MAKE_GET_VAL_FN(unsigned long long, C_ULONGLONG, _BFF_FD, C000_LONGLONG_VALUE - 20) MAKE_GET_VAL_FN(char, C_CHAR, _M20, -20) MAKE_GET_VAL_FN(short, C_SHORT, _M20, -20) MAKE_GET_VAL_FN(int, C_INT, _M20, -20) MAKE_GET_VAL_FN(long, C_LONG, _M20, -20) MAKE_GET_VAL_FN(long long, C_LONGLONG, _M20, -20) +MAKE_GET_VAL_FN(unsigned long long, C_ULONGLONG, _M20, -20) MAKE_GET_VAL_FN(char, C_CHAR, _M100, -100) MAKE_GET_VAL_FN(short, C_SHORT, _M100, -10000) MAKE_GET_VAL_FN(int, C_INT, _M100, -1000000000) MAKE_GET_VAL_FN(long, C_LONG, _M100, ((sizeof(long) == sizeof(long long)) ? -1000000000000000000LL : -1000000000L) ) MAKE_GET_VAL_FN(long long, C_LONGLONG, _M100, -1000000000000000000LL) +MAKE_GET_VAL_FN(unsigned long long, C_ULONGLONG, _M100, -1000000000000000000LL) EXPORT double sum_C_FLOAT_C_DOUBLE(float f1, double d1) {