/* Sun-$Revision: 23.4 $ */
/* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University.
See the LICENSE file for license information. */
# pragma interface
struct floatOopClass: oopClass {
// constructor
friend floatOop as_floatOop(float value);
// accessors
float value();
smi identity_hash() { return int32(this) >> Tag_Size; }
Map* map() { return Memory->float_map; }
// printing
void make_print_string(char* buf, char* format = "%g"); // private
void print_oop();
void print() { print_oop(); lprintf("\n"); }
void print_string(char* buf);
// primitives
char *print_string_prim();
char *print_string_precision_prim(smi precision);
};
extern floatOop infinityOop;
oop float_add_prim(floatOop x, floatOop y);
oop float_sub_prim(floatOop x, floatOop y);
oop float_mul_prim(floatOop x, floatOop y);
oop float_div_prim(floatOop x, floatOop y);
oop float_mod_prim(floatOop x, floatOop y);
oop as_int_prim(floatOop x);
oop as_float_prim(smiOop x);
oop float_floor_prim(floatOop x);
oop float_ceil_prim(floatOop x);
oop float_round_prim(floatOop x);
oop float_truncate_prim(floatOop x);
oop float_lt_prim(floatOop x, floatOop y);
oop float_le_prim(floatOop x, floatOop y);
oop float_eq_prim(floatOop x, floatOop y);
oop float_ne_prim(floatOop x, floatOop y);
oop float_gt_prim(floatOop x, floatOop y);
oop float_ge_prim(floatOop x, floatOop y);
# ifdef FAST_FLOATS
union floatHolder {
float f;
uint32 i;
};
inline floatOop as_floatOop(float value) {
// this trashes the least significant mantissa bits
// might want to kill exponent bits
floatHolder x;
x.f = value;
uint32 i = (x.i & ~Tag_Mask) | Float_Tag;
return floatOop(i);
}
inline float floatOopClass::value() {
floatHolder x;
x.i = uint32(this) - Float_Tag;
return x.f;
}
# endif