/vm/math.hpp

http://github.com/abeaumont/factor · C++ Header · 91 lines · 71 code · 16 blank · 4 comment · 7 complexity · 814cd4b02992721b228ff28cd1d853ef MD5 · raw file

  1. namespace factor
  2. {
  3. static const fixnum fixnum_max = (((fixnum)1 << (WORD_SIZE - TAG_BITS - 1)) - 1);
  4. static const fixnum fixnum_min = (-((fixnum)1 << (WORD_SIZE - TAG_BITS - 1)));
  5. static const fixnum array_size_max = ((cell)1 << (WORD_SIZE - TAG_BITS - 2));
  6. /* Allocates memory */
  7. inline cell factor_vm::from_signed_cell(fixnum x)
  8. {
  9. if(x < fixnum_min || x > fixnum_max)
  10. return tag<bignum>(fixnum_to_bignum(x));
  11. else
  12. return tag_fixnum(x);
  13. }
  14. /* Allocates memory */
  15. inline cell factor_vm::from_unsigned_cell(cell x)
  16. {
  17. if(x > (cell)fixnum_max)
  18. return tag<bignum>(cell_to_bignum(x));
  19. else
  20. return tag_fixnum(x);
  21. }
  22. /* Allocates memory */
  23. inline cell factor_vm::allot_float(double n)
  24. {
  25. boxed_float *flo = allot<boxed_float>(sizeof(boxed_float));
  26. flo->n = n;
  27. return tag(flo);
  28. }
  29. /* Allocates memory */
  30. inline bignum *factor_vm::float_to_bignum(cell tagged)
  31. {
  32. return double_to_bignum(untag_float(tagged));
  33. }
  34. inline double factor_vm::untag_float(cell tagged)
  35. {
  36. return untag<boxed_float>(tagged)->n;
  37. }
  38. inline double factor_vm::untag_float_check(cell tagged)
  39. {
  40. return untag_check<boxed_float>(tagged)->n;
  41. }
  42. inline fixnum factor_vm::float_to_fixnum(cell tagged)
  43. {
  44. return (fixnum)untag_float(tagged);
  45. }
  46. inline double factor_vm::fixnum_to_float(cell tagged)
  47. {
  48. return (double)untag_fixnum(tagged);
  49. }
  50. inline cell factor_vm::unbox_array_size()
  51. {
  52. cell obj = ctx->peek();
  53. if(TAG(obj) == FIXNUM_TYPE)
  54. {
  55. fixnum n = untag_fixnum(obj);
  56. if(n >= 0 && n < (fixnum)array_size_max)
  57. {
  58. ctx->pop();
  59. return n;
  60. }
  61. }
  62. return unbox_array_size_slow();
  63. }
  64. VM_C_API cell from_signed_cell(fixnum integer, factor_vm *vm);
  65. VM_C_API cell from_unsigned_cell(cell integer, factor_vm *vm);
  66. VM_C_API cell from_signed_8(s64 n, factor_vm *vm);
  67. VM_C_API cell from_unsigned_8(u64 n, factor_vm *vm);
  68. VM_C_API s64 to_signed_8(cell obj, factor_vm *parent);
  69. VM_C_API u64 to_unsigned_8(cell obj, factor_vm *parent);
  70. VM_C_API fixnum to_fixnum(cell tagged, factor_vm *vm);
  71. VM_C_API cell to_cell(cell tagged, factor_vm *vm);
  72. VM_C_API void overflow_fixnum_add(fixnum x, fixnum y, factor_vm *parent);
  73. VM_C_API void overflow_fixnum_subtract(fixnum x, fixnum y, factor_vm *parent);
  74. VM_C_API void overflow_fixnum_multiply(fixnum x, fixnum y, factor_vm *parent);
  75. }