25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER START
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
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 *
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 *
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 *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER END
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Use is subject to license terms.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <ucontext.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <fenv.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#if defined(__SUNPRO_C)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <sunmath.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <sys/ieeefp.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include "fex_handler.h"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include "fenv_inlines.h"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#if !defined(REG_PC)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define REG_PC EIP
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#if !defined(REG_PS)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define REG_PS EFL
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __amd64
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define regno(X) ((X < 4)? REG_RAX - X : \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ((X > 4)? REG_RAX + 1 - X : REG_RSP))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define regno(X) (EAX - X)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Support for SSE instructions
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Decode an SSE instruction. Fill in *inst and return the length of the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * instruction in bytes. Return 0 if the instruction is not recognized.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisint
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis__fex_parse_sse(ucontext_t *uap, sseinst_t *inst)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned char *ip;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis char *addr;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int i, dbl, simd, rex, modrm, sib, r;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ip = (unsigned char *)uap->uc_mcontext.gregs[REG_PC];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* look for pseudo-prefixes */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dbl = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis simd = SIMD;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (ip[i] == 0xF3) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis simd = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i++;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (ip[i] == 0x66) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dbl = DOUBLE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i++;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (ip[i] == 0xF2) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dbl = DOUBLE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis simd = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i++;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* look for AMD64 REX prefix */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rex = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (ip[i] >= 0x40 && ip[i] <= 0x4F) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rex = ip[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i++;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* parse opcode */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (ip[i++] != 0x0F)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (ip[i++]) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x2A:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)cvtsi2ss + simd + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (!simd)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)inst->op + (rex & 8);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x2C:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)cvttss2si + simd + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (!simd)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)inst->op + (rex & 8);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x2D:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)cvtss2si + simd + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (!simd)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)inst->op + (rex & 8);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x2E:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* oddball: scalar instruction in a SIMD opcode group */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (!simd)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)ucomiss + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x2F:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* oddball: scalar instruction in a SIMD opcode group */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (!simd)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)comiss + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x51:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)sqrtss + simd + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x58:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)addss + simd + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x59:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)mulss + simd + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x5A:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)cvtss2sd + simd + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x5B:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (dbl) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (simd)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = cvtps2dq;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (simd)? cvtdq2ps : cvttps2dq;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x5C:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)subss + simd + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x5D:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)minss + simd + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x5E:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)divss + simd + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0x5F:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)maxss + simd + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0xC2:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (int)cmpss + simd + dbl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0xE6:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (simd) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (dbl)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = cvttpd2dq;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op = (dbl)? cvtpd2dq : cvtdq2pd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* locate operands */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis modrm = ip[i++];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inst->op == cvtss2si || inst->op == cvttss2si ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cvtsd2si || inst->op == cvttsd2si ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cvtss2siq || inst->op == cvttss2siq ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cvtsd2siq || inst->op == cvttsd2siq) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* op1 is a gp register */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis r = ((rex & 4) << 1) | ((modrm >> 3) & 7);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op1 = (sseoperand_t *)&uap->uc_mcontext.gregs[regno(r)];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (inst->op == cvtps2pi || inst->op == cvttps2pi ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cvtpd2pi || inst->op == cvttpd2pi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* op1 is a mmx register */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __amd64
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op1 = (sseoperand_t *)&uap->uc_mcontext.fpregs.fp_reg_set.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fpchip_state.st[(modrm >> 3) & 7];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op1 = (sseoperand_t *)(10 * ((modrm >> 3) & 7) +
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (char *)&uap->uc_mcontext.fpregs.fp_reg_set.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fpchip_state.state[7]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* op1 is a xmm register */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis r = ((rex & 4) << 1) | ((modrm >> 3) & 7);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op1 = (sseoperand_t *)&uap->uc_mcontext.fpregs.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fp_reg_set.fpchip_state.xmm[r];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((modrm >> 6) == 3) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inst->op == cvtsi2ss || inst->op == cvtsi2sd ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cvtsi2ssq || inst->op == cvtsi2sdq) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* op2 is a gp register */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis r = ((rex & 1) << 3) | (modrm & 7);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op2 = (sseoperand_t *)&uap->uc_mcontext.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis gregs[regno(r)];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (inst->op == cvtpi2ps || inst->op == cvtpi2pd) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* op2 is a mmx register */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __amd64
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op2 = (sseoperand_t *)&uap->uc_mcontext.fpregs.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fp_reg_set.fpchip_state.st[modrm & 7];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op2 = (sseoperand_t *)(10 * (modrm & 7) +
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (char *)&uap->uc_mcontext.fpregs.fp_reg_set.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fpchip_state.state[7]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* op2 is a xmm register */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis r = ((rex & 1) << 3) | (modrm & 7);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op2 = (sseoperand_t *)&uap->uc_mcontext.fpregs.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fp_reg_set.fpchip_state.xmm[r];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if ((modrm & 0xc7) == 0x05) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __amd64
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* address of next instruction + offset */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis r = i + 4;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inst->op == cmpss || inst->op == cmpps ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cmpsd || inst->op == cmppd)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis r++;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op2 = (sseoperand_t *)(ip + r + *(int *)(ip + i));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* absolute address */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op2 = (sseoperand_t *)(*(int *)(ip + i));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i += 4;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* complex address */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((modrm & 7) == 4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* parse sib byte */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sib = ip[i++];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((sib & 7) == 5 && (modrm >> 6) == 0) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* start with absolute address */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis addr = (char *)(uintptr_t)(*(int *)(ip + i));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i += 4;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* start with base */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis r = ((rex & 1) << 3) | (sib & 7);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis addr = (char *)uap->uc_mcontext.gregs[regno(r)];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis r = ((rex & 2) << 2) | ((sib >> 3) & 7);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (r != 4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* add scaled index */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis addr += uap->uc_mcontext.gregs[regno(r)]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis << (sib >> 6);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis r = ((rex & 1) << 3) | (modrm & 7);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis addr = (char *)uap->uc_mcontext.gregs[regno(r)];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* add displacement, if any */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((modrm >> 6) == 1) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis addr += (char)ip[i++];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if ((modrm >> 6) == 2) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis addr += *(int *)(ip + i);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i += 4;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op2 = (sseoperand_t *)addr;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inst->op == cmpss || inst->op == cmpps || inst->op == cmpsd ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cmppd) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* get the immediate operand */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->imm = ip[i++];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return i;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic enum fp_class_type
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtismy_fp_classf(float *x)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int i = *(int *)x & ~0x80000000;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (i < 0x7f800000) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (i < 0x00800000)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return ((i == 0)? fp_zero : fp_subnormal);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fp_normal;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (i == 0x7f800000)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fp_infinity;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (i & 0x400000)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fp_quiet;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fp_signaling;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic enum fp_class_type
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtismy_fp_class(double *x)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int i = *(1+(int *)x) & ~0x80000000;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (i < 0x7ff00000) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (i < 0x00100000)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (((i | *(int *)x) == 0)? fp_zero : fp_subnormal);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fp_normal;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (i == 0x7ff00000 && *(int *)x == 0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fp_infinity;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (i & 0x80000)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fp_quiet;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fp_signaling;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Inspect a scalar SSE instruction that incurred an invalid operation
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * exception to determine which type of exception it was.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic enum fex_exception
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis__fex_get_sse_invalid_type(sseinst_t *inst)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis enum fp_class_type t1, t2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* check op2 for signaling nan */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis t2 = ((int)inst->op & DOUBLE)? my_fp_class(&inst->op2->d[0]) :
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis my_fp_classf(&inst->op2->f[0]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (t2 == fp_signaling)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fex_inv_snan;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* eliminate all single-operand instructions */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (inst->op) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtsd2ss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtss2sd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* hmm, this shouldn't have happened */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (enum fex_exception) -1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case sqrtss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case sqrtsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fex_inv_sqrt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtss2si:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtsd2si:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttss2si:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttsd2si:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtss2siq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtsd2siq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttss2siq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttsd2siq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fex_inv_int;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* check op1 for signaling nan */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis t1 = ((int)inst->op & DOUBLE)? my_fp_class(&inst->op1->d[0]) :
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis my_fp_classf(&inst->op1->f[0]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (t1 == fp_signaling)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fex_inv_snan;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* check two-operand instructions for other cases */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (inst->op) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cmpss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cmpsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case minss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case minsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case maxss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case maxsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case comiss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case comisd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fex_inv_cmp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case addss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case addsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case subss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case subsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (t1 == fp_infinity && t2 == fp_infinity)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fex_inv_isi;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case mulss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case mulsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((t1 == fp_zero && t2 == fp_infinity) ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (t2 == fp_zero && t1 == fp_infinity))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fex_inv_zmi;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case divss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case divsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (t1 == fp_zero && t2 == fp_zero)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fex_inv_zdz;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (t1 == fp_infinity && t2 == fp_infinity)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fex_inv_idi;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (enum fex_exception)-1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* inline templates */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cmpeqss(float *, float *, int *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cmpltss(float *, float *, int *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cmpless(float *, float *, int *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cmpunordss(float *, float *, int *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_minss(float *, float *, float *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_maxss(float *, float *, float *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_addss(float *, float *, float *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_subss(float *, float *, float *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_mulss(float *, float *, float *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_divss(float *, float *, float *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_sqrtss(float *, float *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_ucomiss(float *, float *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_comiss(float *, float *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvtss2sd(float *, double *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvtsi2ss(int *, float *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvttss2si(float *, int *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvtss2si(float *, int *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __amd64
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvtsi2ssq(long long *, float *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvttss2siq(float *, long long *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvtss2siq(float *, long long *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cmpeqsd(double *, double *, long long *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cmpltsd(double *, double *, long long *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cmplesd(double *, double *, long long *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cmpunordsd(double *, double *, long long *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_minsd(double *, double *, double *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_maxsd(double *, double *, double *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_addsd(double *, double *, double *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_subsd(double *, double *, double *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_mulsd(double *, double *, double *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_divsd(double *, double *, double *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_sqrtsd(double *, double *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_ucomisd(double *, double *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_comisd(double *, double *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvtsd2ss(double *, float *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvtsi2sd(int *, double *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvttsd2si(double *, int *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvtsd2si(double *, int *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __amd64
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvtsi2sdq(long long *, double *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvttsd2siq(double *, long long *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void sse_cvtsd2siq(double *, long long *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Fill in *info with the operands, default untrapped result, and
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * flags produced by a scalar SSE instruction, and return the type
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * of trapped exception (if any). On entry, the mxcsr must have
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * all exceptions masked and all flags clear. The same conditions
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * will hold on exit.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * This routine does not work if the instruction specified by *inst
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * is not a scalar instruction.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisenum fex_exception
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis__fex_get_sse_op(ucontext_t *uap, sseinst_t *inst, fex_info_t *info)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int e, te, mxcsr, oldmxcsr, subnorm;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Perform the operation with traps disabled and check the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * exception flags. If the underflow trap was enabled, also
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * check for an exact subnormal result.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fenv_getmxcsr(&oldmxcsr);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis subnorm = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((int)inst->op & DOUBLE) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inst->op == cvtsi2sd) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.type = fex_int;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.i = inst->op2->i[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.type = fex_nodata;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (inst->op == cvtsi2sdq) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.type = fex_llong;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.l = inst->op2->l[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.type = fex_nodata;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (inst->op == sqrtsd || inst->op == cvtsd2ss ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cvttsd2si || inst->op == cvtsd2si ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cvttsd2siq || inst->op == cvtsd2siq) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.type = fex_double;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.d = inst->op2->d[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.type = fex_nodata;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.type = fex_double;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.d = inst->op1->d[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.type = fex_double;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.val.d = inst->op2->d[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_double;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (inst->op) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cmpsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cmp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_llong;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (inst->imm & 3) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cmpeqsd(&info->op1.val.d, &info->op2.val.d,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.l);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 1:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cmpltsd(&info->op1.val.d, &info->op2.val.d,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.l);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 2:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cmplesd(&info->op1.val.d, &info->op2.val.d,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.l);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 3:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cmpunordsd(&info->op1.val.d,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->op2.val.d, &info->res.val.l);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inst->imm & 4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.val.l ^= 0xffffffffffffffffull;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case minsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_other;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_minsd(&info->op1.val.d, &info->op2.val.d,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case maxsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_other;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_maxsd(&info->op1.val.d, &info->op2.val.d,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case addsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_add;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_addsd(&info->op1.val.d, &info->op2.val.d,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (my_fp_class(&info->res.val.d) == fp_subnormal)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis subnorm = 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case subsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_sub;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_subsd(&info->op1.val.d, &info->op2.val.d,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (my_fp_class(&info->res.val.d) == fp_subnormal)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis subnorm = 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case mulsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_mul;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_mulsd(&info->op1.val.d, &info->op2.val.d,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (my_fp_class(&info->res.val.d) == fp_subnormal)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis subnorm = 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case divsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_div;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_divsd(&info->op1.val.d, &info->op2.val.d,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (my_fp_class(&info->res.val.d) == fp_subnormal)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis subnorm = 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case sqrtsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_sqrt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_sqrtsd(&info->op1.val.d, &info->res.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtsd2ss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_float;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvtsd2ss(&info->op1.val.d, &info->res.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (my_fp_classf(&info->res.val.f) == fp_subnormal)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis subnorm = 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtsi2sd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvtsi2sd(&info->op1.val.i, &info->res.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttsd2si:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_int;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvttsd2si(&info->op1.val.d, &info->res.val.i);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtsd2si:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_int;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvtsd2si(&info->op1.val.d, &info->res.val.i);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __amd64
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtsi2sdq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvtsi2sdq(&info->op1.val.l, &info->res.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttsd2siq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_llong;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvttsd2siq(&info->op1.val.d, &info->res.val.l);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtsd2siq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_llong;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvtsd2siq(&info->op1.val.d, &info->res.val.l);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case ucomisd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cmp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_nodata;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_ucomisd(&info->op1.val.d, &info->op2.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case comisd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cmp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_nodata;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_comisd(&info->op1.val.d, &info->op2.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inst->op == cvtsi2ss) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.type = fex_int;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.i = inst->op2->i[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.type = fex_nodata;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (inst->op == cvtsi2ssq) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.type = fex_llong;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.l = inst->op2->l[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.type = fex_nodata;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (inst->op == sqrtss || inst->op == cvtss2sd ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cvttss2si || inst->op == cvtss2si ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cvttss2siq || inst->op == cvtss2siq) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.type = fex_float;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.f = inst->op2->f[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.type = fex_nodata;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.type = fex_float;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.f = inst->op1->f[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.type = fex_float;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.val.f = inst->op2->f[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_float;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (inst->op) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cmpss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cmp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_int;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (inst->imm & 3) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cmpeqss(&info->op1.val.f, &info->op2.val.f,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.i);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 1:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cmpltss(&info->op1.val.f, &info->op2.val.f,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.i);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 2:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cmpless(&info->op1.val.f, &info->op2.val.f,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.i);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 3:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cmpunordss(&info->op1.val.f,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->op2.val.f, &info->res.val.i);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inst->imm & 4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.val.i ^= 0xffffffffu;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case minss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_other;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_minss(&info->op1.val.f, &info->op2.val.f,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case maxss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_other;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_maxss(&info->op1.val.f, &info->op2.val.f,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case addss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_add;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_addss(&info->op1.val.f, &info->op2.val.f,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (my_fp_classf(&info->res.val.f) == fp_subnormal)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis subnorm = 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case subss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_sub;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_subss(&info->op1.val.f, &info->op2.val.f,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (my_fp_classf(&info->res.val.f) == fp_subnormal)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis subnorm = 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case mulss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_mul;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_mulss(&info->op1.val.f, &info->op2.val.f,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (my_fp_classf(&info->res.val.f) == fp_subnormal)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis subnorm = 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case divss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_div;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_divss(&info->op1.val.f, &info->op2.val.f,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis &info->res.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (my_fp_classf(&info->res.val.f) == fp_subnormal)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis subnorm = 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case sqrtss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_sqrt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_sqrtss(&info->op1.val.f, &info->res.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtss2sd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_double;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvtss2sd(&info->op1.val.f, &info->res.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtsi2ss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvtsi2ss(&info->op1.val.i, &info->res.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttss2si:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_int;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvttss2si(&info->op1.val.f, &info->res.val.i);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtss2si:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_int;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvtss2si(&info->op1.val.f, &info->res.val.i);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __amd64
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtsi2ssq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvtsi2ssq(&info->op1.val.l, &info->res.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttss2siq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_llong;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvttss2siq(&info->op1.val.f, &info->res.val.l);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtss2siq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cnvt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_llong;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_cvtss2siq(&info->op1.val.f, &info->res.val.l);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case ucomiss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cmp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_nodata;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_ucomiss(&info->op1.val.f, &info->op2.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case comiss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op = fex_cmp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_nodata;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sse_comiss(&info->op1.val.f, &info->op2.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fenv_getmxcsr(&mxcsr);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->flags = mxcsr & 0x3d;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fenv_setmxcsr(&oldmxcsr);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* determine which exception would have been trapped */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis te = ~(uap->uc_mcontext.fpregs.fp_reg_set.fpchip_state.mxcsr
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis >> 7) & 0x3d;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e = mxcsr & te;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (e & FE_INVALID)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return __fex_get_sse_invalid_type(inst);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (e & FE_DIVBYZERO)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fex_division;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (e & FE_OVERFLOW)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fex_overflow;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((e & FE_UNDERFLOW) || (subnorm && (te & FE_UNDERFLOW)))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fex_underflow;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (e & FE_INEXACT)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return fex_inexact;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (enum fex_exception)-1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Emulate a SIMD SSE instruction to determine which exceptions occur
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * in each part. For i = 0, 1, 2, and 3, set e[i] to indicate the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * trapped exception that would occur if the i-th part of the SIMD
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * instruction were executed in isolation; set e[i] to -1 if no
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * trapped exception would occur in this part. Also fill in info[i]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * with the corresponding operands, default untrapped result, and
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * flags.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * This routine does not work if the instruction specified by *inst
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * is not a SIMD instruction.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisvoid
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis__fex_get_simd_op(ucontext_t *uap, sseinst_t *inst, enum fex_exception *e,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_info_t *info)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sseinst_t dummy;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int i;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[0] = e[1] = e[2] = e[3] = -1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* perform each part of the SIMD operation */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (inst->op) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cmpps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cmpss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.imm = inst->imm;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case minps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = minss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case maxps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = maxss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case addps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = addss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case subps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = subss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case mulps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = mulss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case divps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = divss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case sqrtps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = sqrtss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtdq2ps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtsi2ss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttps2dq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvttss2si;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtps2dq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtss2si;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtpi2ps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtsi2ss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttps2pi:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvttss2si;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtps2pi:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtss2si;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cmppd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cmpsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.imm = inst->imm;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case minpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = minsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case maxpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = maxsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case addpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = addsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case subpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = subsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case mulpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = mulsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case divpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = divsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case sqrtpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = sqrtsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtpi2pd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtdq2pd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtsi2sd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttpd2pi:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttpd2dq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvttsd2si;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtpd2pi:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtpd2dq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtsd2si;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtps2pd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtss2sd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtpd2ps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtsd2ss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis e[i] = __fex_get_sse_op(uap, &dummy, &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Store the result value from *info in the destination of the scalar
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * SSE instruction specified by *inst. If no result is given but the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * exception is underflow or overflow, supply the default trapped result.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * This routine does not work if the instruction specified by *inst
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * is not a scalar instruction.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisvoid
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis__fex_st_sse_result(ucontext_t *uap, sseinst_t *inst, enum fex_exception e,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_info_t *info)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int i = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis long long l = 0L;;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis float f = 0.0, fscl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis double d = 0.0L, dscl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* for compares that write eflags, just set the flags
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis to indicate "unordered" */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inst->op == ucomiss || inst->op == comiss ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == ucomisd || inst->op == comisd) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uap->uc_mcontext.gregs[REG_PS] |= 0x45;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* if info doesn't specify a result value, try to generate
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis the default trapped result */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (info->res.type == fex_nodata) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* set scale factors for exponent wrapping */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (e) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_overflow:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fscl = 1.262177448e-29f; /* 2^-96 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dscl = 6.441148769597133308e-232; /* 2^-768 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_underflow:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fscl = 7.922816251e+28f; /* 2^96 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dscl = 1.552518092300708935e+231; /* 2^768 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) __fex_get_sse_op(uap, inst, info);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (info->res.type == fex_nodata)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto stuff;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* generate the wrapped result */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inst->op == cvtsd2ss) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.type = fex_double;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.d = inst->op2->d[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.type = fex_nodata;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_float;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.val.f = (float)(fscl * (fscl *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.d));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if ((int)inst->op & DOUBLE) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.type = fex_double;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.d = inst->op1->d[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.type = fex_double;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.val.d = inst->op2->d[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_double;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (inst->op) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case addsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.val.d = dscl * (dscl *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.d + dscl * info->op2.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case subsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.val.d = dscl * (dscl *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.d - dscl * info->op2.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case mulsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.val.d = (dscl * info->op1.val.d) *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (dscl * info->op2.val.d);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case divsd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.val.d = (dscl * info->op1.val.d) /
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (info->op2.val.d / dscl);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.type = fex_float;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.f = inst->op1->f[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.type = fex_float;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op2.val.f = inst->op2->f[0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.type = fex_float;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (inst->op) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case addss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.val.f = fscl * (fscl *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.f + fscl * info->op2.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case subss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.val.f = fscl * (fscl *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->op1.val.f - fscl * info->op2.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case mulss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.val.f = (fscl * info->op1.val.f) *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (fscl * info->op2.val.f);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case divss:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis info->res.val.f = (fscl * info->op1.val.f) /
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (info->op2.val.f / fscl);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* put the result in the destination */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstuff:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inst->op == cmpss || inst->op == cvttss2si || inst->op == cvtss2si
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis || inst->op == cvttsd2si || inst->op == cvtsd2si) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (info->res.type) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_int:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i = info->res.val.i;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_llong:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i = info->res.val.l;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_float:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i = info->res.val.f;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_double:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i = info->res.val.d;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_ldouble:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i = info->res.val.q;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op1->i[0] = i;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (inst->op == cmpsd || inst->op == cvttss2siq ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cvtss2siq || inst->op == cvttsd2siq ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cvtsd2siq) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (info->res.type) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_int:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis l = info->res.val.i;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_llong:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis l = info->res.val.l;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_float:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis l = info->res.val.f;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_double:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis l = info->res.val.d;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_ldouble:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis l = info->res.val.q;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op1->l[0] = l;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if ((((int)inst->op & DOUBLE) && inst->op != cvtsd2ss) ||
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op == cvtss2sd) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (info->res.type) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_int:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis d = info->res.val.i;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_llong:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis d = info->res.val.l;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_float:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis d = info->res.val.f;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_double:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis d = info->res.val.d;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_ldouble:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis d = info->res.val.q;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op1->d[0] = d;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (info->res.type) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_int:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f = info->res.val.i;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_llong:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f = info->res.val.l;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_float:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f = info->res.val.f;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_double:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f = info->res.val.d;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case fex_ldouble:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f = info->res.val.q;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op1->f[0] = f;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Store the results from a SIMD instruction. For each i, store
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * the result value from info[i] in the i-th part of the destination
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * of the SIMD SSE instruction specified by *inst. If no result
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * is given but the exception indicated by e[i] is underflow or
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * overflow, supply the default trapped result.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * This routine does not work if the instruction specified by *inst
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * is not a SIMD instruction.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisvoid
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis__fex_st_simd_result(ucontext_t *uap, sseinst_t *inst, enum fex_exception *e,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_info_t *info)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sseinst_t dummy;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int i;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* store each part */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (inst->op) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cmpps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cmpss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.imm = inst->imm;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case minps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = minss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case maxps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = maxss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case addps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = addss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case subps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = subss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case mulps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = mulss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case divps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = divss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case sqrtps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = sqrtss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtdq2ps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtsi2ss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttps2dq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvttss2si;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtps2dq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtss2si;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 4; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtpi2ps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtsi2ss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttps2pi:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvttss2si;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtps2pi:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtss2si;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cmppd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cmpsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.imm = inst->imm;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case minpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = minsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case maxpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = maxsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case addpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = addsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case subpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = subsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case mulpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = mulsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case divpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = divsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case sqrtpd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = sqrtsd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtpi2pd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtdq2pd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtsi2sd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttpd2pi:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvttpd2dq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvttsd2si;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* for cvttpd2dq, zero the high 64 bits of the destination */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inst->op == cvttpd2dq)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op1->l[1] = 0ll;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtpd2pi:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtpd2dq:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtsd2si;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->i[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* for cvtpd2dq, zero the high 64 bits of the destination */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inst->op == cvtpd2dq)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op1->l[1] = 0ll;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtps2pd:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtss2sd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case cvtpd2ps:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op = cvtsd2ss;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < 2; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op1 = (sseoperand_t *)&inst->op1->f[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy.op2 = (sseoperand_t *)&inst->op2->d[i];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_st_sse_result(uap, &dummy, e[i], &info[i]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* zero the high 64 bits of the destination */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inst->op1->l[1] = 0ll;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis