mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-12 07:17:37 +02:00
Hooks for bignum arithmetic
This commit is contained in:
parent
0325383f0e
commit
c66f31cacd
1 changed files with 23 additions and 0 deletions
23
runtime.c
23
runtime.c
|
@ -2533,6 +2533,11 @@ object FUNC_OP(void *data, common_type *x, object y) { \
|
||||||
x->double_t.value = x->integer_t.value OP ((double_type *)y)->value; \
|
x->double_t.value = x->integer_t.value OP ((double_type *)y)->value; \
|
||||||
} else if (tx == double_tag && ty == double_tag) { \
|
} else if (tx == double_tag && ty == double_tag) { \
|
||||||
x->double_t.value = x->double_t.value OP ((double_type *)y)->value; \
|
x->double_t.value = x->double_t.value OP ((double_type *)y)->value; \
|
||||||
|
} else if (tx == integer_tag && ty == bignum_tag) { \
|
||||||
|
} else if (tx == integer_tag && ty == double_tag) { \
|
||||||
|
} else if (tx == bignum_tag && ty == -1) { \
|
||||||
|
} else if (tx == bignum_tag && ty == double_tag) { \
|
||||||
|
} else if (tx == bignum_tag && ty == bignum_tag) { \
|
||||||
} else { \
|
} else { \
|
||||||
goto bad_arg_type_error; \
|
goto bad_arg_type_error; \
|
||||||
} \
|
} \
|
||||||
|
@ -2583,6 +2588,7 @@ object Cyc_fast_sum(void *data, object ptr, object x, object y) {
|
||||||
} else if (is_object_type(y) && type_of(y) == double_tag) {
|
} else if (is_object_type(y) && type_of(y) == double_tag) {
|
||||||
assign_double(ptr, (double)(obj_obj2int(x)) + double_value(y));
|
assign_double(ptr, (double)(obj_obj2int(x)) + double_value(y));
|
||||||
return ptr;
|
return ptr;
|
||||||
|
} else if (is_object_type(y) && type_of(y) == bignum_tag) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// x is double
|
// x is double
|
||||||
|
@ -2593,6 +2599,18 @@ object Cyc_fast_sum(void *data, object ptr, object x, object y) {
|
||||||
} else if (is_object_type(y) && type_of(y) == double_tag) {
|
} else if (is_object_type(y) && type_of(y) == double_tag) {
|
||||||
assign_double(ptr, double_value(x) + double_value(y));
|
assign_double(ptr, double_value(x) + double_value(y));
|
||||||
return ptr;
|
return ptr;
|
||||||
|
} else if (is_object_type(y) && type_of(y) == bignum_tag) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// x is bignum
|
||||||
|
if (is_object_type(x) && type_of(x) == bignum_tag) {
|
||||||
|
if (obj_is_int(y)){
|
||||||
|
//assign_double(ptr, double_value(x) + (double)(obj_obj2int(y)));
|
||||||
|
//return ptr;
|
||||||
|
} else if (is_object_type(y) && type_of(y) == double_tag) {
|
||||||
|
//assign_double(ptr, double_value(x) + double_value(y));
|
||||||
|
//return ptr;
|
||||||
|
} else if (is_object_type(y) && type_of(y) == bignum_tag) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// still here, raise an error
|
// still here, raise an error
|
||||||
|
@ -2739,6 +2757,11 @@ object Cyc_div_op(void *data, common_type * x, object y)
|
||||||
x->double_t.value = x->integer_t.value / ((double_type *) y)->value;
|
x->double_t.value = x->integer_t.value / ((double_type *) y)->value;
|
||||||
} else if (tx == double_tag && ty == double_tag) {
|
} else if (tx == double_tag && ty == double_tag) {
|
||||||
x->double_t.value = x->double_t.value / ((double_type *) y)->value;
|
x->double_t.value = x->double_t.value / ((double_type *) y)->value;
|
||||||
|
} else if (tx == integer_tag && ty == bignum_tag) { \
|
||||||
|
} else if (tx == integer_tag && ty == double_tag) { \
|
||||||
|
} else if (tx == bignum_tag && ty == -1) { \
|
||||||
|
} else if (tx == bignum_tag && ty == double_tag) { \
|
||||||
|
} else if (tx == bignum_tag && ty == bignum_tag) { \
|
||||||
} else {
|
} else {
|
||||||
goto bad_arg_type_error;
|
goto bad_arg_type_error;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue