1 #include <assert.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include "opcodes.h"
5
6 #define srnm(b,d) \
7 ({ \
8 __asm__ volatile ( "lghi 8," #b "\n\t" \
9 "srnm " #d "(8)\n\t" ::: "8"); \
10 })
11
12 unsigned
get_rounding_mode(void)13 get_rounding_mode(void)
14 {
15 unsigned fpc;
16
17 __asm__ volatile ("stfpc %0\n\t" : "=m"(fpc));
18
19 return fpc & 0x7;
20 }
21
main(void)22 int main(void)
23 {
24 printf("initial rounding mode = %u\n", get_rounding_mode());
25
26 /* Set basic rounding modes in various ways */
27 srnm(1,2); // 1 + 2 = 3
28 printf("rounding mode = %u\n", get_rounding_mode());
29
30 srnm(2,0);
31 printf("rounding mode = %u\n", get_rounding_mode());
32
33 srnm(0,1);
34 printf("rounding mode = %u\n", get_rounding_mode());
35
36 srnm(0,0);
37 printf("rounding mode = %u\n", get_rounding_mode());
38
39 /* Some rounding modes with bits to be ignored */
40 srnm(0xff,0); // -> 3
41 printf("rounding mode = %u\n", get_rounding_mode());
42
43 srnm(0,0xfe); // -> 2
44 printf("rounding mode = %u\n", get_rounding_mode());
45
46 srnm(0xf0,0x0f); // -> 3
47 printf("rounding mode = %u\n", get_rounding_mode());
48
49 return 0;
50 }
51