156493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com#include <assert.h>
256493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com#include <stdlib.h>
356493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com#include <stdio.h>
456493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com#include "opcodes.h"
556493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com
656493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com/* Basic test that we can set the rounding mode in the FPC and
756493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com   query it. Covers only generally available rounding modes. */
856493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com
956493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.comvoid
1056493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.comset_rounding_mode(unsigned mode)
1156493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com{
1256493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com   register unsigned r asm("1") = mode;
1356493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com   __asm__ volatile ( SFPC(1) : : "d"(r) );
1456493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com}
1556493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com
1656493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.comunsigned
1756493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.comget_rounding_mode(void)
1856493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com{
1986eb8dc8d730348b3e9e7aa50a02781b5b7db3d1lararennie@google.com   unsigned fpc;
2086eb8dc8d730348b3e9e7aa50a02781b5b7db3d1lararennie@google.com
2156493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com   __asm__ volatile ("stfpc  %0\n\t" : "=m"(fpc));
2256493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com
2356493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com   return fpc & 0x7;
24b6870ba2907bec2cabfb982e37290b79a4713780roubert@google.com}
25b6870ba2907bec2cabfb982e37290b79a4713780roubert@google.com
26b6870ba2907bec2cabfb982e37290b79a4713780roubert@google.com
27b6870ba2907bec2cabfb982e37290b79a4713780roubert@google.comint main(void)
2856493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com{
2956493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com   int i;
3056493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com   const unsigned rmodes[] = { 0, 1, 2, 3 };
3156493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com
3256493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com   printf("initial rounding mode: %u\n", get_rounding_mode());
3386eb8dc8d730348b3e9e7aa50a02781b5b7db3d1lararennie@google.com
3486eb8dc8d730348b3e9e7aa50a02781b5b7db3d1lararennie@google.com   for (i = 0; i < sizeof rmodes / sizeof rmodes[0]; ++i) {
3586eb8dc8d730348b3e9e7aa50a02781b5b7db3d1lararennie@google.com      printf("setting rounding mode to %u\n", rmodes[i]);
3686eb8dc8d730348b3e9e7aa50a02781b5b7db3d1lararennie@google.com      set_rounding_mode(rmodes[i]);
3786eb8dc8d730348b3e9e7aa50a02781b5b7db3d1lararennie@google.com      printf("...checking: %u\n", get_rounding_mode());
3856493344f6b48d9ae2a2fea8e2a953f33b1e00d8roubert@google.com   }
3986eb8dc8d730348b3e9e7aa50a02781b5b7db3d1lararennie@google.com
4086eb8dc8d730348b3e9e7aa50a02781b5b7db3d1lararennie@google.com   return 0;
4186eb8dc8d730348b3e9e7aa50a02781b5b7db3d1lararennie@google.com}
4286eb8dc8d730348b3e9e7aa50a02781b5b7db3d1lararennie@google.com