1*2fa72412Spirofti /* $OpenBSD: ieeefp.h,v 1.6 2011/03/23 16:54:34 pirofti Exp $ */ 2df930be7Sderaadt /* $NetBSD: ieeefp.h,v 1.1 1995/04/29 01:09:17 cgd Exp $ */ 3df930be7Sderaadt 4df930be7Sderaadt /* 5df930be7Sderaadt * Written by J.T. Conklin, Apr 28, 1995 6df930be7Sderaadt * Public domain. 7df930be7Sderaadt */ 8df930be7Sderaadt 9*2fa72412Spirofti #ifndef _MACHINE_IEEEFP_H_ 10*2fa72412Spirofti #define _MACHINE_IEEEFP_H_ 11df930be7Sderaadt 12df930be7Sderaadt typedef int fp_except; 13433075b6Spvalchev 14433075b6Spvalchev #ifdef _KERNEL 15433075b6Spvalchev 16433075b6Spvalchev #include <sys/param.h> 17433075b6Spvalchev #include <sys/proc.h> 18433075b6Spvalchev #include <machine/fpu.h> 19433075b6Spvalchev #include <machine/cpu.h> 20433075b6Spvalchev 21433075b6Spvalchev /* FP_X_IOV is intentionally omitted from the architecture flags mask */ 22433075b6Spvalchev 23433075b6Spvalchev #define FP_AA_FLAGS (FP_X_INV | FP_X_DZ | FP_X_OFL | FP_X_UFL | FP_X_IMP) 24433075b6Spvalchev 25433075b6Spvalchev #define float_raise(f) \ 26433075b6Spvalchev do curproc->p_md.md_flags |= OPENBSD_FLAG_TO_FP_C(f); \ 27433075b6Spvalchev while(0) 28433075b6Spvalchev 29433075b6Spvalchev #define float_set_inexact() float_raise(FP_X_IMP) 30433075b6Spvalchev #define float_set_invalid() float_raise(FP_X_INV) 31433075b6Spvalchev #define fpgetround() (alpha_read_fpcr() >> 58 & 3) 32433075b6Spvalchev 33433075b6Spvalchev #endif 34433075b6Spvalchev 35df930be7Sderaadt #define FP_X_INV 0x01 /* invalid operation exception */ 36df930be7Sderaadt #define FP_X_DZ 0x02 /* divide-by-zero exception */ 37df930be7Sderaadt #define FP_X_OFL 0x04 /* overflow exception */ 38df930be7Sderaadt #define FP_X_UFL 0x08 /* underflow exception */ 39df930be7Sderaadt #define FP_X_IMP 0x10 /* imprecise (loss of precision; "inexact") */ 40433075b6Spvalchev #define FP_X_IOV 0x20 /* integer overflow */ 41df930be7Sderaadt 42433075b6Spvalchev /* 43433075b6Spvalchev * fp_rnd bits match the fpcr, below, as well as bits 12:11 44433075b6Spvalchev * in fp operate instructions 45433075b6Spvalchev */ 46df930be7Sderaadt typedef enum { 47df930be7Sderaadt FP_RZ = 0, /* round to zero (truncate) */ 48df930be7Sderaadt FP_RM = 1, /* round toward negative infinity */ 49df930be7Sderaadt FP_RN = 2, /* round to nearest representable number */ 50ff3c5379Smiod FP_RP = 3 /* round toward positive infinity */ 51df930be7Sderaadt } fp_rnd; 52df930be7Sderaadt 53*2fa72412Spirofti #endif /* _MACHINE_IEEEFP_H_ */ 54