#include <stdio.h>
#include <assert.h>
#include "opcodes.h"
/* Test "load rounded" with universally available rounding modes.
Rounding mode is provided via FPC.
Also test "load lengthened" (which is independent of rounding modes). */
volatile double d;
volatile float f;
const char *
rtext(unsigned fpc_round)
{
switch (fpc_round) {
case 0: return "[-> near]";
case 1: return "[-> zero]";
case 2: return "[-> +inf]";
case 3: return "[-> -inf]";
}
assert(0);
}
void
set_rounding_mode(unsigned mode)
{
printf("setting FPC rounding mode to %s\n", rtext(mode));
register unsigned r asm("1") = mode;
__asm__ volatile ( SFPC(1) : : "d"(r) );
}
void
load_rounded(void)
{
f = d;
printf("load rounded d = %10.3f f = %10.3f\n", d, f);
}
void
load_lengthened(void)
{
d = f;
printf("load lengthened d = %22.20g f = %22.20g\n", d, f);
}
/* Tests for load rounded and load lengthened */
int main()
{
d = 12345678.25;
set_rounding_mode(0);
load_rounded();
set_rounding_mode(1);
load_rounded();
set_rounding_mode(2);
load_rounded();
set_rounding_mode(3);
load_rounded();
printf("======================================\n");
d = 12345678.75;
set_rounding_mode(0);
load_rounded();
set_rounding_mode(1);
load_rounded();
set_rounding_mode(2);
load_rounded();
set_rounding_mode(3);
load_rounded();
printf("======================================\n");
d = -12345678.25;
set_rounding_mode(0);
load_rounded();
set_rounding_mode(1);
load_rounded();
set_rounding_mode(2);
load_rounded();
set_rounding_mode(3);
load_rounded();
printf("======================================\n");
d = -12345678.75;
set_rounding_mode(0);
load_rounded();
set_rounding_mode(1);
load_rounded();
set_rounding_mode(2);
load_rounded();
set_rounding_mode(3);
load_rounded();
printf("\n");
f = 1234.5678f;
load_lengthened();
return 0;
}