Skip to content

Commit

Permalink
Longdouble (#39)
Browse files Browse the repository at this point in the history
* Towards 64 bit long and double

* Long long double implementation and tests

* More long double tests

* long long and double arrays

* More double long tests

* bytecode type names changes

* Macro template programming

* Assignment types changes

* Added long double to main result

* Test program to update documentation.

* Corrections after code review

* code cleanup and speedup

Co-authored-by: smaludzi <[email protected]>
  • Loading branch information
smaludzi and smaludzi authored Aug 16, 2020
1 parent 5ec494c commit 5327a0c
Show file tree
Hide file tree
Showing 52 changed files with 4,967 additions and 1,891 deletions.
354 changes: 350 additions & 4 deletions back/bytecode.c

Large diffs are not rendered by default.

138 changes: 134 additions & 4 deletions back/bytecode.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ typedef enum bytecode_type
BYTECODE_UNKNOWN = 0,

BYTECODE_INT,
BYTECODE_LONG,
BYTECODE_FLOAT,
BYTECODE_DOUBLE,
BYTECODE_CHAR,
BYTECODE_STRING,
BYTECODE_C_NULL,
Expand All @@ -52,17 +54,36 @@ typedef enum bytecode_type
BYTECODE_OP_DIV_INT,
BYTECODE_OP_MOD_INT,

BYTECODE_OP_NEG_LONG,
BYTECODE_OP_ADD_LONG,
BYTECODE_OP_SUB_LONG,
BYTECODE_OP_MUL_LONG,
BYTECODE_OP_DIV_LONG,
BYTECODE_OP_MOD_LONG,

BYTECODE_OP_NEG_FLOAT,
BYTECODE_OP_ADD_FLOAT,
BYTECODE_OP_SUB_FLOAT,
BYTECODE_OP_MUL_FLOAT,
BYTECODE_OP_DIV_FLOAT,

BYTECODE_OP_NEG_DOUBLE,
BYTECODE_OP_ADD_DOUBLE,
BYTECODE_OP_SUB_DOUBLE,
BYTECODE_OP_MUL_DOUBLE,
BYTECODE_OP_DIV_DOUBLE,

BYTECODE_OP_ADD_STRING,
BYTECODE_OP_ADD_INT_STRING,
BYTECODE_OP_ADD_STRING_INT,
BYTECODE_OP_ADD_LONG_STRING,
BYTECODE_OP_ADD_STRING_LONG,
BYTECODE_OP_ADD_FLOAT_STRING,
BYTECODE_OP_ADD_STRING_FLOAT,
BYTECODE_OP_ADD_DOUBLE_STRING,
BYTECODE_OP_ADD_STRING_DOUBLE,
BYTECODE_OP_ADD_CHAR_STRING,
BYTECODE_OP_ADD_STRING_CHAR,

BYTECODE_OP_LT_INT,
BYTECODE_OP_GT_INT,
Expand All @@ -71,13 +92,27 @@ typedef enum bytecode_type
BYTECODE_OP_EQ_INT,
BYTECODE_OP_NEQ_INT,

BYTECODE_OP_LT_LONG,
BYTECODE_OP_GT_LONG,
BYTECODE_OP_LTE_LONG,
BYTECODE_OP_GTE_LONG,
BYTECODE_OP_EQ_LONG,
BYTECODE_OP_NEQ_LONG,

BYTECODE_OP_LT_FLOAT,
BYTECODE_OP_GT_FLOAT,
BYTECODE_OP_LTE_FLOAT,
BYTECODE_OP_GTE_FLOAT,
BYTECODE_OP_EQ_FLOAT,
BYTECODE_OP_NEQ_FLOAT,

BYTECODE_OP_LT_DOUBLE,
BYTECODE_OP_GT_DOUBLE,
BYTECODE_OP_LTE_DOUBLE,
BYTECODE_OP_GTE_DOUBLE,
BYTECODE_OP_EQ_DOUBLE,
BYTECODE_OP_NEQ_DOUBLE,

BYTECODE_OP_LT_CHAR,
BYTECODE_OP_GT_CHAR,
BYTECODE_OP_LTE_CHAR,
Expand Down Expand Up @@ -119,22 +154,44 @@ typedef enum bytecode_type
BYTECODE_OP_DEC_INT,
BYTECODE_OP_DUP_INT,

BYTECODE_INT_TO_LONG,
BYTECODE_INT_TO_FLOAT,
BYTECODE_INT_TO_DOUBLE,
BYTECODE_LONG_TO_INT,
BYTECODE_LONG_TO_FLOAT,
BYTECODE_LONG_TO_DOUBLE,
BYTECODE_FLOAT_TO_INT,

BYTECODE_FLOAT_TO_LONG,
BYTECODE_FLOAT_TO_DOUBLE,
BYTECODE_DOUBLE_TO_INT,
BYTECODE_DOUBLE_TO_LONG,
BYTECODE_DOUBLE_TO_FLOAT,

BYTECODE_OP_NEG_ARR_INT,
BYTECODE_OP_NEG_ARR_LONG,
BYTECODE_OP_NEG_ARR_FLOAT,
BYTECODE_OP_NEG_ARR_DOUBLE,
BYTECODE_OP_ADD_ARR_INT,
BYTECODE_OP_ADD_ARR_LONG,
BYTECODE_OP_ADD_ARR_FLOAT,
BYTECODE_OP_ADD_ARR_DOUBLE,
BYTECODE_OP_SUB_ARR_INT,
BYTECODE_OP_SUB_ARR_LONG,
BYTECODE_OP_SUB_ARR_FLOAT,
BYTECODE_OP_SUB_ARR_DOUBLE,
BYTECODE_OP_MUL_ARR_INT,
BYTECODE_OP_MUL_ARR_LONG,
BYTECODE_OP_MUL_ARR_FLOAT,
BYTECODE_OP_MUL_ARR_DOUBLE,
BYTECODE_OP_MUL_ARR_ARR_INT,
BYTECODE_OP_MUL_ARR_ARR_LONG,
BYTECODE_OP_MUL_ARR_ARR_FLOAT,
BYTECODE_OP_MUL_ARR_ARR_DOUBLE,

BYTECODE_OP_ASS_INT,
BYTECODE_OP_ASS_LONG,
BYTECODE_OP_ASS_FLOAT,
BYTECODE_OP_ASS_DOUBLE,
BYTECODE_OP_ASS_CHAR,
BYTECODE_OP_ASS_STRING,
BYTECODE_OP_ASS_C_PTR,
Expand All @@ -149,7 +206,9 @@ typedef enum bytecode_type
BYTECODE_LABEL,

BYTECODE_MK_ARRAY_INT,
BYTECODE_MK_ARRAY_LONG,
BYTECODE_MK_ARRAY_FLOAT,
BYTECODE_MK_ARRAY_DOUBLE,
BYTECODE_MK_ARRAY_CHAR,
BYTECODE_MK_ARRAY_STRING,
BYTECODE_MK_ARRAY_ARRAY,
Expand Down Expand Up @@ -182,7 +241,9 @@ typedef enum bytecode_type
BYTECODE_FUNC_FFI,
BYTECODE_FUNC_FFI_BOOL,
BYTECODE_FUNC_FFI_INT,
BYTECODE_FUNC_FFI_LONG,
BYTECODE_FUNC_FFI_FLOAT,
BYTECODE_FUNC_FFI_DOUBLE,
BYTECODE_FUNC_FFI_CHAR,
BYTECODE_FUNC_FFI_STRING,
BYTECODE_FUNC_FFI_VOID,
Expand Down Expand Up @@ -218,15 +279,23 @@ typedef struct bytecode
struct
{
int value; /* BYTECODE_INT */
} integer;
} int_t;
struct
{
long long value; /* BYTECODE_LONG */
} long_t;
struct
{
float value; /* BYTECODE_FLOAT */
} real;
} float_t;
struct
{
double value; /* BYTECODE_DOUBLE */
} double_t;
struct
{
char value; /* BYTECODE_CHAR */
} chr;
} char_t;
struct
{
unsigned int index; /* BYTECODE_STRING */
Expand Down Expand Up @@ -365,7 +434,9 @@ typedef struct bytecode_op_str
void bytecode_print_unknown(bytecode * code);

void bytecode_print_int(bytecode * code);
void bytecode_print_long(bytecode * code);
void bytecode_print_float(bytecode * code);
void bytecode_print_double(bytecode * code);
void bytecode_print_char(bytecode * code);
void bytecode_print_string(bytecode * code);
void bytecode_print_c_null(bytecode * code);
Expand All @@ -386,17 +457,36 @@ void bytecode_print_op_mul_int(bytecode * code);
void bytecode_print_op_div_int(bytecode * code);
void bytecode_print_op_mod_int(bytecode * code);

void bytecode_print_op_neg_long(bytecode * code);
void bytecode_print_op_add_long(bytecode * code);
void bytecode_print_op_sub_long(bytecode * code);
void bytecode_print_op_mul_long(bytecode * code);
void bytecode_print_op_div_long(bytecode * code);
void bytecode_print_op_mod_long(bytecode * code);

void bytecode_print_op_neg_float(bytecode * code);
void bytecode_print_op_add_float(bytecode * code);
void bytecode_print_op_sub_float(bytecode * code);
void bytecode_print_op_mul_float(bytecode * code);
void bytecode_print_op_div_float(bytecode * code);

void bytecode_print_op_neg_double(bytecode * code);
void bytecode_print_op_add_double(bytecode * code);
void bytecode_print_op_sub_double(bytecode * code);
void bytecode_print_op_mul_double(bytecode * code);
void bytecode_print_op_div_double(bytecode * code);

void bytecode_print_op_add_string(bytecode * code);
void bytecode_print_op_add_int_string(bytecode * code);
void bytecode_print_op_add_string_int(bytecode * code);
void bytecode_print_op_add_float_string(bytecode * code);
void bytecode_print_op_add_string_float(bytecode * code);
void bytecode_print_op_add_long_string(bytecode * code);
void bytecode_print_op_add_string_long(bytecode * code);
void bytecode_print_op_add_double_string(bytecode * code);
void bytecode_print_op_add_string_double(bytecode * code);
void bytecode_print_op_add_char_string(bytecode * code);
void bytecode_print_op_add_string_char(bytecode * code);

void bytecode_print_op_lt_int(bytecode * code);
void bytecode_print_op_gt_int(bytecode * code);
Expand All @@ -405,13 +495,27 @@ void bytecode_print_op_gte_int(bytecode * code);
void bytecode_print_op_eq_int(bytecode * code);
void bytecode_print_op_neq_int(bytecode * code);

void bytecode_print_op_lt_long(bytecode * code);
void bytecode_print_op_gt_long(bytecode * code);
void bytecode_print_op_lte_long(bytecode * code);
void bytecode_print_op_gte_long(bytecode * code);
void bytecode_print_op_eq_long(bytecode * code);
void bytecode_print_op_neq_long(bytecode * code);

void bytecode_print_op_lt_float(bytecode * code);
void bytecode_print_op_gt_float(bytecode * code);
void bytecode_print_op_lte_float(bytecode * code);
void bytecode_print_op_gte_float(bytecode * code);
void bytecode_print_op_eq_float(bytecode * code);
void bytecode_print_op_neq_float(bytecode * code);

void bytecode_print_op_lt_double(bytecode * code);
void bytecode_print_op_gt_double(bytecode * code);
void bytecode_print_op_lte_double(bytecode * code);
void bytecode_print_op_gte_double(bytecode * code);
void bytecode_print_op_eq_double(bytecode * code);
void bytecode_print_op_neq_double(bytecode * code);

void bytecode_print_op_lt_char(bytecode * code);
void bytecode_print_op_gt_char(bytecode * code);
void bytecode_print_op_lte_char(bytecode * code);
Expand Down Expand Up @@ -455,22 +559,44 @@ void bytecode_print_op_inc_int(bytecode * code);
void bytecode_print_op_dec_int(bytecode * code);
void bytecode_print_op_dup_int(bytecode * code);

void bytecode_print_int_to_long(bytecode * code);
void bytecode_print_int_to_float(bytecode * code);
void bytecode_print_int_to_double(bytecode * code);
void bytecode_print_long_to_int(bytecode * code);
void bytecode_print_long_to_float(bytecode * code);
void bytecode_print_long_to_double(bytecode * code);
void bytecode_print_float_to_int(bytecode * code);
void bytecode_print_float_to_long(bytecode * code);
void bytecode_print_float_to_double(bytecode * code);
void bytecode_print_double_to_int(bytecode * code);
void bytecode_print_double_to_long(bytecode * code);
void bytecode_print_double_to_float(bytecode * code);

void bytecode_print_op_neg_arr_int(bytecode * code);
void bytecode_print_op_neg_arr_long(bytecode * code);
void bytecode_print_op_neg_arr_float(bytecode * code);
void bytecode_print_op_neg_arr_double(bytecode * code);
void bytecode_print_op_add_arr_int(bytecode * code);
void bytecode_print_op_add_arr_long(bytecode * code);
void bytecode_print_op_add_arr_float(bytecode * code);
void bytecode_print_op_add_arr_double(bytecode * code);
void bytecode_print_op_sub_arr_int(bytecode * code);
void bytecode_print_op_sub_arr_long(bytecode * code);
void bytecode_print_op_sub_arr_float(bytecode * code);
void bytecode_print_op_sub_arr_double(bytecode * code);
void bytecode_print_op_mul_arr_int(bytecode * code);
void bytecode_print_op_mul_arr_float(bytecode * code);
void bytecode_print_op_mul_arr_long(bytecode * code);
void bytecode_print_op_mul_arr_double(bytecode * code);
void bytecode_print_op_mul_arr_arr_int(bytecode * code);
void bytecode_print_op_mul_arr_arr_long(bytecode * code);
void bytecode_print_op_mul_arr_arr_float(bytecode * code);
void bytecode_print_op_mul_arr_arr_double(bytecode * code);

void bytecode_print_op_ass_int(bytecode * code);
void bytecode_print_op_ass_long(bytecode * code);
void bytecode_print_op_ass_float(bytecode * code);
void bytecode_print_op_ass_double(bytecode * code);
void bytecode_print_op_ass_char(bytecode * code);
void bytecode_print_op_ass_string(bytecode * code);
void bytecode_print_op_ass_c_ptr(bytecode * code);
Expand All @@ -488,7 +614,9 @@ void bytecode_print_jump(bytecode * code);
void bytecode_print_label(bytecode * code);

void bytecode_print_mk_array_int(bytecode * code);
void bytecode_print_mk_array_long(bytecode * code);
void bytecode_print_mk_array_float(bytecode * code);
void bytecode_print_mk_array_double(bytecode * code);
void bytecode_print_mk_array_char(bytecode * code);
void bytecode_print_mk_array_string(bytecode * code);
void bytecode_print_mk_array_array(bytecode * code);
Expand Down Expand Up @@ -521,7 +649,9 @@ void bytecode_print_func_obj(bytecode * code);
void bytecode_print_func_ffi(bytecode * code);
void bytecode_print_func_ffi_bool(bytecode * code);
void bytecode_print_func_ffi_int(bytecode * code);
void bytecode_print_func_ffi_long(bytecode * code);
void bytecode_print_func_ffi_float(bytecode * code);
void bytecode_print_func_ffi_double(bytecode * code);
void bytecode_print_func_ffi_char(bytecode * code);
void bytecode_print_func_ffi_string(bytecode * code);
void bytecode_print_func_ffi_void(bytecode * code);
Expand Down
24 changes: 20 additions & 4 deletions back/fficall.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,17 @@ int test_types_get_int()
return 10;
}

