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