2020-08-25 11:23:25 +00:00
|
|
|
#ifndef COSMOPOLITAN_TOOL_BUILD_LIB_FPU_H_
|
|
|
|
#define COSMOPOLITAN_TOOL_BUILD_LIB_FPU_H_
|
|
|
|
#include "tool/build/lib/machine.h"
|
|
|
|
|
|
|
|
#define kFpuTagValid 0b00
|
|
|
|
#define kFpuTagZero 0b01
|
|
|
|
#define kFpuTagSpecial 0b10
|
|
|
|
#define kFpuTagEmpty 0b11
|
|
|
|
|
2022-08-12 12:17:06 +00:00
|
|
|
#define kFpuCwIm 0x0001 /* invalid operation mask */
|
|
|
|
#define kFpuCwDm 0x0002 /* denormal operand mask */
|
|
|
|
#define kFpuCwZm 0x0004 /* zero divide mask */
|
|
|
|
#define kFpuCwOm 0x0008 /* overflow mask */
|
|
|
|
#define kFpuCwUm 0x0010 /* underflow mask */
|
|
|
|
#define kFpuCwPm 0x0020 /* precision mask */
|
|
|
|
#define kFpuCwPc 0x0300 /* precision: 32,∅,64,80 */
|
|
|
|
#define kFpuCwRc 0x0c00 /* rounding: even,→-∞,→+∞,→0 */
|
|
|
|
|
|
|
|
#define kFpuSwIe 0x0001 /* invalid operation */
|
|
|
|
#define kFpuSwDe 0x0002 /* denormalized operand */
|
|
|
|
#define kFpuSwZe 0x0004 /* zero divide */
|
|
|
|
#define kFpuSwOe 0x0008 /* overflow */
|
|
|
|
#define kFpuSwUe 0x0010 /* underflow */
|
|
|
|
#define kFpuSwPe 0x0020 /* precision */
|
|
|
|
#define kFpuSwSf 0x0040 /* stack fault */
|
|
|
|
#define kFpuSwEs 0x0080 /* exception summary status */
|
|
|
|
#define kFpuSwC0 0x0100 /* condition 0 */
|
|
|
|
#define kFpuSwC1 0x0200 /* condition 1 */
|
|
|
|
#define kFpuSwC2 0x0400 /* condition 2 */
|
|
|
|
#define kFpuSwSp 0x3800 /* top stack */
|
|
|
|
#define kFpuSwC3 0x4000 /* condition 3 */
|
|
|
|
#define kFpuSwBf 0x8000 /* busy flag */
|
|
|
|
|
|
|
|
#define kMxcsrIe 0x0001 /* invalid operation flag */
|
|
|
|
#define kMxcsrDe 0x0002 /* denormal flag */
|
|
|
|
#define kMxcsrZe 0x0004 /* divide by zero flag */
|
|
|
|
#define kMxcsrOe 0x0008 /* overflow flag */
|
|
|
|
#define kMxcsrUe 0x0010 /* underflow flag */
|
|
|
|
#define kMxcsrPe 0x0020 /* precision flag */
|
|
|
|
#define kMxcsrDaz 0x0040 /* denormals are zeros */
|
|
|
|
#define kMxcsrIm 0x0080 /* invalid operation mask */
|
|
|
|
#define kMxcsrDm 0x0100 /* denormal mask */
|
|
|
|
#define kMxcsrZm 0x0200 /* divide by zero mask */
|
|
|
|
#define kMxcsrOm 0x0400 /* overflow mask */
|
|
|
|
#define kMxcsrUm 0x0800 /* underflow mask */
|
|
|
|
#define kMxcsrPm 0x1000 /* precision mask */
|
|
|
|
#define kMxcsrRc 0x6000 /* rounding control */
|
|
|
|
#define kMxcsrFtz 0x8000 /* flush to zero */
|
|
|
|
|
|
|
|
#define FpuSt(m, i) ((m)->fpu.st + (((i) + ((m->fpu.sw & kFpuSwSp) >> 11)) & 7))
|
|
|
|
|
2020-08-25 11:23:25 +00:00
|
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
|
|
COSMOPOLITAN_C_START_
|
|
|
|
|
2022-08-12 12:17:06 +00:00
|
|
|
double FpuPop(struct Machine *);
|
2020-08-27 06:08:08 +00:00
|
|
|
int FpuGetTag(struct Machine *, unsigned);
|
2022-08-12 12:17:06 +00:00
|
|
|
void FpuPush(struct Machine *, double);
|
2020-08-27 06:08:08 +00:00
|
|
|
void FpuSetTag(struct Machine *, unsigned, unsigned);
|
2022-08-12 12:17:06 +00:00
|
|
|
void OpFinit(struct Machine *);
|
|
|
|
void OpFpu(struct Machine *, uint32_t);
|
|
|
|
void OpFwait(struct Machine *, uint32_t);
|
2020-08-25 11:23:25 +00:00
|
|
|
|
|
|
|
COSMOPOLITAN_C_END_
|
|
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
|
|
#endif /* COSMOPOLITAN_TOOL_BUILD_LIB_FPU_H_ */
|