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