mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2167 lines
62 KiB
2167 lines
62 KiB
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
flpt2.c
|
|
|
|
Abstract:
|
|
|
|
This module implements user mode IEEE floating point tests.
|
|
|
|
Author:
|
|
|
|
David N. Cutler (davec) 1-Jul-1991
|
|
|
|
Environment:
|
|
|
|
User mode only.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "flpt.h"
|
|
|
|
VOID
|
|
Test20 (
|
|
VOID
|
|
)
|
|
|
|
{
|
|
|
|
ULONG Count;
|
|
FLOATING_STATUS Fsr;
|
|
ULARGE_INTEGER DoubleOperand;
|
|
ULARGE_INTEGER DoubleResult;
|
|
ULONG Subtest;
|
|
|
|
//
|
|
// Test 20 - Absolute, move, and negate double test.
|
|
//
|
|
|
|
Subtest = 0;
|
|
printf(" Test 20 - absolute, move, and negate double ...");
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0x80000;
|
|
Fsr.Data = AbsoluteDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != 0x80000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = SIGN | 0x80000;
|
|
Fsr.Data = AbsoluteDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != 0x80000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_QUIET_NAN;
|
|
Fsr.Data = AbsoluteDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
Fsr.Data = AbsoluteDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
|
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
try {
|
|
Fsr.Data = AbsoluteDouble(EV | ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0x80000;
|
|
Fsr.Data = MoveDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != 0x80000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = SIGN | 0x80000;
|
|
Fsr.Data = MoveDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != (SIGN | 0x80000))) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_QUIET_NAN;
|
|
Fsr.Data = MoveDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
Fsr.Data = MoveDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_SIGNAL_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
Fsr.Data = MoveDouble(EV | ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != (EV | ROUND_TO_NEAREST)) ||
|
|
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_SIGNAL_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0x80000;
|
|
Fsr.Data = NegateDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != (SIGN | 0x80000))) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = SIGN | 0x80000;
|
|
Fsr.Data = NegateDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != 0x80000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_QUIET_NAN;
|
|
Fsr.Data = NegateDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
Fsr.Data = NegateDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
|
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
try {
|
|
Fsr.Data = NegateDouble(EV | ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
//
|
|
// End of test 20.
|
|
//
|
|
|
|
printf("succeeded\n");
|
|
return;
|
|
|
|
//
|
|
// Test 20 failed.
|
|
//
|
|
|
|
TestFailed:
|
|
printf(" subtest %d failed, fsr = %lx, result = %lx, %lx\n",
|
|
Subtest,
|
|
Fsr.Data,
|
|
DoubleResult.LowPart,
|
|
DoubleResult.HighPart);
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
Test21 (
|
|
VOID
|
|
)
|
|
|
|
{
|
|
|
|
ULONG Count;
|
|
FLOATING_STATUS Fsr;
|
|
ULARGE_INTEGER DoubleOperand;
|
|
ULONG SingleResult;
|
|
ULONG Subtest;
|
|
|
|
//
|
|
// Test 21 - Convert to single.
|
|
//
|
|
|
|
Subtest = 0;
|
|
printf(" Test 21 - convert to single ...");
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_QUIET_NAN;
|
|
Fsr.Data = ConvertToSingleFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(SingleResult != SINGLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
Fsr.Data = ConvertToSingleFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
|
(SingleResult != SINGLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
|
Fsr.Data = ConvertToSingleFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
|
DoubleOperand.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
|
Fsr.Data = ConvertToSingleFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
try {
|
|
Fsr.Data = ConvertToSingleFromDouble(EV | ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart =
|
|
((DOUBLE_EXPONENT_BIAS - SINGLE_EXPONENT_BIAS) << (52 - 32)) | 0xfffff;
|
|
Fsr.Data = ConvertToSingleFromDouble(ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_ZERO) ||
|
|
(SingleResult != 0x7ffffc)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = SIGN |
|
|
((DOUBLE_EXPONENT_BIAS - SINGLE_EXPONENT_BIAS) << (52 - 32)) | 0xfffff;
|
|
Fsr.Data = ConvertToSingleFromDouble(ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_ZERO) ||
|
|
(SingleResult != (SIGN | 0x7ffffc))) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0xf0000000;
|
|
DoubleOperand.HighPart =
|
|
((DOUBLE_EXPONENT_BIAS - SINGLE_EXPONENT_BIAS) << (52 - 32)) | 0xfffff;
|
|
Fsr.Data = ConvertToSingleFromDouble(ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != (SI | SU | ROUND_TO_ZERO)) ||
|
|
(SingleResult != 0x7fffff)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0xf0000000;
|
|
DoubleOperand.HighPart = SIGN |
|
|
((DOUBLE_EXPONENT_BIAS - SINGLE_EXPONENT_BIAS) << (52 - 32)) | 0xfffff;
|
|
Fsr.Data = ConvertToSingleFromDouble(ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != (SI | SU | ROUND_TO_ZERO)) ||
|
|
(SingleResult != (SIGN | 0x7fffff))) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = 0xf0000000;
|
|
DoubleOperand.HighPart = SIGN |
|
|
((DOUBLE_EXPONENT_BIAS - SINGLE_EXPONENT_BIAS) << (52 - 32)) | 0xfffff;
|
|
try {
|
|
Fsr.Data = ConvertToSingleFromDouble(EU | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_UNDERFLOW) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = 0xf0000000;
|
|
DoubleOperand.HighPart = SIGN |
|
|
((DOUBLE_EXPONENT_BIAS - SINGLE_EXPONENT_BIAS) << (52 - 32)) | 0xfffff;
|
|
try {
|
|
Fsr.Data = ConvertToSingleFromDouble(EI | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0xfffff;
|
|
Fsr.Data = ConvertToSingleFromDouble(ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != (SI | SU | ROUND_TO_ZERO)) ||
|
|
(SingleResult != 0x0)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = SIGN | 0xfffff;
|
|
Fsr.Data = ConvertToSingleFromDouble(ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != (SI | SU | ROUND_TO_ZERO)) ||
|
|
(SingleResult != (SIGN | 0x0))) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0xfffff;
|
|
try {
|
|
Fsr.Data = ConvertToSingleFromDouble(EU | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_UNDERFLOW) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0xfffff;
|
|
try {
|
|
Fsr.Data = ConvertToSingleFromDouble(EI | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = ((DOUBLE_EXPONENT_BIAS +
|
|
SINGLE_EXPONENT_BIAS + 1) << (52 - 32)) | 0xfffff;
|
|
Fsr.Data = ConvertToSingleFromDouble(ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != (SI | SO | XI | XO | ROUND_TO_ZERO)) ||
|
|
(SingleResult != SINGLE_MAXIMUM_VALUE)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = SIGN | ((DOUBLE_EXPONENT_BIAS +
|
|
SINGLE_EXPONENT_BIAS + 1) << (52 - 32)) | 0xfffff;
|
|
Fsr.Data = ConvertToSingleFromDouble(ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != (SI | SO | XI | XO | ROUND_TO_ZERO)) ||
|
|
(SingleResult != (SIGN | SINGLE_MAXIMUM_VALUE))) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = ((DOUBLE_EXPONENT_BIAS +
|
|
SINGLE_EXPONENT_BIAS + 1) << (52 - 32)) | 0xfffff;
|
|
try {
|
|
Fsr.Data = ConvertToSingleFromDouble(EO | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = ((DOUBLE_EXPONENT_BIAS +
|
|
SINGLE_EXPONENT_BIAS + 1) << (52 - 32)) | 0xfffff;
|
|
try {
|
|
Fsr.Data = ConvertToSingleFromDouble(EI | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&SingleResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
//
|
|
// End of test 21.
|
|
//
|
|
|
|
printf("succeeded\n");
|
|
return;
|
|
|
|
//
|
|
// Test 21 failed.
|
|
//
|
|
|
|
TestFailed:
|
|
printf(" subtest %d failed, fsr = %lx, result = %lx\n",
|
|
Subtest,
|
|
Fsr.Data,
|
|
SingleResult);
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
Test22 (
|
|
VOID
|
|
)
|
|
|
|
{
|
|
|
|
ULONG Count;
|
|
FLOATING_STATUS Fsr;
|
|
ULARGE_INTEGER DoubleResult;
|
|
ULONG SingleOperand;
|
|
ULONG Subtest;
|
|
|
|
//
|
|
// Test 22 - Convert to double.
|
|
//
|
|
|
|
Subtest = 0;
|
|
printf(" Test 22 - convert to double ...");
|
|
Subtest += 1;
|
|
SingleOperand = SINGLE_QUIET_NAN;
|
|
Fsr.Data = ConvertToDoubleFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = SINGLE_SIGNAL_NAN;
|
|
Fsr.Data = ConvertToDoubleFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
|
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = SINGLE_INFINITY_VALUE;
|
|
Fsr.Data = ConvertToDoubleFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = MINUS_SINGLE_INFINITY_VALUE;
|
|
Fsr.Data = ConvertToDoubleFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
|
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
SingleOperand = SINGLE_SIGNAL_NAN;
|
|
try {
|
|
Fsr.Data = ConvertToDoubleFromSingle(EV | ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&DoubleResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = 0x400000;
|
|
Fsr.Data = ConvertToDoubleFromSingle(ROUND_TO_ZERO,
|
|
SingleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_ZERO) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != 0x38000000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = SIGN | 0x400000;
|
|
Fsr.Data = ConvertToDoubleFromSingle(ROUND_TO_ZERO,
|
|
SingleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_ZERO) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != (SIGN | 0x38000000))) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = 0x440000;
|
|
Fsr.Data = ConvertToDoubleFromSingle(ROUND_TO_ZERO,
|
|
SingleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_ZERO) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != 0x38010000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = SIGN | 0x440000;
|
|
Fsr.Data = ConvertToDoubleFromSingle(ROUND_TO_ZERO,
|
|
SingleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_ZERO) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != (SIGN | 0x38010000))) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
//
|
|
// End of test 22.
|
|
//
|
|
|
|
printf("succeeded\n");
|
|
return;
|
|
|
|
//
|
|
// Test 22 failed.
|
|
//
|
|
|
|
TestFailed:
|
|
printf(" subtest %d failed, fsr = %lx, result = %lx, %lx\n",
|
|
Subtest,
|
|
Fsr.Data,
|
|
DoubleResult.LowPart,
|
|
DoubleResult.HighPart);
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
Test23 (
|
|
VOID
|
|
)
|
|
|
|
{
|
|
|
|
ULONG Count;
|
|
FLOATING_STATUS Fsr;
|
|
ULONG LongwordResult;
|
|
ULONG SingleOperand;
|
|
ULONG Subtest;
|
|
|
|
//
|
|
// Test 23 - Convert to longword from single.
|
|
//
|
|
|
|
Subtest = 0;
|
|
printf(" Test 23 - convert to longword from single ...");
|
|
Subtest += 1;
|
|
SingleOperand = SINGLE_QUIET_NAN;
|
|
Fsr.Data = ConvertToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = SINGLE_SIGNAL_NAN;
|
|
Fsr.Data = ConvertToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = SINGLE_INFINITY_VALUE;
|
|
Fsr.Data = ConvertToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x7fffffff)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = MINUS_SINGLE_INFINITY_VALUE;
|
|
Fsr.Data = ConvertToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x80000000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
SingleOperand = SINGLE_QUIET_NAN;
|
|
try {
|
|
Fsr.Data = ConvertToLongwordFromSingle(EV | ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
SingleOperand = SINGLE_SIGNAL_NAN;
|
|
try {
|
|
Fsr.Data = ConvertToLongwordFromSingle(EV | ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
SingleOperand = SINGLE_INFINITY_VALUE;
|
|
try {
|
|
Fsr.Data = ConvertToLongwordFromSingle(EV | ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
SingleOperand = MINUS_SINGLE_INFINITY_VALUE;
|
|
try {
|
|
Fsr.Data = ConvertToLongwordFromSingle(EV | ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = 0x400000;
|
|
Fsr.Data = ConvertToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x0)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = 0x1;
|
|
Fsr.Data = ConvertToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x0)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
SingleOperand = 0x400000;
|
|
try {
|
|
Fsr.Data = ConvertToLongwordFromSingle(EI | ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = ((SINGLE_EXPONENT_BIAS + 32) << 23);
|
|
Fsr.Data = ConvertToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = ((SINGLE_EXPONENT_BIAS + 31) << 23);
|
|
Fsr.Data = ConvertToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = SIGN | ((SINGLE_EXPONENT_BIAS + 31) << 23);
|
|
Fsr.Data = ConvertToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(LongwordResult != 0x80000000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = SIGN | ((SINGLE_EXPONENT_BIAS + 31) << 23) | 0x1;
|
|
Fsr.Data = ConvertToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
SingleOperand = ((SINGLE_EXPONENT_BIAS + 31) << 23);
|
|
try {
|
|
Fsr.Data = ConvertToLongwordFromSingle(EV | ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = SINGLE_QUIET_NAN;
|
|
Fsr.Data = RoundToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = SINGLE_SIGNAL_NAN;
|
|
Fsr.Data = RoundToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = SINGLE_INFINITY_VALUE;
|
|
Fsr.Data = RoundToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x7fffffff)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = MINUS_SINGLE_INFINITY_VALUE;
|
|
Fsr.Data = RoundToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x80000000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
SingleOperand = SINGLE_QUIET_NAN;
|
|
try {
|
|
Fsr.Data = RoundToLongwordFromSingle(EV | ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
SingleOperand = SINGLE_SIGNAL_NAN;
|
|
try {
|
|
Fsr.Data = RoundToLongwordFromSingle(EV | ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
SingleOperand = SINGLE_INFINITY_VALUE;
|
|
try {
|
|
Fsr.Data = RoundToLongwordFromSingle(EV | ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
SingleOperand = MINUS_SINGLE_INFINITY_VALUE;
|
|
try {
|
|
Fsr.Data = RoundToLongwordFromSingle(EV | ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = 0x400000;
|
|
Fsr.Data = RoundToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x0)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = 0x1;
|
|
Fsr.Data = RoundToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x0)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
SingleOperand = 0x400000;
|
|
try {
|
|
Fsr.Data = RoundToLongwordFromSingle(EI | ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = ((SINGLE_EXPONENT_BIAS + 32) << 23);
|
|
Fsr.Data = RoundToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = ((SINGLE_EXPONENT_BIAS + 31) << 23);
|
|
Fsr.Data = RoundToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = SIGN | ((SINGLE_EXPONENT_BIAS + 31) << 23);
|
|
Fsr.Data = RoundToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(LongwordResult != 0x80000000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
SingleOperand = SIGN | ((SINGLE_EXPONENT_BIAS + 31) << 23) | 0x1;
|
|
Fsr.Data = RoundToLongwordFromSingle(ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
SingleOperand = ((SINGLE_EXPONENT_BIAS + 31) << 23);
|
|
try {
|
|
Fsr.Data = RoundToLongwordFromSingle(EV | ROUND_TO_NEAREST,
|
|
SingleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
//
|
|
// End of test 23.
|
|
//
|
|
|
|
printf("succeeded\n");
|
|
return;
|
|
|
|
//
|
|
// Test 23 failed.
|
|
//
|
|
|
|
TestFailed:
|
|
printf(" subtest %d failed, fsr = %lx, result = %lx\n",
|
|
Subtest,
|
|
Fsr.Data,
|
|
LongwordResult);
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
Test24 (
|
|
VOID
|
|
)
|
|
|
|
{
|
|
|
|
ULONG Count;
|
|
FLOATING_STATUS Fsr;
|
|
ULARGE_INTEGER DoubleOperand;
|
|
ULONG LongwordResult;
|
|
ULONG Subtest;
|
|
|
|
//
|
|
// Test 24 - Convert to longword from double.
|
|
//
|
|
|
|
Subtest = 0;
|
|
printf(" Test 24 - convert to longword from double ...");
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_QUIET_NAN;
|
|
Fsr.Data = ConvertToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
Fsr.Data = ConvertToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
|
Fsr.Data = ConvertToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x7fffffff)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
|
DoubleOperand.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
|
Fsr.Data = ConvertToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x80000000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_QUIET_NAN;
|
|
Fsr.Data = RoundToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
Fsr.Data = RoundToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
|
Fsr.Data = RoundToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x7fffffff)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
|
DoubleOperand.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
|
Fsr.Data = RoundToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x80000000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_QUIET_NAN;
|
|
try {
|
|
Fsr.Data = ConvertToLongwordFromDouble(EV | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
try {
|
|
Fsr.Data = ConvertToLongwordFromDouble(EV | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
|
try {
|
|
Fsr.Data = ConvertToLongwordFromDouble(EV | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
|
DoubleOperand.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
|
try {
|
|
Fsr.Data = ConvertToLongwordFromDouble(EV | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_QUIET_NAN;
|
|
try {
|
|
Fsr.Data = TruncateToLongwordFromDouble(EV | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
try {
|
|
Fsr.Data = TruncateToLongwordFromDouble(EV | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
|
try {
|
|
Fsr.Data = TruncateToLongwordFromDouble(EV | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
|
DoubleOperand.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
|
try {
|
|
Fsr.Data = TruncateToLongwordFromDouble(EV | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0x80000;
|
|
Fsr.Data = ConvertToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x0)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x1;
|
|
DoubleOperand.HighPart = 0x0;
|
|
Fsr.Data = ConvertToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x0)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0x80000;
|
|
Fsr.Data = RoundToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x0)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x1;
|
|
DoubleOperand.HighPart = 0x0;
|
|
Fsr.Data = RoundToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != 0x0)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0x80000;
|
|
try {
|
|
Fsr.Data = ConvertToLongwordFromDouble(EI | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0x80000;
|
|
try {
|
|
Fsr.Data = TruncateToLongwordFromDouble(EI | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = ((DOUBLE_EXPONENT_BIAS + 32) << 20);
|
|
Fsr.Data = ConvertToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = ((DOUBLE_EXPONENT_BIAS + 31) << 20);
|
|
Fsr.Data = ConvertToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = SIGN | ((DOUBLE_EXPONENT_BIAS + 31) << 20);
|
|
Fsr.Data = ConvertToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(LongwordResult != 0x80000000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = SIGN | ((DOUBLE_EXPONENT_BIAS + 31) << 20) | 0x1;
|
|
Fsr.Data = ConvertToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = ((DOUBLE_EXPONENT_BIAS + 32) << 20);
|
|
Fsr.Data = RoundToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = ((DOUBLE_EXPONENT_BIAS + 31) << 20);
|
|
Fsr.Data = RoundToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = SIGN | ((DOUBLE_EXPONENT_BIAS + 31) << 20);
|
|
Fsr.Data = RoundToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(LongwordResult != 0x80000000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = SIGN | ((DOUBLE_EXPONENT_BIAS + 31) << 20) | 0x1;
|
|
Fsr.Data = RoundToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = SIGN | ((DOUBLE_EXPONENT_BIAS + 31) << 20) | 0x1;
|
|
try {
|
|
Fsr.Data = ConvertToLongwordFromDouble(EV | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = SIGN | ((DOUBLE_EXPONENT_BIAS + 31) << 20) | 0x1;
|
|
try {
|
|
Fsr.Data = TruncateToLongwordFromDouble(EV | ROUND_TO_ZERO,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0xfff00000;
|
|
DoubleOperand.HighPart = ((DOUBLE_EXPONENT_BIAS + 30) << 20) | 0xfffff;
|
|
Fsr.Data = ConvertToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = 0xfff00000;
|
|
DoubleOperand.HighPart = ((DOUBLE_EXPONENT_BIAS + 30) << 20) | 0xfffff;
|
|
try {
|
|
Fsr.Data = ConvertToLongwordFromDouble(EV | ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0xfff00000;
|
|
DoubleOperand.HighPart = ((DOUBLE_EXPONENT_BIAS + 30) << 20) | 0xfffff;
|
|
Fsr.Data = RoundToLongwordFromDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
|
(LongwordResult != INTEGER_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = 0xfff00000;
|
|
DoubleOperand.HighPart = ((DOUBLE_EXPONENT_BIAS + 30) << 20) | 0xfffff;
|
|
try {
|
|
Fsr.Data = RoundToLongwordFromDouble(EV | ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&LongwordResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
//
|
|
// End of test 24.
|
|
//
|
|
|
|
printf("succeeded\n");
|
|
return;
|
|
|
|
//
|
|
// Test 24 failed.
|
|
//
|
|
|
|
TestFailed:
|
|
printf(" subtest %d failed, fsr = %lx, result = %lx\n",
|
|
Subtest,
|
|
Fsr.Data,
|
|
LongwordResult);
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
Test25 (
|
|
VOID
|
|
)
|
|
|
|
{
|
|
|
|
ULONG Count;
|
|
FLOATING_STATUS Fsr;
|
|
ULARGE_INTEGER DoubleOperand;
|
|
ULARGE_INTEGER DoubleResult;
|
|
ULONG Subtest;
|
|
|
|
//
|
|
// Test 25 - Square root double test.
|
|
//
|
|
|
|
Subtest = 0;
|
|
printf(" Test 25 - square root double ...");
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_QUIET_NAN;
|
|
Fsr.Data = SquareRootDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
Fsr.Data = SquareRootDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
|
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
DoubleOperand.LowPart = DOUBLE_NAN_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_SIGNAL_NAN;
|
|
try {
|
|
Fsr.Data = SquareRootDouble(EV | ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
|
DoubleOperand.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
|
Fsr.Data = SquareRootDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
|
DoubleOperand.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
|
Fsr.Data = SquareRootDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
|
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
|
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
// Subtest += 1;
|
|
// Count = 0;
|
|
// DoubleOperand.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
|
// DoubleOperand.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
|
// try {
|
|
// Fsr.Data = SquareRootDouble(EV | ROUND_TO_NEAREST,
|
|
// &DoubleOperand,
|
|
// &DoubleResult);
|
|
//
|
|
// } except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
// EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
// Count += 1;
|
|
// }
|
|
//
|
|
// if (Count == 0) {
|
|
// goto TestFailed;
|
|
// }
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0;
|
|
DoubleOperand.HighPart = 0;
|
|
Fsr.Data = SquareRootDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != 0) ||
|
|
(DoubleResult.HighPart != 0)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0;
|
|
DoubleOperand.HighPart = 0 | SIGN;
|
|
Fsr.Data = SquareRootDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != 0) ||
|
|
(DoubleResult.HighPart != (0 | SIGN))) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
// ****** //
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0x40000;
|
|
Fsr.Data = SquareRootDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != 0x80000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0x10000;
|
|
Fsr.Data = SquareRootDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != 0x40000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0x4000;
|
|
Fsr.Data = SquareRootDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != 0x20000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0x1000;
|
|
Fsr.Data = SquareRootDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(DoubleResult.LowPart != 0x0) ||
|
|
(DoubleResult.HighPart != 0x10000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
DoubleOperand.LowPart = 0x0;
|
|
DoubleOperand.HighPart = 0x80000;
|
|
Fsr.Data = SquareRootDouble(ROUND_TO_NEAREST,
|
|
&DoubleOperand,
|
|
&DoubleResult);
|
|
|
|
if ((Fsr.Data != (SU | SI | ROUND_TO_NEAREST)) ||
|
|
(DoubleResult.LowPart != 0x333f9de6) ||
|
|
(DoubleResult.HighPart != 0xb504f)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
// ****** //
|
|
|
|
//
|
|
// End of test 25.
|
|
//
|
|
|
|
printf("succeeded\n");
|
|
return;
|
|
|
|
//
|
|
// Test 25 failed.
|
|
//
|
|
|
|
TestFailed:
|
|
printf(" subtest %d failed, fsr = %lx, result = %lx, %lx\n",
|
|
Subtest,
|
|
Fsr.Data,
|
|
DoubleResult.LowPart,
|
|
DoubleResult.HighPart);
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
Test26 (
|
|
VOID
|
|
)
|
|
|
|
{
|
|
|
|
ULONG Count;
|
|
FLOATING_STATUS Fsr;
|
|
ULONG Subtest;
|
|
ULONG SingleResult;
|
|
|
|
//
|
|
// Test 26 - Square root single test.
|
|
//
|
|
|
|
Subtest = 0;
|
|
printf(" Test 26 - square root single ...");
|
|
Subtest += 1;
|
|
Fsr.Data = SquareRootSingle(ROUND_TO_NEAREST,
|
|
SINGLE_QUIET_NAN,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(SingleResult != SINGLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Fsr.Data = SquareRootSingle(ROUND_TO_NEAREST,
|
|
SINGLE_SIGNAL_NAN,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
|
(SingleResult != SINGLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Count = 0;
|
|
try {
|
|
Fsr.Data = SquareRootSingle(EV | ROUND_TO_NEAREST,
|
|
SINGLE_SIGNAL_NAN,
|
|
&SingleResult);
|
|
|
|
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
Count += 1;
|
|
}
|
|
|
|
if (Count == 0) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Fsr.Data = SquareRootSingle(ROUND_TO_NEAREST,
|
|
SINGLE_INFINITY_VALUE,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Fsr.Data = SquareRootSingle(ROUND_TO_NEAREST,
|
|
MINUS_SINGLE_INFINITY_VALUE,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
|
(SingleResult != SINGLE_QUIET_NAN)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
// Subtest += 1;
|
|
// Count = 0;
|
|
// try {
|
|
// Fsr.Data = SquareRootSingle(EV | ROUND_TO_NEAREST,
|
|
// MINUS_SINGLE_INFINITY_VALUE,
|
|
// &SingleResult);
|
|
//
|
|
// } except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
|
// EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
|
// Count += 1;
|
|
// }
|
|
//
|
|
// if (Count == 0) {
|
|
// goto TestFailed;
|
|
// }
|
|
|
|
Subtest += 1;
|
|
Fsr.Data = SquareRootSingle(ROUND_TO_NEAREST,
|
|
0,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(SingleResult != 0)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Fsr.Data = SquareRootSingle(ROUND_TO_NEAREST,
|
|
0 | SIGN,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(SingleResult != (0 | SIGN))) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
// ****** //
|
|
|
|
Subtest += 1;
|
|
Fsr.Data = SquareRootSingle(ROUND_TO_NEAREST,
|
|
0x200000,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(SingleResult != 0x400000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Fsr.Data = SquareRootSingle(ROUND_TO_NEAREST,
|
|
0x80000,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(SingleResult != 0x200000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Fsr.Data = SquareRootSingle(ROUND_TO_NEAREST,
|
|
0x20000,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(SingleResult != 0x100000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Fsr.Data = SquareRootSingle(ROUND_TO_NEAREST,
|
|
0x8000,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
|
(SingleResult != 0x80000)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
Subtest += 1;
|
|
Fsr.Data = SquareRootSingle(ROUND_TO_NEAREST,
|
|
0x400000,
|
|
&SingleResult);
|
|
|
|
if ((Fsr.Data != (SU | SI | ROUND_TO_NEAREST)) ||
|
|
(SingleResult != 0x5a8279)) {
|
|
goto TestFailed;
|
|
}
|
|
|
|
// ****** //
|
|
|
|
//
|
|
// End of test 26.
|
|
//
|
|
|
|
printf("succeeded\n");
|
|
return;
|
|
|
|
//
|
|
// Test 26 failed.
|
|
//
|
|
|
|
TestFailed:
|
|
printf(" subtest %d failed, fsr = %lx, result = %lx\n",
|
|
Subtest,
|
|
Fsr.Data,
|
|
SingleResult);
|
|
|
|
return;
|
|
}
|