Source to osfmk/i386/fpu.h
/*
* Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
* The contents of this file constitute Original Code as defined in and
* are subject to the Apple Public Source License Version 1.1 (the
* "License"). You may not use this file except in compliance with the
* License. Please obtain a copy of the License at
* http://www.apple.com/publicsource and read it before using this file.
*
* This Original Code and all software distributed under the License are
* distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
* License for the specific language governing rights and limitations
* under the License.
*
* @APPLE_LICENSE_HEADER_END@
*/
/*
* @OSF_COPYRIGHT@
*/
/*
* Mach Operating System
* Copyright (c) 1991 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or [email protected]
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie Mellon
* the rights to redistribute these changes.
*/
/*
*/
#ifndef _I386_FPU_H_
#define _I386_FPU_H_
/*
* Macro definitions for routines to manipulate the
* floating-point processor.
*/
#include <cpus.h>
#include <i386/proc_reg.h>
#include <i386/thread.h>
#include <kern/kern_types.h>
#include <mach/i386/kern_return.h>
#include <mach/i386/thread_status.h>
/*
* FPU instructions.
*/
#define fninit() \
__asm__ volatile("fninit")
#define fnstcw(control) \
__asm__("fnstcw %0" : "=m" (*(unsigned short *)(control)))
#define fldcw(control) \
__asm__ volatile("fldcw %0" : : "m" (*(unsigned short *) &(control)) )
extern unsigned short fnstsw(void);
extern __inline__ unsigned short fnstsw(void)
{
unsigned short status;
__asm__ volatile("fnstsw %0" : "=ma" (status));
return(status);
}
#define fnclex() \
__asm__ volatile("fnclex")
#define fnsave(state) \
__asm__ volatile("fnsave %0" : "=m" (*state))
#define frstor(state) \
__asm__ volatile("frstor %0" : : "m" (state))
#define fwait() \
__asm__("fwait");
#define fpu_load_context(pcb)
/*
* Save thread`s FPU context.
* If only one CPU, we just set the task-switched bit,
* to keep the new thread from using the coprocessor.
* If multiple CPUs, we save the entire state.
*/
#if NCPUS > 1
#define fpu_save_context(thread) \
{ \
register struct i386_fpsave_state *ifps; \
ifps = (thread)->top_act->mact.pcb->ims.ifps; \
if (ifps != 0 && !ifps->fp_valid) { \
/* registers are in FPU - save to memory */ \
ifps->fp_valid = TRUE; \
fnsave(&ifps->fp_save_state); \
} \
set_ts(); \
}
#else /* NCPUS == 1 */
#define fpu_save_context(thread) \
{ \
set_ts(); \
}
#endif /* NCPUS == 1 */
extern int fp_kind;
extern void init_fpu(void);
extern void fpu_module_init(void);
extern void fp_free(
struct i386_fpsave_state * fps);
extern kern_return_t fpu_set_state(
thread_act_t thr_act,
struct i386_float_state * st);
extern kern_return_t fpu_get_state(
thread_act_t thr_act,
struct i386_float_state * st);
extern void fpnoextflt(void);
extern void fpextovrflt(void);
extern void fpexterrflt(void);
extern void fp_state_alloc(void);
extern void fpintr(void);
extern void fpflush(thread_act_t);
#endif /* _I386_FPU_H_ */