C++程序  |  62行  |  1.31 KB

#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;
}