#include <stdio.h>
/* Simple test to see that basic operators are mapped
correctly. Uses default rounding mode. */
volatile double d1, d2;
volatile float f1, f2;
void fadd8(void)
{
printf("%f + %f = %f\n", d1, d2, d1 + d2);
}
void fsub8(void)
{
printf("%f - %f = %f\n", d1, d2, d1 - d2);
}
void fmul8(void)
{
printf("%f * %f = %f\n", d1, d2, d1 * d2);
}
void fdiv8(void)
{
printf("%f / %f = %f\n", d1, d2, d1 / d2);
}
void fadd4(void)
{
register float r1 asm("f1") = f1;
register float r2 asm("f2") = f2;
__asm__ volatile ("aebr %[r1],%[r2]\n\t"
: [r1] "+f"(r1)
: [r2] "f"(r2) : "cc");
printf("%f + %f = %f\n", f1, f2, r1);
}
void fsub4(void)
{
register float r1 asm("f1") = f1;
register float r2 asm("f2") = f2;
__asm__ volatile ("sebr %[r1],%[r2]\n\t"
: [r1] "+f"(r1)
: [r2] "f"(r2) : "cc");
printf("%f - %f = %f\n", f1, f2, r1);
}
void fmul4(void)
{
register float r1 asm("f1") = f1;
register float r2 asm("f2") = f2;
__asm__ volatile ("meebr %[r1],%[r2]\n\t"
: [r1] "+f"(r1)
: [r2] "f"(r2) : "cc");
printf("%f * %f = %f\n", f1, f2, r1);
}
void fdiv4(void)
{
register float r1 asm("f1") = f1;
register float r2 asm("f2") = f2;
__asm__ volatile ("debr %[r1],%[r2]\n\t"
: [r1] "+f"(r1)
: [r2] "f"(r2) : "cc");
printf("%f / %f = %f\n", f1, f2, r1);
}
int main()
{
printf("double arithmetic\n");
d1 = 10.5;
d2 = 1.25;
fadd8();
fsub8();
fmul8();
fdiv8();
printf("float arithmetic\n");
f1 = 10.5f;
f2 = 1.25f;
fadd4();
fsub4();
fmul4();
fdiv4();
return 0;
}