]> gitweb.factorcode.org Git - factor.git/blobdiff - native/arithmetic.h
first cut at floats
[factor.git] / native / arithmetic.h
index f10a14703fb5a5bbd5e3513986ac3eaf15b2a180..2307c6e4c81f835c52d1b2c6c97750f1299b68d9 100644 (file)
@@ -2,52 +2,49 @@
 
 BIGNUM* fixnum_to_bignum(CELL n);
 RATIO* fixnum_to_ratio(CELL n);
+FLOAT* fixnum_to_float(CELL n);
 FIXNUM bignum_to_fixnum(CELL tagged);
 RATIO* bignum_to_ratio(CELL n);
+FLOAT* bignum_to_float(CELL n);
+FLOAT* ratio_to_float(CELL n);
 
 #define CELL_TO_INTEGER(result) \
        FIXNUM _result = (result); \
        if(_result < FIXNUM_MIN || _result > FIXNUM_MAX) \
-               return tag_bignum(fixnum_to_bignum(_result)); \
+               return tag_object(fixnum_to_bignum(_result)); \
        else \
                return tag_fixnum(_result);
 
 #define BIGNUM_2_TO_INTEGER(result) \
         BIGNUM_2 _result = (result); \
         if(_result < FIXNUM_MIN || _result > FIXNUM_MAX) \
