diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/ref31.txt | 810 | ||||
| -rw-r--r-- | tests/roundtest.h | 114 | ||||
| -rwxr-xr-x | tests/test31 | bin | 0 -> 81928 bytes | |||
| -rw-r--r-- | tests/test31.c | 114 |
4 files changed, 1038 insertions, 0 deletions
diff --git a/tests/ref31.txt b/tests/ref31.txt new file mode 100644 index 00000000..358877e1 --- /dev/null +++ b/tests/ref31.txt @@ -0,0 +1,810 @@ +Testing: s = (0x1.123456789abcp2) -> (double)s +FE_TONEAREST 0x1.123456789abcp+2 +FE_DOWNWARD 0x1.123456789abcp+2 +FE_UPWARD 0x1.123456789abcp+2 +FE_TOWARDZERO 0x1.123456789abcp+2 + +Testing: s = (0x1.123456789abcp2) -> (float)s +FE_TONEAREST 0x1.123456p+2 +FE_DOWNWARD 0x1.123456p+2 +FE_UPWARD 0x1.123458p+2 +FE_TOWARDZERO 0x1.123456p+2 + +Testing: s = (-(0x1.123456789abcp2)) -> (double)s +FE_TONEAREST -0x1.123456789abcp+2 +FE_DOWNWARD -0x1.123456789abcp+2 +FE_UPWARD -0x1.123456789abcp+2 +FE_TOWARDZERO -0x1.123456789abcp+2 + +Testing: s = (-(0x1.123456789abcp2)) -> (float)s +FE_TONEAREST -0x1.123456p+2 +FE_DOWNWARD -0x1.123458p+2 +FE_UPWARD -0x1.123456p+2 +FE_TOWARDZERO -0x1.123456p+2 + +Testing: d = (0x1.123456789abcp512) -> (float)d +FE_TONEAREST inf +FE_DOWNWARD 0x1.fffffep+127 +FE_UPWARD inf +FE_TOWARDZERO 0x1.fffffep+127 + +Testing: s = (0x1.123456789abcp29) -> (double)s +FE_TONEAREST 0x1.123456789abcp+29 +FE_DOWNWARD 0x1.123456789abcp+29 +FE_UPWARD 0x1.123456789abcp+29 +FE_TOWARDZERO 0x1.123456789abcp+29 + +Testing: s = (0x1.123456789abcp29) -> (float)s +FE_TONEAREST 0x1.123456p+29 +FE_DOWNWARD 0x1.123456p+29 +FE_UPWARD 0x1.123458p+29 +FE_TOWARDZERO 0x1.123456p+29 + +Testing: s = (0x1.123456789abcp29) -> (int16_t)s +FE_TONEAREST -32768 +FE_DOWNWARD -32768 +FE_UPWARD -32768 +FE_TOWARDZERO -32768 + +Testing: s = (0x1.123456789abcp29) -> (int8_t)s +FE_TONEAREST 0 +FE_DOWNWARD 0 +FE_UPWARD 0 +FE_TOWARDZERO 0 + +Testing: s = (0x1.123456789abcp29) -> (unsigned short)s +FE_TONEAREST 35535 +FE_DOWNWARD 35535 +FE_UPWARD 35535 +FE_TOWARDZERO 35535 + +Testing: s = (0x1.123456789abcp29) -> (unsigned char)s +FE_TONEAREST 0 +FE_DOWNWARD 0 +FE_UPWARD 0 +FE_TOWARDZERO 0 + +Testing: s = (-(0x1.123456789abcp29)) -> (double)s +FE_TONEAREST -0x1.123456789abcp+29 +FE_DOWNWARD -0x1.123456789abcp+29 +FE_UPWARD -0x1.123456789abcp+29 +FE_TOWARDZERO -0x1.123456789abcp+29 + +Testing: s = (-(0x1.123456789abcp29)) -> (float)s +FE_TONEAREST -0x1.123456p+29 +FE_DOWNWARD -0x1.123458p+29 +FE_UPWARD -0x1.123456p+29 +FE_TOWARDZERO -0x1.123456p+29 + +Testing: d = (-0x1.123456789abcp30) -> (int32_t)d +FE_TONEAREST -1150096798 +FE_DOWNWARD -1150096798 +FE_UPWARD -1150096798 +FE_TOWARDZERO -1150096798 + +Testing: d = (-0x1.123456789abcp62) -> (int64_t)d +FE_TONEAREST -4939628135293321216 +FE_DOWNWARD -4939628135293321216 +FE_UPWARD -4939628135293321216 +FE_TOWARDZERO -4939628135293321216 + +Testing: s = (0x1.123456789abcp2f) -> (double)s +FE_TONEAREST 0x1.123456p+2 +FE_DOWNWARD 0x1.123456p+2 +FE_UPWARD 0x1.123458p+2 +FE_TOWARDZERO 0x1.123456p+2 + +Testing: s = (0x1.123456789abcp2f) -> (float)s +FE_TONEAREST 0x1.123456p+2 +FE_DOWNWARD 0x1.123456p+2 +FE_UPWARD 0x1.123458p+2 +FE_TOWARDZERO 0x1.123456p+2 + +Testing: s = (-(0x1.123456789abcp2f)) -> (double)s +FE_TONEAREST -0x1.123456p+2 +FE_DOWNWARD -0x1.123458p+2 +FE_UPWARD -0x1.123456p+2 +FE_TOWARDZERO -0x1.123456p+2 + +Testing: s = (-(0x1.123456789abcp2f)) -> (float)s +FE_TONEAREST -0x1.123456p+2 +FE_DOWNWARD -0x1.123458p+2 +FE_UPWARD -0x1.123456p+2 +FE_TOWARDZERO -0x1.123456p+2 + +Testing: s = (0x1.123456789abcp29f) -> (double)s +FE_TONEAREST 0x1.123456p+29 +FE_DOWNWARD 0x1.123456p+29 +FE_UPWARD 0x1.123458p+29 +FE_TOWARDZERO 0x1.123456p+29 + +Testing: s = (0x1.123456789abcp29f) -> (float)s +FE_TONEAREST 0x1.123456p+29 +FE_DOWNWARD 0x1.123456p+29 +FE_UPWARD 0x1.123458p+29 +FE_TOWARDZERO 0x1.123456p+29 + +Testing: s = (0x1.123456789abcp29f) -> (int16_t)s +FE_TONEAREST -32768 +FE_DOWNWARD -32768 +FE_UPWARD -32768 +FE_TOWARDZERO -32768 + +Testing: s = (0x1.123456789abcp29f) -> (int8_t)s +FE_TONEAREST 0 +FE_DOWNWARD 0 +FE_UPWARD 0 +FE_TOWARDZERO 0 + +Testing: s = (0x1.123456789abcp29f) -> (unsigned short)s +FE_TONEAREST 35520 +FE_DOWNWARD 35520 +FE_UPWARD 35584 +FE_TOWARDZERO 35520 + +Testing: s = (0x1.123456789abcp29f) -> (unsigned char)s +FE_TONEAREST 0 +FE_DOWNWARD 0 +FE_UPWARD 0 +FE_TOWARDZERO 0 + +Testing: s = (-(0x1.123456789abcp29f)) -> (double)s +FE_TONEAREST -0x1.123456p+29 +FE_DOWNWARD -0x1.123458p+29 +FE_UPWARD -0x1.123456p+29 +FE_TOWARDZERO -0x1.123456p+29 + +Testing: s = (-(0x1.123456789abcp29f)) -> (float)s +FE_TONEAREST -0x1.123456p+29 +FE_DOWNWARD -0x1.123458p+29 +FE_UPWARD -0x1.123456p+29 +FE_TOWARDZERO -0x1.123456p+29 + +Testing: f = -0x1.123456789abcp30f -> (int32_t)f +FE_TONEAREST -1150096768 +FE_DOWNWARD -1150096896 +FE_UPWARD -1150096768 +FE_TOWARDZERO -1150096768 + +Testing: d = -0x1.1234567p0 -> (double)((int)d) +FE_TONEAREST -0x1p+0 +FE_DOWNWARD -0x1p+0 +FE_UPWARD -0x1p+0 +FE_TOWARDZERO -0x1p+0 + +Testing: d = 0x1.9234567p0 -> (double)((int)d) +FE_TONEAREST 0x1p+0 +FE_DOWNWARD 0x1p+0 +FE_UPWARD 0x1p+0 +FE_TOWARDZERO 0x1p+0 + +Testing: d = -0x1.9234567p0 -> (double)((int)d) +FE_TONEAREST -0x1p+0 +FE_DOWNWARD -0x1p+0 +FE_UPWARD -0x1p+0 +FE_TOWARDZERO -0x1p+0 + +Testing: d = 0x1.1234567p0 -> (double)((long int)d) +FE_TONEAREST 0x1p+0 +FE_DOWNWARD 0x1p+0 +FE_UPWARD 0x1p+0 +FE_TOWARDZERO 0x1p+0 + +Testing: d = -0x1.1234567p0 -> (double)((long int)d) +FE_TONEAREST -0x1p+0 +FE_DOWNWARD -0x1p+0 +FE_UPWARD -0x1p+0 +FE_TOWARDZERO -0x1p+0 + +Testing: d = 0x1.9234567p0 -> (double)((long int)d) +FE_TONEAREST 0x1p+0 +FE_DOWNWARD 0x1p+0 +FE_UPWARD 0x1p+0 +FE_TOWARDZERO 0x1p+0 + +Testing: d = -0x1.9234567p0 -> (double)((long int)d) +FE_TONEAREST -0x1p+0 +FE_DOWNWARD -0x1p+0 +FE_UPWARD -0x1p+0 +FE_TOWARDZERO -0x1p+0 + +Testing: (d1 = (1.0), d2 = (0x1.0000000000001p0)) -> d1 + d2 +FE_TONEAREST 0x1p+1 +FE_DOWNWARD 0x1p+1 +FE_UPWARD 0x1.0000000000001p+1 +FE_TOWARDZERO 0x1p+1 + +Testing: (d1 = -(1.0), d2 = (0x1.0000000000001p0)) -> d1 + d2 +FE_TONEAREST 0x1p-52 +FE_DOWNWARD 0x1p-52 +FE_UPWARD 0x1p-52 +FE_TOWARDZERO 0x1p-52 + +Testing: (d1 = (1.0), d2 = -(0x1.0000000000001p0)) -> d1 + d2 +FE_TONEAREST -0x1p-52 +FE_DOWNWARD -0x1p-52 +FE_UPWARD -0x1p-52 +FE_TOWARDZERO -0x1p-52 + +Testing: (d1 = -(1.0), d2 = -(0x1.0000000000001p0)) -> d1 + d2 +FE_TONEAREST -0x1p+1 +FE_DOWNWARD -0x1.0000000000001p+1 +FE_UPWARD -0x1p+1 +FE_TOWARDZERO -0x1p+1 + +Testing: (d1 = (1.0), d2 = (0x1.0000000000001p0)) -> d1 - d2 +FE_TONEAREST -0x1p-52 +FE_DOWNWARD -0x1p-52 +FE_UPWARD -0x1p-52 +FE_TOWARDZERO -0x1p-52 + +Testing: (d1 = -(1.0), d2 = (0x1.0000000000001p0)) -> d1 - d2 +FE_TONEAREST -0x1p+1 +FE_DOWNWARD -0x1.0000000000001p+1 +FE_UPWARD -0x1p+1 +FE_TOWARDZERO -0x1p+1 + +Testing: (d1 = (1.0), d2 = -(0x1.0000000000001p0)) -> d1 - d2 +FE_TONEAREST 0x1p+1 +FE_DOWNWARD 0x1p+1 +FE_UPWARD 0x1.0000000000001p+1 +FE_TOWARDZERO 0x1p+1 + +Testing: (d1 = -(1.0), d2 = -(0x1.0000000000001p0)) -> d1 - d2 +FE_TONEAREST 0x1p-52 +FE_DOWNWARD 0x1p-52 +FE_UPWARD 0x1p-52 +FE_TOWARDZERO 0x1p-52 + +Testing: (d1 = (1.0), d2 = (0x1.0000000000001p0)) -> d2 - d1 +FE_TONEAREST 0x1p-52 +FE_DOWNWARD 0x1p-52 +FE_UPWARD 0x1p-52 +FE_TOWARDZERO 0x1p-52 + +Testing: (d1 = -(1.0), d2 = (0x1.0000000000001p0)) -> d2 - d1 +FE_TONEAREST 0x1p+1 +FE_DOWNWARD 0x1p+1 +FE_UPWARD 0x1.0000000000001p+1 +FE_TOWARDZERO 0x1p+1 + +Testing: (d1 = (1.0), d2 = -(0x1.0000000000001p0)) -> d2 - d1 +FE_TONEAREST -0x1p+1 +FE_DOWNWARD -0x1.0000000000001p+1 +FE_UPWARD -0x1p+1 +FE_TOWARDZERO -0x1p+1 + +Testing: (d1 = -(1.0), d2 = -(0x1.0000000000001p0)) -> d2 - d1 +FE_TONEAREST -0x1p-52 +FE_DOWNWARD -0x1p-52 +FE_UPWARD -0x1p-52 +FE_TOWARDZERO -0x1p-52 + +Testing: (d1 = (1.0), d2 = (0x1.000000000000dp-4)) -> d1 + d2 +FE_TONEAREST 0x1.1000000000001p+0 +FE_DOWNWARD 0x1.1p+0 +FE_UPWARD 0x1.1000000000001p+0 +FE_TOWARDZERO 0x1.1p+0 + +Testing: (d1 = -(1.0), d2 = (0x1.000000000000dp-4)) -> d1 + d2 +FE_TONEAREST -0x1.dfffffffffffep-1 +FE_DOWNWARD -0x1.dffffffffffffp-1 +FE_UPWARD -0x1.dfffffffffffep-1 +FE_TOWARDZERO -0x1.dfffffffffffep-1 + +Testing: (d1 = (1.0), d2 = -(0x1.000000000000dp-4)) -> d1 + d2 +FE_TONEAREST 0x1.dfffffffffffep-1 +FE_DOWNWARD 0x1.dfffffffffffep-1 +FE_UPWARD 0x1.dffffffffffffp-1 +FE_TOWARDZERO 0x1.dfffffffffffep-1 + +Testing: (d1 = -(1.0), d2 = -(0x1.000000000000dp-4)) -> d1 + d2 +FE_TONEAREST -0x1.1000000000001p+0 +FE_DOWNWARD -0x1.1000000000001p+0 +FE_UPWARD -0x1.1p+0 +FE_TOWARDZERO -0x1.1p+0 + +Testing: (d1 = (1.0), d2 = (0x1.000000000000dp-4)) -> d1 - d2 +FE_TONEAREST 0x1.dfffffffffffep-1 +FE_DOWNWARD 0x1.dfffffffffffep-1 +FE_UPWARD 0x1.dffffffffffffp-1 +FE_TOWARDZERO 0x1.dfffffffffffep-1 + +Testing: (d1 = -(1.0), d2 = (0x1.000000000000dp-4)) -> d1 - d2 +FE_TONEAREST -0x1.1000000000001p+0 +FE_DOWNWARD -0x1.1000000000001p+0 +FE_UPWARD -0x1.1p+0 +FE_TOWARDZERO -0x1.1p+0 + +Testing: (d1 = (1.0), d2 = -(0x1.000000000000dp-4)) -> d1 - d2 +FE_TONEAREST 0x1.1000000000001p+0 +FE_DOWNWARD 0x1.1p+0 +FE_UPWARD 0x1.1000000000001p+0 +FE_TOWARDZERO 0x1.1p+0 + +Testing: (d1 = -(1.0), d2 = -(0x1.000000000000dp-4)) -> d1 - d2 +FE_TONEAREST -0x1.dfffffffffffep-1 +FE_DOWNWARD -0x1.dffffffffffffp-1 +FE_UPWARD -0x1.dfffffffffffep-1 +FE_TOWARDZERO -0x1.dfffffffffffep-1 + +Testing: (d1 = (1.0), d2 = (0x1.000000000000dp-4)) -> d2 - d1 +FE_TONEAREST -0x1.dfffffffffffep-1 +FE_DOWNWARD -0x1.dffffffffffffp-1 +FE_UPWARD -0x1.dfffffffffffep-1 +FE_TOWARDZERO -0x1.dfffffffffffep-1 + +Testing: (d1 = -(1.0), d2 = (0x1.000000000000dp-4)) -> d2 - d1 +FE_TONEAREST 0x1.1000000000001p+0 +FE_DOWNWARD 0x1.1p+0 +FE_UPWARD 0x1.1000000000001p+0 +FE_TOWARDZERO 0x1.1p+0 + +Testing: (d1 = (1.0), d2 = -(0x1.000000000000dp-4)) -> d2 - d1 +FE_TONEAREST -0x1.1000000000001p+0 +FE_DOWNWARD -0x1.1000000000001p+0 +FE_UPWARD -0x1.1p+0 +FE_TOWARDZERO -0x1.1p+0 + +Testing: (d1 = -(1.0), d2 = -(0x1.000000000000dp-4)) -> d2 - d1 +FE_TONEAREST 0x1.dfffffffffffep-1 +FE_DOWNWARD 0x1.dfffffffffffep-1 +FE_UPWARD 0x1.dffffffffffffp-1 +FE_TOWARDZERO 0x1.dfffffffffffep-1 + +Testing: (d1 = (0x1.233445566778p0), d2 = (0x1.3456789abcdep0)) -> d1 + d2 +FE_TONEAREST 0x1.2bc55ef8922bp+1 +FE_DOWNWARD 0x1.2bc55ef8922bp+1 +FE_UPWARD 0x1.2bc55ef8922bp+1 +FE_TOWARDZERO 0x1.2bc55ef8922bp+1 + +Testing: (d1 = -(0x1.233445566778p0), d2 = (0x1.3456789abcdep0)) -> d1 + d2 +FE_TONEAREST 0x1.12233445566p-4 +FE_DOWNWARD 0x1.12233445566p-4 +FE_UPWARD 0x1.12233445566p-4 +FE_TOWARDZERO 0x1.12233445566p-4 + +Testing: (d1 = (0x1.233445566778p0), d2 = -(0x1.3456789abcdep0)) -> d1 + d2 +FE_TONEAREST -0x1.12233445566p-4 +FE_DOWNWARD -0x1.12233445566p-4 +FE_UPWARD -0x1.12233445566p-4 +FE_TOWARDZERO -0x1.12233445566p-4 + +Testing: (d1 = -(0x1.233445566778p0), d2 = -(0x1.3456789abcdep0)) -> d1 + d2 +FE_TONEAREST -0x1.2bc55ef8922bp+1 +FE_DOWNWARD -0x1.2bc55ef8922bp+1 +FE_UPWARD -0x1.2bc55ef8922bp+1 +FE_TOWARDZERO -0x1.2bc55ef8922bp+1 + +Testing: (d1 = (0x1.233445566778p0f), d2 = (0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST 0x1.5ebd404804dp+0 +FE_DOWNWARD 0x1.5ebd3ddf57ep+0 +FE_UPWARD 0x1.5ebd428e6d5cp+0 +FE_TOWARDZERO 0x1.5ebd3ddf57ep+0 + +Testing: (d1 = -(0x1.233445566778p0f), d2 = (0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST -0x1.5ebd404804dp+0 +FE_DOWNWARD -0x1.5ebd404804dp+0 +FE_UPWARD -0x1.5ebd4025c068p+0 +FE_TOWARDZERO -0x1.5ebd3ddf57ep+0 + +Testing: (d1 = (0x1.233445566778p0f), d2 = -(0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST -0x1.5ebd404804dp+0 +FE_DOWNWARD -0x1.5ebd4025c068p+0 +FE_UPWARD -0x1.5ebd404804dp+0 +FE_TOWARDZERO -0x1.5ebd3ddf57ep+0 + +Testing: (d1 = -(0x1.233445566778p0f), d2 = -(0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST 0x1.5ebd404804dp+0 +FE_DOWNWARD 0x1.5ebd428e6d5cp+0 +FE_UPWARD 0x1.5ebd3ddf57ep+0 +FE_TOWARDZERO 0x1.5ebd3ddf57ep+0 + +Testing: (d1 = (0x1.233445566778p0f), d2 = (0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST 0x1.5ebd40f80919p+0 +FE_DOWNWARD 0x1.5ebd3e8f5c27dp+0 +FE_UPWARD 0x1.5ebd40f809191p+0 +FE_TOWARDZERO 0x1.5ebd3e8f5c27dp+0 + +Testing: (d1 = -(0x1.233445566778p0f), d2 = (0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST -0x1.5ebd40f80919p+0 +FE_DOWNWARD -0x1.5ebd40f809191p+0 +FE_UPWARD -0x1.5ebd3e8f5c27dp+0 +FE_TOWARDZERO -0x1.5ebd3e8f5c27dp+0 + +Testing: (d1 = (0x1.233445566778p0f), d2 = -(0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST -0x1.5ebd40f80919p+0 +FE_DOWNWARD -0x1.5ebd3e8f5c27ep+0 +FE_UPWARD -0x1.5ebd40f80919p+0 +FE_TOWARDZERO -0x1.5ebd3e8f5c27dp+0 + +Testing: (d1 = -(0x1.233445566778p0f), d2 = -(0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST 0x1.5ebd40f80919p+0 +FE_DOWNWARD 0x1.5ebd40f80919p+0 +FE_UPWARD 0x1.5ebd3e8f5c27ep+0 +FE_TOWARDZERO 0x1.5ebd3e8f5c27dp+0 + +Testing: (d1 = (0x1.233445566778p0), d2 = (0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST 0x1.5ebd402bc44c4p+0 +FE_DOWNWARD 0x1.5ebd402bc44c4p+0 +FE_UPWARD 0x1.5ebd402bc44c5p+0 +FE_TOWARDZERO 0x1.5ebd402bc44c4p+0 + +Testing: (d1 = -(0x1.233445566778p0), d2 = (0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST -0x1.5ebd402bc44c4p+0 +FE_DOWNWARD -0x1.5ebd402bc44c5p+0 +FE_UPWARD -0x1.5ebd402bc44c4p+0 +FE_TOWARDZERO -0x1.5ebd402bc44c4p+0 + +Testing: (d1 = (0x1.233445566778p0), d2 = -(0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST -0x1.5ebd402bc44c4p+0 +FE_DOWNWARD -0x1.5ebd402bc44c5p+0 +FE_UPWARD -0x1.5ebd402bc44c4p+0 +FE_TOWARDZERO -0x1.5ebd402bc44c4p+0 + +Testing: (d1 = -(0x1.233445566778p0), d2 = -(0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST 0x1.5ebd402bc44c4p+0 +FE_DOWNWARD 0x1.5ebd402bc44c4p+0 +FE_UPWARD 0x1.5ebd402bc44c5p+0 +FE_TOWARDZERO 0x1.5ebd402bc44c4p+0 + +Testing: (d1 = (0x1.233445566778p0f), d2 = (0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST 0x1.5ebd40f80919p+0 +FE_DOWNWARD 0x1.5ebd3e8f5c27dp+0 +FE_UPWARD 0x1.5ebd40f809191p+0 +FE_TOWARDZERO 0x1.5ebd3e8f5c27dp+0 + +Testing: (d1 = -(0x1.233445566778p0f), d2 = (0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST -0x1.5ebd40f80919p+0 +FE_DOWNWARD -0x1.5ebd40f809191p+0 +FE_UPWARD -0x1.5ebd3e8f5c27dp+0 +FE_TOWARDZERO -0x1.5ebd3e8f5c27dp+0 + +Testing: (d1 = (0x1.233445566778p0f), d2 = -(0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST -0x1.5ebd40f80919p+0 +FE_DOWNWARD -0x1.5ebd3e8f5c27ep+0 +FE_UPWARD -0x1.5ebd40f80919p+0 +FE_TOWARDZERO -0x1.5ebd3e8f5c27dp+0 + +Testing: (d1 = -(0x1.233445566778p0f), d2 = -(0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST 0x1.5ebd40f80919p+0 +FE_DOWNWARD 0x1.5ebd40f80919p+0 +FE_UPWARD 0x1.5ebd3e8f5c27ep+0 +FE_TOWARDZERO 0x1.5ebd3e8f5c27dp+0 + +Testing: (d1 = (0x1.233445566778p0), d2 = (0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST 0x1.5ebd3f7bc003ap+0 +FE_DOWNWARD 0x1.5ebd3f7bc003ap+0 +FE_UPWARD 0x1.5ebd41c2288e5p+0 +FE_TOWARDZERO 0x1.5ebd3f7bc003ap+0 + +Testing: (d1 = -(0x1.233445566778p0), d2 = (0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST -0x1.5ebd3f7bc003ap+0 +FE_DOWNWARD -0x1.5ebd3f7bc003bp+0 +FE_UPWARD -0x1.5ebd41c2288e4p+0 +FE_TOWARDZERO -0x1.5ebd3f7bc003ap+0 + +Testing: (d1 = (0x1.233445566778p0), d2 = -(0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST -0x1.5ebd3f7bc003ap+0 +FE_DOWNWARD -0x1.5ebd41c2288e5p+0 +FE_UPWARD -0x1.5ebd3f7bc003ap+0 +FE_TOWARDZERO -0x1.5ebd3f7bc003ap+0 + +Testing: (d1 = -(0x1.233445566778p0), d2 = -(0x1.3456789abcdep0)) -> d1 *d2 +FE_TONEAREST 0x1.5ebd3f7bc003ap+0 +FE_DOWNWARD 0x1.5ebd41c2288e4p+0 +FE_UPWARD 0x1.5ebd3f7bc003bp+0 +FE_TOWARDZERO 0x1.5ebd3f7bc003ap+0 + +Testing: (d1 = (0x1.233445566778p0f), d2 = (0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST 0x1.5ebd404804dp+0 +FE_DOWNWARD 0x1.5ebd3ddf57ep+0 +FE_UPWARD 0x1.5ebd428e6d5cp+0 +FE_TOWARDZERO 0x1.5ebd3ddf57ep+0 + +Testing: (d1 = -(0x1.233445566778p0f), d2 = (0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST -0x1.5ebd404804dp+0 +FE_DOWNWARD -0x1.5ebd404804dp+0 +FE_UPWARD -0x1.5ebd4025c068p+0 +FE_TOWARDZERO -0x1.5ebd3ddf57ep+0 + +Testing: (d1 = (0x1.233445566778p0f), d2 = -(0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST -0x1.5ebd404804dp+0 +FE_DOWNWARD -0x1.5ebd4025c068p+0 +FE_UPWARD -0x1.5ebd404804dp+0 +FE_TOWARDZERO -0x1.5ebd3ddf57ep+0 + +Testing: (d1 = -(0x1.233445566778p0f), d2 = -(0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST 0x1.5ebd404804dp+0 +FE_DOWNWARD 0x1.5ebd428e6d5cp+0 +FE_UPWARD 0x1.5ebd3ddf57ep+0 +FE_TOWARDZERO 0x1.5ebd3ddf57ep+0 + +Testing: (d1 = (0x1.233445566778p0), d2 = (5)) -> d1 *d2 +FE_TONEAREST 0x1.6c0156ac0156p+2 +FE_DOWNWARD 0x1.6c0156ac0156p+2 +FE_UPWARD 0x1.6c0156ac0156p+2 +FE_TOWARDZERO 0x1.6c0156ac0156p+2 + +Testing: (d1 = -(0x1.233445566778p0), d2 = (5)) -> d1 *d2 +FE_TONEAREST -0x1.6c0156ac0156p+2 +FE_DOWNWARD -0x1.6c0156ac0156p+2 +FE_UPWARD -0x1.6c0156ac0156p+2 +FE_TOWARDZERO -0x1.6c0156ac0156p+2 + +Testing: (d1 = (0x1.233445566778p0), d2 = -(5)) -> d1 *d2 +FE_TONEAREST -0x1.6c0156ac0156p+2 +FE_DOWNWARD -0x1.6c0156ac0156p+2 +FE_UPWARD -0x1.6c0156ac0156p+2 +FE_TOWARDZERO -0x1.6c0156ac0156p+2 + +Testing: (d1 = -(0x1.233445566778p0), d2 = -(5)) -> d1 *d2 +FE_TONEAREST 0x1.6c0156ac0156p+2 +FE_DOWNWARD 0x1.6c0156ac0156p+2 +FE_UPWARD 0x1.6c0156ac0156p+2 +FE_TOWARDZERO 0x1.6c0156ac0156p+2 + +Testing: (d1 = (15), d2 = (0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST 0x1.2111111111102p+4 +FE_DOWNWARD 0x1.2111111111102p+4 +FE_UPWARD 0x1.2111111111102p+4 +FE_TOWARDZERO 0x1.2111111111102p+4 + +Testing: (d1 = -(15), d2 = (0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST -0x1.2111111111102p+4 +FE_DOWNWARD -0x1.2111111111102p+4 +FE_UPWARD -0x1.2111111111102p+4 +FE_TOWARDZERO -0x1.2111111111102p+4 + +Testing: (d1 = (15), d2 = -(0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST -0x1.2111111111102p+4 +FE_DOWNWARD -0x1.2111111111102p+4 +FE_UPWARD -0x1.2111111111102p+4 +FE_TOWARDZERO -0x1.2111111111102p+4 + +Testing: (d1 = -(15), d2 = -(0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST 0x1.2111111111102p+4 +FE_DOWNWARD 0x1.2111111111102p+4 +FE_UPWARD 0x1.2111111111102p+4 +FE_TOWARDZERO 0x1.2111111111102p+4 + +Testing: (d1 = (0x1.233445566778p0f), d2 = (15)) -> d1 *d2 +FE_TONEAREST 0x1.110101ap+4 +FE_DOWNWARD 0x1.1100ffcp+4 +FE_UPWARD 0x1.110101ap+4 +FE_TOWARDZERO 0x1.1100ffcp+4 + +Testing: (d1 = -(0x1.233445566778p0f), d2 = (15)) -> d1 *d2 +FE_TONEAREST -0x1.110101ap+4 +FE_DOWNWARD -0x1.110101ap+4 +FE_UPWARD -0x1.1100ffcp+4 +FE_TOWARDZERO -0x1.1100ffcp+4 + +Testing: (d1 = (0x1.233445566778p0f), d2 = -(15)) -> d1 *d2 +FE_TONEAREST -0x1.110101ap+4 +FE_DOWNWARD -0x1.1100ffcp+4 +FE_UPWARD -0x1.110101ap+4 +FE_TOWARDZERO -0x1.1100ffcp+4 + +Testing: (d1 = -(0x1.233445566778p0f), d2 = -(15)) -> d1 *d2 +FE_TONEAREST 0x1.110101ap+4 +FE_DOWNWARD 0x1.110101ap+4 +FE_UPWARD 0x1.1100ffcp+4 +FE_TOWARDZERO 0x1.1100ffcp+4 + +Testing: (d1 = (15), d2 = (0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST 0x1.2111108p+4 +FE_DOWNWARD 0x1.2111108p+4 +FE_UPWARD 0x1.2111126p+4 +FE_TOWARDZERO 0x1.2111108p+4 + +Testing: (d1 = -(15), d2 = (0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST -0x1.2111108p+4 +FE_DOWNWARD -0x1.2111108p+4 +FE_UPWARD -0x1.2111126p+4 +FE_TOWARDZERO -0x1.2111108p+4 + +Testing: (d1 = (15), d2 = -(0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST -0x1.2111108p+4 +FE_DOWNWARD -0x1.2111126p+4 +FE_UPWARD -0x1.2111108p+4 +FE_TOWARDZERO -0x1.2111108p+4 + +Testing: (d1 = -(15), d2 = -(0x1.3456789abcdep0f)) -> d1 *d2 +FE_TONEAREST 0x1.2111108p+4 +FE_DOWNWARD 0x1.2111126p+4 +FE_UPWARD 0x1.2111108p+4 +FE_TOWARDZERO 0x1.2111108p+4 + +Testing: (d1 = (0x1.233445566778p0), d2 = (0x1.3456789abcdep0)) -> d1 / d2 +FE_TONEAREST 0x1.e38ca44203ab9p-1 +FE_DOWNWARD 0x1.e38ca44203ab8p-1 +FE_UPWARD 0x1.e38ca44203ab9p-1 +FE_TOWARDZERO 0x1.e38ca44203ab8p-1 + +Testing: (d1 = -(0x1.233445566778p0), d2 = (0x1.3456789abcdep0)) -> d1 / d2 +FE_TONEAREST -0x1.e38ca44203ab9p-1 +FE_DOWNWARD -0x1.e38ca44203ab9p-1 +FE_UPWARD -0x1.e38ca44203ab8p-1 +FE_TOWARDZERO -0x1.e38ca44203ab8p-1 + +Testing: (d1 = (0x1.233445566778p0), d2 = -(0x1.3456789abcdep0)) -> d1 / d2 +FE_TONEAREST -0x1.e38ca44203ab9p-1 +FE_DOWNWARD -0x1.e38ca44203ab9p-1 +FE_UPWARD -0x1.e38ca44203ab8p-1 +FE_TOWARDZERO -0x1.e38ca44203ab8p-1 + +Testing: (d1 = -(0x1.233445566778p0), d2 = -(0x1.3456789abcdep0)) -> d1 / d2 +FE_TONEAREST 0x1.e38ca44203ab9p-1 +FE_DOWNWARD 0x1.e38ca44203ab8p-1 +FE_UPWARD 0x1.e38ca44203ab9p-1 +FE_TOWARDZERO 0x1.e38ca44203ab8p-1 + +Testing: (d1 = (0x1.233445566778p0), d2 = (0x1.3456789abcdep0)) -> d1 / d2 +FE_TONEAREST 0x1.e38ca44203ab9p-1 +FE_DOWNWARD 0x1.e38ca44203ab8p-1 +FE_UPWARD 0x1.e38ca44203ab9p-1 +FE_TOWARDZERO 0x1.e38ca44203ab8p-1 + +Testing: (d1 = -(0x1.233445566778p0), d2 = (0x1.3456789abcdep0)) -> d1 / d2 +FE_TONEAREST -0x1.e38ca44203ab9p-1 +FE_DOWNWARD -0x1.e38ca44203ab9p-1 +FE_UPWARD -0x1.e38ca44203ab8p-1 +FE_TOWARDZERO -0x1.e38ca44203ab8p-1 + +Testing: (d1 = (0x1.233445566778p0), d2 = -(0x1.3456789abcdep0)) -> d1 / d2 +FE_TONEAREST -0x1.e38ca44203ab9p-1 +FE_DOWNWARD -0x1.e38ca44203ab9p-1 +FE_UPWARD -0x1.e38ca44203ab8p-1 +FE_TOWARDZERO -0x1.e38ca44203ab8p-1 + +Testing: (d1 = -(0x1.233445566778p0), d2 = -(0x1.3456789abcdep0)) -> d1 / d2 +FE_TONEAREST 0x1.e38ca44203ab9p-1 +FE_DOWNWARD 0x1.e38ca44203ab8p-1 +FE_UPWARD 0x1.e38ca44203ab9p-1 +FE_TOWARDZERO 0x1.e38ca44203ab8p-1 + +Testing: (d1 = (0x1.233445566778p0), d2 = (0x1.3456789abcdep0f)) -> d1 / d2 +FE_TONEAREST 0x1.e38ca534ae61p-1 +FE_DOWNWARD 0x1.e38ca534ae61p-1 +FE_UPWARD 0x1.e38ca211bd4adp-1 +FE_TOWARDZERO 0x1.e38ca534ae61p-1 + +Testing: (d1 = -(0x1.233445566778p0), d2 = (0x1.3456789abcdep0f)) -> d1 / d2 +FE_TONEAREST -0x1.e38ca534ae61p-1 +FE_DOWNWARD -0x1.e38ca534ae611p-1 +FE_UPWARD -0x1.e38ca211bd4acp-1 +FE_TOWARDZERO -0x1.e38ca534ae61p-1 + +Testing: (d1 = (0x1.233445566778p0), d2 = -(0x1.3456789abcdep0f)) -> d1 / d2 +FE_TONEAREST -0x1.e38ca534ae61p-1 +FE_DOWNWARD -0x1.e38ca211bd4adp-1 +FE_UPWARD -0x1.e38ca534ae61p-1 +FE_TOWARDZERO -0x1.e38ca534ae61p-1 + +Testing: (d1 = -(0x1.233445566778p0), d2 = -(0x1.3456789abcdep0f)) -> d1 / d2 +FE_TONEAREST 0x1.e38ca534ae61p-1 +FE_DOWNWARD 0x1.e38ca211bd4acp-1 +FE_UPWARD 0x1.e38ca534ae611p-1 +FE_TOWARDZERO 0x1.e38ca534ae61p-1 + +Testing: (d1 = (1.0), d2 = (0x1.0000000000001p0)) -> d2 - d1 +FE_TONEAREST 0x1p-52 +FE_DOWNWARD 0x1p-52 +FE_UPWARD 0x1p-52 +FE_TOWARDZERO 0x1p-52 + +Testing: (d1 = -(1.0), d2 = (0x1.0000000000001p0)) -> d2 - d1 +FE_TONEAREST 0x1p+1 +FE_DOWNWARD 0x1p+1 +FE_UPWARD 0x1.0000000000001p+1 +FE_TOWARDZERO 0x1p+1 + +Testing: (d1 = (1.0), d2 = -(0x1.0000000000001p0)) -> d2 - d1 +FE_TONEAREST -0x1p+1 +FE_DOWNWARD -0x1.0000000000001p+1 +FE_UPWARD -0x1p+1 +FE_TOWARDZERO -0x1p+1 + +Testing: (d1 = -(1.0), d2 = -(0x1.0000000000001p0)) -> d2 - d1 +FE_TONEAREST -0x1p-52 +FE_DOWNWARD -0x1p-52 +FE_UPWARD -0x1p-52 +FE_TOWARDZERO -0x1p-52 + +Testing: (d1 = (1.0), d2 = (0x1.000000000000dp-4)) -> d1 + d2 +FE_TONEAREST 0x1.1000000000001p+0 +FE_DOWNWARD 0x1.1p+0 +FE_UPWARD 0x1.1000000000001p+0 +FE_TOWARDZERO 0x1.1p+0 + +Testing: (d1 = -(1.0), d2 = (0x1.000000000000dp-4)) -> d1 + d2 +FE_TONEAREST -0x1.dfffffffffffep-1 +FE_DOWNWARD -0x1.dffffffffffffp-1 +FE_UPWARD -0x1.dfffffffffffep-1 +FE_TOWARDZERO -0x1.dfffffffffffep-1 + +Testing: (d1 = (1.0), d2 = -(0x1.000000000000dp-4)) -> d1 + d2 +FE_TONEAREST 0x1.dfffffffffffep-1 +FE_DOWNWARD 0x1.dfffffffffffep-1 +FE_UPWARD 0x1.dffffffffffffp-1 +FE_TOWARDZERO 0x1.dfffffffffffep-1 + +Testing: (d1 = -(1.0), d2 = -(0x1.000000000000dp-4)) -> d1 + d2 +FE_TONEAREST -0x1.1000000000001p+0 +FE_DOWNWARD -0x1.1000000000001p+0 +FE_UPWARD -0x1.1p+0 +FE_TOWARDZERO -0x1.1p+0 + +Testing: (d1 = (1.0), d2 = (0x1.000000000000dp-4)) -> d1 - d2 +FE_TONEAREST 0x1.dfffffffffffep-1 +FE_DOWNWARD 0x1.dfffffffffffep-1 +FE_UPWARD 0x1.dffffffffffffp-1 +FE_TOWARDZERO 0x1.dfffffffffffep-1 + +Testing: (d1 = -(1.0), d2 = (0x1.000000000000dp-4)) -> d1 - d2 +FE_TONEAREST -0x1.1000000000001p+0 +FE_DOWNWARD -0x1.1000000000001p+0 +FE_UPWARD -0x1.1p+0 +FE_TOWARDZERO -0x1.1p+0 + +Testing: (d1 = (1.0), d2 = -(0x1.000000000000dp-4)) -> d1 - d2 +FE_TONEAREST 0x1.1000000000001p+0 +FE_DOWNWARD 0x1.1p+0 +FE_UPWARD 0x1.1000000000001p+0 +FE_TOWARDZERO 0x1.1p+0 + +Testing: (d1 = -(1.0), d2 = -(0x1.000000000000dp-4)) -> d1 - d2 +FE_TONEAREST -0x1.dfffffffffffep-1 +FE_DOWNWARD -0x1.dffffffffffffp-1 +FE_UPWARD -0x1.dfffffffffffep-1 +FE_TOWARDZERO -0x1.dfffffffffffep-1 + +Testing: (d1 = (1.0), d2 = (0x1.000000000000dp-4)) -> d2 - d1 +FE_TONEAREST -0x1.dfffffffffffep-1 +FE_DOWNWARD -0x1.dffffffffffffp-1 +FE_UPWARD -0x1.dfffffffffffep-1 +FE_TOWARDZERO -0x1.dfffffffffffep-1 + +Testing: (d1 = -(1.0), d2 = (0x1.000000000000dp-4)) -> d2 - d1 +FE_TONEAREST 0x1.1000000000001p+0 +FE_DOWNWARD 0x1.1p+0 +FE_UPWARD 0x1.1000000000001p+0 +FE_TOWARDZERO 0x1.1p+0 + +Testing: (d1 = (1.0), d2 = -(0x1.000000000000dp-4)) -> d2 - d1 +FE_TONEAREST -0x1.1000000000001p+0 +FE_DOWNWARD -0x1.1000000000001p+0 +FE_UPWARD -0x1.1p+0 +FE_TOWARDZERO -0x1.1p+0 + +Testing: (d1 = -(1.0), d2 = -(0x1.000000000000dp-4)) -> d2 - d1 +FE_TONEAREST 0x1.dfffffffffffep-1 +FE_DOWNWARD 0x1.dfffffffffffep-1 +FE_UPWARD 0x1.dffffffffffffp-1 +FE_TOWARDZERO 0x1.dfffffffffffep-1 + +Testing X87 instruction: "FSQRT" (ST0 = 0x1p+2, ST1 = 0x0p+0) +FE_TONEAREST ST0 = 0x1p+1 +FE_DOWNWARD ST0 = 0x1p+1 +FE_UPWARD ST0 = 0x1p+1 +FE_TOWARDZERO ST0 = 0x1p+1 + +Testing X87 instruction: "FSQRT" (ST0 = 0x1.0000000000001p+1, ST1 = 0x0p+0) +FE_TONEAREST ST0 = 0x1.6a09e667f3bcdp+0 +FE_DOWNWARD ST0 = 0x1.6a09e667f3bcdp+0 +FE_UPWARD ST0 = 0x1.6a09e667f3bcep+0 +FE_TOWARDZERO ST0 = 0x1.6a09e667f3bcdp+0 + +Testing X87 instruction: "FSQRT" (ST0 = 0x1.123456789abcp+31, ST1 = 0x0p+0) +FE_TONEAREST ST0 = 0x1.76b0aac9e6a5p+15 +FE_DOWNWARD ST0 = 0x1.76b0aac9e6a4fp+15 +FE_UPWARD ST0 = 0x1.76b0aac9e6a5p+15 +FE_TOWARDZERO ST0 = 0x1.76b0aac9e6a4fp+15 + +Testing X87 instruction: "FSQRT" (ST0 = 0x1.123456789abdp+31, ST1 = 0x0p+0) +FE_TONEAREST ST0 = 0x1.76b0aac9e6a5bp+15 +FE_DOWNWARD ST0 = 0x1.76b0aac9e6a5ap+15 +FE_UPWARD ST0 = 0x1.76b0aac9e6a5bp+15 +FE_TOWARDZERO ST0 = 0x1.76b0aac9e6a5ap+15 + diff --git a/tests/roundtest.h b/tests/roundtest.h new file mode 100644 index 00000000..320e22c9 --- /dev/null +++ b/tests/roundtest.h @@ -0,0 +1,114 @@ +#pragma STDC FENV_ACCESS ON +#include <assert.h> +#include <stdio.h> + +#ifdef USE_ASM_ROUNDING +int fesetround_(int rounding_direction) { + uint16_t old_cw; + __asm__("FNSTCW %0" : "=m"(old_cw)::); + uint16_t new_cw = (old_cw & ~0xc00) | rounding_direction; + __asm__("FLDCW %0" ::"m"(new_cw)); + return old_cw & 0xc00; +} +int fegetround_() { + uint16_t cw; + __asm__("FNSTCW %0" : "=m"(cw)::); + return cw & 0xc00; +} +#define fesetround fesetround_ +#define fegetround fegetround_ +#define FE_TONEAREST 0 +#define FE_DOWNWARD 0x400 +#define FE_UPWARD 0x800 +#define FE_TOWARDZERO 0xc00 +#else +#include <fenv.h> +#endif + +#define FE_TONEAREST_INDEX 0 +#define FE_DOWNWARD_INDEX 1 +#define FE_UPWARD_INDEX 2 +#define FE_TOWARDZERO_INDEX 3 +int FE_MODES[] = {FE_TONEAREST, FE_DOWNWARD, FE_UPWARD, FE_TOWARDZERO}; +char *FE_MODES_STR[] = { + "FE_TONEAREST", + "FE_DOWNWARD", + "FE_UPWARD", + "FE_TOWARDZERO", +}; + +void assert_round(double *array) { + assert(array[FE_DOWNWARD_INDEX] <= array[FE_TONEAREST_INDEX]); + assert(array[FE_TONEAREST_INDEX] <= array[FE_UPWARD_INDEX]); + if (array[FE_TOWARDZERO_INDEX] < 0) + assert(array[FE_TOWARDZERO_INDEX] == array[FE_UPWARD_INDEX]); + else if (array[FE_TOWARDZERO_INDEX] > 0) + assert(array[FE_TOWARDZERO_INDEX] == array[FE_DOWNWARD_INDEX]); + else if (array[FE_TOWARDZERO_INDEX] == 0) + assert(array[FE_TOWARDZERO_INDEX] == array[FE_UPWARD_INDEX] || + array[FE_TOWARDZERO_INDEX] == array[FE_DOWNWARD_INDEX]); +} + +#define TEST_(exec, expr, format) \ + do { \ + if (sizeof(#exec) == 1) \ + printf("Testing: %s\n", #expr); \ + else \ + printf("Testing: %s -> %s\n", #exec, #expr); \ + for (int i = 0; i < sizeof(FE_MODES) / sizeof(FE_MODES[0]); i++) { \ + fesetround(FE_MODES[i]); \ + exec; \ + printf("%-15s" format "\n", FE_MODES_STR[i], expr); \ + assert(FE_MODES[i] == fegetround()); \ + } \ + printf("\n"); \ + } while (0) + +#define TEST(exec, expr) TEST_(exec, expr, "%a") + +#if defined(i386) || defined(__i386__) || defined(__i386) || \ + defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) +#define TEST_X87(instruction, st0, st1, deep_change) \ + do { \ + double _st0 = (st0), _st1 = (st1); \ + double array1[4], array2[4]; \ + double __st0, __st1; \ + printf("Testing X87 instruction: %s (ST0 = %a, ST1 = %a)\n", #instruction, \ + _st0, _st1); \ + for (int i = 0; i < sizeof(FE_MODES) / sizeof(FE_MODES[0]); i++) { \ + fesetround(FE_MODES[i]); \ + __st0 = _st0, __st1 = _st1; \ + switch (deep_change) { \ + case -1: /* the instruction pops */ \ + __asm__(instruction : "+t"(__st0) : "u"(__st1) : "st(1)"); \ + printf("%-15s ST0 = %a\n", FE_MODES_STR[i], __st0); \ + break; \ + case 0: \ + __asm__(instruction : "+t"(__st0) : "u"(__st1) :); \ + printf("%-15s ST0 = %a\n", FE_MODES_STR[i], __st0); \ + break; \ + case 1: /* the instruction pushes */ \ + __asm__(instruction : "+t"(__st0), "=u"(__st1)::); \ + printf("%-15s ST0 = %a, ST1 = %a\n", FE_MODES_STR[i], __st0, __st1); \ + array2[i] = __st1; \ + } \ + array1[i] = __st0; \ + assert(FE_MODES[i] == fegetround()); \ + } \ + if (deep_change == 1) \ + assert_round(array2); \ + assert_round(array1); \ + printf("\n"); \ + } while (0) +#else +#define TEST_X87(instruction, st0, st1, deep_change) \ + do { \ + double _st0 = (st0), _st1 = (st1); \ + printf("Cannot test X87 instruction: %s (ST0 = %a, ST1 = %a) because it " \ + "is not compiled to x86\n\n", \ + #instruction, _st0, _st1); \ + } while (0) +#endif + +#define TEST_X87_1(i, st0) TEST_X87(i, st0, 0.0, 0) +#define TEST_X87_2(i, st0, st1) TEST_X87(i, st0, st1, -1) diff --git a/tests/test31 b/tests/test31 new file mode 100755 index 00000000..432bc57f --- /dev/null +++ b/tests/test31 Binary files differdiff --git a/tests/test31.c b/tests/test31.c new file mode 100644 index 00000000..379ddec5 --- /dev/null +++ b/tests/test31.c @@ -0,0 +1,114 @@ +// Copy from Box86/tests/test26.c (Box64/tests32/test26.c) +// Build with `gcc -march=core2 -O0 test31.c -o test31 -std=c99 -masm=intel -mfpmath=387 -frounding-math` +#include <fenv.h> +#include <float.h> +#include <inttypes.h> +#include <stdint.h> +#define USE_ASM_ROUNDING +#include "roundtest.h" + +#define TEST_CONVERT_(stype, s_) \ + do { \ + stype s; \ + TEST_(s = (s_), (double)s, "%a"); \ + TEST_(s = (s_), (float)s, "%a"); \ + /* converting too large float to integer, the result is undefined, on both \ + * c99 and FISTP instruction */ \ + if (INT64_MIN <= s && INT64_MAX <= s) \ + TEST_(s = (s_), (int64_t)s, "%" PRId64); \ + if (INT32_MIN <= s && INT32_MAX <= s) \ + TEST_(s = (s_), (int32_t)s, "%" PRId32); \ + if (INT16_MIN <= s && INT16_MAX <= s) \ + TEST_(s = (s_), (int16_t)s, "%" PRId16); \ + if (INT8_MIN <= s && INT8_MAX <= s) \ + TEST_(s = (s_), (int8_t)s, "%" PRId8); \ + if (0 <= s && UINT64_MAX <= s) \ + TEST_(s = (s_), (uint64_t)s, "%" PRIu64); \ + if (0 <= s && UINT32_MAX <= s) \ + TEST_(s = (s_), (unsigned int)s, "%" PRIu32); \ + if (0 <= s && UINT16_MAX <= s) \ + TEST_(s = (s_), (unsigned short)s, "%" PRIu16); \ + if (0 <= s && UINT8_MAX <= s) \ + TEST_(s = (s_), (unsigned char)s, "%" PRIu8); \ + } while (0) + +#define TEST_CONVERT(stype, s_) \ + do { \ + TEST_CONVERT_(stype, s_); \ + TEST_CONVERT_(stype, -(s_)); \ + } while (0) + +#define TEST_2NUMBER(d1type, d1_, d2type, d2_, operation) \ + do { \ + d1type d1; \ + d2type d2; \ + TEST((d1 = (d1_), d2 = (d2_)), operation); \ + TEST((d1 = -(d1_), d2 = (d2_)), operation); \ + TEST((d1 = (d1_), d2 = -(d2_)), operation); \ + TEST((d1 = -(d1_), d2 = -(d2_)), operation); \ + } while (0) + +int main() { + double d; + float f; + int64_t i64; + TEST_CONVERT(double, 0x1.123456789abcp2); // FISTTP + TEST_(d = (0x1.123456789abcp512), (float)d, "%a"); + TEST_CONVERT(double, 0x1.123456789abcp29); + TEST_(d = (-0x1.123456789abcp30), (int32_t)d, "%" PRId32); + TEST_(d = (-0x1.123456789abcp62), (int64_t)d, "%" PRId64); + + TEST_CONVERT(float, 0x1.123456789abcp2f); + TEST_CONVERT(float, 0x1.123456789abcp29f); + TEST_(f = -0x1.123456789abcp30f, (int32_t)f, "%" PRId32); + // to be fixed: + //TEST_(f = -0x1.123456789abcp62f, (int64_t)f, "%" PRId64); + // The direction of rounding when an integer is converted to a floating-point + // number that cannot exactly represent the original value + // https://gcc.gnu.org/onlinedocs/gcc/Floating-point-implementation.html + // to be fixed: + //TEST_(i64 = INT64_MAX, (double)i64, "%a"); // FILD and FSTP + TEST(d = -0x1.1234567p0, (double)((int)d)); + TEST(d = 0x1.9234567p0, (double)((int)d)); + TEST(d = -0x1.9234567p0, (double)((int)d)); + + TEST(d = 0x1.1234567p0, (double)((long int)d)); + TEST(d = -0x1.1234567p0, (double)((long int)d)); + TEST(d = 0x1.9234567p0, (double)((long int)d)); + TEST(d = -0x1.9234567p0, (double)((long int)d)); + + TEST_2NUMBER(double, 1.0, double, 0x1.0000000000001p0, d1 + d2); + TEST_2NUMBER(double, 1.0, double, 0x1.0000000000001p0, d1 - d2); + TEST_2NUMBER(double, 1.0, double, 0x1.0000000000001p0, d2 - d1); + TEST_2NUMBER(double, 1.0, double, 0x1.000000000000dp-4, d1 + d2); + TEST_2NUMBER(double, 1.0, double, 0x1.000000000000dp-4, d1 - d2); + TEST_2NUMBER(double, 1.0, double, 0x1.000000000000dp-4, d2 - d1); + + TEST_2NUMBER(double, 0x1.233445566778p0, double, 0x1.3456789abcdep0, d1 + d2); + TEST_2NUMBER(float, 0x1.233445566778p0f, float, 0x1.3456789abcdep0f, d1 *d2); + TEST_2NUMBER(float, 0x1.233445566778p0f, double, 0x1.3456789abcdep0, d1 *d2); + TEST_2NUMBER(double, 0x1.233445566778p0, double, 0x1.3456789abcdep0, d1 *d2); + TEST_2NUMBER(float, 0x1.233445566778p0f, double, 0x1.3456789abcdep0, d1 *d2); + TEST_2NUMBER(double, 0x1.233445566778p0, float, 0x1.3456789abcdep0, d1 *d2); + TEST_2NUMBER(float, 0x1.233445566778p0f, float, 0x1.3456789abcdep0f, d1 *d2); + TEST_2NUMBER(double, 0x1.233445566778p0, int, 5, d1 *d2); + TEST_2NUMBER(int, 15, double, 0x1.3456789abcdep0f, d1 *d2); + TEST_2NUMBER(float, 0x1.233445566778p0f, int, 15, d1 *d2); + TEST_2NUMBER(int, 15, float, 0x1.3456789abcdep0f, d1 *d2); + + TEST_2NUMBER(double, 0x1.233445566778p0, double, 0x1.3456789abcdep0, d1 / d2); + TEST_2NUMBER(double, 0x1.233445566778p0, double, 0x1.3456789abcdep0, d1 / d2); + TEST_2NUMBER(double, 0x1.233445566778p0, float, 0x1.3456789abcdep0f, d1 / d2); + + TEST_2NUMBER(double, 1.0, double, 0x1.0000000000001p0, d2 - d1); + TEST_2NUMBER(double, 1.0, double, 0x1.000000000000dp-4, d1 + d2); + TEST_2NUMBER(double, 1.0, double, 0x1.000000000000dp-4, d1 - d2); + TEST_2NUMBER(double, 1.0, double, 0x1.000000000000dp-4, d2 - d1); + + TEST_X87_1("FSQRT", 0x1.0000000000000p2); + TEST_X87_1("FSQRT", 0x1.0000000000001p1); + TEST_X87_1("FSQRT", 0x1.123456789abcp31); + TEST_X87_1("FSQRT", 0x1.123456789abdp31); + + return 0; +} |