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