89 lines · 2.1 KB · C
RawDownload
/* SPDX-License-Identifier: GPL-2.0 */#ifndef __ASM_ALPHA_FPU_H#define __ASM_ALPHA_FPU_H #include <asm/special_insns.h>#include <uapi/asm/fpu.h> /* The following two functions don't need trapb/excb instructions   around the mf_fpcr/mt_fpcr instructions because (a) the kernel   never generates arithmetic faults and (b) call_pal instructions   are implied trap barriers.  */ static inline unsigned longrdfpcr(void){	unsigned long tmp, ret; 	preempt_disable();	if (current_thread_info()->status & TS_SAVED_FP) {		ret = current_thread_info()->fp[31];	} else {#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)		__asm__ __volatile__ (			"ftoit $f0,%0\n\t"			"mf_fpcr $f0\n\t"			"ftoit $f0,%1\n\t"			"itoft %0,$f0"			: "=r"(tmp), "=r"(ret));#else		__asm__ __volatile__ (			"stt $f0,%0\n\t"			"mf_fpcr $f0\n\t"			"stt $f0,%1\n\t"			"ldt $f0,%0"			: "=m"(tmp), "=m"(ret));#endif	}	preempt_enable(); 	return ret;} static inline voidwrfpcr(unsigned long val){	unsigned long tmp; 	preempt_disable();	if (current_thread_info()->status & TS_SAVED_FP) {		current_thread_info()->status |= TS_RESTORE_FP;		current_thread_info()->fp[31] = val;	} else {#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)		__asm__ __volatile__ (			"ftoit $f0,%0\n\t"			"itoft %1,$f0\n\t"			"mt_fpcr $f0\n\t"			"itoft %0,$f0"			: "=&r"(tmp) : "r"(val));#else		__asm__ __volatile__ (			"stt $f0,%0\n\t"			"ldt $f0,%1\n\t"			"mt_fpcr $f0\n\t"			"ldt $f0,%0"			: "=m"(tmp) : "m"(val));#endif	}	preempt_enable();} static inline unsigned longswcr_update_status(unsigned long swcr, unsigned long fpcr){	/* EV6 implements most of the bits in hardware.  Collect	   the acrued exception bits from the real fpcr.  */	if (implver() == IMPLVER_EV6) {		swcr &= ~IEEE_STATUS_MASK;		swcr |= (fpcr >> 35) & IEEE_STATUS_MASK;	}	return swcr;} extern unsigned long alpha_read_fp_reg (unsigned long reg);extern void alpha_write_fp_reg (unsigned long reg, unsigned long val);extern unsigned long alpha_read_fp_reg_s (unsigned long reg);extern void alpha_write_fp_reg_s (unsigned long reg, unsigned long val); #endif /* __ASM_ALPHA_FPU_H */