long long test_types_get_long()
{
return 10L;
}

float test_types_get_float()
{
return 10.0f;
}

double test_types_get_double()
{
return 10.0;
}
Expand All @@ -269,18 +279,22 @@ test_Point * test_types_get_ptr()
return &p1;
}

void test_types_call(bool b, int i, float f, char c, char * str, test_Point * ptr, test_Types rec)
void test_types_call(bool b, int i, long long l, float f, double d, char c, char * str, test_Point * ptr, test_Types rec)
{
assert(b == true);
assert(i == 10);
assert(f == 10.0);
assert(l == 10L);
assert(f == 10.0f);
assert(d == 10.0);
assert(c == 'A');
assert(strcmp(str, "AAA") == 0);
assert(ptr->x == 10);
assert(ptr->y == 20);

assert(rec.i == 20);
assert(rec.f == 20.0);
assert(rec.l == 20L);
assert(rec.f == 20.0f);
assert(rec.d == 20.0);
assert(rec.c == 'B');
assert(strcmp(rec.str, "BBB") == 0);
assert(rec.ptr->x == 10);
Expand All @@ -295,7 +309,9 @@ test_Types test_types_get_rec()

ret.b = false;
ret.i = 10;
ret.f = 10.0;
ret.l = 10L;
ret.f = 10.0f;
ret.d = 10.0;
ret.c = 'A';
ret.str = "AAA";
ret.ptr = &p1;
Expand Down
8 changes: 7 additions & 1 deletion back/fficall.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ typedef struct ffi_decl {
{
void * ret_void_value;
int ret_int_value;
long long ret_long_value;
float ret_float_value;
double ret_double_value;
char ret_char_value;
char * ret_string_value;
};
Expand Down Expand Up @@ -78,7 +80,9 @@ typedef struct test_Types
{
bool b;
int i;
long long l;
float f;
double d;
char c;
char * str;
test_Point * ptr;
Expand All @@ -97,11 +101,13 @@ char * test_void();
void test_void_call(char * str);

int test_types_get_int();
long long test_types_get_long();
float test_types_get_float();
double test_types_get_double();
char test_types_get_char();
char * test_types_get_string();
test_Point * test_types_get_ptr();
void test_types_call(bool b, int i, float f, char c, char * str, test_Point * ptr, test_Types rec);
void test_types_call(bool b, int i, long long l, float f, double d, char c, char * str, test_Point * ptr, test_Types rec);
test_Types test_types_get_rec();

#endif /* NO_FFI */
Expand Down
Loading

0 comments on commit 5327a0c

Please sign in to comment.