125c28e83SPiotr Jasiukajtis /*
225c28e83SPiotr Jasiukajtis  * CDDL HEADER START
325c28e83SPiotr Jasiukajtis  *
425c28e83SPiotr Jasiukajtis  * The contents of this file are subject to the terms of the
525c28e83SPiotr Jasiukajtis  * Common Development and Distribution License (the "License").
625c28e83SPiotr Jasiukajtis  * You may not use this file except in compliance with the License.
725c28e83SPiotr Jasiukajtis  *
825c28e83SPiotr Jasiukajtis  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
925c28e83SPiotr Jasiukajtis  * or http://www.opensolaris.org/os/licensing.
1025c28e83SPiotr Jasiukajtis  * See the License for the specific language governing permissions
1125c28e83SPiotr Jasiukajtis  * and limitations under the License.
1225c28e83SPiotr Jasiukajtis  *
1325c28e83SPiotr Jasiukajtis  * When distributing Covered Code, include this CDDL HEADER in each
1425c28e83SPiotr Jasiukajtis  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1525c28e83SPiotr Jasiukajtis  * If applicable, add the following below this CDDL HEADER, with the
1625c28e83SPiotr Jasiukajtis  * fields enclosed by brackets "[]" replaced with your own identifying
1725c28e83SPiotr Jasiukajtis  * information: Portions Copyright [yyyy] [name of copyright owner]
1825c28e83SPiotr Jasiukajtis  *
1925c28e83SPiotr Jasiukajtis  * CDDL HEADER END
2025c28e83SPiotr Jasiukajtis  */
2125c28e83SPiotr Jasiukajtis 
2225c28e83SPiotr Jasiukajtis /*
2325c28e83SPiotr Jasiukajtis  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
2425c28e83SPiotr Jasiukajtis  */
2525c28e83SPiotr Jasiukajtis /*
2625c28e83SPiotr Jasiukajtis  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
2725c28e83SPiotr Jasiukajtis  * Use is subject to license terms.
2825c28e83SPiotr Jasiukajtis  */
2925c28e83SPiotr Jasiukajtis 
3025c28e83SPiotr Jasiukajtis #ifndef	_M9X_FEX_HANDLER_H
3125c28e83SPiotr Jasiukajtis #define	_M9X_FEX_HANDLER_H
3225c28e83SPiotr Jasiukajtis 
3325c28e83SPiotr Jasiukajtis /* the following enums must match the bit positions in fenv.h */
3425c28e83SPiotr Jasiukajtis enum fex_exception {
3525c28e83SPiotr Jasiukajtis 	fex_inexact		= 0,
3625c28e83SPiotr Jasiukajtis 	fex_division	= 1,
3725c28e83SPiotr Jasiukajtis 	fex_underflow	= 2,
3825c28e83SPiotr Jasiukajtis 	fex_overflow	= 3,
3925c28e83SPiotr Jasiukajtis 	fex_inv_zdz		= 4,
4025c28e83SPiotr Jasiukajtis 	fex_inv_idi		= 5,
4125c28e83SPiotr Jasiukajtis 	fex_inv_isi		= 6,
4225c28e83SPiotr Jasiukajtis 	fex_inv_zmi		= 7,
4325c28e83SPiotr Jasiukajtis 	fex_inv_sqrt	= 8,
4425c28e83SPiotr Jasiukajtis 	fex_inv_snan	= 9,
4525c28e83SPiotr Jasiukajtis 	fex_inv_int		= 10,
4625c28e83SPiotr Jasiukajtis 	fex_inv_cmp		= 11
4725c28e83SPiotr Jasiukajtis };
4825c28e83SPiotr Jasiukajtis 
4925c28e83SPiotr Jasiukajtis 
5025c28e83SPiotr Jasiukajtis /* auxiliary functions in __fex_hdlr.c */
5125c28e83SPiotr Jasiukajtis extern struct fex_handler_data *__fex_get_thr_handlers(void);
5225c28e83SPiotr Jasiukajtis extern void __fex_update_te(void);
5325c28e83SPiotr Jasiukajtis 
5425c28e83SPiotr Jasiukajtis /* auxiliary functions in __fex_sym.c */
5525c28e83SPiotr Jasiukajtis extern void __fex_sym_init(void);
5625c28e83SPiotr Jasiukajtis extern char *__fex_sym(char *, char **);
5725c28e83SPiotr Jasiukajtis 
5825c28e83SPiotr Jasiukajtis /* auxiliary functions in fex_log.c */
5925c28e83SPiotr Jasiukajtis extern void __fex_mklog(ucontext_t *, char *, int, enum fex_exception,
6025c28e83SPiotr Jasiukajtis 	int, void *);
6125c28e83SPiotr Jasiukajtis 
6225c28e83SPiotr Jasiukajtis /* system-dependent auxiliary functions */
6325c28e83SPiotr Jasiukajtis extern enum fex_exception __fex_get_invalid_type(siginfo_t *, ucontext_t *);
6425c28e83SPiotr Jasiukajtis extern void __fex_get_op(siginfo_t *, ucontext_t *, fex_info_t *);
6525c28e83SPiotr Jasiukajtis extern void __fex_st_result(siginfo_t *, ucontext_t *, fex_info_t *);
6625c28e83SPiotr Jasiukajtis 
6725c28e83SPiotr Jasiukajtis /* inline templates and macros for accessing fp state */
6825c28e83SPiotr Jasiukajtis extern void __fenv_getfsr(unsigned long *);
6925c28e83SPiotr Jasiukajtis extern void __fenv_setfsr(const unsigned long *);
7025c28e83SPiotr Jasiukajtis 
7125c28e83SPiotr Jasiukajtis #if defined(__sparc)
7225c28e83SPiotr Jasiukajtis 
7325c28e83SPiotr Jasiukajtis #define __fenv_get_rd(X)	((X>>30)&0x3)
7425c28e83SPiotr Jasiukajtis #define __fenv_set_rd(X,Y)	X=(X&~0xc0000000ul)|((Y)<<30)
7525c28e83SPiotr Jasiukajtis 
7625c28e83SPiotr Jasiukajtis #define __fenv_get_te(X)	((X>>23)&0x1f)
7725c28e83SPiotr Jasiukajtis #define __fenv_set_te(X,Y)	X=(X&~0x0f800000ul)|((Y)<<23)
7825c28e83SPiotr Jasiukajtis 
7925c28e83SPiotr Jasiukajtis #define __fenv_get_ex(X)	((X>>5)&0x1f)
8025c28e83SPiotr Jasiukajtis #define __fenv_set_ex(X,Y)	X=(X&~0x000003e0ul)|((Y)<<5)
8125c28e83SPiotr Jasiukajtis 
8225c28e83SPiotr Jasiukajtis #elif defined(__x86)
8325c28e83SPiotr Jasiukajtis 
8425c28e83SPiotr Jasiukajtis extern void __fenv_getcwsw(unsigned int *);
8525c28e83SPiotr Jasiukajtis extern void __fenv_setcwsw(const unsigned int *);
8625c28e83SPiotr Jasiukajtis 
8725c28e83SPiotr Jasiukajtis extern void __fenv_getmxcsr(unsigned int *);
8825c28e83SPiotr Jasiukajtis extern void __fenv_setmxcsr(const unsigned int *);
8925c28e83SPiotr Jasiukajtis 
9025c28e83SPiotr Jasiukajtis #define __fenv_get_rd(X)	((X>>26)&3)
9125c28e83SPiotr Jasiukajtis #define __fenv_set_rd(X,Y)	X=(X&~0x0c000000)|((Y)<<26)
9225c28e83SPiotr Jasiukajtis 
9325c28e83SPiotr Jasiukajtis #define __fenv_get_rp(X)	((X>>24)&3)
9425c28e83SPiotr Jasiukajtis #define __fenv_set_rp(X,Y)	X=(X&~0x03000000)|((Y)<<24)
9525c28e83SPiotr Jasiukajtis 
9625c28e83SPiotr Jasiukajtis #define __fenv_get_te(X)	((X>>16)&0x3d)
9725c28e83SPiotr Jasiukajtis #define __fenv_set_te(X,Y)	X=(X&~0x003d0000)|((Y)<<16)
9825c28e83SPiotr Jasiukajtis 
9925c28e83SPiotr Jasiukajtis #define __fenv_get_ex(X)	(X&0x3d)
10025c28e83SPiotr Jasiukajtis #define __fenv_set_ex(X,Y)	X=(X&~0x0000003d)|(Y)
10125c28e83SPiotr Jasiukajtis 
102*55fea89dSDan Cross /*
10325c28e83SPiotr Jasiukajtis  * These macros define some useful distinctions between various
10425c28e83SPiotr Jasiukajtis  * SSE instructions.  In some cases, distinctions are made for
10525c28e83SPiotr Jasiukajtis  * the purpose of simplifying the decoding of instructions, while
10625c28e83SPiotr Jasiukajtis  * in other cases, they are made for the purpose of simplying the
10725c28e83SPiotr Jasiukajtis  * emulation.  Note that these values serve as bit flags within
10825c28e83SPiotr Jasiukajtis  * the enum values in sseinst_t.
10925c28e83SPiotr Jasiukajtis  */
11025c28e83SPiotr Jasiukajtis #define DOUBLE		0x100
11125c28e83SPiotr Jasiukajtis #define SIMD		0x080
11225c28e83SPiotr Jasiukajtis #define INTREG		0x040
11325c28e83SPiotr Jasiukajtis 
11425c28e83SPiotr Jasiukajtis typedef union {
11525c28e83SPiotr Jasiukajtis 	double		d[2];
11625c28e83SPiotr Jasiukajtis 	long long	l[2];
11725c28e83SPiotr Jasiukajtis 	float		f[4];
11825c28e83SPiotr Jasiukajtis 	int		i[4];
11925c28e83SPiotr Jasiukajtis } sseoperand_t;
12025c28e83SPiotr Jasiukajtis 
12125c28e83SPiotr Jasiukajtis /* structure to hold a decoded SSE instruction */
12225c28e83SPiotr Jasiukajtis typedef struct {
12325c28e83SPiotr Jasiukajtis 	enum {
12425c28e83SPiotr Jasiukajtis 		/* single precision scalar instructions */
12525c28e83SPiotr Jasiukajtis 		cmpss		= 0,
12625c28e83SPiotr Jasiukajtis 		minss		= 1,
12725c28e83SPiotr Jasiukajtis 		maxss		= 2,
12825c28e83SPiotr Jasiukajtis 		addss		= 3,
12925c28e83SPiotr Jasiukajtis 		subss		= 4,
13025c28e83SPiotr Jasiukajtis 		mulss		= 5,
13125c28e83SPiotr Jasiukajtis 		divss		= 6,
13225c28e83SPiotr Jasiukajtis 		sqrtss		= 7,
13325c28e83SPiotr Jasiukajtis 		ucomiss		= 16,
13425c28e83SPiotr Jasiukajtis 		comiss		= 17,
13525c28e83SPiotr Jasiukajtis 		cvtss2sd	= 32,
13625c28e83SPiotr Jasiukajtis 		cvtsi2ss	= INTREG + 0,
13725c28e83SPiotr Jasiukajtis 		cvttss2si	= INTREG + 1,
13825c28e83SPiotr Jasiukajtis 		cvtss2si	= INTREG + 2,
13925c28e83SPiotr Jasiukajtis 		cvtsi2ssq	= INTREG + 8,
14025c28e83SPiotr Jasiukajtis 		cvttss2siq	= INTREG + 9,
14125c28e83SPiotr Jasiukajtis 		cvtss2siq	= INTREG + 10,
14225c28e83SPiotr Jasiukajtis 
14325c28e83SPiotr Jasiukajtis 		/* single precision SIMD instructions */
14425c28e83SPiotr Jasiukajtis 		cmpps		= SIMD + 0,
14525c28e83SPiotr Jasiukajtis 		minps		= SIMD + 1,
14625c28e83SPiotr Jasiukajtis 		maxps		= SIMD + 2,
14725c28e83SPiotr Jasiukajtis 		addps		= SIMD + 3,
14825c28e83SPiotr Jasiukajtis 		subps		= SIMD + 4,
14925c28e83SPiotr Jasiukajtis 		mulps		= SIMD + 5,
15025c28e83SPiotr Jasiukajtis 		divps		= SIMD + 6,
15125c28e83SPiotr Jasiukajtis 		sqrtps		= SIMD + 7,
15225c28e83SPiotr Jasiukajtis 		cvtps2pd	= SIMD + 32,
15325c28e83SPiotr Jasiukajtis 		cvtdq2ps	= SIMD + 34,
15425c28e83SPiotr Jasiukajtis 		cvttps2dq	= SIMD + 35,
15525c28e83SPiotr Jasiukajtis 		cvtps2dq	= SIMD + 36,
15625c28e83SPiotr Jasiukajtis 		cvtpi2ps	= SIMD + INTREG + 0,
15725c28e83SPiotr Jasiukajtis 		cvttps2pi	= SIMD + INTREG + 1,
15825c28e83SPiotr Jasiukajtis 		cvtps2pi	= SIMD + INTREG + 2,
15925c28e83SPiotr Jasiukajtis 
16025c28e83SPiotr Jasiukajtis 		/* double precision scalar instructions */
16125c28e83SPiotr Jasiukajtis 		cmpsd		= DOUBLE + 0,
16225c28e83SPiotr Jasiukajtis 		minsd		= DOUBLE + 1,
16325c28e83SPiotr Jasiukajtis 		maxsd		= DOUBLE + 2,
16425c28e83SPiotr Jasiukajtis 		addsd		= DOUBLE + 3,
16525c28e83SPiotr Jasiukajtis 		subsd		= DOUBLE + 4,
16625c28e83SPiotr Jasiukajtis 		mulsd		= DOUBLE + 5,
16725c28e83SPiotr Jasiukajtis 		divsd		= DOUBLE + 6,
16825c28e83SPiotr Jasiukajtis 		sqrtsd		= DOUBLE + 7,
16925c28e83SPiotr Jasiukajtis 		ucomisd		= DOUBLE + 16,
17025c28e83SPiotr Jasiukajtis 		comisd		= DOUBLE + 17,
17125c28e83SPiotr Jasiukajtis 		cvtsd2ss	= DOUBLE + 32,
17225c28e83SPiotr Jasiukajtis 		cvtsi2sd	= DOUBLE + INTREG + 0,
17325c28e83SPiotr Jasiukajtis 		cvttsd2si	= DOUBLE + INTREG + 1,
17425c28e83SPiotr Jasiukajtis 		cvtsd2si	= DOUBLE + INTREG + 2,
17525c28e83SPiotr Jasiukajtis 		cvtsi2sdq	= DOUBLE + INTREG + 8,
17625c28e83SPiotr Jasiukajtis 		cvttsd2siq	= DOUBLE + INTREG + 9,
17725c28e83SPiotr Jasiukajtis 		cvtsd2siq	= DOUBLE + INTREG + 10,
17825c28e83SPiotr Jasiukajtis 
17925c28e83SPiotr Jasiukajtis 		/* double precision SIMD instructions */
18025c28e83SPiotr Jasiukajtis 		cmppd		= DOUBLE + SIMD + 0,
18125c28e83SPiotr Jasiukajtis 		minpd		= DOUBLE + SIMD + 1,
18225c28e83SPiotr Jasiukajtis 		maxpd		= DOUBLE + SIMD + 2,
18325c28e83SPiotr Jasiukajtis 		addpd		= DOUBLE + SIMD + 3,
18425c28e83SPiotr Jasiukajtis 		subpd		= DOUBLE + SIMD + 4,
18525c28e83SPiotr Jasiukajtis 		mulpd		= DOUBLE + SIMD + 5,
18625c28e83SPiotr Jasiukajtis 		divpd		= DOUBLE + SIMD + 6,
18725c28e83SPiotr Jasiukajtis 		sqrtpd		= DOUBLE + SIMD + 7,
18825c28e83SPiotr Jasiukajtis 		cvtpd2ps	= DOUBLE + SIMD + 32,
18925c28e83SPiotr Jasiukajtis 		cvtdq2pd	= DOUBLE + SIMD + 34,
19025c28e83SPiotr Jasiukajtis 		cvttpd2dq	= DOUBLE + SIMD + 35,
19125c28e83SPiotr Jasiukajtis 		cvtpd2dq	= DOUBLE + SIMD + 36,
19225c28e83SPiotr Jasiukajtis 		cvtpi2pd	= DOUBLE + SIMD + INTREG + 0,
19325c28e83SPiotr Jasiukajtis 		cvttpd2pi	= DOUBLE + SIMD + INTREG + 1,
19425c28e83SPiotr Jasiukajtis 		cvtpd2pi	= DOUBLE + SIMD + INTREG + 2,
19525c28e83SPiotr Jasiukajtis 	} op;
19625c28e83SPiotr Jasiukajtis 	int		imm;
19725c28e83SPiotr Jasiukajtis 	sseoperand_t	*op1, *op2;
19825c28e83SPiotr Jasiukajtis } sseinst_t;
19925c28e83SPiotr Jasiukajtis 
20025c28e83SPiotr Jasiukajtis /* x86-specific auxiliary functions */
20125c28e83SPiotr Jasiukajtis extern int *__fex_accrued(void);
20225c28e83SPiotr Jasiukajtis extern void __fex_get_x86_exc(siginfo_t *, ucontext_t *);
20325c28e83SPiotr Jasiukajtis extern int __fex_parse_sse(ucontext_t *, sseinst_t *);
20425c28e83SPiotr Jasiukajtis extern enum fex_exception __fex_get_sse_op(ucontext_t *, sseinst_t *,
20525c28e83SPiotr Jasiukajtis 	fex_info_t *);
20625c28e83SPiotr Jasiukajtis extern void __fex_get_simd_op(ucontext_t *, sseinst_t *,
20725c28e83SPiotr Jasiukajtis 	enum fex_exception *, fex_info_t *);
20825c28e83SPiotr Jasiukajtis extern void __fex_st_sse_result(ucontext_t *, sseinst_t *,
20925c28e83SPiotr Jasiukajtis 	enum fex_exception, fex_info_t *);
21025c28e83SPiotr Jasiukajtis extern void __fex_st_simd_result(ucontext_t *, sseinst_t *,
21125c28e83SPiotr Jasiukajtis 	enum fex_exception *, fex_info_t *);
21225c28e83SPiotr Jasiukajtis 
21325c28e83SPiotr Jasiukajtis #else
21425c28e83SPiotr Jasiukajtis #error Unknown architecture
21525c28e83SPiotr Jasiukajtis #endif
21625c28e83SPiotr Jasiukajtis 
21725c28e83SPiotr Jasiukajtis #endif	/* _M9X_FEX_HANDLER_H */
218