blob: e0a3cb39a48642bff2877961b229b121cc89911c [file] [log] [blame]
florianf12ec152012-09-12 19:40:14 +00001#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}