mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-11 09:56:29 +00:00
96 lines
1.9 KiB
C
96 lines
1.9 KiB
C
#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;
|
|
}
|