25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER START
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * The contents of this file are subject to the terms of the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Common Development and Distribution License (the "License").
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You may not use this file except in compliance with the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * or http://www.opensolaris.org/os/licensing.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * See the License for the specific language governing permissions
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * and limitations under the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER END
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Use is subject to license terms.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* the following enums must match the bit positions in fenv.h */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* auxiliary functions in __fex_hdlr.c */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern struct fex_handler_data *__fex_get_thr_handlers(void);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fex_update_te(void);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* auxiliary functions in __fex_sym.c */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fex_sym_init(void);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern char *__fex_sym(char *, char **);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* auxiliary functions in fex_log.c */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fex_mklog(ucontext_t *, char *, int, enum fex_exception,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* system-dependent auxiliary functions */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern enum fex_exception __fex_get_invalid_type(siginfo_t *, ucontext_t *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fex_get_op(siginfo_t *, ucontext_t *, fex_info_t *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fex_st_result(siginfo_t *, ucontext_t *, fex_info_t *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* inline templates and macros for accessing fp state */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fenv_getfsr(unsigned long *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fenv_setfsr(const unsigned long *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define __fenv_set_rd(X,Y) X=(X&~0xc0000000ul)|((Y)<<30)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define __fenv_set_te(X,Y) X=(X&~0x0f800000ul)|((Y)<<23)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define __fenv_set_ex(X,Y) X=(X&~0x000003e0ul)|((Y)<<5)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fenv_getcwsw(unsigned int *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fenv_setcwsw(const unsigned int *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fenv_getmxcsr(unsigned int *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fenv_setmxcsr(const unsigned int *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define __fenv_set_rd(X,Y) X=(X&~0x0c000000)|((Y)<<26)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define __fenv_set_rp(X,Y) X=(X&~0x03000000)|((Y)<<24)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define __fenv_set_te(X,Y) X=(X&~0x003d0000)|((Y)<<16)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define __fenv_set_ex(X,Y) X=(X&~0x0000003d)|(Y)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * These macros define some useful distinctions between various
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * SSE instructions. In some cases, distinctions are made for
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * the purpose of simplifying the decoding of instructions, while
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * in other cases, they are made for the purpose of simplying the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * emulation. Note that these values serve as bit flags within
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * the enum values in sseinst_t.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtistypedef union {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis long long l[2];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* structure to hold a decoded SSE instruction */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtistypedef struct {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* single precision scalar instructions */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* single precision SIMD instructions */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* double precision scalar instructions */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* double precision SIMD instructions */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* x86-specific auxiliary functions */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int *__fex_accrued(void);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fex_get_x86_exc(siginfo_t *, ucontext_t *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int __fex_parse_sse(ucontext_t *, sseinst_t *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern enum fex_exception __fex_get_sse_op(ucontext_t *, sseinst_t *,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fex_get_simd_op(ucontext_t *, sseinst_t *,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fex_st_sse_result(ucontext_t *, sseinst_t *,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void __fex_st_simd_result(ucontext_t *, sseinst_t *,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif /* _M9X_FEX_HANDLER_H */