8334 lines
241 KiB
C
8334 lines
241 KiB
C
/*++
|
||
|
||
Copyright (c) 1991 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
flpt.c
|
||
|
||
Abstract:
|
||
|
||
This module implements user mode IEEE floating point tests.
|
||
|
||
Author:
|
||
|
||
David N. Cutler (davec) 20-Jun-1991
|
||
|
||
Environment:
|
||
|
||
User mode only.
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "flpt.h"
|
||
|
||
VOID
|
||
main(
|
||
int argc,
|
||
char *argv[]
|
||
)
|
||
|
||
{
|
||
//
|
||
// Anounce start of floting point tests.
|
||
//
|
||
|
||
printf("\nStart of floating point test\n");
|
||
Test1();
|
||
Test2();
|
||
Test3();
|
||
Test4();
|
||
Test5();
|
||
Test6();
|
||
Test7();
|
||
Test8();
|
||
Test9();
|
||
Test10();
|
||
Test11();
|
||
Test12();
|
||
Test13();
|
||
Test14();
|
||
Test15();
|
||
Test16();
|
||
Test17();
|
||
Test18();
|
||
Test19();
|
||
Test20();
|
||
Test21();
|
||
Test22();
|
||
Test23();
|
||
Test24();
|
||
Test25();
|
||
Test26();
|
||
|
||
//
|
||
// Announce end of floating point test.
|
||
//
|
||
|
||
printf("End of floating point test\n");
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test1 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG SingleResult;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 1 - Add single denormalized test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 1 - add/subtract single denormalized ...");
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x3ff,
|
||
0x1,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x400)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x1,
|
||
0x7fff,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x8000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SIGN | 0x440000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != (SIGN | 0x40000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
0x440000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x40000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SIGN | 0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != (SIGN | 0x0))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x800000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x800000,
|
||
0x7fffff,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0xffffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddSingle(EI | ROUND_TO_NEAREST,
|
||
0x800000,
|
||
0x3f800000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddSingle(EO | ROUND_TO_NEAREST,
|
||
0x7f000000,
|
||
0x7f000000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddSingle(EI | ROUND_TO_NEAREST,
|
||
0x7f000000,
|
||
0x7f000000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddSingle(EI | EO | ROUND_TO_NEAREST,
|
||
0x7f000000,
|
||
0x7f000000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = SubtractSingle(ROUND_TO_NEAREST,
|
||
0x3ff,
|
||
SIGN | 0x1,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x400)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = SubtractSingle(ROUND_TO_NEAREST,
|
||
0x1,
|
||
SIGN | 0x7fff,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x8000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = SubtractSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x440000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != (SIGN | 0x40000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = SubtractSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
SIGN | 0x440000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x40000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = SubtractSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = SubtractSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
SIGN | 0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != (SIGN | 0x0))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = SubtractSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SIGN | 0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x800000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = SubtractSingle(ROUND_TO_NEAREST,
|
||
0x800000,
|
||
SIGN | 0x7fffff,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0xffffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = SubtractSingle(EI | ROUND_TO_NEAREST,
|
||
0x800000,
|
||
SIGN | 0x3f800000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = SubtractSingle(EO | ROUND_TO_NEAREST,
|
||
0x7f000000,
|
||
SIGN | 0x7f000000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = SubtractSingle(EI | ROUND_TO_NEAREST,
|
||
0x7f000000,
|
||
SIGN | 0x7f000000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = SubtractSingle(EI | EO | ROUND_TO_NEAREST,
|
||
0x7f000000,
|
||
SIGN | 0x7f000000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 1.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 1 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
SingleResult);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test2 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG SingleResult;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 2 - Add single round to nearest test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 2 - add single round to nearest ...");
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x1800000,
|
||
0x7ffff8,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x19ffffe)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x1800000,
|
||
0x7ffff9,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != 0x19ffffe)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x1800000,
|
||
0x7ffffa,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != 0x19ffffe)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x1800000,
|
||
0x7ffffb,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x1800000,
|
||
0x7ffffc,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x1800000,
|
||
0x7ffffd,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x1800000,
|
||
0x7ffffe,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != 0x1a00000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x1800000,
|
||
0x7fffff,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != 0x1a00000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Count = 0;
|
||
try {
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(EI | ROUND_TO_NEAREST,
|
||
0x1800000,
|
||
0x7fffff,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 2.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 2 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
SingleResult);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test3 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG SingleResult;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 3 - Add single round to zero test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 3 - add single round to zero ...");
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_ZERO,
|
||
0x1800000,
|
||
0x7ffff8,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_ZERO) ||
|
||
(SingleResult != 0x19ffffe)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_ZERO,
|
||
0x1800000,
|
||
0x7ffff9,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_ZERO)) ||
|
||
(SingleResult != 0x19ffffe)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_ZERO,
|
||
0x1800000,
|
||
0x7ffffa,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_ZERO)) ||
|
||
(SingleResult != 0x19ffffe)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_ZERO,
|
||
0x1800000,
|
||
0x7ffffb,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_ZERO)) ||
|
||
(SingleResult != 0x19ffffe)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_ZERO,
|
||
0x1800000,
|
||
0x7ffffc,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_ZERO) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_ZERO,
|
||
0x1800000,
|
||
0x7ffffd,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_ZERO)) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_ZERO,
|
||
0x1800000,
|
||
0x7ffffe,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_ZERO)) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_ZERO,
|
||
0x1800000,
|
||
0x7fffff,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_ZERO)) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Count = 0;
|
||
try {
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(EI | ROUND_TO_ZERO,
|
||
0x1800000,
|
||
0x7fffff,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 3.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 3 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
SingleResult);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test4 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG SingleResult;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 4 - Add single round to positive infinity test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 4 - add single round to positive infinity ...");
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffff8,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_PLUS_INFINITY) ||
|
||
(SingleResult != 0x19ffffe)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffff9,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffffa,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffffb,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffffc,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_PLUS_INFINITY) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffffd,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != 0x1a00000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffffe,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != 0x1a00000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
0x1800000,
|
||
0x7fffff,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != 0x1a00000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Count = 0;
|
||
try {
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(EI | ROUND_TO_PLUS_INFINITY,
|
||
0x1800000,
|
||
0x7fffff,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffff8,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_PLUS_INFINITY) ||
|
||
(SingleResult != (SIGN | 0x19ffffe))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffff9,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | 0x19ffffe))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffffa,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | 0x19ffffe))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffffb,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | 0x19ffffe))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffffc,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_PLUS_INFINITY) ||
|
||
(SingleResult != (SIGN | 0x19fffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffffd,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | 0x19fffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffffe,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | 0x19fffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_PLUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7fffff,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | 0x19fffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 4.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 4 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
SingleResult);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test5 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG SingleResult;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 5 - Add single round to negative infinity test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 5 - add single round to negative infinity ...");
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffff8,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_MINUS_INFINITY) ||
|
||
(SingleResult != (SIGN | 0x19ffffe))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffff9,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | 0x19fffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffffa,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | 0x19fffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffffb,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | 0x19fffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffffc,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_MINUS_INFINITY) ||
|
||
(SingleResult != (SIGN | 0x19fffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffffd,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | 0x1a00000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7ffffe,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | 0x1a00000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
SIGN | 0x1800000,
|
||
SIGN | 0x7fffff,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | 0x1a00000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Count = 0;
|
||
try {
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(EI | ROUND_TO_MINUS_INFINITY,
|
||
0x1800000,
|
||
0x7fffff,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffff8,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_MINUS_INFINITY) ||
|
||
(SingleResult != 0x19ffffe)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffff9,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != 0x19ffffe)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffffa,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != 0x19ffffe)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffffb,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != 0x19ffffe)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffffc,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_MINUS_INFINITY) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffffd,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
0x1800000,
|
||
0x7ffffe,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_MINUS_INFINITY,
|
||
0x1800000,
|
||
0x7fffff,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != 0x19fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 5.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 5 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
SingleResult);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test6 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG SingleResult;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 6 - Add single infinity and NaN test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 6 - add single infinity and NaN ...");
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(FS | ROUND_TO_NEAREST,
|
||
0x200000,
|
||
0x200000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (FS | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SINGLE_SIGNAL_NAN_PREFIX,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
SINGLE_SIGNAL_NAN_PREFIX,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
0x3f800000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x3f800000,
|
||
SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
0x3f800000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x3f800000,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
0x3f800000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x3f800000,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
SINGLE_SIGNAL_NAN,
|
||
SINGLE_SIGNAL_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
SINGLE_SIGNAL_NAN,
|
||
0x3f800000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AddSingle(ROUND_TO_NEAREST,
|
||
0x3f800000,
|
||
SINGLE_SIGNAL_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
try {
|
||
Fsr.Data = AddSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
} except (EXCEPTION_EXECUTE_HANDLER) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
if ((Fsr.Data != (EV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_SIGNAL_NAN,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_SIGNAL_NAN,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 6.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 6 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
SingleResult);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test7 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG SingleResult;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 7 - Multiply test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 7 - multiply single ...");
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
0x0,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
0x0,
|
||
SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
0x0,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
0x0,
|
||
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 = MultiplySingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
0x0,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EV | ROUND_TO_NEAREST,
|
||
0x0,
|
||
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;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EV | ROUND_TO_NEAREST,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
0x0,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EV | ROUND_TO_NEAREST,
|
||
0x0,
|
||
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 = MultiplySingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
0x3f800000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
0x3f800000,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
SINGLE_SIGNAL_NAN,
|
||
SINGLE_SIGNAL_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
SINGLE_SIGNAL_NAN,
|
||
0x3f800000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
0x3f800000,
|
||
SINGLE_SIGNAL_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
} except (EXCEPTION_EXECUTE_HANDLER) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
if ((Fsr.Data != (EV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_SIGNAL_NAN,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_SIGNAL_NAN,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
0x7f000000,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x3f800000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x7f000000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x3f800000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
0x7f000000,
|
||
SIGN | 0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != (SIGN | 0x3f800000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SIGN | 0x7f000000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != (SIGN | 0x3f800000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
0x400004,
|
||
0x7f000001,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != 0x3f800009)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
0x400004,
|
||
SIGN | 0x7f000001,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != (SIGN | 0x3f800009))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EI | ROUND_TO_NEAREST,
|
||
0x400004,
|
||
0x7f000001,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EI | ROUND_TO_NEAREST,
|
||
0x400004,
|
||
SIGN | 0x7f000001,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SU | SI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SIGN | 0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SU | SI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != (SIGN | 0x0))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EI | ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EI | ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SIGN | 0x400000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EU | ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_UNDERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EU | ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SIGN | 0x400000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_UNDERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EU | EI | ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_UNDERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EU | EI | ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SIGN | 0x400000,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_UNDERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_NEAREST,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_ZERO,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_ZERO)) ||
|
||
(SingleResult != SINGLE_MAXIMUM_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_ZERO,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_ZERO)) ||
|
||
(SingleResult != (SIGN | SINGLE_MAXIMUM_VALUE))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_ZERO,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_ZERO)) ||
|
||
(SingleResult != (SIGN | SINGLE_MAXIMUM_VALUE))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_ZERO,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_ZERO)) ||
|
||
(SingleResult != SINGLE_MAXIMUM_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_PLUS_INFINITY,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_PLUS_INFINITY,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | SINGLE_MAXIMUM_VALUE))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_PLUS_INFINITY,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != (SIGN | SINGLE_MAXIMUM_VALUE))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_PLUS_INFINITY,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_MINUS_INFINITY,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != SINGLE_MAXIMUM_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_MINUS_INFINITY,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_MINUS_INFINITY,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MultiplySingle(ROUND_TO_MINUS_INFINITY,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(SingleResult != SINGLE_MAXIMUM_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EI | ROUND_TO_NEAREST,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EI | ROUND_TO_NEAREST,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EO | ROUND_TO_NEAREST,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EO | ROUND_TO_NEAREST,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EO | EI | ROUND_TO_NEAREST,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplySingle(EO | EI | ROUND_TO_NEAREST,
|
||
SINGLE_MAXIMUM_VALUE,
|
||
SIGN | SINGLE_MAXIMUM_VALUE,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 7.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 7 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
SingleResult);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test8 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG SingleResult;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 8 - Divide test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 8 - divide single ...");
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
0x0,
|
||
0x0,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
0x0,
|
||
SIGN | 0x0,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x0,
|
||
SIGN | 0x0,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x0,
|
||
0x0,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
0x0,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
0x3f800000,
|
||
0x0,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SZ | XZ | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
0x0,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x3f80000,
|
||
0x0,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SZ | XZ | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != MINUS_SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = DivideSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
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;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = DivideSingle(EV | ROUND_TO_NEAREST,
|
||
0x0,
|
||
0x0,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = DivideSingle(EZ | ROUND_TO_NEAREST,
|
||
0x3f800000,
|
||
0x0,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_DIVIDE_BY_ZERO) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
0x3f800000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
0x3f800000,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SINGLE_SIGNAL_NAN,
|
||
SINGLE_SIGNAL_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SINGLE_SIGNAL_NAN,
|
||
0x3f800000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
0x3f800000,
|
||
SINGLE_SIGNAL_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
try {
|
||
Fsr.Data = DivideSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
} except (EXCEPTION_EXECUTE_HANDLER) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
if ((Fsr.Data != (EV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = DivideSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_SIGNAL_NAN,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = DivideSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_SIGNAL_NAN,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != (SIGN | 0x0))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != (SIGN | 0x0))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x3f800000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != (SIGN | 0x3f800000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SIGN | 0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != (SIGN | 0x3f800000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
SIGN | 0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x3f800000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
0x3f800000,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x7f000000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
0x40000000,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = DivideSingle(ROUND_TO_NEAREST,
|
||
0x3fffffff,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x7f7fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 8.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 8 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
SingleResult);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test9 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 9 - Compare single test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 9 - compare single ...");
|
||
|
||
// ****** //
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
0x0,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x0,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x0);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
0X400000,
|
||
SIGN | 0x0);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
// ****** //
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareEqSingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareEqSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareEqSingle(ROUND_TO_NEAREST,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareEqSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SIGN | 0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLeSingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLeSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLeSingle(ROUND_TO_NEAREST,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLeSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLeSingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
MINUS_SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLeSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SIGN | 0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
MINUS_SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x410000);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
0x200000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x410000,
|
||
SIGN | 0x400000);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
SIGN | 0x200000);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareFSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareUnSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareUnSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareEqSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareEqSingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareUeqSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareUeqSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareOltSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SINGLE_QUIET_NAN);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareOltSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareUltSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareUltSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareOleSingle(ROUND_TO_NEAREST,
|
||
0x410000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareOleSingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareSfSingle(ROUND_TO_NEAREST,
|
||
0x410000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareSfSingle(ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
SINGLE_QUIET_NAN);
|
||
|
||
if (Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareNgleSingle(ROUND_TO_NEAREST,
|
||
0x410000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareNgleSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (CC | SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareSeqSingle(ROUND_TO_NEAREST,
|
||
0x410000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareSeqSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareNglSingle(ROUND_TO_NEAREST,
|
||
0x410000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareNglSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (CC | SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
0x410000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLtSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareNgeSingle(ROUND_TO_NEAREST,
|
||
0x410000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareNgeSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (CC | SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLeSingle(ROUND_TO_NEAREST,
|
||
0x410000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareLeSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareNgtSingle(ROUND_TO_NEAREST,
|
||
0x410000,
|
||
0x400000);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = CompareNgtSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
if (Fsr.Data != (CC | SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareSfSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_INFINITY_VALUE,
|
||
SINGLE_QUIET_NAN);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareNgleSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareSeqSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareNglSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareLtSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareNgeSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareLeSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareNgtSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareEqSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_SIGNAL_NAN,
|
||
SINGLE_INFINITY_VALUE);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 9.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 9 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx\n", Subtest, Fsr.Data);
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test10 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG Subtest;
|
||
ULONG SingleResult;
|
||
|
||
//
|
||
// Test 10 - Absolute, move, and negate single test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 10 - absolute, move, and negate single ...");
|
||
Subtest += 1;
|
||
Fsr.Data = AbsoluteSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x400000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AbsoluteSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x400000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AbsoluteSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = AbsoluteSingle(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 = AbsoluteSingle(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 = MoveSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x400000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MoveSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != (SIGN | 0x400000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MoveSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MoveSingle(ROUND_TO_NEAREST,
|
||
SINGLE_SIGNAL_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != SINGLE_SIGNAL_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = MoveSingle(EV | ROUND_TO_NEAREST,
|
||
SINGLE_SIGNAL_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != (EV | ROUND_TO_NEAREST)) ||
|
||
(SingleResult != SINGLE_SIGNAL_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = NegateSingle(ROUND_TO_NEAREST,
|
||
0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != (SIGN | 0x400000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = NegateSingle(ROUND_TO_NEAREST,
|
||
SIGN | 0x400000,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != 0x400000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = NegateSingle(ROUND_TO_NEAREST,
|
||
SINGLE_QUIET_NAN,
|
||
&SingleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(SingleResult != SINGLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
Fsr.Data = NegateSingle(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 = NegateSingle(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;
|
||
}
|
||
|
||
//
|
||
// End of test 10.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 10 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
SingleResult);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test11 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
ULARGE_INTEGER DoubleOperand1;
|
||
ULARGE_INTEGER DoubleOperand2;
|
||
ULARGE_INTEGER DoubleResult;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 11 - Add double denormalized test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 11 - add/subtract double denormalized ...");
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x3ff;
|
||
DoubleOperand1.HighPart = 0x0;
|
||
DoubleOperand2.LowPart = 0x1;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x400) ||
|
||
(DoubleResult.HighPart != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x1;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x7fff;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x8000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x84000;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x4000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x84000;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x4000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x0))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x100000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x100000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x1fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x1600000;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x40000000) ||
|
||
(DoubleResult.HighPart != 0x1600000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x2600000;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x4000) ||
|
||
(DoubleResult.HighPart != 0x2600000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x3f000000;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x3f000000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x100000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x3ff00000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddDouble(EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x7fe00000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x7fe00000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddDouble(EO | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x7fe00000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x7fe00000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddDouble(EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x7fe00000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x7fe00000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddDouble(EI | EO | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x3ff;
|
||
DoubleOperand1.HighPart = 0x0;
|
||
DoubleOperand2.LowPart = 0x1;
|
||
DoubleOperand2.HighPart = SIGN;
|
||
Fsr.Data = SubtractDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x400) ||
|
||
(DoubleResult.HighPart != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x1;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x7fff;
|
||
Fsr.Data = SubtractDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x8000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x84000;
|
||
Fsr.Data = SubtractDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x4000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x84000;
|
||
Fsr.Data = SubtractDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x4000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = SubtractDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Fsr.Data = SubtractDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x0))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Fsr.Data = SubtractDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x100000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x100000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = SubtractDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x1fffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x1600000;
|
||
Fsr.Data = SubtractDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x40000000) ||
|
||
(DoubleResult.HighPart != 0x1600000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x2600000;
|
||
Fsr.Data = SubtractDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x4000) ||
|
||
(DoubleResult.HighPart != 0x2600000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x3f000000;
|
||
Fsr.Data = SubtractDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x3f000000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x3ff00000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = SubtractDouble(EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x7fe00000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x7fe00000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = SubtractDouble(EO | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x7fe00000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x7fe00000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = SubtractDouble(EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x7fe00000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x7fe00000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = SubtractDouble(EI | EO | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 11.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 11 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx, %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
DoubleResult.LowPart,
|
||
DoubleResult.HighPart);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test12 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
ULARGE_INTEGER DoubleOperand1;
|
||
ULARGE_INTEGER DoubleOperand2;
|
||
ULARGE_INTEGER DoubleResult;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 12 - Add double round to nearest test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 12 - add double round to nearest ...");
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffff8;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffff9;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffa;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffb;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffc;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffd;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffe;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x340000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xffffffff;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x340000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xffffffff;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddDouble(EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 12.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 12 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx, %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
DoubleResult.LowPart,
|
||
DoubleResult.HighPart);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test13 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
ULARGE_INTEGER DoubleOperand1;
|
||
ULARGE_INTEGER DoubleOperand2;
|
||
ULARGE_INTEGER DoubleResult;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 13 - Add double round to zero test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 13 - add double round to zero ...");
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffff8;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_ZERO,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_ZERO) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffff9;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_ZERO,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_ZERO)) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffa;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_ZERO,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_ZERO)) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffb;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_ZERO,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_ZERO)) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffc;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_ZERO,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_ZERO) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffd;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_ZERO,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_ZERO)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffe;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_ZERO,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_ZERO)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xffffffff;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_ZERO,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_ZERO)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xffffffff;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddDouble(EI | ROUND_TO_ZERO,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 13.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 13 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx, %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
DoubleResult.LowPart,
|
||
DoubleResult.HighPart);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test14 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
ULARGE_INTEGER DoubleOperand1;
|
||
ULARGE_INTEGER DoubleOperand2;
|
||
FLOATING_STATUS Fsr;
|
||
ULARGE_INTEGER DoubleResult;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 14 - Add double round to positive infinity test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 14 - add double round to positive infinity ...");
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffff8;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_PLUS_INFINITY) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffff9;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffa;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffb;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffc;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_PLUS_INFINITY) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffd;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x340000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffe;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x340000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xffffffff;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x340000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xffffffff;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddDouble(EI | ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffff8;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_PLUS_INFINITY) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x33ffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffff9;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x33ffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffa;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x33ffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffb;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x33ffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffc;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_PLUS_INFINITY) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x33ffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffd;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x33ffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffe;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x33ffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xffffffff;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x33ffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 14.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 14 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx, %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
DoubleResult.LowPart,
|
||
DoubleResult.HighPart);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test15 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
ULARGE_INTEGER DoubleOperand1;
|
||
ULARGE_INTEGER DoubleOperand2;
|
||
ULARGE_INTEGER DoubleResult;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 15 - Add double round to negative infinity test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 15 - add double round to negative infinity ...");
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffff8;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_MINUS_INFINITY) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x33ffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffff9;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x33ffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffa;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x33ffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffb;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x33ffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffc;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_MINUS_INFINITY) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x33ffff))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffd;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x340000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffe;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x340000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xffffffff;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x340000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x300000;
|
||
DoubleOperand2.LowPart = 0xffffffff;
|
||
DoubleOperand2.HighPart = SIGN | 0xfffff;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddDouble(EI | ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffff8;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_MINUS_INFINITY) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffff9;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffa;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffb;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xfffffffe) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffc;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_MINUS_INFINITY) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffd;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xfffffffe;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x300000;
|
||
DoubleOperand2.LowPart = 0xffffffff;
|
||
DoubleOperand2.HighPart = 0xfffff;
|
||
Fsr.Data = AddDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x33ffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 15.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 15 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx, %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
DoubleResult.LowPart,
|
||
DoubleResult.HighPart);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test16 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
ULARGE_INTEGER DoubleOperand1;
|
||
ULARGE_INTEGER DoubleOperand2;
|
||
ULARGE_INTEGER DoubleResult;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 16 - Add double infinity and NaN test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 16 - add double infinity and NaN ...");
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x40000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x40000;
|
||
Fsr.Data = AddDouble(FS | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (FS | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = DOUBLE_SIGNAL_NAN_PREFIX;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = DOUBLE_SIGNAL_NAN_PREFIX;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x3ff00000;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x3ff00000;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x3ff00000;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x3ff00000;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x3ff00000;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x3ff00000;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_SIGNAL_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_SIGNAL_NAN;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_SIGNAL_NAN;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x3ff00000;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x3ff00000;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_SIGNAL_NAN;
|
||
Fsr.Data = AddDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
try {
|
||
Fsr.Data = AddDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except (EXCEPTION_EXECUTE_HANDLER) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
if ((Fsr.Data != (EV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_SIGNAL_NAN;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_SIGNAL_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = AddDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 16.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 16 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx, %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
DoubleResult.LowPart,
|
||
DoubleResult.HighPart);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test17 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
ULARGE_INTEGER DoubleOperand1;
|
||
ULARGE_INTEGER DoubleOperand2;
|
||
ULARGE_INTEGER DoubleResult;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 17 - Multiply double test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 17 - multiply double ...");
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x0;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x0;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x0;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x0;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x3ff00000;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x3ff00000;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_SIGNAL_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_SIGNAL_NAN;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_SIGNAL_NAN;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x3ff00000;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x3ff00000;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_SIGNAL_NAN;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except (EXCEPTION_EXECUTE_HANDLER) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
if ((Fsr.Data != (EV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_SIGNAL_NAN;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_SIGNAL_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x7fe00000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x3ff00000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x7fe00000;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x3ff00000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x7fe00000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x3ff00000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x7fe00000;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x3ff00000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80008;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x7fe00001;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x10000) ||
|
||
(DoubleResult.HighPart != 0x3ff00011)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80008;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x7fe00001;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x10000) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x3ff00011))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80008;
|
||
DoubleOperand2.LowPart = 0x1;
|
||
DoubleOperand2.HighPart = 0x7fe00001;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80008;
|
||
DoubleOperand2.LowPart = 0x1;
|
||
DoubleOperand2.HighPart = SIGN | 0x7fe00001;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SU | SI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SU | SI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x0))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EU | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_UNDERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EU | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_UNDERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EU | EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_UNDERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EU | EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_UNDERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_ZERO,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_ZERO)) ||
|
||
(DoubleResult.LowPart != DOUBLE_MAXIMUM_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_MAXIMUM_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_ZERO,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_ZERO)) ||
|
||
(DoubleResult.LowPart != DOUBLE_MAXIMUM_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != (SIGN | DOUBLE_MAXIMUM_VALUE_HIGH))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_ZERO,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_ZERO)) ||
|
||
(DoubleResult.LowPart != DOUBLE_MAXIMUM_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != (SIGN | DOUBLE_MAXIMUM_VALUE_HIGH))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_ZERO,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_ZERO)) ||
|
||
(DoubleResult.LowPart != DOUBLE_MAXIMUM_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_MAXIMUM_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != DOUBLE_MAXIMUM_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != (SIGN | DOUBLE_MAXIMUM_VALUE_HIGH))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != DOUBLE_MAXIMUM_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != (SIGN | DOUBLE_MAXIMUM_VALUE_HIGH))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_PLUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_PLUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != DOUBLE_MAXIMUM_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_MAXIMUM_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Fsr.Data = MultiplyDouble(ROUND_TO_MINUS_INFINITY,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | XO | XI | ROUND_TO_MINUS_INFINITY)) ||
|
||
(DoubleResult.LowPart != DOUBLE_MAXIMUM_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_MAXIMUM_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INEXACT_RESULT) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EO | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EO | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EO | EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_MAXIMUM_VALUE_LOW;
|
||
DoubleOperand2.HighPart = SIGN | DOUBLE_MAXIMUM_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = MultiplyDouble(EO | EI | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_OVERFLOW) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 17.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 17 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx, %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
DoubleResult.LowPart,
|
||
DoubleResult.HighPart);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test18 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
ULARGE_INTEGER DoubleOperand1;
|
||
ULARGE_INTEGER DoubleOperand2;
|
||
ULARGE_INTEGER DoubleResult;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 18 - Divide double test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 18 - divide double ...");
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x0;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x0;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x0;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x0;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x0;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x0;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x3ff00000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SZ | XZ | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x3ff00000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SZ | XZ | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != MINUS_DOUBLE_INFINITY_VALUE)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = DivideDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x0;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = DivideDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x3ff00000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = DivideDouble(EZ | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_DIVIDE_BY_ZERO) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x3ff00000;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x3ff00000;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_SIGNAL_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_SIGNAL_NAN;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_SIGNAL_NAN;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x3ff00000;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x3ff00000;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_SIGNAL_NAN;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
try {
|
||
Fsr.Data = DivideDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except (EXCEPTION_EXECUTE_HANDLER) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
if ((Fsr.Data != (EV | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_NAN_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_QUIET_NAN)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_SIGNAL_NAN;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = DivideDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_SIGNAL_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = DivideDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count != 1) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x0))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x0))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x0)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x3ff00000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x3ff00000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != (SIGN | 0x3ff00000))) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x3ff00000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x3ff00000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0x0) ||
|
||
(DoubleResult.HighPart != 0x7fe00000)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x40000000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != (SO | SI | ROUND_TO_NEAREST)) ||
|
||
(DoubleResult.LowPart != DOUBLE_INFINITY_VALUE_LOW) ||
|
||
(DoubleResult.HighPart != DOUBLE_INFINITY_VALUE_HIGH)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0xffffffff;
|
||
DoubleOperand1.HighPart = 0x3fffffff;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = DivideDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2,
|
||
&DoubleResult);
|
||
|
||
if ((Fsr.Data != ROUND_TO_NEAREST) ||
|
||
(DoubleResult.LowPart != 0xffffffff) ||
|
||
(DoubleResult.HighPart != 0x7fefffff)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 18.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 18 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx, result = %lx, %lx\n",
|
||
Subtest,
|
||
Fsr.Data,
|
||
DoubleResult.LowPart,
|
||
DoubleResult.HighPart);
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
Test19 (
|
||
VOID
|
||
)
|
||
|
||
{
|
||
|
||
ULONG Count;
|
||
ULARGE_INTEGER DoubleOperand1;
|
||
ULARGE_INTEGER DoubleOperand2;
|
||
FLOATING_STATUS Fsr;
|
||
ULONG Subtest;
|
||
|
||
//
|
||
// Test 19 - Compare double test.
|
||
//
|
||
|
||
Subtest = 0;
|
||
printf(" Test 19 - compare double ...");
|
||
|
||
// ****** //
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x0;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x0;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x0;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x0;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
// ****** //
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareEqDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareEqDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareEqDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Fsr.Data = CompareEqDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareLeDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareLeDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareLeDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareLeDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
Fsr.Data = CompareLeDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Fsr.Data = CompareLeDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = MINUS_DOUBLE_INFINITY_VALUE;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x1000;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x81000;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x40000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x1000;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x81000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x80000;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = SIGN | 0x40000;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = SIGN | 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareFDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareUnDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareUnDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareEqDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareEqDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareUeqDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareUeqDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
Fsr.Data = CompareOltDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareOltDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x80000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareUltDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareUltDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x81000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareOleDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareOleDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x81000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareSfDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
Fsr.Data = CompareSfDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x81000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareNgleDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareNgleDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x81000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareSeqDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareSeqDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x81000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareNglDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareNglDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x81000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareLtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x81000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareNgeDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareNgeDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x81000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareLeDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareLeDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = 0x0;
|
||
DoubleOperand1.HighPart = 0x81000;
|
||
DoubleOperand2.LowPart = 0x0;
|
||
DoubleOperand2.HighPart = 0x80000;
|
||
Fsr.Data = CompareNgtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != ROUND_TO_NEAREST) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Fsr.Data = CompareNgtDouble(ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
if (Fsr.Data != (CC | SV | XV | ROUND_TO_NEAREST)) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
DoubleOperand2.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_QUIET_NAN;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareSfDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareNgleDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareSeqDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareNglDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareLtDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareNgeDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareLeDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_QUIET_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareNgtDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
Subtest += 1;
|
||
DoubleOperand1.LowPart = DOUBLE_NAN_LOW;
|
||
DoubleOperand1.HighPart = DOUBLE_SIGNAL_NAN;
|
||
DoubleOperand2.LowPart = DOUBLE_INFINITY_VALUE_LOW;
|
||
DoubleOperand2.HighPart = DOUBLE_INFINITY_VALUE_HIGH;
|
||
Count = 0;
|
||
try {
|
||
Fsr.Data = CompareEqDouble(EV | ROUND_TO_NEAREST,
|
||
&DoubleOperand1,
|
||
&DoubleOperand2);
|
||
|
||
} except ((GetExceptionCode() == STATUS_FLOAT_INVALID_OPERATION) ?
|
||
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
|
||
Count += 1;
|
||
}
|
||
|
||
if (Count == 0) {
|
||
goto TestFailed;
|
||
}
|
||
|
||
//
|
||
// End of test 19.
|
||
//
|
||
|
||
printf("succeeded\n");
|
||
return;
|
||
|
||
//
|
||
// Test 19 failed.
|
||
//
|
||
|
||
TestFailed:
|
||
printf(" subtest %d failed, fsr = %lx\n", Subtest, Fsr.Data);
|
||
return;
|
||
}
|