1f12ec1507af068ac508e486feb2050ebeb670f4bflorian#include <assert.h>
2f12ec1507af068ac508e486feb2050ebeb670f4bflorian#include <stdlib.h>
3f12ec1507af068ac508e486feb2050ebeb670f4bflorian#include <stdio.h>
4f12ec1507af068ac508e486feb2050ebeb670f4bflorian#include "opcodes.h"
5f12ec1507af068ac508e486feb2050ebeb670f4bflorian
6f12ec1507af068ac508e486feb2050ebeb670f4bflorian/* Basic test that we can set the rounding mode in the FPC and
7f12ec1507af068ac508e486feb2050ebeb670f4bflorian   query it. Covers only generally available rounding modes. */
8f12ec1507af068ac508e486feb2050ebeb670f4bflorian
9f12ec1507af068ac508e486feb2050ebeb670f4bflorianvoid
10f12ec1507af068ac508e486feb2050ebeb670f4bflorianset_rounding_mode(unsigned mode)
11f12ec1507af068ac508e486feb2050ebeb670f4bflorian{
12f12ec1507af068ac508e486feb2050ebeb670f4bflorian   register unsigned r asm("1") = mode;
13f12ec1507af068ac508e486feb2050ebeb670f4bflorian   __asm__ volatile ( SFPC(1) : : "d"(r) );
14f12ec1507af068ac508e486feb2050ebeb670f4bflorian}
15f12ec1507af068ac508e486feb2050ebeb670f4bflorian
16f12ec1507af068ac508e486feb2050ebeb670f4bflorianunsigned
17f12ec1507af068ac508e486feb2050ebeb670f4bflorianget_rounding_mode(void)
18f12ec1507af068ac508e486feb2050ebeb670f4bflorian{
19f12ec1507af068ac508e486feb2050ebeb670f4bflorian   unsigned fpc;
20f12ec1507af068ac508e486feb2050ebeb670f4bflorian
21f12ec1507af068ac508e486feb2050ebeb670f4bflorian   __asm__ volatile ("stfpc  %0\n\t" : "=m"(fpc));
22f12ec1507af068ac508e486feb2050ebeb670f4bflorian
23f12ec1507af068ac508e486feb2050ebeb670f4bflorian   return fpc & 0x7;
24f12ec1507af068ac508e486feb2050ebeb670f4bflorian}
25f12ec1507af068ac508e486feb2050ebeb670f4bflorian
26f12ec1507af068ac508e486feb2050ebeb670f4bflorian
27f12ec1507af068ac508e486feb2050ebeb670f4bflorianint main(void)
28f12ec1507af068ac508e486feb2050ebeb670f4bflorian{
29f12ec1507af068ac508e486feb2050ebeb670f4bflorian   int i;
30f12ec1507af068ac508e486feb2050ebeb670f4bflorian   const unsigned rmodes[] = { 0, 1, 2, 3 };
31f12ec1507af068ac508e486feb2050ebeb670f4bflorian
32f12ec1507af068ac508e486feb2050ebeb670f4bflorian   printf("initial rounding mode: %u\n", get_rounding_mode());
33f12ec1507af068ac508e486feb2050ebeb670f4bflorian
34f12ec1507af068ac508e486feb2050ebeb670f4bflorian   for (i = 0; i < sizeof rmodes / sizeof rmodes[0]; ++i) {
35f12ec1507af068ac508e486feb2050ebeb670f4bflorian      printf("setting rounding mode to %u\n", rmodes[i]);
36f12ec1507af068ac508e486feb2050ebeb670f4bflorian      set_rounding_mode(rmodes[i]);
37f12ec1507af068ac508e486feb2050ebeb670f4bflorian      printf("...checking: %u\n", get_rounding_mode());
38f12ec1507af068ac508e486feb2050ebeb670f4bflorian   }
39f12ec1507af068ac508e486feb2050ebeb670f4bflorian
40f12ec1507af068ac508e486feb2050ebeb670f4bflorian   return 0;
41f12ec1507af068ac508e486feb2050ebeb670f4bflorian}
42