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