#include <assert.h> #include <stdlib.h> #include <stdio.h> #include "opcodes.h" #define srnmt(b,d) \ ({ \ __asm__ volatile ( "lghi 8," #b "\n\t" \ SRNMT(8,d) \ ::: "8"); \ }) /* Like srnmt above, except it uses r0 as a base register */ #define srnmt0(d) \ ({ \ __asm__ volatile ( SRNMT(0,d) \ ::: "0"); \ }) unsigned get_dfp_rounding_mode(void) { unsigned fpc; __asm__ volatile ("stfpc %0\n\t" : "=m"(fpc)); return (fpc & 0x70) >> 4; } int main(void) { printf("initial rounding mode = %u\n", get_dfp_rounding_mode()); /* Set basic rounding modes in various ways */ srnmt(1,002); // 1 + 2 = 3 printf("rounding mode = %u\n", get_dfp_rounding_mode()); srnmt(2,000); printf("rounding mode = %u\n", get_dfp_rounding_mode()); srnmt(0,001); printf("rounding mode = %u\n", get_dfp_rounding_mode()); srnmt(0,000); printf("rounding mode = %u\n", get_dfp_rounding_mode()); srnmt(7,000); printf("rounding mode = %u\n", get_dfp_rounding_mode()); srnmt(0,006); printf("rounding mode = %u\n", get_dfp_rounding_mode()); srnmt0(005); printf("rounding mode = %u\n", get_dfp_rounding_mode()); srnmt0(004); printf("rounding mode = %u\n", get_dfp_rounding_mode()); return 0; }