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