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