-                return tag_bignum(bignum(_result)); \
+                return tag_object(bignum(_result)); \
         else \
                 return tag_fixnum(_result);
 
 #define BINARY_OP(OP,anytype,integerOnly) \
 CELL OP(CELL x, CELL y) \
 { \
-       switch(TAG(x)) \
+       switch(type_of(x)) \
        { \
        case FIXNUM_TYPE: \
 \
-               switch(TAG(y)) \
+               switch(type_of(y)) \
                { \
                case FIXNUM_TYPE: \
                        return OP##_fixnum(x,y); \
-               case OBJECT_TYPE: \
-                       switch(object_type(y)) \
-                       { \
-                       case BIGNUM_TYPE: \
-                               return OP##_bignum((CELL)fixnum_to_bignum(x),y); \
-                       default: \
-                               if(anytype) \
-                                       return OP##_anytype(x,y); \
-                               else \
-                                       type_error(FIXNUM_TYPE,y); \
-                               return F; \
-                       } \
-                       break; \
                case RATIO_TYPE: \
                        if(integerOnly) \
                                return OP(x,to_integer(y)); \
                        else \
                                return OP##_ratio((CELL)fixnum_to_ratio(x),y); \
+               case BIGNUM_TYPE: \
+                       return OP##_bignum((CELL)fixnum_to_bignum(x),y); \
+               case FLOAT_TYPE: \
+                       if(integerOnly) \
+                               return OP(x,to_integer(y)); \
+                       else \
+                               return OP##_float((CELL)fixnum_to_float(x),y); \
                default: \
                        if(anytype) \
                                return OP##_anytype(x,y); \
@@ -56,84 +53,93 @@ CELL OP(CELL x, CELL y) \
                        return F; \
                } \
 \
-       case OBJECT_TYPE: \
+       case RATIO_TYPE: \
 \
-               switch(object_type(x)) \
+               switch(type_of(y)) \
                { \
-        \
+               case FIXNUM_TYPE: \
+                       if(integerOnly) \
+                               return OP(to_integer(x),y); \
+                       else \
+                               return OP##_ratio(x,(CELL)fixnum_to_ratio(y)); \
+               case RATIO_TYPE: \
+                       if(integerOnly) \
+                               return OP(to_integer(x),to_integer(y)); \
+                       else \
+                               return OP##_ratio(x,y); \
                case BIGNUM_TYPE: \
-                \
-                       switch(TAG(y)) \
-                       { \
-                       case FIXNUM_TYPE: \
-                               return OP##_bignum(x,(CELL)fixnum_to_bignum(y)); \
-                       case OBJECT_TYPE: \
-\
-                               switch(object_type(y)) \
-                               { \
-                               case BIGNUM_TYPE: \
-                                       return OP##_bignum(x,y); \
-                               default: \
-                                       type_error(BIGNUM_TYPE,y); \
-                                       return F; \
-                               } \
-                       case RATIO_TYPE: \
-                               if(integerOnly) \
-                                       return OP(x,to_integer(y)); \
-                               else \
-                                       return OP##_ratio((CELL)bignum_to_ratio(x),y); \
-                       default: \
-                               if(anytype) \
-                                       return OP##_anytype(x,y); \
-                               else \
-                                       type_error(BIGNUM_TYPE,y); \
-                               return F; \
-                       } \
-\
+                       if(integerOnly) \
+                               return OP(to_integer(x),y); \
+                       else \
+                               return OP##_ratio(x,(CELL)bignum_to_ratio(y)); \
+               case FLOAT_TYPE: \
+                       if(integerOnly) \
+                               return OP(to_integer(x),to_integer(y)); \
+                       else \
+                               return OP##_float((CELL)ratio_to_float(x),y); \
                default: \
-\
                        if(anytype) \
                                return OP##_anytype(x,y); \
                        else \
-                               type_error(FIXNUM_TYPE,x); \
+                               type_error(FIXNUM_TYPE,y); \
                        return F; \
                } \
 \
-       case RATIO_TYPE: \
+       case BIGNUM_TYPE: \
+        \
+               switch(type_of(y)) \
+               { \
+               case FIXNUM_TYPE: \
+                       return OP##_bignum(x,(CELL)fixnum_to_bignum(y)); \
+               case RATIO_TYPE: \
+                       if(integerOnly) \
+                               return OP(x,to_integer(y)); \
+                       else \
+                               return OP##_ratio((CELL)bignum_to_ratio(x),y); \
+               case BIGNUM_TYPE: \
+                       return OP##_bignum(x,y); \
+               case FLOAT_TYPE: \
+                       if(integerOnly) \
+                               return OP(x,to_integer(y)); \
+                       else \
+                               return OP##_float((CELL)bignum_to_float(x),y); \
+               default: \
+                       if(anytype) \
+                               return OP##_anytype(x,y); \
+                       else \
+                               type_error(BIGNUM_TYPE,y); \
+                       return F; \
+               } \
 \
-               switch(TAG(y)) \
+       case FLOAT_TYPE: \
+        \
+               switch(type_of(y)) \
                { \
                case FIXNUM_TYPE: \
                        if(integerOnly) \
                                return OP(to_integer(x),y); \
                        else \
-                               return OP##_ratio(x,(CELL)fixnum_to_ratio(y)); \
-               case OBJECT_TYPE: \
-                       switch(object_type(y)) \
-                       { \
-                       case BIGNUM_TYPE: \
-                               if(integerOnly) \
-                                       return OP(to_integer(x),y); \
-                               else \
-                                       return OP##_ratio(x,(CELL)bignum_to_ratio(y)); \
-                       default: \
-                               if(anytype) \
-                                       return OP##_anytype(x,y); \
-                               else \
-                                       type_error(FIXNUM_TYPE,y); \
-                               return F; \
-                       } \
-                       break; \
+                               return OP##_float(x,(CELL)fixnum_to_float(y)); \
                case RATIO_TYPE: \
+                       if(integerOnly) \
+                               return OP(x,to_integer(y)); \
+                       else \
+                               return OP##_float(x,(CELL)ratio_to_float(y)); \
+               case BIGNUM_TYPE: \
+                       if(integerOnly) \
+                               return OP(to_integer(x),y); \
+                       else \
+                               return OP##_float(x,(CELL)bignum_to_float(y)); \
+               case FLOAT_TYPE: \
                        if(integerOnly) \
                                return OP(to_integer(x),to_integer(y)); \
                        else \
-                               return OP##_ratio(x,y); \
+                               return OP##_float(x,y); \
                default: \
                        if(anytype) \
                                return OP##_anytype(x,y); \
                        else \
-                               type_error(FIXNUM_TYPE,y); \
+                               type_error(FLOAT_TYPE,y); \
                        return F; \
                } \
 \
@@ -157,16 +163,12 @@ void primitive_numberp(void);
 
 FIXNUM to_fixnum(CELL tagged);
 void primitive_to_fixnum(void);
-
 BIGNUM* to_bignum(CELL tagged);
 void primitive_to_bignum(void);
-
 CELL to_integer(CELL tagged);
 void primitive_to_integer(void);
-
 CELL number_eq(CELL x, CELL y);
 void primitive_number_eq(void);
-
 CELL add(CELL x, CELL y);
 void primitive_add(void);
 CELL subtract(CELL x, CELL y);
@@ -177,14 +179,27 @@ CELL divide(CELL x, CELL y);
 void primitive_divmod(void);
 CELL divint(CELL x, CELL y);
 void primitive_divint(void);
+CELL divfloat(CELL x, CELL y);
+void primitive_divfloat(void);
+CELL divide(CELL x, CELL y);
 void primitive_divide(void);
+CELL less(CELL x, CELL y);
 void primitive_less(void);
+CELL lesseq(CELL x, CELL y);
 void primitive_lesseq(void);
+CELL greater(CELL x, CELL y);
 void primitive_greater(void);
+CELL greatereq(CELL x, CELL y);
 void primitive_greatereq(void);
+CELL mod(CELL x, CELL y);
 void primitive_mod(void);
+CELL and(CELL x, CELL y);
 void primitive_and(void);
+CELL or(CELL x, CELL y);
 void primitive_or(void);
+CELL xor(CELL x, CELL y);
 void primitive_xor(void);
+CELL shiftleft(CELL x, CELL y);
 void primitive_shiftleft(void);
+CELL shiftright(CELL x, CELL y);
 void primitive_shiftright(void);