| #include <stdio.h> |
| #include <assert.h> |
| #include "opcodes.h" |
| |
| /* Test "load rounded" with universally available rounding modes. |
| Rounding mode is provided via FPC. |
| Also test "load lengthened" (which is independent of rounding modes). */ |
| |
| volatile double d; |
| volatile float f; |
| |
| const char * |
| rtext(unsigned fpc_round) |
| { |
| switch (fpc_round) { |
| case 0: return "[-> near]"; |
| case 1: return "[-> zero]"; |
| case 2: return "[-> +inf]"; |
| case 3: return "[-> -inf]"; |
| } |
| assert(0); |
| } |
| |
| void |
| set_rounding_mode(unsigned mode) |
| { |
| printf("setting FPC rounding mode to %s\n", rtext(mode)); |
| register unsigned r asm("1") = mode; |
| __asm__ volatile ( SFPC(1) : : "d"(r) ); |
| } |
| |
| |
| void |
| load_rounded(void) |
| { |
| f = d; |
| printf("load rounded d = %10.3f f = %10.3f\n", d, f); |
| } |
| |
| void |
| load_lengthened(void) |
| { |
| d = f; |
| printf("load lengthened d = %22.20g f = %22.20g\n", d, f); |
| } |
| |
| /* Tests for load rounded and load lengthened */ |
| int main() |
| { |
| d = 12345678.25; |
| set_rounding_mode(0); |
| load_rounded(); |
| set_rounding_mode(1); |
| load_rounded(); |
| set_rounding_mode(2); |
| load_rounded(); |
| set_rounding_mode(3); |
| load_rounded(); |
| printf("======================================\n"); |
| d = 12345678.75; |
| set_rounding_mode(0); |
| load_rounded(); |
| set_rounding_mode(1); |
| load_rounded(); |
| set_rounding_mode(2); |
| load_rounded(); |
| set_rounding_mode(3); |
| load_rounded(); |
| printf("======================================\n"); |
| d = -12345678.25; |
| set_rounding_mode(0); |
| load_rounded(); |
| set_rounding_mode(1); |
| load_rounded(); |
| set_rounding_mode(2); |
| load_rounded(); |
| set_rounding_mode(3); |
| load_rounded(); |
| printf("======================================\n"); |
| d = -12345678.75; |
| set_rounding_mode(0); |
| load_rounded(); |
| set_rounding_mode(1); |
| load_rounded(); |
| set_rounding_mode(2); |
| load_rounded(); |
| set_rounding_mode(3); |
| load_rounded(); |
| printf("\n"); |
| |
| f = 1234.5678f; |
| load_lengthened(); |
| |
| return 0; |
| } |