rounding-4.c revision 436e89c602e787e7a27dd6624b09beed41a0da8a
1#include <stdio.h>
2#include <assert.h>
3#include "opcodes.h"
4
5/* Test "load rounded" with universally available rounding modes.
6   Rounding mode is provided via FPC.
7   Also test "load lengthened" (which is independent of rounding modes). */
8
9volatile double d;
10volatile float f;
11
12const char *
13rtext(unsigned fpc_round)
14{
15   switch (fpc_round) {
16   case 0: return "[-> near]";
17   case 1: return "[-> zero]";
18   case 2: return "[-> +inf]";
19   case 3: return "[-> -inf]";
20   }
21   assert(0);
22}
23
24void
25set_rounding_mode(unsigned mode)
26{
27   printf("setting FPC rounding mode to %s\n", rtext(mode));
28   register unsigned r asm("1") = mode;
29   __asm__ volatile ( SFPC(1) : : "d"(r) );
30}
31
32
33void
34load_rounded(void)
35{
36   f = d;
37   printf("load rounded  d = %22.20g    f = %22.20g\n", d, f);
38}
39
40void
41load_lengthened(void)
42{
43   d = f;
44   printf("load lengthened  d = %22.20g    f = %22.20g\n", d, f);
45}
46
47/* Tests for load rounded and load lengthened */
48int main()
49{
50   d = 12345678.98765432E21;
51   set_rounding_mode(0);
52   load_rounded();
53   set_rounding_mode(1);
54   load_rounded();
55   set_rounding_mode(2);
56   load_rounded();
57   set_rounding_mode(3);
58   load_rounded();
59   printf("\n");
60
61   d = -12345678.98765432E21;
62   set_rounding_mode(0);
63   load_rounded();
64   set_rounding_mode(1);
65   load_rounded();
66   set_rounding_mode(2);
67   load_rounded();
68   set_rounding_mode(3);
69   load_rounded();
70   printf("\n");
71
72   load_lengthened();
73
74   return 0;
75}
76