#include "tests/asm.h"
#include <stdio.h>
#include <math.h>

double arg, res1, res2;

extern void do_fxtract ( void );
asm("\n"
VG_SYM(do_fxtract) ":\n"
"\tfinit\n"
"\tfldl " VG_SYM(arg) "\n"
"\tfxtract\n"
"\tfstpl " VG_SYM(res1) "\n"
"\tfstpl " VG_SYM(res2) "\n"
"\tret"
);

void try ( double x )
{
  arg = x * 1.414213562373049;
  res1 = res2 = 0.0;
  do_fxtract();
  printf("%17.10e  -> %14.10f %14.10f\n", arg, res1, res2);
}

int main ( void )
{
  int i;

  /* positives */

  for (i = 0; i < 40; i++)
     try( 1.27 + (double)(i*10 - 200) );

  try(+0.0);
  try(1.0 / 0.0);
  try(sqrt(-1.0));

  try(5.1e-308);
  try(4.1e-308);
  try(3.1e-308);
  try(2.1e-308);
  try(1.1e-308);
  try(0.9e-308);
  try(0.7e-308);
  try(0.6e-308);
  try(0.5e-308);
  try(0.4e-308);
  try(0.3e-308);
  try(0.1e-308);

  try(1.3e-320);
  try(1.3e-321);
  try(1.3e-322);
  try(1.3e-323);
  try(0.9e-323);
  try(0.7e-323);
  try(0.5e-323);
  try(0.3e-323);
  try(0.2e-323);
  try(1.3e-324);

  /* negatives */

  printf("\n");
  for (i = 0; i < 40; i++)
     try( - (1.27 + (double)(i*10 - 200)) );

  try(-0.0);
  try(-(1.0 / 0.0));
  try(-sqrt(-1.0));

  try(-5.1e-308);
  try(-4.1e-308);
  try(-3.1e-308);
  try(-2.1e-308);
  try(-1.1e-308);
  try(-0.9e-308);
  try(-0.7e-308);
  try(-0.6e-308);
  try(-0.5e-308);
  try(-0.4e-308);
  try(-0.3e-308);
  try(-0.1e-308);

  try(-1.3e-320);
  try(-1.3e-321);
  try(-1.3e-322);
  try(-1.3e-323);
  try(-0.9e-323);
  try(-0.7e-323);
  try(-0.5e-323);
  try(-0.3e-323);
  try(-0.2e-323);
  try(-1.3e-324);

  return 0;
}