Windows2000/private/ntos/ke/tests/mipsflt/flpt.c
2020-09-30 17:12:32 +02:00

7384 lines
225 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.
--*/
#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");
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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;
}