srnm.c revision 436e89c602e787e7a27dd6624b09beed41a0da8a
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
12unsigned
13get_rounding_mode(void)
14{
15   unsigned fpc;
16
17   __asm__ volatile ("stfpc  %0\n\t" : "=m"(fpc));
18
19   return fpc & 0x7;
20}
21
22int 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