1194 lines
34 KiB
C
1194 lines
34 KiB
C
/*****************************************************************/
|
|
/* Copyright (c) 1998 Intel Corporation */
|
|
/* */
|
|
/* All rights reserved. No part of this program or publication */
|
|
/* may be reproduced, transmitted, transcribed, stored in a */
|
|
/* retrieval system, or translated into any language or computer */
|
|
/* language, in any form or by any means, electronic, mechanical */
|
|
/* magnetic, optical, chemical, manual, or otherwise, without */
|
|
/* the prior written permission of Intel Corporation. */
|
|
/* */
|
|
/*****************************************************************/
|
|
/* INTEL CORPORATION PROPRIETARY INFORMATION */
|
|
/* */
|
|
/* */
|
|
/*****************************************************************/
|
|
|
|
/*++
|
|
|
|
Module Name:
|
|
|
|
debug.c
|
|
|
|
Abstract:
|
|
|
|
This module provides handy routines for debugging
|
|
|
|
Author:
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#include <wtypes.h>
|
|
#include <stdio.h>
|
|
#include <conio.h>
|
|
#include "fpieee.h"
|
|
#include "xmmi_types.h"
|
|
#include "temp_context.h"
|
|
#include "filter.h"
|
|
#include "debug.h"
|
|
|
|
|
|
ULONG DebugFlag = 0;
|
|
ULONG Console = 0;
|
|
ULONG DebugImm8 = 0;
|
|
ULONG NotOk = 0;
|
|
|
|
#define DUMP_HEXL(pxmmi, num) { \
|
|
PRINTF(("in Hex: ")); \
|
|
for (i = 0; i < num; i++) { \
|
|
PRINTF(("[%d] %x ", i, pxmmi->u.ul[i])); \
|
|
} \
|
|
PRINTF(("\n")); }
|
|
|
|
#define DUMP_FS(pxmmi, num) { \
|
|
PRINTF(("in Fflt: ")); \
|
|
for (i = 0; i < num; i++) { \
|
|
PRINTF(("[%d] %f ", i, pxmmi->u.fs[i])); \
|
|
} \
|
|
PRINTF(("\n")); }
|
|
|
|
#define DUMP_HEXLL(pxmmi, num) { \
|
|
PRINTF(("in Hex: ")); \
|
|
for (i = 0; i < num; i++) { \
|
|
PRINTF(("[%d] %I64x ", i, pxmmi->u.ull[i])); \
|
|
} \
|
|
PRINTF(("\n")); }
|
|
|
|
#define DUMP_DS(pxmmi, num) { \
|
|
PRINTF(("in Dflt: ")); \
|
|
for (i = 0; i < num; i++) { \
|
|
PRINTF(("[%d] %e ", i, pxmmi->u.fd[i])); \
|
|
} \
|
|
PRINTF(("\n")); }
|
|
|
|
|
|
void
|
|
print_Rounding(PXMMI_ENV XmmiEnv) {
|
|
|
|
if (XmmiEnv->Ieee->RoundingMode == _FpRoundNearest) {
|
|
PRINTF(("XmmiEnv->Ieee->RoundingMode = _FpRoundNearest\n"));
|
|
} else {
|
|
if (XmmiEnv->Ieee->RoundingMode == _FpRoundMinusInfinity) {
|
|
PRINTF(("XmmiEnv->Ieee->RoundingMode = _FpRoundMinusInfinity\n"));
|
|
} else {
|
|
if (XmmiEnv->Ieee->RoundingMode == _FpRoundPlusInfinity) {
|
|
PRINTF(("XmmiEnv->Ieee->RoundingMode = _FpRoundPlusInfinity\n"));
|
|
} else {
|
|
if (XmmiEnv->Ieee->RoundingMode == _FpRoundChopped) {
|
|
PRINTF(("XmmiEnv->Ieee->RoundingMode = _FpRoundChopped\n"));
|
|
} else {
|
|
PRINTF(("XmmiEnv->Ieee->RoundingMode = UNKNOWN\n"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void
|
|
print_Precision(PXMMI_ENV XmmiEnv) {
|
|
|
|
if (XmmiEnv->Ieee->Precision == _FpPrecision24) {
|
|
PRINTF(("XmmiEnv->Ieee->Precision = _FpPrecision24\n"));
|
|
} else {
|
|
if (XmmiEnv->Ieee->Precision == _FpPrecision53) {
|
|
PRINTF(("XmmiEnv->Ieee->Precision = _FpPrecision53\n"));
|
|
} else {
|
|
if (XmmiEnv->Ieee->Precision == _FpPrecisionFull) {
|
|
PRINTF(("XmmiEnv->Ieee->Precision = _FpPrecisionFull\n"));
|
|
} else {
|
|
PRINTF(("XmmiEnv->Ieee->Precision = INCORRECT\n"));
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void
|
|
print_CauseEnable(PXMMI_ENV XmmiEnv) {
|
|
|
|
PRINTF(("XmmiEmv->Ieee->Cause: P=%x U=%x O=%x Z=%x I=%x\n",
|
|
XmmiEnv->Ieee->Cause.Inexact, XmmiEnv->Ieee->Cause.Underflow,
|
|
XmmiEnv->Ieee->Cause.Overflow, XmmiEnv->Ieee->Cause.ZeroDivide,
|
|
XmmiEnv->Ieee->Cause.InvalidOperation));
|
|
PRINTF(("XmmiEnv->Ieee->Enable: P=%x U=%x O=%x Z=%x I=%x\n",
|
|
XmmiEnv->Ieee->Enable.Inexact, XmmiEnv->Ieee->Enable.Underflow,
|
|
XmmiEnv->Ieee->Enable.Overflow, XmmiEnv->Ieee->Enable.ZeroDivide,
|
|
XmmiEnv->Ieee->Enable.InvalidOperation));
|
|
|
|
}
|
|
|
|
void
|
|
print_Status(PXMMI_ENV XmmiEnv) {
|
|
|
|
PRINTF(("XmmiEnv->Ieee->Status: P=%x U=%x O=%x Z=%x I=%x\n",
|
|
XmmiEnv->Ieee->Status.Inexact, XmmiEnv->Ieee->Status.Underflow,
|
|
XmmiEnv->Ieee->Status.Overflow, XmmiEnv->Ieee->Status.ZeroDivide,
|
|
XmmiEnv->Ieee->Status.InvalidOperation));
|
|
|
|
}
|
|
|
|
void
|
|
print_Operations(PXMMI_ENV XmmiEnv) {
|
|
|
|
switch (XmmiEnv->Ieee->Operation) {
|
|
case OP_ADDPS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_ADDPS\n"));
|
|
break;
|
|
case OP_ADDSS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_ADDSS\n"));
|
|
break;
|
|
case OP_SUBPS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_SUBPS\n"));
|
|
break;
|
|
case OP_SUBSS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_SUBSS\n"));
|
|
break;
|
|
case OP_MULPS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_MULPS\n"));
|
|
break;
|
|
case OP_MULSS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_MULSS\n"));
|
|
break;
|
|
case OP_DIVPS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_DIVPS\n"));
|
|
break;
|
|
case OP_DIVSS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_DIVSS\n"));
|
|
break;
|
|
case OP_MAXPS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_MAXPS\n"));
|
|
break;
|
|
case OP_MAXSS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_MAXSS\n"));
|
|
break;
|
|
case OP_MINPS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_MINPS\n"));
|
|
break;
|
|
case OP_MINSS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_MINSS\n"));
|
|
break;
|
|
case OP_CVTPI2PS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTPI2PS\n"));
|
|
break;
|
|
case OP_CVTSI2SS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTSI2SS\n"));
|
|
break;
|
|
case OP_CVTPS2PI:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTPS2PI\n"));
|
|
break;
|
|
case OP_CVTSS2SI:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTSS2SI\n"));
|
|
break;
|
|
case OP_CVTTPS2PI:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTTPS2PI\n"));
|
|
break;
|
|
case OP_CVTTSS2SI:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTTSS2SI\n"));
|
|
break;
|
|
case OP_COMISS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_COMISS\n"));
|
|
break;
|
|
case OP_UCOMISS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_UCOMISS\n"));
|
|
break;
|
|
case OP_CMPPS:
|
|
case OP_CMPSS:
|
|
case OP_CMPPD:
|
|
case OP_CMPSD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CMPPS/CMPSS/CMPPD/CMPSD "));
|
|
|
|
switch (XmmiEnv->Imm8 & 0x07) {
|
|
|
|
case IMM8_EQ:
|
|
PRINTF(("EQ\n"));
|
|
break;
|
|
case IMM8_UNORD:
|
|
PRINTF(("UNORD\n"));
|
|
break;
|
|
case IMM8_NEQ:
|
|
PRINTF(("NEQ\n"));
|
|
break;
|
|
case IMM8_ORD:
|
|
PRINTF(("ORD\n"));
|
|
break;
|
|
case IMM8_LT:
|
|
PRINTF(("LT\n"));
|
|
break;
|
|
case IMM8_LE:
|
|
PRINTF(("LE\n"));
|
|
break;
|
|
case IMM8_NLT:
|
|
PRINTF(("NLT\n"));
|
|
break;
|
|
case IMM8_NLE:
|
|
PRINTF(("NLE\n"));
|
|
break;
|
|
default:
|
|
; // will never occur
|
|
|
|
}
|
|
break;
|
|
case OP_SQRTPS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_SQRTPS\n"));
|
|
break;
|
|
case OP_SQRTSS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_SQRTSS\n"));
|
|
break;
|
|
case OP_ADDPD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_ADDPD\n"));
|
|
break;
|
|
case OP_ADDSD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_ADDSD\n"));
|
|
break;
|
|
case OP_SUBPD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_SUBPD\n"));
|
|
break;
|
|
case OP_SUBSD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_SUBSD\n"));
|
|
break;
|
|
case OP_MULPD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_MULPD\n"));
|
|
break;
|
|
case OP_MULSD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_MULSD\n"));
|
|
break;
|
|
case OP_DIVPD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_DIVPD\n"));
|
|
break;
|
|
case OP_DIVSD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_DIVSD\n"));
|
|
break;
|
|
case OP_SQRTPD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_SQRTPD\n"));
|
|
break;
|
|
case OP_SQRTSD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_SQRTSD\n"));
|
|
break;
|
|
case OP_MAXPD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_MAXPD\n"));
|
|
break;
|
|
case OP_MAXSD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_MAXSD\n"));
|
|
break;
|
|
case OP_MINPD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_MINPD\n"));
|
|
break;
|
|
case OP_MINSD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_MINSD\n"));
|
|
break;
|
|
case OP_COMISD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_COMISD\n"));
|
|
break;
|
|
case OP_UCOMISD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_UCOMISD\n"));
|
|
break;
|
|
case OP_CVTPD2PI:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTPD2PI\n"));
|
|
break;
|
|
case OP_CVTSD2SI:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTSD2SI\n"));
|
|
break;
|
|
case OP_CVTTPD2PI:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTTPD2PI\n"));
|
|
break;
|
|
case OP_CVTTSD2SI:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTTSD2SI\n"));
|
|
break;
|
|
case OP_CVTPS2PD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTPS2PD\n"));
|
|
break;
|
|
case OP_CVTSS2SD:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTSS2SD\n"));
|
|
break;
|
|
case OP_CVTPD2PS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTPD2PS\n"));
|
|
break;
|
|
case OP_CVTSD2SS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTSD2SS\n"));
|
|
break;
|
|
case OP_CVTDQ2PS:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTDQ2PS\n"));
|
|
break;
|
|
case OP_CVTTPS2DQ:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTTPS2DQ\n"));
|
|
break;
|
|
case OP_CVTPS2DQ:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTPS2DQ\n"));
|
|
break;
|
|
case OP_CVTPD2DQ:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTPD2DQ\n"));
|
|
break;
|
|
case OP_CVTTPD2DQ:
|
|
PRINTF(("XmmiEnv->Ieee->Operation = OP_CVTTPD2DQ\n"));
|
|
break;
|
|
|
|
default:
|
|
PRINTF(("XmmiEnv->Ieee->Operation %d = UNKNOWN\n",
|
|
XmmiEnv->Ieee->Operation));
|
|
}
|
|
}
|
|
|
|
void
|
|
print_Operand1(PXMMI_ENV XmmiEnv) {
|
|
|
|
PRINTF(("XmmiEnv->Ieee->Operand1.OperandValid = %x\n",
|
|
XmmiEnv->Ieee->Operand1.OperandValid));
|
|
|
|
if (!XmmiEnv->Ieee->Operand1.OperandValid) return;
|
|
|
|
if (XmmiEnv->Ieee->Operand1.Format == _FpFormatFp32) {
|
|
PRINTF(("XmmiEnv->Ieee->Operand1.Format = _FpFormatFp32\n"));
|
|
PRINTF(("XmmiEnv->Ieee->Operand1.Value.Fp32Value = %f = %x\n",
|
|
(float)XmmiEnv->Ieee->Operand1.Value.Fp32Value,
|
|
XmmiEnv->Ieee->Operand1.Value.U32Value));
|
|
} else if (XmmiEnv->Ieee->Operand1.Format == _FpFormatU32) {
|
|
PRINTF(("XmmiEnv->Ieee->Operand1.Format = _FpFormatU32\n"));
|
|
PRINTF(("XmmiEnv->Ieee->Operand1.Value.U32Value = %d = %x\n",
|
|
XmmiEnv->Ieee->Operand1.Value.U32Value,
|
|
XmmiEnv->Ieee->Operand1.Value.U32Value));
|
|
} else if (XmmiEnv->Ieee->Operand1.Format == _FpFormatI32) {
|
|
PRINTF(("XmmiEnv->Ieee->Operand1.Format = _FpFormatI32\n"));
|
|
PRINTF(("XmmiEnv->Ieee->Operand1.Value.I32Value = %d = %x\n",
|
|
XmmiEnv->Ieee->Operand1.Value.I32Value,
|
|
XmmiEnv->Ieee->Operand1.Value.U32Value));
|
|
} else if (XmmiEnv->Ieee->Operand1.Format == _FpFormatFp64) {
|
|
PRINTF(("XmmiEnv->Ieee->Operand1.Format = _FpFormatFp64\n"));
|
|
PRINTF(("XmmiEnv->Ieee->Operand1.Value.Fp64Value = %e = %I64x\n",
|
|
(double)XmmiEnv->Ieee->Operand1.Value.Fp64Value,
|
|
XmmiEnv->Ieee->Operand1.Value.U64Value));
|
|
} else {
|
|
PRINTF(("XmmiEnv->Ieee->Operand1.Format = INCORRECT\n"));
|
|
}
|
|
|
|
}
|
|
|
|
void
|
|
print_Operand2(PXMMI_ENV XmmiEnv) {
|
|
|
|
PRINTF(("XmmiEnv->Ieee->Operand2.OperandValid = %x\n",
|
|
XmmiEnv->Ieee->Operand2.OperandValid));
|
|
|
|
if (!XmmiEnv->Ieee->Operand2.OperandValid) return;
|
|
|
|
if (XmmiEnv->Ieee->Operand2.Format == _FpFormatFp32) {
|
|
PRINTF(("XmmiEnv->Ieee->Operand2.Format = _FpFormatFp32\n"));
|
|
PRINTF(("XmmiEnv->Ieee->Operand2.Value.Fp32Value = %f = %x\n",
|
|
(float)XmmiEnv->Ieee->Operand2.Value.Fp32Value,
|
|
XmmiEnv->Ieee->Operand2.Value.U32Value));
|
|
} else if (XmmiEnv->Ieee->Operand2.Format == _FpFormatU32) {
|
|
PRINTF(("XmmiEnv->Ieee->Operand2.Format = _FpFormatU32\n"));
|
|
PRINTF(("XmmiEnv->Ieee->Operand2.Value.U32Value = %d = %x\n",
|
|
XmmiEnv->Ieee->Operand2.Value.U32Value,
|
|
XmmiEnv->Ieee->Operand2.Value.U32Value));
|
|
} else if (XmmiEnv->Ieee->Operand2.Format == _FpFormatI32) {
|
|
PRINTF(("XmmiEnv->Ieee->Operand2.Format = _FpFormatI32\n"));
|
|
PRINTF(("XmmiEnv->Ieee->Operand2.Value.I32Value = %d = %x\n",
|
|
XmmiEnv->Ieee->Operand2.Value.I32Value,
|
|
XmmiEnv->Ieee->Operand2.Value.U32Value));
|
|
} else if (XmmiEnv->Ieee->Operand2.Format == _FpFormatFp64) {
|
|
PRINTF(("XmmiEnv->Ieee->Operand2.Format = _FpFormatFp64\n"));
|
|
PRINTF(("XmmiEnv->Ieee->Operand2.Value.Fp64Value = %e = %I64x\n",
|
|
(double)XmmiEnv->Ieee->Operand2.Value.Fp64Value,
|
|
XmmiEnv->Ieee->Operand2.Value.U64Value));
|
|
} else {
|
|
PRINTF(("XmmiEnv->Ieee->Operand2.Format = INCORRECT\n"));
|
|
}
|
|
|
|
}
|
|
|
|
void
|
|
print_Result(PXMMI_ENV XmmiEnv, BOOL Exception) {
|
|
|
|
PRINTF(("XmmiEnv->Ieee->Result.OperandValid = %x\n",
|
|
XmmiEnv->Ieee->Result.OperandValid));
|
|
|
|
if (XmmiEnv->Ieee->Result.OperandValid) {
|
|
if (XmmiEnv->Ieee->Result.Format == _FpFormatFp32) {
|
|
PRINTF(("XmmiEnv->Ieee->Result.Format = _FpFormatFp32\n"));
|
|
PRINTF(("XmmiEnv->Ieee->Result.Value.Fp32Value = %f = %x\n",
|
|
(float)XmmiEnv->Ieee->Result.Value.Fp32Value,
|
|
XmmiEnv->Ieee->Result.Value.U32Value));
|
|
} else if (XmmiEnv->Ieee->Result.Format == _FpFormatU32) {
|
|
PRINTF(("XmmiEnv->Ieee->Result.Format = _FpFormatU32\n"));
|
|
PRINTF(("XmmiEnv->Ieee->Result.Value.U32Value = %d = %x\n",
|
|
XmmiEnv->Ieee->Result.Value.U32Value,
|
|
XmmiEnv->Ieee->Result.Value.U32Value));
|
|
} else if (XmmiEnv->Ieee->Result.Format == _FpFormatI32) {
|
|
PRINTF(("XmmiEnv->Ieee->Result.Format = _FpFormatI32\n"));
|
|
PRINTF(("XmmiEnv->Ieee->Result.Value.I32Value = %d = %x\n",
|
|
XmmiEnv->Ieee->Result.Value.I32Value,
|
|
XmmiEnv->Ieee->Result.Value.U32Value));
|
|
} else if (XmmiEnv->Ieee->Result.Format == _FpFormatFp64) {
|
|
PRINTF(("XmmiEnv->Ieee->Result.Format = _FpFormatFp64\n"));
|
|
PRINTF(("XmmiEnv->Ieee->Result.Value.Fp64Value = %e = %I64x\n",
|
|
(double)XmmiEnv->Ieee->Result.Value.Fp64Value,
|
|
XmmiEnv->Ieee->Result.Value.U64Value));
|
|
} else {
|
|
PRINTF(("XmmiEnv->Ieee->Result.Format = INCORRECT\n"));
|
|
}
|
|
}
|
|
|
|
if (!Exception) {
|
|
if (XmmiEnv->Ieee->Operation == _FpCodeCompare) {
|
|
PRINTF(("XmmiEnv->EFlags = %x\n", XmmiEnv->EFlags));
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void print_FPIEEE_RECORD_EXCEPTION (PXMMI_ENV XmmiEnv) {
|
|
|
|
// print the FP IEEE record info
|
|
PRINTF(("\nPRINTING FPIEEE_RECORD INFO (EXCEPTION):\n"));
|
|
|
|
PRINTF(("XmmiEnv->Masks = %x\n", XmmiEnv->Masks));
|
|
PRINTF(("XmmiEnv->Flags = %x\n", XmmiEnv->Flags));
|
|
PRINTF(("XmmiEnv->Fz = %x\n", XmmiEnv->Fz));
|
|
PRINTF(("XmmiEnv->Daz = %x\n", XmmiEnv->Daz));
|
|
|
|
print_Rounding(XmmiEnv);
|
|
print_Precision(XmmiEnv);
|
|
print_CauseEnable(XmmiEnv);
|
|
print_Status(XmmiEnv);
|
|
print_Result(XmmiEnv, TRUE);
|
|
|
|
PRINTF(("\n"));
|
|
|
|
}
|
|
|
|
|
|
void print_FPIEEE_RECORD_NO_EXCEPTION (PXMMI_ENV XmmiEnv) {
|
|
|
|
// print the FP IEEE record result info
|
|
PRINTF(("\nPRINTING FPIEEE_RECORD INFO (NO EXCEPTION):\n"));
|
|
|
|
PRINTF(("XmmiEnv->Masks = %x\n", XmmiEnv->Masks));
|
|
PRINTF(("XmmiEnv->Flags = %x\n", XmmiEnv->Flags));
|
|
PRINTF(("XmmiEnv->Fz = %x\n", XmmiEnv->Fz));
|
|
PRINTF(("XmmiEnv->Daz = %x\n", XmmiEnv->Daz));
|
|
|
|
print_Rounding(XmmiEnv);
|
|
print_Precision(XmmiEnv);
|
|
print_Status(XmmiEnv);
|
|
print_Result(XmmiEnv, FALSE);
|
|
|
|
PRINTF(("\n"));
|
|
|
|
}
|
|
|
|
void print_FPIEEE_RECORD (PXMMI_ENV XmmiEnv) {
|
|
|
|
|
|
// print input values
|
|
PRINTF(("XmmiEnv->Masks = %x\n", XmmiEnv->Masks));
|
|
PRINTF(("XmmiEnv->Flags = %x\n", XmmiEnv->Flags));
|
|
PRINTF(("XmmiEnv->Fz = %x\n", XmmiEnv->Fz));
|
|
PRINTF(("XmmiEnv->Daz = %x\n", XmmiEnv->Daz));
|
|
|
|
if (XmmiEnv->Rc == _FpRoundNearest) {
|
|
PRINTF(("XmmiEnv->Rc = _FpRoundNearest\n"));
|
|
} else {
|
|
if (XmmiEnv->Rc == _FpRoundMinusInfinity) {
|
|
PRINTF(("XmmiEnv->Rc = _FpRoundMinusInfinity\n"));
|
|
} else {
|
|
if (XmmiEnv->Rc == _FpRoundPlusInfinity) {
|
|
PRINTF(("XmmiEnv->Rc = _FpRoundPlusInfinity\n"));
|
|
} else {
|
|
if (XmmiEnv->Rc == _FpRoundChopped) {
|
|
PRINTF(("XmmiEnv->Rc = _FpRoundChopped\n"));
|
|
} else {
|
|
PRINTF(("XmmiEnv->Rc = UNKNOWN\n"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (XmmiEnv->Precision == _FpPrecision24) {
|
|
PRINTF(("XmmiEnv->Precision = _FpPrecision24\n"));
|
|
} else {
|
|
if (XmmiEnv->Precision == _FpPrecision53) {
|
|
PRINTF(("XmmiEnv->Precision = _FpPrecision53\n"));
|
|
} else {
|
|
if (XmmiEnv->Precision == _FpPrecisionFull) {
|
|
PRINTF(("XmmiEnv->Precision = _FpPrecisionFull\n"));
|
|
} else {
|
|
PRINTF(("XmmiEnv->Precision = INCORRECT\n"));
|
|
}
|
|
}
|
|
}
|
|
|
|
print_Operations(XmmiEnv);
|
|
print_Operand1(XmmiEnv);
|
|
print_Operand2(XmmiEnv);
|
|
|
|
}
|
|
|
|
|
|
void
|
|
dump_DataXMMI2(PTEMP_EXCEPTION_POINTERS p)
|
|
{
|
|
|
|
PEXCEPTION_RECORD exc;
|
|
PTEMP_CONTEXT pctxt;
|
|
PFLOATING_EXTENDED_SAVE_AREA pExtendedArea;
|
|
PXMMI_AREA XmmiArea;
|
|
PX87_AREA X87Area;
|
|
PXMMI128 xmmi128;
|
|
PXMMI128 reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7;
|
|
PMMX64 mmx0, mmx1, mmx2, mmx3, mmx4, mmx5, mmx6, mmx7;
|
|
ULONG i;
|
|
|
|
exc = p->ExceptionRecord;
|
|
pctxt = p->ContextRecord;
|
|
pExtendedArea = (PFLOATING_EXTENDED_SAVE_AREA) &pctxt->ExtendedRegisters[0];
|
|
XmmiArea = (PXMMI_AREA) &pExtendedArea->XMMIRegisterArea[0];
|
|
X87Area = (PX87_AREA) &pExtendedArea->X87RegisterArea[0];
|
|
|
|
reg0 = (PXMMI128) &XmmiArea->Xmmi[0];
|
|
reg1 = (PXMMI128) &XmmiArea->Xmmi[1];
|
|
reg2 = (PXMMI128) &XmmiArea->Xmmi[2];
|
|
reg3 = (PXMMI128) &XmmiArea->Xmmi[3];
|
|
reg4 = (PXMMI128) &XmmiArea->Xmmi[4];
|
|
reg5 = (PXMMI128) &XmmiArea->Xmmi[5];
|
|
reg6 = (PXMMI128) &XmmiArea->Xmmi[6];
|
|
reg7 = (PXMMI128) &XmmiArea->Xmmi[7];
|
|
|
|
mmx0 = (PMMX64) &X87Area->Mm[0].Mmx;
|
|
mmx1 = (PMMX64) &X87Area->Mm[1].Mmx;
|
|
mmx2 = (PMMX64) &X87Area->Mm[2].Mmx;
|
|
mmx3 = (PMMX64) &X87Area->Mm[3].Mmx;
|
|
mmx4 = (PMMX64) &X87Area->Mm[4].Mmx;
|
|
mmx5 = (PMMX64) &X87Area->Mm[5].Mmx;
|
|
mmx6 = (PMMX64) &X87Area->Mm[6].Mmx;
|
|
mmx7 = (PMMX64) &X87Area->Mm[7].Mmx;
|
|
|
|
xmmi128 = (PXMMI128) pExtendedArea->DataOffset;
|
|
|
|
PRINTF(("Dump Saved Area:\n"));
|
|
PRINTF(("Registers: Edi 0x%x Esi 0x%x Ebx 0x%x, Edx 0x%x, Ecx 0x%x, Eax 0x%x, Ebp 0x%x\n",
|
|
pctxt->Edi, pctxt->Esi, pctxt->Ebx, pctxt->Edx,
|
|
pctxt->Ecx, pctxt->Eax, pctxt->Ebp));
|
|
|
|
PRINTF(("pExtendedArea->DataOffset\n"));
|
|
DUMP_HEXLL(xmmi128, 2);
|
|
DUMP_DS(xmmi128, 2);
|
|
|
|
PRINTF(("mmx reg0:\n"));
|
|
DUMP_HEXL(mmx0, 2);
|
|
|
|
PRINTF(("mmx reg1:\n"));
|
|
DUMP_HEXL(mmx1, 2);
|
|
|
|
PRINTF(("mmx reg2:\n"));
|
|
DUMP_HEXL(mmx2, 2);
|
|
|
|
PRINTF(("mmx reg3:\n"));
|
|
DUMP_HEXL(mmx3, 2);
|
|
|
|
PRINTF(("mmx reg4:\n"));
|
|
DUMP_HEXL(mmx4, 2);
|
|
|
|
PRINTF(("mmx reg5:\n"));
|
|
DUMP_HEXL(mmx5, 2);
|
|
|
|
PRINTF(("mmx reg6:\n"));
|
|
DUMP_HEXL(mmx6, 2);
|
|
|
|
PRINTF(("mmx reg7:\n"));
|
|
DUMP_HEXL(mmx7, 2);
|
|
|
|
PRINTF(("xmmi reg0: (+0, -0)\n"));
|
|
DUMP_HEXLL(reg0, 2);
|
|
DUMP_DS(reg0, 2);
|
|
|
|
PRINTF(("xmmi reg1: (+1.5*2^1022, +denormalized finite)\n"));
|
|
DUMP_HEXLL(reg1, 2);
|
|
DUMP_DS(reg1, 2);
|
|
|
|
PRINTF(("xmmi reg2: (-denormalized finite, +normalized finite)\n"));
|
|
DUMP_HEXLL(reg2, 2);
|
|
DUMP_DS(reg2, 2);
|
|
|
|
PRINTF(("xmmi reg3: (-normalized finite, +infinites)\n"));
|
|
DUMP_HEXLL(reg3, 2);
|
|
DUMP_DS(reg3, 2);
|
|
|
|
PRINTF(("xmmi reg4: (-infinity, +1.1111110...011*2^-1022)\n"));
|
|
DUMP_HEXLL(reg4, 2);
|
|
DUMP_DS(reg4, 2);
|
|
|
|
PRINTF(("xmmi reg5: (SNan, SNan)\n"));
|
|
DUMP_HEXLL(reg5, 2);
|
|
DUMP_DS(reg5, 2);
|
|
|
|
PRINTF(("xmmi reg6: (QNan, QNan)\n"));
|
|
DUMP_HEXLL(reg6, 2);
|
|
DUMP_DS(reg6, 2);
|
|
|
|
PRINTF(("xmmi reg7: (+1.375*2^1022, +1.11111110...01 * 2^-1022)\n"));
|
|
DUMP_HEXLL(reg7, 2);
|
|
DUMP_DS(reg7, 2);
|
|
|
|
}
|
|
|
|
void
|
|
dump_Data(PTEMP_EXCEPTION_POINTERS p)
|
|
{
|
|
|
|
PEXCEPTION_RECORD exc;
|
|
PTEMP_CONTEXT pctxt;
|
|
PFLOATING_EXTENDED_SAVE_AREA pExtendedArea;
|
|
PXMMI_AREA XmmiArea;
|
|
PX87_AREA X87Area;
|
|
PXMMI128 xmmi128;
|
|
PXMMI128 reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7;
|
|
PMMX64 mmx0, mmx1, mmx2, mmx3, mmx4, mmx5, mmx6, mmx7;
|
|
ULONG i;
|
|
|
|
exc = p->ExceptionRecord;
|
|
pctxt = p->ContextRecord;
|
|
pExtendedArea = (PFLOATING_EXTENDED_SAVE_AREA) &pctxt->ExtendedRegisters[0];
|
|
XmmiArea = (PXMMI_AREA) &pExtendedArea->XMMIRegisterArea[0];
|
|
X87Area = (PX87_AREA) &pExtendedArea->X87RegisterArea[0];
|
|
|
|
reg0 = (PXMMI128) &XmmiArea->Xmmi[0];
|
|
reg1 = (PXMMI128) &XmmiArea->Xmmi[1];
|
|
reg2 = (PXMMI128) &XmmiArea->Xmmi[2];
|
|
reg3 = (PXMMI128) &XmmiArea->Xmmi[3];
|
|
reg4 = (PXMMI128) &XmmiArea->Xmmi[4];
|
|
reg5 = (PXMMI128) &XmmiArea->Xmmi[5];
|
|
reg6 = (PXMMI128) &XmmiArea->Xmmi[6];
|
|
reg7 = (PXMMI128) &XmmiArea->Xmmi[7];
|
|
|
|
mmx0 = (PMMX64) &X87Area->Mm[0].Mmx;
|
|
mmx1 = (PMMX64) &X87Area->Mm[1].Mmx;
|
|
mmx2 = (PMMX64) &X87Area->Mm[2].Mmx;
|
|
mmx3 = (PMMX64) &X87Area->Mm[3].Mmx;
|
|
mmx4 = (PMMX64) &X87Area->Mm[4].Mmx;
|
|
mmx5 = (PMMX64) &X87Area->Mm[5].Mmx;
|
|
mmx6 = (PMMX64) &X87Area->Mm[6].Mmx;
|
|
mmx7 = (PMMX64) &X87Area->Mm[7].Mmx;
|
|
|
|
xmmi128 = (PXMMI128) pExtendedArea->DataOffset;
|
|
|
|
PRINTF(("Dump Saved Area:\n"));
|
|
PRINTF(("Registers: Edi 0x%x Esi 0x%x Ebx 0x%x, Edx 0x%x, Ecx 0x%x, Eax 0x%x, Ebp 0x%x\n",
|
|
pctxt->Edi, pctxt->Esi, pctxt->Ebx, pctxt->Edx,
|
|
pctxt->Ecx, pctxt->Eax, pctxt->Ebp));
|
|
|
|
PRINTF(("pExtendedArea->DataOffset\n"));
|
|
DUMP_HEXL(xmmi128, 4);
|
|
DUMP_FS(xmmi128, 4);
|
|
|
|
PRINTF(("mmx reg0:\n"));
|
|
DUMP_HEXL(mmx0, 2);
|
|
|
|
PRINTF(("mmx reg1:\n"));
|
|
DUMP_HEXL(mmx1, 2);
|
|
|
|
PRINTF(("mmx reg2:\n"));
|
|
DUMP_HEXL(mmx2, 2);
|
|
|
|
PRINTF(("mmx reg3:\n"));
|
|
DUMP_HEXL(mmx3, 2);
|
|
|
|
PRINTF(("mmx reg4:\n"));
|
|
DUMP_HEXL(mmx4, 2);
|
|
|
|
PRINTF(("mmx reg5:\n"));
|
|
DUMP_HEXL(mmx5, 2);
|
|
|
|
PRINTF(("mmx reg6:\n"));
|
|
DUMP_HEXL(mmx6, 2);
|
|
|
|
PRINTF(("mmx reg7:\n"));
|
|
DUMP_HEXL(mmx7, 2);
|
|
|
|
PRINTF(("xmmi reg0: (n, n, n, n)\n"));
|
|
DUMP_HEXL(reg0, 4);
|
|
DUMP_FS(reg0, 4);
|
|
|
|
PRINTF(("xmmi reg1: (+0, -0, +denormalized finite, n)\n"));
|
|
DUMP_HEXL(reg1, 4);
|
|
DUMP_FS(reg1, 4);
|
|
|
|
PRINTF(("xmmi reg2: (-denormalized finite, +normalized finite, -normalized finite, n)\n"));
|
|
DUMP_HEXL(reg2, 4);
|
|
DUMP_FS(reg2, 4);
|
|
|
|
PRINTF(("xmmi reg3: (+infinites, -infinites, n, 1000003)\n"));
|
|
DUMP_HEXL(reg3, 4);
|
|
DUMP_FS(reg3, 4);
|
|
|
|
PRINTF(("xmmi reg4: (n, n, n, n)\n"));
|
|
DUMP_HEXL(reg4, 4);
|
|
DUMP_FS(reg4, 4);
|
|
|
|
PRINTF(("xmmi reg5: (SNan, SNan, n, n)\n"));
|
|
DUMP_HEXL(reg5, 4);
|
|
DUMP_FS(reg5, 4);
|
|
|
|
PRINTF(("xmmi reg6: (QNan, QNan, 7ec00000, n)\n"));
|
|
DUMP_HEXL(reg6, 4);
|
|
DUMP_FS(reg6, 4);
|
|
|
|
PRINTF(("xmmi reg7: (n, n, 7eb00000, 100004)\n"));
|
|
DUMP_HEXL(reg7, 4);
|
|
DUMP_FS(reg7, 4);
|
|
|
|
}
|
|
|
|
void
|
|
dump_OpLocation(POPERAND Operand) {
|
|
|
|
if (!Operand->Op.OperandValid) {
|
|
PRINTF(("Operand Invalid\n"))
|
|
return;
|
|
}
|
|
|
|
switch (Operand->OpLocation) {
|
|
case ST0:
|
|
PRINTF(("OpLocation = ST0 "));
|
|
break;
|
|
case ST1:
|
|
PRINTF(("OpLocation = ST1 "));
|
|
break;
|
|
case ST2:
|
|
PRINTF(("OpLocation = ST2 "));
|
|
break;
|
|
case ST3:
|
|
PRINTF(("OpLocation = ST3 "));
|
|
break;
|
|
case ST4:
|
|
PRINTF(("OpLocation = ST4 "));
|
|
break;
|
|
case ST5:
|
|
PRINTF(("OpLocation = ST5 "));
|
|
break;
|
|
case ST6:
|
|
PRINTF(("OpLocation = ST6 "));
|
|
break;
|
|
case ST7:
|
|
PRINTF(("OpLocation = ST7 "));
|
|
break;
|
|
case REG:
|
|
PRINTF(("OpLocation = REG "));
|
|
PRINTF(("OpReg %x", Operand->OpReg));
|
|
break;
|
|
case RS:
|
|
PRINTF(("OpLocation = RS "));
|
|
break;
|
|
case M16I:
|
|
PRINTF(("OpLocation = M16I "));
|
|
break;
|
|
case M32I:
|
|
PRINTF(("OpLocation = M32I "));
|
|
break;
|
|
case M64I:
|
|
PRINTF(("OpLocation = M64I "));
|
|
break;
|
|
case M32R:
|
|
PRINTF(("OpLocation = M32R "));
|
|
break;
|
|
case M64R:
|
|
PRINTF(("OpLocation = M64R "));
|
|
break;
|
|
case M80R:
|
|
PRINTF(("OpLocation = M80R "));
|
|
break;
|
|
case M80D:
|
|
PRINTF(("OpLocation = M80D "));
|
|
break;
|
|
case Z80R:
|
|
PRINTF(("OpLocation = Z80R "));
|
|
break;
|
|
case M128_M32R:
|
|
PRINTF(("OpLocation = M128_M32R "));
|
|
break;
|
|
case M128_M64R:
|
|
PRINTF(("OpLocation = M128_M64R "));
|
|
break;
|
|
case MMX:
|
|
PRINTF(("OpLocation = MMX "));
|
|
PRINTF(("OpReg %x", Operand->OpReg));
|
|
break;
|
|
case XMMI:
|
|
PRINTF(("OpLocation = XMMI "));
|
|
PRINTF(("OpReg %x", Operand->OpReg));
|
|
break;
|
|
case XMMI2:
|
|
PRINTF(("OpLocation = XMMI2 "));
|
|
PRINTF(("OpReg %x", Operand->OpReg));
|
|
break;
|
|
case IMM8:
|
|
PRINTF(("OpLocation = IMM8 "));
|
|
break;
|
|
case M64R_64:
|
|
PRINTF(("OpLocation = M64R_64 "));
|
|
break;
|
|
case M128_M32I:
|
|
PRINTF(("OpLocation = M128_M32I "));
|
|
break;
|
|
case XMMI_M32I:
|
|
PRINTF(("OpLocation = XMMI_M32I "));
|
|
PRINTF(("OpReg %x", Operand->OpReg));
|
|
break;
|
|
case LOOKUP:
|
|
PRINTF(("OpLocation = LOOKUP "));
|
|
break;
|
|
case INV:
|
|
PRINTF(("OpLocation = INV "));
|
|
break;
|
|
default:
|
|
PRINTF(("?"));
|
|
}
|
|
|
|
PRINTF(("\n"));
|
|
|
|
}
|
|
|
|
void
|
|
dump_XmmiFpEnv(
|
|
PXMMI_FP_ENV XmmiFpEnv) {
|
|
|
|
POPERAND Operand;
|
|
XMMI_ENV XmmiEnv;
|
|
_FPIEEE_RECORD ieee;
|
|
|
|
XmmiEnv.Ieee = &ieee;
|
|
XmmiEnv.Ieee->Operation = XmmiFpEnv->OriginalOperation;
|
|
XmmiEnv.Imm8 = XmmiFpEnv->Imm8;
|
|
print_Operations(&XmmiEnv);
|
|
|
|
Operand = &XmmiFpEnv->Operand1;
|
|
PRINTF(("Operand1: "));
|
|
dump_OpLocation(Operand);
|
|
|
|
Operand = &XmmiFpEnv->Operand2;
|
|
PRINTF(("Operand2: "));
|
|
dump_OpLocation(Operand);
|
|
|
|
}
|
|
|
|
void
|
|
dump_Control(PTEMP_EXCEPTION_POINTERS p) {
|
|
|
|
PEXCEPTION_RECORD exc;
|
|
PTEMP_CONTEXT pctxt;
|
|
PFLOATING_EXTENDED_SAVE_AREA pExtendedArea;
|
|
PULONG istream;
|
|
|
|
exc = p->ExceptionRecord;
|
|
pctxt = p->ContextRecord;
|
|
pExtendedArea = (PFLOATING_EXTENDED_SAVE_AREA) &pctxt->ExtendedRegisters[0];
|
|
istream = (PULONG) pctxt->Eip;
|
|
|
|
PRINTF(("EIP %x ExceptionRecord %x ContextRecord %x ExtendedArea %x\n",
|
|
istream, exc, pctxt, pExtendedArea));
|
|
PRINTF(("MXCsr: %x, CW: %x\n", pExtendedArea->MXCsr, pExtendedArea->ControlWord));
|
|
|
|
}
|
|
|
|
void
|
|
dump_Format(_FPIEEE_VALUE *Operand) {
|
|
|
|
_U64 u64;
|
|
_I64 i64;
|
|
_FP80 fp80;
|
|
_FP128 fp128;
|
|
ULONG i;
|
|
|
|
if (!Operand->OperandValid) {
|
|
PRINTF(("Operand Invalid\n"));
|
|
}
|
|
|
|
PRINTF(("Format/Value: "));
|
|
switch (Operand->Format) {
|
|
case _FpFormatFp32:
|
|
PRINTF(("_FpFormatFp32 %f", Operand->Value.Fp32Value));
|
|
PRINTF((" = (hex) %x\n", Operand->Value.U32Value));
|
|
break;
|
|
case _FpFormatFp64:
|
|
PRINTF(("_FpFormatFp64 %e\n", Operand->Value.Fp64Value));
|
|
for (i=0; i < 3; i++) {
|
|
PRINTF((" = (hex) %x\n", Operand->Value.U64Value.W[i]));
|
|
}
|
|
break;
|
|
case _FpFormatFp80:
|
|
fp80 = Operand->Value.Fp80Value;
|
|
PRINTF(("_FpFormatFp80 (hex)"));
|
|
for (i=0; i < 5; i++) {
|
|
PRINTF((" %x", fp80.W[i]));
|
|
}
|
|
break;
|
|
case _FpFormatFp128:
|
|
fp128 = Operand->Value.Fp128Value;
|
|
PRINTF(("_FpFormatFp128 (hex)"));
|
|
for (i=0; i < 4; i++) {
|
|
PRINTF((" %x", fp128.W[i]));
|
|
}
|
|
break;
|
|
case _FpFormatI16:
|
|
PRINTF(("_FpFormatI16 %d\n", Operand->Value.I16Value));
|
|
break;
|
|
case _FpFormatI32:
|
|
PRINTF(("_FpFormatI32 %d", Operand->Value.I32Value));
|
|
PRINTF((" = (hex) %x\n", Operand->Value.U32Value));
|
|
break;
|
|
case _FpFormatI64:
|
|
i64 = Operand->Value.I64Value;
|
|
PRINTF(("_FpFormatI64 (hex)"));
|
|
for (i=0; i < 2; i++) {
|
|
PRINTF((" %x", i64.W[i]));
|
|
}
|
|
break;
|
|
case _FpFormatU16:
|
|
PRINTF(("_FpFormatU16 h%u\n", Operand->Value.U16Value));
|
|
break;
|
|
case _FpFormatU32:
|
|
PRINTF(("_FpFormatU32 l%u\n", Operand->Value.U32Value));
|
|
PRINTF((" = (hex) %x\n", Operand->Value.U32Value));
|
|
break;
|
|
case _FpFormatU64:
|
|
u64 = Operand->Value.U64Value;
|
|
PRINTF(("_FpFormatU64 (hex)"));
|
|
for (i=0; i < 2; i++) {
|
|
PRINTF((" %x", u64.W[i]));
|
|
}
|
|
break;
|
|
case _FpFormatCompare:
|
|
PRINTF(("_FpFormatCompare %x\n", Operand->Value.CompareValue));
|
|
break;
|
|
case _FpFormatString:
|
|
PRINTF(("_FpFormatString %s\n", Operand->Value.StringValue));
|
|
break;
|
|
|
|
default:
|
|
PRINTF(("?"));
|
|
break;
|
|
|
|
}
|
|
|
|
PRINTF(("\n"));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
void
|
|
dump_fpieee_record(_FPIEEE_RECORD *pieee) {
|
|
|
|
XMMI_ENV XmmiEnv;
|
|
|
|
XmmiEnv.Ieee = pieee;
|
|
PRINTF(("OPERATION: 0x%x\n", pieee->Operation));
|
|
|
|
print_Rounding(&XmmiEnv);
|
|
print_Precision(&XmmiEnv);
|
|
print_CauseEnable(&XmmiEnv);
|
|
print_Status(&XmmiEnv);
|
|
|
|
PRINTF(("Operand 1:\n"));
|
|
dump_Format(&pieee->Operand1);
|
|
PRINTF(("Operand 2: \n"));
|
|
dump_Format(&pieee->Operand2);
|
|
|
|
PRINTF(("Result:"));
|
|
dump_Format(&pieee->Result);
|
|
|
|
}
|
|
|
|
void
|
|
print_FPIEEE_RECORD_EXCEPTION1 (PXMMI_ENV XmmiEnv, ULONG res1, ULONG res0, ULONG flags) {
|
|
|
|
// print the FP IEEE record info
|
|
PRINTF(("\nPRINTING FPIEEE_RECORD INFO (EXCEPTION):\n"));
|
|
|
|
if (res1 != XmmiEnv->Ieee->Result.Value.U64Value.W[1] ||
|
|
res0 != XmmiEnv->Ieee->Result.Value.U64Value.W[0])
|
|
PRINTF (("ERROR: expected res = %8.8x %8.8x got res = %8.8x %8.8x\n",
|
|
res1, res0, XmmiEnv->Ieee->Result.Value.U64Value.W[1],
|
|
XmmiEnv->Ieee->Result.Value.U64Value.W[0]));
|
|
|
|
if (flags != XmmiEnv->Flags)
|
|
PRINTF (("ERROR: expected flags = %x got flags = %x\n",
|
|
flags, XmmiEnv->Flags));
|
|
|
|
PRINTF(("XmmiEnv->Masks = %x\n", XmmiEnv->Masks));
|
|
PRINTF(("XmmiEnv->Flags = %x\n", XmmiEnv->Flags));
|
|
PRINTF(("XmmiEnv->Fz = %x\n", XmmiEnv->Fz));
|
|
PRINTF(("XmmiEnv->Daz = %x\n", XmmiEnv->Daz));
|
|
|
|
print_Rounding(XmmiEnv);
|
|
print_Precision(XmmiEnv);
|
|
print_CauseEnable(XmmiEnv);
|
|
print_Status(XmmiEnv);
|
|
print_Result(XmmiEnv, TRUE);
|
|
|
|
PRINTF(("\n"));
|
|
|
|
}
|
|
|
|
void
|
|
print_FPIEEE_RECORD_EXCEPTION2 (PXMMI_ENV XmmiEnv, ULONG res, ULONG flags) {
|
|
|
|
// print the FP IEEE record info
|
|
PRINTF(("\nPRINTING FPIEEE_RECORD INFO (EXCEPTION):\n"));
|
|
|
|
if (res != XmmiEnv->Ieee->Result.Value.U32Value)
|
|
printf ("ERROR: expected res = %x got res = %f = %8.8x\n",
|
|
res, XmmiEnv->Ieee->Result.Value.Fp32Value,
|
|
XmmiEnv->Ieee->Result.Value.U32Value);
|
|
|
|
if (flags != XmmiEnv->Flags)
|
|
printf ("ERROR: expected flags = %x got flags = %x\n",
|
|
flags, XmmiEnv->Flags);
|
|
|
|
PRINTF(("XmmiEnv->Masks = %x\n", XmmiEnv->Masks));
|
|
PRINTF(("XmmiEnv->Flags = %x\n", XmmiEnv->Flags));
|
|
PRINTF(("XmmiEnv->Fz = %x\n", XmmiEnv->Fz));
|
|
PRINTF(("XmmiEnv->Daz = %x\n", XmmiEnv->Daz));
|
|
|
|
print_Rounding(XmmiEnv);
|
|
print_Precision(XmmiEnv);
|
|
print_CauseEnable(XmmiEnv);
|
|
print_Status(XmmiEnv);
|
|
print_Result(XmmiEnv, TRUE);
|
|
|
|
PRINTF(("\n"));
|
|
|
|
}
|
|
|
|
void
|
|
print_FPIEEE_RECORD_EXCEPTION3 (PXMMI_ENV XmmiEnv, ULONG eflags, ULONG flags) {
|
|
|
|
// print the FP IEEE record info
|
|
PRINTF(("\nPRINTING FPIEEE_RECORD INFO (EXCEPTION):\n"));
|
|
|
|
if (eflags != XmmiEnv->EFlags)
|
|
printf ("ERROR: expected eflags = %x got eflags = %x\n",
|
|
eflags, XmmiEnv->EFlags);
|
|
|
|
if (flags != XmmiEnv->Flags)
|
|
printf ("ERROR: expected flags = %x got flags = %x\n",
|
|
flags, XmmiEnv->Flags);
|
|
|
|
PRINTF(("XmmiEnv->Masks = %x\n", XmmiEnv->Masks));
|
|
PRINTF(("XmmiEnv->Flags = %x\n", XmmiEnv->Flags));
|
|
PRINTF(("XmmiEnv->Fz = %x\n", XmmiEnv->Fz));
|
|
PRINTF(("XmmiEnv->Daz = %x\n", XmmiEnv->Daz));
|
|
|
|
print_Rounding(XmmiEnv);
|
|
print_Precision(XmmiEnv);
|
|
print_CauseEnable(XmmiEnv);
|
|
print_Status(XmmiEnv);
|
|
|
|
PRINTF(("\n"));
|
|
|
|
}
|
|
|
|
void
|
|
print_FPIEEE_RECORD_NO_EXCEPTION1 (PXMMI_ENV XmmiEnv, ULONG res1, ULONG res0, ULONG flags) {
|
|
|
|
// print the FP IEEE record result info
|
|
PRINTF(("\nPRINTING FPIEEE_RECORD INFO (NO EXCEPTION):\n"));
|
|
|
|
if (res1 != XmmiEnv->Ieee->Result.Value.U64Value.W[1] ||
|
|
res0 != XmmiEnv->Ieee->Result.Value.U64Value.W[0])
|
|
PRINTF (("ERROR: expected res = %8.8x %8.8x got res = %8.8x %8.8x\n",
|
|
res1, res0, XmmiEnv->Ieee->Result.Value.U64Value.W[1],
|
|
XmmiEnv->Ieee->Result.Value.U64Value.W[0]));
|
|
|
|
if (flags != XmmiEnv->Flags)
|
|
PRINTF (("ERROR: expected flags = %x got flags = %x\n",
|
|
flags, XmmiEnv->Flags));
|
|
|
|
PRINTF(("XmmiEnv->Masks = %x\n", XmmiEnv->Masks));
|
|
PRINTF(("XmmiEnv->Flags = %x\n", XmmiEnv->Flags));
|
|
PRINTF(("XmmiEnv->Fz = %x\n", XmmiEnv->Fz));
|
|
PRINTF(("XmmiEnv->Daz = %x\n", XmmiEnv->Daz));
|
|
|
|
print_Rounding(XmmiEnv);
|
|
print_Precision(XmmiEnv);
|
|
print_Status(XmmiEnv);
|
|
print_Result(XmmiEnv, FALSE);
|
|
|
|
PRINTF(("\n"));
|
|
|
|
}
|
|
|
|
void
|
|
print_FPIEEE_RECORD_NO_EXCEPTION2 (PXMMI_ENV XmmiEnv, ULONG res, ULONG flags) {
|
|
|
|
// print the FP IEEE record result info
|
|
PRINTF(("\nPRINTING FPIEEE_RECORD INFO (NO EXCEPTION):\n"));
|
|
|
|
if (res != XmmiEnv->Ieee->Result.Value.U32Value)
|
|
printf ("ERROR: expected res = %x got res = %f = %8.8x\n",
|
|
res, XmmiEnv->Ieee->Result.Value.Fp32Value,
|
|
XmmiEnv->Ieee->Result.Value.U32Value);
|
|
|
|
if (flags != XmmiEnv->Flags)
|
|
printf ("ERROR: expected flags = %x got flags = %x\n",
|
|
flags, XmmiEnv->Flags);
|
|
|
|
PRINTF(("XmmiEnv->Masks = %x\n", XmmiEnv->Masks));
|
|
PRINTF(("XmmiEnv->Flags = %x\n", XmmiEnv->Flags));
|
|
PRINTF(("XmmiEnv->Fz = %x\n", XmmiEnv->Fz));
|
|
PRINTF(("XmmiEnv->Daz = %x\n", XmmiEnv->Daz));
|
|
|
|
print_Rounding(XmmiEnv);
|
|
print_Precision(XmmiEnv);
|
|
print_Status(XmmiEnv);
|
|
print_Result(XmmiEnv, FALSE);
|
|
|
|
PRINTF(("\n"));
|
|
|
|
}
|
|
|
|
|
|
void
|
|
print_FPIEEE_RECORD_NO_EXCEPTION3 (PXMMI_ENV XmmiEnv, ULONG eflags, ULONG flags)
|
|
{
|
|
|
|
// print the FP IEEE record result info
|
|
PRINTF(("\nPRINTING FPIEEE_RECORD INFO (NO EXCEPTION):\n"));
|
|
|
|
if (eflags != XmmiEnv->EFlags)
|
|
printf ("ERROR: expected eflags = %x got eflags = %x\n",
|
|
eflags, XmmiEnv->EFlags);
|
|
|
|
if (flags != XmmiEnv->Flags)
|
|
printf ("ERROR: expected flags = %x got flags = %x\n",
|
|
flags, XmmiEnv->Flags);
|
|
|
|
PRINTF(("XmmiEnv->Masks = %x\n", XmmiEnv->Masks));
|
|
PRINTF(("XmmiEnv->Flags = %x\n", XmmiEnv->Flags));
|
|
PRINTF(("XmmiEnv->Fz = %x\n", XmmiEnv->Fz));
|
|
PRINTF(("XmmiEnv->Daz = %x\n", XmmiEnv->Daz));
|
|
|
|
print_Rounding(XmmiEnv);
|
|
print_Precision(XmmiEnv);
|
|
print_Status(XmmiEnv);
|
|
print_Result(XmmiEnv, FALSE);
|
|
|
|
PRINTF(("\n"));
|
|
|
|
}
|
|
|