xref: /onnv-gate/usr/src/cmd/fps/fptest/fp.h (revision 6491:448e02e63395)
16429Svs195195 /*
26429Svs195195  * CDDL HEADER START
36429Svs195195  *
46429Svs195195  * The contents of this file are subject to the terms of the
56429Svs195195  * Common Development and Distribution License (the "License").
66429Svs195195  * You may not use this file except in compliance with the License.
76429Svs195195  *
86429Svs195195  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96429Svs195195  * or http://www.opensolaris.org/os/licensing.
106429Svs195195  * See the License for the specific language governing permissions
116429Svs195195  * and limitations under the License.
126429Svs195195  *
136429Svs195195  * When distributing Covered Code, include this CDDL HEADER in each
146429Svs195195  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156429Svs195195  * If applicable, add the following below this CDDL HEADER, with the
166429Svs195195  * fields enclosed by brackets "[]" replaced with your own identifying
176429Svs195195  * information: Portions Copyright [yyyy] [name of copyright owner]
186429Svs195195  *
196429Svs195195  * CDDL HEADER END
206429Svs195195  */
216429Svs195195 
226429Svs195195 /*
23*6491Sia112686  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
246429Svs195195  * Use is subject to license terms.
256429Svs195195  */
266429Svs195195 
276429Svs195195 #ifndef _FP_H
286429Svs195195 #define	_FP_H
296429Svs195195 
306429Svs195195 #pragma ident	"%Z%%M%	%I%	%E% SMI"
316429Svs195195 
326429Svs195195 #include <stdio.h>
336429Svs195195 #include <strings.h>
346429Svs195195 #include <stdlib.h>
356429Svs195195 #include <libintl.h>
366429Svs195195 #include <sys/fsr.h>
376429Svs195195 
386429Svs195195 #ifdef __cplusplus
396429Svs195195 extern "C" {
406429Svs195195 #endif
416429Svs195195 
426429Svs195195 /* Co-Processor Types */
436429Svs195195 
446429Svs195195 #define	FABS		30	/* FABS */
456429Svs195195 #define	INVALID		-1	/* Invalid device code */
466429Svs195195 #define	MC68881		20	/* Motorola family	68881 */
476429Svs195195 #define	MEIKO		100	/* Meiko LSIL L64804 */
486429Svs195195 #define	NONE		111	/* No FPU installed */
496429Svs195195 #define	SUNRAY_FPC	40	/* Sunray - uses the TI8847 */
506429Svs195195 #define	TI8847		10	/* TI family 8847 */
516429Svs195195 #define	WEITEK		0	/* Weitek family */
526429Svs195195 #define	WTL3170		11	/* Weitek WTL3170/2 */
536429Svs195195 
546429Svs195195 #define	CPU_TYPE_SHIFT	24	/* bits to shift to get the cpu type */
556429Svs195195 #define	CPU_TYPE_MASK	0xff	/* 1 byte indicates cpu type	 */
566429Svs195195 
576429Svs195195 /* True and False */
586429Svs195195 
596429Svs195195 #ifndef FALSE
606429Svs195195 #define	FALSE 0
616429Svs195195 #endif
626429Svs195195 
636429Svs195195 #ifndef TRUE
646429Svs195195 #define	TRUE 1
656429Svs195195 #endif
666429Svs195195 
676429Svs195195 /* Return Codes */
686429Svs195195 
696429Svs195195 #define	FPU_UNSUPPORT		-1
706429Svs195195 #define	FPU_OK			0
716429Svs195195 #define	FPU_FOROFFLINE		1
726429Svs195195 #define	FPU_BIND_FAIL		2
736429Svs195195 #define	FPU_INVALID_ARG		3
746429Svs195195 #define	FPU_SIG_SEGV		4
756429Svs195195 #define	FPU_SIG_BUS		5
766429Svs195195 #define	FPU_SIG_FPE		6
776429Svs195195 #define	FPU_SIG_ILL		7
786429Svs195195 #define	FPU_SYSCALL_TRYAGAIN	8
796429Svs195195 #define	FPU_SYSCALL_FAIL	9
806429Svs195195 #define	FPU_EREPORT_INCOM	10
816429Svs195195 #define	FPU_EREPORT_FAIL	11
826429Svs195195 
836429Svs195195 /* Math constants */
846429Svs195195 
856429Svs195195 #define	DPMARGIN		0.000000000000001
866429Svs195195 #define	MARGIN			0.0000000010
876429Svs195195 #define	pi			3.141592654
886429Svs195195 #define	SPMARGIN		0.0000001
896429Svs195195 
906429Svs195195 #define	denorm_sp		0x00000001
916429Svs195195 #define	denorm_lsw		0x00000001
926429Svs195195 #define	denorm_msw		0x00000000
936429Svs195195 
946429Svs195195 #define	half_sp			0x3f000000
956429Svs195195 #define	half_lsw		0x00000000
966429Svs195195 #define	half_msw		0x3fe00000
976429Svs195195 
986429Svs195195 #define	maxn_lsw		0xffffffff
996429Svs195195 #define	maxn_msw		0x7fefffff
1006429Svs195195 #define	maxn_sp			0x7f7fffff
1016429Svs195195 
1026429Svs195195 #define	nan_dp			0x7ff7ffffffffffff
1036429Svs195195 #define	nan_sp			0x7fbfffff
1046429Svs195195 #define	nan_lsw			0xffffffff
1056429Svs195195 #define	nan_msw			0x7ff7ffff
1066429Svs195195 
1076429Svs195195 #define	one_sp			0x3f800000
1086429Svs195195 #define	one_lsw			0x00000000
1096429Svs195195 #define	one_msw			0x3ff00000
1106429Svs195195 
1116429Svs195195 #define	two_sp			0x40000000
1126429Svs195195 #define	two_lsw			0x00000000
1136429Svs195195 #define	two_msw			0x40000000
1146429Svs195195 
1156429Svs195195 #define	zero_sp			0x00000000
1166429Svs195195 #define	zero_lsw		0x00000000
1176429Svs195195 #define	zero_msw		0x00000000
1186429Svs195195 
1196429Svs195195 /* -1 */
1206429Svs195195 
1216429Svs195195 #define	m_one_sp		0xbf800000
1226429Svs195195 #define	m_one_lsw		0x00000000
1236429Svs195195 #define	m_one_msw		0xbff00000
1246429Svs195195 
1256429Svs195195 #define	pi_dp			0x400921fb54442d18UL
1266429Svs195195 #define	pi_lsw			0x54442d18
1276429Svs195195 #define	pi_msw			0x400921fb
1286429Svs195195 #define	pi_sp			0x40490fdb
1296429Svs195195 
1306429Svs195195 #define	pi_4_sp			0x3f490fdb
1316429Svs195195 #define	pi_4_lsw		0x54442d18
1326429Svs195195 #define	pi_4_msw		0x3fe921fb
1336429Svs195195 
1346429Svs195195 /* +infinity */
1356429Svs195195 
1366429Svs195195 #define	p_inf_lsw		0x00000000
1376429Svs195195 #define	p_inf_msw		0x7ff00000
1386429Svs195195 #define	p_inf_sp		0x7f800000
1396429Svs195195 
1406429Svs195195 /* -infinity */
1416429Svs195195 
1426429Svs195195 #define	n_inf_lsw		0x00000000
1436429Svs195195 #define	n_inf_msw		0xfff00000
1446429Svs195195 #define	n_inf_sp		0xff800000
1456429Svs195195 
1466429Svs195195 
1476429Svs195195 /* pow(2, -126). Smallest SP normalized number */
1486429Svs195195 #define	minn_sp			0x00800000
1496429Svs195195 
1506429Svs195195 /* pow(2, -1022). Smallest DP normalized number */
1516429Svs195195 #define	minn_lsw		0x00000000
1526429Svs195195 #define	minn_msw		0x00100000
1536429Svs195195 
1546429Svs195195 #define	min1_lsw		0x00010001
1556429Svs195195 #define	min1_msw		0x00100001
1566429Svs195195 #define	min1_sp			0x00800001
1576429Svs195195 
1586429Svs195195 #define	maxd_lsw		0xffffffff
1596429Svs195195 #define	maxd_msw		0x000fffff
1606429Svs195195 #define	maxd_sp			0x007fffff
1616429Svs195195 
1626429Svs195195 #define	maxm_lsw		0x55554000
1636429Svs195195 #define	maxm_msw		0x7fd55555
1646429Svs195195 #define	maxm_sp			0x7eaaaa00
1656429Svs195195 
1666429Svs195195 #define	nn_lsw			0x00000000
1676429Svs195195 #define	nn_msw			0x7ff00080
1686429Svs195195 #define	nn_sp			0x7f800400
1696429Svs195195 #define	nocare			0
1706429Svs195195 
1716429Svs195195 /* FP operations */
1726429Svs195195 
1736429Svs195195 #define	op_add_sp		1
1746429Svs195195 #define	op_add_dp		2
1756429Svs195195 #define	op_div_sp		3
1766429Svs195195 #define	op_div_dp		4
1776429Svs195195 #define	op_div_dp_c2sp		5 /* After DP division, convert to SP */
1786429Svs195195 #define	op_fxtos		6
1796429Svs195195 #define	op_sub_sp		7
1806429Svs195195 #define	op_sub_dp		8
1816429Svs195195 #define	op_mul_sp		9
1826429Svs195195 #define	op_mul_dp		10
1836429Svs195195 #define	op_fstod		11
1846429Svs195195 #define	op_fdtos		12
1856429Svs195195 #define	op_fsqrts		13
1866429Svs195195 #define	op_fsqrtd		14
1876429Svs195195 
1886429Svs195195 struct testws {
1896429Svs195195 
1906429Svs195195 	unsigned long		a_msw;
1916429Svs195195 	unsigned long		a_lsw;
1926429Svs195195 	unsigned long		b_msw;
1936429Svs195195 	unsigned long		b_lsw;
1946429Svs195195 	unsigned long		instr;
1956429Svs195195 	unsigned long		fsr_tem0_ieee754_exc;
1966429Svs195195 	unsigned long		fsr_tem1_ieee754_exc;
1976429Svs195195 	unsigned long		ecode;
1986429Svs195195 };
1996429Svs195195 
2006429Svs195195 /* The values of cexc and aexc when FSR.TEM = 0 */
2016429Svs195195 #define	FSR_TEM0_NX		(FSR_CEXC_NX | FSR_AEXC_NX)
2026429Svs195195 #define	FSR_TEM0_DZ		(FSR_CEXC_DZ | FSR_AEXC_DZ)
2036429Svs195195 #define	FSR_TEM0_UF		(FSR_CEXC_UF | FSR_AEXC_UF)
2046429Svs195195 #define	FSR_TEM0_OF		(FSR_CEXC_OF | FSR_AEXC_OF)
2056429Svs195195 #define	FSR_TEM0_NV		(FSR_CEXC_NV | FSR_AEXC_NV)
2066429Svs195195 
2076429Svs195195 /* When FSR.TEM=1, the FSR.aexc field will be untouched */
2086429Svs195195 #define	FSR_TEM1_NX		FSR_CEXC_NX
2096429Svs195195 #define	FSR_TEM1_DZ		FSR_CEXC_DZ
2106429Svs195195 #define	FSR_TEM1_UF		FSR_CEXC_UF
2116429Svs195195 #define	FSR_TEM1_OF		FSR_CEXC_OF
2126429Svs195195 #define	FSR_TEM1_NV		FSR_CEXC_NV
2136429Svs195195 
2146429Svs195195 /*
2156429Svs195195  * To enable/disable TEM bits in FSR use the following flags Steps: 1.
2166429Svs195195  * unsigned long val; 2. val=get_fsr(); 3-1. val = val | FSR_ENABLE_TEM_NV
2176429Svs195195  * (for enabling) 3-2. val = val & FSR_DISABLE_TEM_NV (for disabling) 4.
2186429Svs195195  * set_fsr(val);
2196429Svs195195  */
2206429Svs195195 
2216429Svs195195 #define	FSR_ENABLE_TEM_NX	0x800000
2226429Svs195195 #define	FSR_ENABLE_TEM_DZ	0x1000000
2236429Svs195195 #define	FSR_ENABLE_TEM_UF	0x2000000
2246429Svs195195 #define	FSR_ENABLE_TEM_OF	0x4000000
2256429Svs195195 #define	FSR_ENABLE_TEM_NV	0x8000000
2266429Svs195195 #define	FSR_ENABLE_TEM		0xF800000
2276429Svs195195 
2286429Svs195195 #define	FSR_DISABLE_TEM_NX	0xFFFFFFFFFF7FFFFF
2296429Svs195195 #define	FSR_DISABLE_TEM_DZ	0xFFFFFFFFFEFFFFFF
2306429Svs195195 #define	FSR_DISABLE_TEM_UF	0xFFFFFFFFFDFFFFFF
2316429Svs195195 #define	FSR_DISABLE_TEM_OF	0xFFFFFFFFFBFFFFFF
2326429Svs195195 #define	FSR_DISABLE_TEM_NV	0xFFFFFFFFF7FFFFFF
2336429Svs195195 #define	FSR_DISABLE_TEM		0xFFFFFFFFF07FFFFF
2346429Svs195195 
2356429Svs195195 
2366429Svs195195 /*
2376429Svs195195  * There is no TEM1 equivalent for these. That is because if
2386429Svs195195  * trap is enabled, the NX bit will not be set. See Section
2396429Svs195195  * 5.1.7.9 "FSR_current_exception (cexc)" in the SPARC V9
2406429Svs195195  * Architecture Manual
2416429Svs195195  */
2426429Svs195195 
2436429Svs195195 #define	FSR_TEM0_UF_NX		(FSR_TEM0_UF | FSR_TEM0_NX)
2446429Svs195195 #define	FSR_TEM0_OF_NX		(FSR_TEM0_OF | FSR_TEM0_NX)
2456429Svs195195 
2466429Svs195195 #define	GSR_IM_ZERO		0xFFFFFFFFF7FFFFFF	/* GSR.IM = 0 */
2476429Svs195195 
2486429Svs195195 /* Values for 'ecode' of 'struct testws' */
2496429Svs195195 
2506429Svs195195 #define	E_NX			0
2516429Svs195195 #define	E_DZ			1
2526429Svs195195 #define	E_UF			2
2536429Svs195195 #define	E_OF			3
2546429Svs195195 #define	E_NV			4
2556429Svs195195 #define	E_UF_NX			5
2566429Svs195195 #define	E_OF_NX			6
2576429Svs195195 
2586429Svs195195 #define	SIGN_FLAG_SP		0x80000000
2596429Svs195195 #define	SIGN_FLAG_DP		0x8000000000000000
2606429Svs195195 
2616429Svs195195 #define	ZERO_SP			0x00000000
2626429Svs195195 #define	ZERO_DP			0x0000000000000000
2636429Svs195195 #define	PLUS_ZERO_SP		0x00000000
2646429Svs195195 #define	MINUS_ZERO_SP		0x80000000
2656429Svs195195 #define	PLUS_ZERO_DP		0x0000000000000000
2666429Svs195195 #define	MINUS_ZERO_DP		0x8000000000000000
2676429Svs195195 #define	PLUS_INF_SP		0x7F800000
2686429Svs195195 #define	MINUS_INF_SP		0xFF800000
2696429Svs195195 #define	PLUS_INF_DP		0x7FF0000000000000
2706429Svs195195 #define	MINUS_INF_DP		0xFFF0000000000000
2716429Svs195195 
2726429Svs195195 #define	ALLZEROES_DP		0x0000000000000000UL
2736429Svs195195 #define	ALLZEROES_SP		0x00000000U
2746429Svs195195 #define	ALLONES_DP		0xFFFFFFFFFFFFFFFFUL
2756429Svs195195 #define	ALLONES_SP		0xFFFFFFFFU
2766429Svs195195 
2776429Svs195195 #define	TRAP_SOLICITED		1
2786429Svs195195 #define	TRAP_UNSOLICITED	2
2796429Svs195195 
2806429Svs195195 #ifdef __cplusplus
2816429Svs195195 }
2826429Svs195195 #endif
2836429Svs195195 
2846429Svs195195 #endif /* _FP_H */
285