#include <assert.h> #include <stdlib.h> #include <stdio.h> #include "opcodes.h" #define srnm(b,d) \ ({ \ __asm__ volatile ( "lghi 8," #b "\n\t" \ "srnm " #d "(8)\n\t" ::: "8"); \ }) unsigned get_rounding_mode(void) { unsigned fpc; __asm__ volatile ("stfpc %0\n\t" : "=m"(fpc)); return fpc & 0x7; } int main(void) { printf("initial rounding mode = %u\n", get_rounding_mode()); /* Set basic rounding modes in various ways */ srnm(1,2); // 1 + 2 = 3 printf("rounding mode = %u\n", get_rounding_mode()); srnm(2,0); printf("rounding mode = %u\n", get_rounding_mode()); srnm(0,1); printf("rounding mode = %u\n", get_rounding_mode()); srnm(0,0); printf("rounding mode = %u\n", get_rounding_mode()); /* Some rounding modes with bits to be ignored */ srnm(0xff,0); // -> 3 printf("rounding mode = %u\n", get_rounding_mode()); srnm(0,0xfe); // -> 2 printf("rounding mode = %u\n", get_rounding_mode()); srnm(0xf0,0x0f); // -> 3 printf("rounding mode = %u\n", get_rounding_mode()); return 0; }