1#include <stdio.h> 2#include <assert.h> 3#include "opcodes.h" 4 5/* Test "load rounded" with universally available rounding modes. 6 Rounding mode is provided via FPC. 7 Also test "load lengthened" (which is independent of rounding modes). */ 8 9volatile double d; 10volatile float f; 11 12const char * 13rtext(unsigned fpc_round) 14{ 15 switch (fpc_round) { 16 case 0: return "[-> near]"; 17 case 1: return "[-> zero]"; 18 case 2: return "[-> +inf]"; 19 case 3: return "[-> -inf]"; 20 } 21 assert(0); 22} 23 24void 25set_rounding_mode(unsigned mode) 26{ 27 printf("setting FPC rounding mode to %s\n", rtext(mode)); 28 register unsigned r asm("1") = mode; 29 __asm__ volatile ( SFPC(1) : : "d"(r) ); 30} 31 32 33void 34load_rounded(void) 35{ 36 f = d; 37 printf("load rounded d = %22.20g f = %22.20g\n", d, f); 38} 39 40void 41load_lengthened(void) 42{ 43 d = f; 44 printf("load lengthened d = %22.20g f = %22.20g\n", d, f); 45} 46 47/* Tests for load rounded and load lengthened */ 48int main() 49{ 50 d = 12345678.98765432E21; 51 set_rounding_mode(0); 52 load_rounded(); 53 set_rounding_mode(1); 54 load_rounded(); 55 set_rounding_mode(2); 56 load_rounded(); 57 set_rounding_mode(3); 58 load_rounded(); 59 printf("\n"); 60 61 d = -12345678.98765432E21; 62 set_rounding_mode(0); 63 load_rounded(); 64 set_rounding_mode(1); 65 load_rounded(); 66 set_rounding_mode(2); 67 load_rounded(); 68 set_rounding_mode(3); 69 load_rounded(); 70 printf("\n"); 71 72 load_lengthened(); 73 74 return 0; 75} 76